origins//research
iteration 5/10 Experience build 5/10 · implementing whisper-chain (oral-transmission chasm) + ritual-walkthroughs (Shang divination) 95/95 criteria · 100%
today
type · ideastatus · proposal

Motif Diffusion Map — watch a story travel the earth

Concept

An animated, scrubbable world map that turns the vault's central machinery — the descent / contact / convergence trichotomy — into something you can watch happen. Pick a motif (great-flood, dying-rising-god, sky-father) and drag a time slider across five millennia. Each dated occurrence ignites on the map at its attestation_earliest year, drawn in the visual language of its transmission verdict:

Every glyph is clickable and routes to the vault note that justifies it. The map is not an illustration of the research — it is the research, rendered: the same frontmatter (occurrences, transmission, attestation_earliest, evidence class) that the methodology mandates becomes the rendering input. If a verdict changes in a note, the map changes.

Why it takes you back in time

Reading the great-flood occurrence table, the dates are rows. On the map, they are a journey you stand inside. You start at 1900 BCE with one lonely point glowing on the Euphrates floodplain — and nothing else on Earth. You drag forward and physically watch the story take ship: Ugarit lights up in the 13th century BCE as the arrow crawls up the coast, Megiddo flickers, then the long pause of centuries before Jerusalem catches during the exile — and you feel the gap between Babylon writing the story and Judah inheriting it, because you spent slider-distance crossing it. Then you scrub to 1520 CE and the Americas erupt in unconnected sparks, and the difference between "borrowed" and "reinvented" stops being a methodology section and becomes something your eyes already understood.

Time-travel is reinforced by era atmosphere: as the slider moves, the map's backdrop and a side era-card shift — Old Babylonian scribal world at 1635 BCE, Late Bronze harbor world at 1300 BCE, exilic Babylon at 580 BCE — each with a photorealistic GPT-5.5 image (pipeline per AGENTS.md §5). The slider isn't a UI control; it's the vehicle.

Experience walkthrough

1. Arrive at /map. A dark equirectangular world in pre-dawn tones, slider parked at 3000 BCE, motif selector showing the three current motifs with their verdict badges (contact / unresolved / descent). Nothing burns yet. A single line of UI copy: "Drag time forward."

2. Select The Great Flood. Scrub to 1900 BCE — one amber point ignites at Nippur/Babylon (Sumerian King List allusion), a date chip reading "c. 1900–1800 BCE · 2-text" rising beside it. The era-card shows the Old Babylonian floodplain image.

3. Scrub to 1300 BCE. A contact arrow extends from Babylonia along the coast to Ugarit, a second flick to Megiddo. Hovering the arrow shows the link evidence: "Atra-ḫasīs fragment RS 22.421; Gilgamesh fragment, Megiddo." Clicking opens atrahasis-epic.

4. Scrub through 597–539 BCE. Jerusalem pulses as the Genesis node lights, the arrow from Babylon drawn doubled-dashed — because Q4 (Late Bronze vs. exilic borrowing) is open, both candidate routes render, labeled. The map shows the open question.

5. Scrub to 1520 CE. The Americas and Oceania ignite as isolated white sparks — 4-ethnography, post-contact recording — each carrying a small caution glyph for possible missionary contamination, hover text quoting the counter-evidence field.

6. Toggle "speculative layer." Ghost roots fade in across Beringia — the Berezkin deep-descent hypothesis, dashed, labeled 3-reconstruction · speculative. Toggle off: they vanish. Hypotheses you can switch on and off, like the methodology says.

7. Switch motif to Sky Father. The geometry inverts: instead of one source and arrows, a root tree grows out of the steppe from ~3000 BCE (ghost trunk — the PIE projection is speculative as a dated object) hardening into solid branches exactly at Knossos 1400 BCE (di-we, KN Fp 1) and Hittite šiu-. Click any branch tip → sky-fatherdyeus-sky-father-cognate-set.

8. Switch to Dying-and-Rising God. Three differently-colored strands (Dumuzi/Tammuz contact strand, Ugaritic Baal regional pattern, Osiris standing alone in Egypt) that pointedly never join — the map rendering the verdict that the category fragments.

9. Share/return. URL hash encodes motif + year (/map#great-flood@-1300), so any frame of the journey is a permalink usable inside vault notes.

Data from the vault

Everything needed already exists in tier-2 motif notes; the map adds a thin geo layer, no new claims.

InputWhere it lives todayUsed for
Motif list + verdicts09_comparative/2_notes/*.md frontmatter (type: motif, transmission, confidence)Motif selector, glyph language
Dated occurrences"## Occurrences (dated)" tables + attestation_earliest (e.g. great-flood: King List c. 1900 BCE → Atra-ḫasīs 1635 BCE → Ugarit 13th c. → Genesis 7th–5th c. → Deucalion 466 BCE → Manu c. 700–600 BCE → Gun-Yu c. 900 BCE → Americas 16th c. CE)Ignition year per node
Evidence classesper-row in occurrence tables (1-archaeology / 2-text / 4-ethnography)Solid vs. dashed vs. caution rendering
Transmission analysis + counter-evidencebody sections + counter_evidence fieldHover text, dual-route rendering (Q4), contamination caveats
Open questions00_meta/OPEN_QUESTIONS.md (Q4, Q5, Q7, Q10, Q11)"Open question" badges on ambiguous geometry
Click-through targetsexisting note routes served by tools/server.tsEvery glyph links to its note
Missing: coordinates + machine-readable yearsnowhere yetNew curated file tools/map/occurrences.json (see below) — vault notes stay untouched and remain SSOT for claims; the JSON only adds lat/lon/year and references notes, validated against them at request time

Implementation sketch

Bun + vanilla JS/SVG, zero npm deps, served by the existing tools/server.ts (single Bun.serve fetch handler, port 4870, read-only). Three additions to the routing switch in fetch(req) (alongside the existing /sitemap.xml, /api/version, / branches):

RouteReturns
GET /mapSelf-contained experience page: inline HTML/CSS/JS (same inline-template style as the existing page() helper), no build step. SVG layers: basemap → descent roots → contact arrows → convergence sparks → speculative ghost layer → date chips. Slider drives a single setYear(y) that toggles per-element visibility/animation via CSS custom property --t. Hash routing for permalinks.
GET /api/map/motifsJSON: walks 09_comparative/2_notes/, takes notes with type: motif via the existing parseFrontmatter(), merges with tools/map/occurrences.json, and fails loudly (HTTP 500 with the mismatch) if the JSON references a tradition absent from the note's occurrences array or a note path that 404s — the curated geo file can never silently drift from the vault.
GET /assets/map/world.svgCommitted simplified Natural Earth coastline (one-time generation by tools/map/build-basemap.ts, a bun script that fetches NE 110m land GeoJSON once and bakes it to a single equirectangular <path>, ~40 KB; runs once, output committed, no runtime dependency). Already served by the existing static-file fallthrough — only the asset needs committing.

Data file tools/map/occurrences.json (curated by the synthesis agent, gated by the API validation):


{ "motif": "great-flood", "tradition": "ugaritic-circulation",
  "year": -1250, "year_label": "13th c. BCE", "lat": 35.6, "lon": 35.78,
  "mechanism": "contact", "from": "babylonian-akkadian",
  "evidence_class": "2-text", "speculative": false,
  "note": "/09_comparative/1_sources/atrahasis-epic.md" }

Rendering rules (all SVG/CSS, no canvas, no libs): descent roots = cubic Béziers with stroke-dasharray draw-on animation keyed to year; contact arrows = same plus an arrowhead marker and a moving dash pulse; convergence sparks = radial <circle> scale+fade pulse; speculative = opacity:.35; stroke-dasharray:2 6 plus a layer toggle. Era-cards: a static lookup {yearRange → image, caption} pointing at assets/illustrations/map-era-*.png. Mobile: slider doubles as horizontal swipe surface. Everything respects the server's read-only contract — the map writes nothing.

Images needed

GPT-5.5 via codex CLI (AGENTS.md §5): photorealistic, cinematic, archaeologically grounded, no text in images, no devotional framing. Filenames assets/illustrations/map-era-*.png plus the idea banner motif-diffusion-map.png.

1. Banner / landing backdrop — "Photorealistic aerial view at dawn from high altitude over the Euphrates river delta floodplain, braided silver river channels catching first light through low mist, distant mudbrick tell mound on the horizon, dark indigo sky grading to amber, cinematic atmospheric perspective, shot on large-format camera, no text, no people."

2. Era-card, Old Babylonian c. 1900–1600 BCE — "Photorealistic close-up of a clay cuneiform tablet held in weathered hands inside a dim mudbrick scribal room, oil-lamp light raking across freshly impressed wedge marks, reed stylus resting beside it, dust motes in the warm light, shallow depth of field, archaeologically accurate Old Babylonian tablet proportions, no readable modern text."

3. Era-card, Late Bronze contact c. 1400–1200 BCE — "Photorealistic Mediterranean harbor scene at golden hour, a Late Bronze Age cargo ship with single square sail and hogging truss moored at a stone quay, stacked Canaanite amphorae and copper oxhide ingots being unloaded, Ugarit-style city wall in background haze, gulls, accurate 13th-century-BCE ship construction, cinematic, no text."

4. Era-card, exilic Babylon c. 600–540 BCE — "Photorealistic evening view down a processional street of Neo-Babylonian Babylon, glazed-brick walls with lion reliefs in deep blue and ochre, torchlight reflections on rain-wet paving, robed figures seen from behind at a distance, towering ziggurat silhouette against a violet dusk sky, archaeologically faithful Ishtar Gate brickwork, cinematic scale, no text."

5. Era-card, steppe descent c. 3000 BCE (Sky Father trunk) — "Photorealistic vast Pontic steppe at sunrise under an enormous luminous sky, dew on feather-grass to the horizon, a distant kurgan burial mound and grazing horses, lone wagon track curving away, the sky itself as the overwhelming subject, ultra-wide cinematic landscape, no people in focus, no text."

6. Era-card, independent sparks 16th c. CE (Americas/Oceania) — "Photorealistic Pacific coastal village at dusk after heavy rain, Andean foothills behind, swollen river meeting the sea, firelight from reed-and-stone dwellings, storm clouds breaking into stars overhead, respectful documentary tone, archaeologically grounded pre-contact Andean architecture, no text, no identifiable individuals."

7. Speculative-layer toggle vignette (Beringia ghost roots) — "Photorealistic ice-age land bridge landscape under aurora-lit night sky, frozen tundra with patches of exposed grass, distant megafauna silhouettes barely visible in the gloom, ethereal pale-green aurora as the only light source, vast and uncertain mood, cinematic, no text, no people."

Effort

M overall — ships in three slices, first slice is S.

1. S — ships first (one session): basemap baked and committed, /map page with slider + great-flood only, occurrences hand-curated in tools/map/occurrences.json, static glyphs (no animation polish), click-through to notes, validation in /api/map/motifs. Already delivers the core time-travel beat: scrub, ignite, click.

2. M — second slice: all three motifs, mechanism-specific animation language (root growth, arrow pulse, spark), speculative-layer toggle, dual-route rendering for Q4, hash permalinks.

3. M — polish slice: era-cards with the seven GPT-5.5 images, mobile swipe, hover evidence chips quoting counter_evidence, INDEX.md link-in (per AGENTS.md §6: not linked = doesn't exist).

Risks: tradition→coordinate assignment is an editorial act (a "tradition" isn't a point) — mitigated by region-blob rendering option and by every coordinate living in one reviewable JSON; date strings in notes are prose — mitigated by the curated year field plus loud validation, never by parsing prose.