jobbsok/docs/2026-09-04-kvalitetsrevisjon-planlegging.md
Kjell Tore Guttormsen 775e291642 docs: kvalitetsrevisjon av planleggingen (maal, ikke bygg)
Measures the two planning sessions and plan.md against docs/build-brief.md:
step traceability (0 of 56 unanchored, 15 derived), blocker closure (5 of 9
closed in step text, 4 partial), review-count discrepancies, dedup false
negative reproduced (Jaccard 0.236/0.404 vs 0.7), session token and cost
profile, and whether /trekplan --brief docs/build-brief.md is a valid input
(it is not: FM_MISSING). Recommendation: revise the listed steps first, then
M1 GO. No change to plan.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-04 08:06:55 +02:00

366 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kvalitetsrevisjon av planleggingen (2026-09-04)
Måling, ikke bygging. Ordre fra PM 2026-09-04: hvorfor rapporterer jobbsok selv
lav kvalitet, og holder `plan.md` mot `docs/build-brief.md`. Ingen fil i planen
er endret. M1 er ikke startet.
Kilder (alle lokale): `docs/build-brief.md` (417 linjer), Voyage-prosjektet
`.claude/projects/2026-09-03-jobbsok-plugin-build/` (brief.md 316 linjer,
research/01-03, exploration/, plan.md 2223 linjer / 56 steg), `STATE.md`, og de to
planleggingsøktenes transkripter med underagent-transkripter (økt 1 Fable 5.1,
økt 2 Opus 5). Kommandodefinisjonene er lest i voyage 5.10.1 (`commands/trekbrief.md`,
`commands/trekplan.md`, `lib/review/plan-review-dedup.mjs`, `lib/validators/`).
## Anbefaling
**(b) Revider planen først** — steg 1 (probens forutsetninger: navngi test-pluginen og
at operatøren må sitte i Cowork), 13 (`.gitignore`-linjen for `BUILD_STAMP` må testes),
20 (motsier `--oppdater`), 21 (`--oppdater`-kallet er utestet), 23 (`dagens`-ekkoet
mangler), 26 (benign-korpus og tak-brøk er udefinerte), 31 (proben har ingen Verify og
skriver utenfor sesjon 8s gjerde), alle seks `Verifiser i Cowork`-steg (`--check`
kjøres i ett av seks), planhodet (Pass 2-markøren mangler, graden B er egenvurdert),
sesjonsgjerdene 4 og 8, og `brief.md` linje 193–194 og 245 (`zip -r`, «version-echo
skill», `plugin.json`-versjon) — deretter GO på M1 sesjon 1; ikke (c), fordi
`docs/build-brief.md` ikke er gyldig `/trekplan`-input og research 02/03 endret to
designbeslutninger som en omplanlegging ville mistet.
Bakgrunnen for operatørens observasjon: den lave kvaliteten som ble rapportert, var
reell for planen *før* revisjon (plan-critic: REPLAN, 65.8/100) og rapportene var
ærlige om det. Planen *etter* revisjon har ingen anmelder-verdict; graden B/84 i
planhodet er øktens egen. Fire av ni blockers er lukket bare delvis i stegteksten.
## Sammendrag i fire tall
| # | Måling | Resultat | Nevner |
|---|--------|----------|--------|
| 1 | Steg uten anker i `docs/build-brief.md` | 0 (41 direkte, 15 avledet via beslutning/research/risiko) | 56 steg |
| 2 | Blockers faktisk lukket i stegtekst | 5 lukket, 4 delvis, 0 bare notert | 9 blocker-rader i `## Revisions` |
| 3 | Kontekst ved økt 1s siste melding | 491 688 tokens | vindu ikke registrert i transkriptet |
| 4 | Probens fire spørsmål avgjørbare fra Claude Code | 0 | 4 |
## 1. Sporbarhet: 56 steg mot briefens paragrafer
Klassifisering per stegs primære leveranse (`Files:`-linjen), strengt:
DIREKTE = paragrafens egen tekst ber om leveransen; AVLEDET = ingen paragraf ber om
leveransen selv, den tjener et briefkrav via en operatørbeslutning (1–7 i brief.md),
en research-fil eller en risiko-ID; INGEN = ingen av delene.
| Klasse | Steg | Antall |
|--------|------|--------|
| DIREKTE | 2–9, 11, 14, 15, 17–23, 26–29, 31, 34–36, 38–40, 43–46, 48–55 | 41 / 56 |
| AVLEDET | 1, 10, 12, 13, 16, 24, 25, 30, 32, 33, 37, 41, 42, 47, 56 | 15 / 56 |
| INGEN | — | 0 / 56 |
De 15 avledede fordeler seg på fire kilder:
| Kilde | Steg | Hva briefen sier |
|-------|------|------------------|
| Cowork-akseptanse per milepæl (brief.md Preferences) | 1, 16, 25, 37, 42, 47, 56 | §3 navngir Cowork som operatørflate; ingen paragraf ber om verifisering per milepæl |
| Beslutning 7 (host-side MCP-server) + research 03 | 12, 24 | §8 deklarerer nøyaktig to servere; den tredje er beslutningen |
| Risiko-ID alene | 10 (H5, scoring-aritmetikk i script), 13 (H11, byggestempel), 30 (C4, norsk leksikon-gap), 33 (M15r/H15, tools/list-golden) | ingen paragraf nevner disse |
| Beslutning 6 / research 02 | 32 (hook: §8 ber om «read tools only», research 02 målte at ingen slik opsjon finnes) | §2.1 er kravet hooken tjener |
| Beslutning 2 | 41 (asserter at mail-serveren er fraværende) | §8.2 krever en mail-server; fraværstesten finnes bare fordi den er utsatt |
`Source:`-linjen i stegene siterer `docs/build-brief.md` i 29 av 56 steg; 27 siterer
bare research, risiko, beslutning eller test-strategist. Steg 26–28 bygger §9s
sikkerhetsgrense, men `Source:` nevner bare research 01 og risiko-IDer; §9 står i
`Changes:`-prosaen. Operatørkjørte steg uten automatisk test: 7 av 56 (steg 1 og de
seks Cowork-stegene).
Full tabell med sitat per steg ligger i revisjonens arbeidsfil (ikke sporet);
tabellen over er summen av den.
### Scripts-avviket
Briefens §4 navngir tre scripts (`guard_ingest.py`, `sak_status.py`, `dashboard.py`).
Briefens §6 er den eneste setningen som begrunner et script med reproduserbarhet,
og den gjelder `sak_status.py` alene. Planen skriver tolv til.
Målt: `grep -o 'scripts/[A-Za-z0-9_./-]*' plan.md | sort -u` → 23 filer under
`scripts/`. 3 er i §4. 20 er «ikke i brief» som fil: 12 kapabilitets-scripts, 4 filer
i `jobbsok_lib/`, 4 shell-hjelpere. Planens egen avviksnote teller elleve
kapabilitets-scripts; den tolvte, `kandidat_schema.py` (steg 8), står ikke i listen.
| Script | Steg | I brief? | Briefparagraf det tjener | Nærmeste begrunnelse |
|--------|------|----------|--------------------------|----------------------|
| `kandidat_schema.py` | 8 | ikke i brief | §5.1 (valider, ikke regenerer) | risiko H7 (ingen YAML-avhengighet) |
| `vurdering.py` | 10 | ikke i brief | §7 `kandidatvurdering` | risiko H5 (`score_da` må ikke være modell-output), beslutning 3 |
| `jobbsok_tools.py` | 12, 24 | ikke i brief | — (§8 sier to servere) | beslutning 7, research 03 |
| `jobbsok_tools_launch.sh` | 12 | ikke i brief | — | beslutning 7, risiko H2 |
| `build_stamp.sh` | 13 | ikke i brief | — | risiko H11 |
| `package_plugin.sh` | 13 | ikke i brief | — | Cowork-akseptanse, blocker 9 |
| `bootstrap.sh` | 2 | ikke i brief | §9 (pin, ikke vendor) | risiko H2 |
| `beslutninger.py` | 22 | ikke i brief | §5.4 | risiko H4 |
| `dagens.py` | 23, 41 | ikke i brief | §11 M2 («dagens as text output») | risiko H9 |
| `korrespondanse.py` | 38, 39 | ikke i brief | §7 `korrespondanse`, §8.2 | beslutning 2 |
| `soknad.py` | 43 | ikke i brief | §7 `soknad` («Versioned, never sent») | risiko L4 |
| `referanser.py` | 45 | ikke i brief | §5.6 | risiko M13r |
| `cv_varianter.py` | 46 | ikke i brief | §5.5 | risiko M11r |
| `utfall.py` | 48 | ikke i brief | §5.7 | risiko H4 |
| `laering_signal.py` | 49 | ikke i brief | §7.2 | risiko H6 |
| `datahygiene.py` | 54 | ikke i brief | §7 `datahygiene`, §14.4 | beslutning 4, risiko M12r |
| `jobbsok_lib/{__init__,paths,frontmatter,jsonl}.py` | 3, 4, 5 | ikke i brief | §5, §5.1, §2.6 | risiko C6, H7, H4, H8 |
Hvert script tjener en paragraf; ingen paragraf ber om scriptet. Avviket er
dokumentert i planen og venter på operatørens ja (Revisions rad 7). Det er ett
spørsmål, ikke tolv: «skal deterministisk logikk ligge i scripts også der briefen
ikke sier det». Alternativet nevnt i `STATE.md` (slå loggskriverne sammen til én
modul) reduserer antallet filer, ikke antallet steder logikk må testes.
## 2. Review-funnene i fase 9
### Tallene stemmer ikke overens, og hvert tall har en egen tellemåte
| Kilde | Blockers | Majors | Minors | Sum | Tellemåte |
|-------|----------|--------|--------|-----|-----------|
| plan-critic, egen oppsummering (transkript) | 7 | 14 | 15 | 36 | agentens prosa: «Blockers: 7 / Major: 14 / Minor: 15», score 65.8/100, grad C, **verdict REPLAN** |
| plan-critic, unike JSON-funn | 7 | 13 | 15 | 35 | unike `(line, rule_key)` i agentens JSON-blokker, som kom i fire avkuttede deler |
| scope-guardian, unike JSON-funn | 0 | 6 | 5 | 11 | samme metode; verdict MIXED, «no blockers» |
| coord-melding fra økt 2 til PM | 7 | 14 | 20 | 41 (+12 guardian) | tallene økt 2 rapporterte videre; 20 minors finnes ikke i noen kilde |
| `STATE.md` | 7 | 12 | 14 | 33 | «33 funn innarbeidet» |
| `plan.md ## Revisions` | 9 | 19 | 5 | 33 | severity-kolonnen, talt med `awk` over 33 rader; rad 33 er en klynge på ti småfeil |
Kommando for den siste raden:
```bash
sed -n 2169,2223p plan.md | grep -E '^\| [0-9]+ \|' | awk -F'|' '{print $4}' | sort | uniq -c
```
Ordrens premiss «7 blockers / 14 majors / 20 minors» er altså plan-critics egne
tall for blockers og majors, med et minor-tall som ikke gjenfinnes. Revisjonstabellen
graderte to funn opp til blocker (rad 1, review-køen var skrivebeskyttet, som
guardian ga major; rad 16, hooks.json-scope, som er den andre halvdelen av critics
blocker på linje 1115).
### Er blockerne lukket i planteksten?
Regel: LUKKET = hvert element i Resolution-cellen står i stegteksten *og* dekkes av
en navngitt test eller stegets Verify-kommando; DELVIS = et element står bare i
tabellen, eller i `Changes:` uten test; BARE NOTERT = bare i tabellen.
| Rad | Blocker | Verdict | Belegg (plan.md-linje) | Det som mangler |
|-----|---------|---------|------------------------|-----------------|
| 1 | Review-køen var skrivebeskyttet | LUKKET | 1006 (leser `--review list/show/godkjenn/avvis`), 1012 (test), 1196/1202 (annonse-uttrekk møter køen) | — |
| 8 | `BUILD_STAMP` mot flyttende HEAD | DELVIS | 515 (byggeartefakt), 519/525 (test på ferskt stempel), 527 | «gitignored» står i 515, men `.gitignore` er verken i `expected_paths` (533–536), `must_contain` (544–546) eller testen (525) |
| 9 | `zip -r` lekker `.git`/venv/STATE/`.claude` | LUKKET | 514/517 (include-liste), 519/525 (arkivets innholdsfortegnelse testes), 607, 2005 | — |
| 10 | PreToolUse-hook feilet åpent | LUKKET | 1132 (begge navneformer, normalisering, scoped matcher), 1138 (test viser at bar-navn-sammenligning feiler åpent), 1157–1160 | — |
| 11 | `karantene/`, `.review/`, `kandidater/` uten scaffold og sletting | LUKKET | 186 (scaffold), 192, 1821 (steg 54 feier alle tre), 1827 (skanner hele workspace) | — |
| 13 | Disposisjonsautoritet udefinert | LUKKET | 939 («`decide` is authoritative»), 946 (test: wrapperen beregner ingen disposisjon), 948 | — |
| 14 | Falsk-positiv-raten aldri nevnt | DELVIS | 940 (lenker pakkes ut, review bemannet), 946 (`active:raw-html` fortsatt fanget) | tak-testen i 946/948 måler «a stated fraction» over «the benign corpus»; brøken er aldri oppgitt, og intet steg lager et benign-korpus for guarden (eneste benigne fixture er én fil, `adv-07-benign.json`, laget i steg 29, *etter* steg 26) |
| 15 | `sak.md`-frontmatter aldri skrevet tilbake | DELVIS | 653 (`--oppdater` eier fire nøkler), 659 (test: `--check` feiler uten), 778 (skillen kjører den) | «every Cowork step now runs `--check`» er usant: `grep -n -e '--check' plan.md` gir 7 linjer, den eneste i et Cowork-steg er 912 (steg 25); 1 av 6. Skillens `--oppdater`-kall (778) har ingen test (784) og ingen `must_contain` (803–805). Steg 20 (747/753) kaller scriptet «a reader … writes nothing» uten forbehold |
| 16 | hooks.json-scope uspesifisert; Cowork-hook umålt | DELVIS | 1132/1138 (scope), 1986–1987 (antakelse 7 og 8) | proben i steg 31 (1103) har ingen Verify (1108 tester bare `.mcp.json`), `docs/cowork-probe.md` er ikke i `expected_paths` (1114–1116) og ikke i sesjon 8s gjerde (2086) |
Fem av ni lukket, fire delvis, ingen bare notert. Ingen av de fire delvise gjelder M1
sesjon 1 (steg 1–3).
Foreldet tekst som fortsatt motsier en lukket blocker, funnet med grep:
| Sted | Tekst | Motsier |
|------|-------|---------|
| `brief.md:193` | «package `zip -r jobbsok.plugin .`» | blocker 9 |
| `brief.md:194` | «run the version-echo skill» | funn 2 (ekkoet bor i `kandidatprofil`, ingen femtende skill) |
| `brief.md:245` | «the version-echo skill prints the `plugin.json` version» | blocker 8 (steg 13, linje 515: «that stamp, not `plugin.json`'s version») |
| `plan.md:103` | Research Sources: «installs are UI-only (`zip -r jobbsok.plugin .` …)» | blocker 9 |
| `plan.md:384` vs steg 23 (842–872) | «From M2 the same echo is also available from `dagens`»; steg 23 nevner verken ekko eller stempel (0 treff) | funn 2s egen løsning |
| `plan.md:747/753` | steg 20: «The script writes nothing: it is a reader» | blocker 15 (`--oppdater`) |
| `plan.md:2054` | sesjon 4s gjerde mangler `package_plugin.sh`, `tests/test_plugin_manifest.py` og `.gitignore` (steg 13s filer) | blocker 8 og 9 |
| `plan.md:2086` | sesjon 8s gjerde mangler `docs/cowork-probe.md` (steg 31s probe) | blocker 16 |
Sjekket og *ikke* funnet: `.review` skrevet uten leser (hver skriving har en leser:
1006, 1196, 1821); Cowork-steg som fortsatt pakker repo-roten (ingen; alle seks
sier `package_plugin.sh`); `BUILD_STAMP` omtalt som sporet fil (ingen); hook som
sammenligner bare navn som design (ingen).
### Dedup-helperen: 21 inn, 21 ut
Helperen (`lib/review/plan-review-dedup.mjs`) slår sammen på to måter, lest i kilden:
eksakt `file:line:rule_key`, ellers Jaccard ≥ 0.7 på ordmengdene i `text`.
Inndataene (rekonstruert fra økt 2s transkript) var 9 critic-funn (7 blockers + 2
majors) og 12 guardian-funn. Lest par for par er **2 av 21** reelle duplikater:
linje 509 (versjons-ekko) og linje 1909 (den andre nettverkstesten). Målt med
helperens egen `tokenize` og `jaccardSimilarity`:
| Par | rule_key critic | rule_key guardian | Jaccard | Terskel |
|-----|-----------------|-------------------|---------|---------|
| linje 509 | `risk-premortem/h11-stamp-unavailable-when-degraded` | `gap` | 0.236 | 0.7 |
| linje 1909 | `coverage-completeness/second-network-test-missing` | `gap` | 0.404 | 0.7 |
Begge feiler begge kriteriene. Den falske negativen er reell og reproduserbar.
Over hele mengden unike funn (35 critic + 11 guardian = 46) er det 7 duplikatpar
lest for hånd: linje 509, 1909, 1745 (dagens kaller ikke dashboard.py), 1991
(Estimated Scope vs manifester), 1992 (script-tellingen), 183/281 (workspace-scaffold)
og 1055/1080 (fixture-nummerering). De fem siste nådde aldri helperen fordi
critics minors ennå ikke var transkribert da den ble kjørt. Netto unike defekter: 39.
### Det ingen anmelder har sett
- Planens hode sier «Plan quality: B (84/100), APPROVE_WITH_NOTES after Phase 9».
Det er øktens egen omskåring. Den eneste anmelder-verdicten på planen er
plan-critics **REPLAN, 65.8/100** på pre-revisjonsversjonen. Ingen anmelder har
vurdert den reviderte planen. Kommandodefinisjonen sier selv at en ny
critic-runde «carries the same loop risk it always did»; det er en kjent avveining,
men da må planens grad merkes som egenvurdert.
- Høy-effort-planer skal ifølge `commands/trekplan.md` bære seksjonen
`## Adversarial Pass 2 (v5.1.1 high-effort)` med status «unavailable, skipped»,
«Do NOT fail, retry, or silently omit the section». `grep -n 'Pass 2' plan.md`
gir 0 treff. Planens hode nevner utelatelsen i prosa, men markøren mangler.
Valideringen som *er* kjørt, holder ved re-måling 2026-09-04:
`plan-validator.mjs --strict` → valid, 56 steg; økt 2s gate-script → PASS=33 FAIL=0.
## 3. Prosessen
### Økt 1 (Fable 5.1), målt fra transkriptet
Kostnad og modellbruk (transkriptets `cost-state`):
| Modell | Input | Output | Cache-skriving | Cache-lesing | Kostnad |
|--------|-------|--------|----------------|--------------|---------|
| Fable 5.1 (hovedkontekst) | 6 263 | 120 802 | 467 617 | 18 734 033 | 20.14 USD |
| Opus 5 (16 underagenter) | 330 131 | 315 287 | 1 196 493 | 17 514 584 | 25.77 USD |
| Haiku 4.5 (64 websøk-kall) | 1 739 996 | 77 530 | 0 | 0 | 2.77 USD |
| Sum | | | | | 48.67 USD, 59.6 min veggklokke, 117 min API-tid |
Ingen `Agent`-spawn i økten valgte Haiku (alle 16 underagent-transkripter viser
`claude-opus-5`). Haiku-tokenene bærer de 64 websøk-forespørslene; hva verktøyet
bruker modellen til, er ikke målbart fra transkriptet.
Hovedkontekstens vekst per fase (nye tokens = `cache_creation + input`, én telling
per meldings-id):
| Fase | Meldinger | Nye tokens i kontekst | Output | Kontekst ved fasens slutt | Underagenter |
|------|-----------|-----------------------|--------|---------------------------|--------------|
| 0 oppsett + repo-init | 9 | 88 629 | 7 237 | 113 711 | 0 |
| 1 trekbrief --quick | 19 | 70 230 | 29 862 | 182 907 | 3 brief-reviewer |
| 2 trekresearch x3 | 25 | 206 449 | 47 207 | 387 895 | 10 (4 lokale, 6 eksterne) |
| 3 trekplan fase 1-5 | 3 | 31 286 | 8 209 | 419 022 | 3 (brief-reviewer, risk-assessor, test-strategist) |
| 4 avslutning (retur, STATE, lagring) | 13 | 73 368 | 28 173 | 491 688 | 0 |
Research-fasen alene la 206 449 tokens i hovedkonteksten, det meste ved at ti
agentrapporter ble lest inn og triangulert der. Økt 1 returnerte ordren med
begrunnelsen «40 pct context»; PM-ordren sier «60 pct». Ingen av prosentene kan
måles: transkriptet registrerer ikke kontekstvinduet. Det absolutte tallet er
491 688 tokens ved siste melding.
Økt 2 (Opus 5) til sammenligning: 38.05 USD, 69 min API-tid, planen på 2 149 linjer
skrevet som seks `Bash`-heredocs mellom 19:34 og 19:43 pluss halesegmentene 19:46,
deretter fase 9 til 20:18.
Ingen `AskUserQuestion` i økt 2 (målt: 0).
### Intervjuet
`AskUserQuestion` i økt 1: **5 runder, 12 spørsmål** (4 + 3 + 1 + 2 før briefen ble
promotert, 2 etter research: beslutning 6 og 7). `brief.md` oppgir
`interview_turns: 9`; tallet stemmer verken med runder eller spørsmål.
### Er brief.md avskrift av docs/build-brief.md?
Nei, målt tre måter (normaliserte linjer, små/store bokstaver og mellomrom slått sammen):
| Mål | Resultat |
|-----|----------|
| brief.md-linjer identiske med en build-brief-linje | 1 av 270 |
| brief.md-linjer ≥ 20 tegn med ≥ 0.8 likhet (difflib) mot en build-brief-linje | 4 av 236 |
| 8-gram (ordrekker på åtte) i brief.md som finnes i build-brief | 17 av 3 593 (0.5 %) |
| Ord | build-brief 2 301, brief.md 3 769 |
brief.md er en omskriving 1.6 ganger lengre enn kilden. Det nye i den er §14-svarene
(beslutning 1-5), beslutning 6-7 fra research, research-planen med tre tema, 33
grep-bare gate-kriterier for planen, og constraints omformulert for scope-guardian.
### Var `--quick` riktig modus?
`--quick` var PM-ordrens valg, ikke øktens (ordre 2026-09-03 punkt 3: «Kjoer
/trekbrief --quick med docs/build-brief.md som oppgavebeskrivelse»). Lest i
`commands/trekbrief.md`: `--quick` gir «compact start; still escalates on weak
sections», stiller framing-spørsmålet uansett, og hopper over fase 3.5
(effort-dialogen). Målt effekt i økt 1: eskaleringen slo inn, briefen gikk tre
brief-reviewer-runder (18:33, 18:39, 18:43) før gaten ble bestått; fase 3.5 ble
hoppet over, men `phase_signals` ble likevel skrevet for hånd etter beslutningen om
planleggingsmodell i runde 4. Hva standardmodus ville kostet, er en kontrafaktisk og
ikke målt; gatene er de samme i begge moduser.
### Hva ville `/trekplan --brief docs/build-brief.md` gitt?
Lest i `commands/trekplan.md` og målt mot validatoren:
```bash
node $VOYAGE/lib/validators/brief-validator.mjs --soft --json docs/build-brief.md
# {"valid": false, "errors": [{"code": "FM_MISSING", "message": "No frontmatter block found"}]} exit=1
```
- Fase 1 «Read the brief» parser frontmatter og henter `task`, `slug`,
`research_topics`, `research_status`; build-brief har ingen frontmatter, så alle
fire mangler. Validatoren gir en *error* (ikke warning) i både soft og strict modus,
og definisjonen sier «warnings do not block, errors do».
- Uten `research_status` finnes ingen research-gate og ingen research. De to
funnene som endret designet ville da manglet: Chrome ≥ 136 ignorerer
`--remote-debugging-port` på normalprofilen (research 02, operatøren kjører
Chrome 152), som gjør briefens §8 uutførbar som skrevet; og Cowork-sandkassen
når ikke Forgejo (research 03), som gjør `guard_ingest.py` uinstallerbar der.
Planen ville implementert §8 ordrett mot en nettleser som avviser den.
- Hard rule «Brief-driven … If a step has no brief basis, it is scope creep» og
«No interview» gjør at §14s fem beslutninger ikke kunne vært stilt i planfasen.
Konklusjon: build-brief er ikke et gyldig input for `/trekplan`; `/trekbrief` er
det eneste definerte steget som lager kontrakten validatoren krever.
## 4. Risiko før M1
### De to alvorlige blockerne
| Blocker | Løst i planen? | Arver M1 sesjon 1 (steg 1–3) den? |
|---------|----------------|-----------------------------------|
| 9, `zip -r` lekker `.git`, venv, `STATE.md`, `.claude/projects/` | Ja i stegtekst (steg 13, linje 514–527; steg 16, linje 607). Kommandoen står fortsatt i `brief.md:193` og `plan.md:103` | Nei. `awk 'NR>=122&&NR<=218' plan.md \| grep -i 'hook\|zip\|upload\|archive\|package'` → 0 treff. Sesjon 1s gjerde (2030–2031) nevner verken arkiv eller opplasting. Pakkeskriptet lages i steg 13, sesjon 4 |
| 10, PreToolUse-hook feilet åpent | Ja i stegtekst (steg 32, linje 1132/1138/1157–1160). Antakelse 7: om hooken i det hele tatt fyrer på connector-verktøy i Cowork er umålt; proben i steg 31 er ufullstendig (se rad 16 over) | Nei. Ingen hook, ingen `hooks/` i steg 1–3; `hooks/` er først berørbar i sesjon 8 (2086) |
Den reelle risikoen før M1 er ikke disse to. Den er at steg 1 ikke kan utføres av
utfører-økten (neste avsnitt), og at fire blockers er lukket delvis i steg som kommer
senere (13, 26, 21/25, 31), som M1 sesjon 4 og M3 sesjon 7–8 vil arve som de står.
### Steg 1: proben
Steg 1 måler fire ting: sesjonsmodus (lokal VM eller sky), om en plugin-deklarert
stdio-MCP-server dukker opp i økten, om en skill kan kalle `python3`, om
`${CLAUDE_PLUGIN_ROOT}` løses. Avgjørbarhet fra Claude Code, målt 2026-09-04:
| Spørsmål | Avgjørbart fra Claude Code? | Grunnlag |
|----------|-----------------------------|----------|
| Sesjonsmodus | Nei | `cowork_settings.json` på disk har bare nøkkelen `extraKnownMarketplaces`; skrivebordskonfigen har `coworkNetworkMode` og en liste over betrodde mapper, ingen sesjonslokasjon; den lokale sesjonslageret har 2 oppføringer, sist endret 2026-02-14 |
| Host-MCP synlig | Nei | krever en installert plugin med `.mcp.json` i en Cowork-økt |
| `python3` fra skill | Nei | krever en Cowork-økt |
| `CLAUDE_PLUGIN_ROOT` | Nei | krever en Cowork-økt |
Alle fire krever operatøren i Cowork. Steg 1 sier «operator-run measurement» og
«Reuses: the measurement method in research 03»; metoden der er en to-fils
test-plugin (én skill som ekkoer versjon, én stdio-server) lastet opp via
Customize → Plugins. Steget selv navngir ikke test-pluginen, og planens egen
`.mcp.json` (steg 12) og pakkeskript (steg 13) kommer elleve steg senere. En
utfører-økt kan ikke fullføre steg 1 alene; den kan bare forberede test-pluginen
og vente på operatørens fire svar.
Én til: den globale `CLAUDE.md` sier at Cowork er utilgjengelig på denne maskinen.
Research 03 målte det motsatte (Claude.app universal binary, Cowork-lager på disk).
Linjen er utdatert og bør rettes der den bor, ikke her.
## Metode og verifiseringslogg
Alle tall over er kjørt 2026-09-04. Kommandoene som ikke står inline:
- Transkripttidslinje og tokens: python over `*.jsonl` i øktens prosjektkatalog;
usage talt én gang per `message.id`; faser avgrenset på klokkeslettene for
`Skill`-kallene (`trekbrief` 18:27:42, `trekresearch` 18:46:29, `trekplan` 19:09:01).
- Anmeldernes unike funn: regex over JSON-objekter med `"severity"` i
underagent-transkriptene, unike på `(line, rule_key)`.
- Jaccard: `node`-script som importerer `lib/parsers/jaccard.mjs` og
`tokenize` fra `lib/review/plan-review-dedup.mjs`.
- Overlapp brief.md/build-brief: python `difflib.SequenceMatcher` og 8-gram-mengder.
- `plan-validator.mjs --strict --json plan.md` → valid, steps 56.
- Økt 2s gate-script (33 grep-kriterier fra brief.md) → PASS=33 FAIL=0.
- Sporbarhet og blocker-lukking: to Opus-underagenter med lese-tilgang; tabellene
deres er gjengitt i del 1 og 2, linjesitatene er stikkprøvet av hovedøkten.
Ikke målt: prosentandel kontekst (vindu ukjent), kostnad for standardmodus
`trekbrief` (kontrafaktisk), og hva Haiku-tokenene i websøk konkret ble brukt til.