feat(okf): conform the context seam to the pulled navigation + stamp-integrity contracts
The commons pull (7aa53fc -> a2b57d2) rewrote method-spec §3 Step 1 and added two §11 seams. Measuring okf.py against the new normative text found six contradictions; this closes all six, gated by the commons-owned nav-goldens that came with the pull. method-spec §3 Step 1 (navigate_bundle / bundle_context): - follow cross-links RECURSIVELY, depth-first in first-seen order (there was no recursion at all — only the root index's links were read, so no hierarchy was navigable even with the other fixes in place); - resolve a leading `/` against the BUNDLE ROOT, anything else against the LINKING file's directory, and drop the retired "a path separator means out-of-bundle" heuristic, which conflated depth with escape and forbade valid nesting; - de-duplicate on the RESOLVED path (`./a.md` == `a.md` == `/a.md`), which is also what terminates cycles; - exclude index files by BASENAME at every level, so a nested index is navigation and never renders as content (flat rendering regardless of depth); - bind index_summary to the ROOT index alone. safe_resolve stays the sole in-/out-of-bundle test, fail-closed: a target that fails to resolve for ANY reason is skipped, never raised. ingest-spec §3 (write_concept_file): it is the repo's one authoring primitive that materialises a concept file from caller-supplied frontmatter, so it now refuses the COMPLETE ownership stamp (`generated: true` + `ingest_manifest`) with IngestStampError, while permitting either field alone. A validation, never a repair — nothing is written. Gates (tests/test_okf.py, 529 -> 537): - nav-golden-hierarchy and nav-golden-escape compared against the shipped expected-read-context.md fasit (trailing-whitespace normalisation only, which the fixture README explicitly permits; internal blank-line structure stays gated); - traversal order pinned separately from the rendered output, so a right-looking render from a wrong walk still fails; - unit seams for the recursion in isolation, resolved-path dedup, and the leading-`/` rule's breach case (a real out-of-bundle file addressed by its absolute path). Load-bearing MEASURED, not asserted: seven mutations each go red — detach the recursion, restore the separator prefilter, dedup on the raw target, read `/` as filesystem-absolute, render nested index bodies as content, drop the stamp guard, and the fully naive navigator with no boundary check (which is what makes the `/`-trap test bite). okf.py restored from a checksum-verified copy after each. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WetWTHpdRbqinN5XHFTaTb
This commit is contained in:
parent
bb877d241f
commit
0d50ab89d3
3 changed files with 288 additions and 29 deletions
17
CLAUDE.md
17
CLAUDE.md
|
|
@ -36,6 +36,23 @@ Python ≥3.10. MAF (`agent-framework-core` 1.9.0). Pakkehåndtering: `uv`. To b
|
|||
fra denne konteksten: tidligere dommer når hypotese-prompten KUN via den gatede ExpeL-folden.
|
||||
Load-bearing: `test_bundle_context_excludes_verdict_layer` + empty-store-kontrollen i
|
||||
`test_step1_expel_loadbearing.py` (realiseringssignalet lekker aldri inn via kontekst).
|
||||
- **Navigasjons-kontrakten er hierarkisk, og escape — ikke dybde — er forbudt** (`method-spec`
|
||||
§3 Steg 1): `navigate_bundle` følger cross-links REKURSIVT, dybde-først i først-sett-rekkefølge;
|
||||
ledende `/` betyr **bundle-rot** (aldri filsystem-absolutt), alt annet er relativt til den
|
||||
LENKENDE filas katalog; dedup skjer på **resolvert** sti (så `./a.md` == `a.md`, og sykler
|
||||
termineres). `safe_resolve` er den ENESTE inn-/ut-av-bundle-testen (fail-closed) — den erstattet
|
||||
den pensjonerte «separator = utenfor bundelen»-heuristikken, som forvekslet dybde med escape.
|
||||
Manglende `index.md` er feil KUN i bundle-rota (navigasjon følger lenker, aldri katalog-enumerering).
|
||||
Rendering er FLAT uansett dybde; nestede `index.md` er navigasjon, ikke innhold. Gaten er
|
||||
commons-eide nav-goldens (`shared/examples/nav-golden-*/expected-read-context.md`, byte-nivå
|
||||
fasit): `test_nav_golden_hierarchy_*` (positiv) + `test_nav_golden_escape_*` (negativ — en gate
|
||||
som bare kan bli grønn beviser ingenting).
|
||||
- **Kuraterte skrivere kan ikke forfalske ingest-stempelet** (`ingest-spec` §3): `write_concept_file`
|
||||
er repoets ene authoring-primitiv som materialiserer en konseptfil fra CALLER-oppgitt frontmatter,
|
||||
og avviser derfor det KOMPLETTE eierskaps-stempelet (`generated: true` + `ingest_manifest`) med
|
||||
`IngestStampError` — mens hver halvdel alene er lovlig (kuratert innhold kan bære ett
|
||||
provenance-felt). Validering, ALDRI reparasjon: ingenting skrives. Uten dette kunne en kuratert fil
|
||||
bli stille slettet av en senere re-materialisering, som fjerner nøyaktig det som bærer stempelet.
|
||||
- **Stoppkriterier + budsjett-tak påkrevd ved oppstart** (fail-fast, aldri ubegrenset loop).
|
||||
- **Group Chat maker-checker** som debatt-default (IKKE Magentic, som er eksperimentell).
|
||||
- **To falsifiserere, samme kandidat (Steg 3/4, målbilde §2/§6):** den deterministiske validatoren
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue