portfolio-optimiser/docs/2026-09-07-prepass-mater-q5b-k2.md
Kjell Tore Guttormsen 76b939b3b8 feat(prepass): --prepass-seed makes the cut a starting point, and K2 says it costs
Q5 = B, bygget som MAALT OPSJON. --prepass-payload gir DEBATTEN et deklarert
kutt og trekker de fire navigatoerverktoeyene; --prepass-seed gir UTFORSKNINGEN
det samme kuttet som utgangspunkt og BEHOLDER verktoeyene.

Nekten M32/F4 staar ORDRETT. B er et nytt flagg, aldri en loesning av den, og
hjemmelen er konsumkontraktens SS 2.2: en skill maa ikke lese «outside what the
payload delivers or explicitly names as reachable». Andre ledd er hele arm B, og
PrepassDeclaration.rest_reachable er det som gjoer de to lesningene skillbare i
ettertid -- paakrevd uten default av cost_baseline_anchoreds grunn, fordi begge
defaults ville loeyet om hvilken arm som leste kuttet.

Soemmene:
  admit_payload er EN opptaks-gate (form -> montert base -> tom-leveranse-nekt)
    delt av begge doerer; to kopier ville latt en doer slippe inn det den andre
    nekter.
  render_seed deler header, regel->ANTALL-foldingen og DATA-blokkene med
    render_context. Det eneste som skiller dem er avsnittet som sier hva
    leseren kan gjoere videre.
  explore(seed_context=...) legger kuttet i TASK-MELDINGEN, aldri i prompt:
    _finish bygger Mandate.objective av prompt, og en kommisjon med 22 335
    tokens utdrag i objektivet er uleselig for den som skrev den. Tom streng gir
    en byte-identisk task-melding.
  trace_payload(prepass=...) skriver deklarasjonen fra en finally. MAALT baerende
    -- den seedede kjoeringen som doede paa en Azure-400 etterlot likevel kuttet
    deklarert.
  Fem nekter ved navn. --checkpoint-dir baerer en beslutning: en gjenopptatt
    etappe kjoerer i en prosess som aldri saa payloaden og ville overskrevet den
    parkerte etappens deklarasjon med prepass: null.
  --dimension-config er BEVISST ikke nektet (arm A nekter den): maalt bygger
    utforskningen navigator_tools(bundle_dirs) UTEN dimensjon, saa aa skope
    seedet ville nektet tekst den samme loekka kan aapne et oeyeblikk senere.

MAALT PAA K2 MED LEVENDE MODELL, og maalingen taler MOT aa gjoere B til default:
like-for-like gratis 4 317 -> 227 675 o200k (x 52,7), og betalt er manageren
x 21 paa samme antall prompter. Viktigere enn prisen: den USEEDETE kontrollen
hentet prisskjemaet i fire steg (del-ii-bilag-7-prisskjema/prissammenstilling-
sheet-1.md), mens BEGGE seedede armer lot vaere -- den ene med null verktoeykall
fordi manageren rutet til hypotesisereren i alle tre runder, den andre ved aa
gjette stier ut av kuttets egne konsept-navn og mynte en base-id som ikke finnes.
Erkjennelsen kom (manageren skrev i hver runde at utdragene ikke rakk),
handlingen ikke. Ingen av de 40 svarene brukte ett eneste av kontraktens fem
literaler. NOK 2,78 av taket 5, 0 x 429. Anbefaling skrevet, beslutning ikke
tatt -- den er operatoerens.

Load-bearing maalt: 26 armer, 16 mutasjoner alle roede mot HELE suiten, groenn
kontroll 1493 passed / 5 skipped (fra 1467/5; +26 node-ider, 0 fjernet), golden
demo-transcript.stdout byte-uendret (shasum -a 1 av innholdet =
ea8c534773acdbe41ae68f2c55724d69aaf8be4f).

To armer var GROENNE AV FEIL GRUNN og ble rettet, ikke droppet: tool_calls alene
kan ikke skille «et verktoey ble kalt» fra «basen var aapen», fordi recorderen
appender FOER call_next; og id-enighets-armen maalte den stale digesten i stedet
for id-gaten. Sonden var dessuten feil foer koden var det -- foerste
diskriminator var norsk, og verktoeysvar serialiseres med \uXXXX-escapes.

Avvik, uttalt: implementasjonen ble skrevet FOER testfila. Roedmaalingen er gjort
etterpaa ved aa reversere src/ til HEAD (16 av 24 armer roede), deretter
restaurert med shasum-verifikasjon. Beviset er ekte, rekkefoelgen var ikke.

Rapportert, ikke fikset: ChatClientException (Azure 400, «No tool call found for
function call output») etter tre quick_validate-nekter paa rad -- den ligger
utenfor main()s nekt-tuppel og forlater CLI-en som traceback.

Azure-konfigurasjonen er uendret; endepunktet utledes inline fra az og er aldri
lagret i fil. Ruff + mypy rene.

Maaling: docs/2026-09-07-prepass-mater-q5b-k2.md
Ordre: 20260907T234344Z-9062321009-from-.claude

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

303 lines
17 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.

# Q5=B — pre-passet MATER utforskningen: `--prepass-seed`, målt på K2 med levende modell
**Dato:** 2026-09-08 (ordre datert 2026-09-07) · **Ordre:** `20260907T234344Z-9062321009-from-.claude` ·
**Beslutning:** `~/.claude/docs/2026-09-07-vurdering-arbeidssystemet.md` rad 0 / § 3 Q5 —
**A forblir default, B bygges som MÅLT OPSJON.** ·
**Forrige ledd:** `docs/2026-09-07-okf-prepass-i-debatten.md` (kuttet i debatten) og
`docs/2026-09-07-syretest-s7-prepass-k2.md` (armene A og C, betalt i økt 98).
Dette er **både en leveranse og en måling**. Koden er ny og gatet (26 armer, 16 mutasjoner alle
røde); tallene under er produsert av kommandoer som står i teksten, og måleoppsettet ligger utenfor
treet (`scratchpad/q5b/`, utracket).
---
## 0. Hva som ER målt, og hva som IKKE er det
**Målt her:** at `--prepass-seed` gir utforskningen det deklarerte kuttet som **utgangspunkt** og
**beholder** de fire navigatørverktøyene; at deklarasjonen sier `rest_reachable: true` på stdout og
i `{run_id}-exploration.json`; at nekten M32/F4 (`--prepass-payload` + `--explore`) står ordrett; at
kjøringen uten flagget er byte-uendret. Deretter **tre betalte armer på K2** med levende
`gpt-4.1-mini`: én useedet kontroll og **to** seedede kjøringer, med kjent-positiv assertert først i
hver.
**IKKE målt:** at en modell dømmer **bedre** med et seedet kutt. Tre kjøringer på ett spørsmål er
ikke et utvalg, og de tre endte av tre ulike grunner (rundetak · rundetak · en Azure-400). Én
kjøring er én kjøring; at den seedede atferden gikk i **samme retning to ganger** er sterkere enn
én, og fortsatt ikke et utvalg. **Heller ikke målt:** siteringene i stempelet — ingen av de tre
armene nådde pipelinen (§ 5), og den seedede armens pris gjør en full kjøring uoppnåelig innenfor
taket på NOK 5, hvilket er selve funnet snarere enn et hull i det.
**Kjent-positiv, kjørt FØRST og `assert`-et i hver eneste betalte kjøring:** rotnivå-listingen på
**levert** K2 måler **3 954 tegn / 1 495 o200k-tokens over 629 konseptfiler** — S7a-3s publiserte
tall, eksakt. `scratchpad/q5b/live/live_q5b.py` nekter å kjøre videre uten den; utskriften står
øverst i hver armlogg.
---
## 1. Nekten M32/F4 — hvorfor den ble valgt, skrevet ned FØR den ble rørt
Ordrett fra `src/portfolio_optimiser/run.py`, slik den sto ved øktstart:
```
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)
```
Grunnen i kommentaren over den: utforskningen leser HELE basen med de fire verktøyene og former så
mandatet debatten får beskjed om at den ikke må gå utenfor — «that is precisely the ground on which
the debate's own tools are withdrawn, one caller over».
**B opphever ikke dette.** Nekten står, ordrett, og har sitt eget vitne
(`test_the_replacing_arm_is_still_refused_with_explore_in_the_same_words`). B er et **nytt flagg**
med motsatt oppførsel på den ene aksen nekten handler om: kuttet **erstatter ikke** basen, det er
hvor man **begynner**, og verktøyene blir. Kontrakten sier selv at det er lov —
`llm-ingestion-okf/docs/consumption-contract.md` § 2.2: en skill må ikke lese «outside what the
payload delivers **or explicitly names as reachable**». Andre ledd er hele hjemmelen for arm B, og
`PrepassDeclaration.rest_reachable` er det som gjør de to lesningene skillbare i ettertid.
Navnet: ordren foreslo `--prepass-seed`, og kontrakten antyder ingen bedre. «Seed» er dessuten
repoets eget ord for et **bevart utgangspunkt** (`explore(seed_approaches=…)`, § C.6 dør 1).
---
## 2. Hva som ble bygget
| Søm | Hva |
|---|---|
| `prepass.admit_payload` | ÉN opptaks-gate — form, montert base, tom-leveranse-nekt — delt av BEGGE dører. To kopier ville latt én dør slippe inn det den andre nekter (kø-(p)). |
| `prepass.render_seed` | Arm B-renderingen. Deler header, regel→ANTALL-foldingen og DATA-blokkene med `render_context`; **det eneste som skiller dem er avsnittet som sier hva leseren kan gjøre videre.** |
| `PrepassDeclaration.rest_reachable` | **Påkrevd uten default** (`cost_baseline_anchored`-regelen: begge defaults ville løyet). Når artefaktet via `declaration_payload`. |
| `explore(seed_context=…)` | Kuttet rir i **TASK-MELDINGEN**, aldri i `prompt``_finish` bygger `Mandate.objective` av `prompt`, og en kommisjon med 22 335 tokens utdrag i objektivet er uleselig for den som skrev den. Tom streng ⇒ byte-identisk med i dag. |
| `trace_payload(prepass=…)` | Deklarasjonen inn i `{run_id}-exploration.json`, skrevet fra `finally`. **Defaulter til `None`** (`skipped_links`-halvdelen: fravær er et ærlig positivt utsagn). |
| `run.prepass_notice` | ÉN renderer, to armer. Uten `rest_reachable` ville «8 av 630» sagt det motsatte av sannheten i nøyaktig ett av de to tilfellene. |
| Fem nekter | `--prepass-seed` krever `--explore`; refusert med `--prepass-payload` (to motsatte armer), `--portfolio`, `--report` og `--checkpoint-dir`. |
**`--checkpoint-dir`-nekten er ikke pynt:** en parkert etappe skriver `{run_id}-exploration.json`
med deklarasjonen; den GJENOPPTATTE etappen kjører i en prosess som aldri så payloaden og
overskriver samme fil med `prepass: null`. En deklarasjon som fordamper halvveis er verre enn en
nektet, og den ville gjort det i stillhet.
**`--dimension-config` er BEVISST ikke nektet** — arm A nekter den. Målt: utforskningen bygger
`navigator_tools(bundle_dirs)` **uten** dimensjon, så å skope seedet ville nektet tekst den samme
løkka kan åpne med `read_file` et øyeblikk senere. Debatten nedstrøms er skopet som før.
---
## 3. Instrumentet, og hva det målte GRATIS før noe ble betalt
Samme manus, samme base, samme spørsmål, kun flagget skiller:
```bash
scratchpad/prepass-venv/bin/python scratchpad/q5b/live/rehearse.py seed # 227 675 o200k
scratchpad/prepass-venv/bin/python scratchpad/q5b/live/rehearse.py plain # 4 317 o200k
```
**19 prompter i begge. 4 317 mot 227 675 o200k-tokens — × 52,7.** 225 518 av de 227 675 er de
**fire manager-promptene**: utforskningens deltakere deler ÉN samtalehistorikk, så task-meldingen
rir i hver prompt — MAJOR-3-målingen ett lag opp, nå på et kutt i stedet for en base.
Rendringen selv: `render_seed` = **75 614 tegn / 22 335 o200k**, `render_context` = 75 341 / 22 283.
Forskjellen mellom armene er 273 tegn prosa. **Hver manager-prompt bar ~45 000 tokens**, altså
kuttet omtrent to ganger — MAF legger task-teksten både i system- og bruker-rollen.
---
## 4. Tre betalte armer på K2
Base `k2-trinn1-20260903`, ref `sha256-tree:4ffd750c…`, 630 konsepter. Payload fra økt 98:
**8 levert / 622 holdt tilbake** (`below_k` 261, `no_lexical_match` 359, `over_budget_alone` 2).
Spørsmålet er ORDRETT S7as og S7s: `Finn kostnadsbesparelser i Stange skole-anbudet`.
```bash
export PORTFOLIO_FOUNDRY_PROJECT_ENDPOINT=# utledet INLINE fra `az`, aldri i fil
export PORTFOLIO_MODEL_MAP=scratchpad/major2-live/model_map.json
export PACE_SECONDS=2
scratchpad/prepass-venv/bin/python scratchpad/q5b/live/live_q5b.py {Bplain|Bseed|Bseed2}
# argv: K2 --profile azure --docs-dir <base> --bundle-dir <base>
# --explore "Finn kostnadsbesparelser i Stange skole-anbudet" --explore-config <fil>
# --outbox-dir … --run-id … [+ --prepass-seed <payload> for Bseed/Bseed2]
# bounds: max_rounds=3, max_tokens=1 000 000, max_stall_count=2, max_reset_count=1
```
Deployment `gpt-4.1-mini` (GlobalStandard, `capacity` 100, versjon `2025-04-14`) — **målt med
`az cognitiveservices account deployment show`, ingen konfig rørt.**
| Arm | Prompter | Input | Output | NOK | Verktøykall | **Nådde prisskjemaet?** | Slutt |
|---|---:|---:|---:|---:|---:|---|---|
| **Bplain** (useedet) | 12 | 35 914 | 2 284 | 0,168 | 4 | **JA**`del-ii-bilag-7-prisskjema/prissammenstilling-sheet-1.md` | rundetak 3/3 |
| **Bseed** | 20 | 376 127 | 3 590 | 1,458 | 12 | **NEI** | Azure 400 (§ 6) |
| **Bseed2** | 8 | 299 160 | 2 403 | 1,153 | **0** | **NEI** | rundetak 3/3 |
Per fase (BudgetMiddleware-ledgeren, input-tokens):
| Rolle | Bplain | Bseed | Bseed2 |
|---|---:|---:|---:|
| manager (5 prompter i alle tre) | 14 204 | **310 430** | **298 230** |
| navigator | 14 975 (6) | 63 237 (10) | — (0) |
| hypothesiser | 6 735 (1) | 2 460 (5) | 930 (3) |
**Manageren alene er × 21,9 og × 21,0 dyrere seedet, på samme antall prompter.**
### Den useedete armen fant prisskjemaet i fire steg
```
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)
```
Nøyaktig samme fire steg som S7s arm C (`docs/2026-09-07-syretest-s7-prepass-k2.md` § 4), og
prompt 9 er modellens egen oppsummering av prisrammen. Hypotesisereren resonnerte deretter om
«tiltransporterte kontrakter» — en retning forankret i tallene den faktisk hadde lest.
### De seedede armene gjorde det ikke — og de to gjorde det på hver sin måte
**Bseed2 er den rene:** manageren rutet til **hypothesiser i alle tre runder**. Navigatøren fikk
aldri en tur, og null verktøykall ble gjort — mens manageren i hver eneste runde skrev at utdragene
«do not explicitly enumerate … costs». Den **så** at kuttet ikke rakk, og gikk likevel ikke og så
etter. Hypotesene ble deretter generiske: `Early Integration Testing`, `Modular Component Design`,
«prefabricated building components» — ingen av dem forankret i en kostlinje.
**Bseed vandret, og feil vei.** Sporet (`{run_id}-exploration.json`, S7a-3 pkt. 3 gir stien):
```
quick_validate | renholdstekniske_funksjonskrav ← OPPDIKTET base-id, 3×, alle nektet
list_bundles → read_bundle → read_dir(del-ii-bilag-1-2-renholdstekniske-…)
→ read_file(…/1-1/1-1.md) ← finnes ikke
→ read_dir(…/1-1) → read_file(…/03-01-2023-vask-av-layout.md) ← ALLEREDE LEVERT
→ read_file(inbox-del-ii-bilag-7-prisskjema.md) ← finnes ikke
→ read_file(del-ii-bilag-7-prisskjema) ← katalog, nektet ved navn
→ read_file(del-ii-bilag-7-prisskjema.md) ← finnes ikke
```
Tre ting står her. (1) Hypotesisereren **myntet en base-id av et levert konsepts navn**
(`renholdstekniske_funksjonskrav`) og fikk tre nekter på rad, hvorpå MAF sluttet å tillate
verktøykall for den forespørselen. (2) Navigatøren gikk inn i katalogen til et konsept den
**allerede hadde i prompten** og leste det på nytt. (3) Den prøvde prisskjemaet **tre ganger** og
bommet på formen hver gang — den kom aldri på å kalle `read_dir` på katalogen, som er nøyaktig det
steget den useedete armen tok.
### Nevnerne: hva modellen sa om dem
**Ingen av de tre armene brukte ett eneste av kontraktens fem literaler** (`[unread]`,
`[sourced-not-sufficient]`, `[unverifiable-from-bundle]`, `extracted`, `derived`), og ingen nevnte
`630`, `622` eller `8`. Nevner: 40 svar over tre armer. Kontrast: S7s arm A — kuttet i **debatten**,
verktøyene **trukket** — brukte `[sourced-not-sufficient]` ordrett (1 i renderingen → 1 i svaret).
Manageren sa det likevel, i sine egne ord og i hver runde: «without explicit enumeration or direct
[cost data]». **Erkjennelsen kom; handlingen kom ikke.**
### Refererte konsept-id-er ∩ levert
**0 av 0 i Bplain, 0 av 4 og 0 av 2 i de seedede.** Ingen modell refererte til en konsept-id i
prosa i det hele tatt; de fire/to «id-lignende strengene» i de seedede armene er vanlige
skråstreker i prosa (`cleaning/maintenance`, `material/use`). Nevneren er skrevet ned fordi
tellingen ellers ville lest som et funn om levert-mengden.
---
## 5. Siteringene i stempelet: IKKE målt, og hvorfor
Alle tre armene stoppet i utforskningen — to på rundetaket, én på en 400 — så ingen mandat ble
evaluert, ingen `SavingsProposal` ble bygget og intet `ProvenanceStamp` finnes å telle siteringer i.
Å heve rundetaket for den useedete armen ville kostet ~NOK 0,3; for en **seedet** arm anslår de
målte 6080k input-tokens per manager-prompt ~NOK 3,2, mot NOK 2,22 igjen av taket. **Det er ikke
et hull i målingen, det er målingen:** per-prompt-prisen på et seedet utforskningskutt gjør en full
pipeline-kjøring uoverkommelig innenfor det taket ordren satte.
---
## 6. Azure-400-en i Bseed — rapportert, ikke fikset
```
ChatClientException: Error code: 400 — No tool call found for function call output
with call_id call_AyeuYJmqvmmej9utu361Phtt
```
Sekvensen er målt: tre `quick_validate`-nekter på rad → MAF melder «Maximum consecutive function
call errors reached (3). Stopping further function calls for this request» → samtalen inneholder
et funksjonskall-**resultat** uten sitt kall → Responses-APIet avviser den. Feilen kommer fra
transporten, ikke fra denne ordrens kode, og den ville forlatt CLI-en som **traceback**
(`ChatClientException` er ikke i `main()`s nekt-tuppel). **Utenfor ordren; rapportert.**
---
## 7. Kostnad
Listepris, Azure Retail Prices API (`api-version=2023-01-01-preview`, `currencyCode='NOK'`,
`armRegionName=eastus`), **hentet på nytt 2026-09-08**: input **NOK 0,003734 / 1K**, output
**NOK 0,014936 / 1K** — identiske med dem økt 98 målte.
| Kjøring | Prompter | Input | Output | NOK |
|---|---:|---:|---:|---:|
| Bplain | 12 | 35 914 | 2 284 | 0,168 |
| Bseed | 20 | 376 127 | 3 590 | 1,458 |
| Bseed2 | 8 | 299 160 | 2 403 | 1,153 |
| **SUM** | **40** | **711 201** | **8 277** | **2,779** |
**NOK 2,78 — 56 % av taket på NOK 5. 429-svar: 0.** Største enkeltkall: 80 713 input-tokens
(Bseed2s siste manager-prompt).
---
## 8. Anbefaling — beslutningen er operatørens
**Målingen peker på A som default, og på B som en opsjon med et smalt bruksområde.** Grunnlaget er
tre tall og én atferd:
1. **Prisen.** × 52,7 like-for-like gratis, × 21 på manageren betalt. Kuttets tekst rir i hver
prompt fordi deltakerne deler én historikk — det er MAJOR-3-formen, og den gjelder et kutt like
fullt som en base.
2. **Effekten på navigasjonen.** Den useedete armen gikk og hentet prisskjemaet i fire steg; begge
seedede armer gjorde det ikke, den ene uten å kalle et eneste verktøy. **Et utgangspunkt ble en
endestasjon** — i én kjøring fordi manageren aldri rutet til navigatøren, i den andre fordi
modellen gjettet stier ut av kuttets egne konsept-navn.
3. **Erkjennelsen uten handlingen.** Manageren skrev i hver runde at utdragene ikke rakk, og
handlet ikke på det. Renderingen sier eksplisitt «OPEN THE BASE with your navigation tools»; det
var ikke nok. Om en skarpere formulering endrer dette er **ikke målt**.
**Der B likevel kan være riktig:** når kuttet er *ment* å være svaret og navigasjonen bare er en
sikkerhetsventil — små korpus, eller et pre-pass som er kjørt for nøyaktig dette spørsmålet av
noen som vet det. Da kjøper man en deklarert nevner uten å miste utveien. På et 630-konsept-korpus
med et leksikalsk kutt kjøpte den her verken det ene eller det andre.
**Ikke konkludert:** at A er bedre enn B *generelt*. Tre kjøringer, ett spørsmål, ett korpus, én
modell.
---
## 9. Ærlighets-grenser, uttalt
- **Ikke-determinisme.** Tre kjøringer er ikke et utvalg. De to seedede gikk i samme retning; det
gjør retningen mer troverdig og ikke etablert.
- **De to seedede armene endte ulikt** (400 vs rundetak), så «nådde ikke prisskjemaet» er ikke
målt mot samme sluttbetingelse i begge.
- **Arm A og arm C er GJENBRUKT**, ikke re-kjørt: tallene står i
`docs/2026-09-07-syretest-s7-prepass-k2.md` § 4 og ble betalt i økt 98. De er dessuten
**debatt**-armer, mens B er en **utforskning** — sammenligningen på tvers gjelder samme base,
samme spørsmål og samme modell, aldri samme fase.
- **Prisene i K2-fixturen er syntetiske** (MAJOR-4-arven); det påvirker ikke tokenmålingene.
- **Ingen `ProvenanceStamp` finnes i noen arm** (§ 5), så siteringene er ikke talt.
- **Hosting-flaten er urørt.** Feltet er i ingen av de tre settene, så den generiske
`unknown field(s)`-400-en svarer, og Fase 4es to halvdeler står — gatet av en testarm, ikke av en
redigering.
---
## 10. Verifiseringslogg
| Påstand | Hvordan verifisert |
|---|---|
| Nekten M32/F4 står ordrett | `test_the_replacing_arm_is_still_refused_with_explore_in_the_same_words` + kilden sitert i § 1 |
| Kontraktens § 2.2 hjemler arm B | `llm-ingestion-okf/docs/consumption-contract.md`, lest i denne økten |
| Utforskningen er uskopet | `explore.fresh_exploration_workflow``navigator_tools(bundle_dirs)` uten `dimension` |
| Kjent-positiv 3 954 / 1 495 / 629 | `assert` i `live_q5b.py`, kjørt først i alle tre betalte armer |
| Deployment/kapasitet urørt | `az cognitiveservices account deployment show` (GlobalStandard, 100, `2025-04-14`) |
| NOK-prisene | Azure Retail Prices API, hentet 2026-09-08 |
| Prisskjemaet nådd/ikke nådd | `{run_id}-exploration.json``tool_calls[].path` |
| Nevnerne uten kontrakt-literaler | tokenskann over alle 40 svar |
| Gaten er load-bearing | 16 mutasjoner, alle røde mot HELE suiten; grønn kontroll **1493 passed / 5 skipped** |
| Golden byte-uendret | `shasum -a 1 tests/golden/demo-transcript.stdout` = `ea8c534773acdbe41ae68f2c55724d69aaf8be4f` (INNHOLD, ikke git-blob) |
| Suiten er et strengt supersett | `comm -23` node-id-er før/etter: **0 fjernet, 26 lagt til** |