Second order 20260825T133057Z-193098605-from-.claude, carrying an operator directive that how an agent finds information in a bundle must be token-efficient, as a property the contract carries rather than a later optimisation. The order prescribed the goal, left the form to us, and invited the objection that "token-efficiency" is the wrong abstraction for a generic layer. It is, so the element is not called that. C6 — retrieval cost is declared: instrument, budget, denominator, breaking point. It binds the READING side (the order's property 1): a conformant consumption skill states the bound its cut targets, what a typical answer costs against the whole-bundle denominator by a named instrument, which way cost scales, and the corpus size at which its strategy stops fitting its budget. Each is re-runnable as a command (property 2), and the instrument must reproduce known-good figures before its own are believed — C3's second corollary applied to a positive quantity. Why not "token efficiency": a token is one encoder family's unit and fixing it would adopt one vendor's arithmetic as everyone's (the move §3 already refuses); "efficient" is a comparative with the denominator missing; and efficiency is a property of a run while a contract binds a document. Reading a whole bundle stays legal — doing it UNDECLARED does not. Measured for this revision, all against stated refs: the gap was real (one pre-revision hit, on an unrelated sense of "costs"); the cited 250 785 / 430 144 / 112 116 figures and their prior validation against three known-good values hold; the reading model navigates rather than searches. A fifth measurement the order did not know, prompted by vegnormal-okf's coord message: IndexPolicy.per_directory is a JUDGING field (required_indexes/violations) — no code path here emits a nested index, and materialize refuses STRICT_V1 for exactly that reason. So a permitted shape is not an emitted shape, and §2 now says a cost figure inherits the ref rather than the profile. Bundle SHAPE stays with the repo that produces it (O2); no instrument is blessed; no engine, ranker or cutter is designed. No src/, no bump, no tag.
27 KiB
The generic OKF bundle consumption contract
Status: plan. Nothing here is implemented, and nothing here asks to be. No module, no profile field, no version bump follows from this document. It fixes what the contract is and who owns it, so that the first bundle-specific consumption skill — written later, in whichever repo needs it — has something to be conformant to.
Provenance. Operator decision 2026-08-25, relayed through .claude as PM
(order 20260825T122454Z-4632317874-from-.claude). The reason ownership landed
here is stated in the order and is the same reason Phase 3 exists: the
production side of the bundle contract is already carried by a profile rather
than by constants in this repo (README, "Upstream OKF versions"). A consumption
contract that did not share profile identity with the production side would
drift from it.
Second order, 2026-08-25 (20260825T133057Z-193098605-from-.claude), carrying
an operator directive verbatim: how an AI agent finds relevant information in a
bundle must be token-efficient, and this is a property the contract carries
rather than an optimisation that can arrive later. That order prescribed the
goal and left the form to us, including the invitation to say so if
"token-efficiency" is the wrong abstraction for a generic layer. It is, for
three reasons; C6 is the property that was built instead.
This repo does not own any bundle. It owns the contract both sides of a bundle are held to. That distinction is the whole of §2.
0. What was measured before this was written
The order supplied figures and line numbers and asked that they be re-measured rather than copied. They were. One of them does not survive.
| Claim in the order | Measured | Verdict |
|---|---|---|
| This repo's README says the bundle contract is carried "by a profile rather than by constants" | README.md l. 12–13 (the order says 11–13; the range contains it) |
holds |
The wiki masterplan fixes three marking values (extracted / derived / [uverifiable-from-bundle]), decision 2026-07-24, attributed dead |
docs/masterplan.md l. 535 and l. 1027 |
holds |
| The wiki bundle's consumption engine documents six equal markings | its README.md l. 24, CLAUDE.md l. 56–57 (the order says 57; the heading is on 56), skills/advise/SKILL.md l. 118–123 |
holds |
The 2026-08-13 ratification claim "originates from the consumer's own log, not from the source it cites" — evidenced by grep -rln '2026-08-13' <wiki>/docs/*.md returning nothing |
see below | does not hold |
The failing measurement, and why. The grep is correct and its result is
correct: zero hits, exit 1, against a denominator of 16 files in docs/. But
the repository holds 639 .md files, and the query saw 16 of them. Re-run
across the whole tree, 2026-08-13 appears in 9 files — among them the wiki's
own STATE.md, which is tracked and committed (2026-08-14) in the source
repository, not a log kept by the consumer. It records the operator decision of
2026-08-13 by item id: F.10 and F.11 as ratified, G.13 as approved —
G.13 being, in its own words, a new vocabulary value for "checked in the
target repo, source outside the bundle", explicitly distinct from derived.
The ratification is real, it happened where the consumer says it happened, and
the consumer cited it accurately.
So the correction runs the other way, and .claude invited exactly this: the
absence was a property of the query's scope, not of the world. A control run
(2026-07-24, same scope) returns three files, so the query could find — it was
pointed at the wrong 2.5 % of the tree.
What is nonetheless true, and is the real defect. docs/masterplan.md was
last modified 2026-07-25. The document that the consumption engine names as the
requirements owner still states three values and has never been updated to
carry the decision that superseded it. The decision lives in a session-state
file; the normative document does not know about it. That is a documentation
lag in another repo — reportable, not ours to fix (§5).
One further distinction the order's framing flattens, and which turns out to
carry weight in §3: the 08-13 decision did not ratify six values in one motion.
F.11 ratified a five-value set ([unread] and [sourced-not-sufficient]
moving from provisional to settled). G.13 approved a sixth as a separate
item, for a case defined by being outside the bundle. The upstream record
already splits along the seam this document draws.
0.1 What was measured for the second revision
The second order supplied four claims and asked, as the first did, that they be re-measured. All four hold; a fifth thing was measured that the order did not know, and it changes §2.
Every measurement in this table was taken against this document at d205b70,
before the revision it prompted. The ref is stated because C2 requires it and
because the first row is a claim about a file the same commit then changed:
re-running that grep at HEAD now returns dozens of hits, and without the ref
the row would read as false rather than as superseded.
| Claim in the order | Command | Verdict |
|---|---|---|
| This document says nothing about what a read costs | grep -in 'token|kostnad|cost|budget|effektiv|context window|kontekstvindu' over the file, exit 0 |
holds — one hit, l. 245, on an unrelated sense of "costs" |
| A consuming repo measured one imported base at 250 785 tokens, three bases at 430 144, and one listing call at 112 116 | the measurement document at the named commit, read read-only | holds |
| That instrument was validated against three known-good figures before its own numbers were consumed | same document | holds — and it is C3's second corollary applied to a positive quantity |
| The reading model navigates rather than searches: start at the index, follow the links, read each file whole | the reading-model analysis §9.1, quoted | holds |
The fifth measurement was prompted by a coordination message from the producing
repo, which reported the flat-index consequence from its own side and asked a
contract question about IndexPolicy.per_directory. Its three claims about this
library's source were checked line by line and all three hold. What the message
could not see is that per_directory is a judging field rather than an
emitting one, which is recorded in §2 because it changes what a consumption
profile may assume.
1. What the generic contract consists of
Bundle-independent means: true of any OKF bundle, whatever its types, depth, index shape or subject. Anything that needs to name a type, a frontmatter key or a directory is not in this layer — it is in a consumption profile (§2).
Six elements. Four are the first order's; the fifth was found in the sources it sent us to read first; the sixth arrived on a second order and is marked, along with the name it did not keep.
C1 — Source marking on every claim
Every claim an agent emits carries exactly one marking from the required set, plus a pointer to where it came from. The set, and the extension rule, are §3.
C2 — Pin anchoring: an advisory names the ref it read, not the version
A consuming agent states the bundle ref — commit or equivalent content identity — that it read, not the bundle's declared version. This repo has paid for the difference twice and recorded both: a tree can lose its identity without the version moving (upstream OKF, measured 2026-08-23), and a measured fact can go stale inside the same session. A version string is an assertion by the producer; a ref is a fact about bytes. An advisory anchored to a version cannot be re-measured later, which makes every claim in it unfalsifiable the moment the bundle moves.
C3 — Denominator reporting
Any claim of the form "there is no X", "nothing further was found", or "all N are Y" reports the denominator: how many units were actually examined, by which command. A negative result whose scope is unstated is not zero — it is unmeasured, and must be reported as such. §0 of this document is an instance of the failure this element exists to prevent, which is the strongest argument available for making it a required element rather than advice.
Two corollaries a conformant skill must satisfy:
- The query that produced a negative result is validated against a known-positive case, so it is shown capable of finding.
- Exit status is read from the command that matters. A pipeline reports the
status of its last stage, so
grep … | head; echo $?measureshead.
C4 — Division of labour: the script cuts, the agent judges
A consumption skill is two parts and the boundary between them is normative. A deterministic part reads, ranks and cuts the bundle to a bounded context. The agent judges what it was given, and does not go looking for context that was deliberately held back. The form is taken from the wiki bundle's consumption engine, which states this division verbatim in its own skill.
The obligation this creates runs the other way and is the part that is easy to
drop: the cut must be declared, not silent. An agent that was handed a
bounded window and reports as if it had read the bundle is producing C3's
failure with extra steps. This is precisely what [unread] is for, which is why
C1 and C4 are not independent — the marking set is the receipt for the cut.
C5 — Conditional fields: absence is a measurement, not a fact (addition)
Beyond the order's four; grounded in a measurement in the second corpus's consumption profile, and generic on inspection.
Every bundle has fields that are written only when some build-time condition held. In the second corpus, a supersession field is written only when the build was given a predecessor document, and six of seven source documents are built without one. An agent reading that field's absence as "nothing supersedes this" would be confidently wrong; the truthful reading is "this build did not check".
Generically: a consuming agent must not read the absence of a frontmatter field as the negation of what the field asserts, unless the profile says the field is unconditional. The generic obligation is therefore on the profile: it enumerates its conditionally-written fields and states, for each, what absence does and does not mean. Without that enumeration, an agent has no way to tell a conditional field from an unconditional one, and the failure is silent.
C6 — Retrieval cost is declared: instrument, budget, denominator, breaking point (second order)
Beyond the first order's four and the addition above. The operator directive this element carries used the words "token-efficient"; the element does not, and the reasons are the first thing it has to say.
Why not "token efficiency". Three objections, each one this document already runs on elsewhere:
- A token is one encoder family's unit. One vendor's encoding is not what another vendor's reader counts, and a generic contract that fixed the unit would adopt one vendor's arithmetic as everyone's — the same move §3 refuses when it declines to adopt one consumer's marking set as the required set. What survives the vendor is a named instrument and a stated number, never the instrument's name.
- "Efficient" is a comparative with the denominator missing. Efficient against what? C3 exists because a claim whose scope is unstated is not a measurement; an unanchored efficiency claim is that same failure with the sign flipped, and it is harder to catch because it sounds like good news.
- Efficiency is a property of a run; a contract binds a document. No contract can oblige a skill to be cheap. It can oblige the skill to state what its read cost, so that expense is visible instead of silent — which is the precondition for anyone making it cheap, and the thing whose absence is the actual defect.
The property, stated. The cost of answering a question should track the question, not the corpus. A retrieval strategy whose cost is the same whatever is asked has not cut anything; it has deferred the whole corpus into every run.
This is not a prohibition on reading a whole bundle. For a small corpus, reading everything is the cheapest correct strategy, and a rule forbidding it would be wrong. What the contract forbids is doing so undeclared. The obligation is therefore the same shape as C4's: the cut must be declared, and C6 is the half of that declaration which carries a number.
What a conformant consumption skill declares. Three things, none of which requires a particular unit, engine or bundle shape:
- A budget and the instrument that measures against it. The bounded context the cut targets, as a number, in a unit named together with the tool that produced it. "Bounded" without a bound is C3's failure in prose.
- The cost of the cut against the whole-bundle denominator. What a typical
answer costs to assemble, and what reading the entire bundle at that ref
would cost, by the same instrument. The fraction held back is what makes
[unread](C1, C4) a quantity rather than a gesture. - Which way its cost scales, and the breaking point. Whether cost tracks the question or the corpus, and — stated as a number — the corpus size at which the declared strategy stops fitting the declared budget. A strategy with no stated breaking point cannot be observed to have passed it.
The instrument is validated before its numbers are believed. C3's second corollary — a query is shown capable of finding before its negative result is consumed — transfers unchanged to a positive quantity: a cost instrument reproduces known-good figures before its own are used. This is not a hypothetical discipline. The measurement that prompted this element did exactly that, reproducing three published reference figures exactly before any new number was consumed, and it is cited here as form, never as authority.
The failure this exists to prevent, measured. A corpus of three imported bases was measured at 430 144 tokens in one encoding, one base alone at 250 785 — which is more than a 128k-context reader can hold at all — and a single listing call at 112 116. None of those numbers was wrong, hidden or anyone's bug. They were simply never stated, because nothing in any contract required them to be, and the reading model in play reads every linked file whole, so a flat index of several hundred links is several hundred whole files in every run. The cost was a fact about the corpus long before it was a finding, and it became a finding only because somebody happened to measure it.
What this element does not reach. C6 binds the reading side: what an agent must be able to say about its own retrieval. Whether a bundle is shaped so that a cheap cut is available — nested indexes, branch granularity, section splitting — is the producer's question, is being decided under a separate order in the repo that owns that corpus, and is deliberately not decided here. The two halves meet at the ref (C2): the producer changes the shape, and the consumption profile's cost figures are re-measured against the new ref rather than carried forward.
2. How this relates to the profile mechanism we already own
Decision: a parallel document, bound to the production profile by shared
identity and a pin. Not a field on BundleProfile.
The pull toward one object is real and is the order's stated reason for placing ownership here — two documents drift. It is nonetheless the wrong shape, for three measured reasons:
BundleProfileis a construction-time gate in one runtime. It refuses illegal profiles at construction (TypePolicy.__post_init__refuses the reserved layer; the schema refuses thetimestamp/generatedpair). A consumption rule cannot be enforced that way — it is judged by an agent, at read time, possibly with no Python present at all. The wiki bundle's engine is Node; Phase 4 of this repo is Node. A contract that only exists where our Python package is installed is not the generic layer.- The profile deliberately excludes judgement vocabulary.
profiles.pystates that security is the guard's and that no disposition, origin or channel vocabulary belongs on a profile. Marking vocabulary is the same category of thing: it describes an agent's epistemic position, not a bundle's shape. - The production profile is about bytes; the consumption contract is about reading. Nothing in C1–C5 can be expressed as "which keys are emitted, in which order".
How drift is prevented instead — identity plus pin, not colocation. A consumption profile:
- names the production profile it reads (
DEFAULT,STRICT_V1, or the named profile a corpus builds under), so the two halves share one identity; - names the bundle ref it was measured against (C2), so every structural claim it makes has a stated as-of;
- re-derives its structural claims by command, never by restating the production profile's fields in prose. A consumption profile that says "concepts live at the root, one index" must have measured it against a bundle built by the named production profile. Prose copied from the other half is the drift; a command is not copyable and goes red when it stops being true.
One binding already exists and must be honoured. IndexPolicy carries
entries_match_directory: whether the index is derived from the directory or
authored. The two consumers hold opposite postures on this and neither is a
library invariant. The consumption side inherits it unchanged: a consuming
agent enumerates a directory only where the named profile says the index is
derived. Where the index is authored, the directory is not the index's
denominator and a listing is not a check.
That rule was written as a correctness rule — a listing is not a check where the index is authored. It is also a cost rule, because it bounds what the agent reads, and naming both readings is what keeps it from being discarded as pedantry by someone optimising (C6).
A second binding, measured for this revision, and it cuts against the
optimistic reading. IndexPolicy also carries per_directory — "an index at
every level, or only at the bundle root" — off by default. It is a judging
field: it is read by required_indexes and violations, which tell a caller
what to require and what to flag. No code path in this library emits a nested
index. The materializer refuses STRICT_V1 for exactly this reason, in its own
words: that profile "sets per_directory and entries_match_directory, neither
of which this materializer honours". The external-bundle door writes one root
index and flattens each merged concept into the root namespace.
Two consequences for a consumption profile:
- A permitted shape is not an emitted shape. That a named profile allows nesting says nothing about whether the bundle in front of the agent has any. "This bundle is nested" is a structural claim and must be re-derived by command against the ref, never read off the profile's field list — which is the third bullet above, in the one case where the temptation is strongest.
- A cost figure inherits the ref, not the profile. Because shape can change without the profile changing, a consumption profile's C6 numbers are anchored to the ref they were measured at, and go stale when it moves.
This is the same rule Phase 3 already runs on, one level up: a profile names the key, a caller owns the value. Here: the generic contract names the required marking set; a consumption profile declares its extensions.
3. The source-marking vocabulary, decided
Decision: five required values, plus a declared-extension mechanism.
[verified-in-target] is an extension, not a required value.
Required in every conformant consumption skill, whatever the bundle:
| Marking | Meaning |
|---|---|
extracted |
the bundle states it directly |
derived |
inferred from the bundle; the reasoning is shown |
[unverifiable-from-bundle] |
outside what the bundle covers |
[unread] |
the source exists in the bundle and was not read |
[sourced-not-sufficient] |
the quote is real but does not carry the conclusion |
[unverifiable-from-bundle] is one literal string — no variants, no
translations — and that English spelling is the ratified wire literal
(item F.10). A repo may keep a translated concept name in its own prose; the
wire form does not translate.
Which document is normative — and why the question dissolves
Neither. The order asks us to pick between the wiki masterplan (three values) and the wiki bundle's consumption engine (six). Both are artefacts of one consumer: the masterplan owns the vocabulary for that bundle, the engine implements it for that bundle. Deciding that either is normative for the generic layer would be adopting one consumer's contract as everyone's — the mistake this repo has a name for (O2: we do not change, or inherit, another repo's contract from here).
Taking ownership of the generic layer means the generic set is ours, and both of those documents become conformant profiles of it. Neither has to change. That is also why the masterplan's documentation lag (§0) does not block this decision: it is a defect in how one consumer records its own contract, and the generic layer does not depend on which of its two documents wins.
Why exactly these five, and why the sixth is not among them
The line is drawn by a property, not by counting: a required value must be
meaningful for every bundle. [verified-in-target] means "read at its source
in the target repo the advisory is about" — it presupposes a target outside the
bundle that the agent can read. The second corpus measured a case where that
presupposition fails: its consumers advise about a physical installation or an
exemption application, not about a codebase, so there is no target to verify in.
Its profile also rejects the nearest-looking substitute — fields verified by a
human curator at build time are not verified by the agent at consume
time; those are two different acts and collapsing them would launder one into
the other.
A generic contract that required all six would force a marking onto bundles
where it can only be misapplied. Requiring five and letting the sixth be
declared costs nothing and is exactly how the upstream record already reads:
F.11 settled five; G.13 approved the sixth separately, for a case defined by
being outside the bundle.
The extension rule
A consumption profile may add markings. It must declare them: the literal,
what it means for that bundle, and which required value it would otherwise
collapse into. An undeclared extension is the defect, not the extension —
[verified-in-target] itself exists because a fact read at its source was
falling to derived, reporting a checked fact as an inferred one.
Under this rule, both existing sets are conformant as they stand: the wiki
engine is five plus a declared [verified-in-target]; the second corpus is five
with no extension and an explicit statement of why the sixth does not transfer.
4. What a bundle-specific consumption skill must deliver to be conformant
A checklist, not a design. Each item is checkable by reading the skill — and items 2, 7 and 8 are checkable by re-running the command the skill states, which is the point of requiring a command rather than a claim.
- Names its production profile and bundle ref. Which profile the bundle is built under, and the ref the profile's structural claims were measured against (C2, §2).
- States its structural claims as commands, with denominators. File counts, type breakdown, index shape and depth, each with the command that produced it and the total it is a fraction of (C3, §2).
- States the retrieval unit and what would falsify it. Which unit is fetched (one concept, one section, one release), and the concrete observation that would show the choice wrong. A retrieval hypothesis with no falsifier is a preference.
- Enumerates conditionally-written fields and, for each, what absence does and does not mean (C5).
- Declares its marking set: the required five verbatim, plus any extension with its meaning and the required value it would otherwise collapse into (C1, §3).
- Draws the cut boundary explicitly: what the deterministic part reads,
ranks and cuts; what the agent is forbidden to go fetch; and how the cut is
surfaced in output as
[unread]rather than passing silently (C4). - Declares a retrieval budget and names the instrument. The bound the cut targets, as a number in a stated unit, with the tool that measures it and the known-good figures that tool was shown to reproduce first (C6).
- States its cost against the whole-bundle denominator, and its breaking point. What a typical answer costs to assemble, what the whole bundle at that ref would cost by the same instrument, whether cost tracks the question or the corpus, and the corpus size at which the strategy stops fitting the budget (C6). A skill that cannot state these has not measured its own cut.
- Enumerates a directory only where the named profile says the index is derived (§2) — a correctness rule and a cost rule at once.
- Carries its own quality claim honestly. If no run has been scored against its checklist, it says so. The one implemented precedent we have is explicitly unmeasured by its own admission, and was used here as a model for form, never as evidence that the form works.
5. What this does not decide, and what is owed elsewhere
- No skill is designed or built here, generic or bundle-specific. This document has no implementation follow-on queued.
- Where the first generic implementation would live — this repo's Python half, the Node half, or a skill — is untouched. Ownership of the contract does not carry ownership of an engine, and no consumer has asked for one.
- Not ours to fix, to be reported by coord: the wiki masterplan states three markings and has not been updated with the 2026-08-13 decision that settled five and approved a sixth. The decision is recorded in that repo's tracked state file; the document its own consumption engine names as requirements owner does not carry it. Reported, not edited (O2).
.claude's premise correction (§0) is owed back as a coord message: the ratification exists in the source repo; the query that found it absent was scoped to 16 of 639 files. (Sent; the correction is accepted and recorded upstream.)- Bundle shape is not decided here. C6 binds what a reading agent must be able to say about its retrieval. Whether a corpus is nested, split or branched so that a cheap cut exists at all belongs to the repo that produces it, and is under a separate order there. Deciding it from here would be O2.
- No instrument is named, shipped or blessed. C6 requires that a skill name the instrument it used and show it reproducing known-good figures. Which tool that is stays the skill's choice, because the unit is vendor-specific and fixing one would be the mistake C6's first paragraph refuses.
- No cost engine, ranker or cutter is designed here, in either runtime. C6 is a disclosure obligation on a document, not a retrieval algorithm, and nothing about how to achieve a cheap cut follows from it.