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
104 lines
8.6 KiB
Markdown
104 lines
8.6 KiB
Markdown
# 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`.
|