portfolio-optimiser/docs/2026-09-07-syretest-s7-prepass-k2.md
Kjell Tore Guttormsen de50764e5c docs(s7): a live model reads a declared cut -- three premises felled, four findings [skip-docs]
S7-syretesten med pre-passet, ende-til-ende paa K2 med LEVENDE modell
(gpt-4-1-mini). En MAALING: ingen fil under src/ er roert.

Hovedresultatet er den ene setningen docs/2026-09-07-okf-prepass-i-debatten.md
SS 6 sa ikke var bevist: en levende modell har naa lest et rendret kutt, og den
brukte kontraktens eget [sourced-not-sufficient] ordrett -- 1 forekomst i
renderingen, 1 i svaret, mens `withheld`/`622`/`630` sto i renderingen og i null
svar. Siteringer 8 mot 630. Revise-ordene naadde neste forsoeks prompt ordrett og
KUN der, og validatoren avviste oppfoelgeren: operatoeren ba om halvering,
modellen doblet, kjoeringen endte paa Rejection. Det er MAJOR-2s D6 i levende
form.

Tre premisser ble felt FOER noe ble betalt, og de er rapportert i stedet for
omgaatt:

  1. Ordrens steg-3-kommando finnes ikke. --prepass-payload + --explore nektes
     ved konstruksjon, og --plan-review krever --explore. Maalingen gikk gjennom
     de to doerene som finnes: debatten (kuttet) og --proposal-review (revisen).
     Utforskningens eget kutt er dermed fortsatt uerklaert.
  2. Steg 6s IR-nekt fyrer ikke lenger. S7b soem 1 gjorde projeksjonen valgfri,
     og alle tre armene kjoerte hele loekka uten validator-input.json.
  3. S7a SS 4s «adjudication 0/39» gjaldt en eldre, usegmentert base. K2 baerer
     noekkelen i 618 av 630 -- men `verified` er 0/630, saa K5 diskonterer
     fortsatt hvert konsept. Den kjent-positive kontrollen flipper gaten.

Bundelen er bygget fra raakorpuset paa produsentens fbaac6d. Doera lukker
(merged + coded rejections = 43 = N), 630 konsepter, ref sha256-tree:4ffd750c...
Den er IKKE byte-identisk med K2-bundle-20260903: 619 filer skiller seg, 618 av
dem kun paa ingested_at.

Fire funn, ingen fikset:
  F1 (kryss-repo) okf build --ingested-at naar 11 av 629 konsepter; segmenterte
     faar 1970-defaulten, saa en bundle ikke kan reproduseres byte-likt fra sitt
     eget raakorpus.
  F2 (kryss-repo) rot-indeksen lenker naa log.md, som dermed blir et navigerbart
     konsept (629 -> 630) og kan siteres i stempelet.
  F3  read_dir paa et katalognavn utledet av et konseptNAVN nektes to ganger paa
     rad -- STATEs aapne K2-funn 3, naa observert live.
  F4  en uforankret kjoering dikter kostkoder. Stage 0 er hoppet over, og alle
     tre armene fant paa kostlinjer. S4.0s begrunnelse i drift.

Kuttet holdt tilbake prisskjemaet (below_k) for S7as eget mandat-spoersmaal,
mens fri navigasjon naadde det i fire steg. Kuttet er identisk paa begge
bundlene, saa ingested_at-driften endrer ref, ikke utvalget.

Instrumentet er validert mot en kjent positiv FOER hvert tall: rotlistingen paa
levert K2 = 3 954 tegn / 1 495 o200k-tok over 629 konsepter, assertert i
maaleskriptet. Refen paa levert base reproduseres uavhengig som
sha256-tree:9a4e5561..., ordrett det 07.09-dokumentet publiserte.

Kostnad NOK 1,11 av taket paa 5 (22 %), 0 stk 429, stoerste enkeltkall 23 057
tokens. Azure-konfigurasjonen er uendret; endepunktet utledes inline og er aldri
lagret i fil. Suite 1467 passed / 5 skipped, ruff + mypy rene, golden
demo-transcript.stdout byte-uendret.

Ordre: 20260907T125216Z-9858825824-from-.claude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 16:07:29 +02:00

488 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Syretest S7 med pre-passet — K2 → kunnskapsbase → deklarert kutt → LEVENDE modell → revise
**Dato:** 2026-09-07 · **Ordre:** `20260907T125216Z-9858825824-from-.claude` ·
**Grunnlag:** `~/.claude/docs/helhetlig-plan-okf-og-portfolio-optimiser.md` § 5, § 9.1/9.2 ·
**Forrige ledd:** `docs/2026-09-03-syretest-s7a-k2.md` (tørr) og
`docs/2026-09-07-okf-prepass-i-debatten.md` (kuttet, uten levende modell).
Dette er en **måling**. Ingen produksjonskode er endret; hele måleoppsettet ligger utenfor treet
(`scratchpad/s7-prepass/`, utracket) og hver tabell under er produsert av en kommando som står i
teksten. Fire defekter og tre felte premisser er **rapportert, ikke fikset** — det er ordrens egen
regel.
---
## 0. Hva som ER målt, og hva som IKKE er det
**Målt her:** at en **LEVENDE modell leser et rendret kutt** — den ene setningen
`docs/2026-09-07-okf-prepass-i-debatten.md` § 6 sa ikke var bevist. Bundelen bygget fra råkorpuset
på produsentens `fbaac6d`, dens identitet mot den leverte, pre-passets nevnere, kontraktsjekken,
tre betalte armer (kutt/approve, kutt/revise, fri navigasjon/approve), tokenprofil per fase fra
BudgetMiddleware-ledgeren og fra et uavhengig instrument, siteringene i stempelet, K5-terskelen med
kjent-positiv kontroll, og kostnad i NOK mot Microsofts egne NOK-listepriser.
**IKKE målt:** at en modell dømmer **bedre** med et deklarert kutt enn med fri navigasjon. Tre
kjøringer på ett manus er ikke et utvalg, og de to armene endte på ulike forslag av grunner som
ikke er isolert her. Samme klasse som structured-output-grensen. Heller ikke målt: at `sha256-tree`
dekker hele treet (vi verifiserer de leverte dokumentene), og ikke at prisene i K2 er ekte — de er
ikke fylt ut i det hele tatt, se § 2.
**Kjent-positiv, kjørt FØRST og assertert i hvert eneste måleskript:** rotnivå-listingen på
**levert** K2 måler **3 954 tegn / 1 495 o200k-tokens over 629 konseptfiler** — S7a-3s publiserte
tall, eksakt. `scratchpad/s7-prepass/live_s7.py` `assert`-er på trippelen og nekter å kjøre videre
hvis den ikke reproduseres; utskriften står øverst i hver armlogg. En andre, uavhengig
kjent-positiv falt ut av § 1: `okf_consume.py` mot den leverte bundelen gir
`sha256-tree:9a4e5561…a968b5`, ordrett refen `docs/2026-09-07-okf-prepass-i-debatten.md` § 1
publiserte.
---
## 1. Bundelen: bygget fra råkorpuset, og hva den er identisk med
```bash
cd ~/repos/llm-ingestion-okf && git rev-parse --short HEAD # fbaac6d
uv run okf build ~/corpora/okf-telling-20260829/K2/trinn1 \
--bundle <scratchpad>/k2-bundle-s7 \
--bundle-id k2-trinn1-20260903 --okf-version 0.2 \
--ingested-at 2026-09-03T00:00:00Z --report <scratchpad>/build-report.json
```
Ingen `--outline-run` / `--table-grid` — Arm B, produktveien slik den leveres.
| Egenskap | Målt |
|---|---|
| Døra (bevaringsidentiteten) | `merged + coded rejections = 43; N = 43` ✔ |
| — substantive / degenerate / rejected | **39 / 0 / 4** |
| — avvisningskoder | `extractor_empty_pdf` 1, `extractor_unknown` 3 |
| Veggklokke | **805,74 s** total, 18,738 s per fil |
| Konverterer | pandoc **3.9** (pinnet, `pypandoc`-bundlet) |
| Konseptfiler (`context_files`) | **630** |
| Filer totalt (`files`) | 1 108 |
| Ufulgte kryss-lenker (`skipped`) | **0** |
| `bundle_id` / opphav | `k2-trinn1-20260903` / **`declared-index`** |
| `ref` (`sha256-tree`) | `sha256-tree:4ffd750cec9b2905613bdd15167f8066b5165a0ce9c92a24c522f07fddf25273` |
### Byte-identisk med `K2-bundle-20260903`? **NEI** — og de 619 diffene er to ting, ikke tilfeldig støy
```bash
diff -r <scratchpad>/k2-bundle-s7 ~/corpora/okf-telling-20260829/K2-bundle-20260903
# exit 1, 3 093 linjer, 619 filer skiller seg, 0 "Only in" (identisk filsett)
```
| | Antall |
|---|---|
| Filer som skiller seg | **619** av 1 108 |
| — kun på `ingested_at`-linja | **618** |
| — rot-`index.md` (én linje) | 1 |
| Filer bare i den ene | **0** |
| Diff-linjer som ikke er `ingested_at` | **1** (`- [Corpus run history](log.md)`) |
**(a) `--ingested-at` når 11 av 629 konsepter.** Den nye bundelen bærer
`ingested_at: 2026-09-03T00:00:00Z` i **11** filer og standardverdien `1970-01-01T00:00:00Z` i
**618**; den leverte bærer `2026-09-03` i alle **629**. De 11 er nøyaktig de udelte
hel-dokument-konseptene (`inbox-*.md`); de 618 er de segmenterte. Flagget dokumenterer seg selv som
«stamped verbatim», og det gjør det for én av to skriveveier. **Kryss-repo-funn for
`llm-ingestion-okf`** — rapportert, ikke fikset (§ 10, funn 1).
**(b) Rot-indeksen lenker `log.md` i dag; den leverte gjør det ikke.** Fila finnes i BEGGE (590 B,
identisk), men navigasjonen følger kryss-lenker — så `navigate_bundle` returnerer **630**
konseptfiler mot den leverte bundelens **629**. Korpus-kjøringens egen logg blir dermed et
dokument agentene kan lese. Det er en produsent-side endring mellom 03.09 og i dag, ikke et
avvik i konsumenten (§ 10, funn 2).
**Refene skiller seg, og det er dét de er til for:** `4ffd750c…` mot `9a4e5561…`. `ingested_at`
er innhold, så et tidsstempel som glapp forandrer treets hash — nøyaktig egenskapen som gjør en
kjøring re-målbar.
---
## 2. Pre-passet: nevnerne, kontraktsjekken, og det kuttet ikke leverte
```bash
uv run python tools/okf_consume.py <scratchpad>/k2-bundle-s7 \
--question "Finn kostnadsbesparelser i Stange skole-anbudet" --out <scratchpad>/payload-s7.json
uv run python tools/okf_contract_check.py --skill skills/okf-consume/SKILL.md \
--payload <scratchpad>/payload-s7.json # exit 0
```
Spørsmålet er S7as mandat-spørsmål ordrett (`docs/2026-09-03-syretest-s7a-k2.md` § 2).
| | Målt |
|---|---|
| considered | **630** |
| withheld | **622**`no_lexical_match` 359, `below_k` 261, `over_budget_alone` 2 |
| delivered | **8** |
| identiteten lukker | 630 = 622 + 8 ✔ |
| kontraktsjekk | **exit 0** — «conformant: 14 rules over 8 excerpts and 622 withheld entries, 0 findings» |
| payload på disk | 169 656 B / 57 332 o200k-tok |
| **renderingen debatten ser** | **75 341 tegn / 22 283 o200k-tok** |
| pekeren FØR-armen ser | 325 tegn / **99** o200k-tok |
| veggklokke | ~0,8 s |
### Kuttet holder tilbake prisskjemaet, og det er dagens skarpeste funn
For spørsmålet **«Finn kostnadsbesparelser …»** er
`del-ii-bilag-7-prisskjema/prissammenstilling-sheet-1` holdt tilbake under regelen **`below_k`**.
Det er den eneste posten i hele K2 som bærer en pris (S7a § 6.2: post 82, 5 647 500 NOK), og med
navigatørverktøyene trukket har debatten **ingen vei** til den.
Dette er ikke en hypotese: **arm C i § 4 nådde nøyaktig det dokumentet, live, i fire steg.** Det
gode spørsmålet fra 07.09 («Hva er enhetsprisen for kostkode 21.1 …») leverte det; det
mandat-formede spørsmålet gjør det ikke. Kostnaden ved et kutt følger altså ikke bare hvor godt
spørsmålet passer basen, men hvor **spesifikt** det er formulert — og et mandat er per konstruksjon
bredt.
**Kontroll som gjør observasjonen skarp:** kuttet er **identisk** på de to bundlene. Samme 8
leverte konsept-ider, samme regelfordeling bortsett fra den ene ekstra `no_lexical_match` (= `log.md`).
`ingested_at`-driften i § 1 endrer altså `ref`, ikke kuttet.
---
## 3. Ordrens steg-3-kommando er STRUKTURELT NEKTET — premisset felt før noe ble betalt
Ordren ber om `--explore … --prepass-payload … --plan-review`. Kjørt ordrett:
```
run refused: --prepass-payload and --explore cannot be combined (the exploration navigates the
whole knowledge base with the same four tools the payload withdraws, so the run as a whole would
read far outside the cut it declares) # rc = 1
```
Og uten `--explore`, med `--plan-review` beholdt:
```
run refused: --plan-review requires --explore (there is no plan to review without an exploration,
so the flag would be accepted and then never used) # rc = 1
```
Begge nektene er **bevisste og gatede** (`docs/2026-09-07-okf-prepass-i-debatten.md` § 5, M32; F4).
Kombinasjonen kan ikke kjøres, og en måling som omgikk nekten ville målt en flate som ikke finnes.
**Det som ble kjørt i stedet, og hvorfor det er ordrens sak og ikke en erstatning for den:** ordren
sier selv hva den måler — «ingen LEVENDE modell har lest et rendret kutt». Døra som gir en levende
modell et rendret kutt er **debatten** (`--prepass-payload` uten `--explore`), og døra som gir et
menneske en revise på det som ligger på bordet er **`--proposal-review`** (MAJOR-2), som ikke er
nektet sammen med et payload. Steg 3 og steg 4 er derfor kjørt gjennom de to dørene som finnes.
**Konsekvensen, uttalt:** ordrens steg 4 ber om et *forbedret mandat*. Uten utforskning finnes
intet mandat, så det som er målt er *forbedret forslag* — § 5s egen ordlyd
(«Feedback → forbedret», «diff mellom første og andre forslag ikke tom»). **Utforskningens eget
kutt er fortsatt uerklært**, akkurat som `docs/2026-09-07-okf-prepass-i-debatten.md` § 6 sa. Denne
ordren lukker det ikke.
---
## 4. Tre betalte armer, samme base, samme spørsmål, samme økt
Alle roller LEVENDE mot Foundry `gpt-4-1-mini`. Innsprutspunktet er `run._default_factory`
(Fase 4e), ingen fil under `src/` er rørt. `PACE_SECONDS=2`, Azure-konfigen fra STATE **UENDRET**.
```bash
uv run --with tiktoken python scratchpad/s7-prepass/live_s7.py {A|B|C}
# argv: K2 --profile azure --docs-dir <base> --bundle-dir <base> --proposal-review
# --outbox-dir … --run-id … [+ --prepass-payload <fil> for A og B]
```
| | **A — kutt, approve** | **B — kutt, revise** | **C — fri navigasjon, approve** |
|---|---|---|---|
| prompter totalt | **5** | 6 | **15** |
| — debatt / generering | 2 / 3 | 2 / 4 | 7 / 8 |
| BudgetMiddleware-ledger | **70 007** | 71 466 | **69 255** |
| input-tokens (leverandør) | 69 043 | 70 084 | 67 846 |
| output-tokens | 964 | 1 382 | 1 409 |
| største enkeltkall (input) | 22 874 | 23 057 | **14 119** |
| prompt-tokens, debatt (instrument) | **44 913** | 44 959 | **21 608** |
| prompt-tokens, generering | 816 | 1 488 | 1 235 |
| debatt-verktøy | **0** | 0 | 4 |
| verktøykall | **0** | 0 | **10** |
| **siteringer i stempelet** | **8** | **8** | **630** |
| nevnere annonsert på stdout | **630 = 622 + 8, tre regler** | ja | **ingen** |
| `{run_id}-prepass.json` | skrevet | skrevet | **ikke skrevet** |
| utfall | **ValidatedProposal** | Rejection (§ 5) | ValidatedProposal |
| 429 | 0 | 0 | 0 |
**Deklarasjonen som når operatøren, ordrett fra arm A:**
```
Knowledge base: a DECLARED CUT was used — 8 of 630 concept(s) delivered, 622 withheld by rule:
below_k (261), no_lexical_match (359), over_budget_alone (2). Base k2-trinn1-20260903 at ref
sha256-tree:4ffd750c…f25273; cut computed for: Finn kostnadsbesparelser i Stange skole-anbudet
```
### En levende modell brukte kontraktens eget nekt-vokabular
Arm A, proposerens svar, ordrett:
> `[sourced-not-sufficient for exact quantified saving estimate, but document clearly emphasizes marking breadth and durability, implying potential for cost savings by optimizing marking scope]`
**Kontrollen er bærende:** markøren står **1** gang i renderingen modellen fikk (§ 4 i
konsumkontrakten, gjennom `prepass.render_context`), og **1** gang i modellens svar. Den er
altså ikke bare til stede i instruksjonen — den ble **brukt**, på nøyaktig det den finnes for: at
de leverte dokumentene ikke bærer et kvantifisert anslag. **Første gang målt.**
Motprøven, med nevner: markørene `withheld` (2), `622` (1) og `630` (2) står i renderingen, og
**ingen av dem** forekommer i noe modellsvar i noen av de tre armene. Modellen tok altså
*nekt-vokabularet* i bruk, men gjentok aldri *nevnerne*.
### Arm C nådde prisskjemaet — kuttets blindsone, målt
`{run_id}-debate.json`, i kallrekkefølge:
```
list_bundles → read_bundle(k2-trinn1-20260903) → read_dir(del-ii-bilag-7-prisskjema)
→ read_file(del-ii-bilag-7-prisskjema/prissammenstilling-sheet-1.md)
→ read_dir(del-ii-bilag-6-teknisk-oppsett) ← NEKTET
→ read_dir(del-ii-bilag-6-teknisk-oppsett.md) ← NEKTET
→ read_file(inbox-del-i-vedlegg-5-…-tildelingskriterier.md)
→ list_bundles → read_bundle → read_file(samme)
```
Fire steg til prisskjemaet, av 630 konseptdokumenter. **Det er dokumentet kuttet holdt tilbake.**
**Prisskjemaet koster 4 075 o200k-tokens, ikke 100 000.** Fila er 101 067 **tegn**, men den er en
pandoc SIMPLE table med lange mellomrom-løp, og de tokeniserer effektivt (24,8 tegn/token).
Leverandørens egen delta for det kallet er ~4 130 tokens. **Dette nyanserer STATE-ens åpne
K2-funn 4** («ett 101K-dok kan spise run-taket»): for *dette* dokumentet gjør det ikke det. De to
dokumentene S7a § 1d målte til 121 462 og 119 909 **tokens** er prosa-PDF-er og en annen sak; de
ble ikke åpnet her.
### Forankring: begge armer bygger på det de faktisk så
Ordrens «refererte konsept-id-er ∩ delivered / refererte» er **ikke målbar** slik den er formulert:
**nevneren er 0**. Ingen av de to kutt-armene skrev en eneste konsept-id-formet streng i noe svar —
modellen refererer i prosa («the detailed section on marking in the technical general
requirements»), aldri ved id. Rapportert som «ikke målt», ikke som null.
Det som *kan* måles er om forslaget handler om noe som står i det armen så. Ordoverlapp er
ubrukelig (modellen svarer engelsk, basen er norsk — en instrumentgrense, ikke et funn), så det er
målt på de norske fagtermene:
| Arm | Forslaget handler om | Målt i det armen så |
|---|---|---|
| A (kutt) | merking/gravering | `merking` 14 · `merkes` 21 · `gravert` 7 · `graverte` 6 — alle i **1 av 8** leverte utdrag (`…bilag-1-1-generelle-tekniske-krav`) |
| C (navigasjon) | klimakriterier som tildelingskrav | `klima` 90 · `tildelingskriterier` 20 — i dokumentet navigatøren **åpnet** (`…vedlegg-5-begrunnelse-for-bruke-krav…`) |
**Kontroll:** `merking` forekommer **0** ganger i prisskjemaet, altså i det arm C åpnet og arm A
ikke fikk. De to forslagene er forskjellige fordi de to armene så forskjellige ting.
---
## 5. Revise-sløyfa: ordene når fram ordrett, og validatoren beholder siste ord
```bash
# stdin: "revise Anslaget hviler paa dokumenter kuttet ikke leverte. Bind forslaget til
# kostlinjer som faktisk staar i de leverte utdragene, og halver claimed_saving_nok."
```
| Ledd | Målt |
|---|---|
| Døra stilte spørsmålet | ja — `PROPOSAL REVIEW #2 — K2`, kandidaten validatoren nettopp aksepterte |
| Tilbakemeldingen i artefaktet | **ordrett**, `honoured: true`, `attempt: 1`, dom-nøkkel `208da36e54abdfb7` |
| Tilbakemeldingen i neste forsøks prompt | **ordrett**, i prompt #5 og **kun** der (nevner: 6 prompter) |
| Forsøket ble kjøpt under EKSISTERENDE tak | ja — `attempts remaining: 1`, ingen ny løkke |
| **Diff mellom forslag 1 og 2** | **ikke tom** (under) |
| Endelig utfall | **Rejection**`claimed saving 660000 exceeds P90 feasible 351981` |
| stdout | `proposal review: 1 answer(s) across 1 candidate(s) — 0 approve, 1 revise` |
| | Forslag 1 (validert) | Forslag 2 (etter revise) |
|---|---|---|
| kostlinjer | `RITB_Hours` 1200 × 850, `SystemIntegrator_Hours` 1000 × 900 | `RITB-HOURS` 500 × 1200, `SYSINT-HOURS` 400 × 1300 |
| `claimed_saving_nok` | **320 000** | **660 000** |
**Operatøren ba om å HALVERE anslaget; modellen DOBLET det.** Ordene nådde prompten ordrett, ble
prosedyremessig etterkommet (`honoured: true` betyr at forsøket ble kjøpt og hentet et svar), og
innholdet gikk motsatt vei. Så **validatoren avviste**. Det er MAJOR-2s **D6 i levende form**:
*validatorens siste dom vinner, aldri revieweren sin* — mennesket er en tredje stemme som gater
ingenting utover å be om ett forsøk til. Kjøringen ender ærlig på `Rejection`, ikke på et forbedret
utfall ingen falsifiserer sa ja til.
**Første forsøk (B1) nådde aldri døra**, og det står her fordi det er en egenskap ved målingen:
med identisk argv bortsett fra stdin uttømte den første kjøringen `max_attempts` uten at noen
kandidat validerte (`claimed saving 300000 exceeds P90 feasible 96196`), og stdout sa
`proposal review offered, never consulted (no candidate validated)` — akkurat den raden
MAJOR-2-invarianten innførte for at stillhet ikke skulle bli tvetydig. Begge kjøringene er betalt
og talt i § 9.
---
## 6. Mot S7a (03.09, tørr) og mot dagens FØR-arm
| | S7a 03.09 (skriptet) | 07.09 FØR, går stigen (skriptet) | **07.09 arm C, LEVENDE** | **07.09 arm A, LEVENDE + kutt** |
|---|---|---|---|---|
| base | 39 konsepter | 629 | **630** | **630** |
| modell | skriptet | skriptet | **gpt-4-1-mini** | **gpt-4-1-mini** |
| prompter | 13 | 10 | **15** | **5** |
| prompt-tokens (instrument) | 40 320 | 7 031 | **22 843** | **45 729** |
| verktøykall | 3 | 3 | **10** | **0** |
| siteringer | — | 629 | **630** | **8** |
| nevnere | ingen | ingen | **ingen** | **630 = 622 + 8** |
**Like-for-like er de to siste kolonnene: +22 886 instrument-tokens (+100 %) og ti prompter
færre.** Målt på leverandørens egen `usage` er forskjellen derimot **+1 197 tokens (+1,8 %)**
(69 043 mot 67 846) — fordi arm C betaler for femten prompter med voksende historikk, mens arm A
betaler for to store og tre små. **Kuttet er altså ikke dyrere i praksis her; det er dyrere per
prompt og billigere per kjøring.** Det er en annen konklusjon enn 07.09s skriptede
+51 %, og grunnen er at den skriptede FØR-armen bare gikk tre trinn mens en levende navigatør gikk
ti.
Tallene er **ikke** direkte sammenlignbare med S7as 40 320: den kjøringen var en *utforskning*
en 39-konsepts base, disse er *debatter* på en 630-konsepts base.
---
## 7. Falsifisering mot proveniens (K5-terskelen)
**S7a § 4s premiss er ikke lenger sant om denne bundelen, og det er en korreksjon:** S7a målte
`adjudication` til **0 av 39**. Dagens build bærer den i **618 av 630**, sammen med `segment_id`,
`source_offset` og `bundle_id` — den segmenterte provenienss-formen B4 ble skrevet for. **Den
leverte `K2-bundle-20260903` bærer nøyaktig det samme** (målt), så dette er ikke en endring i dag;
det er S7as tall som gjaldt en eldre, usegmentert 39-konsepts bundle.
Terskelen flytter seg likevel ikke, og det er poenget:
| | K2 slik den er bygget | Kjent-positiv kontroll (patchet kopi) |
|---|---|---|
| `adjudication_for` (prisskjemaet) | **`proposed`** | `adjudicated` |
| `(state, reason, items_seen)` | `(absent, None, 0)` | `(present, None, 1)` |
| `trust_tier` | `None` | `human-reviewed` |
| `admits_falsification` | **`False`** | **`True`** |
Over alle 630, med nevner: `adjudication` `proposed` **618** / `unknown` 12 · `evidence.state`
`absent` **630/630** · `trust_tier` `None` **630/630** · `admits_falsification` `False`
**630/630**.
**K5 hviler på `verified`, ikke på `adjudication`,** og `verified` er fraværende i hele korpuset
(0/630, ved siden av `sources` 0/630). Kontrollen er bærende: uten den er «alle 630 diskontert»
ikke til å skille fra «funksjonen diskonterer alltid». Kopien der ett konsept får
`verified: { by: human:ktg, at: … }` flipper gaten `False → True`. Den bygde bundelen er aldri
skrevet til.
---
## 8. Ordrens steg 6: premisset er felt, ikke bekreftet
Ordren sier at nekten `IR projection not found in bundle: 'validator-input.json'` (S7a § 2) «er
KJENT og forventet på K2 … dokumentér at den fortsatt nekter med samme melding».
**Den nekter ikke lenger.** Målt mot HEAD, på en base uten fila:
```bash
ls <base>/validator-input.json # No such file or directory
uv run python -m portfolio_optimiser.run K2 --bundle-dir <base> --docs-dir <base> --live-dry-run …
# rc = 0 — "K2: LIVE-DRY-RUN OK …"
```
Grunnen står i CLAUDE.md: **S7b søm 1 (økt 83) gjorde IR-projeksjonen valgfri**
(`okf.load_optional_ir_projection`), nettopp for at et ingestert anbudskorpus skulle kunne kjøre.
Meldingen finnes fortsatt (`okf.py:1568`), men den fail-faste loaderen kalles ikke lenger fra
`run_project`s bundle-arm; `verdicts.bundle_candidate_features` og `run.py:2038`s dispatcher-kilde
er dens gjenværende kallsteder. De tre betalte kjøringene i § 4 er selve beviset: alle tre kjørte
hele løkka på en base uten `validator-input.json`.
**Bivirkningen er synlig og annonsert:** `Cost baseline: NONE in the bundle — this run is
un-anchored`. Se § 10, funn 4.
---
## 9. Kostnad
**Listepris, Azure Retail Prices API** (`api-version=2023-01-01-preview`, `currencyCode='NOK'`,
`armRegionName=eastus`, hentet **2026-09-07**), metere `gpt 4.1 mini Inp/Outp glbl Tokens`
identiske med dem `docs/2026-09-06-major2-levende-k2.md` § 1 målte:
input **NOK 0,003734 / 1K**, output **NOK 0,014936 / 1K**.
| Kjøring | Prompter | Input | Output |
|---|---|---|---|
| A — kutt, approve | 5 | 69 043 | 964 |
| B1 — kutt, revise (nådde ikke døra) | 7 | 70 604 | 1 452 |
| B — kutt, revise | 6 | 70 084 | 1 382 |
| C — fri navigasjon, approve | 15 | 67 846 | 1 409 |
| klient-probe (`test_foundry_profile_live`) | 1 | ~20 | ~5 |
| **SUM** | **34** | **277 597** | **5 212** |
**NOK 1,036 + 0,078 = NOK 1,11 — 22 % av taket på NOK 5. 429-svar: 0.**
Største enkeltkall er **23 057 tokens**; § 5s kriterium («ingen enkeltpost > 100 000 uten navngitt
grunn») er ikke utløst. Takene (`max_rounds=3`, `max_tokens=100 000`, `max_attempts`) er **URØRT**,
og ingen kjøring traff dem.
---
## 10. Funn — rapportert, ikke fikset
1. **`okf build --ingested-at` når 11 av 629 konsepter** (§ 1a). Segmenterte konsepter får
standardverdien `1970-01-01T00:00:00Z` uansett hva flagget sier. Flagget dokumenterer seg selv
som «stamped verbatim». Konsekvensen er at en bundle bygget med et eksplisitt tidsstempel ikke
kan reproduseres byte-likt fra sitt eget råkorpus. **Kryss-repo, `llm-ingestion-okf`.**
2. **Rot-indeksen lenker `log.md`, som dermed blir et navigerbart konseptdokument** (§ 1b).
`context_files` går 629 → 630, og korpus-kjøringens egen logg kan leses av agentene og
siteres i stempelet. Om det er ønsket er produsentens avgjørelse; at det er en endring mellom
03.09 og i dag er målt. **Kryss-repo, `llm-ingestion-okf`.**
3. **`read_dir` på et katalogNAVN utledet av et konseptnavn nektes to ganger på rad** (§ 4).
Live traff modellen `read_dir('del-ii-bilag-6-teknisk-oppsett')` og deretter
`read_dir('…-teknisk-oppsett.md')` — begge `BundlePathNotFound`. Dette er STATE-ens åpne
**K2-funn 3-resten**, nå observert på en fersk base med en levende modell. Nekten er korrekt
(det er en konseptfil på rota, ikke en katalog), men den koster to runder.
4. **En uforankret kjøring er ærlig, men kandidaten er oppdiktet** (§ 8). Med
`cost_baseline_anchored: False` er validatorens stage 0 hoppet over, og alle tre armene
produserte kostkoder modellen fant på (`ENGRAVE_MARK`, `RITB_Hours`, `Material_Cost_Concrete`).
Stage 2/4/5 dømte tallene mot hverandre og gjorde jobben sin, men **ingenting knyttet linjene til
K2**. Det er nøyaktig S4.0s begrunnelse, sett i levende drift, og det er en grunn til at
`--derive-cost-baseline` (MAJOR-4) hører sammen med en ekte leveranse.
5. **Kuttet holder tilbake prisskjemaet for et mandat-formet spørsmål** (§ 2). Ikke en defekt i noen
komponent — pre-passet gjør nøyaktig det det sier — men den operative konsekvensen er at et
deklarert kutt bestilt på et bredt mandat kan utelate det ene dokumentet analysen trenger, uten
at debatten kan oppdage det.
---
## 11. Ærlighets-grenser, uttalt
- **Tre kjøringer er ikke et utvalg.** At kuttet gir bedre eller verre forslag enn fri navigasjon
er **ikke** vist; de to armene så ulike dokumenter og endte ulikt, og det er alt som er målt.
- **Ordrens steg 3/4-kommando finnes ikke** (§ 3). Utforskningens eget kutt er fortsatt uerklært.
- **B ble kjørt to ganger** fordi den første ikke nådde review-døra. Begge er talt i kostnaden, og
at en av to kjøringer med identisk argv ikke validerte er en egenskap ved en levende modell —
ikke ved døra.
- **`sha256-tree` bæres, ikke re-beregnes.** Vi verifiserer de leverte dokumentene mot de monterte
bytene; en endring i et dokument payloadet ikke leverte fanges ikke.
- **Prisene i K2 er ikke fylt ut i det hele tatt.** Ingen validert besparelse er forventet eller
funnet; S7bs syntetiske fixtur er ikke brukt her (den er S7bs sak, ikke denne ordrens).
- **Ordoverlapp mellom engelsk modell-output og norsk base måler ingenting** (§ 4). Forankringen er
derfor målt på fagtermer, som er svakere enn en id-join ville vært — og id-joinen er ikke mulig
fordi modellen aldri skriver id-er.
- **`--ingested-at`-funnet er målt på ÉN kjøring** av ett korpus. At det gjelder alle segmenterte
skriveveier er ikke vist.
---
## 12. Verifiseringslogg
| # | Påstand | Kommando → resultat |
|---|---|---|
| 1 | Instrumentet reproduserer publisert fasit | `live_s7.py` `assert` → 3 954 / 1 495 / 629, ordrett S7a-3 |
| 2 | Refen på levert base reproduseres uavhengig | `okf_consume.py <levert>``sha256-tree:9a4e5561…a968b5`, ordrett 07.09-dokumentet |
| 3 | Døra lukker | `okf build …` stdout → `merged + coded rejections = 43; N = 43` |
| 4 | Ikke byte-identisk, og hvorfor | `diff -r` exit 1, 619 filer, 618 kun `ingested_at`, 1 index-linje, 0 `Only in` |
| 5 | Nevnerne lukker + kontrakt grønn | `okf_contract_check.py``conformant … 0 findings`, exit 0 |
| 6 | Prisskjemaet er holdt tilbake | payload `withheld``del-ii-bilag-7-prisskjema/prissammenstilling-sheet-1` = `below_k` |
| 7 | Kuttet er likt på begge bundlene | de 8 leverte ider er identiske; eneste regeldiff er `log.md` |
| 8 | Ordrens steg-3-kommando nektes | rc = 1, meldingen i § 3 |
| 9 | Levende modell leste kuttet | `A-prepass-approve-records.json` → 2 debatt-prompter à 22 294 / 22 619 tok, rc 0, `ValidatedProposal` |
| 10 | `[sourced-not-sufficient]` brukt | 1 forekomst i renderingen, 1 i proposerens svar; `withheld`/`622`/`630` i renderingen, 0 i svarene |
| 11 | Siteringene | `provenance.citations`**8** (A, B) mot **630** (C) |
| 12 | Arm C nådde prisskjemaet | `{run_id}-debate.json``read_file(del-ii-bilag-7-prisskjema/prissammenstilling-sheet-1.md)` |
| 13 | Revise ordrett i neste prompt, og kun der | `B-prepass-revise-records.json` → treff i 1 av 6 prompter |
| 14 | Validatoren beholder siste ord | `outcome.json``rejected`, `claimed saving 660000 exceeds P90 feasible 351981` |
| 15 | Steg 6s premiss felt | `--live-dry-run` uten `validator-input.json` → rc 0 |
| 16 | K5 diskriminerer | `m4_falsification.py``False` (630/630) vs `True` (patchet kopi) |
| 17 | Pris hentet, ikke husket | Azure Retail Prices API 2026-09-07 → 0,003734 / 0,014936 NOK per 1K |
**Ikke verifisert her:** at en levende modell velger *bedre* med et kutt; at `N=43` er produsentens
riktige nevner (den er lest fra produsentens egen stdout, ikke uavhengig talt — men rå-katalogen
har 43 filer, målt); at leverandørens caching traff prefiksene; at `--ingested-at`-funnet gjelder
andre korpus.
**Instrumentoppsett:** `scratchpad/s7-prepass/` (utracket) — `m0_known_positive.py`,
`m1_render.py`, `m2_compare.py`, `m3_grounding.py`, `m4_falsification.py`, `live_s7.py`.
`tiktoken` `o200k_base` via `uv run --with tiktoken`; fortsatt ingen prosjektavhengighet.