portfolio-optimiser/docs/2026-09-06-major2-levende-k2.md
Kjell Tore Guttormsen b70cc09b80 docs(major2): funn (b) re-maalt live - loekka konvergerer paa foerste reviderte forsoek
Ny § 4b i docs/2026-09-06-major2-levende-k2.md. Én betalt kjøring, samme
harness som § 4 (revise-armen, PACE_SECONDS=2, capacity 100).

AVVIK fra ordren, uttalt: ordren sier «fiksturene fra § 4 rad 6». Rad 6s BASE
er brukt (K2-priset-SYNTETISK-C), men rad 3/4s MANUS - rad 6s eget manus oppgir
kostlinja i mandatets begrunnelse, saa stage 0 fyrer aldri der og spoersmaalet
kunne ikke besvares. Alt annet er uendret.

Instrumentet validert mot en kjent positiv FOER bruk: rotnivaa-listingen paa
levert K2 = 3 954 tegn / 1 495 o200k-tokens over 629 konseptfiler (S7a-3s
publiserte tall, eksakt).

MAALT: forsoek 1 gir 1000/500 og avvises med BEGGE felt navngitt i én melding;
forsoek 2 svarer 1250/850 og VALIDERES, med ett forsoek til gode. Oekt 94 brukte
alle tre paa aa veksle mellom feltene og konvergerte aldri. Modellen trengte
aldri to runder for to felt - den trengte aa faa vite om begge.

Sluttdommen er likevel REJECTED, og det er D6 - ikke stage 0: ekspertens revise
ba om aa HALVERE anslaget, og forsoek 3 OEKTE det (150 000 -> 250 000) og brakk
begge feltene paa nytt. Validatorens siste dom vinner. § 5/§ 8s
etterlevelses-funn reprodusert uendret.

own-proposal er nå MAALT mot gaten (§ 4 kunne bare si «umaalt mot doera»): tre
forsoek, tre oppdiktede kostkoder, hver avvist med den UENDREDE
én-setnings-formen for ukjent kode.

Sidefunn: funn (c)s DirectoryPathRefused fyrte LIVE tre ganger med peker til
read_dir, der ab747bc var stod en IsADirectoryError paa krasj-kanalen.

Kostnad: estimat FOER NOK 0,54; faktisk 42 946 input + 1 606 output =
NOK 0,1843 = 3,7 % av taket paa 5. 0 stk. 429. Takene URØRT.

Ingen ekte Azure-vert i sporet fil (<resource>-maskering; lekkasjesjekk kjoert
etter git add). 1387/5, ruff+mypy rene, golden BYTE-UENDRET
(shasum -a 1 av INNHOLDET = ea8c534773acdbe41ae68f2c55724d69aaf8be4f).

Co-Authored-By: Claude <claude-opus-5>
2026-09-07 00:52:39 +02:00

389 lines
23 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.

# MAJOR-2 — den levende K2-målingen
> **Måledato:** 2026-09-06
> **Ordre:** `20260906T050506Z-8827117206-from-.claude` (operatørvalg 06.09: alternativ (b), alle
> fire kriterier; returnert 06:19Z på en kvoteverdi, gjenåpnet etter at operatøren sa ja til
> veivalg 1)
> **Kode målt ved:** `1f2a045` — ingen fil under `src/` eller `tests/` er rørt; hele målingen skjer
> i `scratchpad/major2-live/` gjennom `run._default_factory`, repoets egen dokumenterte
> injeksjonssøm (Fase 4e)
> **Utfall:** SC1, SC4, SC8 og SC13 er **MÅLT** mot en levende modell. Svaret på hovedspørsmålet er
> ikke det man ville antatt: døra virker mekanisk i hvert ledd, og modellen gjorde det **motsatte**
> av det eksperten ba om.
---
## 0. Hva som ER målt, og hva som IKKE er det
| Spørsmål | Status |
|---|---|
| Er auth/RBAC/endepunkt/deployment i orden? | **JA, målt** — ett-ords-proben grønn |
| Koster målingen mindre enn taket? | **JA, målt** — estimat NOK 2,01, faktisk brukt **NOK 2,15**, tak 50 |
| Er kvoteveggen fra 06:19Z borte? | **JA, målt** — § 2. 0 stk. 429 i ni kjøringer |
| Navigerer en LEVENDE modell kunnskapsbasen (S2c)? | **JA** — § 3, målt både 06:19Z og nå |
| **Når ekspertens ord proposer-prompten (SC4)?** | **JA, MÅLT** på det deklarerte oppsettet (§ 4 rad 6) — 2 av 6 genererings-prompter, ordrett. § 6 |
| **Kjøpes forsøket, og hentes det (SC13)?** | **JA, MÅLT** på samme oppsett — `honoured: true`, `attempts remaining` 2 → 0. § 6 |
| **Er forslag 2 forskjellig fra forslag 1 (SC1)?** | **JA, MÅLT** på samme oppsett — tre felt endret. § 5 |
| **Flytter utfallet seg (SC8)?** | **JA, MÅLT** på samme oppsett — 212 500 → 265 625 NOK. **Feil vei.** § 5 |
| Følger modellen instruksjonen? | **NEI, målt.** Den ble bedt om å halvere og økte med 25 %. § 5 |
| Ledger per fase mot 19 prompter / 19 776 tokens | **MÅLT** — § 7 |
**Les de fire MÅLT-radene sammen med § 4.** På 09-04-oppsettet URØRT nås review-døra ikke i det
hele tatt (seks kjøringer, tre distinkte årsaker); de fire kriteriene er målt på et oppsett der to
fikstur-detaljer er endret og deklarert. Begge halvdeler er funn, og den første er ikke den svake.
Ingenting under er utledet. Der noe ikke er målt, står det.
---
## 1. Kostnadsgaten
**Deployment** (målt med `az cognitiveservices account deployment show`, ikke hentet fra minnet):
`gpt-4-1-mini` → modell `gpt-4.1-mini`, versjon `2025-04-14`, **GlobalStandard**, på
`<resource>` / `<resource-group>` / eastus. **`capacity` er 100** etter operatørens trekk (var 10 da
ordren ble returnert), og deploymentets egne `rateLimits` leser nå **100 forespørsler / 60 s** og
**100 000 tokens / 60 s**.
**Det finnes ingen operatør-fil for `PORTFOLIO_MODEL_MAP`** — variabelen er usatt i skallet, og
`~/.zshenv`/`~/.zshrc` nevner den ikke (målt). Det pakkede `data/model_map.json` bærer fortsatt
`REPLACE-WITH-FOUNDRY-DEPLOYMENT`. Kartet for denne målingen er derfor
`scratchpad/major2-live/model_map.json` (utracket) — en måleartefakt, ikke en kodeendring.
**Listepris, Azure Retail Prices API** (`https://prices.azure.com/api/retail/prices`,
`api-version=2023-01-01-preview`, hentet **2026-09-06**), metere `gpt 4.1 mini Inp glbl Tokens` /
`gpt 4.1 mini Outp glbl Tokens`, `armRegionName=eastus`:
| | NOK / 1K tokens | USD / 1K tokens |
|---|---|---|
| input | **0,003734** | 0,0004 |
| output | **0,014936** | 0,0016 |
NOK-tallene er Microsofts **egne** NOK-listepriser fra samme API (`currencyCode='NOK'`), ikke en
valutakonvertering.
**Estimat FØR første betalte kall**, etter ordrens formel:
`(19 776 inn + 40 000 ut) × pris × 2 armer × 1,5 margin` = **NOK 2,01**.
**Faktisk forbruk, alle ni betalte kjøringer summert: 522 052 input + 13 137 output = NOK 2,15.**
Det er **7 % over estimatet og 4,3 % av taket på 50**. Overskridelsen har en navngitt grunn: ordren
forutsatte to armer, og målingen krevde ni kjøringer fordi de første seks ikke nådde review-døra
(§ 4). Ordrens punkt 4 («overstiger noe enkeltpost 100 000 tokens uten navngitt grunn, stopp og
rapporter») er ikke utløst: største enkeltkall er **5 798 tokens**. Én kjøring traff run-takets
100 000 tokens (§ 4, variant D på den udekkede basen) — det er takets egen mekanisme som fyrer, ikke
en enkeltpost. **Takene (`max_rounds` / `max_tokens` / `max_attempts`) er URØRT.**
---
## 2. Veggen fra 06:19Z — borte, og det er målt før noe annet ble startet
Ved returen var `capacity: 10`, og en isolert forespørsel på 3 000 tokens ble avvist med 429 etter
**150 s helt stille** — et tak per forespørsel som ingen backoff kan vente seg forbi. Operatøren
satte `capacity: 100`.
**En 60-sekunders bøtte kan ikke forklare det som ble målt ved returen**, så at kapasitetstrekket
løser det var en hypotese, ikke et faktum. Den avgjørende prøven ble derfor gjentatt ordrett **før
første arm ble startet**, som et nytt trinn på 14.08-stigen:
| Prøve | Ved `capacity: 10` (06:19Z) | Ved `capacity: 100` (nå) |
|---|---|---|
| 2 342 tokens | OK | — |
| 3 000 tokens | **429** | — |
| 3 742 tokens | — | **OK** (5,30 s, fakturert 3 755 inn) |
| 5 475 tokens | — | **OK** (2,99 s, fakturert 5 475 inn) |
| 4 000 tokens | **429** | — |
Veggen var altså gjennomstrømning. **0 stk. 429 i alle ni kjøringene under**, med
`PACE_SECONDS=2` (var 12, dimensjonert for capacity 10).
**Rettelse til dokumentet slik det sto ved returen:** kommandoen ble skrevet som
`az cognitiveservices account deployment update`. **Det verbet finnes ikke**`az cognitiveservices
account deployment` har kun `create | delete | list | show` (målt mot `--help`). Riktig form er
`create` med samme modell, versjon og sku, siden ARM-PUT oppdaterer den eksisterende deploymenten:
```bash
az cognitiveservices account deployment create \
-n <resource> -g <resource-group> \
--deployment-name gpt-4-1-mini \
--model-name gpt-4.1-mini --model-version 2025-04-14 --model-format OpenAI \
--sku-name GlobalStandard --sku-capacity 100
```
På GlobalStandard er `capacity` en gjennomstrømnings-kvote, ikke en pris — faktureringen er per
token uansett, så kostnadsgaten er uendret av trekket.
---
## 3. S2c-navigasjonen, live (uendret funn fra 06:19Z, reprodusert)
`docs/2026-09-04-s2c-debatt-k2.md` lukket med ærlighets-grensen *«ingen levende modell har
navigert»*. Den var lukket allerede ved returen, og er reprodusert i hver kjøring siden. Debattens
proposer får kun PEKEREN (fast tekst + erklært `bundle_id` + antall konseptdokumenter + stigen) og
de fire navigatør-verktøyene, og går stigen uoppfordret:
```
list_bundles → read_bundle("k2-trinn1-20260903") → read_dir("del-ii-bilag-7-prisskjema")
→ read_file("del-ii-bilag-7-prisskjema/prisskjema-SYNTETISK.md")
```
Fra 630 konseptdokumenter finner modellen prisskjemaet i **tre** navigasjonssteg.
**To nye navigasjons-funn, målt her:**
1. **Modellen forveksler katalog med fil.** `read_dir` på et nivå med underkataloger (`30-1`,
`30-7`, `521-001` …) ble fulgt av `read_file(".../30-7.md")` — modellen la på `.md`. Tre slike
på rad, og MAF stopper da videre verktøykall for den forespørselen («Maximum consecutive
function call errors reached»). Katalog-oppføringene i `directory_listing` bærer `documents`, men
modellen leste dem som filnavn.
2. **Én stor fil kan spise hele run-taket.** Prisskjema-katalogen i syretest-fiksturen bærer både
K2s ekte, *uprisede* sammenstillingsark (101 188 tegn ≈ 25 000 tokens) og den syntetiske,
*prisede* linja (637 tegn). I én kjøring åpnet debatten den store og traff run-takets 100 000
tokens før den var ferdig (`run refused: budget exceeded: tokens limit=100000 observed=100664`).
---
## 4. Hvorfor det tok seks kjøringer å komme fram til døra — hvert steg er en måling
Review-døra (`--proposal-review`) stiller sitt spørsmål **kun når validatoren har akseptert en
kandidat**. Seks kjøringer nådde den ikke, og hver ga et distinkt, reproduserbart funn. Alle seks
kjørte den samme argv-en og det samme skriptede utforsknings-manuset som `docs/2026-09-04-…`; det
som varierer er navngitt i hver rad.
| # | Variant | Utfall — stage 0 | Funn |
|---|---|---|---|
| 1 | 09-04-manuset ordrett, syretest-basen (approve) | `unknown cost code '21.1 grunnarbeider'` | Modellen kopierte mandatets **prosa** inn i kodefeltet |
| 2 | samme (revise) | **identisk** | Reprodusert i uavhengig kjøring |
| 3 | begrunnelsen sier «Kostkode 21.1» i stedet for «Post 21.1 grunnarbeider» | `quantity 1000 … utenfor 5 % rundt baseline 1250` | Koden nå riktig; mengden gjettet |
| 4 | som 3, uten det upriste 101K-arket | **identisk** | Proposeren **leste** det prisede skjemaet to ganger og gjettet likevel |
| 5 | begrunnelsen oppgir kostlinja (1250 m3 à 850) , syretest-basen | run-taket 100 000 tokens | Det upriste arket spiser budsjettet (§ 3, funn 2) |
| 6 | som 5, uten det upriste arket | **VALIDERT — døra åpner** | § 5 |
**Rotårsaken er semantisk, ikke en modellsvakhet.** `affected_items` skal bære **baseline**-linja
slik den står i prisskjemaet — det er dét stage 0 (S4.0) avstemmer mot. Genererings-prompten sier
kun `affected_items (list of {code, quantity, unit_cost})` og forklarer ikke hvilken av de to
mengdene den vil ha. En levende modell som blir bedt om å *redusere* utgravingsvolumet fyller
naturlig inn sin **foreslåtte reduserte** mengde (1000), og blir avvist. Det skriptede 09-04-manuset
skrev 1250/850 fordi et menneske skrev manuset og kjente regelen.
**Steg 5-løkka virker, men den oscillerer.** Stage 0 rapporterer **én** overtredelse om gangen, og
avvisningen mates tilbake i neste forsøks prompt. Målt sekvens i kjøring 3:
```
1000/500 → «quantity 1000 … baseline 1250» → 1188/350 → «unit_cost 350 … baseline 850»
→ 1000/850 → forsøkene brukt opp (max_attempts=3)
```
Modellen fant hver av de to riktige verdiene, men aldri samtidig: den retter feltet avvisningen
navngir og brekker det andre. Med `max_attempts = 3` per tilnærming rekker den ikke å konvergere på
to felt.
**Dette var funn, ikke fiks.** Alle tre — prompt-teksten for `affected_items`, at stage 0 kun
navngir første overtredelse, og at katalog-oppføringer leses som filnavn — bor i `src/`, som DENNE
ordrens gjerde holdt utenfor. De ble rapportert, ikke rettet.
**Alle tre er senere rettet under egne ordrer, og re-målt live:** (a) i `c6886ed`, (c) i `ab747bc`,
(b) i `78e8e39`. Re-målingen av (b) — og de to andres oppførsel live — står i **§ 4b**.
**De to fikstur-endringene er deklarert, og de forteller ikke modellen hva den skal foreslå.**
(a) Mandatets begrunnelse oppgir kostlinja slik dokumentet har den — det er hva en fagperson ville
skrevet. (b) Det upriste 101K-arket er fjernet fra en KOPI av basen; en ekte priset leveranse ville
båret prisene i selve skjemaet. Ingen av dem rører tilbakemeldingen, som er det som er under test,
og modellen ser den først ved review-døra.
---
## 4b. Re-måling etter funn (b): konvergerer Steg 5 nå på to felt?
Funn (b) er rettet i `78e8e39` — stage 0 navngir **alle** baseline-overtredelser i samme avvisning,
hver i uendret setningsform, sammenføyd med `; `. Dommen (D6) og takene er urørt.
**Én betalt kjøring, samme harness som § 4** (`scratchpad/major2-live/live_major2.py`, revise-armen,
`PACE_SECONDS=2`, deployment-`capacity` 100). **Avvik fra ordren, uttalt:** ordren sier «fiksturene
fra § 4 rad 6». Rad 6s **base** er brukt (`K2-priset-SYNTETISK-C`, uten det upriste 101K-arket), men
rad 6s **manus** oppgir kostlinja i mandatets begrunnelse — da fyrer stage 0 aldri, og spørsmålet
kan ikke besvares. Manuset er derfor rad 3/4s (`scripted-replies-kode.json`: begrunnelsen navngir
kostkoden, ikke tallene), som er nøyaktig der oscillasjonen ble målt. Alt annet er uendret.
**Instrumentet er validert mot en kjent positiv FØR bruk:** rotnivå-listingen på levert K2 måler
**3 954 tegn / 1 495 o200k-tokens over 629 konseptfiler** — S7a-3s publiserte tall, eksakt.
**Målt sekvens (proposer, genererings-kall, `max_attempts=3`):**
| # | Prompt bar | Svar | Stage 0 |
|---|---|---|---|
| 1 | (ingen tidligere avvisning) | `1000 / 500` | avvist — **begge felt navngitt i ÉN melding** |
| 2 | den nye to-setnings-grunnen ordrett | **`1250 / 850`** | **VALIDERT** — begge riktige samtidig |
| 3 | ekspertens `revise` (kjøpt forsøk) | `1000 / 500`, krav 250 000 | avvist — begge felt igjen |
Avvisningen forsøk 2 fikk, ordrett fra kjøringens stdout:
```
quantity 1000 for cost code '21.1' is outside the 5.0% tolerance around the baseline quantity 1250; unit_cost 500 for cost code '21.1' is outside the 5.0% tolerance around the baseline unit_cost 850
```
**Svaret er ja, og marginen er større enn spørsmålet ba om.** § 4 kjøring 3 brukte alle tre
forsøkene på å veksle mellom de to feltene og konvergerte aldri. Her konvergerte den på **det første
reviderte forsøket**, med ett forsøk til gode — review-døra åpnet med `attempts remaining: 1`.
Modellen trengte aldri to runder for to felt; den trengte å få vite om begge.
**Kjøringens sluttdom er likevel `REJECTED`, og det er D6 — ikke stage 0.** Ekspertens `revise` ba om
å **halvere** anslaget; forsøk 3 **økte** det (150 000 → 250 000) og brakk begge kostlinjefeltene på
nytt. Validatorens **siste** dom vinner, så tilnærmingen ender avvist. Det er § 5/§ 8s
etterlevelses-funn reprodusert uendret, på en kjøring der stage 0 ikke lenger er årsaken.
**`own-proposal` er nå MÅLT mot gaten** (§ 4 kunne bare si «validerte ALDRI — umålt mot døra»): tre
forsøk, tre oppdiktede kostkoder (`steel_struct`, `support_struct`), hver avvist med den **uendrede
én-setnings**-formen for ukjent kode. Den nådde aldri døra, og grunnen er fabrikkerte koder — ikke
oscillasjon.
**Funn (c) virker live, som sidefunn:** navigatøren kalte `read_file` på tre KATALOGER, og fikk
`DirectoryPathRefused` ved navn med en peker til `read_dir` — der `ab747bc` var, sto en
`IsADirectoryError` på krasj-kanalen. Orkestreringen stoppet etter tre påfølgende verktøyfeil, som
er dens egen mekanisme. Det gjenstående nabofunnet (`.md` på et katalognavn → `FileNotFoundError`)
er urørt og fortsatt åpent.
**Kostnad.** Estimat FØR: 80 000 inn + 4 000 ut × listeprisene i § 1 × 1,5 margin = **NOK 0,54**.
**Faktisk: 42 946 input + 1 606 output = NOK 0,1843****3,7 % av taket på 5**, og under estimatet.
**0 stk. 429.** 22 betalte prompter (proposer 17, checker 5); utforskningens tre roller er skriptet
som før. Største enkeltkall er godt under 100 000 tokens; takene er URØRT.
---
## 5. SC1 og SC8 — forslaget FØR og ETTER ekspertens ord
Begge armer kjørte identisk konfigurasjon; **det eneste som skiller dem er svaret på stdin.**
Kontrollarmen svarer `approve`, revise-armen svarer:
> `revise Anslaget er for hoeyt. Bare halvparten av mengden i denne kostlinjen er styrbar - halver
> claimed_saving_nok og behold de samme kostlinjene og forutsetningene.`
At kontrollen er en kontroll er **målt, ikke påstått**: begge armer produserte det **samme første
forslaget** — 212 500 NOK, dom-nøkkel `ee11886ddce76568`.
| Felt | Forslag 1 (begge armer) | Forslag 2 (etter `revise`) | Ba eksperten om det? |
|---|---|---|---|
| `claimed_saving_nok` | **212 500** | **265 625** | Ja — men om å **halvere**. Modellen økte **25 %** |
| `affected_items` | `21.1 · 1250 · 850` | `21.1 · 1250 · 850`**uendret** | Ja: «behold de samme kostlinjene» ✅ |
| `assumptions["21.1"]` | `[750, 950]` | `[800, 900]`**innsnevret** | Nei: «behold … forutsetningene» ❌ |
| `measure` | «Redusert utgravingsvolum i grunnarbeider» | «… **ved å halvere mengden styrbar volum i kostkode 21.1**» | Ikke bedt om, men den **siterer** tilbakemeldingen |
| dom-nøkkel | `ee11886ddce76568` | `4bf297e2e2ce4bc8` | — |
| `validator_decision` | `validated` | `validated` | — |
| `cost_baseline_anchored` | `true` | `true` | — |
**Utfallet (SC8): 212 500 → 265 625 NOK. Feil vei, og med et tall som passerte hele gaten.**
**Mekanismen bak feilretningen er målt, ikke gjettet.** Modellen leste «bare halvparten av mengden
er styrbar» som *«spar halve kostlinja»*:
```
forsoek 1 (uten feedback): 212 500 = 20,0 % av 1 062 500
forsoek 2 (MED feedback): 531 250 = 50,0 % av linja -> AVVIST av validatoren
forsoek 3 (avvisningen matet tilbake): 265 625 = 25,0 % -> VALIDERT
```
Den mente altså «halver mengden» der eksperten skrev «halver `claimed_saving_nok`» — og det tallet
eksperten faktisk ba om var 106 250. **Det som stoppet 531 250 var validatoren, ikke modellen.**
Dette er nøyaktig hvorfor D6 er som den er: **validatorens siste dom vinner, aldri revieweren sin.**
Hadde revieweren fått bestemme, ville et menneskes ønske om ett forsøk til ha forbedret utfallet
uten at noen falsifiserer sa ja.
**Ærlig lesning:** døra virker i hvert mekanisk ledd — ordene når prompten, forsøket kjøpes og
hentes, forslaget endrer seg, utfallet flytter seg og artefaktet bærer alt. **Det den ikke gir, er
at modellen etterkommer.** Ingenting i MAJOR-2 lovet det, og ingen test påsto det; men før denne
kjøringen var det ikke målt at den lar være.
---
## 6. SC4 og SC13 — når ordene fram, og ble forsøket kjøpt?
**SC4 — ordrett i prompten:** ekspertens setning står **ordrett i 2 av 6 genererings-prompter** i
revise-armen (og i 2 av 23 levende proposer-prompter totalt — de 17 andre er debatt-turer, som
aldri ser tilbakemeldingen). Nevneren er den samme som den skriptede målingen 09-04 fant: **2 av 6.**
De to er nøyaktig forsøk 2 og 3 for `hypothesis-1`; `own-proposal`s tre forsøk har den ikke, som
seg hør og bør — tilbakemeldingen tilhører den tilnærmingen den ble gitt om.
**SC13 — forsøket ble kjøpt, og det ble hentet.** `{run_id}-proposal-reviews.json`:
```json
{"approach_id": "hypothesis-1", "attempt": 0, "decision": "revise",
"feedback": "Anslaget er for hoeyt. ... halver claimed_saving_nok og behold de samme kostlinjene og forutsetningene.",
"honoured": true, "p50": 291467.85, "verdict_key": "ee11886ddce76568"}
{"approach_id": "hypothesis-1", "attempt": 2, "decision": "approve",
"feedback": "", "honoured": true, "p50": 319311.90, "verdict_key": "4bf297e2e2ce4bc8"}
```
Feedbacken står **ordrett** i artefaktet, `honoured: true` på begge, og terminalen viste
`attempts remaining: 2` ved review #1 og `0` ved review #3 — den ledger-bevisste nedtellingen
(M38) med ekte tall. Kontrollarmen skrev det samme artefaktet med **én** rad
(`1 approve, 0 revise`), og linja «proposal review: 2 answer(s) across 1 candidate(s) — 1 approve,
1 revise» er rendereren som rapporterer det.
**Ville en levende oppfølging blitt avvist?** Ja, én av dem ble det: forsøk 2 (531 250 NOK) falt hos
validatoren, og Steg 5 matet avvisningen tilbake. Den reviderte kandidaten som til slutt nådde
review #3 var altså **selv et produkt av to falsifiserere i serie** — mennesket og validatoren.
---
## 7. Ledger per fase, mot den skriptede profilen
**Ordren ber om at «§ 5-tabellens rader Feedback → forbedret og Token fylles med levende
tall». Ingen slik tabell finnes i dette repoet** — målt over 31 markdown-filer (`docs/*.md` +
README): 0 treff på en tabellrad som begynner med «Feedback», mens kjent-positiv-kontrollen viser
at samme regex finner eksisterende `| Token…`-rader i to andre dokumenter. Tabellen tilhører
ordre-avsenderens eget dokument. Radene er derfor besvart her: «Feedback → forbedret» i § 5 og
§ 6, «Token» i tabellen under.
Ordren ber om sammenligning mot `docs/2026-09-04-major2-proposal-review-k2.md:207` (19 prompter /
19 776 tokens). Sammenligningen er **like-for-like på utforskningen ved konstruksjon** — manuset er
det samme, så de 12 utforsknings-promptene er skriptede og ubetalte i begge — og **ikke**
like-for-like på debatt og generering, som her er levende og derfor navigerer og resonnerer fritt.
| | Skriptet (09-04) | LEVENDE kontroll (approve) | LEVENDE revise |
|---|---|---|---|
| utforskning | 12 prompter / 18 355 tok | 12, skriptet (ubetalt) | 12, skriptet (ubetalt) |
| debatt: proposer | 2 / 314 tok | **15 / 29 030 inn / 1 026 ut** | **23 / 62 654 inn / 1 572 ut** |
| debatt: checker | 1 / 199 tok | inkl. over: **5 prompter / 9 547 / 326** | **8 / 18 881 / 441** |
| generering | 4 / 908 tok | 3 forsøk (i proposer-tallet) | 6 forsøk (i proposer-tallet) |
| **prompter totalt** | **19** | **32** (20 levende + 12 skriptede) | **43** (31 + 12) |
| **betalte tokens** | — (ingen) | **38 577 inn / 1 352 ut** | **81 535 inn / 2 013 ut** |
| **kostnad** | — | **NOK 0,164** | **NOK 0,335** |
**Forskjellen er navigasjonen, ikke døra.** Den skriptede debatten svarte med ett fast utsagn per
tur; den levende går stigen, leser dokumenter og bærer resultatene videre i én delt samtale — det er
`docs/2026-09-04-s2c-debatt-k2.md` sin egen handel, målt live for første gang. **Døras egen kostnad
er den ene ekstra genererings-runden per revise**, og den er liten: revise-armen har 3 flere
genererings-forsøk enn kontrollen.
---
## 8. Ærlighets-grenser
* **Ett kall er én kjøring.** Alt i § 5 og § 6 er én modell, én gang, på ett korpus. At
`gpt-4.1-mini` gjør det motsatte av en tilbakemelding er målt her, ikke et utsagn om modeller
generelt eller om samme modell i snitt.
* **Fiksturen er endret to ganger for å nå døra, og begge er deklarert i § 4.** Målingen i § 57 er
derfor ikke «09-04-oppsettet med levende modell», men «09-04-oppsettet med en begrunnelse som
oppgir kostlinja og uten det upriste arket». Radene 16 i § 4 er hva det uendrede oppsettet gjør.
* **Prisene i basen er SYNTETISKE** (`K2-priset-SYNTETISK`) — K2 som levert har ingen priser
(målt, S7b). Tallene 212 500 og 265 625 er derfor ikke besparelser i Stange skole-anbudet; de er
besparelser i en syntetisk prising av det. Det gjelder SC8 uansett hvilken modell som kjører.
* **`own-proposal` validerte aldri i noen kjøring.** Den fant ingen ekte kostkode i en eneste av de
ni kjøringene (`RIG01`, `Prosjektering`, `VENT-01`, `Steel`, `Architectural_Design` …). Systemets
eget forslag er dermed **umålt** mot review-døra; alt i § 56 gjelder `hypothesis-1`.
* **429-forespørsler er antatt ikke fakturert.** Det er Azures dokumenterte oppførsel, men det er
ikke verifisert mot en faktura her. Her er det uansett uten betydning: 0 stk. 429.
* **Prisene er LISTEPRIS**, hentet 06.09.2026. Rabatter og avtaler er ikke reflektert.
* **Måleharnesset er ikke gatet av suiten.** `scratchpad/major2-live/live_major2.py` er en
måleartefakt som enhver annen `scratchpad/`-profiler; den asserteres ingen steder. Det som ER
gatet er `src/`, som er urørt, og suiten som er kjørt etter (§ 9).
* **`max_attempts` er ikke eksponert på CLI-en**, så § 4s oscillasjons-funn er målt ved defaulten 3.
Om en høyere verdi ville latt modellen konvergere er **ikke** målt — å heve den ville krevd en
endring i `src/`.
---
## 9. Etterkontroll
Ingen fil under `src/` eller `tests/` er rørt (`git diff --stat -- src/ tests/` tom). Suiten og
golden-fasiten er kjørt etter dokumentendringen; tallene står i commit-meldingen og i `STATE.md`.
Alle måleartefakter — de ni kjøringenes `*-records.json`, utboksene og de to fikstur-variantene —
ligger utracket i `scratchpad/major2-live/`.