docs(p21): stress round 5 -- the first ANCHORED round, and what the anchoring cost

Five paid runs, rc 0 in all, 1 130 145 tokens (~NOK 7,6 under P20's stated list-price
assumption; no invoice read).

What the anchoring bought, measured off the artefacts rather than inferred from the
flag: cost_baseline_anchored true 6/6, and the falsification arm a4 passed 5 of 5 with
ALL FIVE caught by stage0-baseline -- the one stage that knows what the project buys.
Round 4, re-judged with the same instrument: 4 of 5, every one of them on stage 0b, and
the fifth VALIDATED.

C1 fired live and changed behaviour: distinct documents opened before a declaration went
1/1/1/2/5/13 -> 3/3/5/7/11/12, and THREE declarations were refused mid-run (15 calls, 12
recorded) after which the model read more and declared again. C2: read_dir against a
level the base does not hold fell from 16 of 104 to 8 of 128.

And what it cost, measured just as plainly: 0 of 20 approaches validated (round 4: 4).
All 26 rejections read "unknown cost code" -- because the schedule reaches the VALIDATOR
and never the prompt, and stage 0's refusal names HOW MANY codes the project has and not
WHICH. Step 5 feeds that refusal back verbatim, and "you guessed wrong, there are five
right ones" cannot be corrected. Contrast the magnitude arm, which names the baseline
value and therefore converges.

Four remaining findings, each with a NAMED solution and an estimate -- the first is one
sentence in _reconcile_against_baseline.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-15 12:08:51 +02:00
commit f751a66bbe

View file

@ -0,0 +1,205 @@
# P21 — stressrunde 5, FORANKRET: fem betalte kjøringer mot prosjektets eget prisskjema
**Dato:** 2026-09-15 · **Ordre:** `20260915T063839Z-5960711173-from-.claude` · **Økt:** 125
**Kode:** `7b4f85d` (DEL A+B) · `ac0bfdb` (DEL C) · rapporten i denne commiten
**Miljø:** Foundry `gpt-4-1-mini`, `PACE_SECONDS=2`, endepunkt hentet INLINE fra `az`
(ekte vert aldri i sporet fil). Klientprobe: 1 passed før første betalte kall.
**Skript:** `scratchpad/p21/stress5.sh` · `scratchpad/p21/judge5.sh` · `scratchpad/p21/rejudge4.sh`
---
## 0. Kortversjonen
Fire betalte runder hadde kjørt **uforankret, alle sammen**: validatorens stadium 0 — det ene
stadiet som skiller en oppdiktet kostlinje fra en linje prosjektet faktisk kjøper — ble hoppet over
i hver eneste, fordi prisen ble lett etter i KUNNSKAPSBASEN og en vegnormal bærer ingen priser.
P21 ga prosjektet sitt eget prisskjema (`--cost-baseline`), og runde 5 er den første forankrede.
**Det forankringen kjøpte, målt:**
* **`must_refuse` (a4) bestått 5 av 5, og alle fem på `stage0-baseline`** — mot 4 av 5 i runde 4,
der alle fire som besto falt på stadium 0b (P7s grunnings-sjekk) og den femte VALIDERTE.
* **`stop_reason` tom 6 av 6**, `own-proposal` evaluert 6 av 6 — som i runde 4.
* **C1 fyrte LIVE og endret atferd:** distinkte dokumenter åpnet før en erklæring gikk fra
`1 · 1 · 1 · 2 · 5 · 13` til `3 · 3 · 5 · 7 · 11 · 12`. Tre erklæringer ble NEKTET underveis
(15 kall, 12 registrert), og modellen leste mer og erklærte på nytt.
* **C2:** `read_dir`-kall mot et nivå basen ikke holder falt fra **16 av 104 (15,4 %)** til
**8 av 128 (6,3 %)**.
**Og det den kostet, målt like tydelig: 0 av 20 tilnærminger validerte** (runde 4: 4 av 20). Hver
eneste av de 26 avvisningene — 20 tilnærminger + 6 `own-proposal` — leser
`unknown cost code '<noe>': not in project <P>'s cost baseline (N known codes)`. Ingen kjøring kom
forbi stadium 0, fordi **prisskjemaet aldri når prompten** og avvisningen oppgir **hvor mange**
koder prosjektet har, aldri **hvilke**. Det er § 4 funn 1, og det har en navngitt løsning.
---
## 1. Hva som ble kjørt
| sett | base(r) | run-id | utboks |
|---|---|---|---|
| gate-nordvik-2027 | n100-2023 | `gate-nordvik-2027-07` | `scratchpad/p21-stress/gate-nordvik-2027` |
| tunnel-hauglia-2027 | n500-2024 | `tunnel-hauglia-2027-07` | `…/tunnel-hauglia-2027` |
| fv412-dekkefornyelse-2027 | n200-2024 | `fv412-dekkefornyelse-2027-07` | `…/fv412-dekkefornyelse-2027` |
| kontrakt-sorasen-2027 | r761-2025 | `kontrakt-sorasen-2027-07` | `…/kontrakt-sorasen-2027` |
| dekke-og-kontrakt-lindaas-2027 | n200 + r761 (`--across-bundle`) | `lindaas-03` | `…/lindaas` |
Alle fem med `--max-rounds 5 --max-tokens 600000 --cost-baseline contexts/<sett>/cost-baseline.json`.
Fri `--live-dry-run` på alle fem først: rc 0 og `Cost baseline: N line(s) from …` i alle fem,
inkludert multi-base-passet, der linja printes ÉN gang for passet (ett prosjekt, ett prisskjema).
Alle fem betalte kjøringer: **rc 0**.
---
## 2. Runde 3 / 4 / 5, samme instrument
Runde 4 er **dømt på nytt med P21-dommeren** (`scratchpad/p20-stress/*/verdict-p21.out`), så de to
kolonnene under er målt med samme verktøy. Runde 3 står som publisert i P19/P20 og er IKKE
re-dømt — den mangler `anchored`/`priced`/`stage`, og å fylle dem inn fra prosa ville vært å dikte
et måleresultat.
| | runde 3 | runde 4 | **runde 5** |
|---|---|---|---|
| `anchored` | (ikke målt) | **False 6/6** | **True 6/6** |
| validerte tilnærminger | 1/32¹ | 4/20 | **0/20** |
| fasit-grunnet (a) | 1/32¹ | 2/20 | 1/20 |
| `requirement_hit` | 0/13 | 0/13 | **0/12** |
| `named` (b) | — | 1/20 | 1/20 |
| hallusinerte koder | — | 23 | 26 |
| `priced` | — | 0/20 | **0/20** |
| a4 `must_refuse` bestått | 2/4 | 4/5 | **5/5** |
| a4 — hvilket stadium fanget | (ikke målt) | `stage0b` ×4, ingen ×1 | **`stage0-baseline` ×5** |
| gjettede lesestier (dommeren) | — | 17 | **14** |
| `stop_reason` tom | 0/5 | 6/6 | 6/6 |
| parse-feil-filer | 4 av 6 (1 rad) | 4 av 6 (1 rad) | 4 av 6 (2 rader) |
| tokens | 2 679 305 | 896 492 | **1 130 145** |
¹ runde 3 + P17b talte over 32 rader; runde 4 og 5 er 20 rader (fire sett à fire + to à to).
De to nevnerne er ulike og tallene er ikke direkte sammenlignbare — de står som publisert.
Per sett i runde 5: gate 102 048 · tunnel 178 157 · fv412 117 398 · sorasen 305 135 ·
lindaas/n200 133 635 · lindaas/r761 293 772.
**Kostnad, med antakelsen uttalt:** P20 anslo 896 492 tokens ≈ **NOK 6** til listepris for
`gpt-4-1-mini`. Samme antakelse, skalert: 1 130 145 tokens ≈ **NOK 7,6**. **Ingen faktura er lest**
— dette er et anslag, ikke en måling av hva som ble belastet.
---
## 3. Hva hver del kjøpte (mål, ikke tilskriv)
### DEL A+B — forankringen
**Kjøpte:** stadium 0 dømmer igjen. Det er ikke utledet fra at flagget ble sendt, men lest av
artefaktene: `provenance.cost_baseline_anchored` er `true` i alle seks utbokser, og alle 26
avvisninger bærer stadium 0s egen setning. Falsifiseringsarmen faller nå på det stadiet som vet
hva prosjektet KJØPER, i stedet for på det som bare vet hva som stod i teksten.
**Kjøpte IKKE:** en høyere andel riktige svar. Tvert imot — se § 4 funn 1.
**Ærlighets-grense, uttalt:** «a4 5 av 5» er sant og svakere enn det ser ut. Nevneren er en gate som
avviste 20 av 20, så armen måtte ikke SKILLE noe denne runden. Den skarpe formen av dette kriteriet
krever en runde der a1a3 kan validere; den kommer først når funn 1 er lukket.
### DEL C1 — erklæringen som må ha lett
**Kjøpte:** at erklæringen koster en titt. Målt i de seks sporene:
| sett | distinkte dokumenter før erklæring (r4 → r5) | declare-kall r5 | registrert r5 |
|---|---|---|---|
| gate-nordvik | 1 → **3** | 2 | 2 |
| tunnel-hauglia | 1 → **5** | 3 | 2 |
| fv412 | 1 → **3** | 3 | 2 |
| sorasen | 13 → 12 | 2 | 2 |
| lindaas/n200 | 2 → **7** | 3 | 2 |
| lindaas/r761 | 5 → **11** | 2 | 2 |
**Tre erklæringer ble nektet live** (15 kall, 12 registrert), og i alle tre tilfellene leste
modellen mer og erklærte på nytt — nekten er en tur den kunne rette, som var hele formen.
**Kjøpte IKKE:** riktige erklæringer. `requirement_hit` er fortsatt **0 av 12**. Å lese tre
dokumenter i stedet for ett gjør ikke det tredje til det riktige. Se § 4 funn 2.
### DEL C2 — nekten som navngir naboene
**Kjøpte:** færre gjetninger på katalognivå. `read_dir` mot et nivå basen ikke holder falt fra
**16 av 104** til **8 av 128** — raten fra 15,4 % til 6,3 %. Den ellevedelte `R761/4-3`,
`4.3`, `4-2`, `4-1`, `4-0`, `4-5`, `4-6`-vandringen fra runde 4 gjentok seg ikke.
**Kjøpte IKKE:** færre gjettede DOKUMENT-stier. `read_file` mot et dokument basen ikke holder gikk
fra 2 av 38 til **7 av 52** (5,3 % → 13,5 %). Totalt gikk sti-bærende kall mot noe som ikke finnes
fra 18 av 143 til 15 av 180. Uttalt: to ulike definisjoner er i omløp i denne rapporten —
dommerens `hallucinated_reads` (filsystem-basert: 17 → 14) og målingen over
(`context_files`-basert: 18 → 15). Begge peker samme vei; ingen av dem er den andre.
---
## 4. Gjenstående funn, hver med en navngitt løsning
### FUNN 1 (nytt, og det største) — prisskjemaet når aldri prompten
**Målt:** alle 26 avvisninger er `unknown cost code`. Ingen av de 26 foreslåtte kodene står i
prosjektets skjema; modellen fant på `signalregulering_konstruksjon`, `elevated_crosswalks`,
`VENTIL_IMP`, `RIGG01`, `Filtermateriale`, `bærelag_asfalt`, `MASSE_FORSTERKNING` og tjue til.
Den kunne ikke gjort annet: skjemaet sendes til VALIDATOREN, aldri til proposeren, og stadium 0s
avvisning oppgir **antallet** kjente koder («5 known codes») og **ikke ett eneste kodenavn**. Steg 5
mater avvisningen ordrett inn i neste forsøks prompt — men en beskjed som sier «du gjettet feil,
det finnes fem riktige» kan ikke korrigeres. Kontrast MAGNITUDE-avvisningen, som NAVNGIR
baseline-verdien og derfor lot løkka konvergere i økt 94.
**Løsning (navngitt, anslag ~0,5 økt):** la stadium 0s ukjent-kode-avvisning NAVNGI kodene
prosjektet faktisk har, slik magnitude-armen allerede navngir verdien —
`…not in project P's cost baseline (known codes: RIGG, ASFALT, …)`. Ett sted (`validator.py`
`_reconcile_against_baseline`), ingen ny flate, og Steg 5 bærer det videre gratis. Ved store
skjemaer må listen bindes (samme regel som katalog-utdraget: et fast vindu, aldri en andel).
**Alternativ løsning (anslag ~1 økt), som IKKE anbefales alene:** rendre skjemaet inn i
proposer-prompten. Den gir modellen kodene før første forsøk i stedet for etter det første
bomskuddet, men den er en ny prompt-flate med egen kostnad per kjøring, og den fjerner ikke behovet
for at avvisningen er korrigerbar.
### FUNN 2 (uendret fra P19/P20) — `requirement_hit` er 0
**Målt:** 0 av 12 erklæringer navngir et fasit-konsept, tredje runde på rad. C1 gjorde at
kjøringene leser mer (1 → 311 dokumenter), og det flyttet ikke treffet.
**Løsning (navngitt, anslag ~0,5 økt):** `declare_requirement` svarer allerede med dokumentets EGEN
tittel og `req_number` (P20/A1). Neste trinn er å gjøre svaret til en SAMMENLIGNING: ta approachens
label og si om det erklærte kravet i det hele tatt handler om den — «du erklærte *Krav 1.1—1
Generelle krav* for *Enklere rundkjøring*; ingen ord fra labelen finnes i dokumentets tittel eller
`req_number`». Det er en rapport, ikke en gate (en gate på ordoverlapp ville nektet legitime
erklæringer), og den kan bygges og måles offline mot de seks sporene.
### FUNN 3 (svakere enn i runde 4, ikke lukket) — gjettede DOKUMENT-stier
**Målt:** `read_file` mot et dokument som ikke finnes gikk 2/38 → 7/52. C2 hjelper på katalognivå
og ikke her, fordi den nærmeste listbare forfaren til en gjettet dokumentsti ofte HOLDER dokumenter
og ingen underkataloger — og da utelates nabolista (bevisst; en tom klausul er en setning uten
innhold).
**Løsning (navngitt, anslag ~0,3 økt):** når forfaren holder dokumenter og ingen underkataloger,
navngi i stedet inntil fem av DOKUMENTENE på det nivået, rangert på samme måte. Samme funksjon,
samme kilde (`context_files` gjennom `in_dimension`), samme egenskap: hvert navn den gir fra seg
resolverer.
### FUNN 4 (uendret) — `named` er 1 av 20
**Målt:** bare sorasens `a3-planum-stabilisering` navnga et fasit-krav i sitt eget `measure`.
**Løsning:** ingen egen — dette er funn 2 sett fra den andre siden. Lukkes funn 2, er dette det som
måler om det virket.
---
## 5. Ærlighets-grenser
* **Fem betalte kjøringer på ett spørsmål er ikke et utvalg.** Én modell (`gpt-4-1-mini`), ett
deployment, ett manus.
* **Alle beløp i de fem prisskjemaene er OPPDIKTET.** Hvert setts `honesty`-felt sier det. Det som
IKKE er oppdiktet er FORMEN: hver a1a3 har sin kostlinje, a4 har ingen, og sorasens koder er
ekte R761-prosessnumre fordi en norsk vegkontrakt prises slik.
* **«a4 5 av 5» er målt under en gate som avviste alt.** Se § 3.
* **Ingen faktura er lest.** NOK-tallet er et anslag med antakelsen uttalt.
* **Runde 3 er ikke re-dømt** og de tre kolonnene i § 2 er derfor ikke alle sammenlignbare.
* **Ordrens D2 ber om `priced` som hovedtall.** Den er 0 av 20, og det er ikke en egenskap ved
skjemaene: det er funn 1 målt fra den andre siden.