feat: author the full 1962 General Roman Calendar sanctoral (#41) #417

Merged
manlycucumber merged 2 commits from feature/41-corpus-sanctoral into develop 2026-07-02 15:55:21 +00:00
manlycucumber commented 2026-07-02 15:53:55 +00:00 (Migrated from github.com)

Closes #41.

Expands the cited CC0 corpus from the 21-entry seed slice to the full fixed-date 1962 General Roman Calendar and reads it into the engine, retiring the inline seed.

What

  • Citation / CitationSet — the PHP counterpart of the corpus cites markers (the value object deferred from #44, landing with its first consumer).
  • Corpus — a cached reader over data/corpus (manifest, NDJSON shapes, version stamp). The engine only reads the corpus; it never regenerates it.
  • CorpusSanctoralData implements SanctoralData — joins the identity/attribute/placement shapes by id and rebuilds each SanctoralEntry with its CitationSet; wired as the default in DayResolver::for1962() and SanctoralCalendar::forYear().
  • tools/generator/facts/sanctorale.yaml — the full cited calendar: 297 entries (11 class I, 29 II, 174 III, 83 commemorations) + the 4 surviving vigils; regenerated into data/corpus.
  • Seed retired to tests/Fixture/SeedSanctoralData — now the controlled fixture the mechanics/precedence tests inject.
  • SanctoralDecemberReferenceTest — the spot-check: a hand-authored December reference confirmed against the corpus.

Safety

  • Two commits, isolated: commit 1 swaps the source with the corpus holding exactly the seed's entries → the golden-year fixture (#365) is byte-for-byte unchanged (the plumbing swap is provably inert). Commit 2 grows the calendar and re-freezes the golden fixture — the only sanctioned way its output moves.
  • Born-cited gate: every Latin title cites the Missale Romanum (public-domain text); every fact cites the 1960 rubrics — the generator fails closed otherwise.
  • Seed equivalence: the 21 verified anchors are reproduced field-for-field by the reader (CorpusSanctoralDataTest).

Authoring & accuracy

Authored and cross-verified month by month, then reconciled: slug collisions and same-day/same-name re-slugs of seed anchors removed; St Irenaeus kept on his 1960 date (Jul 3); suppressed 1955/1960 feasts excluded; movable feasts of the Lord resolved temporally or deferred (noted in KNOWN-LIMITATIONS). Confidence: cross-verified first authoritative dataset — multi-oracle re-proving is Epic #45.

Verification

Local gate: PSR-12 clean, PHPStan [OK], 597 tests / 31,538 assertions green; corpus npm run verify reproducible over 6 files.

Closes #41. Expands the cited CC0 corpus from the 21-entry seed slice to the **full fixed-date 1962 General Roman Calendar** and reads it into the engine, retiring the inline seed. ## What - **`Citation` / `CitationSet`** — the PHP counterpart of the corpus `cites` markers (the value object deferred from #44, landing with its first consumer). - **`Corpus`** — a cached reader over `data/corpus` (manifest, NDJSON shapes, version stamp). The engine only reads the corpus; it never regenerates it. - **`CorpusSanctoralData implements SanctoralData`** — joins the identity/attribute/placement shapes by id and rebuilds each `SanctoralEntry` with its `CitationSet`; wired as the default in `DayResolver::for1962()` and `SanctoralCalendar::forYear()`. - **`tools/generator/facts/sanctorale.yaml`** — the full cited calendar: **297 entries** (11 class I, 29 II, 174 III, 83 commemorations) + the 4 surviving vigils; regenerated into `data/corpus`. - **Seed retired** to `tests/Fixture/SeedSanctoralData` — now the controlled fixture the mechanics/precedence tests inject. - **`SanctoralDecemberReferenceTest`** — the spot-check: a hand-authored December reference confirmed against the corpus. ## Safety - **Two commits, isolated:** commit 1 swaps the source with the corpus holding *exactly* the seed's entries → the golden-year fixture (#365) is **byte-for-byte unchanged** (the plumbing swap is provably inert). Commit 2 grows the calendar and **re-freezes** the golden fixture — the only sanctioned way its output moves. - **Born-cited gate:** every Latin title cites the Missale Romanum (public-domain text); every fact cites the 1960 rubrics — the generator fails closed otherwise. - **Seed equivalence:** the 21 verified anchors are reproduced field-for-field by the reader (`CorpusSanctoralDataTest`). ## Authoring & accuracy Authored and cross-verified month by month, then reconciled: slug collisions and same-day/same-name re-slugs of seed anchors removed; St Irenaeus kept on his 1960 date (Jul 3); suppressed 1955/1960 feasts excluded; movable feasts of the Lord resolved temporally or deferred (noted in `KNOWN-LIMITATIONS`). Confidence: cross-verified first authoritative dataset — **multi-oracle re-proving is Epic #45**. ## Verification Local gate: PSR-12 clean, PHPStan `[OK]`, **597 tests / 31,538 assertions** green; corpus `npm run verify` reproducible over 6 files.
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!417
No description provided.