# 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`.