Rendered from docs/obligations/0123-a-facet-that-applies-to-one-value-of-another-facet-has-nowhere-to-say-so.md in the Headwater corpus. Every document on this half of the site is typed by the taxonomy the descriptor names: corpus.json.

A facet that applies to one value of another facet has nowhere to say so

Context

The measurement layer declared two kinds and five facets, and getting them declared met two rules of this language at once. The facet canons refuse a facet that no kind requires, no shelf discriminates on, no expectation reads and no projection filters on. headwater new refuses a kind that requires a facet with a closed value set that no engine role determines. So a facet is required or it is unread, and a value that an author chooses is neither.

Both refusals were measured on this repository rather than argued:

the resolved taxonomy `facets.probe_category`: facet canons: relevance: nothing reads it

headwater: `probe` requires the facet `probe_category`, and it declares a closed value set and it carries no role this engine derives a value for

The first is what the resolver says when probe_category is optional. The second is what the scaffolder says when it is required. headwater new --facet <facet>=<value> answers the second, so the four closed sets of the measurement layer are required and a person states each value.

Obligation

The first gap is closed and the second is not. oracle names the check that a patched expectation grades a produced patch against, and it applies to one value of expectation and to no other. The language cannot say that. So oracle is required of every probe, and four of the five expectation forms write none into it.

The corpus owes a way to state that a facet is required when another facet holds a named value. Two shapes are candidates. A required_when member on the facet, read by facet.required.missing, would put the condition where the facet is. The other shape is a kind for each expectation form. It costs five kinds that differ in one value. Spec 2 refuses that shape: two documents that differ only in a value are one kind with a facet.

Discharge

Nothing discharges this today, and the harness pays the cost meanwhile. headwater probe plan refuses a patched probe that declares the sentinel. It also refuses a probe of any other form that names a rule. Both directions are enforced. No check reads either pairing directly. What catches a wrongly paired probe is the projection gate, and only where a committed transcript reaches it.

Two recordings landed and were refused before a third one held, and this corpus now durably holds one. The 2026-09-09 and 2026-09-11 transcripts each reached the projection gate for a day or less. Then a later commit moved the lock they pinned. While no transcript reached the gate at all, a wrongly paired probe reached a commit and stopped nothing but a run. The transcript of 2026-09-16 is not refused, and it is not a one-day window. This corpus now holds a recorded run as its ongoing state, not as a measurement taken once. A probe_result projection is graded against the selection the plan composes. A plan the wrong pairing refuses composes none, so the projection writes no result. generate --check then reports the committed result as one this corpus does not derive, and CI runs that check on every pull request. So a wrongly paired probe added to this corpus now reaches a commit and stops a merge, not only a run. The gate is still the projection layer and never a check. It still reaches the pairing only through a corpus that holds a recorded run. But this corpus holds that condition today, rather than for one day in three. Since #1338 (PR #1448), a moved lock does not refuse a recording. It marks the verdicts and keeps them, so the 2026-09-09 and 2026-09-11 results carry verdicts again.

That is the measurement this record holds. The rule that would catch it at commit time cannot be declared, and the count is one facet of five in one repository. A second corpus with a conditional facet is what turns one instance into evidence that the shape is general.

What the grader added, which is a second instance and a third shape

The shape recurred inside this repository before any second corpus arrived. The answered expectation is satisfied by one value of a closed set that the probe declares, and nothing held that set. It applies to one value of expectation and to no other. That is this record's shape exactly, so the count is two conditional declarations of five forms rather than one.

The second one did not become a facet, and the reason names a shape this record does not carry. A closed set of answers is a list, and no facet of this language holds a list. It goes in a fenced block under the Expectation section, which the probe kind already requires. headwater probe plan enforces the pairing in both directions, as it does for the oracle. A required section carries a per-document declaration where a facet cannot. That is a third candidate beside required_when and the kind-per-form, and it is cheaper than either. It costs the four other forms nothing, and no sentinel is written anywhere.

It is not free, and the price is what keeps this record open. A facet is what a check reads, and a fenced block under a heading is read by the harness alone. So the pairing for answers is enforced in one place and by one component, exactly as the pairing for oracle is. Whether oracle should move to the same section is a question for whoever discharges this. The move would trade a sentinel on every probe for a declaration that no check can see.

A third instance, and a subject the taxonomy cannot name at all

The shape recurred a third time, and this one is harder than the two above. #809 asked for a facet that holds the shape of a derived artifact, closed to the rows of The shapes a record takes. No member of that population can carry one. Most members are generated documents, which carry no front matter at all. The rest are a lock, some site pages, some recorded fixtures and two append-only stores, and none of those is a document.

So the subject of the fact is a path that no shelf claims. Spec 2 states that facets declares what a document carries. The nearest root to a fact about a path is anchors, which declares a resolver and no facets. Spec 2 also rules that a new declaration root is a change to the meta-schema, so the cost of the alternative is real.

What #809 did instead was to compute the fact rather than declare it. headwater derived reads the shape from the structure of the artifact and from the rule of the producer that writes it. That works here because a shape is observable. It answers nothing for a fact that only an author knows, which is the gap the rest of this record holds open.

This does not discharge the record. It raises the count. Three conditional or path-scoped declarations now exist in one repository, and each one was answered by a different mechanism outside the facet layer.