Office structure rows carry no source citation, though the design says shape facts are cited #509

Open
opened 2026-08-05 19:58:36 +00:00 by manlycucumber · 0 comments

Problem

The LOBVM office structure ships uncited. data/corpus/editions/roman-rubricae-1960/offices/little-office-bvm/structure.ndjson has 88 rows and not one directorium:source: reference; rows look like:

{"hour":"matins","office":"roman:votive:officium-parvum-bmv","seq":10,
 "textRef":"roman:votive:officium-parvum-bmv@matins/invitatory","type":"invitatory"}

office.json cites nothing either. Counting citations across the whole shipped corpus (excluding the sources.ndjson registry and MANIFEST.json, which list every key once by construction):

key datum citations
dr-challoner-1899 2,606
clementina-1592 2,603
lobvm-benziger-1915 114
catholic-encyclopedia-1910 0
catholic-encyclopedia-1913 0
off-defunct-keating-1825 0

catholic-encyclopedia-1913 and off-defunct-keating-1825 being unused is expected — the Office of the Dead is unseeded. catholic-encyclopedia-1910 at zero is not: it was registered specifically to carry the LOBVM's shape facts, and the LOBVM shipped.

Why this is a real gap and not a misreading

office-text-layer.md §2.5 is explicit that structure is cited:

every structure-shape fact here (which parts, in what order, present/absent per season) cites catholic-encyclopedia-1910

and the corpus registry row for the key repeats it — "Cited for office SHAPE FACTS ONLY — the order and presence of the hours and parts, and the seasonal forms — never for running text."

But the enforced gate doesn't require it. §7C replaced the auto-discovered "every string field must be cited" scan with an explicit transcribed-text field map covering only leaf value/incipit and part title.la/label.la; provenance.mjs:67 treats address keys and uncopyrightable facts as carrying no citation requirement. So structure rows pass cleanly while citing nothing, and the divergence is invisible to CI.

This is narrow but it is exactly the failure mode the clean-room is built to prevent — not a licensing risk (part order genuinely is an uncopyrightable fact, so nothing is leaking), but an auditability one. The whole discipline rests on "any value can be traced back to the printed book that establishes it" (SOURCES.md), and right now the shape of the office cannot be. A reviewer asking "what establishes that Matins has an invitatory at seq 10?" has nothing to follow.

It also matters more later than now: v1.3/v1.4 inherit this model for the Missal and Breviary, where structure is far larger and the shape facts are contested between editions.

Acceptance criteria

  • Decide the policy explicitly: either structure-shape facts are cited (design as written) or they are declared uncited uncopyrightable facts (implementation as built) — and make the losing document match
  • If cited: add the source reference to structure rows and extend the born-cited field map to enforce it, so it cannot silently regress
  • If not cited: correct §2.5 and the sources.yaml/sources.ndjson notes for both Catholic Encyclopedia keys, and record why registering a key no datum cites is still correct
  • Either way, a registered text key with zero citations is surfaced by the build's provenance report rather than sitting unnoticed

Notes

Found while reconciling SOURCES.md against the shipped corpus (e136972), which had claimed "No datum cites these yet" of all six v1.2 text sources — false for three of them and, as it turns out, still true for the other three.

No golden-digest impact either way if the decision is "leave uncited". Adding citations to structure rows would move the corpus and so needs a corpusVersion bump under the usual review.

## Problem The LOBVM office **structure** ships uncited. `data/corpus/editions/roman-rubricae-1960/offices/little-office-bvm/structure.ndjson` has 88 rows and **not one `directorium:source:` reference**; rows look like: ```json {"hour":"matins","office":"roman:votive:officium-parvum-bmv","seq":10, "textRef":"roman:votive:officium-parvum-bmv@matins/invitatory","type":"invitatory"} ``` `office.json` cites nothing either. Counting citations across the whole shipped corpus (excluding the `sources.ndjson` registry and `MANIFEST.json`, which list every key once by construction): | key | datum citations | |---|---| | `dr-challoner-1899` | 2,606 | | `clementina-1592` | 2,603 | | `lobvm-benziger-1915` | 114 | | `catholic-encyclopedia-1910` | **0** | | `catholic-encyclopedia-1913` | **0** | | `off-defunct-keating-1825` | **0** | `catholic-encyclopedia-1913` and `off-defunct-keating-1825` being unused is expected — the Office of the Dead is unseeded. **`catholic-encyclopedia-1910` at zero is not**: it was registered specifically to carry the LOBVM's shape facts, and the LOBVM shipped. ## Why this is a real gap and not a misreading `office-text-layer.md` §2.5 is explicit that structure is cited: > every **structure-shape fact** here (which parts, in what order, present/absent per season) cites `catholic-encyclopedia-1910` and the corpus registry row for the key repeats it — "Cited for office SHAPE FACTS ONLY — the order and presence of the hours and parts, and the seasonal forms — never for running text." But the enforced gate doesn't require it. §7C replaced the auto-discovered "every string field must be cited" scan with an **explicit transcribed-text field map** covering only leaf `value`/`incipit` and part `title.la`/`label.la`; `provenance.mjs:67` treats address keys and uncopyrightable facts as carrying no citation requirement. So structure rows pass cleanly while citing nothing, and the divergence is invisible to CI. This is narrow but it is exactly the failure mode the clean-room is built to prevent — **not** a licensing risk (part order genuinely is an uncopyrightable fact, so nothing is leaking), but an **auditability** one. The whole discipline rests on "any value can be traced back to the printed book that establishes it" (`SOURCES.md`), and right now the shape of the office cannot be. A reviewer asking "what establishes that Matins has an invitatory at seq 10?" has nothing to follow. It also matters more later than now: v1.3/v1.4 inherit this model for the Missal and Breviary, where structure is far larger and the shape facts are contested between editions. ## Acceptance criteria - [ ] Decide the policy explicitly: either structure-shape facts are cited (design as written) or they are declared uncited uncopyrightable facts (implementation as built) — and make the losing document match - [ ] If cited: add the source reference to structure rows and extend the born-cited field map to enforce it, so it cannot silently regress - [ ] If not cited: correct §2.5 and the `sources.yaml`/`sources.ndjson` notes for both Catholic Encyclopedia keys, and record why registering a key no datum cites is still correct - [ ] Either way, a registered `text` key with zero citations is surfaced by the build's provenance report rather than sitting unnoticed ## Notes Found while reconciling `SOURCES.md` against the shipped corpus (`e136972`), which had claimed "No datum cites these yet" of all six v1.2 text sources — false for three of them and, as it turns out, still true for the other three. No golden-digest impact either way if the decision is "leave uncited". Adding citations to structure rows would move the corpus and so needs a `corpusVersion` bump under the usual review.
manlycucumber added this to the v1.2.0 milestone 2026-08-05 19:58:36 +00:00
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#509
No description provided.