feat(simulation): the demo's gate is anchored to real cost lines (P4 pkt. 0)
The validator can reconcile a proposal against the project's actual cost lines (S4.0 stage 0), but only when the knowledge base ships a cost-baseline.json — and no bundle under shared/ has one. So on stage the gate reasoned only about numbers the proposal supplied itself. The reserve can never receive the file in shared/ (pull-only subtree, and demo criterion 8 requires the goldens byte-unchanged). That is a placement constraint, not an impossibility: materialize_anchored_bundle copies the bundle and adds the file outside shared/, and the run path reads it through exactly the seam a delivered bundle would use. The baseline is DERIVED IN CODE from the scripted register, never typed beside it — two sources of the same numbers drift, and drift is precisely what the 10 % probe models. On GO day the direction reverses (plan P3 b). Both scripted replies must state the same cost lines or ValueError: were they to differ, hypothesis #1 would be falsified by stage 0 instead of by P90 — the same REJECTED line on screen, a different mechanism behind it. 10 % probe, measured: baseline x 1.10 -> FORKASTET at stage 0, before the solver; corrected -> FORESLÅTT. Criterion 6 re-measured (stdout byte-identical across two runs); stderr unchanged at 6 lines. The ONLY diff against the un-anchored demo is the new KUNNSKAPSBASE block — everything else is byte-identical, which is the problem: an anchoring nobody can see is one nobody can check. Hence it is printed, and hence `provenance` is a required argument. 769 -> 775 passed. Five mutations red + green control. The measurement failed the TEST first: "ingen kostbaseline erklært" CONTAINS "kostbaseline erklært", and ENERGI-TOTAL-EL already appears in the Step-2 line, so both assertions survived the detach mutation. The two branches now share no wording. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GD6Y2Y23NZZxPYtSRoCmst
This commit is contained in:
parent
1e11dcb96c
commit
1522e2aaaa
5 changed files with 364 additions and 4 deletions
21
CLAUDE.md
21
CLAUDE.md
|
|
@ -301,6 +301,27 @@ Python ≥3.10. MAF (`agent-framework-core` 1.9.0). Pakkehåndtering: `uv`. To b
|
|||
tvetydighet · detach `project_id`-argumentet. **Flip-key-testen ble skrevet om under målingen** —
|
||||
første form asserterte på FØRSTE register-oppføring, der «den matchede kandidatens nøkkel» og
|
||||
«`candidates[0]`s nøkkel» sammenfaller; den kunne ikke skille de to implementasjonene.
|
||||
- **Demoen kjører FORANKRET, og baselinen DERIVERES fra manuset (P4 pkt. 0):** før dette regnet
|
||||
validatoren i demoen kun på tall forslaget selv oppga — S4.0-forankringen aktiveres bare når
|
||||
kunnskapsbasen shipper `cost-baseline.json`, og ingen bundle under `shared/` har den. Reserven kan
|
||||
aldri få fila DER (pull-only subtree + kriterium 8 krever goldenene byte-uendret), men det er en
|
||||
*plasserings*-begrensning: `materialize_anchored_bundle` KOPIERER bundelen og legger fila til
|
||||
utenfor `shared/`, og kjørestien (`run.py` → `load_optional_cost_baseline`) er da NØYAKTIG samme
|
||||
søm en levert bundle ville brukt. **Retningen på avledningen er bærende:** reservens tall er
|
||||
syntetiske, så manus-registeret er eneste grunnsannhet — `baseline_from_scripted_candidate`
|
||||
avleder i KODE, aldri en andre håndskrevet kopi av de samme tallene (to kilder drifter, og drift
|
||||
er nøyaktig det 10 %-prøven modellerer). På GO-dagen snus retningen (plan P3 b: registeret skrives
|
||||
FRA levert fil). Begge skriptede svar må oppgi SAMME kostlinjer (`ValueError` ellers): var de
|
||||
ulike, ville hypotese #1 blitt avvist av stage 0 istedenfor av P90 — samme REJECTED-linje på
|
||||
skjermen, annen mekanisme. **Forankringen er usynlig i alt annet stdout** (målt: eneste diff mot
|
||||
uforankret er KUNNSKAPSBASE-blokka), derfor printes den erklærte baselinen, og derfor er
|
||||
`provenance` et PÅKREVD argument til `_baseline_lines` — kallstedet som velger bundelen er det
|
||||
eneste som vet hvor tallene kom fra. Load-bearing MÅLT
|
||||
(`tests/test_anchored_reserve_loadbearing.py`), fem mutasjoner røde + grønn kontroll: detach
|
||||
main-wiringen · detach fil-skrivingen · la filnavnet drifte · detach to-svars-enigheten · returner
|
||||
et literal i stedet for det avledede. **Målingen felte TESTEN først** (samme klasse som 08-06):
|
||||
«ingen kostbaseline erklært» INNEHOLDER «kostbaseline erklært», og `ENERGI-TOTAL-EL` står allerede
|
||||
i Steg 2-linja — begge assertene overlevde detach-mutasjonen. De to grenene deler nå ingen ordlyd.
|
||||
- **Delt ekspert-persona som Agent Skill (§8, framework-nøytral):** ekspert-reviewer-personaen bor i
|
||||
`shared/skills/expert-reviewer/` (`SKILL.md` + `references/example-verdict.json`) og er den ENE
|
||||
delte artefakten begge stacker instansierer reviewer-en fra. `shared/` forblir REN DATA — MAF-siden
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue