docs(claude): to invariantrader for BLOCKER-1 og MAJOR-1 (ORDRE 20260902T151931Z)

UTOVER ordrens bokstav: ordren ba om «egen commit per halvdel» og sa ingenting
om hovedboka. Raden legges likevel til fordi repoets invariant-disiplin er at
hver load-bearing beslutning baerer maalingen som tvang den og testen som gaar
roed naar den oppheves — en beslutning uten rad raatner.

To rader: plantekst-vs-repr (fire steder, fire mutasjoner EN PER LINJE, og
hvorfor `current_progress` er BEVISST uroert), og generalproevens to halvdeler
(ni mutasjoner, soesken-forholdet til `ToolCallRecorder`, og den tolvte
vakuoes-gate-falsifiseringen).

To ting er UTTALT som uvitnet/maalt etter en ekstra maaling, ikke paastaatt:
(1) recorder-wiringen i `resume_exploration` er DEFENSIV — aa detache KUN den
andre forekomsten lot hele suiten staa groenn (1087/5), saa ingen test holder
den (`budget_stop`-presedensen); (2) aa skripte navigatoeren alene aapner
INGENTING — med en konstant manager konkluderer kjoeringen etter en runde uten
aa gi noen deltaker en tur, saa manageren maa selv faa et trinn-manus per
stadium.

Co-Authored-By: Claude <claude-opus-5>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-02 18:47:03 +02:00
commit 67eb8939d3

View file

@ -1113,6 +1113,72 @@ Python ≥3.10. MAF (`agent-framework-core` 1.9.0). Pakkehåndtering: `uv`. To b
utfall. **Migreringsnote:** ingen ekstern kaller brekker — hosting utvider, CLI-ens gamle utfall. **Migreringsnote:** ingen ekstern kaller brekker — hosting utvider, CLI-ens gamle
flaggform er uendret, og det som ENDRER seg er at en flaggløs kjøring nå SIER at ingen dømte i flaggform er uendret, og det som ENDRER seg er at en flaggløs kjøring nå SIER at ingen dømte i
stedet for å påstå `decision=approved`. stedet for å påstå `decision=approved`.
- **Planen et menneske signerer er TEKST, aldri en objekt-repr — og fraværet av repr er en EGEN,
bredere assert (BLOCKER-1, økt 67):** fire steder gjorde `str(review.plan)` på en MAF `Message`
som ikke har noen `__str__` (MÅLT: `type(Message).__str__ is object.__str__`), så BEGGE
HITL-dørene viste og lagret `<agent_framework._types.Message object at 0x…>`: terminalen F4
spør ved (`explore.py:1395`), de to opptakene i `plan_reviews` (`:1404` approve, `:1418` revise)
og den PARKERTE spørsmålsfila U12 (`:1478`) — det ENESTE som krysser prosessgrensen. En ekspert
som svarte `approve` signerte blindt. Fiksen er den eksisterende `_plan_text` (`:966`) på alle
fire; ingen ny hjelper. **Fire asserts var grønne mot defekten fordi de var TRUTHINESS eller
SELV-SAMMENLIGNING:** `reviews[1]["plan"] != ""`, `waiting[0].plan`, og
`reviews[0]["plan"][:40] in out` — den siste sammenlignet den samme repr-en med seg selv, så de
to flatene var enige mens begge var uleselige. Diskriminatoren er innhold som KUN kan komme av
`Message.text`: MAF komponerer plan-meldingen rundt managerens svar ORDRETT (målt), så en
sentinel i det skriptede svaret er til stede når teksten ble tatt og fraværende når repr-en ble
det. Sentinelen bor i et `reason`-felt fordi ingenting leser dem — å nøkle den til en ANSWER
ville endret kjøringen den måler. **`str(review.current_progress)` (`:1396`/`:1479`) er BEVISST
urørt:** den er en `MagenticProgressLedger | None`, ikke en `Message`, og pydantic renderer den
lesbart (målt) — men i disse kjøringene er den `None`, så terminalen skriver «progress so far:
None». Annen defekt, annen ordre. Load-bearing MÅLT
(`tests/test_plan_review_cli_door_loadbearing.py` + `tests/test_async_plan_review_loadbearing.py`),
fire mutasjoner — **ÉN PER LINJE**, fordi ordrens ene samlede revert undertestet og `:1418` er
revise-grenens egen kopi som ellers ikke hadde noe rødt vitne: `:1395` → 1 rød (stdout) ·
`:1404` → 2 · `:1418` → 1 (T1 alene) · `:1478` → 1 (async T9). Golden byte-uendret.
- **Generalprøven kan ÅPNE en base, og artefaktet sier hvilken (MAJOR-1, økt 67):** `--scripted-replies`
tok ÉN konstant streng per rolle, så ingen skriptet rolle kunne emittere et `function_call`
MÅLT 0 verktøykall / 0 approaches / 1 runde på 4/4 baser, mens hvert annet felt i
`{run_id}-exploration.json` så ut som en kjøring som hadde virket. Måleprotokollens gratis trinn
(«bevis så mye som mulig før det dyre») kunne altså ikke bevise at navigatøren åpner noe, og
etter en BETALT kjøring kunne ingen lese om den gjorde det. To halvdeler, hver gatet så den ANDRE
ikke kan bære den. **(a) `ExplorationToolRecorder`** — en `FunctionMiddleware`
utforskningsagentene som registrerer NAVN + `bundle_id`-argumentet i KALL-REKKEFØLGE på den
kaller-eide `ExplorationTrace`; `trace_payload` skriver det ved siden av `quick_validations`.
**SØSKEN av `mcp_tools.ToolCallRecorder`, aldri en gjenbruk:** den filtrerer til KONFIGURERTE
eksterne verktøy, dedupliserer per `(server, tool)` og returnerer SORTERT, fordi dens rad er en
egress-påstand; denne beholder rekkefølge uten dedup, fordi et sortert dedupet sett ikke kan
skille en generalprøve som LESTE en base fra en som bare listet dem. Å generalisere den ene til å
tjene begge ville brutt den andre. RESULTATET registreres ALDRI — det er basens innhold, altså
nettopp det MAJOR-3 målte til 7393 % av alle prompt-tokens. Wiret i BEGGE workflow-byggene
(`explore()` OG `resume_exploration()`) — men **resume-armen er DEFENSIV og UVITNET, og det er
målt, ikke antatt** (`budget_stop`-presedensen): å detache KUN den andre forekomsten lot hele
suiten stå grønn (1087/5), fordi ingen park/resume-scenario under det skriptede manuset når en
verktøykropp. Den står fordi et gjenopptatt leg ellers ville registrert null verktøykall — samme
stille gap som `plan_reviews.extend` i økt 64 — ikke fordi en test holder den.
**(b) et trinn-MANUS** — en utforskningsrolle kan få en LISTE der et trinn er tekst eller ETT
`{"call": "<tool>", "args": {…}}`. Formen utvider den ENE kanoniske `_inner_get_response`-kroppen
(S2.5), aldri en andre klient: manuset ligger VED SIDEN AV selektoren (en selektor returnerer
`str` ved kontrakt, og et verktøykall er ikke tekst), og et utløpt manus faller tilbake på
selektoren — degradering til konstantformen, ikke til stillhet. Listeformen NEKTES for debattens
roller ved navn, og hvert malformet trinn nektes ved navn (validering, ALDRI reparasjon).
**Å skripte navigatøren er IKKE nok, og det er MÅLT:** med en KONSTANT manager konkluderer
kjøringen etter én runde uten å ha gitt noen deltaker en tur, så `tool_calls` forblir tomt
uansett hva navigatøren fikk. Manageren må selv få et trinn-manus — én tekst per stadium (fakta,
plan, ledger, ledger, sluttsvar), samme grunn `simulation._exploration_manager_reply` nøkler på
PROMPTEN og ikke prosjekt-ID-en: manageren får fem ULIKE spørsmål og én konstant svarer alle fem
med første rundes ledger. Kontroll-testen med konstant navigatør (og manager i stadier) er dét
som holder de to formene fra hverandre.
Load-bearing MÅLT (`tests/test_scripted_explore_door_loadbearing.py`, 12 armer), **ni mutasjoner
alle røde mot HELE suiten** + grønn kontroll 1087/5 og golden BYTE-UENDRET: detach recorderen
fra begge byggene (1) · dropp `tool_calls` fra `trace_payload` (3) · sorter+dedupliser sinken (2)
· registrer navnet uten basen (3) · nekt listeformen igjen (2) · aksepter lista men emitter tekst
(1) · toler et malformet trinn (1) · la en debattrolle ta listeformen (1) · dropp
ukjent-nøkkel-whitelisten (1). **ÉN MUTASJON FALSIFISERTE TESTEN FØRST (repoets
vakuøs-gate-klasse, TOLVTE gang):** nekt-testen brukte `{"invoke": …}` og sto GRØNN med
forms-sjekken detached — UKJENT-NØKKEL-grenen fanget den i stedet, så nekten under test hadde
intet vitne. To grener, to armer, to mutasjoner. Ærlighets-grense, uttalt: at en LEVENDE modell
kaller verktøyene er fortsatt ikke bevist (structured-output-grensens klasse) — dette gjør den
GRATIS halvdelen av stigen ekte, ikke den betalte.
- **STATE.md er local-only** (gitignored). Voyage session-state er efemert; STATE.md er kanonisk kontinuitet. - **STATE.md er local-only** (gitignored). Voyage session-state er efemert; STATE.md er kanonisk kontinuitet.
- Prosess: Voyage-plugin (`/trekbrief → /trekplan → /trekexecute → /trekreview`) per større fase. - Prosess: Voyage-plugin (`/trekbrief → /trekplan → /trekexecute → /trekreview`) per større fase.