feat: make the temporal skeleton data-driven (#42, part 1) #418

Merged
manlycucumber merged 1 commit from feature/42-temporal-definitions into develop 2026-07-02 16:12:00 +00:00
manlycucumber commented 2026-07-02 16:10:42 +00:00 (Migrated from github.com)

Advances #41's sibling #42 (temporal data-for-code) — part 1 of 2: the edition-invariant paschal skeleton is now data, not PHP literals.

What

  • tools/generator/facts/temporal-skeleton.yamldata/corpus/temporal/easter-offsets.ndjson (30 rows) + block-seasons.ndjson (9 rows), each cited to the 1960 rubrics; the generator resolves every cite against the source registry.
  • TemporalDefinitions — the PHP read seam over that data, memoised per process.
  • PaschalSkeleton reads its offset table through the seam (kept chronological); Season::forBlock reads the block→season map through it. Neither holds a hard-coded table any longer.

Safety

The date arithmetic is unchanged (fillers still count days from Gregorian Easter), so the golden-year fixture (#365) is byte-for-byte unchanged — the swap is provably inert. Local gate: PSR-12 clean, PHPStan [OK], 599 tests / 31,550 assertions, corpus npm run verify reproducible over 8 files.

Remaining for #42 (part 2)

The per-archetype rank/colour/name overlay the 6 fillers still carry inline (~60–70 archetypes) → attributes.temporale + identity.temporale data behind a TemporalAttributes seam. Does not close #42.

Advances #41's sibling **#42** (temporal data-for-code) — **part 1 of 2**: the edition-invariant paschal skeleton is now data, not PHP literals. ## What - **`tools/generator/facts/temporal-skeleton.yaml`** → `data/corpus/temporal/easter-offsets.ndjson` (30 rows) + `block-seasons.ndjson` (9 rows), each cited to the 1960 rubrics; the generator resolves every `cite` against the source registry. - **`TemporalDefinitions`** — the PHP read seam over that data, memoised per process. - **`PaschalSkeleton`** reads its offset table through the seam (kept chronological); **`Season::forBlock`** reads the block→season map through it. Neither holds a hard-coded table any longer. ## Safety The date arithmetic is unchanged (fillers still count days from Gregorian Easter), so the **golden-year fixture (#365) is byte-for-byte unchanged** — the swap is provably inert. Local gate: PSR-12 clean, PHPStan `[OK]`, **599 tests / 31,550 assertions**, corpus `npm run verify` reproducible over 8 files. ## Remaining for #42 (part 2) The per-archetype rank/colour/name overlay the 6 fillers still carry inline (~60–70 archetypes) → `attributes.temporale` + `identity.temporale` data behind a `TemporalAttributes` seam. Does not close #42.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Directorium/Core!418
No description provided.