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

17 KiB
Raw Blame History

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:

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.

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 JAdel-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 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_workflownavigator_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.jsontool_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