The pre-pass delivered the right concept and the answer could not name it.
Measured by portfolio-optimiser 2026-09-08 over three paid arms: the gold
concept came back at rank 1 of 8 on 3 of 3 bundles, and the model answered
correctly on 1 of 3, because a delivered excerpt carried `concept_id`, body
text and nothing the document is known by. The previous session measured the
same gap from the other side: the provenance it had just written into every
concept did not reach the payload at all.
`excerpt_for` now carries `title` unconditionally, and `req_number`, the SPEC
5.1 address `sources` and each locator key (`source_pages`, `source_sheet`,
`source_rows`, `source_lines`, `source_offset`) when the concept has them. A key
the producer did not write stays absent: an empty value would assert that they
wrote an empty one, which is the contract's 6.4 failure.
`sources` is read in BOTH YAML forms, on a measurement rather than a taste. K2
writes the flow form on 629 of 629 concepts; the largest N-bundle writes the
block form on 270 of 270 and carries no locator key at all, so a flow-only
reader delivers that bundle with no address whatsoever. Reading the block form
is not a licence to write it - the emission rule is untouched, because the
line-oriented parser still cannot round-trip a block list. A `sources` value
this reader cannot decode is named (`sources_unreadable`), never dropped into
the same silence as an absent one.
Contract 8 gains the requirement and the checker gains its code
(`excerpt_unnamed`, 15 rules now, was 14): an excerpt a reader cannot name is
one an answer cannot cite, whatever its rank. `req_number`, `sources` and the
locators are SHOULD, not MUST - they are conditional on the producer, and a
bundle whose concepts carry no identifier cannot deliver one.
K2 controls, same question and same k, before against a frozen copy of the tool
at b6a8c8b: the RANKING does not move - the same 8 concept ids in the same
order, identical `text_sha256`, identical `withheld`, identical denominators
(629 = 621 + 8). The FIELD is what moved: payload 108 877 -> 111 744 B
(+2.63 %), budget spent 18 606 -> 20 907 (+287.6 B per excerpt), excerpt
members 9 -> 15, 83 changed lines. The contract document's own bytes moved with
8, so the budget instrument's known-positive moves with it: 10 349 -> 12 049
measured, 10 060 -> 11 719 raw, delta 289 -> 330.
New fixture `tests/fixtures/consume-provenance`: the two address forms and a
concept carrying neither address nor identifier. Purpose-built, because the two
real bundles are complementary and neither exercises both forms.
Suite 1347 (1339 before), ruff clean, mypy src clean.
Co-Authored-By: Claude <claude-opus-5>
89 lines
2.9 KiB
JSON
89 lines
2.9 KiB
JSON
{
|
|
"contract": "okf-consumption/1",
|
|
"bundle": {
|
|
"bundle_id": "b-golden-segmented-okf-v0-2",
|
|
"ref": "sha256-tree:f85646c1f77982a69b97afca08209f369b79cd39c217f6f2c074c2dc5bac23fe"
|
|
},
|
|
"budget": {
|
|
"unit": "utf-8 bytes of emitted JSON",
|
|
"instrument": "okf_consume.measure (len of the ensure_ascii=False JSON encoding, utf-8)",
|
|
"limit": 120000,
|
|
"spent": 1774,
|
|
"known_positive": {
|
|
"case": "docs/consumption-contract.md, encoded as a JSON string",
|
|
"expected": 12049,
|
|
"measured": 12049,
|
|
"raw_bytes": 11719,
|
|
"encoding_delta": 330
|
|
}
|
|
},
|
|
"denominators": {
|
|
"considered": 3,
|
|
"withheld": 0,
|
|
"delivered": 3
|
|
},
|
|
"question": "Hva sier veiledningen om krav?",
|
|
"excerpts": [
|
|
{
|
|
"bundle_id": "b-golden-segmented-okf-v0-2",
|
|
"concept_id": "krav/1-1/foerste-krav",
|
|
"sha256": "84145512284a8bbc1a8905c73d0de3f0e0cb7081cf517f778fe88a610d2b4f62",
|
|
"adjudication": "proposed",
|
|
"trust_tier": "unverified",
|
|
"bundle_id_inherited": false,
|
|
"title": "Foerste krav",
|
|
"sources": [
|
|
{
|
|
"resource": "veiledning.md",
|
|
"title": "veiledning.md"
|
|
}
|
|
],
|
|
"source_lines": "[5, 8]",
|
|
"source_offset": "[94, 176]",
|
|
"text_sha256": "08447c690087834883a78fb9f40d474c68b2526ed57d0dafe01c4868db3c04f0",
|
|
"text": "\n## 1.1 Foerste krav\n\nEt krav som beskriver den foerste betingelsen i eksempelet.",
|
|
"rank": 1
|
|
},
|
|
{
|
|
"bundle_id": "b-golden-segmented-okf-v0-2",
|
|
"concept_id": "veiledning",
|
|
"sha256": "8f1f4d940887b96b39496d0aceb7a4fa212553510165917427e4f7e9efb98b03",
|
|
"adjudication": "proposed",
|
|
"trust_tier": "unverified",
|
|
"bundle_id_inherited": false,
|
|
"title": "Veiledning for eksempelbundel",
|
|
"sources": [
|
|
{
|
|
"resource": "veiledning.md",
|
|
"title": "veiledning.md"
|
|
}
|
|
],
|
|
"source_lines": "[1, 4]",
|
|
"source_offset": "[0, 94]",
|
|
"text_sha256": "82d67ff01367a1a56532130e077956048004ac047e6062eae2143d96704c4a92",
|
|
"text": "\n# Veiledning for eksempelbundel\n\nDenne teksten er syntetisk og finnes kun for a pinne bytes.",
|
|
"rank": 2
|
|
},
|
|
{
|
|
"bundle_id": "b-golden-segmented-okf-v0-2",
|
|
"concept_id": "krav/1-2/andre-krav",
|
|
"sha256": "4f8a869aa4e898ec1a30595951b3e198e09091d76c41078a52e821000eb9e22c",
|
|
"adjudication": "proposed",
|
|
"trust_tier": "unverified",
|
|
"bundle_id_inherited": false,
|
|
"title": "Andre krav",
|
|
"sources": [
|
|
{
|
|
"resource": "veiledning.md",
|
|
"title": "veiledning.md"
|
|
}
|
|
],
|
|
"source_lines": "[9, 11]",
|
|
"source_offset": "[176, 253]",
|
|
"text_sha256": "4c181e1debb141d3cb1a7bd47249fdac1c0b2c5db1b47cf255ef8f04f83ec840",
|
|
"text": "\n## 1.2 Andre krav\n\nEt krav som beskriver den andre betingelsen i eksempelet.",
|
|
"rank": 3
|
|
}
|
|
],
|
|
"withheld": []
|
|
}
|