docs(okf-v0.2): steps 1-3 are done, and step 3 was not behavior-neutral

The plan's own line said steps 1-3 change no behavior. V-A7's construction gate
made that untrue, and a stale premise in a plan is the class of thing this repo
has already paid for twice. Recorded where it was wrong, with the operator
decision that put the gate before D2 rather than at it, and with Door C's six
tolerance cases measured rather than expected.

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 20:10:37 +02:00
commit c85347e8a5

View file

@ -921,8 +921,8 @@ consumer can use anyway.
## TDD order
Steps 13 add tests and change no behavior, so they are safe first and de-risk
everything after.
Steps 13 are almost entirely tests, so they are safe first and de-risk
everything after. **Done 2026-07-26** (`1215f98`, `7bc366b`).
1. **Characterize what already holds.** `parse_frontmatter` round-trips an inline
flow mapping opaquely; `_is_ingest_owned` returns False for a v0.2 `generated`
@ -930,8 +930,19 @@ everything after.
documented guarantee.
2. **Audit Door C against the tolerance rules** (D3): one test per MUST NOT plus
the bare-`verified` MUST. Failures here are real defects, not plan revisions.
*Measured: all six pass.* Door C's tolerance is structural rather than
lenient — it writes the guard's bytes verbatim and never parses the sender's
frontmatter, so a D1b reader that starts judging shape at this door is what
would break them.
3. **Assert no hard-coded version** anywhere a profile should decide (V4), and
the no-`timestamp`-plus-malformed-`generated` construction invariant (V-A7).
**The one place these three steps add behavior**, and it was an operator
decision to add it here rather than at D2: V-A7's stated test shape is a
construction-time refusal, and building it before D2 is what develops D2
under the invariant instead of alongside it. It lives on
`FrontmatterSchema.__post_init__` — the C3 analog, and a profile must build
its schema first. Behavior-neutral for both shipped profiles, with the
byte-exact golden suite as the proof rather than the claim.
4. **D1a — the emitter half only.** `FrontmatterSchema.emit` accepts a block-list
value. Runs through `DEFAULT`'s path, so the golden suite proves V-A6 here.
**No longer tag-blocking** after requirement 1's re-sizing — the flow form