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

8.6 KiB
Raw Blame History

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.

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.