fuzzyworld

when-am-i / commit

Add North Sentinel Island, with no Gregorian default anywhere it applies

cedd4e9ce0ffab887201b78a49f50a16ca987637 · Pavel Safronov · 2026-06-22 17:00:36 -0700 · parents 3cbfe9add2d1

Add North Sentinel Island, with no Gregorian default anywhere it applies

The Sentinelese are uncontacted, so no calendar or timekeeping system
has ever been documented for them — added as a region with a single
"no documented calendar" era rather than inventing a reckoning.

This is also the one place in the dataset that should never show the
app's modern global Gregorian default, since the Sentinelese have
never adopted any outside civil calendar. Added an explicit
`suppressModernDefault` flag on Era (schema, validator, types,
resolve.ts) for this, and fixed App.tsx's year-timeline band builder,
which had its own separate copy of the "should Gregorian apply" check
that didn't know about the new flag — it was still drawing the
Gregorian band/legend swatch on the timeline even though the text
answers correctly omitted it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
 README.md                                          |   6 ++--
 .../calendars/aztec/01-aztec-xiuhp-hualli.png      | Bin 878464 -> 878559 bytes
 .../aztec/02-aztec-mexica-year-bearer.png          | Bin 878464 -> 878559 bytes
 screenshots/calendars/aztec/03-t-nalp-hualli.png   | Bin 879434 -> 879530 bytes
 .../china/01-chinese-sexagenary-cycle.png          | Bin 568834 -> 568884 bytes
 screenshots/calendars/india/01-indian.png          | Bin 450006 -> 450040 bytes
 screenshots/calendars/iran/01-islamic.png          | Bin 497658 -> 497740 bytes
 screenshots/calendars/iran/02-persian.png          | Bin 601831 -> 601912 bytes
 .../japan/01-japanese-lunisolar-calendar.png       | Bin 431361 -> 431437 bytes
 screenshots/calendars/japan/02-japanese.png        | Bin 410529 -> 410583 bytes
 .../korea/01-korean-lunisolar-calendar.png         | Bin 744930 -> 744930 bytes
 screenshots/calendars/korea/02-gregorian.png       | Bin 668884 -> 668903 bytes
 screenshots/calendars/korea/03-gregorian.png       | Bin 667359 -> 667367 bytes
 screenshots/calendars/korea/04-gregorian.png       | Bin 643294 -> 643303 bytes
 screenshots/calendars/korea/05-gregorian.png       | Bin 650418 -> 650432 bytes
 .../massachusett/01-algonquian-lunar-calendar.png  | Bin 1234936 -> 1235019 bytes
 screenshots/calendars/maya/01-maya-long-count.png  | Bin 899567 -> 899658 bytes
 .../maya/02-tzolk-in-and-haab-calendar-round.png   | Bin 701156 -> 701224 bytes
 screenshots/calendars/north-korea/01-dangi.png     | Bin 733310 -> 733334 bytes
 screenshots/calendars/north-korea/02-juche.png     | Bin 774301 -> 774332 bytes
 screenshots/calendars/north-korea/03-gregorian.png | Bin 726844 -> 726846 bytes
 .../north-sentinel-island/01-none-documented.png   | Bin 0 -> 540478 bytes
 .../calendars/oregon-country/01-gregorian.png      | Bin 463595 -> 463540 bytes
 screenshots/calendars/ottoman/01-islamic.png       | Bin 478899 -> 478933 bytes
 screenshots/calendars/ottoman/02-rumi.png          | Bin 688846 -> 688875 bytes
 screenshots/calendars/ottoman/03-gregorian.png     | Bin 414897 -> 414935 bytes
 .../revolutionary-france/01-gregorian.png          | Bin 442862 -> 442867 bytes
 .../02-french-republican-calendar.png              | Bin 514939 -> 514944 bytes
 .../03-french-republican-calendar.png              | Bin 434679 -> 434684 bytes
 .../revolutionary-france/04-gregorian.png          | Bin 437763 -> 437768 bytes
 screenshots/calendars/thailand/01-buddhist.png     | Bin 482008 -> 482055 bytes
 .../vietnam/01-vietnamese-lunisolar-calendar.png   | Bin 709369 -> 709400 bytes
 screenshots/calendars/vietnam/02-gregorian.png     | Bin 690579 -> 690608 bytes
 .../vietnam/03-vietnamese-lunisolar-calendar.png   | Bin 690579 -> 690608 bytes
 scripts/validate-data.mts                          |   3 ++
 src/App.tsx                                        |  13 ++++++--
 src/data/calendars/SCHEMA.md                       |  12 +++++++-
 src/data/calendars/north-sentinel-island.json      |  33 +++++++++++++++++++++
 src/data/index.ts                                  |   1 +
 src/types/index.ts                                 |   8 +++++
 src/utils/resolve.test.ts                          |  13 ++++++++
 src/utils/resolve.ts                               |   8 +++--
 42 files changed, 89 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index bcc113c..821a833 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
 [![pipeline status](https://gitlab.com/PavelSafronov/when-am-i/badges/main/pipeline.svg)](https://gitlab.com/PavelSafronov/when-am-i/-/pipelines)
 [![live demo](https://img.shields.io/badge/demo-live-success)](https://pavelsafronov.gitlab.io/when-am-i)
 ![version](https://img.shields.io/badge/version-v0.1.0-blue)
-![calendar data](https://img.shields.io/badge/calendar%20data-19-orange)
+![calendar data](https://img.shields.io/badge/calendar%20data-20-orange)
 ![license](https://img.shields.io/badge/license-MIT-green)
 
 ![React](https://img.shields.io/badge/React-20232A?logo=react&logoColor=61DAFB)
@@ -44,7 +44,9 @@ when more than one calendar applies at once:
   the moon and night ("a full moon, about night 15"), and, where the data
   records a documented event, **"about N winters since &lt;event&gt;"**
 - A global **modern Gregorian default** for dates from 1927 on, so most recent dates
-  resolve anywhere — shown alongside any local calendar (e.g. modern Iran → Persian *and* Gregorian)
+  resolve anywhere — shown alongside any local calendar (e.g. modern Iran → Persian *and* Gregorian),
+  with one deliberate exception: North Sentinel Island, where the uncontacted
+  Sentinelese have never adopted any outside calendar
 - Educational and fun way to explore world calendars and history
 
 ### Supported calendars
diff --git a/screenshots/calendars/aztec/01-aztec-xiuhp-hualli.png b/screenshots/calendars/aztec/01-aztec-xiuhp-hualli.png
index 6990688..f1b6ec5 100644
Binary files a/screenshots/calendars/aztec/01-aztec-xiuhp-hualli.png and b/screenshots/calendars/aztec/01-aztec-xiuhp-hualli.png differ
diff --git a/screenshots/calendars/aztec/02-aztec-mexica-year-bearer.png b/screenshots/calendars/aztec/02-aztec-mexica-year-bearer.png
index 6990688..f1b6ec5 100644
Binary files a/screenshots/calendars/aztec/02-aztec-mexica-year-bearer.png and b/screenshots/calendars/aztec/02-aztec-mexica-year-bearer.png differ
diff --git a/screenshots/calendars/aztec/03-t-nalp-hualli.png b/screenshots/calendars/aztec/03-t-nalp-hualli.png
index aa937ab..318d84e 100644
Binary files a/screenshots/calendars/aztec/03-t-nalp-hualli.png and b/screenshots/calendars/aztec/03-t-nalp-hualli.png differ
diff --git a/screenshots/calendars/china/01-chinese-sexagenary-cycle.png b/screenshots/calendars/china/01-chinese-sexagenary-cycle.png
index 9591755..0bf36c8 100644
Binary files a/screenshots/calendars/china/01-chinese-sexagenary-cycle.png and b/screenshots/calendars/china/01-chinese-sexagenary-cycle.png differ
diff --git a/screenshots/calendars/india/01-indian.png b/screenshots/calendars/india/01-indian.png
index 36c7054..0f25c96 100644
Binary files a/screenshots/calendars/india/01-indian.png and b/screenshots/calendars/india/01-indian.png differ
diff --git a/screenshots/calendars/iran/01-islamic.png b/screenshots/calendars/iran/01-islamic.png
index d796fde..f99bada 100644
Binary files a/screenshots/calendars/iran/01-islamic.png and b/screenshots/calendars/iran/01-islamic.png differ
diff --git a/screenshots/calendars/iran/02-persian.png b/screenshots/calendars/iran/02-persian.png
index 659c7fe..8013694 100644
Binary files a/screenshots/calendars/iran/02-persian.png and b/screenshots/calendars/iran/02-persian.png differ
diff --git a/screenshots/calendars/japan/01-japanese-lunisolar-calendar.png b/screenshots/calendars/japan/01-japanese-lunisolar-calendar.png
index 0d6a4de..bc8d1d3 100644
Binary files a/screenshots/calendars/japan/01-japanese-lunisolar-calendar.png and b/screenshots/calendars/japan/01-japanese-lunisolar-calendar.png differ
diff --git a/screenshots/calendars/japan/02-japanese.png b/screenshots/calendars/japan/02-japanese.png
index 800ba6c..3316a19 100644
Binary files a/screenshots/calendars/japan/02-japanese.png and b/screenshots/calendars/japan/02-japanese.png differ
diff --git a/screenshots/calendars/korea/01-korean-lunisolar-calendar.png b/screenshots/calendars/korea/01-korean-lunisolar-calendar.png
index 0170483..b5c0cc4 100644
Binary files a/screenshots/calendars/korea/01-korean-lunisolar-calendar.png and b/screenshots/calendars/korea/01-korean-lunisolar-calendar.png differ
diff --git a/screenshots/calendars/korea/02-gregorian.png b/screenshots/calendars/korea/02-gregorian.png
index 82c89bf..e559527 100644
Binary files a/screenshots/calendars/korea/02-gregorian.png and b/screenshots/calendars/korea/02-gregorian.png differ
diff --git a/screenshots/calendars/korea/03-gregorian.png b/screenshots/calendars/korea/03-gregorian.png
index 7909f0a..6394877 100644
Binary files a/screenshots/calendars/korea/03-gregorian.png and b/screenshots/calendars/korea/03-gregorian.png differ
diff --git a/screenshots/calendars/korea/04-gregorian.png b/screenshots/calendars/korea/04-gregorian.png
index cd3e8b2..6243c3c 100644
Binary files a/screenshots/calendars/korea/04-gregorian.png and b/screenshots/calendars/korea/04-gregorian.png differ
diff --git a/screenshots/calendars/korea/05-gregorian.png b/screenshots/calendars/korea/05-gregorian.png
index 421de06..2345f54 100644
Binary files a/screenshots/calendars/korea/05-gregorian.png and b/screenshots/calendars/korea/05-gregorian.png differ
diff --git a/screenshots/calendars/massachusett/01-algonquian-lunar-calendar.png b/screenshots/calendars/massachusett/01-algonquian-lunar-calendar.png
index 75ec889..75b71ed 100644
Binary files a/screenshots/calendars/massachusett/01-algonquian-lunar-calendar.png and b/screenshots/calendars/massachusett/01-algonquian-lunar-calendar.png differ
diff --git a/screenshots/calendars/maya/01-maya-long-count.png b/screenshots/calendars/maya/01-maya-long-count.png
index 64eac19..3995e06 100644
Binary files a/screenshots/calendars/maya/01-maya-long-count.png and b/screenshots/calendars/maya/01-maya-long-count.png differ
diff --git a/screenshots/calendars/maya/02-tzolk-in-and-haab-calendar-round.png b/screenshots/calendars/maya/02-tzolk-in-and-haab-calendar-round.png
index c210520..e26a2e6 100644
Binary files a/screenshots/calendars/maya/02-tzolk-in-and-haab-calendar-round.png and b/screenshots/calendars/maya/02-tzolk-in-and-haab-calendar-round.png differ
diff --git a/screenshots/calendars/north-korea/01-dangi.png b/screenshots/calendars/north-korea/01-dangi.png
index e50d05c..ca5c8dd 100644
Binary files a/screenshots/calendars/north-korea/01-dangi.png and b/screenshots/calendars/north-korea/01-dangi.png differ
diff --git a/screenshots/calendars/north-korea/02-juche.png b/screenshots/calendars/north-korea/02-juche.png
index ea98280..66e9b85 100644
Binary files a/screenshots/calendars/north-korea/02-juche.png and b/screenshots/calendars/north-korea/02-juche.png differ
diff --git a/screenshots/calendars/north-korea/03-gregorian.png b/screenshots/calendars/north-korea/03-gregorian.png
index 146f472..6cb5848 100644
Binary files a/screenshots/calendars/north-korea/03-gregorian.png and b/screenshots/calendars/north-korea/03-gregorian.png differ
diff --git a/screenshots/calendars/north-sentinel-island/01-none-documented.png b/screenshots/calendars/north-sentinel-island/01-none-documented.png
new file mode 100644
index 0000000..e4336af
Binary files /dev/null and b/screenshots/calendars/north-sentinel-island/01-none-documented.png differ
diff --git a/screenshots/calendars/oregon-country/01-gregorian.png b/screenshots/calendars/oregon-country/01-gregorian.png
index 772375d..c18a898 100644
Binary files a/screenshots/calendars/oregon-country/01-gregorian.png and b/screenshots/calendars/oregon-country/01-gregorian.png differ
diff --git a/screenshots/calendars/ottoman/01-islamic.png b/screenshots/calendars/ottoman/01-islamic.png
index 62207e7..022f041 100644
Binary files a/screenshots/calendars/ottoman/01-islamic.png and b/screenshots/calendars/ottoman/01-islamic.png differ
diff --git a/screenshots/calendars/ottoman/02-rumi.png b/screenshots/calendars/ottoman/02-rumi.png
index 24324d8..8ee2cc4 100644
Binary files a/screenshots/calendars/ottoman/02-rumi.png and b/screenshots/calendars/ottoman/02-rumi.png differ
diff --git a/screenshots/calendars/ottoman/03-gregorian.png b/screenshots/calendars/ottoman/03-gregorian.png
index 64c15f2..e466a8e 100644
Binary files a/screenshots/calendars/ottoman/03-gregorian.png and b/screenshots/calendars/ottoman/03-gregorian.png differ
diff --git a/screenshots/calendars/revolutionary-france/01-gregorian.png b/screenshots/calendars/revolutionary-france/01-gregorian.png
index 2a69b11..b7d4aab 100644
Binary files a/screenshots/calendars/revolutionary-france/01-gregorian.png and b/screenshots/calendars/revolutionary-france/01-gregorian.png differ
diff --git a/screenshots/calendars/revolutionary-france/02-french-republican-calendar.png b/screenshots/calendars/revolutionary-france/02-french-republican-calendar.png
index 36ee547..b71dbb2 100644
Binary files a/screenshots/calendars/revolutionary-france/02-french-republican-calendar.png and b/screenshots/calendars/revolutionary-france/02-french-republican-calendar.png differ
diff --git a/screenshots/calendars/revolutionary-france/03-french-republican-calendar.png b/screenshots/calendars/revolutionary-france/03-french-republican-calendar.png
index b31d27c..4bf3d5c 100644
Binary files a/screenshots/calendars/revolutionary-france/03-french-republican-calendar.png and b/screenshots/calendars/revolutionary-france/03-french-republican-calendar.png differ
diff --git a/screenshots/calendars/revolutionary-france/04-gregorian.png b/screenshots/calendars/revolutionary-france/04-gregorian.png
index 5a91b34..d96e5b1 100644
Binary files a/screenshots/calendars/revolutionary-france/04-gregorian.png and b/screenshots/calendars/revolutionary-france/04-gregorian.png differ
diff --git a/screenshots/calendars/thailand/01-buddhist.png b/screenshots/calendars/thailand/01-buddhist.png
index c4a6e68..7b7f9ad 100644
Binary files a/screenshots/calendars/thailand/01-buddhist.png and b/screenshots/calendars/thailand/01-buddhist.png differ
diff --git a/screenshots/calendars/vietnam/01-vietnamese-lunisolar-calendar.png b/screenshots/calendars/vietnam/01-vietnamese-lunisolar-calendar.png
index 9254cde..8d9374a 100644
Binary files a/screenshots/calendars/vietnam/01-vietnamese-lunisolar-calendar.png and b/screenshots/calendars/vietnam/01-vietnamese-lunisolar-calendar.png differ
diff --git a/screenshots/calendars/vietnam/02-gregorian.png b/screenshots/calendars/vietnam/02-gregorian.png
index f2d5120..aed47fe 100644
Binary files a/screenshots/calendars/vietnam/02-gregorian.png and b/screenshots/calendars/vietnam/02-gregorian.png differ
diff --git a/screenshots/calendars/vietnam/03-vietnamese-lunisolar-calendar.png b/screenshots/calendars/vietnam/03-vietnamese-lunisolar-calendar.png
index f2d5120..aed47fe 100644
Binary files a/screenshots/calendars/vietnam/03-vietnamese-lunisolar-calendar.png and b/screenshots/calendars/vietnam/03-vietnamese-lunisolar-calendar.png differ
diff --git a/scripts/validate-data.mts b/scripts/validate-data.mts
index 52e93bd..55908bc 100644
--- a/scripts/validate-data.mts
+++ b/scripts/validate-data.mts
@@ -139,6 +139,9 @@ function checkEra(era: unknown, i: number, errors: string[]): void {
             e.anchorEvents.forEach((ev, j) => checkAnchorEvent(ev, `${label}.anchorEvents[${j}]`, errors));
         }
     }
+    if (e.suppressModernDefault !== undefined && typeof e.suppressModernDefault !== 'boolean') {
+        errors.push(`${label}.suppressModernDefault: must be a boolean when present`);
+    }
 }
 
 // Anchor events are sourced, dateable reckoning points (see SCHEMA.md): each
diff --git a/src/App.tsx b/src/App.tsx
index 61691ec..77659d9 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -120,22 +120,29 @@ function App() {
     const yearBands = useMemo<YearBand[]>(() => {
         if (!picked) return [];
         const bands: YearBand[] = [];
+        let suppressesModernDefault = false;
         for (const cr of findRegions(picked.lat, picked.lng, regions)) {
             for (const era of cr.eras) {
+                const end = era.end ? parseGregorianDate(era.end).year : Infinity;
                 bands.push({
                     start: era.start ? parseGregorianDate(era.start).year : -Infinity,
-                    end: era.end ? parseGregorianDate(era.end).year : Infinity,
+                    end,
                     color: colorFor(era.calendar),
                     calendar: era.calendar,
                 });
+                // Mirror resolve()'s suppressModernDefault: an era opting out
+                // (e.g. North Sentinel Island) blocks the global Gregorian band
+                // too, not just the text answer — only if it reaches modern times.
+                if (era.suppressModernDefault && end >= MODERN_DEFAULT_START_YEAR) suppressesModernDefault = true;
             }
         }
         // Mirror resolve()'s modern global Gregorian default on the timeline,
-        // unless a region already supplies a Gregorian band reaching modern times.
+        // unless a region already supplies a Gregorian band reaching modern
+        // times, or an era explicitly suppresses the default here.
         const hasModernGregorian = bands.some(
             (b) => b.calendar === 'Gregorian' && b.end >= MODERN_DEFAULT_START_YEAR,
         );
-        if (!hasModernGregorian) {
+        if (!hasModernGregorian && !suppressesModernDefault) {
             bands.push({
                 start: MODERN_DEFAULT_START_YEAR,
                 end: Infinity,
diff --git a/src/data/calendars/SCHEMA.md b/src/data/calendars/SCHEMA.md
index ff4159b..c34b667 100644
--- a/src/data/calendars/SCHEMA.md
+++ b/src/data/calendars/SCHEMA.md
@@ -29,7 +29,8 @@ Each file describes a region and its calendar eras.
           "date": "YYYY-MM-DD (proleptic Gregorian, when it happened)",
           "sources": ["string (URL or citation — required, ≥1)"]
         }
-      ]
+      ],
+      "suppressModernDefault": "boolean (optional, default false — see Notes)"
     }
   ]
 }
@@ -64,3 +65,12 @@ of truth.
   "about N winters since &lt;event&gt;". Each event needs a `name`, a proleptic-
   Gregorian `date`, and at least one **`source`** — anchors must be documented
   real events; the engine only counts the winters, it never invents an event.
+- **`suppressModernDefault`** (optional, default `false`) opts a region out of
+  the app's modern global Gregorian default (shown everywhere from 1927 on,
+  see `resolve.ts`) for any date this era covers. This is for the rare place
+  where no outside civil calendar has ever applied at all — e.g.
+  `north-sentinel-island.json`, where the Sentinelese have never adopted the
+  Gregorian calendar — not for a region that simply has its own *different*
+  calendar (those already suppress the default automatically once they supply
+  their own Gregorian-calendar era, or coexist with it like modern Iran).
+  Almost no region should set this.
diff --git a/src/data/calendars/north-sentinel-island.json b/src/data/calendars/north-sentinel-island.json
new file mode 100644
index 0000000..05c1567
--- /dev/null
+++ b/src/data/calendars/north-sentinel-island.json
@@ -0,0 +1,33 @@
+{
+    "region": {
+        "name": "North Sentinel Island",
+        "geo": {
+            "type": "Polygon",
+            "coordinates": [
+                [
+                    [92.20, 11.60],
+                    [92.30, 11.60],
+                    [92.30, 11.50],
+                    [92.20, 11.50],
+                    [92.20, 11.60]
+                ]
+            ]
+        }
+    },
+    "eras": [
+        {
+            "name": "No documented calendar",
+            "start": null,
+            "end": null,
+            "calendar": "None documented",
+            "usedBy": "the Sentinelese",
+            "suppressModernDefault": true,
+            "description": "The Sentinelese, the indigenous people of North Sentinel Island in the Bay of Bengal, are among the most isolated peoples on Earth and have maintained voluntary isolation, defending it against outside contact (sometimes fatally — a 2006 incident killed two fishermen who drifted ashore, and a 2018 incident killed an American who landed illegally). Because of this complete isolation, no calendar, timekeeping system, or reckoning of years has ever been documented for them, and their language itself is unclassified for the same reason. Indian law (the Andaman and Nicobar Islands Protection of Aboriginal Tribes Regulation, 1956) bars travel within 5 nautical miles of the island specifically to preserve this isolation, so this is not a gap in research that further contact would responsibly fill — it is treated here as permanently undocumented. Unlike every other region in this dataset, the island is also excluded from the app's modern global Gregorian default: the Sentinelese have never adopted any outside civil calendar, so no Gregorian answer is shown here even today.",
+            "sources": [
+                "https://en.wikipedia.org/wiki/North_Sentinel_Island",
+                "https://en.wikipedia.org/wiki/Sentinelese",
+                "https://en.wikipedia.org/wiki/Andaman_and_Nicobar_Islands_Protection_of_Aboriginal_Tribes_Regulation,_1956"
+            ]
+        }
+    ]
+}
diff --git a/src/data/index.ts b/src/data/index.ts
index 86b73f6..1812430 100644
--- a/src/data/index.ts
+++ b/src/data/index.ts
@@ -71,6 +71,7 @@ function assertEra(value: unknown, path: string, i: number): Era {
         description: typeof e.description === 'string' ? e.description : undefined,
         sources: Array.isArray(e.sources) ? (e.sources as string[]) : undefined,
         anchorEvents: assertAnchorEvents(e.anchorEvents, path, i),
+        suppressModernDefault: typeof e.suppressModernDefault === 'boolean' ? e.suppressModernDefault : undefined,
     };
 }
 
diff --git a/src/types/index.ts b/src/types/index.ts
index 83c9d05..d70decf 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -61,6 +61,14 @@ export interface Era {
      * as "about N winters since <event>". Optional and back-compatible.
      */
     anchorEvents?: AnchorEvent[];
+    /**
+     * When true, this era opts its region out of the modern global Gregorian
+     * default (see resolve.ts's DEFAULT_MODERN_ERA) for any date this era
+     * covers — for the rare place where no outside civil calendar applies at
+     * all (e.g. North Sentinel Island), not just one with its own different
+     * calendar. Defaults to false; almost no region should set this.
+     */
+    suppressModernDefault?: boolean;
 }
 
 /**
diff --git a/src/utils/resolve.test.ts b/src/utils/resolve.test.ts
index 67fede5..6c67112 100644
--- a/src/utils/resolve.test.ts
+++ b/src/utils/resolve.test.ts
@@ -139,5 +139,18 @@ describe('resolve', () => {
             expect(answers).toHaveLength(1);
             expect(answers[0].era.name).toBe('Modern (global civil calendar)');
         });
+
+        it('suppresses the default entirely when the matched era opts out (e.g. North Sentinel Island)', () => {
+            const isolated: CalendarRegion[] = [
+                {
+                    region: { name: 'Isolated', geo: square },
+                    eras: [{ name: 'No outside calendar', start: null, end: null, calendar: 'None documented', suppressModernDefault: true }],
+                },
+            ];
+            const { answers, missReason } = resolve(5, 5, { year: 2025, month: 6, day: 1 }, isolated);
+            expect(missReason).toBeUndefined();
+            expect(answers).toHaveLength(1); // only the region's own era, no Gregorian default appended
+            expect(answers[0].era.name).toBe('No outside calendar');
+        });
     });
 });
diff --git a/src/utils/resolve.ts b/src/utils/resolve.ts
index 2937c02..b14f564 100644
--- a/src/utils/resolve.ts
+++ b/src/utils/resolve.ts
@@ -77,8 +77,12 @@ export function resolve(
 
     // Append the modern global Gregorian default — but only when no Gregorian
     // answer already applies here (a region with its own Gregorian era covering
-    // this date), so we never show the same Gregorian year twice.
-    if (isModernDefaultDate(date) && !answers.some((a) => a.conversion.system === 'Gregorian')) {
+    // this date, so we never show the same Gregorian year twice), and no
+    // matched era explicitly opts out (suppressModernDefault — for the rare
+    // place, like North Sentinel Island, where no outside civil calendar
+    // applies at all, not just a different one).
+    const suppressed = answers.some((a) => a.era.suppressModernDefault);
+    if (isModernDefaultDate(date) && !suppressed && !answers.some((a) => a.conversion.system === 'Gregorian')) {
         answers.push({
             region: DEFAULT_MODERN_REGION,
             era: DEFAULT_MODERN_ERA,