feat(office): add the per-office proper-text store and resolve proper parts (Stage 4a) #503

Merged
manlycucumber merged 1 commit from feat/stage4a-proper-text-store into develop 2026-07-19 05:45:38 +00:00

Stage 4a — the source-free half of the LOBVM pilot (Stage 4 splits 4a/4b like Stage 2s 2a/2b). A zero-axis-movement change: no office is seeded, so the golden digest, corpusVersion, corpusContentDigest and engineVersion are all unmoved (both freezes zero-diff).

Lands the per-office proper-text store Stage 3 deferred:

  • office-proper-text.schema.json — the compiled row (frozen leaf + (textRef, locale) address).
  • Corpus::officeProperText() — edition-scoped reader (guarded like officeStructure; API surface re-frozen additively).
  • CorpusOfficeTextProvider::proper() — resolves a parts textRef against the store; a proper leaf may withhold, so rows are read through TextLeafs constructors (full → body, degraded → withheld, never a leak); duplicate (textRef, locale) or no-Latin fails closed.
  • The office fixture is now a self-contained mini-corpus, assembled end-to-end.

4b (the digest-mover) is source-gated on the Benziger-1915 proper bodies + br-1961 (Open-Q #12) and is not part of this PR.

Validation: workspace composer check green (phpcs + phpstan + 1243 phpunit/1 skip); both freezes zero-diff; generator npm test/build/verify green.

Stage 4a — the source-free half of the LOBVM pilot (Stage 4 splits 4a/4b like Stage 2s 2a/2b). A **zero-axis-movement** change: no office is seeded, so the golden digest, corpusVersion, corpusContentDigest and engineVersion are all unmoved (both freezes zero-diff). Lands the per-office **proper-text store** Stage 3 deferred: - `office-proper-text.schema.json` — the compiled row (frozen leaf + `(textRef, locale)` address). - `Corpus::officeProperText()` — edition-scoped reader (guarded like `officeStructure`; API surface re-frozen additively). - `CorpusOfficeTextProvider::proper()` — resolves a parts `textRef` against the store; a proper leaf may withhold, so rows are read through `TextLeaf`s constructors (full → body, degraded → withheld, never a leak); duplicate `(textRef, locale)` or no-Latin fails closed. - The office fixture is now a self-contained mini-corpus, assembled end-to-end. **4b (the digest-mover) is source-gated** on the Benziger-1915 proper bodies + `br-1961` (Open-Q #12) and is not part of this PR. Validation: workspace `composer check` green (phpcs + phpstan + 1243 phpunit/1 skip); both freezes zero-diff; generator npm test/build/verify green.
feat(office): add the per-office proper-text store and resolve proper parts (Stage 4a)
All checks were successful
ci / check (7.4) (pull_request) Successful in 1m6s
ci / check (8.1) (pull_request) Successful in 1m1s
ci / check (8.2) (pull_request) Successful in 1m3s
ci / check (8.3) (pull_request) Successful in 1m3s
ci / validate (1954) (pull_request) Successful in 32s
ci / validate (1955) (pull_request) Successful in 31s
ci / validate (1962) (pull_request) Successful in 31s
ci / validate (novus-ordo-2002) (pull_request) Successful in 32s
ci / validate (overlays) (pull_request) Successful in 31s
ci / corpus-verify (pull_request) Successful in 12s
CodeQL / Analyze (actions) (pull_request) Has been skipped
pr-title / lint (pull_request) Successful in 1s
project-status-rollup / rollup (pull_request) Has been skipped
43646241e5
Stage 4 splits into 4a (source-free store machinery) and 4b (the real
Little-Office seed), mirroring the Stage-2 2a/2b split. 4a is a
zero-axis-movement change: no office is seeded, so the day office key
stays null on every 1962 day and the golden digest, corpusVersion,
corpusContentDigest and engineVersion are all unmoved.

- office-proper-text.schema.json: the compiled proper-text store row --
  the frozen leaf (value|incipit / availability / source / rights) plus
  its (textRef, locale) address, mirroring text-leaf.schema.json.
- Corpus::officeProperText(): the edition-scoped reader for
  editions/<dir>/offices/<slug>/proper-text.ndjson, guarded like
  officeStructure; public API surface re-frozen additively.
- CorpusOfficeTextProvider::proper(): resolves a part's textRef against
  the store into a per-locale leaf map. A proper leaf may withhold, so
  each row is read through TextLeaf's constructors -- a full row yields a
  body, any degraded row a withheld leaf; a duplicate (textRef, locale)
  or a reference with no Latin fails closed.
- The office fixture is now a self-contained mini-corpus: it assembles
  proper text from the store and a psalm from the psalter stream.

The generator ingestion of the real Benziger propers and the born-cited
gate over its bodies land with the seed (4b), where the facts-YAML
co-designs with the data.
manlycucumber force-pushed feat/stage4a-proper-text-store from 43646241e5
All checks were successful
ci / check (7.4) (pull_request) Successful in 1m6s
ci / check (8.1) (pull_request) Successful in 1m1s
ci / check (8.2) (pull_request) Successful in 1m3s
ci / check (8.3) (pull_request) Successful in 1m3s
ci / validate (1954) (pull_request) Successful in 32s
ci / validate (1955) (pull_request) Successful in 31s
ci / validate (1962) (pull_request) Successful in 31s
ci / validate (novus-ordo-2002) (pull_request) Successful in 32s
ci / validate (overlays) (pull_request) Successful in 31s
ci / corpus-verify (pull_request) Successful in 12s
CodeQL / Analyze (actions) (pull_request) Has been skipped
pr-title / lint (pull_request) Successful in 1s
project-status-rollup / rollup (pull_request) Has been skipped
to 70f3133860
All checks were successful
ci / validate (1955) (pull_request) Successful in 32s
ci / validate (overlays) (pull_request) Successful in 32s
ci / corpus-verify (pull_request) Successful in 12s
CodeQL / Analyze (actions) (pull_request) Has been skipped
ci / check (7.4) (pull_request) Successful in 1m10s
ci / check (8.1) (pull_request) Successful in 1m1s
ci / check (8.2) (pull_request) Successful in 1m1s
ci / check (8.3) (pull_request) Successful in 1m3s
ci / validate (1954) (pull_request) Successful in 32s
ci / validate (1962) (pull_request) Successful in 32s
ci / validate (novus-ordo-2002) (pull_request) Successful in 32s
pr-title / lint (pull_request) Successful in 1s
project-status-rollup / rollup (pull_request) Has been skipped
2026-07-19 05:37:33 +00:00
Compare
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!503
No description provided.