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:
parent
6a72b26985
commit
5ddc6c77a5
2 changed files with 42 additions and 4 deletions
|
|
@ -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.
|
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.)_
|
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)
|
## Distilled architecture notes (OKF round, 2026-07)
|
||||||
|
|
||||||
Durable conclusions from the cross-repo round (full working context retained by the catalog session):
|
Durable conclusions from the cross-repo round (full working context retained by the catalog session):
|
||||||
|
|
|
||||||
|
|
@ -160,10 +160,13 @@ gate to function.
|
||||||
- **OPEN — which root wins when there is more than one.** The two shapes above are *installed* and
|
- **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
|
*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
|
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
|
one answer: okr resolves it **per axis**. **Retrieval** globs **both** roots — union is the
|
||||||
home, `inject-okr-context.mjs:54-56`) but **union** for **retrieval** (both roots globbed,
|
*search space*, with project content winning **on conflict only** (`SKILL.md:35,46,95`); the
|
||||||
`okr-second-brain-search/SKILL.md:94`), because the roots carry *different content* rather than
|
precedence there is a tie-break, not a lookup that stops at the first root. The org **profile**
|
||||||
two versions of the same. This costs nothing while placement stays descriptive. It becomes the
|
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
|
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.
|
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.**
|
**Unresolved; do not plan against an assumed answer.**
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue