# Fot i bakken — levert vs lovet (2026-06-26) **Hva dette er:** En nøktern grunning FØR fase-valget (Fase 4 open-source vs D7-sibling). STATE-narrativet var triumferende ("Fase 3 helt lukket", "load-bearing bevis", "lærer av dommene"). Session-start flagget *narrative crystallization* (sesjon #39). En Explore-agent kartla levert kode mot lovet visjon; de konsekvensrike funnene er **verifisert av hovedkonteksten selv** mot kildekoden, ikke bare relayet. ## Hovedfunn (én linje) Den **deterministiske ryggraden holder og er ærlig**. De tre "agentiske" lovnadene STATE hviler på — *lærer av dommene*, *maker-checker-debatt*, *HITL* — er **inerte, dekorative eller config-stubber**, og **ingen kodesti har noensinne kjørt mot en ekte modell**. Suiten (116/4) kjører utelukkende på syntetiske klienter med ferdigskrevet JSON. ## Hva HOLDER (deterministisk ryggrad — publiserbart, ærlig) - **Validator (B1):** ekte CBC-solve + Monte Carlo; `Rejection` er egen type uten persentiler (kan aldri konsumeres som validert). `validator.py:78-129`. Load-bearing testet (mutasjon rødt). - **Budsjett-/stopp-tak (B4/D6):** `Budget` nektes uten positive tak; `BudgetMiddleware` leser ekte `UsageDetails`, feiler lukket. `budget.py:50-101`. Sterkeste komponent. - **Provenance (B6):** Pydantic-stamp, F1 fake-model-lekkasje fikset + load-bearing. `provenance.py`, `run.py:201-205`. - **Sti-sikkerhet** (`retrieval.py`, fail-closed `commonpath`) + **config-only onboarding** (SC1, ekte src-grep-guard). ## Hva er GJELD (rangert; ✅ = verifisert av hovedkonteksten, ⚠️ = agent-rapportert, ikke selv-tracet) 1. **🔴 ✅ ExpeL-læringssløyfa er ÅPEN — retrieval når aldri modellen.** Generering skjer på `run.py:194`, *før* retrieval-blokken `run.py:216-221`. `provider.before_run` kalles på en lokal `SessionContext` (`run.py:219`) som **aldri** sendes til noen agent. Debatt-agentene (`workflow.py:57-66`) får `tools`+ `middleware` men **ingen `context_providers`** (`grep -rn context_providers src/` = **0 treff**). De hentede verdiktene fyller kun `RunResult.retrieved` (for testassertioner). Docstrings (`run.py:214-215, 269-271`) + STATE + `CLAUDE.md:4` påstår en lukket sløyfe. **Falsk på wiring-nivå.** Største drift. 2. **🔴 ✅ README sier "Not yet usable".** `README.md:5` ("Status: Early development (plan phase). Not yet usable.") motsier STATEs "Fase 1-3 lukket". Første en ekstern leser ser — release-blokkerende for Fase 4. 3. **🟠 ✅ Maker-checker-checkeren gater ingenting.** Selektoren er en ren modulo-teller (`workflow.py:93-96`); checkerens kritikk (`workflow.py:29`) parses aldri, blokkerer aldri. Debatt-teksten mater nå generering som kontekst (`run.py:189-190`), så den er ikke *helt* dekorativ — men det er ingen konsensus-/gate- semantikk. Den ekte porten er validatoren, ikke checkeren. 4. **🟠 ✅ Ingen ekte-modell-kjøring — noensinne.** Alle 4 skippede tester er nettopp live-provider-testene (lokal token-regnskap, Foundry-profil, e2e-portefølje, debatt-konvergens/-kostnad). "Virker det mot en faktisk LLM?" er en åpen risiko. `findings-a.md` bekrefter: debatt-verditallet ble aldri produsert. 5. **🟠 ✅ Ingen `SKILL.md`.** `CLAUDE.md` + plan Fase 2 lover "Metode = Agent Skill (SKILL.md + scripts/)". Metoden er vanlige Python-moduler. B8 (skill-sandbox) følgelig også fraværende. 6. **🟡 ✅ Ingen `[project.scripts]` entry-point** til tross for `main()` (`run.py:296`). README viser ingen kjørekommando. En bruker får ingen vei fra README til en faktisk kjøring. 7. **🟡 ✅ VerdictStore er in-memory only** (`verdicts.py:106`). "Læring" overlever ikke restart — og påvirker uansett ingenting (jf. #1). 8. **🟡 ⚠️ MCP-datatilgang er parallell demonstrator, ikke datasømmen i bruk.** `build_mcp_server` finnes (`datasource.py`), men `run_project` bruker in-process `FunctionTool` (`run.py:178`). `CLAUDE.md` løfter MCP til konvensjon. (Agent-rapportert; ikke selv-tracet.) 9. **🟡 ⚠️ HITL Layer-2 = les hardkodet `verdict_input` JSON fra config** (`run.py:224`). "Fageksperter vurderer via HITL" er i praksis å lese en config-beslutning. `extending.md` er ærlig om dette. (Agent-rapportert.) 10. **🟡 ⚠️ B10 rejection-taksonomi/konfliktregel fraværende** — `decision` er bar `Literal` (`contracts.py:61`). §15 kaller dette "den mest domenespesifikke delen som MÅ være brukerlevert". (Agent-rapportert.) ## 90 %-linja Forsvarlige kutt: durabel checkpointing, OTEL, vektorlager, concurrent fan-out. **Men:** læringssløyfa er én av fire headline-invarianter og er *presentert som levert* mens den er inert — det er ikke et 90 %-kutt. Fan-out er sekvensiell `for`-løkke (`run.py:276-292`); isolasjon oppnås trivielt (ferskt state per kjøring), sidesteppet B7 heller enn løst for det concurrent tilfellet U1 navnga. STATE er ærlig om "SEKVENSIELT". ## Konsekvens for fase-valget - **Fase 4 (open-source) nå** ville publisere et gap mellom README/STATE-narrativet og hva en bruker får. De to mest markedsførte funksjonene (lærer-av-dommer, maker-checker-debatt) er inerte/dekorative. - **D7 (sibling) nå** er prematurt: man reimplementerer en metode hvis agentiske claims ennå ikke er sanne. - **Reell vei videre (operatørbeslutning):** - **A — Lukk kjerne-gjeld før release:** (1) wire `ExpeLContextProvider` *inn i* generering (fest på proposer-agenten; flytt retrieval FØR generering); (2) la checkeren binde, ELLER slutt å kalle det en debatt; (3) kjør ÉN ekte-modell ende-til-ende (lokal Ollama holder, D6-billig); (4) fiks README-status + legg til entry-point. Gjør narrativet sant. - **B — Ærlig nedgrader:** release kun den deterministiske kjernen med korrekt framing; merk agentiske lag som eksperimentelle/uferdige. Raskere, men mindre ambisiøst. ## Verifiseringslogg | Påstand | Hvordan verifisert | Resultat | |---|---|---| | Suite 116/4 | `uv run pytest -rs` | Bekreftet; 4 skip = alle live-provider | | ExpeL når aldri modellen | lest `run.py:186-236`, `workflow.py:57-66`; `grep context_providers src/` | Bekreftet (0 treff) | | Checker gater ikke | lest `workflow.py:93-106` | Bekreftet (modulo-selector) | | Ingen SKILL.md | `find -name SKILL.md` | Bekreftet (ingen) | | README "Not yet usable" | `head README.md` | Bekreftet (`README.md:5`) | | Ingen entry-point | `grep project.scripts pyproject.toml` | Bekreftet (kun `[project]`) | | mypy/ruff rene | `uv run mypy src`, `ruff check .` | Bekreftet |