feat: generator support for authoring a whole peer edition (#256) #479

Merged
manlycucumber merged 1 commit from feature/256-no-generator into develop 2026-07-11 02:49:11 +00:00
manlycucumber commented 2026-07-11 02:45:21 +00:00 (Migrated from github.com)

Second slice of the Novus Ordo calendar engine (v1.1.0, epic #256). Teaches the corpus generator to author an edition as a whole, unioned peer (the signed-off architecture) rather than only as diff-blocks on the shared 1962 file — the enabling infrastructure for the NO's own sanctoral. No NO data is declared yet, so the code is dormant and the corpus is byte-identical.

What lands

  • transformSanctoraleWhole() — fans a flat facts/editions/<dir>/sanctorale.yaml into identity + attributes + placement. Identity is emitted only when an entry declares it (a NO-only observance → merged into the shared union); a saint shared with 1962 is referenced by id alone and reuses the union's identity. Partial identity fails closed.
  • deriveNovusRank() + the novusRank schema field — the NO grade vocabulary (solemnity/feast/memorial/optional-memorial), numeric RankClass derived and cited to the same source, kept a separate bag from the pre-1960 legacyRank grades (mirrors the deriveLegacyRank contract).
  • build.mjs — loads the per-edition whole file, merges its identities into the union (dedup-or-throw, exactly like octave identities), and adds a placement-has-identity gate (every placed id must have an identity — the converse of the existing orphan gate).

Safety

  • 1962/1954/1955 corpus NDJSON byte-identical — the only committed data change is the additive novusRank schema field; verify confirms 32 files reproducible and matching.
  • Green: 45 Node tests (5 new for transformSanctoraleWhole), 1040 PHP tests (schema is opis-validated in PHP too).

Part of #256. Next: the NO temporal cycle (Ordinary Time) and the NovusOrdoPrecedence engine, which will exercise this whole-edition path with real NO data.

Second slice of the **Novus Ordo calendar engine** (v1.1.0, epic #256). Teaches the corpus generator to author an edition as a **whole, unioned peer** (the signed-off architecture) rather than only as diff-blocks on the shared 1962 file — the enabling infrastructure for the NO's own sanctoral. No NO data is declared yet, so the code is **dormant and the corpus is byte-identical**. ## What lands - **`transformSanctoraleWhole()`** — fans a flat `facts/editions/<dir>/sanctorale.yaml` into identity + attributes + placement. Identity is emitted **only** when an entry declares it (a NO-only observance → merged into the shared union); a saint shared with 1962 is **referenced by id alone** and reuses the union's identity. Partial identity fails closed. - **`deriveNovusRank()` + the `novusRank` schema field** — the NO grade vocabulary (`solemnity`/`feast`/`memorial`/`optional-memorial`), numeric `RankClass` derived and cited to the same source, kept a **separate bag** from the pre-1960 `legacyRank` grades (mirrors the `deriveLegacyRank` contract). - **`build.mjs`** — loads the per-edition whole file, merges its identities into the union (dedup-or-throw, exactly like octave identities), and adds a **placement-has-identity gate** (every placed id must have an identity — the converse of the existing orphan gate). ## Safety - **1962/1954/1955 corpus NDJSON byte-identical** — the only committed data change is the additive `novusRank` schema field; `verify` confirms 32 files reproducible and matching. - Green: **45 Node tests** (5 new for `transformSanctoraleWhole`), **1040 PHP tests** (schema is opis-validated in PHP too). Part of #256. Next: the NO temporal cycle (Ordinary Time) and the `NovusOrdoPrecedence` engine, which will exercise this whole-edition path with real NO data.
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!479
No description provided.