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:
parent
2654219e8c
commit
67eb8939d3
1 changed files with 66 additions and 0 deletions
66
CLAUDE.md
66
CLAUDE.md
|
|
@ -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` på
|
||||||
|
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 73–93 % 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.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue