docs(okf-v0.2): the guard measurement removes the form question, and A-E5 grows the second run

Two corrections, both measured against guard 0.2.0 today rather than
reasoned.

Requirement 1: the T2 parser refuses every route to a mapping — the flow
form on the disallowed-indicator set, the block form on the nested-mapping
check, dotted keys on the key pattern. A v0.2 `generated` mapping has no
expressible form through Door C at all, so the chosen flow form is not
worse than the alternatives; there are none. The decision stands on its
original grounds. What changes is a claim: no round-trip through a
guard-gated import may be asserted. Door B never parses frontmatter, so
the grammar binds import, not emission.

A-E5: po-claude located a hole in A-E1. The emitter's `generated: true`
and the ownership predicate are coupled through that literal, and
OKF_V0_2 changes exactly it — one run compared byte for byte cannot see
the predicate stall, since that needs two runs into the same directory.
A-E5 now names the same-directory second run and expects it to succeed.
The separate in-place DEFAULT-to-v0.2 question is marked undecided rather
than quietly turned into an expectation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A2aKJxLejT9S8jYwoZ9fut
This commit is contained in:
Kjell Tore Guttormsen 2026-07-26 21:34:19 +02:00
commit b1a92c940d

View file

@ -536,6 +536,24 @@ D3/Door C, and no pilot repo sends us one. So the tag needs:
compliance we may claim — and it is cheap to reverse, since moving to the
block form later is a new profile, not a migration.
**Measured against the guard 2026-07-26, and it settles the form question by
removing it.** The guard's T2 frontmatter parser (Door C, `okf.import_bundle`)
refuses every route to a mapping, each on its own rule: the flow form on the
disallowed-indicator set (`{` and `[` are both in it), the block form on the
nested-mapping check, and dotted `generated.by` on the key pattern. What
survives is scalars and flat lists of strings. So a `generated` **mapping**
which is what v0.2 specifies — has no expressible form through that gate at
guard 0.2.0, and the flow form is not worse than the alternatives; there are
none. Requirement 1 therefore stands as chosen, on its three original grounds.
What the measurement does change is a claim, not a form: nothing in this tag
may state that a v0.2 bundle we emit round-trips through a guard-gated import.
The profile documents that as a measured limitation. Door B is unaffected —
the same six shapes through `screen_output` all return `warn`, and no Door B
module references `parse_frontmatter` — so the grammar binds what can be
IMPORTED, never what we emit. Measured against 0.2.0, the version we pin; the
guard reports different behaviour on a later one, which is theirs to state.
Consequence for the estimate: requirement 1 is *smaller* than both the
original sizing and U4's escalation of it — zero emitter work, the change is
in the materializer's value construction — and A-E4 is corrected to match.
@ -639,7 +657,25 @@ output is the baseline. Materialize it twice with the *same* explicit
recorded there. A test specification that outlives the decision it encoded is
the A-E6 defect class — a pilot failing our own expectation while the code is
right — so the correction lands before the pilot receives it, not after.
- **A-E5** Re-running with the same `ingested_at` is byte-identical.
- **A-E5** Re-running with the same `ingested_at` is byte-identical — and the
second `OKF_V0_2` run goes **into the directory the first one wrote**, not into
a fresh one. **Sharpened 2026-07-26 on po-claude's finding**, which located the
hole in A-E1: the emitter (`materialize.py:164`, `"generated": "true"`) and the
ownership predicate (`:144`, `frontmatter.get("generated") != "true"`) are
coupled through that string literal, and `OKF_V0_2` changes exactly that value.
Change the emitted form without the predicate and the library stops recognising
its own output, so the collision gate fires `collision_unstamped` on the files
its previous run wrote. One run compared byte for byte — A-E1's shape — cannot
see that: the defect needs two successive runs into the same directory. So the
expectation is not only byte-identity but that the second run **succeeds**.
Verified on `main`, not only on their pinned v0.3.2: the coupling is unchanged
there, `_is_ingest_owned` having since gained a per-manifest stem check that
narrows ownership further without touching the literal.
Distinct from this, and **not** a pilot expectation because the requirement is
undecided: whether a `DEFAULT`-written bundle may be re-run **in place** under
`OKF_V0_2` — i.e. whether the predicate accepts both the v0.1 stamp and the
v0.2 form. That is a D2 requirement question standing with the operator.
- **A-E6** The root `index.md` declares `okf_version: 0.2`**unquoted**, and
the file carries **no UTF-8 BOM**. Both are load-bearing, not stylistic:
catalog measured that a quoted value fails their shape regex `exit 1`, and