docs(k3): round 22, frontmatter a YAML reader reads back the same
K3-22's report, CHANGELOG under [Unreleased], and two corrections of a sentence measured false. README and CLAUDE.md both said of the flow form "both are valid YAML, and a real YAML consumer recovers the same structure from either". An unquoted URL with a query string inside a flow mapping is not valid YAML for PyYAML, and the quoted form is refused by the pinned guard; the paragraph now states the limit. CLAUDE.md also records the K3-22 invariant and the new refusal of a `--frontmatter` flow value with such a leaf. Measured, fix `ed0418f` against base `0308169`, each tree built twice from frozen exports: five-document project 0 files moved; R761 XML and HTML 1 line each; K2 default 42 `title` lines, after which 454 of 454 frontmatters parse and read back the same (base 413 parse, 412 read back). hit@k on R761 base = fix, S1-S6 6/6 at hit@1/8/50 at both k, KP rank 1; okf check 32 of 32 payloads 0 findings over 16 rules; K2 pin 7 passed in the export. Found outside the order: the pinned guard refuses nearly every segmented concept okf writes, on its scalar flow sequences (`source_offset`, `references`, `derived`) -- identical before and after, so older than K3-22. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
ed0418f228
commit
e717b1c87a
4 changed files with 350 additions and 6 deletions
28
CLAUDE.md
28
CLAUDE.md
|
|
@ -301,14 +301,30 @@ specifies it. Because "always latest" decays silently, the release checklist
|
|||
carries an upstream-version re-check.
|
||||
|
||||
**Structured frontmatter values are emitted in YAML *flow* form, never block.**
|
||||
Both are valid YAML and an upstream reader recovers the same structure from
|
||||
either, but this library's parser is line-oriented: it round-trips a flow
|
||||
Both can be valid YAML -- within the flow-scalar limit below -- and an upstream
|
||||
reader then recovers the same structure from either, but this library's parser
|
||||
is line-oriented: it round-trips a flow
|
||||
mapping as an opaque value and cannot read the block form at all — two block
|
||||
mappings sharing an inner key (§10.2's `executor` and `attester`, both carrying
|
||||
`resource`) collapse into one namespace and the first is lost silently.
|
||||
Emitting block would produce bundles we cannot read back. Reading it needs the
|
||||
structured reader (D1b); until then the constraint binds what we write.
|
||||
|
||||
**Every value is written so a YAML reader reads it back the same (K3-22).**
|
||||
SPEC § 11 point 1 requires "a parseable YAML frontmatter block", and before
|
||||
K3-22 the pinned K2 default bundle failed PyYAML on 41 of 455 blocks and each
|
||||
R761 build on 1 -- block scalars written verbatim. A block scalar that is not
|
||||
plain-safe (`profiles.yaml_block_plain`, K3-19's rule) is now written
|
||||
double-quoted with `\` and `"` escaped; every other value keeps its bytes. A
|
||||
FLOW leaf has no quoted form -- the pinned guard refuses any quote inside a
|
||||
flow mapping -- so a leaf PyYAML would refuse or misread (`?`, `": "`, `" #"`,
|
||||
a quote, a leading indicator) is refused by `profiles.yaml_flow_plain` with the
|
||||
door's existing code, never written. Readers unquote a `"`-wrapped value only:
|
||||
0 such values existed in any measured bundle, while 11 193 `'`-wrapped ones do
|
||||
and stay untouched. PyYAML is a dev dependency that validates the rules in
|
||||
`tests/test_yaml_frontmatter.py`; `src/` imports no yaml. Report:
|
||||
`docs/2026-09-11-k3-runde22-yaml-lesbar-frontmatter.md`.
|
||||
|
||||
**Every upstream release runs `docs/upstream-okf-upgrade-runbook.md`.** Pin the
|
||||
commit, enumerate the whole `okf/` tree, **read the shipped example bundles and not
|
||||
only `SPEC.md`**, classify the diff, measure our exposure and each consumer's, plan
|
||||
|
|
@ -587,9 +603,13 @@ and fixtures, never code.
|
|||
`docs/2026-09-08-k3-runde3-per-filtype.md`.
|
||||
- **`--frontmatter KEY=VALUE` (K3-19, repeatable) is not a segmentation flag**
|
||||
and moves no byte unless given: it stamps a key on every concept of the run,
|
||||
split on the FIRST `=` and written verbatim on ONE line -- a block-form
|
||||
split on the FIRST `=` and written on ONE line -- a block-form
|
||||
`sources` is invisible to `parse_frontmatter`, so the flow form is the only
|
||||
one that survives our own readers. It adds any key and REPLACES only
|
||||
one that survives our own readers. Since K3-22 a scalar goes out
|
||||
double-quoted where a YAML reader would not read it plain, and a flow value
|
||||
goes out as given but is REFUSED (exit 2) when a leaf has no flow form both
|
||||
PyYAML and the guard read -- so a `sources` URL with a query string, the form
|
||||
K3-19's own flagged build wrote on 2 761 of 2 761 concepts, fails the build. It adds any key and REPLACES only
|
||||
`sources` and `description`, the two with a derived layer below them:
|
||||
precedence flag > what the document declares > file name. Every other key
|
||||
the door writes (`inbox._door_keys`, including Door A's `ingest_manifest`,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue