config-audit/docs/devils-advocate-gap-verification-plan.md
Kjell Tore Guttormsen bc85b79eb9 docs(plan): devil's advocate brief — adversarial gap-review verification
Brief for the next session (post-/clear): independently DISPROVE the
"CC 2.1.114-181 feilretting is complete" claim rather than re-assert it.

Designed to run as a Dynamic Workflow (Workflow tool): one read-only
Explore skeptic per scanner surface (settings/hooks/mcp/permissions-DIS/
claude-md/knowledge/token) tries to find a still-open or superficially-
fixed row, plus adversarial review of this week's CA-SKL-002 + HOME-leak
work, then synthesis into a punch-list or a verified attestation.

Includes the 3 claims to attack (P1 no active false positives, P2 fixes
correct-not-superficial, P3 new work regression-free), the surface-cluster
table with attack angles, a runnable script skeleton + output schemas, and
a read-only scope-fence (findings → report, no fixes without approval).

STATE.md (gitignored, polyrepo) updated on-disk to hand this off as the
next session's active task.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ter3E2JSi1Khgmuf2kady8
2026-06-18 18:28:02 +02:00

104 lines
8.6 KiB
Markdown
Raw Permalink 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.

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