18 KiB
RFC-TESSERA-3.0-PALEO-001
Palaeoenvironmental Sea Level Correction
Status: Draft v0.1
Date: 2026-04-26
Supersedes: nothing — first RFC in PALEO series
Referenced by: RFC-TESSERA-3.0-OCC-001 Section 8, tesserav3 README
Note: Canonical copy lives in tesserav3 ssot/docs/v3/. This is a reference copy.
Abstract
TESSERA elev_cm values are referenced to modern mean sea level (MSL = 0),
sourced from GEBCO 2025 using the EGM2008 geoid as vertical datum. This is
physically correct and immutable. It must not be modified.
Sea level has not been constant. At the Last Glacial Maximum (~20,000 BCE) global MSL was approximately 120m below present. At 8000 BCE (CIVICVS simulation period) it was approximately 20–30m below present and rising rapidly. At 0 CE (OTIVM Roman period) it was within ~1m of present.
This RFC specifies:
- A named epoch table with sea level offsets relative to TESSERA baseline
- The canonical query by which any consumer (OTIVM, CIVICVS, future systems) derives land/sea classification at a given epoch without modifying the baseline
- The pipeline work required to validate the offset values against the palaeoclimate literature
- The scope boundary between TESSERA (physical reality) and consumers (interpretation and rendering)
The sea level offset is never stored in otivm.sqlite3 or tessera.db.
It is applied at query time by the consumer. The baseline is inviolate.
1. Design Principles
1.1 The baseline is immutable
elev_cm in tessera_cells records the physical elevation of each H9 cell
centroid relative to modern MSL as measured by GEBCO 2025. It is not adjusted
for epoch, not corrected for isostatic rebound, not modified by any scenario.
It is a physical measurement. It does not change.
Any correction applied to it — for sea level, for isostasy, for sediment accumulation — is an interpretation layer. Interpretation layers live in consumer code, not in TESSERA.
1.2 The epoch table is the contract
The named epoch table defined in Section 3 is the shared contract between TESSERA and its consumers. OTIVM reads it. CIVICVS reads it. Any future system reads it. The offsets in this table are derived from the palaeoclimate literature and are citable. When the literature is updated or refined, the epoch table is updated — not the baseline data.
1.3 The offset is a threshold, not a transform
Sea level correction does not require modifying elevation values. It requires shifting the threshold at which a cell is classified as land or sea:
land = elev_cm > sea_level_offset_cm
Where sea_level_offset_cm is negative (sea was lower in the past, so the
land/sea boundary moves downward — more cells become land). This is a
scalar comparison. No geometry is modified. No data is rewritten.
1.4 Isostatic rebound is deferred
Glacial isostatic adjustment (GIA) — the rebound of landmasses after ice sheet removal — is spatially variable and adds significant complexity. Scandinavia was depressed by ~200m under the Fennoscandian ice sheet; the Mediterranean was largely unaffected. GIA correction requires a spatially varying offset per H9 cell, not a single scalar.
GIA is acknowledged here and deferred to RFC-TESSERA-3.0-PALEO-002. For OTIVM purposes (Mediterranean basin, Roman and Mesolithic periods), the GIA effect is small relative to eustatic sea level change and can be treated as zero in the initial implementation without material error.
For CIVICVS (Spree-Havel valley, 8000 BCE), GIA is more significant — northern Germany experienced ~10–20m of rebound between 10,000 BCE and 6,000 BCE. This is noted but does not block OTIVM-II delivery.
1.5 Relative sea level is not global sea level
TESSERA records absolute elevation relative to a global geoid. Sea level at any specific location is the global eustatic signal plus local isostatic adjustment plus local sediment compaction. The epoch table in Section 3 provides eustatic offsets only — global average sea level change. Local corrections require GIA data (deferred) and sediment models (future work).
For the Mediterranean, eustatic offsets alone are sufficient for a defensible first approximation. For the North Sea and Baltic, they are not. This distinction must be surfaced to the player when relevant.
2. Vertical Datum
elev_cm in TESSERA is referenced to:
- Datum: EGM2008 geoid (approximately equivalent to global MSL)
- Source: GEBCO 2025 Grid
- Unit: signed integer centimetres
- Range: approximately −11,000m to +8,850m (full Earth surface)
- Zero: modern mean sea level
GEBCO 2025 uses a unified global grid at 15 arc-second resolution (~460m), resampled to H9 centroids (~180m) during TESSERA pipeline stage 00–01. The resampling introduces sub-metre error in areas of high terrain gradient. For coastline rendering this is acceptable at H7 and H5 resolution; at H9 resolution in steep coastal terrain (e.g. fjords, cliffs) visible artefacts may occur.
This datum is consistent with the ICE-5G and ICE-6G palaeoclimate sea level reconstructions, which express past sea levels as offsets from present-day MSL. No datum conversion is required when applying offsets from Section 3.
3. Named Epoch Table
The canonical set of epochs, their sea level offsets relative to TESSERA baseline (modern MSL = 0), confidence grades, and primary citations.
All offsets are eustatic only — global average, no isostatic correction. Negative values = sea was lower = more land area than today.
| epoch_key | label | approx_date | sl_offset_cm | confidence | primary_citation |
|---|---|---|---|---|---|
present |
Present day | 2025 CE | 0 | measured | GEBCO 2025 |
roman_14bce |
Roman period, 14 BCE | ~14 BCE | −10 | indicated | Lambeck et al. 2004 |
subboreal_3000bce |
Sub-Boreal, 3000 BCE | ~3000 BCE | −200 | indicated | Lambeck et al. 2014 |
atlantic_6000bce |
Atlantic optimum, 6000 BCE | ~6000 BCE | −500 | indicated | Lambeck et al. 2014 |
mesolithic_8000bce |
Mesolithic, 8000 BCE | ~8000 BCE | −2500 | indicated | Lambeck et al. 2014 |
preboreal_10000bce |
Pre-Boreal, 10000 BCE | ~10000 BCE | −5000 | indicated | Lambeck et al. 2014 |
younger_dryas_11000bce |
Younger Dryas, 11000 BCE | ~11000 BCE | −7000 | inferred | Lambeck et al. 2014 |
lgm_20000bce |
Last Glacial Maximum, 20000 BCE | ~20000 BCE | −12000 | indicated | Clark et al. 2009 |
eem_125000bce |
Eemian interglacial, 125000 BCE | ~125000 BCE | +600 | inferred | Dutton & Lambeck 2012 |
Note on roman_14bce: Mediterranean relative sea level at the Roman
period was within ~0.1m of present. The −10cm offset is within measurement
uncertainty and may be treated as zero for rendering purposes. It is included
for completeness and to prevent consumers from assuming present-day MSL is
wrong for Roman-period content.
Note on mesolithic_8000bce: This is the primary epoch for CIVICVS.
At −25m, significant coastal areas are exposed relative to today — the
Adriatic was shallower, the Po Valley more extensive, parts of the Aegean
shelf were land. For the Mediterranean specifically, the effect is most
visible in the Adriatic, the Gulf of Gabes (Tunisia), and the Nile delta.
Note on lgm_20000bce: At −120m, the Mediterranean was dramatically
different. The Sicilian Channel was partially exposed. Cyprus was larger.
The Nile delta extended much further north. This epoch is included for
future use; it is not required for OTIVM-II or CIVICVS v1.
3.1 Interpolation between epochs
Consumers may interpolate linearly between adjacent epochs for animation or continuous temporal regression. Linear interpolation is not physically accurate — sea level rise was non-linear and punctuated by meltwater pulses (notably Meltwater Pulse 1A at ~14,600 BCE, ~20m rise in ~500 years). For game purposes, linear interpolation between the named epochs in Section 3 is sufficient and defensible as an approximation.
When CIVICVS requires higher temporal resolution (decadal or centennial), RFC-TESSERA-3.0-PALEO-002 will specify a continuous curve derived from the Lambeck et al. 2014 far-field reconstruction.
4. Canonical Consumer Query
Any consumer deriving land/sea classification for a given epoch queries
tessera_cells as follows. This query is normative — consumers must not
implement alternative logic.
-- Land/sea classification at a named epoch
-- :h5 = H3 res-5 integer ID of the waypoint hex
-- :sl_offset_cm = sea_level_offset_cm from the epoch table (Section 3)
-- negative = sea was lower = more land
SELECT
h9,
lat,
lon,
elev_cm,
CASE
WHEN elev_cm > :sl_offset_cm THEN 1 -- land at this epoch
ELSE 0 -- sea at this epoch
END AS is_land
FROM tessera_cells
WHERE h5 = :h5
AND status = 2
ORDER BY h9;
For coastline rendering at reduced resolution (H7 or H5), aggregate by the parent cell and classify as land if the majority of H9 children are land:
-- H7-aggregated land/sea classification at a named epoch
SELECT
h7,
COUNT(*) AS h9_total,
SUM(CASE WHEN elev_cm > :sl_offset_cm THEN 1 ELSE 0 END) AS h9_land,
CASE
WHEN SUM(CASE WHEN elev_cm > :sl_offset_cm THEN 1 ELSE 0 END) * 2
> COUNT(*) THEN 1
ELSE 0
END AS is_land_majority
FROM tessera_cells
WHERE h5 = :h5
AND status = 2
GROUP BY h7;
The majority rule (>50% of H9 children are land → H7 cell is land) is the default. Consumers may use a higher threshold (e.g. 75%) for a more conservative coastline that errs toward sea. This is a rendering decision, not a data decision, and is not specified here.
4.1 What consumers must not do
- Modify
elev_cmvalues in the database - Store derived land/sea classification in the database
- Cache epoch offsets inside the baseline schema
- Treat the epoch table as immutable — it will be updated as the literature is refined, and consumers must read it fresh rather than hardcoding offsets
5. Epoch Table Storage
The epoch table in Section 3 is the authoritative record. It is stored in two places:
In otivm.sqlite3 — as a read-only lookup table paleo_epochs, created
by the schema script (data/create_otivm_db.sql). The OTIVM game server
reads this table to resolve named epochs to sl_offset_cm values at runtime.
In this RFC — as the normative definition. If the table in the database diverges from the RFC, the RFC takes precedence and the database must be corrected.
5.1 paleo_epochs table schema
CREATE TABLE paleo_epochs (
epoch_key TEXT PRIMARY KEY,
label TEXT NOT NULL,
approx_date_bce INTEGER NOT NULL, -- years BCE, positive; years CE, negative
sl_offset_cm INTEGER NOT NULL, -- offset from modern MSL, negative = lower
confidence INTEGER NOT NULL -- FK to confidence_grades(id)
REFERENCES confidence_grades(id),
primary_citation TEXT NOT NULL,
notes TEXT
);
This table is populated once at database creation and updated only when the RFC is updated. It is not a pipeline output — it is authored data derived from the palaeoclimate literature.
5.2 Work order for TESSERA assistant
The following SQL insert block is the work order. It populates paleo_epochs
in otivm.sqlite3. The TESSERA assistant must:
- Verify the offset values against the cited literature before inserting
- Add this INSERT block to
data/create_otivm_db.sqlin the OTIVM repo - Confirm that
confidence_gradesIDs match (1=measured, 2=indicated, 3=inferred, 4=no_data) as defined indata/create_otivm_db.sql - Commit to OTIVM
mainbranch with message: "Add paleo_epochs table to create_otivm_db.sql per RFC-TESSERA-3.0-PALEO-001"
INSERT INTO paleo_epochs
(epoch_key, label, approx_date_bce, sl_offset_cm, confidence, primary_citation, notes)
VALUES
('present',
'Present day',
-2025,
0,
1,
'GEBCO Compilation Group (2025) GEBCO 2025 Grid (doi:10.5285/a29c5465-b138-234d-e053-6c86abc0dc7f)',
'Baseline. EGM2008 geoid, modern MSL = 0. No correction applied.'),
('roman_14bce',
'Roman period, 14 BCE',
14,
-10,
2,
'Lambeck et al. (2004) Sea-level change through the last glacial cycle. Science 292(5517).',
'Mediterranean RSL within measurement uncertainty of present. Treat as 0 for rendering.'),
('subboreal_3000bce',
'Sub-Boreal, 3000 BCE',
3000,
-200,
2,
'Lambeck et al. (2014) Sea level and global ice volumes from the Last Glacial Maximum to the Holocene. PNAS 111(43).',
NULL),
('atlantic_6000bce',
'Atlantic optimum, 6000 BCE',
6000,
-500,
2,
'Lambeck et al. (2014) Sea level and global ice volumes from the Last Glacial Maximum to the Holocene. PNAS 111(43).',
NULL),
('mesolithic_8000bce',
'Mesolithic, 8000 BCE',
8000,
-2500,
2,
'Lambeck et al. (2014) Sea level and global ice volumes from the Last Glacial Maximum to the Holocene. PNAS 111(43).',
'Primary epoch for CIVICVS simulation. Adriatic, Gulf of Gabes, Nile delta visibly affected.'),
('preboreal_10000bce',
'Pre-Boreal, 10000 BCE',
10000,
-5000,
2,
'Lambeck et al. (2014) Sea level and global ice volumes from the Last Glacial Maximum to the Holocene. PNAS 111(43).',
NULL),
('younger_dryas_11000bce',
'Younger Dryas, 11000 BCE',
11000,
-7000,
3,
'Lambeck et al. (2014) Sea level and global ice volumes from the Last Glacial Maximum to the Holocene. PNAS 111(43).',
'Rapid sea level fall during Younger Dryas stadial. Offset is approximate.'),
('lgm_20000bce',
'Last Glacial Maximum, 20000 BCE',
20000,
-12000,
2,
'Clark et al. (2009) The Last Glacial Maximum. Science 325(5941).',
'Sicilian Channel partially exposed. Cyprus enlarged. Reserved for future use.'),
('eem_125000bce',
'Eemian interglacial, 125000 BCE',
125000,
600,
3,
'Dutton & Lambeck (2012) Ice volume and sea level during the last interglacial. Science 337(6091).',
'Positive offset: sea was higher than today. Reserved for future use.');
6. OTIVM-Specific Requirements
This section is addressed to the OTIVM game development assistant and documents the game-side requirements that drove this RFC.
6.1 Map rendering epochs
OTIVM-II (current) renders the Mediterranean at the modern epoch (present,
offset = 0). The coastline query uses the canonical SQL in Section 4.
For OTIVM-III and beyond, the map must support rendering at any named epoch.
The epoch is passed as a parameter; the SQL is unchanged. The UI does not
need to expose epoch selection to the player in early releases — the epoch
is set by the game narrative (Roman period = roman_14bce).
6.2 Fog-of-war cell classification
When a galley travels a route, H3 cells along the route are revealed. The
revealed cells must be classified as land or sea at the active epoch before
rendering. The canonical query in Section 4 produces this classification.
Cells classified as sea are rendered as water. Cells classified as land
are rendered with terrain colour derived from elev_cm (relative to the
epoch offset, not absolute).
6.3 Sea level as a game mechanic
In future releases, the player may observe the coastline changing as the
narrative moves through time. The epoch table in Section 3 provides the
anchor points. The game transitions between epochs by interpolating
sl_offset_cm and re-running the canonical query. No data changes — only
the threshold changes.
This is not a gimmick. A player who reaches Alexandria in the Roman period
and later encounters journal entries referencing the Mesolithic shore is
experiencing the same physical geography at two different sea levels,
derived from the same elev_cm data, with a scalar offset that is citable
to Lambeck et al. 2014.
7. What This RFC Does Not Cover
| Topic | Future RFC |
|---|---|
| Glacial isostatic adjustment (GIA) | RFC-TESSERA-3.0-PALEO-002 |
| Meltwater pulse events (non-linear SL change) | RFC-TESSERA-3.0-PALEO-002 |
| Palaeoclimate terrain correction (vegetation, river courses) | RFC-TESSERA-3.0-PALEO-003 |
| Hydrological restoration (palaeo-drainage networks) | RFC-TESSERA-3.0-HYD-001 |
| Simulation temporal regression state | CIVICVS RFC stack |
| Player-facing epoch UI | OTIVM game code |
8. Primary Literature
All offset values in Section 3 must be verified against these sources before
the epoch table is committed to otivm.sqlite3. This is the responsibility
of the TESSERA pipeline assistant.
-
Lambeck et al. 2014 — "Sea level and global ice volumes from the Last Glacial Maximum to the Holocene." PNAS 111(43): 15296–15303. doi:10.1073/pnas.1411762111. Far-field reconstruction, globally applicable, primary source for Holocene offsets.
-
Lambeck et al. 2004 — "Sea-level change through the last glacial cycle." Science 292(5517): 679–686. doi:10.1126/science.1059549. Mediterranean regional reconstruction, primary source for Roman period.
-
Clark et al. 2009 — "The Last Glacial Maximum." Science 325(5941): 710–714. doi:10.1126/science.1172873. LGM sea level −120m, primary source for
lgm_20000bce. -
Dutton & Lambeck 2012 — "Ice Volume and Sea Level During the Last Interglacial." Science 337(6091): 216–219. doi:10.1126/science.1205749. Eemian +6m, primary source for
eem_125000bce. -
GEBCO 2025 — doi:10.5285/a29c5465-b138-234d-e053-6c86abc0dc7f. Vertical datum reference. CC-BY 4.0.
RFC-TESSERA-3.0-PALEO-001 Draft v0.1 — 2026-04-26 Produced by: OTIVM game development assistant Work order to: TESSERA pipeline assistant Status: Draft — pending literature verification of offset values before paleo_epochs INSERT is committed to data/create_otivm_db.sql Next action: TESSERA assistant verifies Lambeck et al. 2014 offsets, then adds paleo_epochs schema and INSERT to data/create_otivm_db.sql