docs(review): kryssmodell-review + sesjonsplan-synk mot delt beslutnings-kø D-A–D-E
Fable 5-review av D7-søskenet, speil av MAF-reviewen 2026-07-09: baseline re-verifisert (265/ruff/mypy), F2/F3/F5/F7-analoger kjørt-bevist, F1/F11 avkreftet i MAF-form, egne funn (method-spec-vakt mangler, Steg-7-inngang, SDK-versjonsvakt, D-C↔spec-kollisjon), 11/11 detach-eksperimenter røde i throwaway-kopi. Sesjonsplan: byggbare-nå C1.1/C2.5/C2.0 + D-A-gatede speil C2.7/C2.8/C3.2/C4.0.
This commit is contained in:
parent
42f320bed1
commit
3f106fcfd1
2 changed files with 436 additions and 0 deletions
169
docs/2026-07-10-sesjonsplan-d7.md
Normal file
169
docs/2026-07-10-sesjonsplan-d7.md
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
# Sesjonsplan D7 — speilings-sesjoner + egne funn (C1.1–C4.0 · delt kø D-A–D-E)
|
||||
|
||||
> **Status:** GJELDENDE sesjonsplan for dette repoet. Forfattet av kryssmodell-reviewen
|
||||
> 2026-07-10 (Fable 5) — funn-referanser (C-F2/C-F3/C-F4/C-F5/C-F7, C-N1–C-N4, C-P1) peker
|
||||
> til [reviewen](review-2026-07.md); MAF-referanser (F1–F14, D-A–D-E, S2.x/S3.x/S4.x) peker
|
||||
> til hovedrepoets `docs/review-2026-07.md` og `docs/plan/2026-07-10-sesjonsplan-fase2-6.md`.
|
||||
>
|
||||
> **Beslutnings-køen D-A–D-E er DELT med MAF-søskenet** (identisk semantikk som MAF-planens
|
||||
> §2): beslutningene tas ÉN gang av operatøren, materialiseres som commons-amendments, og
|
||||
> gjelder begge repo via PULL-ONLY subtree. Dette repoet planlegger INGEN egen variant av
|
||||
> køen — kun bygg-sesjoner gated på den. **C1.1/C2.0/C2.5 er byggbare NÅ** (ingen
|
||||
> beslutnings-avhengighet).
|
||||
>
|
||||
> Prinsipp (uendret fra I-programmet): hver sesjon er én-sesjons-stor, offline, gratis
|
||||
> (ScriptedClient), TDD (Iron Law), og Opus-eksekverbar med «Les STATE.md og følg
|
||||
> instruksjonene». Ingen live-kjøringer: D6 står — S10 var programmets ene; ny spend krever
|
||||
> eksplisitt operatør-godkjenning.
|
||||
|
||||
## 1. Den delte beslutnings-køen (operatør — tas i hovedrepoet, gjelder begge)
|
||||
|
||||
| Beslutning | Innhold (MAF-planens §2, uendret) | Blokkerer HER |
|
||||
|---|---|---|
|
||||
| **D-A** | Spec-amendments i commons: (1) nominal-gate + band-invariant (F2/C-F2); (2) kostbaseline-stage (F3/C-F3); (3) `/`-lenker → bundle-rot (F4/C-F4); (4) per-verdict seeding (F5/C-F5); (5) Magentic-tekst (MAF-only) | C2.7, C2.8, C3.2, C4.0 |
|
||||
| **D-B** | Fase-2-scope vs frossen ingest-målbilde (live-kilde, doc-konnektor, MCP-grant) | ingenting her (MAF-scope; D7 speiler evt. ingest-spec-amendments når de lander i commons) |
|
||||
| **D-C** | Vektor-store (§4.5): valg + DELT lagringsformat (.npy + jsonl er anbefalingen) | evt. C-semretrieval (ikke spesifisert her ennå) — se koblings-flagget under |
|
||||
| **D-D** | Concurrency-/feilmodell | ingenting her i dag (ingen portefølje-sti); blir gate hvis D7 får portefølje-speil |
|
||||
| **D-E** | Mål-semantikk + stack-paritet for ekte kjøring | M2-konfig på MAF-siden; her kun paritetsspørsmålet (§4.6) |
|
||||
|
||||
**Koblings-flagg til den delte køen (fra C-P1, MÅ tilbake til hovedrepoet):** D-C som
|
||||
planlagt (cosine over tekst-embeddings) kolliderer med frossen method-spec §3 Steg 1
|
||||
(«structural, never textual»). D-C må enten få et D-A-punkt som amender ranking-regelen
|
||||
bevisst, eller re-scopes til strukturelle features. Uten det er S3.1 (MAF) og enhver
|
||||
D7-speiling uimplementerbar spec-konformt.
|
||||
|
||||
**Commons-regel (alle spec-amendments):** skrives i `portfolio-optimiser-commons`, pulles
|
||||
hit med `git subtree pull --prefix=shared commons main --squash`. ALDRI subtree push.
|
||||
**Sammenligningsprotokoll-konsekvens:** etter en D-A-amendment re-pinnes/pulles subtree i
|
||||
BEGGE repo og BEGGE suiter kjøres — aldri én side alene. Endres golden-bytene, re-fryses de
|
||||
koordinert i commons (D-A eier det); begge repo konsumerer fasit uendret.
|
||||
|
||||
## 2. Byggbare NÅ (ingen beslutnings-avhengighet)
|
||||
|
||||
### C1.1 Method-spec-integritetsvakt (C-N1)
|
||||
- **Mål:** §11-raden «Spec integrity» håndheves lokalt — spec-drift i subtree-synken fanges her.
|
||||
- **Scope:** ny `tests/test_method_spec_loadbearing.py` etter `test_ingest_spec_loadbearing.py`-
|
||||
mønsteret: (1) spec-fila finnes; (2) forbidden-toolkits-liste (samme som ingest-vaktens);
|
||||
(3) §12-kontraktsfelt-dekning for feltene DENNE implementasjonen konsumerer (`decision`,
|
||||
`rationale`, `id`, `proposal_features`, `affected_codes`, `measure_type`,
|
||||
`claimed_saving_nok`, `description`, IR-feltene, golden-feltene, `type`,
|
||||
vokabular-verdiene). KUN testkode — ingen src-endring, ingen spec-endring.
|
||||
- **TDD:** testen er selv vakten — RØD-bevis via mutert spec-KOPI i tmp_path (test-parametrisert
|
||||
mot kopi, aldri mot `shared/`): fjern et felt fra §12 → rød; injiser toolkit-navn → rød;
|
||||
slett fila → rød.
|
||||
- **Verifisering:** `uv run pytest tests/test_method_spec_loadbearing.py` grønn; full gate
|
||||
(pytest/ruff/mypy) grønn; detach-bevis (mutasjons-parametrene) dokumentert i testen selv.
|
||||
|
||||
### C2.0 Steg-7 kjøresti-inngang (C-N2)
|
||||
- **Mål:** en skipbar inngang komponerer §5-sekvensen (merge inbox → seed → fold → run), så
|
||||
«a later run ingests it» er sant om en leverbar sti — ikke bare om primitivene.
|
||||
- **Scope:** ny `run.py` (offline-testbar komposisjonsfunksjon `compose_run_context(bundle_dir,
|
||||
inbox_dir=None, k=...)` + tynn CLI med `--bundle/--inbox/--out` som gjenbruker
|
||||
contracts/meter/artifacts). `run_s10.py` forblir URØRT (fasit-sti, S10-artefaktene er
|
||||
frosne). README-avsnittet om inboxen oppdateres til å peke på den nye inngangen.
|
||||
IKKE: ny live-kjøring (CLI-en testes kun med ScriptedClient; SDK-klienten wires men
|
||||
eksekveres ikke i suiten).
|
||||
- **TDD:** RØD: dom droppet i inbox-mappe → inngangens komponerte kontekst MÅ bære
|
||||
dommens markør (detach-punkt: fjern merge-kallet i komposisjonen → rød); kontroll: tom/
|
||||
manglende inbox → base-kontekst uendret; RØD: rolledelingen — inngangen skriver ALDRI
|
||||
til inboxen (byte-sammenligning før/etter).
|
||||
- **Nøkkelantakelse (testes først):** komposisjonen kan gjenbruke `fold_experience`/
|
||||
`merge_inbox_into_store` uendret — ingen ny søm, kun wiring.
|
||||
- **Verifisering:** ny testfil grønn; detach → rød; full gate grønn; `grep -n "inbox" README.md`
|
||||
viser claim som nå matcher en skipbar sti.
|
||||
|
||||
### C2.5 Inbox-herding + SDK-versjonsvakt (C-F7, C-N3, C-S3-rester)
|
||||
- **Mål:** inboxen slutter å være en uvalidert injeksjonsflate; SDK-attributt-premissene får
|
||||
en vakt som tvinger bevisst re-verifisering ved oppgradering.
|
||||
- **Scope:** (1) `merge_inbox_into_store`/`load_inbox`: decision-vokabular-sjekk (ukjent
|
||||
decision → SKIP, fortsatt tolerant, aldri raise — §4.2-vokabularet {approved, rejected,
|
||||
approved_with_adjustment} på fil-laget), konfigurerbart tak på rationale-lengde + antall
|
||||
filer per merge (fail-fast ved overskridelse, aldri stille kutt); (2) pin
|
||||
`claude-agent-sdk>=0.2,<0.3` i pyproject; (3) versjonsvakt-test som feiler med
|
||||
handlingsrettet melding når installert SDK-versjon ikke matcher pinnet serie (premissene i
|
||||
`sdk_client.py:12-17` må re-verifiseres bevisst); (4) vurder `_total_tokens`-strictness
|
||||
(delsum ved felt-drift — dokumentér valget i docstring).
|
||||
- **TDD:** RØD: inbox-fil med `decision: "hva-som-helst"` når ALDRI storen (detach
|
||||
vokabular-sjekken → den entrer → rød — reviewens kjørte bevis blir testens fixture);
|
||||
RØD: rationale > tak → skip/feil per valgt semantikk; RØD: versjonsvakt mot fake-versjon.
|
||||
- **Verifisering:** nye tester grønne + detach → rød; full gate grønn; eksisterende
|
||||
step7-suite uendret grønn (tolerant-lasting består).
|
||||
|
||||
## 3. Speilings-sesjoner (gated: D-A + commons-pull — startes IKKE før amendment er pullet)
|
||||
|
||||
> Felles mal (= MAF-planens S2.7/S3.2/S4.0-mal): amendment lander i commons → subtree-pull →
|
||||
> failing test først (moteksemplene fra reviewen ER test-fixturene) → impl → detach-bevis →
|
||||
> full gate → golden-regresjon uendret (eller koordinert re-frosset i commons FØRST).
|
||||
|
||||
### C2.7 Validator-stramming (C-F2; gated: D-A pkt. 1)
|
||||
- **Scope:** (a) strukturell blokk `claimed > nominal_feasible` → `Rejection` (i tillegg til
|
||||
p90); (b) IR-invariant: hvert band MÅ omslutte itemets `unit_cost` (Pydantic
|
||||
`model_validator`). IKKE: kostbaseline (C4.0).
|
||||
- **Premiss (VERIFISERT 2026-07-10 av reviewer):** golden- og fixture-kompatibel her — alle
|
||||
ikke-tomme bands omslutter unit_cost; golden-claim 30 000 ≤ nominal 90 000.
|
||||
- **TDD:** RØD: reviewens moteksempel #1 (claim 100k, nominal 90k, band [0.70,1.40]) → MÅ
|
||||
bli `Rejection`; RØD: band [1.8,2.2] rundt unit_cost 1.0 → `ValidationError` ved
|
||||
konstruksjon; detach nominal-blokken → moteksempel-testen rød.
|
||||
- **Filer:** `validator.py`, `ir.py`, `tests/test_validator.py`, `tests/test_ir.py`;
|
||||
`tests/test_bygg_energi_mikro.py` uendret grønn (regresjonsbevis).
|
||||
- **Verifisering:** `uv run pytest tests/test_validator.py tests/test_ir.py
|
||||
tests/test_bygg_energi_mikro.py` grønn; golden uendret; full gate grønn.
|
||||
|
||||
### C2.8 OKF `/`-lenke-mapping (C-F4; gated: D-A pkt. 3)
|
||||
- **Scope:** ledende `/` i cross-link-mål mappes til bundle-rot i `navigate_bundle`;
|
||||
boundary-sjekken består fail-closed (subkatalog-policy følger amendmentens ordlyd).
|
||||
- **TDD:** RØD: bundle med `](/tiltak.md)` → tiltaket navigeres og renders (detach mappingen
|
||||
→ kun index → rød); RØD: `](/../escape.md)` → fortsatt skippet (boundary består);
|
||||
eksisterende skip-tester oppdateres KUN slik amendmenten krever.
|
||||
- **Filer:** `okf.py`, `tests/test_okf.py`. **Merk:** MAF-siden mangler i dag en tilsvarende
|
||||
bygg-sesjon for F4 — flagget i reviewen §1 C-F4; operatøren bør legge den til der.
|
||||
- **Verifisering:** nye tester grønne + detach → rød; full gate grønn; golden-bundelen
|
||||
navigerer uendret.
|
||||
|
||||
### C3.2 Per-verdict seeding (C-F5; gated: D-A pkt. 4)
|
||||
- **Scope:** `seed_store_from_bundle` leser features fra verdict-filas EGEN frontmatter (nye
|
||||
valgfrie felt `affected_codes`/`measure_type`/`claimed_saving_nok`; fallback = dagens
|
||||
bundle-projeksjon for bakoverkompatibilitet); `promote` skriver feltene. Multi-kandidat-
|
||||
fixture repo-lokalt (aldri i `shared/` uten commons-endring).
|
||||
- **TDD:** RØD: to kandidater i én bundle → dom om B når ALDRI As hypotese-prompt via
|
||||
retrieval på As features (detach per-verdict-nøklingen → feil-folding → rød — reviewens
|
||||
F5-bevis blir fixturen); eksisterende step1/step7/step8 uendret grønne (fallback).
|
||||
- **Filer:** `experience.py`, `promotion.py`, `tests/test_step1_expel_loadbearing.py`,
|
||||
`tests/test_step8_promotion_loadbearing.py`, ny fixture + tester.
|
||||
- **Verifisering:** nye tester grønne + detach → rød; full gate grønn.
|
||||
|
||||
### C4.0 Kostbaseline-forankring (C-F3; gated: D-A pkt. 2)
|
||||
- **Scope:** baseline-projeksjon i bundle (`cost-baseline.json`, commons-amendment/fixture)
|
||||
+ fail-closed avstemmings-stage i `validate_proposal` (ukjent kode → Rejection;
|
||||
quantity/unit_cost utenfor toleranse → Rejection; toleranse konfig). Baseline-argumentet
|
||||
VALGFRITT (None = dagens oppførsel) så eksisterende suite står — men kjøresti-inngangen
|
||||
(C2.0) SETTER den når fila finnes i bundelen. Ingest-laget er den naturlige produsenten
|
||||
av projeksjonen (egen liten oppfølging hvis commons definerer format).
|
||||
- **TDD:** RØD: reviewens F3-moteksempel (diktet kode, 10 MNOK) → Rejection «unknown cost
|
||||
code» (detach avstemmingen → validated → rød); kontroll: ekte baseline-linje validerer
|
||||
som før; golden-bundelen (uten baseline-fil) validerer uendret.
|
||||
- **Filer:** `validator.py`, `okf.py`/`ir.py` (loader, fail-fast ved malformet fil —
|
||||
tolerant ved fraværende), commons-fixture, nye tester.
|
||||
- **Verifisering:** nye tester grønne + detach → rød; golden uendret; full gate grønn.
|
||||
**MÅ være grønn før enhver eventuell fremtidig live-kjøring i dette repoet.**
|
||||
|
||||
## 4. Valgfri / lav prioritet (ubesluttet — foreslått, ikke godkjent)
|
||||
|
||||
- **C3.5 Budsjett-guard (C-N4):** pre-call-sjekk i loop-laget (nekt kall når rest-tak < 0)
|
||||
+ eksplisitt run-total USD-grense over `SdkModelClient.total_cost_usd`. Mest verd rett før
|
||||
en eventuell ny live-kjøring; ingen gate.
|
||||
|
||||
**Overføres IKKE hit (MAF-spesifikt):** S2.0-portefølje, S2.1-outbox (output-laget finnes
|
||||
her: `artifacts.py`), S2.2 MCP-konnektor, S2.3 doc-konnektor, S2.4 http-herding, S3.1/S3.3/
|
||||
S3.4, S4.1/S4.2-Foundry, S5.x, M1–M3. `extending.md` står: ingen D7-HTTP/MCP-økt planlagt.
|
||||
|
||||
## 5. Anbefalt sekvens
|
||||
|
||||
1. **C1.1 → C2.5 → C2.0** (autonome, ingen gate — i den rekkefølgen: vakt først, herding,
|
||||
så ny kjøresti-inngang som drar nytte av herdet inbox)
|
||||
2. **Operatør: D-A** (i hovedrepoet; ta C-P1-koblingsflagget med i samme bolk) → commons-
|
||||
amendment → subtree-pull HER
|
||||
3. **C2.7 → C2.8 → C3.2 → C4.0** (etter pull; C2.7 først — minst avhengigheter, størst
|
||||
spec-verdi)
|
||||
4. Etter hver amendment-bølge: **begge repo** re-pinnes/pulles og **begge suiter** kjøres
|
||||
(sammenligningsprotokollen) — aldri én side alene.
|
||||
267
docs/review-2026-07.md
Normal file
267
docs/review-2026-07.md
Normal file
|
|
@ -0,0 +1,267 @@
|
|||
# Uavhengig kryssmodell-review — portfolio-optimiser-claude (2026-07-10)
|
||||
|
||||
> **Reviewer:** Fable 5 (xhigh), uavhengig av Opus 4.8 som skrev koden. **Mandat:** speil av
|
||||
> MAF-søskenets kryssmodell-review (2026-07-09) — verifiser hvert MAF-funn mot DENNE kodebasen
|
||||
> (premisser, ikke fakta) + uavhengig sveip etter D7-egne blindsoner. Ingen live-filer ble
|
||||
> endret under selve reviewen; fletting (dette dokumentet + sesjonsplan + STATE) er
|
||||
> operatør-forhåndsgodkjent.
|
||||
>
|
||||
> **Metode:** all kildekode lest (16 moduler), alle nøkkel-tester lest, full lokal suite +
|
||||
> ruff + mypy kjørt, F2/F3/F5/F7-moteksempler KJØRT mot live-modulene (read-only), og
|
||||
> **11 detach-eksperimenter utført i en throwaway-kopi** (scratchpad — live-repoet urørt).
|
||||
> Hver påstand har `fil:linje`- eller kommando-belegg; verifiseringslogg nederst.
|
||||
|
||||
## 0. Baseline (verifisert, ikke sitert fra STATE)
|
||||
|
||||
| Påstand | Resultat | Belegg |
|
||||
|---|---|---|
|
||||
| Testsuite | **265 passed** (1.6s) — STATE/CHANGELOG-tallet stemmer | `uv run pytest -q` |
|
||||
| Lint / typer | ruff clean (40 filer formatert); mypy clean (16 filer, strict) | `uv run ruff check .`; `uv run mypy src` |
|
||||
| Push-status | HEAD `42f320b` == `origin/main` == `open/main` — STATEs påstand stemmer | `git rev-parse` alle tre |
|
||||
| Offline-invariant | Suiten kjører uten nøkkel/nettverk; ingen egress-stier i `src/` utenfor SDK-klienten | suite-kjøring + grep `urllib\|socket\|requests` |
|
||||
| S10-artefakter | `runs/s10/` urørt (fasit, protokoll §4.2/§4.5) — IKKE re-kjørt | kun lest |
|
||||
|
||||
**Detach-bevis (load-bearing-stikkprøver, ALLE 11 RØDE i kopien — MAF-paritet 11/11):**
|
||||
(1) Steg-1-fold detached → `test_step1` + `test_step7` røde (4 failed); (2) checker-override
|
||||
detached → `test_checker_gate` rød (3); (3) inbox-merge detached → `test_step7` rød (2);
|
||||
(4) promotion-index-lenke detached → `test_step8` rød (5); (5) verdict-eksklusjon fjernet fra
|
||||
`bundle_context` → `test_okf` + `test_step8` røde (2); (6) `setting_sources=[]` → `None` →
|
||||
`test_sdk_isolation` rød (2); (7) informert refinement detached → `test_step5` rød (2);
|
||||
(8) verbatim-id-seeding re-mintet → `test_step8` rød (2); (9) re-ingest-lagsikkerhet detached
|
||||
(alle .md «stamped») → `test_ingest_loadbearing` rød (1); (10) `import claude_agent_sdk` i
|
||||
`okf.py` → purity-testene røde (2); (11) usage-fail-closed detached → `test_budget` rød (1).
|
||||
Kopien verifisert isolert (pakken importerte fra kopiens `src/`) og revertert ren etterpå.
|
||||
**Metoden holder på alle stikkprøvde sømmer.**
|
||||
|
||||
---
|
||||
|
||||
## 1. Funn (rangert, mest alvorlig først)
|
||||
|
||||
Ingen BLOCKER i dagens påstands-omfang: single-run-claims er sanne, detach-beviste, og
|
||||
README/extending.md er gjennomgående ærlige (§1). Funn 1–2 og 4–5 er spec-nivå-defekter som
|
||||
finnes her *by construction* (samme frosne spec) og deler beslutning D-A med MAF-siden.
|
||||
|
||||
### C-F2 [MAJOR · spec-nivå] Validator: nominal-grensen gater aldri — selv-forfattede bands blåser P90 forbi «maximum feasible» (F2-analog: BEKREFTET)
|
||||
|
||||
- **Belegg:** eneste numeriske blokk er P90 (`validator.py:68`); `nominal_feasible` beregnes
|
||||
(`validator.py:53`) men brukes aldri som gate. `assumptions` forfattes av modellen selv
|
||||
(`loop.py:66-73` parser fritt; `ir.py:30-49` har ingen invariant om at bandet omslutter
|
||||
`unit_cost`). **Kjørt bevis (live-modul, read-only):** golden-bundelens egne tall — total
|
||||
300 000, nominal 90 000, band [0.70, 1.40] — validerer claim **100 000 > 90 000**
|
||||
(p90=121 057.09). Band helt over unit_cost ([1.8, 2.2]) validerer claim **55 000 mot
|
||||
nominal 30 000** (p90=65 058.49). Nøyaktig samme tall som MAF-moteksemplene — bekrefter
|
||||
at defekten er spec-båren, ikke implementasjonsbåren.
|
||||
- **Feilscenario:** en ekte proposer setter et optimistisk band → claim over den
|
||||
deterministiske feasibility-grensen stemples `validated` og persisteres som
|
||||
«validator-godkjent» i run-artefaktene.
|
||||
- **Fiks:** speiling av MAF S2.7 — (a) strukturell blokk `claimed > nominal_feasible`;
|
||||
(b) IR-invariant `low ≤ unit_cost ≤ high`. **Golden- OG fixture-kompatibel her, verifisert:**
|
||||
golden-claim 30 000 ≤ 90 000; alle ikke-tomme bands i dette repoets fixtures omslutter
|
||||
unit_cost ([0.8,1.2]∋1.0 `test_ir.py:26`; [0.70,1.40]∋1.0 golden; (0.70,1.50)∋1.0
|
||||
`test_bygg_energi_mikro.py:83`; resten tomme). Gated på **D-A pkt. 1 + commons-pull**
|
||||
→ sesjon **C2.7**.
|
||||
|
||||
### C-F3 [MAJOR · spec-nivå] `affected_items` forankres ikke mot noen kostbaseline (F3-analog: BEKREFTET)
|
||||
|
||||
- **Belegg:** `_parse_candidate` aksepterer vilkårlige modell-forfattede kostlinjer
|
||||
(`loop.py:66-73`); ingenting i bundle-formatet bærer en kostbaseline å avstemme mot.
|
||||
**Kjørt bevis:** diktet linje `{code:"XX-DIKTET", quantity:1e6, unit_cost:10}` → total
|
||||
10 MNOK → claim **2 900 000 stemples `validated`** (degenererte percentiler 3.0 MNOK uten
|
||||
band). IR-invarianten (claim ≤ items-total, `ir.py:39-49`) regner kun på selv-deklarerte tall.
|
||||
- **Feilscenario:** mot en ekte modell er «validatoren avgjør tallene» tom mot hallusinerte
|
||||
kostlinjer; kun checker-LLM-en (fail-open, `loop.py:200-212`) står imellom.
|
||||
- **Fiks:** speiling av MAF S4.0 — fail-closed avstemmings-stage mot en baseline-projeksjon
|
||||
i bundelen (commons-amendment for `cost-baseline.json`). Gated på **D-A pkt. 2** → sesjon
|
||||
**C4.0**. MÅ være grønn før enhver eventuell fremtidig live-kjøring i dette repoet (D6:
|
||||
ny spend krever uansett ny operatør-godkjenning).
|
||||
|
||||
### C-N1 [MAJOR · konformitet · D7-EGEN] Method-spec-integritetsvakten mangler — §11-raden «Spec integrity» er uimplementert
|
||||
|
||||
- **Belegg:** ingen test i repoet refererer `method-spec.md`
|
||||
(`grep -rn "method-spec\|method_spec" tests/` → null treff i testkode). Spec §11 krever:
|
||||
«this spec goes missing, names a framework, or stops documenting a consumed contract
|
||||
field» → rød (referansetest `test_method_spec_loadbearing.py`); §1 pkt. 3 gjør §11-tabellen
|
||||
til konformitetskrav. Ingest-spec-en HAR sin analog (`test_ingest_spec_loadbearing.py` —
|
||||
forbidden-toolkits + kontraktsfelt-dekning), så mønsteret finnes i repoet; method-spec-vakten
|
||||
ble aldri speilet. Spec-intro-ens «a guard test keeps it that way» er dermed sann kun via
|
||||
MAF-søskenets test — dette repoet håndhever den ikke selv.
|
||||
- **Feilscenario:** en commons-pull som (utilsiktet) endrer method-spec-en — fjerner et
|
||||
kontraktsfelt fra §12-tabellen eller introduserer rammeverksnavn — passerer denne suiten
|
||||
grønt; D7 mister sin eneste lokale detektor for spec-drift i subtree-synken.
|
||||
- **Fiks:** ny `tests/test_method_spec_loadbearing.py` etter ingest-spec-mønsteret
|
||||
(fil-eksistens, forbidden-toolkits, §12-kontraktsfelt-dekning for feltene DENNE
|
||||
implementasjonen konsumerer). Ingen beslutnings-avhengighet → sesjon **C1.1** (byggbar NÅ).
|
||||
|
||||
### C-F5 [MAJOR · spec-nivå] ExpeL-seeding feilnøkler features på bundelens ENE kandidat (F5-analog: BEKREFTET, med nyanse — id-halvdelen er allerede løst her)
|
||||
|
||||
- **Belegg:** `seed_store_from_bundle` leser features fra `load_validator_input(bundle_dir)`
|
||||
— bundelens ENE IR-projeksjon — og gir ALLE `type: verdict`-filer de samme features
|
||||
(`experience.py:132`, `experience.py:145-152`). **Nyansen:** `verdict_id` leses VERBATIM
|
||||
fra frontmatter (`experience.py:147`), så id-kollisjonen MAF-funnet beskrev er avverget
|
||||
for promoterte filer — load-bearing-bevist (`test_step8:test_two_promoted_candidates_both_seed_verbatim_ids`).
|
||||
**Kjørt bevis for rest-defekten:** to promoterte dommer om ulike kandidater (E01/led-retrofit
|
||||
vs E99/ventilation) seedes begge med bundle-features (ENERGI-TOTAL-EL/LED) — retrieval kan
|
||||
ikke skille dem; en spørring med kandidat Bs egne features rangerer på feil grunnlag.
|
||||
- **Feilscenario:** flerkandidat-bundle: dom om tiltak B foldes inn i hypoteser om tiltak A —
|
||||
feil læringssignal, presist det klynge C-skalering forutsetter at ikke skjer.
|
||||
- **Fiks:** speiling av MAF S3.2 — seed leser features fra verdict-filas egen frontmatter
|
||||
(promote skriver dem), fallback dagens nøkling. Gated på **D-A pkt. 4** → sesjon **C3.2**.
|
||||
|
||||
### C-F4 [MAJOR · frossen-ramme-utfordring] `/`-prefiksede OKF-lenker hoppes over — spec-tro implementasjon av en spec-feil (F4-analog: BEKREFTET)
|
||||
|
||||
- **Belegg:** `navigate_bundle` skipper ethvert mål med `/` eller `\` (`okf.py:112`) —
|
||||
method-spec §3 Steg 1 pinner regelen. OKF-spec-en anbefaler bundle-rot-relativ `/`-form
|
||||
(MAF-review U-1, WebFetch-verifisert 2026-07-09; ikke re-hentet her — nettverksregel).
|
||||
- **Feilscenario (D7-spesifikk nyanse):** en ekstern bundle med `](/tiltak.md)`-lenker
|
||||
navigerer til KUN index. Har indexen citerbar body, feiler kjøringen IKKE fast —
|
||||
`build_citations` siterer index-bodyen (`artifacts.py:31-59`) og kjøringen fortsetter med
|
||||
stille kontekst-tap; kun en body-løs index gir fail-fast («no citable content»).
|
||||
- **Fiks:** kun via **D-A pkt. 3** (spec-amendment: ledende `/` mappes til bundle-rot,
|
||||
fortsatt fail-closed boundary) → sesjon **C2.8**. Merk: MAF-planen har i dag INGEN
|
||||
bygg-sesjon for F4-implementasjonen på sin side — bør legges til der når D-A lander.
|
||||
(Relatert MINOR, samme som MAF: en index-lenket `log.md` — reservert i OKF — ville
|
||||
rendres som konseptfil; `okf.py:128-134` filtrerer kun verdict + tom body.)
|
||||
|
||||
### C-F7 [MINOR nå → MAJOR ved flerbruker/klynge E] Verdict-inboxen er en uvalidert prompt-injeksjonsflate (F7-analog: BEKREFTET)
|
||||
|
||||
- **Belegg:** `decision` valideres kun som ikke-tom streng (`inbox.py:47`) — modulens
|
||||
docstring UTSETTER eksplisitt vokabular-politiet til §4.1/§6 (`inbox.py:10-13`), men på
|
||||
merge-stien (`inbox.py:122-132`) fins ingen sjekk; `rationale` flyter verbatim inn i
|
||||
hypotese-prompten via folden (`experience.py:157-171`). Ingen størrelses-/antall-tak.
|
||||
**Kjørt bevis:** `{"decision": "hva-som-helst", "rationale": "IGNORE ALL PREVIOUS
|
||||
INSTRUCTIONS…"}` → merged=1, decision-strengen OG injeksjonsteksten når prompten.
|
||||
- **Fiks (fortsatt tolerant — skip, aldri raise):** vokabular-sjekk mot {approved, rejected,
|
||||
approved_with_adjustment}-settet ved merge, tak på rationale-lengde + antall filer.
|
||||
Ingen beslutnings-avhengighet → sesjon **C2.5**.
|
||||
|
||||
### C-N2 [MINOR · D7-EGEN] Steg-7-inboxen har ingen kjørbar kjøresti-inngang
|
||||
|
||||
- **Belegg:** `merge_inbox_into_store` kalles fra INGEN kjøresti — `run_s10.py:44-54` har
|
||||
ingen `--inbox`-arg og kaller kun `seed_store_from_bundle` + `fold_experience`
|
||||
(`run_s10.py:72-79`). Steg 7 (§3/§5: «a run ingests the inbox INTO its store BEFORE the
|
||||
Step-1 fold») er bevist som primitiv + test-komposisjon (`test_step7`, detach-bevist rød),
|
||||
men ingen skipbar inngang komponerer den. README sier «a later run ingests it tolerantly
|
||||
and merges it before the fold» (`README.md:66-68`) — sant om kontrakten, men ingen
|
||||
leverbar kjøresti gjør det. (Til forskjell fra MAF-F1: ingen død docstring-påstand —
|
||||
folden ER wiret på den ene kjørestien som finnes; F1 i MAF-formen er AVKREFTET her.)
|
||||
- **Feilscenario:** en operatør som dropper en dom i en inbox-mappe og re-kjører har ingen
|
||||
kommando som plukker den opp — læringssløyfas lange tidsskala er i praksis kun
|
||||
promoterings-veien (som ER wiret via bundle-seeding).
|
||||
- **Fiks:** generalisert kjøresti-inngang (offline-testbar komposisjonsfunksjon +
|
||||
`--inbox`/`--verdict-dir`-arg; `run_s10.py` forblir urørt fasit-sti). Ingen
|
||||
beslutnings-avhengighet → sesjon **C2.0**.
|
||||
|
||||
### C-N3 [MINOR · D7-EGEN] SDK-avhengigheten er løst pinnet og run-stien leser 0.2.110-attributter uten versjonsvakt (F11-analog: AVKREFTET for testdobbelen, rest-risiko på run-stien)
|
||||
|
||||
- **Belegg:** testdobbelen er REN — `ScriptedClient` implementerer repoets egen
|
||||
`ModelClient`-protokoll og importerer ingenting fra SDK-en (`tests/_scripted.py`), så
|
||||
MAF-F11s privat-API-skjørhet i suiten er AVKREFTET her. Men run-stien leser
|
||||
`AssistantMessage.error/.model`, `ResultMessage.usage/.total_cost_usd/.is_error/.subtype/.errors`
|
||||
(«verifisert mot 0.2.110», `sdk_client.py:12-17,108-121`) med pin `claude-agent-sdk>=0.2`
|
||||
(`pyproject.toml:8`) — enhver 0.x-oppgradering kan endre attributt-semantikken stille,
|
||||
og `_total_tokens` summerer da et KRYMPET felt-subsett uten feil (`sdk_client.py:66-71`).
|
||||
- **Fiks:** pin `>=0.2,<0.3` + versjonsvakt-test med handlingsrettet melding (tvinger bevisst
|
||||
re-verifisering av attributt-premissene ved oppgradering) → inn i sesjon **C2.5**.
|
||||
|
||||
### C-N4 [MINOR] Token-taket lades ETTER fullført kall; USD-taket er kun per-kall (F10-analog: DELVIS BEKREFTET)
|
||||
|
||||
- **Belegg:** `meter.charge_tokens` kalles etter `client.complete` returnerer
|
||||
(`loop.py:91`, `budget.py:43-51`) — kallet som krysser taket fullføres (og koster) før
|
||||
raise, som i MAF. USD: per-kall-tak finnes førsteklasses (`sdk_client.py:87`,
|
||||
`ClaudeAgentOptions.max_budget_usd` — bedre enn MAF), men ingen run-total USD-grense;
|
||||
totalen er kun indirekte bundet (antall kall × per-kall-tak, antall kall bundet av
|
||||
meteren). **Ærlighets-nyansen fra MAF-F10 er AVKREFTET her:** ingen docstring lover
|
||||
«short-circuits» — `budget.py:1-9` beskriver mekanikken presist.
|
||||
- **Fiks (lav prioritet):** pre-call-guard + eksplisitt run-total USD-tak → valgfri sesjon
|
||||
**C3.5** (uavhengig; mest verd før en eventuell ny live-kjøring).
|
||||
|
||||
### C-S1 [SUGGESTION] Checker-parse: `VERDICT: REJECT`-substring-presedens hvor som helst (F13-analog, spec-pinnet)
|
||||
|
||||
- `_REJECT_PATTERN.search` over hele teksten (`loop.py:42,186-194`): en checker som SITERER
|
||||
formatet feiltolkes som reject. Spec-konformt (§3 Steg 4 pinner presedensen) — flagges som
|
||||
robusthet; evt. siste-linje-parse er en D-A-nyansering (allerede i MAF-planens D-A pkt. 5-nabolag).
|
||||
|
||||
### C-S2 [SUGGESTION] `max_rows`-cap håndheves etter full innlesing
|
||||
|
||||
- `_read_csv` leser hele fila før cap-sjekk (`ingest.py:190-197`); `_read_sql` gjør
|
||||
`fetchall()` før sjekk (`ingest.py:244-247`). Fail-fast i UTFALL (aldri stille trunkering,
|
||||
§8-konformt), men en enorm lokal kilde leses helt inn i minnet først. Akseptabel MVP-grense
|
||||
for lokale kilder; noteres for en evt. streaming-variant.
|
||||
|
||||
### C-S3 [SUGGESTION] Døde/små ting
|
||||
|
||||
- `promotion._link_from_index` er ikke-atomisk RMW — dokumentert MVP-grense
|
||||
(`promotion.py:92-95`), samme som MAF-F6s index-del; blir først reell ved concurrency
|
||||
(D-D), som D7 ikke har noen sti for i dag.
|
||||
- `model_map.json` har kun `anthropic`-profil (Bedrock/Vertex/Foundry er env-switch-konfig
|
||||
per design) — ingen placeholder-problem à la MAF-P6 her.
|
||||
|
||||
### C-P1 [MAJOR · plan-nivå · DELT — flagges til hovedrepoet] MAF-planens S3.1 (semantisk henting) kolliderer med frossen method-spec §3 Steg 1
|
||||
|
||||
- **Belegg:** method-spec §3 Steg 1 (frossen): «Ranking is **structural, never textual** —
|
||||
surface text MUST NOT contribute to similarity.» MAF-planens S3.1 bygger «HybridRanker =
|
||||
dagens strukturelle score + cosine over lagrede vektorer» gated KUN på D-C — men cosine
|
||||
over embeddings av rationale-/overflatetekst ER tekstlig similarity og bryter spec-en
|
||||
uten amendment. D7 håndhever regelen i dag (`experience.py:83-95` + load-bearing
|
||||
`test_surface_text_never_contributes`).
|
||||
- **Konsekvens:** D-C-beslutningen må enten (a) kobles til et D-A-punkt som amender
|
||||
ranking-regelen bevisst, eller (b) scope S3.1 til embeddings over strukturelle features.
|
||||
Gjelder BEGGE repo — dette er en delt beslutnings-forutsetning MAF-reviewen ikke fanget.
|
||||
|
||||
---
|
||||
|
||||
## 2. MAF-funnene — status i dette repoet
|
||||
|
||||
| MAF-funn | Status her | Belegg / hvor |
|
||||
|---|---|---|
|
||||
| F1 (portefølje-læringssløyfe død) | **Avkreftet i MAF-formen** — ingen portefølje-sti finnes; folden ER wiret på eneste kjøresti (`run_s10.py:72-79`); ingen død docstring. Rest-analog: C-N2 (ingen kjørbar Steg-7-inngang) | §1 C-N2 |
|
||||
| F2 (nominal gater aldri) | **Bekreftet** (kjørt bevis, identiske moteksempel-tall) | §1 C-F2 |
|
||||
| F3 (ingen kostbaseline) | **Bekreftet** (kjørt bevis, 2.9 MNOK validert) | §1 C-F3 |
|
||||
| F4 (`/`-lenker skippes) | **Bekreftet** (`okf.py:112`; spec-tro; stille-tap-nyanse) | §1 C-F4 |
|
||||
| F5 (én-kandidat-seeding) | **Bekreftet med nyanse** — id-halvdelen ALLEREDE løst (verbatim `verdict_id` + load-bearing test); feature-halvdelen kjørt-bevist | §1 C-F5 |
|
||||
| F6 (concurrency/RMW) | **Ikke anvendbar** — ingen portefølje-/concurrent-sti; RMW-grensen dokumentert (`promotion.py:95`). Relevant først ved D-D-speiling | §1 C-S3 |
|
||||
| F7 (inbox-injeksjon) | **Bekreftet** (kjørt bevis) | §1 C-F7 |
|
||||
| F8 (metode-cap fail-open) | **Ikke anvendbar** — D7-validatoren har ingen metoderegler (kun §3-Steg-4-kjernen); golden krever dem ikke | `validator.py` (hele) |
|
||||
| F9 (prosent-mål/baseline) | **Ikke anvendbar** — ingen goals/ledger-lag i D7 | filkatalog |
|
||||
| F10 (budsjett post-charge) | **Delvis bekreftet** — post-charge ja; docstring ærlig; per-kall-USD-tak finnes (bedre enn MAF); run-total USD-tak mangler | §1 C-N4 |
|
||||
| F11 (privat-API i doubles) | **Avkreftet for testdobbelen** (egen protokoll); **rest-risiko på run-stien** (løs pin, ingen versjonsvakt) | §1 C-N3 |
|
||||
| F12 (CHANGELOG stale) | **Avkreftet** — `CHANGELOG.md:16` sier 265 == suiten | baseline |
|
||||
| F13 (småting) | **Delvis** — checker-parse-presedensen gjelder (C-S1); `_authored_texts`-dødkoden og retrieval-substring er MAF-spesifikke (D7-similarity er ren strukturell) | §1 C-S1 |
|
||||
| F14 (Magentic-begrunnelse) | **Ikke anvendbar** — ingen MAF/Magentic-referanser i D7 | grep |
|
||||
| P1/P2 (roadmap vs ingest-målbilde / MCP-wiring) | **Ikke anvendbar** — D7 har ingen Fase-2-roadmap; `extending.md` er ærlig om HTTP/MCP ubygd (peker-only) | `docs/extending.md:128-160` |
|
||||
| P4 (output-lag ubygget) | **I hovedsak avkreftet her** — `artifacts.py` persisterer proposal/result/provenance/usage + stop-artefakter deterministisk (`runs/s10/`). Rest: run_id-basert outbox + pending-sporing KUN hvis D7 skal speile Fase 5 (ikke planlagt) | `artifacts.py:83-152` |
|
||||
| P5 (verdict_dir i portefølje) | **Ikke anvendbar** (ingen `run_portfolio`) | filkatalog |
|
||||
| P6 (stubs: notify/MCP-demo/Azure-placeholders/main-paritet) | **Ikke anvendbar** i MAF-formen — ingen slike stubs her; CLI-paritets-resten dekkes av C-N2/C2.0 | §1 C-N2 |
|
||||
| U-1–U-4 (frossen-ramme-utfordringer) | Samme status som F4/F2+F3/P1/F5 over — D7 slutter seg til U-1/U-2/U-4; U-3 ikke anvendbar | §1 |
|
||||
|
||||
## 3. Utfordringer mot frosne beslutninger (KLART MERKET — kun operatøren kan endre)
|
||||
|
||||
D7-siden SLUTTER SEG TIL MAF-reviewens U-1 (`/`-lenker), U-2 (validator-semantikk) og U-4
|
||||
(seeding-regelen) med egne kjørte bevis (§1), og legger til:
|
||||
|
||||
| # | Frossen ramme | Utfordring | Belegg |
|
||||
|---|---|---|---|
|
||||
| U-5 (ny) | method-spec §3 Steg 1 («structural, never textual») | Delt D-C-plan (semantisk henting) er uimplementerbar uten amendment eller re-scoping — koblingen D-C↔D-A mangler i den delte køen | §1 C-P1 |
|
||||
|
||||
Ingen utfordring rettes mot: golden-suiten (reprodusert eksakt), maker-checker-gaten
|
||||
(detach-bevist), fail-closed promotering (detach-bevist), verdict-eksklusjonen
|
||||
(detach-bevist), SDK-isolasjonsvalget `setting_sources=[]` (detach-bevist; S10-post-mortem-
|
||||
begrunnelsen står), eller load-bearing-regelen (11/11 stikkprøver røde).
|
||||
|
||||
## 4. Verifiseringslogg
|
||||
|
||||
| Påstand | Kilde/kommando |
|
||||
|---|---|
|
||||
| 265 passed / ruff clean / mypy clean (16 filer) | `uv run pytest -q` (1.60s); `uv run ruff check .`; `uv run ruff format --check .`; `uv run mypy src` (2026-07-10) |
|
||||
| HEAD == origin/main == open/main | `git rev-parse HEAD origin/main open/main` → alle `42f320b` |
|
||||
| 11 detach-eksperimenter røde | throwaway-kopi i scratchpad; driver-script med kirurgisk patch + `uv run pytest <målfil>` per søm + git-revert; kopi-isolasjon verifisert (`portfolio_optimiser_claude.__file__` peker i kopien); 11/11 RED, 0 anomalier |
|
||||
| F2-moteksempler validerer | `uv run python` mot live-modul (read-only): claim 100k>nominal 90k → ValidatedProposal p90=121 057.09; claim 55k>nominal 30k (band [1.8,2.2]) → ValidatedProposal p90=65 058.49 |
|
||||
| F3-moteksempel validerer | samme script: diktet linje 1e6×10 → claim 2.9 MNOK → ValidatedProposal (percentiler 3.0 MNOK) |
|
||||
| F5-feilnøkling | kjørt i kopien: to promoterte dommer (E01 vs E99) → begge store-records bærer bundle-features (ENERGI-TOTAL-EL/LED); distinkte ids (verbatim) |
|
||||
| F7-injeksjon | kjørt i kopien: `decision:"hva-som-helst"` + injeksjons-rationale → merged=1, begge når prompten via folden |
|
||||
| Method-spec-vakt mangler | `grep -rn "method-spec\|method_spec" tests/` → 0 treff; `test_ingest_spec_loadbearing.py` finnes (mønsteret) |
|
||||
| C2.7-antakelsen (alle bands omslutter unit_cost) | grep over tests/ + examples/ + shared/examples/: eneste ikke-tomme bands [0.8,1.2]∋1.0, [0.70,1.40]∋1.0, (0.70,1.50)∋1.0 — null brudd |
|
||||
| Ingen egress i src utenfor SDK-klient | `grep -rn "urllib\|socket\|requests\.\|http" src/…/*.py` → kun docstring-treff i ingest.py |
|
||||
| S10-artefakter urørt | kun lest; ingen re-kjøring (protokoll §4.2/§4.5) |
|
||||
| OKF-spec-ens `/`-anbefaling | IKKE re-verifisert her (nettverksregel denne sesjonen) — arvet fra MAF-review §6 (WebFetch 2026-07-09), merket som arvet premiss |
|
||||
| SDK-attributt-premisser («verifisert mot 0.2.110») | arvet fra kodens egne verifikasjonsnotater (`sdk_client.py:12-17`, CLAUDE.md) — ikke re-verifisert mot nyere SDK; nettopp derfor C-N3 krever versjonsvakt |
|
||||
Loading…
Add table
Add a link
Reference in a new issue