feat: regression safety for multi-system support (#72) #457
No reviewers
Labels
No labels
area: build
area: ci
area: compare
area: data
area: engine
area: model
area: provenance
area: rite
area: validation
backport
blocked
breaking
confirmed
dependencies
duplicate
epic
github_actions
invalid
needs-info
needs-triage
php
priority: high
priority: low
priority: medium
regression
type: bug
type: chore
type: correction
type: docs
type: enhancement
type: feature
type: fix
type: perf
type: refactor
type: security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Directorium/Core!457
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/72-multi-system-regression-safety"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes Epic #72 (regression safety for multi-system support) and its children #73, #74, plus #332 (per-edition precedence & commemoration limits, under #59) — the Core v0.3 wrap that lets new editions land without regressing 1962.
#332 — per-edition commemoration limit in the contract
The contract's top-level
commemorationLimitwas a hardcoded 1960 static (I/II 1, III/IV 2) — correct for 1962, but wrong for 1954 (three per class) and 1955 (0/1/2 by class, a first-class day admitting none). It is now the per-edition class cap:PrecedenceRules::commemorationClassLimit()— the unguarded, class-level cap — distinct from the day-specificcommemorationLimit()(which still returns 0 on the Triduum, privileged octaves, and first-class vigils, and still drives the selector + resolution trace).LiturgicalDay;DayContractreads it.Calendar\CommemorationLimitstatic (and its test) are removed — the per-edition data is now the single source of truth.PrecedenceTableTestpins all three editions' limits.#74 — active rubric-system stamp
The top-level
editionfield already carries the active system's URN (viaDayResolver::forEdition), defaults toroman:rubricae-1960, and is backward-compatible — so no new field is added (a twin would be redundant and force a golden re-freeze). It is documented as the active-system stamp inoutput-contract.mdand locked withMultiSystemContractTest, which resolves one first-class feast (the Assumption) under 1962/1954/1955 and asserts the edition stamp and the1 / 3 / 0caps side by side, the safe 1962 default, and the public boundary's refusal of an unbuilt edition.#73 — per-system CI oracle matrix
Oracle tests are tagged
@group edition-1962 / edition-1954 / edition-1955(the historical DO oracle split per edition; cross-edition witnesses carry both groups). ThevalidateCI job is now a matrix over system withfail-fast: false, each leg an independent gate, so a regression in one edition fails only its leg and never masks another.Verification
phpcsclean · PHPStan[OK]· 836 tests green (1 skipped: the live Divinum Officium maintainer oracle) · 1962 golden byte-identical · eachedition-<system>oracle group green.data/ortools/generator/changes.Calendar\CommemorationLimitreferences in two design docs) and fixed; 2 refuted.Maintainer note
The
main protectionruleset currently requires a status check namedvalidate; this renames it tovalidate (1962)/validate (1954)/validate (1955). The ruleset's required-check contexts are realigned to match.