docs(okf): §8 refined against okr's answer; record the wiki's opposite construction rule

Two findings from the inbox, both re-verified against the other repo's code
rather than its summary.

§8 -- the "contradiction" we flagged was ours to misread. We had SKILL.md:94
(union) against CLAUDE.md:67 (precedence) and asked okr to adjudicate, assuming
SKILL.md because it describes actual procedure. Right, and right for the stated
reason. Verified @52129b5: SKILL.md:35-36 "always search both, project first",
:46-47 "overrides ... ON CONFLICT", :94-95 "Glob both roots". Union is the
search SPACE; precedence is a tie-break that fires only when the same content
sits in both roots -- orthogonal, which is why one file carries both without
contradicting itself. okr fixed CLAUDE.md:67 ("else" implied a lookup stopping
at the first root). §8 stays OPEN at the convention level; only its description
of okr is refined -- retrieval carries union AND precedence as two layers, not
one axis each.

The wiki -- llm-ingestion-okf reported, unprompted, that claude-code-llm-wiki
requires exactly the construction rule §3/§6 forbids. Re-read here @59ef033:
validate.py:74 puts BUNDLE_INDEX_COMPLETE at ERROR, :1097-1104 derives expected
from the directory and demands bidirectional match, bundle.py:498 generates
indexes machine-side. This is not our trap sprung -- it is its mirror image,
chosen: we forbid derivation because a derived index CANNOT DISAGREE with the
directory and so hides what is missing, while they make "cannot disagree" an
enforced invariant with a loud outcome. Our index is a curated selection that
must be able to disagree; theirs must not be. Neither is incoherent.

Consequence (theirs): authored-vs-derived cannot be a library invariant in
either direction; it becomes policy. And the sharpest argument came back at us
-- a field carrying only "per-directory: yes" would have hidden the difference
entirely. That is a better case for splitting scope from construction than the
one we gave them.

Suite 78/78. Inbox emptied: 4 in, 2 replies, 2 closed without reply.
This commit is contained in:
Kjell Tore Guttormsen 2026-07-25 20:40:06 +02:00
commit 5ddc6c77a5
2 changed files with 42 additions and 4 deletions

View file

@ -398,6 +398,41 @@ protocol; 🟢 is reserved for the independent gate-verified step (operator veri
promise to notify llm-ingestion-okf on any `okf-check.mjs` change was honoured in the same round.
Suite **73 → 78** across the six test files. _(catalog session.)_
- **2026-07-25** — **The §8 "contradiction" was ours to misread, and okr's own doc was the thing
that was wrong.** We had flagged `SKILL.md:94` ("Glob both roots" = union) against `CLAUDE.md:67`
("project preferred, else home" = precedence) and asked okr to adjudicate, assuming SKILL.md
because it describes actual procedure. That guess was right, and right for the stated reason.
Verified here against their files @`52129b5`, not against their summary: `SKILL.md:35-36` "always
search both, project first", `:46-47` "Project content overrides home content **on conflict**
(most-specific-wins)", `:94-95` "Glob both roots". **Union is the search space; precedence is a
tie-break that only fires when the same content exists in both roots.** The two statements were
orthogonal all along — which is exactly why one file could carry both without contradicting
itself. okr corrected `CLAUDE.md:67` (the word "else" made it false by implying a lookup that
stops at the first root). **§8's status is unchanged — still OPEN at the convention level** — but
its *description* of okr was refined: retrieval carries union **and** precedence as two layers,
not one axis each. One hole, read from three sides independently (commons from the ordering axis,
okr from their own doc, us from the §8 text). _(catalog session, on okr's answer.)_
- **2026-07-25** — **A second consumer requires the exact construction rule §3/§6 forbids, and does
so deliberately.** llm-ingestion-okf reported it unprompted while deciding whether to make our
"authored enumeration, never a filesystem read" rule a library invariant. Re-read here out of the
wiki's own code @`59ef033`, not relayed: `validate.py:74` puts `BUNDLE_INDEX_COMPLETE` at
**ERROR**, and `:1097-1104` builds `expected` by enumerating the directory's files, then requires
the index links to match **bidirectionally**; `bundle.py:498` `_index_entries` is machine
generation ("Everything sorted, so regeneration is byte-identical").
- **This is not the trap we warned about — it is its mirror image, chosen.** Our rule exists
because a derived index *cannot disagree* with the directory, so it cannot reveal that something
is missing or misfiled: a silent failure mode. The wiki makes "the index cannot disagree with
the directory" an **enforced invariant with a loud outcome**. Our rule serves a convention whose
index is a curated selection with progressive-disclosure prose, i.e. one that *must* be able to
disagree; theirs serves one where it must not. Neither is incoherent inside its own spec.
- **Consequence accepted, and it is theirs, not ours:** authored-vs-derived cannot be a library
invariant in **either** direction. It becomes policy alongside the match rule; nothing in the
library enumerates a directory unless the profile in force says the index is derived.
- **The sharpest argument came back at us:** a policy field carrying only "per-directory: yes"
would have hidden this difference entirely — two consumers, identical surface requirement,
opposite construction rule underneath. That is a better argument for splitting *scope* from
*construction* than the one we gave them. _(catalog session, on llm-ingestion-okf's measurement.)_
## Distilled architecture notes (OKF round, 2026-07)
Durable conclusions from the cross-repo round (full working context retained by the catalog session):

View file

@ -160,10 +160,13 @@ gate to function.
- **OPEN — which root wins when there is more than one.** The two shapes above are *installed* and
*not installed*; okr is a third, **two marked installation roots at once**, and the marker
predicate answers "is this a bundle?" without answering "which of these do I read?". Nor is there
one answer: okr resolves it **per axis** — precedence for the org **profile** (project overrides
home, `inject-okr-context.mjs:54-56`) but **union** for **retrieval** (both roots globbed,
`okr-second-brain-search/SKILL.md:94`), because the roots carry *different content* rather than
two versions of the same. This costs nothing while placement stays descriptive. It becomes the
one answer: okr resolves it **per axis**. **Retrieval** globs **both** roots — union is the
*search space*, with project content winning **on conflict only** (`SKILL.md:35,46,95`); the
precedence there is a tie-break, not a lookup that stops at the first root. The org **profile**
is the one axis that truly short-circuits (project overrides home, `inject-okr-context.mjs:54-56`).
So union and precedence are not two axes but two *layers* on one: the roots carry *different
content* rather than two versions of the same, which is why the search cannot stop early even
though a conflict still needs a winner. This costs nothing while placement stays descriptive. It becomes the
first question a second implementer asks the moment marker-based discovery is proposed as
normative (§10, Stage 3), so it is named here rather than left implied by the two-shape framing.
**Unresolved; do not plan against an assumed answer.**