portfolio-optimiser/docs/2026-09-09-p6-betalt-k2-etter-kollaps.md
Kjell Tore Guttormsen 999846a485 docs(p6): one paid K2 run says the collapse bought legibility, not use
P6 repeats S7c arm Aopen on HEAD with the payload BYTE-IDENTICAL, so the only
variable is `collapse_padding` (finding 5, session 107).

(a) NO. `5647500` reaches the model -- 6 occurrences in 2 of 5 prompts, label
and amount on the same line -- and appears in 0 of 5 replies. The control
against S7c's own recording reproduces its published 6-in-2-of-11 / 0-in-11
exactly, so the null is a measurement, not a broken query.

(b) 1 of 12 delivered excerpts is named at all (the general technical
requirements, cited verbatim by concept_id); the price schedule never is.

(c) 4 of 4 code-shaped tokens in the replies are invented -- the ENGRAVE_MARK
class -- and the two amounts with them.

The fix duty does NOT fire, because cause (ii) is falsified by two
measurements: everything the collapse removed is whitespace (48 714 characters,
per-line non-whitespace sequence IDENTICAL on the real prompts), and the named
candidate -- the Post/SUM cell boundary -- was INTACT in S7c, which produced the
same null. A property present when the outcome was null cannot be the cause of
the null. The null is older than the collapse.

Pre-flight also measured what the row already implied but nobody had checked:
-72.4 % CHARACTERS is -1.8 % TOKENS (26 936 -> 26 447). A run of 887 spaces is
nearly free in BPE, so the collapse is legibility, never price.

The blind spot has moved on again: ranking (S7c) -> reading (finding 5) ->
the CHOICE of document.

Cost NOK 0.321 of a NOK 0.40 ceiling, 0 retries. Suite 1543/5, ruff and mypy
clean, golden byte-unchanged. No source file touched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 13:14:55 +02:00

244 lines
14 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.

# P6 — én betalt K2-kjøring etter `collapse_padding`: leser modellen prisskjemaet nå?
**Ordre:** `20260909T105821Z-977199477-from-.claude` · **Økt 108** · 2026-09-09
**Kontroll før arbeidet:** 1543 passed / 5 skipped · `ruff` og `mypy` rene
**Golden `demo-transcript.stdout`:** `shasum -a 1` av INNHOLDET = `ea8c534773acdbe41ae68f2c55724d69aaf8be4f`, UENDRET
**ÉN betalt arm.** Målt kostnad **NOK 0,321** av taket 0,40. 429-retries: **0**.
## 0. Hva som ER målt, og hva som IKKE er det
**MÅLT:** at kollapsen fra økt 107 treffer nøyaktig denne payloaden (72,4 % tegn, ingen
ikke-whitespace-endring), at prisskjemaets bytes NÅDDE modellen i den betalte kjøringen
(6 forekomster av `5647500` i 2 av 5 prompter), og at modellen **likevel ikke siterer tallet i
noe svar** (0 av 5). Kontrollen på spørringen er kjørt mot S7cs eksisterende opptak og reproduserer
dens publiserte tall eksakt.
**IKKE MÅLT:** at en annen modell, et annet deployment eller en gjentakelse ville gitt samme
utfall. Én kjøring er én kjøring.
**DOMMEN:** funn 5 er **IKKE bekreftet levende**. Kollapsen kjøpte lesbarhet (og den er målt), men
ikke bruk. Årsaken er skilt med en måling i § 5 — det er **ikke** at kollapsen fjernet noe modellen
trengte.
---
## 1. Premissene, verifisert før noe ble betalt
| Premiss (PM målte 09.09) | Verifisert her med | Utfall |
|---|---|---|
| (i) HEAD `eb41374`, `git ls-remote origin main` = `eb41374` → UPUSHET = 0 | `git rev-parse HEAD`, `git ls-remote origin main` | **BEKREFTET.** STATEs «UPUSHET = 2 / `origin/main` = `4f23fa2`» var foreldet og er rettet |
| (ii) To utrackede: presentasjons-HTML (parallell økt) og `scratchpad/` | `git status --short` | **BEKREFTET.** Begge forblir utrackede |
| (iii) Armen er S7c `Aopen`, og bare den | S7c § 5 lest; `Adef` ikke kjørt | **BEKREFTET** |
| (iv) `payload-open.json` = 240 021 B, sha256 `f802809e…b995d3`, 12 utdrag, prisskjemaet på rang 10 med 67 245 tegn | `ls -l`, `shasum -a 256`, parsing av fila | **BEKREFTET, alle fem tallene** |
| (v) Payloaden gjenbrukes BYTE-IDENTISK; den har 9 medlemmer per utdrag | `sorted(excerpts[0].keys())` | **BEKREFTET:** `adjudication`, `bundle_id`, `bundle_id_inherited`, `concept_id`, `rank`, `sha256`, `text`, `text_sha256`, `trust_tier`**9**, altså eldre enn P3/okf-feltfiksen (14 på N-bundlene). Det er ønsket her: A/B-en isolerer kollapsen alene |
| (vi) Kollapsen gir 67 245 → 18 531 tegn (72,4 %), 104 linjer, lengste løp 887 → 0 | pre-flight § 2 | **BEKREFTET, alle fire** |
| (vii) Azure uendret; klientproben krever BEGGE env-vars | `uv run pytest tests/test_foundry_profile_live.py -q` med begge satt | **BEKREFTET: `1 passed`** (ikke skipped) |
Repro-gaten (pkt. 1 i ordren) sto grønn før noe ble betalt: `uv run pytest -q` = **1543 passed /
5 skipped**, `uv run ruff check src tests` = rent, `uv run mypy src` = rent, golden `shasum -a 1` =
`ea8c534773acdbe41ae68f2c55724d69aaf8be4f`.
---
## 2. Pre-flight (gratis): treffer kollapsen denne payloaden?
Rendret gjennom produksjonens egen søm på HEAD (`prepass.render_context``_data_blocks`
`collapse_padding`). FØR-armen er **samme søm med `collapse_padding` detachet til identitet** — en
A/B over én kodesti, aldri en andre kopi av regelen. Skript: `scratchpad/s7c/preflight_p6.py`.
**Prisskjema-utdraget (rang 10):**
| Mål | Før | Etter |
|---|---|---|
| tegn | 67 245 | **18 531** (72,4 %) |
| linjer | 104 | **104** |
| indre løp ≥ 2 | 115 | **0** |
| indre løp ≥ 100 | 103 | **0** |
| lengste indre løp | 887 | **0** |
| per-linje ikke-whitespace-sekvens | — | **IDENTISK** |
Sentinel-raden etter kollaps, linje 20: `82 Prosjektering (tiltransport av prosjekterende) 5647500.0`
— etikett og beløp på SAMME linje, som funn 5 lovet.
**Avstemming mot funn 4/5-dokumentets § 2.3** (som oppga 208 løp ≥ 2, 117 ≥ 100, 56 806 tegn over
72 av 104 linjer): de to tallsettene måler ULIKE ting, og begge er riktige. § 2.3 teller med
`[ \t]{2,}` — altså også LEDENDE løp. Kollapsen rører per konstruksjon ikke ledende whitespace, så
det INDRE tallet er 115 / 103 / 48 255 tegn over 71 linjer. Differansen (93 løp, 8 551 tegn, 1
linje) ER den ledende indenteringen som med vilje overlever. Målt her, ikke antatt.
**Hele den rendrede debattkonteksten:**
| Mål | Før | Etter |
|---|---|---|
| tegn | 145 237 | 96 523 |
| o200k-tokens | 26 936 | **26 447 (1,8 %)** |
**Kjent-positiv på instrumentet:** FØR-armen reproduserer S7cs publiserte 145 237 tegn / 26 936
tokens EKSAKT. Uten den ville en null i ETTER-armen ikke kunnet skilles fra en ødelagt måler.
**Dette er ikke en besparelse, og det er et funn i seg selv:** 72,4 % TEGN er 1,8 % TOKENS. Et løp
på 887 mellomrom koster nesten ingenting i BPE. Kollapsens argument er lesbarhet, aldri pris — og
det er nå målt, ikke bare påstått.
**Kostnadsestimat før betaling:** S7c Aopen kostet målt NOK 0,354 (input 86 331, output 2 103,
listepris 0,003734/1K inn og 0,014936/1K ut). Kollapsen sparer 489 tokens i hver av de 2 promptene
som bærer kuttet = 978 → estimat **NOK 0,350**, under taket 0,40. Kjøringen ble derfor godkjent.
---
## 3. FYI til `llm-ingestion-okf` (gratis, sendt FØR den betalte armen)
Sendt som `--fyi` (ingen svar forventet): `20260909T110614Z-52244740-from-portfolio-optimiser.md`,
emne «FORM FINDING: K2 price schedule carries no bill of quantities (0 of 92 rows)». Innholdet er
funn 4s konklusjon med nevnere (0 av 92 rader med eksakt vokabular, 0 av 92 med løsere
delstrengmatch, 0 av 91 datarader med kode + mengde + beløp; formen ER lesbar — 8 kolonne-spenn, 71
av 91 ikke-blanke rader gir ≥ 2 celler, splitten stabil for K = 2…64), pluss hvorfor det angår
`--cost-vocabulary` og prisformens rangering. Meldingen er FYI, ikke en bestilling: ingen frist,
ingen forespørsel om endring. Kildepeker: `docs/2026-09-08-funn-4-5-og-read-nekt.md` § 1.
---
## 4. Den betalte armen
Kjørefil: `scratchpad/s7c/live_p6_collapsed.py` — en KOPI av `live_s7c.py`s Aopen-arm med eget
`--run-id` (`p6-Aopen-collapsed`), egen outbox og egne opptaksfiler. S7cs `Aopen-records.json` og
`outbox-Aopen/` er evidens og er URØRT. Ingen fil under `src/` er rørt av dette punktet.
`known_positive()` passerte før armen kjørte: levert K2 rotlisting = 3 954 tegn / 1 495 tokens /
629 konsepter, reprodusert eksakt.
### 4 (a) Siterer modellen `5647500`?
| Term | PROMPTER (P6) | SVAR (P6) | PROMPTER (S7c, kontroll) | SVAR (S7c) |
|---|---|---|---|---|
| `5647500` | 6 i **2 av 5** | **0 i 0 av 5** | 6 i **2 av 11** | 0 i 0 av 11 |
| `prissammenstilling` | 24 i 2 av 5 | 0 i 0 av 5 | 24 i 2 av 11 | 0 i 0 av 11 |
| `prisskjema` | 6 i 2 av 5 | 0 i 0 av 5 | 6 i 2 av 11 | 0 i 0 av 11 |
| `pris` | 96 i 2 av 5 | 0 i 0 av 5 | 96 i 2 av 11 | 0 i 0 av 11 |
| `92` | 6 i 2 av 5 | 0 i 0 av 5 | 6 i 2 av 11 | 0 i 0 av 11 |
**Kjent-positiv (bytene nådde fram):** 6 forekomster i 2 av 5 prompter. Målingen er altså gyldig —
modellen SÅ tallet, i kollapset form, med etiketten på samme linje.
**Svaret på spørsmålet: NEI.** 0 av 5 svar siterer `5647500`, akkurat som S7cs 0 av 11.
### 4 (b) Hvilke konsepter navngis?
**1 av 12** leverte utdrag navngis i det hele tatt:
`inbox-del-ii-bilag-1-1-stange-skole-generelle-tekniske-krav` (de generelle tekniske kravene, det
STØRSTE utdraget etter prisskjemaet — 31 001 tegn). Modellen siterer det ORDRETT ved `concept_id` i
sitt første svar: «Supporting details from the technical requirements document
(inbox-del-ii-bilag-1-1-stange-skole-generelle-tekniske-krav)».
**Prisskjemaet er IKKE navngitt** — verken ved `concept_id`, ved bladnavn eller ved dokumentnavn, i
noe av de fem svarene. Det er samme utfall som S7c, og det er hele funnet.
### 4 (c) Kontrollene
**(i) Kan spørringen finne?** Samme spørring mot S7cs `Aopen-records.json` (før kollapsen) gir
**6 forekomster i 2 av 11 prompter** og **0 i svarene** — nøyaktig S7c § 5s publiserte tall. En null
i P6 er derfor en MÅLING, ikke en ødelagt regex.
**(ii) Hva finner modellen på?** Tokens i P6-svarene som ikke finnes i NOE levert utdrag:
* kostkoder: `MER-001`, `MER-002` (forsøk 1), så `M-04-01`, `M-04-03` (forsøk 2) — **4 av 4
kodeformede tokens er oppdiktet**, 0 stammer fra et utdrag;
* tall ≥ 4 siffer: `200000`, `75000` oppdiktet; `1000` finnes i et utdrag (og er en mengde modellen
også fant på — sammenfallet er tilfeldig).
Dette er S7c/P4s (c)-rad gjentatt: samme klasse som `ENGRAVE_MARK` / `CS-GS1`. Modellen bygget hele
forslaget på merkekravene i de tekniske kravene og myntet kostlinjer for dem.
### 4 (d) Utfallet av kjøringen
P6 endte i **`ValidatedProposal`** (dom-nøkkel `5fd6272e3725fe68`), med proposal-reviewen besvart
(1 approve). S7c Aopen endte i **`Rejection`** («proposal review offered, never consulted (no
candidate validated)», dom-nøkkel `65094b3648af8d7d`). Utfallet FLYTTET seg altså — men på
oppdiktede kostlinjer, i en UFORANKRET kjøring (ingen `cost-baseline.json` i basen, stage 0 hoppet
over). Med n = 1 er dette en OBSERVASJON, ikke en påstand om at kollapsen forårsaket det: banen
gjennom `max_attempts` er modellatferd, og S7c brukte 9 proposer-forsøk mot P6s 4.
### 4 (e) Kostnad
| Post | Prompter | Input | Output | NOK |
|---|---|---|---|---|
| Klientprobe (`test_foundry_profile_live.py`) | 1 | ~10 | ~5 | ~0,000 |
| P6 Aopen (proposer ×4, checker ×1) | 5 | 81 709 | 1 065 | **0,321** |
| **SUM** | **6** | **81 709** | **1 065** | **0,321** |
Listepris: input NOK 0,003734/1K, output NOK 0,014936/1K (samme som P4 § 11.5).
**429-retries: 0.** Taket var NOK 0,40; estimatet var 0,350; faktisk 0,321. Avviket ned skyldes at
kjøringen brukte 5 prompter der S7c brukte 11.
Per prompt: proposer 26 458 → 201 → 326 → 363 o200k, checker 26 833 o200k. De to første promptene
bærer kuttet; resten er korte oppfølginger.
---
## 5. Dommen, og hvorfor pkt. 5s fikse-plikt IKKE utløses
(a) er **NEI**. Ordren krever da at de to årsakene skilles med en måling, ikke en antakelse:
* **(i) bytene var der, modellen leste forbi dem likevel** — eller
* **(ii) kollapsen FJERNET noe modellen trengte.**
**(ii) er FALSIFISERT, med to uavhengige målinger.**
**Måling 1 — hva som faktisk forsvant, målt på de EKTE promptene** (ikke på en re-rendring):
`scratchpad/s7c/diff_p6_vs_s7c.py` trekker prisskjemaets DATA-blokk ut av S7cs opptak og av P6s
opptak og sammenlikner dem:
* 67 368 → 18 654 tegn, **106 → 106 linjer**;
* **48 714 tegn fjernet, og alle 48 714 er whitespace** (målt, ikke resonnert);
* linje for linje, whitespace-normalisert: **IDENTISK**;
* per-linje ikke-whitespace-sekvens: **IDENTISK**.
**Måling 2 — den navngitte kandidaten, og hvorfor den ikke kan forklare nullen:** celle-grensen ER
tapt som skilletegn. `Post` og `SUM` sto i hver sin kolonne i S7c (`'Post' + 160 mellomrom`) og står
etter kollapsen som `Post SUM` på én linje — nøyaktig tapet `collapse_padding`s docstring og funn
4/5 § 2.5 uttalte på forhånd. **Men den grensen var INTAKT i S7c, og S7c ga NØYAKTIG SAMME NULL**
(0 av 11 svar). En egenskap som var til stede da utfallet var null, kan ikke være årsaken til at
utfallet er null. Nullen er ELDRE enn kollapsen.
**Konklusjonen er (i):** bytene nådde modellen (6 forekomster i 2 av 5 prompter, etikett og beløp på
samme linje), og modellen bygde likevel forslaget sitt utelukkende på merkekravene i de generelle
tekniske kravene — det ENE utdraget den navngir — og myntet kostkoder for det. Kollapsen endret
LESBARHETEN (målt) uten å endre HVA modellen valgte å bygge på.
**Derfor justeres kollapsen ikke her.** Pkt. 5s plikt («et notat er IKKE et akseptabelt svar»)
gjelder tilfelle (ii), og (ii) er målt bort. Å innføre et skilletegn nå ville vært å endre en søm på
grunnlag av en hypotese som er falsifisert, og ville dessuten vært nøyaktig det skjønnet
`collapse_padding` finnes for å unngå. Blindsonen har flyttet seg videre: fra RANGERINGEN (S7c) til
LESNINGEN (funn 5) til **VALGET** — hvilket dokument modellen bestemmer seg for å bygge på.
---
## 6. Honesty limits
* **Én kjøring er én kjøring.** Én modell (`gpt-4-1-mini`), ett deployment, ingen gjentakelse,
ingen varians målt. At samme argv kjørt om igjen ville gitt samme null, er ikke vist — og P6 vs
S7c viser nettopp at BANEN varierer (5 vs 11 prompter, `ValidatedProposal` vs `Rejection`) selv
når svaret på (a) ikke gjør det.
* **Payloaden har 9 medlemmer per utdrag** og er eldre enn P3/okf-feltfiksen (14 på N-bundlene).
Det er bevisst — den skal være byte-identisk med S7cs — men det betyr at `title` / `req_number` /
`sources` IKKE nådde prompten her. Om de nye feltene ville flyttet modellens VALG er ikke målt.
* **At en annen modell ville lest kollapsen annerledes er ikke målt.** Særlig: en større modell kan
tenkes å lese en padded tabell like godt som en kollapset.
* **Kjøringen er UFORANKRET** (ingen `cost-baseline.json` i basen; stage 0 hoppet over), så
validatoren kunne per konstruksjon ikke felle de oppdiktede kodene. `--require-cost-baseline`
ville nektet kjøringen før første kall — det er F4s dør, og den er ikke brukt her fordi
spørsmålet var hva modellen LESER, ikke hva gaten slipper gjennom.
* **`Adef` er ikke kjørt** (den bar aldri prisskjemaet), så sammenlikningen er Aopen mot Aopen.
* **Nullens årsak er skilt, men ikke forklart.** At modellen VELGER de tekniske kravene framfor
prisskjemaet er observert i to kjøringer; hvorfor, er ikke målt.
---
## 7. Reproduksjon (gratis)
```
uv run --with tiktoken python scratchpad/s7c/preflight_p6.py # utdraget før/etter kollaps
uv run --with tiktoken python scratchpad/s7c/analyse_p6.py # (a)/(b)/(c) med begge kontroller
uv run --with tiktoken python scratchpad/s7c/diff_p6_vs_s7c.py # hva som faktisk forsvant
```
Alle tre leser opptak som allerede ligger i `scratchpad/s7c/` (utracket) og gjør null nettverkskall.