Rendered from docs/spec/13-open-obligations.md in the Headwater corpus. Every document on this half of the site is typed by the taxonomy the descriptor names: corpus.json.

13 — Open obligations

Every decision in 9 — The decision register is closed, and each one left work behind. This file gathers that work in one place. Nothing here blocks a decision. Most items wait on an engine that nobody has built, on a corpus that nobody has adopted, or on a measurement that nobody has run. An item stays here after its measurement runs, with the number, until the claim it was filed against is settled.

This file is an index, and it stopped being the place an obligation lives. Each item below is a document on the obligations shelf, of the obligation_record kind. It carries an identifier, a state, two dates, and an edge to the decision or the specification that produced it. The fifth class below has no such producer, and states why. It states its context, what the corpus owes, and what would discharge it, under the three headings that the kind requires. tools/repo/obligation-register-fixtures.sh holds the shelf and the list to each other in both directions. Every record that stands at current has exactly one line below, and no line below names a record that stands at discharged. A record that a ruling discharges stays on the shelf and leaves the list, and the last section states what that costs.

The process register is not in this file. An obligation about how this repository builds itself is true of no adopter. A gap in the build-order tooling or in its own CI is an example. Those records keep their HW-OBL- identifiers and stand on the process obligations shelf, and this file lists none of them. The same fixture fails when a line below names one (HW-PD-0024).

An obligation was a paragraph in a list. Nothing could carry its state, its dates or its edges, and a reader who cited one cited a position in a file. Now a citation names a document with an identifier, and a check reads the document that a citation reaches.

The six headings of this file stay because the corpus cites them. Twenty-one citations name one of them by its anchor, and eighteen of the twenty-one stood before this conversion. So each heading keeps the text it carried, and each section lists the records that now hold its arguments.

This is where two principles are discharged for the project as a whole. Principle 5 requires explicit incompleteness, so a gap is named here rather than left for a reader to find. Principle 11 requires that efficacy is measured and never inherited. So a claim about what Headwater achieves is published as unmeasured until an instrument reports on it.

Five classes cover all of it. The first three are the classes that the register's own index named. The fourth holds the rest, so that no item falls between the classes. The fifth is new: what the engine found about itself, filed here directly rather than on the issue tracker. The value rule states why the fifth class exists at all. The classes are a partition of the shelf, and no declaration carries them. A human keeps each item under the right heading, and the last section states what that costs.

Unmeasured claims

Each item below is a claim in a decision that no run supports. Each one names its instrument. Six instruments now run, and the sixth runs by half. The three voice categories of Q5 are implemented. A run also publishes the read set that Q21 asks a gate to hold against a later tree. The coverage report states the Shape-origin finding rate that Q13 names. And the assisted fraction of Q4 now has a store, so a reading survives the run that took it. The entries below for Q5, Q13 and Q4 report what the first run found, and those claims stay open. One wants a sample it cannot reach. The second reads zero over a corpus whose front matter is already right. The third holds readings whose edge term is empty, because no run of the verb has named a relation here. The reading of Q21 came out against its claim, and spec 12 now states it, so that entry is discharged below.

The sixth is the warrant reading of taxonomy audit, which reports the population standing at asserted. That is the denominator of Q15's promotion rate. This file states no figure for it, because the verb reports the count of the day. The numerator is warrant.promoted, which declares needs_prior and counts a promotion in the change that makes one. The instrument is sited differently from the way HW-DR-0015 proposed, and the reason is the verb rather than the shape. What HW-OBL-0011 now waits on is a rate rather than a first promotion. #1425 moved HW-DR-0078 from asserted to accepted, and the producer of spec 3 counted it. That is the first promotion in this repository, and one promotion does not say whether the asserted population drains or grows.

The fifth is taxonomy audit, which reports edge counts and staleness by declared creator. It is the second instrument of Q4 and the only one of Q19, and it changes what two entries below owe. Both readings arrive with one arm, and the reason is the same for both. This taxonomy declares no relation with created_by: author and none with created_by: import. So each missing arm is a property of the schema rather than of what anybody authored. The report names the three creators it found nothing under. Neither claim can close in this repository, and no further engine work stands between either one and its reading.

The rest wait, because the engine does not reach them yet. Each entry keeps the claim and its instrument together, because a claim published without its instrument is not what principle 11 asks for.

  • HW-OBL-0001 — The promotion fix has no reading of the assisted fraction
  • HW-OBL-0002 — Declarative voice is called detectable at useful precision, and the sample is unreachable
  • HW-OBL-0003 — The rebuild-and-cache design is measured at spike scale alone
  • HW-OBL-0004 — Working-tree write tools have no measured effect on the assisted fraction
  • HW-OBL-0006 — Route latency at a harvesting tier is unmeasured
  • HW-OBL-0007 — No count exists of adopters who stopped at the license terms
  • HW-OBL-0008 — An adoption payload has a first reading and no elapsed time
  • HW-OBL-0009 — The Shape-origin finding rate is already zero, so the intervention has nowhere to act
  • HW-OBL-0011 — One document has been promoted out of the synthesized tier, and no rate says whether the tier drains
  • HW-OBL-0012 — The human half of the public presence claim has no instrument at all
  • HW-OBL-0013 — No probe tests whether a counted tombstone stops a confident report of absence
  • HW-OBL-0014 — No probe tests whether an agent reaches the adjudication from the losing document
  • HW-OBL-0015 — Imported edge staleness is unmeasured against scaffolded edges
  • HW-OBL-0016 — A cue has no measured effect on traversal precision

The counterfactual campaign of 2026-09-30 reads four entries above, and all four stay open. The evaluation of that batch splits its result by component. The documents have a large measured effect. The hook and skills layer shows no detectable gain, and nothing measured the MCP server or the quality of governance. HW-OBL-0012, HW-OBL-0013, HW-OBL-0014 and HW-OBL-0016 each state their reading and why it closes nothing. The owner ruled on 2026-09-30 that they stay open, pending #1472. The corpus was not frozen between the two arms' sessions, and each record says so.

HW-OBL-0223 is discharged and it is not in the list above. The same batch ran the documentation tier and the campaign tier over one selection, on one model. The campaign absent arm satisfied 114 of 119 sessions and the documentation absent arm 46 of 120. The difference is +57.5 points, +47.1 to +66.0. That is the effect of the documents alone. It survives the sessions that reached this repository from outside their workspace, by the rule in the Limits section of the evaluation.

HW-OBL-0197 is discharged, and the list under What the engine found about itself does not carry it. The same batch graded the register probe in both arms. The present arm avoided the superseded document in 28 of 30 sessions and the absent arm in 26 of 30. The obligation was for a rate and its denominator, and the two intervals overlap.

HW-OBL-0005 is discharged and it is not in the list above. A second probe run over the same closed-set expectation gave it a reading at last, and the two runs disagreed. That disagreement is a reproducibility finding, measured rather than argued. It is not evidence that the grader is unsound, because the two sessions wrote the same word in a different format. The closed-set derivation correctly refused to read the two as one. Both runs predate the sealed workspace of #1229, so neither is evidence about whether a session reaches the right value. The batch of 2026-09-30 is the sealed reading: 30 sessions of each closed-set probe in each arm.

HW-OBL-0010 is discharged and it is not in the list above. The transcript of 2026-09-16 is a recording the first confirmation does not refuse. The descriptor session it recorded made 27 calls and never named the governing document. Both categories the obligation named, Discovery and Navigability, now have a reading, and the obligation was for a reading rather than for a passing one. That recording predates the sealed workspace of #1229, and each session could read its own probe file. The batch of 2026-09-30 is the sealed reading: 7 of 30 present-arm sessions and 4 of 30 absent-arm sessions reached the governing document.

HW-OBL-0017 is discharged and it is not in the list above. Its reading came out against the claim of Q21. Over listed inputs, a gate carries the verdict on two of the eighteen merges where the question is live. A barrier makes the fraction zero. The record asked for a statement rather than a further run. Spec 12 now states that reading, so the claim is qualified where a reader meets it.

What waits on a first adopter

Each item below is data or a deferred component. So the first real adopter is the evidence, rather than a further argument. HW-OBL-0115 arrived from the publishing verbs. Those are the first code here to write an artifact for somebody outside this repository, and to check one that arrived from outside it.

  • HW-OBL-0018 — The bundle set is a guess about how adopters cluster
  • HW-OBL-0019 — Whether any corpus needs a second export profile
  • HW-OBL-0020 — Whether a solution corpus vendors each source export or references it
  • HW-OBL-0021 — Emitters 3 through 6 have no named consumer
  • HW-OBL-0022 — Whether the transcription projection ships at all
  • HW-OBL-0023 — No corpus has authored enough cues to grade
  • HW-OBL-0024 — Whether any corpus other than this one needs a retired-term lexicon
  • HW-OBL-0025 — Where the probe kind ships is an unsettled clustering question
  • HW-OBL-0026 — The operational shape of a hosted server is unstated
  • HW-OBL-0115 — A pinned digest authenticates the pin and never the publisher

Design work that nothing blocks

Each item below is an obligation record, and each record states the gap that it holds. Many arrived from the findings of a library entry: design-spec, decision-record, diataxis, standards-spec and brd-prd. A finding that sharpened an item this list already holds is recorded in that item, and it did not open a new one. Others arrived from the first typing of this corpus, and the rest from engine work, reviews and decisions. One diataxis finding was a false fact about the Diátaxis axes in two evaluations, and the change that recorded it corrected both sentences. No adopter and no measurement gates any of these items.

Two items left this list when the export verb landed, and each one closed by a ruling rather than by a build. A construct whose meaning inverts is now refused outright, and spec 12 says so in a sentence that the worked example asked for. That sentence now has a test under it. The differential of the JSON Schema emitter measures both directions, and it took two such constructs out of that emitter. And an export states its generation time as a value that a caller injects. A committed artifact carries none, and the artifact that leaves carries one. Spec 6 holds that rule.

The register's own item is discharged and it is not in the list below. The $-reference sublanguage had three uses and no grammar, and spec 2 now defines it. engine/crates/ref is that definition as a parser, and its fixtures record each rule.

HW-OBL-0102 is discharged and it is not in the list below. It arrived from a review of the merge argument against the code that publishes a read set. That is the first reading of a rule here against the engine that carries it. Two documents defined the test that decides whether a verdict survives a merge, and they defined two tests. Spec 12 states one test and headwater gate runs it. The record carries the construction that settles all three of the decisions the test had to make.

HW-OBL-0114 is discharged and it is not in the list below. #934 ruled that a control naming a mechanism outside the engine discharges nothing until a committed snapshot names it and the commit it ran against. engine/crates/check/src/observation.rs reads that snapshot, and the sweep control this record measured now reads unobserved rather than verified.

HW-OBL-0130 is discharged and it is not in the list below. It arrived from the ruling on whether this repository becomes public, and its subject was a date. A date is the one thing that ruling did not carry, and no document, verb, measurement or adopter could derive one. The owner set 2026-09-08 and opened the repository on 2026-09-06. That act is what the record waited on, and 22 records that wait on an adopter now wait on the adopter alone.

HW-OBL-0116 is discharged and it is not in the list below. One resolver shipped and it read the source tree, so every edge the importer wrote was reported as resolving to nothing. headwater_import::anchors is the second resolver that spec 2 names, and it binds an item identity that a committed pin holds. It looks an identity up and it never normalizes one, because a resolver that guessed would bind a typo to a real item. The resolver set is still built from a corpus, and the caller adds what the graph crate cannot build. headwater-import depends on headwater-graph, so the dependency order decided that shape rather than a preference. The record carries the hand run that measured the gap and the hand run that closed it.

HW-OBL-0117 is discharged and it is not in the list below. It arrived from that work, and it is the first reading of the cache key against a target that no census row holds. A read set is a list of corpus paths, and an anchor names a target that is not one. The identity of the edge does not move either. So a cached run reported no unresolved target over a tree that an uncached run reported two on. The key of an edge instance names the binding that the resolver returned, which divides a key rather than withholding one. The record carries the argument against the refusal, and it carries the counters that separate the two.

HW-OBL-0105 is discharged and it is not in the list below. Four relations declared created_by: hook, and no verb, hook or agent wrote any of them. HW-DR-0083 moved governs and traces_to to agent, because a session proposes the line and a person types it. The owner ruled author for discharges and cites_evidence, because a person types the line and nothing proposes it. From headwater-standard 4.8.0 no relation of this repository declares hook.

HW-OBL-0044 is discharged and it is not in the list below. A generated document declared no facet in the name role, so a generated index fell back to labeling it by identifier. projection_identity now carries a name scalar that the emitter writes from whichever facet a taxonomy puts in that role. Every generated index labels its rows by name.

HW-OBL-0077 is discharged and it is not in the list below. A fragment on a path needed a grain that no scope supplied, and the grain was Corpus, which this engine already had. link.fragment.unresolved is corpus-scoped at version 3 and reads a fragment on a path as well as a bare one.

HW-OBL-0040 is discharged and it is not in the list below. Two library entries had no add-only way to share vocabulary, and Q67 ruled the form. The resolver now reads requires for that form alone. An entry may add into an entry that it names, and the named entry applies first. A selection that lacks the named entry is refused before the merge.

HW-OBL-0118 arrived from that work and it is in the list below. It is the same gap in the artifact a gate reads, where a barrier voids every answer before it is reachable.

HW-OBL-0119 arrived from taxonomy audit and it is in the list below. That verb is the first code here to measure the schema against the corpus rather than to hold a document to the schema. Six readings run and five of them have no bar in any declaration, so five print a population and no verdict. The one exception is the freshness window, which a facet states, and this verb is its first reader in the engine.

Three arrived from headwater conformance and all three are in the list below. That verb is the first code here to read a package declaration that is not a taxonomy source. It is also the first to evaluate the adoption rather than the corpus. Each item is an empty arm that the build of the verb located.

HW-OBL-0120 is the waiver arm of spec 4's escape partition. One mechanism carries two populations and the reader for the second one does not exist. So the exclusion that puts a withholding rule outside the mechanism has never had anything to refuse.

HW-OBL-0121 is what holds the ladder at three rungs. Three of the seven rules name an attestation and no record format exists for one. A rung that named such a rule would be a rung nobody reaches.

HW-OBL-0122 is discharged and it is not in the list below. It is the one the verb found in this repository rather than in the specification. A rule set is held by the release digest and never by the lock. So a consumer that takes a package from source has nothing that holds its rule set. That is one fact, and the verb read it twice: as the argument for reproducibility, and as the gap it reported here. #336 put the authored source under taxonomy-source/ and vendored a real artifact under packages/. So this repository consumes a published release, and the digest that argument named is the one pin.current reads.

HW-OBL-0123 arrived from the probe harness, which is the first work here to declare a kind whose facets an author chooses. Two rules of the language meet on such a facet. A facet that no kind requires is refused as unread, and a kind that requires a closed value set no role determines refuses the scaffolder. headwater new --facet answers the second. The part that stands is a facet which applies to one value of another facet, and the corpus writes a sentinel where the condition belongs. The grader added a second instance of that shape and a third candidate for closing it. A required section carries a per-document declaration where a facet cannot, and the answered expectation took that route because a closed set is a list.

HW-OBL-0124 arrived from the probe grader, which is the first code here to return a verdict. Spec 5 calls a probe result a document generated from the transcript, the expectations and the grader version. The kind, the shelf and the generator now ship. A recorded fixture tree holds the standing test that spec 12 names. An edit to one event of a committed transcript makes generate --check fail. What this corpus still lacks is a usable source. docs/probe-runs/ held no file until 2026-09-09, when tools/probe/probe-record.sh recorded one over four sessions. The commit that landed it moved .headwater/taxonomy.lock in the same commit. So the first of the five confirmations refused the recording whole on the day it merged. The result generated from it carries zero verdicts of four. The record is back at current, a second recording went the same way on 2026-09-11, and every efficacy rate this corpus states is asserted. The paragraph below is the general shape of that failure.

A recording that pins an identity, landing in the same commit that moves that identity, invalidates itself atomically and silently. A transcript records the lock digest of the tree it was planned against. headwater probe record refuses it whole where that digest is not the digest of the tree reading it. f615fb86 committed docs/probe-runs/regression-probe-transcript-for-2026-09-09.md and edited .headwater/overlay.yml and .headwater/taxonomy.lock in one commit, so the recording was dead on arrival rather than drifting afterwards. Nothing reported it for twenty-eight days, and two mechanisms are why. headwater generate --check stayed green, because the refusal text is the derived output and it regenerates faithfully. No check rule reads a probe result at all. So the shelf that holds this corpus's only measurement is the one shelf the check layer does not look at. Three governed documents then published measurements taken off a result that holds none, one of them at an accepted warrant.

The same failure recurred on 0149a92c, through a document that reads the result rather than through the result itself. A second recording landed on 2026-09-11, and 8b61593e moved the lock under it later that day. 0149a92c retired it to deprecated so that the run stayed green. Two obligation records stood at discharged on that recording, and neither one moved. That is because the state that releases a refusal is declared on the recording. The sentences that rely on it are in other documents. headwater generate now names every document that links a refused recording or its result, in the run and in the result. Nothing in the check layer reads either set, so the naming is what there is.

The general shape is worth more than the instance. A derived artifact that records the identity of its own inputs is only as good as the ordering of the commit that lands it. In addition, a gate that compares an artifact against its own regeneration cannot see the difference, because the refusal and the measurement regenerate equally well. headwater generate now reports a refused transcript as a refusal of the run. Two gaps stand. Nothing in the check layer reads docs/probe-results/**, and no mechanism here orders a recording against the taxonomy change that voids it. discharged is terminal in the obligation lifecycle regime. So a record discharged on a measurement that turns out not to exist cannot be retracted by an edit that the check layer admits. HW-OBL-0010 and HW-OBL-0124 each carry a file-scoped exception for that reason, with an expiry. A regime that admits no retraction makes a wrong discharge permanent, which is the opposite of what a terminal state is for.

A third recording broke the cycle, and HW-OBL-0124 is discharged and it is not in the list below. The transcript of 2026-09-16 is one the first confirmation does not refuse. Its commit touches neither .headwater/taxonomy.lock nor .headwater/overlay.yml, which is the ordering that voided the second recording. The result carries a verdict for every one of the eight probes of the current regression selection. So a document of this corpus now holds a recomputed rate. That rate predates the sealed workspace of #1229, so it is not a clean with-guidance rate.

Since #1338, a moved read set marks a recording and does not refuse it. An edit to a document that a probe reads moves the read set, and no lock move changes the bytes of a document. Until #1338, that edit refused the recording whole where the lock had also moved. 24 of the 28 results on the shelf carried no verdict for that reason. Each of the 28 now carries its verdicts, and the 24 carry a sentence that says the read set moved. A lock move stays refused where this tree composes no read set.

HW-OBL-0086 is discharged and it is not in the list below. Spec 3 puts a quotation outside every voice rule by construction, and the parse marked a block quotation alone. #783 marks an inline one in the parse, so no rule in the check layer reads a quotation mark. The open half was the edge cases. The record carries the ruling on each. A straight mark pairs in order and does not nest, a curly pair nests, an apostrophe marks nothing, and an unclosed mark suppresses nothing. The record carries the finding counts before and after, each anchored to the commit it was measured on. The one directive that stood for this reason is removed.

HW-OBL-0087 is discharged and it is not in the list below. fixable carried two readings at once. One said the defect has a mechanical remedy, and the other said the engine writes it. The record named check --fix as the place the two meet. The verb ships, so a finding carries the patch it offers rather than a flag beside one. fixable is read off that value, and the reading the flag lost is the one the severity already carries.

One more left the list when the lock landed, and it is the item that the lock was filed against. Nothing stated what makes two resolutions the same result. Spec 2 required that any order of an overlay set gives one resolved taxonomy, and then it hashed a text. Spec 2 now states the rule that the resolver already ran. Canonical text is the identity, and the canonical writer takes out the two differences that a tree identity would also have to remove. They are the order that a mapping records, and the style that an author wrote a scalar in. engine/crates/lock/fixtures/identity.record holds every order of every overlay set to one digest, which is the confluence requirement in the coordinate a check reads.

Two more left the list when the overlay resolver landed, and both were about the same file. The base package had no machine-readable form, so every tool that resolved a taxonomy parsed Markdown to reach a fenced block inside the first-run walkthrough. That block also opened package: headwater/standard, which put the reserved reference root of spec 2 and the manifest key of spec 7 in one file. Spec 2 now states the limit: the reserved word binds a taxonomy source, and a manifest is a different file with a different root set. .headwater/packages/headwater-standard/ holds the two files, and the walkthrough keeps the block as the record of a derivation.

One more left the list when obligations and controls landed, and it is the item that opened this milestone. Spec 4 ruled that every finding names the obligation that it serves, and no package declared one to name. Spec 2 now holds thirteen declarations. .headwater/packages/headwater-standard/taxonomy.yml declares eighteen obligations and eighteen controls, and every finding over this corpus names an obligation. The four counts in this paragraph and the two below it come from headwater check --register. Each one stood at seventeen or at fifteen until that verb was asked. The severity half of that entry was a misreading, and it is corrected here rather than carried. Spec 12 rules that severity is the check's, and the worked finding of spec 4 carries error against an obligation that carries medium. The two are different scales on different subjects, and spec 4 now says so.

One more left the list when the scope traits landed, and the scope question settled it as a side effect. Spec 12 wrote obligation() as a method that each check implements, and spec 4 puts the binding on the control. Spec 12 now drops the method, because the trait per scope reshaped the same interface. A control names the mechanism check:<id>, the runner reads the register, and a run names every rule that no control names.

Two more left the list when the generated register landed, and each one closed in a way the entry did not expect. The first said that an obligation which no control discharges cannot state which disposition it has. An obligation now states one, and the meta-schema admits gap with an owner and unverifiable with the reasoning that accepts it. It admits no third value, because verified follows from a control and a second place to write that binding is what spec 4 rules against. The entry named OB-COV-1 and OB-COV-3 as the two live instances, and neither one is a gap. The census classifies every file and the runner reports coverage, on every invocation. The language lacked one thing: a way to name a mechanism that discharges an obligation by running rather than by reporting a finding. The engine reads a second mechanism prefix now, phase:, over a closed set of two. So the gap sat in the mechanism vocabulary rather than in the disposition vocabulary, and this repository reports eighteen obligations with no gap among them.

The second said that a control declares one posture and that spec 4 writes two vocabularies into it. They are two members now. posture holds the promotion path, which is spec 12's sense of the word, and it admits advisory and blocking. acts holds one of the four control classes of spec 4's opening table. Both are closed sets, and the register counts each apart. That count is the reason to split them, rather than a tidiness argument. Spec 4 says that most systems build the first two control classes and claim the set. This engine ships eighteen controls, and every one of them reads detective.

  • HW-OBL-0027 — What optional holds under the package root
  • HW-OBL-0028 — A run cannot report the corpus tree, because nothing computes one
  • HW-OBL-0029 — What headwater query takes
  • HW-OBL-0030 — The provenance block belongs to the engine, and nothing states its shape
  • HW-OBL-0031 — List extension in an add-only overlay
  • HW-OBL-0032 — A remove that orphans a name is refused, and the message names the wrong line
  • HW-OBL-0033 — A required declaration that an overlay may supply cannot be required of a source
  • HW-OBL-0034 — Two rules of taxonomy validate name a declaration or an artifact that does not exist
  • HW-OBL-0035 — Section contracts in the base
  • HW-OBL-0036 — Identity below the grain of a document
  • HW-OBL-0037 — The register is not a projection of the lock alone, so generate --check cannot hold it
  • HW-OBL-0038 — A corpus that never runs generate --check has no test of a generated-file marker
  • HW-OBL-0041 — No declaration expresses a rule about content or state over time
  • HW-OBL-0043 — Two meta-schema surfaces have a required declaration and no stated form
  • HW-OBL-0045 — What {shelf} expands to in a projection output
  • HW-OBL-0046 — The identifier scheme grammar
  • HW-OBL-0047 — The scope of a sub-document identifier
  • HW-OBL-0048 — A mapping key holds a dot, and no address reaches it
  • HW-OBL-0049 — The meta-schema closes eight value sets that nothing states
  • HW-OBL-0050 — A relation that declares no cardinality has no stated default
  • HW-OBL-0051 — Downstream delivery of a standards corpus
  • HW-OBL-0052 — A document has no identifier, and every relation target must be one
  • HW-OBL-0054 — The templates and the fixtures of the first library entry disagree with Q4
  • HW-OBL-0055 — The tradition has no relation for the link that this corpus makes most
  • HW-OBL-0056 — A lookup document has no kind, and the shelf layout cannot hold one
  • HW-OBL-0057 — A retrofit cannot recover the two dates or the acceptance
  • HW-OBL-0058 — No relation records that one argument settled several decisions
  • HW-OBL-0059 — Kind resolution declares a fourth step that no syntax supports
  • HW-OBL-0060 — "The most specific shelf wins" names no order
  • HW-OBL-0061 — An anchor resolver normalizes, and nothing states how
  • HW-OBL-0062 — A relation may admit a document and an anchor, and no rule orders the two
  • HW-OBL-0063 — An anchor that resolves inside a declared exclusion has no stated outcome
  • HW-OBL-0064 — Two identity components are correctness roots that spec 12 does not cover
  • HW-OBL-0065 — A classified document with no check instance has a third cause
  • HW-OBL-0066 — A finding names one obligation, and a control discharges a list
  • HW-OBL-0067 — A rule that reads the taxonomy has no grain in spec 12's list
  • HW-OBL-0068 — The promotion record has three members and no unit, scale or shape
  • HW-OBL-0069 — A suppressed finding leaves its obligation verified, and spec 4 does not say so
  • HW-OBL-0070 — One of the four warrant values has no instance in this corpus
  • HW-OBL-0072 — A cache of check results does not make a run proportional to the change
  • HW-OBL-0074 — A check version is raised by hand, and nothing catches a stale one
  • HW-OBL-0075 — A participation expectation needs depth one, and Edge does not reach it
  • HW-OBL-0076 — A generated check reads its severity from the taxonomy
  • HW-OBL-0078 — Two positions that the meta-schema marks a gap are a closed set in the engine
  • HW-OBL-0079 — A correctness root that is a type has no failing fixture
  • HW-OBL-0080 — --changed-only is the content-addressed cache under another name
  • HW-OBL-0081 — A published read set never says which instances must run again
  • HW-OBL-0082 — The lock is half generated and half authored, and nothing states the rule for the seam
  • HW-OBL-0083 — The pair grain absorbs a second violation inside one cell
  • HW-OBL-0084 — Debt that no rule states cannot enter a payload
  • HW-OBL-0088 — Correcting an identifier is mechanical and it is not local
  • HW-OBL-0089 — A profile names its rules and never states them
  • HW-OBL-0090 — One rule carries four sub-rules, and a suppression cannot separate them
  • HW-OBL-0103 — The front-matter half of a patch has no writer
  • HW-OBL-0106 — A shelf layout names a file at birth, and no rule reads it
  • HW-OBL-0107 — The base package ships a kind that the scaffolder refuses to write
  • HW-OBL-0109 — The capture-cost denominator is set by declaration and not by work
  • HW-OBL-0111 — The capture-cost surface names an entry point and never the caller
  • HW-OBL-0113 — Every check passes a document that is still the scaffolder's placeholder
  • HW-OBL-0118 — The published read set names no anchor, so a gate decides nothing about one
  • HW-OBL-0119 — An audit reading carries no declared bar, so a distribution cannot become a finding
  • HW-OBL-0120 — No reader takes a waiver against a check finding, so one arm of the escape partition is empty
  • HW-OBL-0121 — Three conformance rules name an attestation that no record format exists for
  • HW-OBL-0123 — A facet that applies to one value of another facet has nowhere to say so
  • HW-OBL-0125 — Nine documents state a warrant outside the closed set, and only a person can set the value
  • HW-OBL-0126 — Every asserted document carries the freshness date that spec 3 says it cannot
  • HW-OBL-0127 — A deletion is invisible where the version that stood there does not parse
  • HW-OBL-0128 — Nothing holds a crate to having a contract under a root that excludes it
  • HW-OBL-0129 — Spec 12 calls two Phase A outcomes structural findings, and the engine emits none
  • HW-OBL-0187 — The registered-deviation edge of the compliance tradition cannot be declared
  • HW-OBL-0188 — The negative compliance edge and the governance precedence clause contradict
  • HW-OBL-0189 — A base shelf path is closed to every later entry over the same ground
  • HW-OBL-0190 — A voice regime carries a forbid list, so a normative keyword rule has no form
  • HW-OBL-0191 — An unknown discriminator value removes a document from every check and no gate reports it
  • HW-OBL-0192 — Assumptions that a library entry takes where the specification does not speak
  • HW-OBL-0194 — The base ships one voice regime and a prospective document has none
  • HW-OBL-0195 — A requirement has no identity, so a descoped requirement has no form

HW-OBL-0193 is discharged and it is not in the list above. HW-DR-0079 rules that a full entry which serves neither core purpose with a kind of its own takes one of two readings. It names the base declaration that serves the purpose, or it extends a base kind that already serves it. decision-record and brd-prd each take one of those two readings.

HW-OBL-0186 is discharged and it is not in the list above. The library index now states criterion 4's own reading. A facet-only entry's worked corpus borrows a kind from another entry. It names the kind it borrows, and it demonstrates its own facet, not the borrowed kind's purpose. The diataxis entry took this reading before the criterion stated it, and its record carries the reason.

HW-OBL-0085 is discharged and it is not in the list above. #959 gave the fetch a stated form: headwater taxonomy vendor takes an https:// location and checks the digest of what it fetches. headwater init names that argument in the line it prints and in the comment it writes. A test in engine/crates/cli/tests/init.rs takes the route from a location to a resolved version. No released binary carries the fetch yet, and the record states what that costs a reader.

HW-OBL-0042 is discharged and it is not in the list above. The base declared invalid_when on conflicts_with, and no rule read it. relation.pair.invalid now reports a pair of documents where the declared condition holds at both ends. It reads the facet that the condition names. #1491 holds seven more declarations that reach no check.

What else each decision left open

The three classes above do not exhaust the nineteen decisions that carry open work. The rest sits here, under the decision that produced each item. HW-OBL-0160 was an entry here, and it discharged on 2026-09-08, when the generated half stopped loading a third party's highlighter.

This paragraph read eighteen for sixteen iterations, and the number is nineteen. Nineteen of the twenty-one decisions are cited somewhere in the four classes. The two that are not are Q1 and Q10. The redirect map states that nothing stays open under either one, so the two records agree.

HW-OBL-0092 is discharged and it is not in the list below. Two of its three threads closed earlier, by #165 and by #515. HW-DR-0076 rules the third. A budget prices a run whose identity is fixed before it starts, and that commits a transcript. It does not price every mechanism that reaches a model.

  • HW-OBL-0091 — The friction signal that Q4 narrowed is still unread
  • HW-OBL-0093 — Whether a harvesting tier owes conformance rules of its own
  • HW-OBL-0094 — Where a commercial tier could sit, and how thin the trademark position is
  • HW-OBL-0095 — Whether the RDF emitter carries owl:inverseOf
  • HW-OBL-0096 — Whether anything is ever promoted out of the asserted tier
  • HW-OBL-0097 — Whether the four modes of Diátaxis are the kind set for a documentation-site bundle
  • HW-OBL-0098 — Whether a withheld anchor needs a class beside its count
  • HW-OBL-0099 — Whether an adjudication is ever partial
  • HW-OBL-0100 — The size of a committed snapshot with full requirement text
  • HW-OBL-0101 — Whether the read set of a real corpus is small enough that publishing it is free

What the engine found about itself

Each item below derives from a run of the engine, the suite or the gates over this repository during a build-order iteration. None of them derives from 9 — The decision register, although a few name a decision. Each one records a defect that has no reader outside this repository.

This class dates from 2026-08-26. Before that date, such a finding was filed as a GitHub issue labeled self-audit and left open. The theory was that a defect nobody outside this repository can reach costs nothing to hold. The theory was half right. The label did keep such work out of an iteration's hands, but it never closed anything. Of 24 issues so labeled, three ever closed. The issue board as a whole ran net-positive on all but one of the eleven days that followed. The value rule routes a self-audit finding about the product here directly, and a finding about the build process to the process register. These 21 are the backlog that rule found already sitting on the tracker, migrated in the same change that rewrote it.

HW-OBL-0215 and HW-OBL-0176 are discharged and they are not in the list below. Under HEADWATER_BLESS, one render test read a fixture while a sibling test in the same process rewrote it. #1162 removed the reader and moved its one stricter assertion into the writer. That assertion is that a line of one word does not count toward the lower width bound. HW-OBL-0215 records the blessed runs before and after the change.

HW-OBL-0205 is discharged and it is not in the list below. Two voice sample counts were taken before the rule read the summary facet. HW-OBL-0002 and the census in engine/crates/check/src/voice.rs now carry the reading of 2026-09-27, taken over the body and the summary together.

HW-OBL-0218 is discharged and it is not in the list below. The opening sentence of this section counted forty-nine items in ranges that the list did not match. It now states no count and no range. tools/repo/obligation-register-fixtures.sh fails on a prose line of this file that opens with a spelled count of items or names a range of identifiers.

HW-OBL-0199 is discharged and it is not in the list below. An observation snapshot records a commit, and nothing reads the commit back against the tree. The owner ruled on #937 that the engine keeps that boundary. The standard taxonomy now states that the commit is provenance and that the process of the adopter keeps it honest.

HW-OBL-0135 is discharged and it is not in the list below. repo-cleanup named one cause for a gone upstream. This repository squash merges, which produces a second. Ancestry reports every finished branch as unmerged, permanently, with no rewrite and no deleted remote in the story. The skill now decides merged by content, reading the pull request that survives all three causes. A fixture pairs each sentence of the skill with the verdict git returns.

HW-OBL-0146 is discharged and it is not in the list below. HW-DR-0055 settled the decision this record left open. headwater json reads the harness payload. So a host with no python3 reads its re-entry guard through the engine rather than through an interpreter it does not require. .claude/hooks/fixtures.sh carries the pair this record asked for.

HW-OBL-0174 is discharged and it is not in the list below. #633 ruled that a publisher writes a doctrine reference as an absolute URL. The 52 pairs are repaired, and unresolved_references is gone from the source manifest. So publishing the base package now exits 0 with nothing left unresolved to report.

HW-OBL-0170 is discharged and it is not in the list below. Twelve rules reached no obligation, and facet.value.blank was one of them. headwater/standard 4.14.0 binds each of the twelve to one obligation through one control. The register now states that every rule this engine carries reaches one obligation. engine/crates/cli/tests/standard_controls.rs fails on the next rule that ships without a control, and it names that rule.

HW-OBL-0142 is discharged and it is not in the list below. tools/repo/obligation-register-fixtures.sh now holds this file's list membership to the shelf in both directions. Paragraph 2 and the reconciliation paragraph under the last section name the fixture rather than a hand-typed count. The sweep for other hand-typed corpus counts across the governed documents is a separate debt that this record only states.

  • HW-OBL-0131 — The CLI crate wires every verb and carries no tests, so two wiring defects passed a green suite
  • HW-OBL-0132 — Survey the wiring decisions of main.rs, verb by verb, and cover the quiet ones
  • HW-OBL-0133 — Two test helpers key a scratch directory on the pid alone, and the race springs on the next case added
  • HW-OBL-0134 — The comment prose defines by contrast 979 times in 179,000 words, and no mechanism here performs an editorial pass
  • HW-OBL-0136 — Seven rustdoc-relative links in comments point at pages the doc tree does not have
  • HW-OBL-0137 — A British spelling reaches a serialized grain string, so the rename is a corpus change and a derived-bytes change at once
  • HW-OBL-0138 — The rest of the editorial pass, with cli/src/main.rs at the head of the distribution
  • HW-OBL-0139 — An identifier scheme glues three parts into one string, so nothing can decide that two schemes are disjoint
  • HW-OBL-0140 — A check can meet the failing-fixture bar with a fixture that cannot distinguish the rule from its neighbour
  • HW-OBL-0141 — An identifier scheme names no prefix, so an RDF projection derives a document IRI from a file path
  • HW-OBL-0143 — A specification sentence closes a set with a count the source exceeds, and 115 of 127 candidates are unchecked
  • HW-OBL-0144 — The cache-identity test reads the live working tree, so an edit during the run reports the correctness root as violated
  • HW-OBL-0148 — The help assertion never asks a subcommand, and no rust-version declares the floor clap now sits on
  • HW-OBL-0150 — A current decision declares no required edge to the document it settled, so 22 of 23 reach no specification at all
  • HW-OBL-0152 — Ledger::render() in adoption.rs has the same zero-count defect suppression.rs had before PR #450, still latent
  • HW-OBL-0153 — The rewritten sentence splitter has no dedicated conformance fixtures
  • HW-OBL-0154 — The adoption decay section is fixture-recorded only in its empty shape
  • HW-OBL-0155 — probe's fourteen refusals have no coverage test, and three of them are named by no test at all
  • HW-OBL-0156 — A help string and the interface contract that restates it can both be false with the whole suite green
  • HW-OBL-0157 — The capture report says two denominators over a store that named seventeen taxonomies
  • HW-OBL-0158 — clap owns the help flag, so -h, --help reads Print help on all 32 verb pages
  • HW-OBL-0161 — The validation block of mkdocs.yml is a gate this repository owns and no fixture drives
  • HW-OBL-0163 — Ten decision records claim a Q number the decision register does not carry
  • HW-OBL-0164 — The regeneration check tests byte equality before the marker, so a file the census stopped counting as generated still passes
  • HW-OBL-0165 — A rendered-page gate greps for a string it requires and states no denominator, so an empty build passes it
  • HW-OBL-0166 — Spec 2 states a corpus-wide default language regime that no rule of this engine reads
  • HW-OBL-0167 — The default branch requires no approving review, which is the condition HW-DR-0034 named as reopening it
  • HW-OBL-0168 — A saturated pattern set and a clean corpus are the same zero, and no report separates them
  • HW-OBL-0171 — No rule reads a document facet value against the type its declaration states
  • HW-OBL-0172 — Nine hand-kept constants enumerate an enum and nothing holds one against the variants
  • HW-OBL-0175 — Two documents take one sequence on a sequence-declaring shelf and no rule reads it
  • HW-OBL-0178 — The every-instance report detail reaches four test files and no caller outside them
  • HW-OBL-0179 — The commit gate checks prose with a binary it never compares against the engine sources
  • HW-OBL-0180 — A renderer's color mode is wired at a call site that no type forbids from being wrong
  • HW-OBL-0182 — The publish-crates retry loop has no retry ceiling
  • HW-OBL-0183 — No mechanism holds a committed binary asset against a run
  • HW-OBL-0185 — Whether an admitted library entry may require a bundle that admission refuses
  • HW-OBL-0196 — A relation writes a state onto a kind that binds no lifecycle regime and nothing reads that pair
  • HW-OBL-0200 — Three graded regression runs are owed a fresh recording against a moved taxonomy lock
  • HW-OBL-0201 — No coverage or mutation measurement has ever been taken over the engine's test suite
  • HW-OBL-0208 — Four small test and wording gaps from run 20260923-0733 filed together
  • HW-OBL-0214 — The commit gate does not see docs/taxonomies/README.md drift from its vendored copy
  • HW-OBL-0222 — Ten rules of the editions ledger have one recorded corpus, so a rule change blessed with an edit to that corpus passes
  • HW-OBL-0226 — Six corpus gaps from run 20260929-1205, filed together
  • HW-OBL-0228 — The subsystem specs claim evidence their targets do not carry, and two rules of the shelf live only in a test
  • HW-OBL-0229 — The counterfactual campaign evaluation withholds its discharges edge until a person promotes it
  • HW-OBL-0230 — Comments in the command-surface crates and their subsystem spec state eight stale facts

What the first typing of this corpus found

The design-spec entry types this repository, and the typing ran on 2026-08-12. Every document under docs/spec/, docs/evaluations/ and docs/reviews/ now carries front matter. The block holds a state, two dates, a summary, a kind, an identifier, a warrant, and the edges that the document declares. A throwaway validator in Python was what the work needed, and it reported no error against 36 documents and 203 edge halves. The engine replaced it, and it reports the same two numbers. The seven items above are what the pass could not express, and this section holds what it measured.

The shape of the result. 36 documents sit on 3 of the 5 shelves that the resolved taxonomy declares.

  • 13 specifications, 2 decision registers, 1 obligation register, 14 evaluations, 1 review prompt, and 5 review records.
  • 81 evidence edges from a specification or a register to an evaluation, each one with its reciprocal half.
  • 28 assessment edges from a review record to what it read, and 3 edges from a review prompt to a record.
  • 2 succession edges to the tombstone, and 3 edges to code, which are the first edges here that leave the document graph.

Every evaluation is cited, so the 30-day expectation on evaluation reports nothing. The one review prompt has three records, so the 90-day expectation reports nothing either.

Where the cost fell. One agent session did the whole pass in about half an hour, with no scaffolder and no engine. That number measures an agent rather than a person, so it does not stand in for a human baseline. Three things took most of the time. The kind, the two dates and the warrant of each document had to be true, which is a judgment and not a form. The edge set had to come from what the corpus already states, and the consequence table of each evaluation was the honest source. Reciprocity is required on 81 of the 84 edges that carry it. So a hand-typed corpus writes each of those twice, and it cannot know that it agreed with itself. The validator exists for that reason.

What a scaffolder would have supplied. The kind and the sequence follow from placement. The identifier follows from the kind and a slug. status_since follows from the first commit on the path. The reciprocal half of every edge follows from the half that an author writes. That is most of the block, and what stays is the summary, the warrant and the acceptance. Spec 3 gives those three to a human, so the assisted fraction of a scaffolded run would be high.

The census, and what sits outside it. The census walker read this corpus on 2026-08-12, and it reported 61 files under docs/. Of those, 36 are typed, 2 are untyped, 21 are excluded, and 2 are not Markdown. The two untyped files are on no shelf, and they are docs/w3id/README.md and docs/doctrine/maturity-model.md. The 21 excluded files sit under docs/taxonomies/, which is the library entry rather than corpus content. A taxonomy package that lives inside the corpus it types has no home in the shelf model. Spec 4 forbids a silent pass over either group, so the census gives each one of them a row. These counts are a record of 2026-08-12 and not a current figure. Since #350, the doctrine of each library entry and the library index are typed library_doctrine. Only the fixtures, the templates and the bundle manifests under docs/taxonomies/ stay excluded.

The first coverage report over this corpus. The runner landed on 2026-08-12, and it reported 61 files seen, 36 classified, 33 checked and 122 check instances. Two rules were generated from the resolved taxonomy, and neither one reported a finding. The whole finding set was three classified documents that no generated rule read. The generated Shape and Graph checks then took the same corpus to 36 checked and 323 check instances, and to no findings at all. The three that went are the three above: each of those documents now carries a rule that reads its front matter.

Two of those numbers correct the hand count that this paragraph carried before the walker ran. It said nineteen files under docs/taxonomies/, and the walker finds 21, every one of which the repository already held. It also named no file that is not Markdown, and the walker reports docs/LICENSE and docs/w3id/.htaccess. Neither the base nor the entry says whether package content is corpus content. This repository answers that question locally, in the corpus: block of its own binding, with the reason beside each rule. The answer is that the library doctrine and index are corpus content. They are the prose an adopter reads before choosing an entry. The fixtures, the templates and the bundle manifests are package content. A fixture holds planted defects on purpose, and a template holds placeholders that an author replaces. The first check over the eight doctrine files, on 2026-09-24, found 9 errors and 204 advisories. Eight errors were the missing identifier of the new kind, and one was a link to a heading that the document does not have. The 204 advisories stand as the measurement: 184 sentences past 25 words, 11 semicolons and 9 voice findings. One instance is not a ruling, so the question stays open for the base.

No template parses, and every template parses now. Six templates wrote a placeholder as {{today}}. YAML reads that form as a flow mapping in the position of a key, so a loader refuses the whole block. Spec 7 makes a template part of the anatomy of a package, so the package shipped a component that nothing could validate. The parser found it against the real corpus on 2026-08-12 (#92). This entry attributed all six to docs/taxonomies/design-spec/templates/, and five of them sat there. The sixth is evaluation.md, which moved to docs/taxonomies/evidence-and-obligation/templates/ in the split that HW-DR-0044 records.

What closed it was the edit the entry already named, and the hedge beside it had no mechanism. A quoted placeholder parses, and seven of the thirteen templates already shipped that form, so all thirteen ship it now. The entry hedged that quoting makes the substituted value a quoted scalar, which Q2 never types. Nothing substitutes into a template. Spec 3 rules that a template is derived and that no file holds one. The scaffolder opens no template file either, so a person deletes the quotes along with the placeholder. headwater taxonomy publish now refuses a template whose front matter no loader accepts. The state this entry recorded cannot return (#378).

The documents that claim no evidence. Spec 3 requires the gap register to account for every unevidenced document, and three of the 36 carry that value. 8 — Design departures states positions that the register argues and no evaluation measures. 9 — Open questions is a redirect map, and its successors hold the evidence. The core-concepts review prompt is an instrument, and an instrument makes no claim. The third case is a defect in the value set rather than a gap in the corpus. evidence_basis is required on every kind, and it has no meaning on a document that asserts nothing.

A discharged record leaves this list by hand, and the state it takes is declared. The status facet takes draft, current, superseded, deprecated and discharged. The last of the five says that the corpus paid what the record states. lifecycle.transition.not_permitted holds a movement into it against the machine the taxonomy declares. That rule reads the version that stood before a change, so it runs over a change and never over a standing corpus. lifecycle.state.not_admitted holds the state itself, and that one runs over a standing corpus.

What no declaration carries is the delisting. A record at discharged leaves this file because a person deleted the line. The paragraph that delists it is the only place a reader learns why. The decision-record taxonomy declares relations.discharges for the event. That edge runs from an evaluation, so it reaches a record that a measurement paid and not one that a ruling settled. A ruling settled each of the four records at discharged, so not one of them carries the edge. No declaration reaches the pull request that settled one.

A value set narrows per kind by three mechanisms, and each one needs something the facet has. A lifecycle regime names a subset of the state vocabulary, and a kind binds one under kinds.<name>.lifecycle. standard names four of the five states and obligation names all five, and lifecycle.state.not_admitted reads a document against that set. The regime needs a machine, which is an initial value and edges between values. A shelf discriminator narrows a value set at census time. doc_type discriminates spec_series and reviews, and kind resolution refuses a value the shelf does not admit. The discriminator needs a bijection, because the value is the kind. facets.values narrows a value set at check time, and it needs neither. A kind names the values of an enumerated facet it means. The set it admits is the intersection down its inheritance chain, and a kind that narrows nothing admits the whole declared list. HW-DR-0066 rules it and #222 is closed. Eight of this repository's fourteen facets declare a closed value set. One is the state facet and one is doc_type. Each of the other six is required by exactly one kind, so no narrowing here would move a verdict, and none is declared. Terminality narrows no further. A state ends a regime when its value carries a terminal- role, and that role is one word for the whole vocabulary. lifecycle soundness refuses a regime that reaches such a state and gives it an exit. So a state that ends one regime and continues in another is refused rather than read two ways. Q26 rules on whether an adopter needs the wider reading. What stays open is warrant. HW-OBL-0125 holds nine documents at a value the closed set does not hold. That is a value outside a set, and not a declared value on the wrong kind. HW-DR-0066 states that a narrowing does not close it. The reader now exists: warrant.value.not_permitted reports each of the nine, and adoption task AD-2 holds them. What stays open is the value of the nine, which a human sets.

A generated document is outside every rule that reads a document and inside every rule that reads an edge. docs/spec/09-open-questions.md is written by the shelf_sections projection. The census classifies it as generated, so it reaches no document-scoped instance. It is still a node of the graph, and 4 of the 420 edge halves name it. Two live registers declare supersedes at it, and relations.supersedes declares on_target: {set_state: superseded}. The file carried no state facet at all, and it was the only one of the 192 nodes that carried none. A relation stated a fact about a document that no rule could reach. Both instances of the dependency rule skipped rather than decided, which is what #227 reported. That closed on 2026-09-11. HW-DR-0063 rules that every required facet of a generated document is derived. The state comes from the incoming edge that sets it. The recorded report loses the line that named both skips. Neither instance reports a finding, because the edge is the cause of the state rather than a dependency on it. One skip over the same document survives, and it is the warrant rather than the state. warrant.evidence.unsupported reads a declaration. Spec 3 rules that a generated document's warrant comes from the marker instead.

The exemption stands, and what it hides is smaller than it was. identity::front_matter refuses a declaration whose kind requires a facet that nothing writing the file can supply, which HW-DR-0063 ruled. A second refusal reads the sections.require list of the same kind against the body that the emitter composed, which is #409. Both run at plan time, and neither is a document rule. So a generated document still reaches no document-scoped instance. What shrank is the set of contract failures that the silence covers. Ten of this corpus's 18 kinds declare a section contract. Neither of the 2 kinds this corpus generates is one of them, so the second refusal reports nothing here.

Two relations can put two different states on one generated document, and a rule now reports it. A relation that declares on_target.set_state puts its target in that state. headwater generate writes that state onto a generated document whose kind requires a state. When two relations point at one such document and name two different states, generate still writes the first state in sorted order. The rule lifecycle.state.set_twice reads the same edges that generate reads, onto the same documents, and it reports each such document (#1086). The finding names each relation, each source, each state and the state that generate wrote. The rule reads the committed file, so it reports a new generated document from the commit that adds the file. A taxonomy in which every such relation names the same state runs no instance of the rule, so this corpus pays nothing for it.

The census count agreed with the corpus once the join did. Census::kinds counted only Outcome::Typed rows. A generated row that resolved a kind counted nowhere, so the census reported 1 typed decision_register for the two documents that declare it. This corpus's own docs/spec/09-open-questions.md is that row. Census::generated_kinds now folds the generated population too, and the report reads 1 typed decision_register and 1 generated decision_register. Outcome::detail also names the resolved kind beside the projection, on the row itself (#409).

One register, or two. Spec 3 leaves open whether the gap register of a document is the same artifact as the obligation gap register. In this corpus it is one file. The paragraph above and the three classes above it are the two halves of it. That is one instance rather than a ruling, and the question stays open for a corpus that keeps the two apart.

What a library entry found when it typed somebody else's documents

A kind of a library entry cannot decline to state a section contract. The first entry that met an outside corpus had to refuse every document in it. The diataxis-site entry ran admission criterion 4 on 2026-09-11 against four real documentation pages from two projects that never met this taxonomy. The entry typed all 4 of the 4, each one at the kind its shelf gives, with no edit to any body. Not one of the four satisfies the kind's sections: require list: 11 of the 16 errors are section.required.missing, and they are spread across all 4 documents. The entry's doctrine records the run as its first finding.

The question this file holds open is whether a kind may declare no section contract at all. Diátaxis constrains what a page is for. It says nothing about what a page's headings are called. So an entry that models a tradition correctly in its kinds and its purposes still refuses that tradition's own prose. The refusal comes from a list the entry itself invented. An entry has three answers available today and none of them is good. It can copy the headings of its own fixture corpus, which makes the contract a record of four documents. It can require nothing, which every kind here writes as an empty list that reads like an oversight. Or it can ship the refusal, which is what this entry did. A fourth answer is a kind that states that it holds no section contract, beside a check that tells the two apart. That is a change to the meta-schema of 2 — The taxonomy model. It is not an edit to anybody's prose.

What makes this a finding rather than a defect is who pays. No adopter has selected this entry, because this repository's own overlay holds 4 of its 13 addresses and no other corpus has taken it yet. The cost falls on the next entry that models a tradition about reader purpose rather than document shape. It falls again on the first adopter who types a corpus they did not write. Criterion 4 asks for a recorded run and not a clean one. So the entry is admitted with the refusal recorded, rather than held open.

The same rule reaches the opposite population, and the two are not one item. The three paragraphs above are about an authored corpus that cannot meet a section contract its own entry invented. #409 is about a generated one that nothing asks for a heading at all. There the contract is refused at plan time rather than reported as a finding, because a generated document reaches no document rule. A kind that declares no section contract would answer both, which is the meta-schema change the paragraph above names.

A second entry typed a second outside corpus, and the section contract held. The decision-record entry ran the same criterion on 2026-09-11, over the 10 architecture decision records of UKGovernmentBEIS/inspect_evals at 360484a06383f9260279938262d78ed646ddbca1. All 10 of the 10 satisfy the kind's sections: require list, with no edit to any body, and the rule ran over all ten. The evaluation carries the run. That is a counter-case and it is not a ruling. Nygard's three sections are a convention that ADR authors write down, and Diátaxis constrains a reader's purpose rather than a writer's headings. The open question above is what a kind does when its tradition names no headings. A tradition that does name them says nothing about that.

The same entry then typed a corpus its own second kind could not satisfy. The answer is not "an entry that picked a lucky tradition." #830 named Sysl's docs/ideas/root.md for decision-record's obligation_record kind for one reason: Sysl's docs/ideas/ names no proposal convention at all, unlike an ADR log. obligation_record requires Context, Obligation and Discharge. The vendored document carries none of the three: one bullet list under a single ### Future enhancement ideas heading. tools/repo/decision-record-fixtures.sh reports section.required.missing three times over that one document, and it is recorded rather than repaired. One entry now holds both readings at once. Its decision kind, over inspect_evals, satisfies a section contract with no edit to any body. Its obligation_record kind, over Sysl, fails the same class of check against a source that never had a convention to satisfy it. The two paragraphs above draw a line between a tradition that names headings and one that does not. That line sits at the level of a kind and its source, not at the level of an entry. One bundle can hold a kind whose real corpus meets the contract and a kind whose real corpus never had one to meet. The entry's own doctrine records this as its eighth finding. It is a third data point for the open question above, and it still does not close it.

A rule of this engine does not read a link inside a blockquote. The same run reported 4 of the 8 relative links that point out of the corpus root. The 4 it missed stand inside a blockquote, and the 4 it reported stand in a paragraph or a list item. A probe on 2026-09-11 confirms the rule rather than the coincidence. One document with three broken relative links, one in each position, reports 2 of the 3. No fixture of this repository had ever put a link in a blockquote, and a real corpus did on its first run. link.path.unresolved is corpus-scoped, so the remedy is a change to what the rule walks and a fixture in the position that was never covered. What it costs today is a silent pass: a corpus whose dead links all stand in quoted text reports none of them.

A real decision log writes a state the vocabulary has no cell for, and the facet that means it stands on another kind. 4 of the same 10 records carry a compound ## Status: three read Accepted — implementation deferred and one reads Accepted — Stage 0→1 active, Stage 2+ deferred. The five states of vocabularies.lifecycle_state are draft, current, superseded, deprecated and discharged. Each of the four maps to current, and the clause after the dash is gone. What that clause names is already declared, on the wrong kind. The decision-record entry adds facets.waiting_on with the value build, guided as "the answer is known and somebody has to write the code or the prose". It requires the facet on kinds.obligation_record and declares it on no other kind. So the entry owns the vocabulary that this corpus needed and cannot lend it to a decision. This sharpens the item above about list extension in an add-only overlay, and it is adjacent to HW-OBL-0123. Widening kinds.decision.facets moves bundle.yml, which moves the lock and the package. That is a change with its own argument rather than a line in an evaluation.

A human maintains this list by hand

The first-run walkthrough found the defect that this file demonstrated. Each item above is really a document with a state, a date, edges to other items, and citations to its evidence. One file could not carry that, so a human kept the four lists aligned by hand. Principle 2 calls that a defect, and this file inherited the register index's position as the most-edited artifact in the repository.

The remedy was ordinary corpus work rather than a design change, and the corpus work has run. Each list above is a set of things the graph holds. This page states no total over them. A total kept by hand goes stale, and it contradicts nothing on the page that carries it. What no projection kind writes is the file that this one is, and the rest of this section states why.

What the lists above do not reach, held by a fixture rather than by a hand count. tools/repo/obligation-register-fixtures.sh checks the same two things this paragraph once computed by hand, in both directions. Every record on the shelf standing at current has one line above, and no line above names a record standing at discharged. A record that leaves the list this way sometimes carries a sentence above, in the form this page uses for a discharged record. Sometimes it does not carry one yet. The fixture holds the membership either way, and a missing sentence is a smaller cost than a missing or a wrong line.

The verb that derives them now exists. headwater generate writes a declared projection, generate --check holds it, and CI runs the gate. The census now reports a generated file under an outcome of its own. So a list written into docs/ is read as a generated file rather than as an untyped document of the shelf it landed on.

The projection milestone named four hand-maintained artifacts of this repository, and two of them are derived now. They are the glossary, the specification table in the root README, and the redirect map in 9 — Open questions. The fourth is the four lists that this section is about. The table fell first. It named every document on the spec_series shelf, this repository's overlay declares a shelf_index over that shelf, and headwater generate writes docs/spec/README.md. The table is deleted, so one list has one copy. The record about the label is the price of that swap, and it is the whole of the price.

The redirect map fell second, and the four lists in this file did not. The cause is the emitter cost that the rest of this section prices, and not identity below the grain of a document. An obligation was a position in a list, so it reached no identifier index. No emitter reads a set of things the graph does not hold. #126 closed that. Every item above is a node, every one carries HW-OBL-NNNN, and the graph holds each edge that a list would state.

The only emitter that could write the four lists costs three things rather than one, and the ruling below is what the three price. shelf_sections writes one file for one shelf, as a flat run of one heading for each document. This file is four lists over one shelf, so a flat run deletes the partition. The four classes are the whole editorial content of this file, and no facet holds a class. That is the first cost, and it is the one that decides the trade.

The second cost is the six headings. Twenty-one citations in this corpus name one of them, and shelf_sections writes one heading for each document rather than one for each class. So a projection at this path deletes all six anchors and every citation into them falls. The redirect map paid the opposite price: its headings were its documents, so the emitter reproduced them.

The third cost is this section and the framing paragraph of each class. A projection reads facets, and #130 refused a template, because a taxonomy source sits outside the corpus root and no language regime binds it. So the prose that says what a class is has nowhere to go.

The absence has a measurement, and it costs more than a projection. A run of 2026-08-20 wrote a contraction, a British spelling and a retired term into a comment in packages/headwater-standard/taxonomy.yml. headwater check --strict exited 0 and reported none of the three. The same three defects in a paragraph of spec 7 gave exit 1, with two errors and one warning. So prose that no rule reads meets a requirement that asks for a statement in a package source. #267 asked for one, and this is where it landed.

This file stays authored, and the milestone bar says so rather than holding a bar that nothing meets. Two remedies were open. Four shelves under docs/obligations/ let four declarations write four flat lists. A group-by member on a projection kind writes one file, with one heading for each class. Each one writes a heading for a document or for a class, and this file has six headings.

Two of the six headings stand over no record. They are what the first typing found and this section. Neither one holds an obligation record, and together they carry nine of the twenty-one citations that name a heading here. No partition of the obligations shelf produces either heading, whichever facet the partition reads. A projection at this path deletes both, and every citation into them falls.

The four classes are editorial, and a facet that carried one would read as intrinsic. The fourth class holds what the first three leave, so its value means none of the other three. Such a value changes on a record that nobody edited, on the day a fifth class arrives. HW-OBL-0011 and HW-OBL-0096 are one debt under one decision, filed in two classes. A facet would read that pair as two obligations of different classes, so the schema would hold the duplicate rather than report it.

The argument above is about an editorial class, and one facet over this shelf answers a different question. HW-DR-0030 declares waiting_on, which states what a record is waiting on right now, in four values with no residual: ruling, build, measurement and adopter. The objection above holds against a class that is editorial and partly about provenance, and it does not reach a present-tense state. The pair it names is the test. HW-OBL-0011 and HW-OBL-0096 take one value under waiting_on, so the duplicate stays visible rather than being split. This file keeps its four lists, its six headings and its authored form, and the facet asks for no projection at this path.

The two partitions are not the same partition, and the difference is what a hand-maintained list costs. Each heading here was read for the distinct records it links. Design work that nothing blocks links 93 records and 42 of them wait on a ruling. Unmeasured claims links 17 and 8 of them wait on a build. So the largest heading says that nothing blocks work that a ruling blocks, and nothing reports that.

The shelf carries each record, and this file carries the argument about the set. The obligations shelf holds every record with its identifier, its dates and its edges. A question about one obligation is answered there. This file holds the partition, the framing of each class, and the history of what left each list. That is prose about a set rather than a row of it.

The cost that both remedies were priced with was a defect rather than a price. The engine held two tests for what a document is. The identifier index and the edge builder read one, and the read that a shelf index calls read the other. So a file that a projection took over left every index that named it, and nothing but a byte diff reported the drop. A shelf index is the set of documents on a shelf, and docs/spec/README.md carries sixteen rows with the redirect map among them.

One condition reopens this, and it is a projection kind that composes derived rows with authored prose. #130 refused a template because a taxonomy source sits outside the corpus root. A form that keeps the prose inside the corpus root meets no such refusal. On the day such a kind exists, this file is a projection and this section is the record of why it was not one.

A declared projection writes the redirect map, and each of the three things that blocked it was settled differently. shelf_sections writes one heading for each document on a shelf, and the heading is the value of the facet in the name role. Over the decisions shelf of this repository it writes the twenty-one Qn headings that the map carries, in the order Q1 to Q21. That reaches 132 of the 136 citations (#127).

The first block was one anchor that is not a document. Four of the 136 citations named #the-aggregator-authors-its-own-facts, which was a subsection of Q9 and is now a subsection of HW-DR-0009. A projection whose grain is the document writes one heading for each document, and that heading is not one. The other twenty-one resolve because #124 minted each document by lifting its heading, so the match is a history rather than a derivation. This is identity below the grain of a document again, one level under where #124 closed it.

The four are repaired in the document that wrote them, and they name the record directly. All four stood in one evaluation, which is a point-in-time record. A record freezes what it asserts, and it does not freeze the path by which a citation reaches its target. The repair changed no sentence of that evaluation, and it removed two hops of redirect. The alternative was four citations into an anchor that no heading makes, in the one file whose whole purpose is that a citation keeps resolving.

The second block was that the file is a node of the graph and no generated file could be one. It carries HW-REG-open-questions, and three documents name that identifier: this file and the decision register supersede it, and one review record assesses it. The census read the generated-file marker before the parse, so a marked file reached no identifier index. Spec 6 gave one reason for that outcome, and the reason is about checks rather than about identity.

The census admits a generated Markdown document that carries the marker as a member of its front-matter block. A projection declares what that block says. The declaration states an identifier, a kind and a name, and it can state nothing else. The engine refuses a declaration that leaves out the name where the kind requires the facet in the name role (#780). A facet the block has no member for stayed unreported, and HW-DR-0063 closed that remainder. The engine derives every one of them, and the refusal now reads the whole required set. The census counts such a file under generated rather than classified, and the graph keeps its node and every edge half. No citation falls, and no finding moves.

The instrument that would have caught this exists as well. A generated file that declares no identity is still no node, and this file marked in that form strands the same three edges. Spec 12 calls a dangling edge a structural finding of phase A, and the engine printed one under graph and routed it to no rule. relation.target.unresolved is that rule, it serves OB-REL-4, and headwater check --strict exits 1 over the three where it exited 0.

The third block was that most of the file was prose that nothing derives. Five paragraphs stated why a tombstone exists at all, and twenty-one clauses pointed at what each decision left open. A projection reads facets, and no facet holds either. The five paragraphs are three now, and they sit in the register, which is the file they were about. The twenty-one clauses are deleted, and they were a second copy of a relation that this file states from the other end. Fifty-seven citations here name the decision that produced an entry, one entry at a time, and each clause named a whole section of this file.

The three trades are priced now, and one of them cost a paragraph in a second file. An artifact earns its generation when many documents depend on it, and such a document is one this engine can hold as a node.

9 — The decision register joined the list. The trade was worth it. #124 moved the argument for each decision onto the decisions shelf. The register is an index over them now. That removed the second copy of every decision. A second copy is what the decision-record tradition exists to prevent, and OB-DR-1 has no check to report one. The register keeps all 22 anchors that this corpus cites into it, so the 214 citations still resolve. This file is the same instrument one step later, and it keeps its six. Two of the three blocks above are gone for it as well, and its own prose is what stays. Fourteen documents name HW-REG-decisions, and a node that a projection writes keeps every one of the fourteen.

The conversion has run for the decisions, and two of the things it predicted did not happen. #124 said that every Qn citation becomes a link to a document, and that link.fragment.unresolved reports each one that falls. Neither held, and each one failed for its own reason.

The rule did not read those citations at all. It selected a link whose destination begins with #. So it read a bare fragment that a document writes into itself, and never a fragment on a path. That gap is closed. link.fragment.unresolved is corpus-scoped at version 3 and reads both arms, so a citation of the form 09-decisions.md#q4--relation-storage is now a link this engine resolves. HW-OBL-0077 is the record. The counts it carried are struck rather than restated. Each was true on the day it was taken and false a week later.

And no citation fell. The conversion kept every cited heading in place, so the 233 citations into the register and the 136 into the tombstone all still resolve. What a reader loses is not a link. A Qn citation still lands on an index rather than on the document. Only an author who edits the citation moves it. #124 predicted a repair forced by a check. What it got was a repair that nothing forces, which is the weaker position of the two.

The third is the glossary, and its cause is different and now measured. That page held a sentence that called itself a projection in waiting, on the ground that kinds, facets, relations and purposes carry declarations. The engine exists now, so the claim is testable, and it fails. This repository's resolved taxonomy declares 27 of those four things, with names like governed_document, status and supersedes. The glossary defines the words of the schema language instead, which are kind, facet, relation and purpose themselves. Of its 175 terms exactly one, summary, is the name of a declaration. A generator fed this taxonomy emits a page that shares one entry with the page a reader wants. The glossary now says so in place of the promise.