docs(fot-i-bakken): ground-truth-verifisert levert-vs-lovet — agentiske lag inerte

Fot i bakken før fase-valg (Fase 4 vs D7). Explore-agent kartla; hovedkontekst
selv-verifiserte de konsekvensrike funnene mot kildekoden:

- ExpeL-laeringssloyfa ER APEN: retrieval naar aldri modellen (generering run.py:194
  for retrieval run.py:216-221; sctx run.py:219 forkastes; 0 context_providers i src/).
- README 'Not yet usable' (README.md:5) motsier 'Fase 1-3 lukket' — release-blokkerende.
- Maker-checker-checker gater ingenting (modulo-selector workflow.py:93-96).
- Ingen ekte-modell-kjoring (alle 4 skip = live-provider). Ingen SKILL.md. Ingen entry-point.

Deterministisk ryggrad (validator/budsjett/provenance/sti-sikkerhet/onboarding) holder.
Neste: operatorbeslutning — lukk kjerne-gjeld (A) vs aerlig nedgrader+release (B).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019any9zfGNNwWJPX5Zq2QRz
This commit is contained in:
Kjell Tore Guttormsen 2026-06-26 15:25:03 +02:00
commit 129a40baea

View file

@ -0,0 +1,80 @@
# 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 |