docs(okf-v0.2): U8 — sources replaces the citations LIST, not the attribution

Per-claim attribution moves to a markdown footnote keyed to a sources[].id
(SPEC §4.2 :224-225, §5.1 :347-360), and the shipped acme_retail bundle carries
it inside a schema table. Our supersession row stated the destination and not
the mechanism, so a consumer following it would migrate the list and drop the
claim->source binding.

Measurable at the pinned commit the whole time; surfaced by Google's launch post
2026-07-27. U1-U7 measured frontmatter in all four reference bundles and walked
past the bodies. V-A1's discharge is narrowed rather than reworded: the pin
holds, the reading's depth did not.

Consequence outside the doc: the v0.2 exposure report sent to the wiki states
the incomplete half under the heading that exists to size their cost. Correction
owed, same class as A-E3.
This commit is contained in:
Kjell Tore Guttormsen 2026-07-27 16:24:56 +02:00
commit e5e574df86

View file

@ -50,6 +50,17 @@ Minor correction while pinning: `CLAUDE.md` says v0.2 shipped 2026-07-25. The
commit dates say 2026-07-24. Not load-bearing, but it was asserted rather than
measured.
**Narrowed 2026-07-27: the discharge covers frontmatter, not bodies.** U8 records
a §5.1 mechanism — per-claim footnote attribution — that sits in the pinned
`SPEC.md` and in the shipped bundle bodies, and that this enumeration missed. The
heading stays "DISCHARGED" because the pin itself holds and every fact below was
read at it; what failed was the reading's *depth*, and the correction is to say
so rather than to quietly widen the claim. Practical rule taken forward: a bundle
is frontmatter **and** body, and "we read the bundles" is not evidence that we
read either half in particular. The cheapest form of this check is a local clone
at the pin, where a grep covers the tree instead of the files we thought to
fetch — see the runbook.
## Grounding against upstream's own reference bundles (2026-07-26)
The spec was read in session 19. **The shipped examples were not**, and reading
@ -181,6 +192,31 @@ we could not locate in the spec sections read. It is either a v0.1 field we neve
enumerated or an undocumented one. **Not resolved**, recorded so it is not
mistaken for something already checked. It touches nothing in the tag.
### U8 — Per-claim attribution is a BODY convention, and we read only frontmatter
Added 2026-07-27. `sources` does not replace `# Citations` on its own: §5.1 binds
a claim to a source with a markdown footnote whose label is a `sources[].id`, and
`bundles/acme_retail/tables/orders.md:31-36` ships exactly that — footnote
references inside a schema table.
**This was measurable at the pinned commit the whole time.** It surfaced from
Google's launch blog post on 2026-07-27, but the blog is not the source: the
convention is in the `SPEC.md` we had already pinned and read. U1U7 measured
frontmatter in all four reference bundles and walked past the bodies, so the
enumeration was frontmatter-deep rather than complete. The runbook's rule — read
the shipped bundles, not only the spec — was followed in letter and half in
substance, because a bundle is frontmatter *and* body.
What it changes, and what it does not:
- **Nothing in emission.** Door A renders tables and fenced blocks and writes no
citations at all; Door C writes bodies verbatim. There is no defect here.
- **The exposure advice, which we had already sent.** The v0.2 exposure report to
the wiki (2026-07-26) states the supersession as "`# Citations``sources`"
under the heading that exists to size their cost. Accurate and incomplete; a
correction is owed and is the same class as A-E3's.
- **V-A1's discharge is narrower than it reads.** See the provenance section.
### What this changes
Tag requirement 1 was re-sized (U4 → requirement 1): the emitter turns out not to
@ -200,6 +236,16 @@ consumer fallback (§13.1):
| `timestamp` | `generated.at` | Consumers **MAY** fall back to legacy `timestamp` **when `generated` is absent** |
| body `# Citations` list | `sources` frontmatter | Consumers **SHOULD** read `sources`, **MAY** still parse legacy `# Citations` |
**The `# Citations` row states where provenance goes, and that is only half the
supersession.** Per-claim attribution moves to a **markdown footnote in the body
whose label is a `sources[].id`** (§4.2 `:224-225`, §5.1 `:347-360`), and the
labels are keyed rather than positional precisely because agents rewrite these
documents — a positional index misattributes silently the moment the list is
reordered. So a consumer who moves a `# Citations` list into `sources` and stops
there has migrated the list and dropped the claim→source binding. No RFC-2119
keyword attaches to the footnote form itself; §13.1's SHOULD/MAY governs the
supersession. Recorded 2026-07-27 — see U8.
Additive, all optional upstream (§5) — and all in scope for us under the standing
policy: `sources` (per-source credibility signals — `author`, `usage_count`,
`last_modified`, framed by `usage_window`), `generated { by, at }`,