diff --git a/docs/devils-advocate-gap-verification-plan.md b/docs/devils-advocate-gap-verification-plan.md new file mode 100644 index 0000000..980acf3 --- /dev/null +++ b/docs/devils-advocate-gap-verification-plan.md @@ -0,0 +1,104 @@ +# Brief — Devil's Advocate: motbevis at CC 2.1.114→181-feilrettingen er komplett + +**Skrevet:** 2026-06-18 · **For:** NESTE sesjon (etter `/clear`) · **Scope:** kun `config-audit/` · **Metode:** Dynamic Workflow (adversariell fan-out) + +## Hvorfor denne sesjonen finnes +Forrige sesjon konkluderte: «den akutte feilrettingen er ferdig; gap-matrisen er stale, alle 5 false-positive-klynger er fikset.» Den konklusjonen hviler på **spot-sjekk av 5 klynger + git-historikk**, IKKE på en uttømmende rad-for-rad-verifisering av matrisens 130+ rader. Operatøren bestilte derfor en **devil's advocate**: en uavhengig, skeptisk part som aktivt prøver å **motbevise** «alt er lukket». Default-holdning: en fiks er IKKE bekreftet før kode + test beviser den korrekt OG komplett. + +## Hva som skal angripes (3 påstander) +1. **P1 — Ingen aktive false positives igjen.** Hver matrise-rad med `verdict=now-wrong` / `action=fix-false-positive` er faktisk fikset i dagens kode. +2. **P2 — Fiksene er korrekte, ikke overfladiske.** Ikke bare «nøkkel lagt i KNOWN_KEYS», men riktig TYPE_CHECK/enum/struktur. (Presedens: `skillOverrides` skulle IKKE i TYPE_CHECKS fordi verdien er objekt — en naiv `'string'`-sjekk ville skapt NY false positive. Let etter den slags.) +3. **P3 — Denne ukens nye arbeid er regresjonsfritt.** `CA-SKL-002` (aggregat-budsjett) + HOME-leak-klasse-fiksen har ingen skjulte feil. + +**Eksplisitt UTENFOR scope:** rader merket `missing` / `new-feature-gap-check` / `new-scanner` er *manglende kapabiliteter*, ikke bugs. Devil's advocate skal IKKE rapportere dem som funn — MEN skal flagge hvis en `missing`-rad i virkeligheten er en feilmerket `now-wrong` (bug i forkledning). + +## Hvorfor Dynamic Workflow (ikke solo-kontekst) +Matrisen spenner ~12 config-surfaces × 130+ rader. Uttømmende verifisering mot scanner-kode + tester er en fan-out-oppgave: uavhengige skeptikere per surface gir bredde + uavhengighet som én kontekst ikke klarer uten å skumme. Mønster: **review → find → adversarially verify → synthesize**. Workflow-verktøyet er forhåndsautorisert av operatøren for DENNE sesjonen (denne forespørselen = opt-in); bekreft kort med operatør før du brenner tokens, kjør så. + +## Surface-klynger å fane ut over (fixed-claims å motbevise) +Ankret i `docs/cc-2.1.x-gap-matrix.md` + git. Hver klynge = én skeptiker-agent: + +| Klynge | Mål-fil | Påstått fikset i | Angreps-vinkel | +|---|---|---|---| +| settings-keys + `xhigh` | `scanners/settings-validator.mjs` | `7309935` | Er ALLE ~11 nøkler + `xhigh` til stede? Er TYPE_CHECKS riktige (array vs string vs objekt)? Finn en gyldig CC 2.1.181-config som fortsatt flagges. | +| hook-events | `scanners/hook-validator.mjs` | `98ddd77` | `MessageDisplay`+`post-session` i `VALID_EVENTS`? Count = 28? Andre nye events (2.1.114–181) glemt? | +| MCP env-vars + `trust` | `scanners/mcp-config-validator.mjs` | `4b94da0`,`b3c572a` | `CLAUDE_PROJECT_DIR`-allowlist + POSIX `${var%}`-skip korrekte? Shell-`${VAR}` (2.1.161)? Er `trust` *helt* borte (kode+humanizer+knowledge+fixturer)? | +| permissions / DIS + CNF | `scanners/disabled-in-schema-scanner.mjs`, `conflict-detector.mjs`, `lib/permission-rules.mjs` | `bec3f45` | Er `Tool(param:value)` / `WebFetch(domain:*)` param-bevisst i BEGGE scannere? Konstruer deny/allow-par som FØR kollapset — fyrer det fortsatt feil? | +| claude-md-lengde | `scanners/claude-md-linter.mjs` | `feaa7ed` | Er HIGH@500 reframet til MEDIUM token-kost? Finnes det en gjenværende `SEVERITY.high`-sti for ren lengde? | +| knowledge-korpus | `knowledge/*` | `624f5ed` | `/simplify`→`/code-review`, Opus 4.8-default, Fable 5, siste `feature-evolution`-rad = v2.1.181? Gjenværende «4.7»/«v2.1.111»-staleness? | +| token / skill-listing | `scanners/skill-listing-scanner.mjs`, `token-hotspots.mjs` | `8376dab`,`7bb2547`,`66433fe` | (se P3) | + +## Workflow-skisse (script-skjelett — neste sesjon authorer/kjører via `Workflow`) +Hybrid: hovedkontekst skummer matrisen inline → bygger klynge-listen → fan-out skeptikere. Pipeline der mulig (per klynge uavhengig), barrier kun før syntese. + +```js +export const meta = { + name: 'devils-advocate-gap-verification', + description: 'Adversarially disprove that the CC 2.1.114-181 feilretting is complete', + phases: [ + { title: 'Refute', detail: 'one skeptic per scanner surface — try to find a still-open or wrongly-fixed row' }, + { title: 'Session', detail: 'adversarial review of CA-SKL-002 + the HOME-leak fix' }, + { title: 'Synthesize', detail: 'punch-list of genuinely-open items, or a verified attestation' }, + ], +} + +const VERDICT = { type:'object', additionalProperties:false, + required:['surface','rows','overallVerdict'], + properties:{ + surface:{type:'string'}, + rows:{type:'array', items:{type:'object', additionalProperties:false, + required:['claim','actualStatus','verdict','evidence'], + properties:{ + claim:{type:'string'}, // the matrix row / fixed-claim + actualStatus:{type:'string'}, // what the code actually does now + verdict:{enum:['confirmed-fixed','still-open','incorrectly-fixed','uncertain']}, + evidence:{type:'string'}, // file:line + the proving/refuting test or config + counterexample:{type:'string'} // a config that still false-positives, if found + }}}, + overallVerdict:{enum:['all-closed','has-open-items']} + }} + +// CLUSTERS: hardcode from the table above (surface, targetFiles, matrixRows) — keeps it deterministic. +const CLUSTERS = [ /* settings, hooks, mcp, permissions, claude-md, knowledge, token */ ] + +phase('Refute') +const refutations = await parallel(CLUSTERS.map(c => () => + agent( + `DEVIL'S ADVOCATE. Surface: ${c.surface}. Target file(s): ${c.targetFiles}.\n` + + `For each matrix row claimed fixed (${c.matrixRows}), READ the scanner code AND its test, then TRY TO REFUTE ` + + `that the fix is correct and complete. Construct a valid CC 2.1.181 config that SHOULD pass and check whether ` + + `the scanner still flags it; check TYPE_CHECK/enum/struct correctness (skillOverrides precedent: object, not string). ` + + `Default each row to 'still-open'/'uncertain' unless code+test prove 'confirmed-fixed'. Cite file:line. Do NOT report ` + + `'missing'/feature-gap rows as findings (out of scope) unless one is a now-wrong bug mislabeled.`, + { label:`refute:${c.surface}`, phase:'Refute', schema:VERDICT, agentType:'Explore' } + ))) + +phase('Session') +const sessionReview = await parallel([ + () => agent(`Adversarially review CA-SKL-002 in scanners/skill-listing-scanner.mjs + its tests. Hunt: off-by-one at the ` + + `4000-tok boundary, the min(desc,1536) capping logic, ID-ordering assumptions, calibration-note honesty, humanizer entry.`, + { label:'review:CA-SKL-002', phase:'Session', schema:VERDICT, agentType:'Explore' }), + () => agent(`Adversarially review the HOME-leak fix (commits 66433fe + 325182d). Did isolating HOME hide real coverage? ` + + `Are there OTHER CLI-spawning tests still reading real ~/.claude that the grep audit missed? Is fix-cli REALLY leak-free?`, + { label:'review:home-leak', phase:'Session', schema:VERDICT, agentType:'Explore' }), +]) + +phase('Synthesize') +const all = [...refutations, ...sessionReview].filter(Boolean) +const open = all.flatMap(r => r.rows).filter(x => x.verdict==='still-open' || x.verdict==='incorrectly-fixed') +return { open, attestation: open.length===0 ? 'all-closed (verified)' : `${open.length} open items`, raw: all } +``` + +## Suksesskriterier (verifiserbare) +- Hver `now-wrong`/`fix-false-positive`-rad har en eksplisitt `verdict` med `file:line`-bevis (ikke «ser bra ut»). +- Devil's advocate har FAKTISK forsøkt minst én counterexample-config per klynge (ellers er den ikke adversariell). +- Sluttleveranse: enten **«all-closed (verified)»** med rad-telling, ELLER en punch-list av reelt åpne items → hver blir en failing-test-først-fiks (Iron Law), IKKE auto-fikset uten godkjenning. +- `node --test 'tests/**/*.test.mjs'` forblir grønn; ingen workflow-agent endrer kode (read-only `Explore`-agenter). + +## Scope-gjerde +Read-only analyse. Funn → rapport + forslag. INGEN kode-endring i devil's advocate-sesjonen uten at operatøren godkjenner punch-listen og ber om fiks (da: failing-test-først per item). Ikke utvid til feature-gap-implementering. + +## Pekere +- Matrise: `docs/cc-2.1.x-gap-matrix.md` (stale ift. kode — verifiser mot kode, ikke mot matrisen). +- Overordnet plan: `docs/cc-2.1.x-gap-review-plan.md`. Fase 4-plan: `docs/cc-2.1.x-fase4-items-2-3-plan.md`. +- Fix-commits å revidere: `7309935`,`98ddd77`,`4b94da0`,`bec3f45`,`feaa7ed`,`624f5ed`,`b3c572a`,`8376dab`,`7bb2547`,`66433fe`,`325182d`.