Reclassify season as an open, edition-scoped vocabulary #364

Closed
opened 2026-07-02 07:41:46 +00:00 by manlycucumber · 0 comments
manlycucumber commented 2026-07-02 07:41:46 +00:00 (Migrated from github.com)

Summary

Reclassify the output-contract season field from a closed 8-member enum (the 1962 tempora) to an open, edition-scoped vocabulary, before the contract is frozen at 1.0 (#90). After the freeze this becomes a major-version change by the contract's own rules, which would block 1962↔Novus-Ordo calendar comparison behind a v2 bump.

Design

  • Tokens stay bare and shared where the concept is shared (advent, lent, eastertide mean the same in every edition) so the diff engine still aligns seasons by token; the namespace is the edition field already on every payload.
  • Each edition declares its valid subset. The Novus Ordo adds ordinary-time; septuagesima/passiontide are simply absent from the NO subset. The 1962 subset is unchanged, so the current engine has zero behavioural churn.
  • Ship docs/design/season-vocabulary.md (the registry + per-edition subsets + the open-enum bump rule) in this issue.
  • Widen src/Temporal/Season.php from a fixed enum to a registry-backed value keyed by edition.

Acceptance criteria

  • season documented as an open enum in docs/design/output-contract.md (Closed-vs-open section + the day/office season rows).
  • docs/design/season-vocabulary.md committed with the shared-token rule and the 1962 subset.
  • Season accepts registry-backed values; 1962 golden contract fixtures unchanged (byte-identical).
  • Adding a vocabulary entry is documented as a minor contract bump.

Blocks #90 (contract 1.0 promotion). Must land before the freeze.

## Summary Reclassify the output-contract `season` field from a **closed 8-member enum** (the 1962 tempora) to an **open, edition-scoped vocabulary**, before the contract is frozen at 1.0 (#90). After the freeze this becomes a major-version change by the contract's own rules, which would block 1962↔Novus-Ordo calendar comparison behind a v2 bump. ## Design - Tokens stay **bare and shared where the concept is shared** (`advent`, `lent`, `eastertide` mean the same in every edition) so the diff engine still aligns seasons by token; the namespace is the `edition` field already on every payload. - Each edition declares its valid subset. The Novus Ordo adds `ordinary-time`; `septuagesima`/`passiontide` are simply absent from the NO subset. The 1962 subset is unchanged, so the current engine has **zero behavioural churn**. - Ship `docs/design/season-vocabulary.md` (the registry + per-edition subsets + the open-enum bump rule) in this issue. - Widen `src/Temporal/Season.php` from a fixed enum to a registry-backed value keyed by edition. ## Acceptance criteria - [ ] `season` documented as an open enum in `docs/design/output-contract.md` (Closed-vs-open section + the day/office `season` rows). - [ ] `docs/design/season-vocabulary.md` committed with the shared-token rule and the 1962 subset. - [ ] `Season` accepts registry-backed values; 1962 golden contract fixtures unchanged (byte-identical). - [ ] Adding a vocabulary entry is documented as a **minor** contract bump. **Blocks #90** (contract 1.0 promotion). Must land before the freeze.
Sign in to join this conversation.
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#364
No description provided.