docs(prepass): before/after on K2, the mutation battery and the invariant row

Steg 8. Ingen produksjonskode i denne commiten utover de TRE testarmene tre GROENNE
mutasjoner tvang fram.

MAALING (`docs/2026-09-07-okf-prepass-i-debatten.md`), instrumentet validert mot en
kjent-positiv FOER foerste tall (K2 rotlisting = 3 954 tegn / 1 495 o200k-tokens,
S7a-3s publiserte tall eksakt; skriptet asserterer paa det og nekter aa rapportere
ellers):
- KUTTET paa levert K2: 629 = 621 + 8, tre regler navngitt. Payload paa disk 40 425
  tok; renderingen debatten ser 5 162 tok -- 87 % av kostnaden er withheld-lista, som
  aldri naar prompten.
- FOER/ETTER, tre armer fordi "FOER" ikke er ett tall. Like-for-like (en debatt som
  GAAR stigen mot det deklarerte kuttet): 10 prompter / 7 031 tok -> 3 prompter /
  10 641 tok. **+51 %, og dokumentet paastaar ikke at dette er en besparelse.** Det som
  kjoepes er nevnerne, et re-maalbart `ref`, og at stempelet slutter aa overdrive:
  siteringer 629 -> 8.
- SPOERSMAALET BASEN IKKE SVARER PAA: aatte arkitekttegninger, og **5,5x dyrere** enn
  det gode spoersmaalet (28 312 mot 5 162 tok). En TOM leveranse er bevis for fravaer;
  en FULL er IKKE bevis for tilstedevaerelse -- og med verktoeyene trukket har debatten
  ingen vei til aa oppdage det selv. Uttalt som den reelle handelen, ikke oppdaget i
  drift.

LOAD-BEARING: 32 mutasjoner, ALLE ROEDE mot HELE suiten, maks en per Bash-kall,
restaurert fra `scratchpad/` med `shasum -c` (aldri `git checkout`). Groenn kontroll
**1467 passed / 5 skipped** (fra 1387/5; **+80 node-ider, 0 fjernet**, maalt med `comm`
mot en baseline tatt foer foerste commit). Golden `shasum -a 1` av INNHOLDET =
ea8c534773acdbe41ae68f2c55724d69aaf8be4f, BYTE-UENDRET. `pyproject.toml` uroert.

TRE MUTASJONER VAR GROENNE FOERST, og alle tre var TESTFEIL -- ikke soemfeil. Ingen ble
droppet:
- M9: injeksjonsarmen satte `text_sha256` fra den INJISERTE teksten, saa
  `text_sha256`-grenen fyrte i stedet, og armen matchet paa "text" -- en DELSTRENG av
  `text_sha256`. En angriper kontrollerer begge avledede medlemmer, saa fixturen setter
  naa `text_sha256` til digesten av den EKTE teksten; da er likhetssjekken det eneste
  som staar i veien. Ny parallell arm beviser at de to sjekkene ikke er en sjekk.
- M18: fixturbasen navigerer til fire ikke-verdict-konsepter og payloadet leverer ALLE
  fire, saa "siter de leverte" og "siter alt navigerbart" ga SAMME sett. Armen flytter
  naa ett utdrag til `withheld` og asserterer `delivered < navigable` FOER den maaler.
- M32: uten raden falt kjoeringen gjennom til "--explore requires --explore-config",
  som ogsaa navngir `--explore`. Oekt 57s regel ordrett -- assert aldri paa en
  delstreng to nekter deler. Armen bruker naa en argv `--explore` ellers ville blitt
  AKSEPTERT paa.

Co-Authored-By: Claude <claude-opus-5>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-07 14:39:50 +02:00
commit 183191e51c
5 changed files with 385 additions and 15 deletions

View file

@ -1976,6 +1976,74 @@ Python ≥3.10. MAF (`agent-framework-core` 1.16.0, `-orchestrations` 1.1.1 —
`run_portfolio` tar INGEN reviewer, og fraværet er ASSERTERT; K2-prisene er SYNTETISKE og ingen
LEVENDE modell har svart på en review (structured-output-grensens klasse). Måling:
`docs/2026-09-04-major2-proposal-review-k2.md`.
- **Debatten kan få et DEKLARERT KUTT i stedet for pekeren, og kuttet kan ikke levere bytes basen
ikke holder (OKF-pre-passet, 07.09, ordre `20260907T080223Z`):** S2c ga debatten en peker og fire
navigatørverktøy, og den navigerer godt — målt 06.09 nådde en levende modell prisformen i TRE
steg av 630 konseptdokumenter. Det er samtidig et **UERKLÆRT kutt**: ingenting i kjøringen sa hvor
mange konsepter som ble vurdert, hvor mange holdt tilbake, eller etter hvilken regel.
Konsumkontraktens § 2.3 (`llm-ingestion-okf/docs/consumption-contract.md` @ `54a0bc2`, normativ)
kaller det en nevnersvikt forkledd som et svar — samme regel repoet alt holder under
`skipped_links`, `unkeyed_verdicts` og `cost_baseline_anchored`. `--prepass-payload FILE` gir
kjøringen et `okf-consumption/1`-payload: de leverte utdragene PLUSS de tre nevnerne.
**po produserer intet payload og vendrer ingen produsent** (§ 2.4: transporten er ikke del av
kontrakten) — en subprosess mot produsentens checkout ville bundet pakka til en sti på én maskin
og dødd i `git archive HEAD`; en kopi av et 1 038-linjers rangeringsinstrument er kø-(p).
**VERKTØYENE TREKKES under et payload** (§ 2.2: kontekst pre-passet holdt tilbake ble holdt
tilbake med vilje) — en debatt som holder BEGGE er fri til å gå rundt kuttet den nettopp
erklærte. MCP-appenden ligger BEVISST under forgreningen: dette trekker navigatørverktøyene, ikke
verktøylista (M17 → 4 røde). Målt: `tools=[]` når tråden som `tools: None`, så ingen uprøvd
tom-array-form innføres. **INJEKSJONSFLATEN ER LUKKET VED KONSTRUKSJON, ikke ved prosa:** `sha256`
digester HELE den monterte fila mens `text` er et AVLEDET medlem, så et payload kan bære korrekt
digest ved siden av vilkårlig tekst — og `text` er dét som lander i task-meldingen.
`verify_against_bundle` RE-UTLEDER teksten lokalt (frontmatter delt på `splitlines()`, NFC,
per-linje `rstrip` — TRANSKRIBERT fra produsentens kilde og MÅLT mot et ekte payload; en naiv
`split("\n")` er UENIG, M10 → 20 røde) og krever likhet, så et payload ikke kan levere bytes
basen ikke holder. Eksponeringen er dermed «basens eget innhold i prompten», som `read_file` alt
gjør; det som gjenstår er POSISJONEN, og teksten legges i en avgrenset DATA-blokk under
instruksjonen (§ 9.3) — lindring, uttalt som det. **De to gatene som bodde i det tilbaketrukne
`read_file` er reist på nytt på det MONTERTE dokumentet** (verdict-laget og § 4.1a), aldri
delegert til produsentens egne regler — produsenten ekskluderer verdict-laget selv, og dét er
nøyaktig grunnen til at en av repoets nyest gatede invarianter ikke kan hvile på en fil en ekstern
kaller leverte. **`delivered == 0` NEKTES ved navn før debatten**, med nevnerne, spørsmålet og
ref-en sitert: målt er den tilstanden bare nåbar når hvert konsept feilet leksikalsk, altså bevis
for FRAVÆR (§ 7.3s egen posisjon), og uten den falt kjøringen gjennom til siteringsvakten hvis
melding navngir `docs_dir``None` på denne stien. **Siteringene bygges av de LEVERTE
konseptene** (629 → 8 på K2): et stempel som siterte hele korpuset for et forslag som så åtte
dokumenter gjenoppfinner den uerklærte påstanden inne i selve etterprøvbarhets-artefaktet.
**`ref` bæres, aldri re-beregnet** — `sha256-tree` er produsentens algoritme; vi verifiserer de
leverte dokumentene, ikke hele treet (uttalt ærlighets-grense). `RunResult.prepass` og
`DryRunReport.prepass` DEFAULTER (`skipped_links`-halvdelen: `None` er det sanne utsagnet «ingen
payload ble gitt»); `ProvenanceStamp` er BEVISST urørt (stempelet beskriver gaten som dømte ÉN
kandidat). `prepass_notice` er ENESTE renderer, `None` uten payload, og omisjonen er gatet av
golden-transkriptet som uavhengig, eksisterende vitne (M23 → 2 røde).
`{run_id}-prepass.json` skrives IFF et payload ble gitt, fra `finally`, ved et DIREKTE kall (ikke
`_write_or_report`, hvis påkrevde `in_flight` bindes først i genererings-blokka og hvor `None`
ville latt en `OSError` fortrenge en `BudgetExceeded` i luften) — og tilstedeværelsen KVALIFISERER
`{run_id}-debate.json`s nå-alltid-tomme `tool_calls`, som ellers er uskillbar fra S2c-regresjonen
den fila skrives ubetinget for å synliggjøre. Seks CLI-nekter, hver ved NAVN med rc-0-kontroll;
`hosting.py` er BEVISST URØRT (MAJOR-4/S7b) — feltet er i ingen av de tre settene, så den
generiske 400-en svarer og Fase 4es to halvdeler står, gatet av en testarm i stedet for en
redigering. **Load-bearing MÅLT: 32 mutasjoner, ALLE RØDE mot HELE suiten** + grønn kontroll
**1467 passed / 5 skipped** (fra 1387/5; **+80 node-ider, 0 fjernet**, målt med `comm` mot en
baseline tatt før første commit) og golden `demo-transcript.stdout` BYTE-UENDRET (`shasum -a 1`
av INNHOLDET = `ea8c534773acdbe41ae68f2c55724d69aaf8be4f`). **TRE MUTASJONER VAR GRØNNE FØRST, og
alle tre var TESTFEIL** (vakuøs-gate-klassen, nittende til tjueførste gang): M9 satte
`text_sha256` fra den INJISERTE teksten, så `text_sha256`-grenen fyrte og armen matchet på
`"text"` — en DELSTRENG av `text_sha256`; M18s fixturbase leverer nøyaktig de fire konseptene
`bundle_citations` returnerer, så «siter de leverte» og «siter alt» ga SAMME sett; M32 falt
gjennom til «`--explore` requires `--explore-config`», som også navngir `--explore` (økt 57s
regel ordrett). **Ærlighets-grenser, uttalt:** ingen LEVENDE modell har lest et rendret kutt;
dette er IKKE en besparelse (like-for-like på K2: 7 031 → 10 641 prompt-tokens, +51 %, ti prompter
→ tre) men et DEKLARERT kutt og et re-målbart `ref`; en TOM leveranse er bevis for fravær mens en
FULL **ikke** er bevis for tilstedeværelse — målt returnerer «Hvilken farge har fyrtårnet i
Alexandria?» åtte arkitekttegninger, og **5,5× dyrere** enn det gode spørsmålet, mens debatten med
verktøyene trukket ikke har noen vei til å oppdage det selv; `--explore` er NEKTET, ikke løst, så
utforskningens eget kutt er fortsatt uerklært; `budget.limit` er produsentens valg (vi nekter
`spent > limit`, vi setter ikke taket, og testen binder OVERHEADET — O(levert tekst) + O(1) — ikke
totalen); og **pre-passet kan ikke lese en eneste av repoets egne baser** (ingen erklærer
`bundle_id` på rot-indeksen, S7a-3s måling sett fra produsentsiden, og `shared/` er pull-only), så
fixturen er bygget på en KOPI med erklært id. Måling:
`docs/2026-09-07-okf-prepass-i-debatten.md`.
- **STATE.md er local-only** (gitignored). Voyage session-state er efemert; STATE.md er kanonisk kontinuitet.
- Prosess: Voyage-plugin (`/trekbrief → /trekplan → /trekexecute → /trekreview`) per større fase.