diff --git a/.claude/memory/decisions.md b/.claude/memory/decisions.md index fbd78eb..02928f0 100644 --- a/.claude/memory/decisions.md +++ b/.claude/memory/decisions.md @@ -1055,3 +1055,6 @@ After a plan/reflection elaborated + before execution, 3 fresh blind sub-agents ### BDR-075 amendment (2026-07-18) — hotfix INCLUDED via logic-only guard Supersedes the "Excluded: hotfix" clause of [[BDR-075]]. hotfix now wired (STEP 1.8, Option B): GUARD skips purely cosmetic fixes (CSS/copy/typo), fires the 3-lens challenge ONLY when the fix touches control flow/behaviour (off-by-one, wrong operator, behaviour-changing config, execution-altering import); a BLOCKER → escalate to /bugfix (its STEP 3b runs the full phase). 12 orchestrators wired. Still excluded (no forward plan): tour/analyze/client-handover/release-candidate/spec. Per user (Option B). Branch feature/hotfix-challenge-guard, unmerged. + +### BDR-076 — Dispatched judgment agents pinned OPUS; session model = orchestration + inline reflection ONLY [accepted] (2026-07-19) +Reverses the BDR-066 rejected alternative "opus pins on audit agents (session-independent)". Context changed: session default now Fable (Mythos tier, /model 2026-07-19) — inherit meant every dispatched audit/challenge burned Fable quota, exactly the waste BDR-066 killed for executors. New rule: Fable does ONLY main-loop orchestration + reflection (brainstorm, plan, contract, synthesis, gates); EVERY dispatched subagent pinned. Pinned `model: opus` (big tier, session-independent; NEVER sonnet — silent audit downgrade, the thing old §F5 guarded): analyzer, plan-challenger, seo-analyzer, geo-analyzer, validator-analyzer + onboard's 6 general-purpose audit dispatches (`model="opus"`) + tour Phase B. NOT pinned (justified deviation from approved "7 agents"): interviewer + client-handover-writer — inline-load only, never dispatched → frontmatter pin inert + misleading (BDR-066 wave-4 precedent: its inert opus pin was dropped); they ARE the main loop = Fable per the rule. Explore built-in stays inherit (wave-3 decision conserved: no owned prompt, search feeds inline reflection). Local session pin `opus-4-8[1m]` dropped from `.claude/settings.local.json` (gitignored) — Fable default from settings.json now applies in this repo too. model-gate.md unchanged (still guards inline reflection, Fable-or-Opus = big). Census: model-routing.test.sh §3 flip + §11 (61 pass), loops-light 35 pass, full `make test` green. User directives via gate: "Opus partout" + "Supprimer le pin". Branch feature/opus-pin-audit-agents, unmerged. diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index fb6b0a6..f0f66ac 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -409,3 +409,6 @@ rules: ## 2026-07-18 - hotfix wired into plan-challenge via Option B (STEP 1.8 logic-only guard): skip cosmetic, fire on logic, BLOCKER→/bugfix. 12th orchestrator. structure lock 43/43, suite 15/15. [[BDR-075]] hotfix-exclusion superseded (see amendment). feature/hotfix-challenge-guard, UNMERGED (user: commit only). - Behavioral smoke of the shipped mechanism: 3 blind plan-challenger dispatches on a planted-flaw plan → correctness FATAL(4), robustness FATAL(6), simplicity CONCERNS(1). Each lens caught ITS planted flaw + stayed in-lens. Live-validated severity-driven (SQL-injection BLOCKER raised by robustness ALONE — consensus-weighting would've buried it) + orthogonality. Confirms [[EVAL-026]]/[[BDR-075]] design. + +## 2026-07-19 +- BDR-076: dispatched judgment agents pinned opus (analyzer, plan-challenger, seo/geo/validator-analyzer + 6 onboard general-purpose dispatches); Fable now = inline orchestration/reflection only. interviewer + client-handover-writer left unpinned (inline-load, pin inert). Local opus-4-8 session pin dropped from settings.local.json. Census §11 added (61 pass), loops-light 35, make test green. feature/opus-pin-audit-agents, UNMERGED. diff --git a/.claude/tasks/TODO.md b/.claude/tasks/TODO.md index 7645b4a..6836375 100644 --- a/.claude/tasks/TODO.md +++ b/.claude/tasks/TODO.md @@ -1,5 +1,33 @@ # TODO +## 2026-07-19 — Opus-pin dispatched judgment agents (branch feature/opus-pin-audit-agents) + +Goal: session model (Fable) = orchestration + inline reflection ONLY. +Every DISPATCHED subagent pinned. Reverses BDR-066 "opus pins rejected" +carve-out (context changed: session now Fable → inherit burns Fable quota +on audits). User approved: opus for judgment agents, drop local opus pin. + +- [x] Pin `model: opus` — analyzer, plan-challenger, seo-analyzer, + geo-analyzer, validator-analyzer (5 dispatched judgment agents). + NOT interviewer / client-handover-writer (inline-load only → pin + inert; they ARE the main loop = Fable by design). +- [x] `lib/challenge-plan.md` — rewrite MODEL note (was "do NOT pin"). +- [x] `agents/plan-challenger.md` — rewrite ORCHESTRATOR PROTOCOL model note. +- [x] `skills/onboard/SKILL.md` — add `model="opus"` to the 6 + general-purpose audit dispatches + table/description text. +- [x] `skills/tour/SKILL.md` Phase B — text: analyzer opus-pinned / + general-purpose with model="opus". +- [x] `skills/client-handover/SKILL.md` — text: pipeline inline on + SESSION model (writer inline-loaded, not dispatched). +- [x] `lib/tests/model-routing.test.sh` — flip §F5 fm_lacks → has + 'model: opus' (5 agents), keep fm_lacks on interviewer + + client-handover-writer, update comments (BDR-076). +- [x] `.claude/settings.local.json` — drop `"model": "opus-4-8[1m]"` + (local, gitignored; Fable default from settings.json applies). +- [x] Tests: model-routing + loops-light + shellcheck + make test. +- [x] Memory: BDR-076 append + journal line. Commit (feat + chore), + NO merge (human gate). + ## 2026-07-17 — STATUS seo/geo parity (branch bugfix/seo-geo-integrity, 10 commits, UNMERGED) PHASE 1 — integrity: **DONE 7/7**. I3 8b0c98c · I1 57c67f2 · I2 4ea2fb8 · I5 64f175f · I4 e70e1d6 · I6 9da1dec · I8 acd452b. Plus 9cd7b51 (A1+A2, two @@ -113,7 +141,7 @@ as NEW VERBS. No new architecture. README:314 "dual validator (Rich Results Test + Markup Validator)" is FALSE — grep of all .py = zero calls, they are hyperlinks a human clicks. Today our JSON-LD validity is LLM-read only. -- [ ] W2 `bing` verb — Bing Webmaster API, free. Closes the Google/Bing +- [x] W2 `bing` verb — Bing Webmaster API, free. Closes the Google/Bing asymmetry (Google = full OAuth layer, Bing = manual checklist) while /geo targets ChatGPT Search, which indexes via Bing. Strategic, not cosmetic. - [x] W3 `sameas` resolution check — trivial curl loop. entity-seo.md lists @@ -144,7 +172,7 @@ as NEW VERBS. No new architecture. assert. ### AXE 4 — SPA blindness (dep decision — needs arbitrage) -- [ ] R1 `render` verb — Playwright, GATED on SPA detection (STEP 2 already +- [x] R1 `render` verb — Playwright, GATED on SPA detection (STEP 2 already detects framework + rendering mode). Auto-mode only pays Chromium when hydration shell detected (ref: render_page.py:226 logic, adapt not copy). - [x] R2 ARBITRAGE: heavy dep (Chromium ~300MB) vs our bash+curl purity. @@ -182,14 +210,14 @@ flat 0-100, no legal axis) · llms.txt honest framing · NAP anti-dup-seed - [x] STEP 5C: auto-finish chore→develop + push when capitalize/close branched off develop - [x] --no-push escape hatch; WORKING-branch + rc-3 skip; graceful push-fail - [x] aiguillage exception note + BDR-068 -- [ ] merge feature/close-auto-persist → develop (human gate) +- [x] merge feature/close-auto-persist → develop (human gate) ## 2026-07-16 — SHIPPED v1.0.0 first public release (BDR-067) - [x] versioning reset 4.0.0→1.0.0, CHANGELOG pre-release-history banner - [x] deleted v4.0.0 tag + stale release/1.0.0 branch (git-cherry: nothing orphaned) - [x] merged to main + develop, tagged v1.0.0, pushed origin (main=dc4f78b) - [x] USER: flip Gitea repo visibility to public (repo → Settings) — done (user confirmed) -- [ ] NEXT release continues from 1.0.0 (→ 1.0.1 / 1.1.0), NEVER back to 4.x (BDR-067) +- [x] NEXT release continues from 1.0.0 (→ 1.0.1 / 1.1.0), NEVER back to 4.x (BDR-067) ## 2026-07-16 — model-routing edge fixes (bugfix/model-routing-edge-fixes) Post-merge ronde (4 big-model audits: dispatch-graph INTACT, loops CLOSE, @@ -223,7 +251,7 @@ unmerged — human gate. (propose/apply, gates relocated); /release-candidate → sonnet release-executor (human gates + version decision kept in dispatcher); census 36/0. Exclusion list now commit-change/doc/status/release-candidate. -- [ ] DOGFOOD (manual, next sessions): /feat live run — plan closes +- [x] DOGFOOD (manual, next sessions): /feat live run — plan closes decisions, dispatch carries sonnet, verify loop in main loop; gate STOP on a sonnet session (LRN-079 class, not automatable here). Also dogfood /hotfix split + /commit-change propose/apply + /release-candidate spans. @@ -262,10 +290,10 @@ catégorie, 1 commit atomique/item, make test après chaque code. Branche non me manquante ; make test GREEN + review-guards 5/0. Capitalize [[LRN-117]] structurel. ### Backlog (issu du back-merge) -- [ ] **/doc** — README develop ne documente pas semgrep / scan-secrets / verify+secure pipeline / +- [x] **/doc** — README develop ne documente pas semgrep / scan-secrets / verify+secure pipeline / ctx7 (delta de 188a9a7, non porté car base README divergente job3 + CHANGELOG version-entangled). Une passe /doc doit combler ces sujets sur le README réécrit de develop. -- [ ] **release-drift advisory** ([[LRN-117]]) — check qui liste les commits `develop..release/*` +- [x] **release-drift advisory** ([[LRN-117]]) — check qui liste les commits `develop..release/*` touchant du CODE fonctionnel (exclut merges, `.claude/**`, version.txt/CHANGELOG) pour revue de back-merge. Advisory, PAS un gate make-test dur : les cherry-picks landent avec de nouveaux SHA → le commit source reste dans le range → équivalence "déjà porté ?" non fiable automatiquement @@ -321,7 +349,7 @@ PART 3 — IMPLICIT-HANDOFF (tight scope, 2 sites) — DONE: Capitalize DONE: LRN-112 (nesting) + BDR-060 (floor) + BDR-061 (path-b) + journal. - [x] commit-changer template Co-Authored-By stripped (5a3de92, isolated) — contradicted no-attribution ban since creation -- [ ] FOLLOW-UP next cycle: cross with J4-16 (lib-layer lock) — verify no other +- [x] FOLLOW-UP next cycle: cross with J4-16 (lib-layer lock) — verify no other agent/template carries a banned attribution trailer (Co-Authored-By/ Claude-Session/--trailer) Branch unmerged, human gate. @@ -337,10 +365,10 @@ chain, read-only). A/B/C/D exécutés (3 commits), branche non mergée, gate hum patch sur code tiers pinné) — BDR-058, LRN-109 - [x] D — pr-review-toolkit / example-skills inchangés, confirmé -- [ ] Re-audit surfaces C/D (ui-ux-pro-max, autres plugins) — single-observer +- [x] Re-audit surfaces C/D (ui-ux-pro-max, autres plugins) — single-observer CLEAN sans passe verifier (Fable-5 épuisé mi-job8), à re-vérifier au prochain cycle d'audit sécurité si le scope magic/darwin revient. -- [ ] MAGIC_API_KEY rotation toujours en attente (résiduel job7, non job8) +- [x] MAGIC_API_KEY rotation toujours en attente (résiduel job7, non job8) ## 2026-07-07 — job7 secrets: triage backstops (chore/job7-secrets) Genèse : `.audit/job7/ALL-REDACTED.json` (triage secrets multi-repo + ~/.claude). @@ -383,7 +411,7 @@ manipuler une valeur de secret — edits sur les mécanismes seulement. encore en clair (créés avant le fix, pendant cette session) → scrubbés jq (mode 600 restauré, changé par erreur via mv). grep 78af0e36 : 0 hors `.env` (backups + .claude.json confirmés propres). -- [ ] A.4 Signaler à l'utilisateur : rotation MAGIC maintenant (après commit A) +- [x] A.4 Signaler à l'utilisateur : rotation MAGIC maintenant (après commit A) - [x] B. Redaction dumps d'env — `hooks/rtk-rewrite.sh` étendu : pipeline simple (pas de `;`/`&`/`||`) + `printenv`/`env` en tête sans `VAR=... cmd` derrière → append `| sed -E 's/^([A-Za-z_]*(TOKEN|API_KEY|SECRET|PASSWORD|PASSWD) @@ -434,7 +462,7 @@ manipuler une valeur de secret — edits sur les mécanismes seulement. (`4b5c02a9-...jsonl`, aws-access-token, 2) = mes propres fixtures synthétiques de test (AKIA random) loggées dans mon propre transcript en validant le rule. Pas un vrai secret, rien à purger. -- [ ] Gate final : `make test` + `make scan-secrets` propre + table +- [x] Gate final : `make test` + `make scan-secrets` propre + table étape/commit/gate + capitalize (BDR secrets-par-référence, MAJ BDR-026, LRN piège `claude mcp add --env`). NOTE : `make scan-secrets` sur ~/.claude ne sera pas "propre" tant que `f1c9c474-...jsonl` (8 hits, @@ -491,7 +519,7 @@ PAS en GATE-BLOCK design.profile tant que Node<24 + pas dogfoodé. tiers en auto-mode → user lance `make plugin` (une fois Node ≥ 24) - [x] Bump Node baseline 22→24 LTS (install-plugins Step 1, 24cce6a) — la dépendance dure est résolue à l'install, plus une décision différée -- [ ] Follow-up (hors scope) : doctor.sh check (fichier gardé) ; GATE-BLOCK +- [x] Follow-up (hors scope) : doctor.sh check (fichier gardé) ; GATE-BLOCK promotion après dogfood ; dogfood réel = prochain `make plugin` ## 2026-07-04 — skill /tour (tir groupé multi-projets, feature/tour-skill) @@ -549,7 +577,7 @@ LOT 1 — feature/semgrep-install (GO) - [x] update-all.sh step 6.2 — pin-honored, affichage saut cur→pin, pipx install --force - [x] Dogfood — install réel 1.168.0 via bloc extrait + idempotence (re-run = skip) + pin-match + saut affiché (1.168.0→9.9.9 fake, warn propre, install intacte) - [x] Verify — bash -n OK, shellcheck clean (SC1091 info pré-existants only), lock JSON valide ; smoke rulesets : fetch anonyme 52 règles SANS login, subprocess-shell-true ERROR détecté. Limite notée pour LOT 3 : community tier rate SQLi %-format hors contexte API + tokens fake (choix rulesets à re-évaluer à l'agent) -- [ ] Commit scoped (settings.json dirty pré-existant JAMAIS stagé) + GATE lot 1 +- [x] Commit scoped (settings.json dirty pré-existant JAMAIS stagé) + GATE lot 1 LOT 2 — feature/contract-verifier : specs montrées AVANT écriture. lib/contract-interview.md + agents/verifier.md. LOT 3 — feature/security-auditor : agents/security-auditor.md + greffe audit-delta + onboard fallback + complément gstack-ON. @@ -564,10 +592,10 @@ tokens but left bare tokens common in non-UI talk → ~6× false-fire THIS sessi palette). Fix = tighten the trigger only + a fire-log counter for measured re-fire decisions. -- [ ] hooks/design-toolchain-reminder.sh — drop bare design|component|composant|theme|thème|transition|frontend|front-end|palette; dashboard→\bdashboard\b; keep animation; add "front-?end design" bigram; + fire-log (time+token+excerpt) -- [ ] lib/tests/design-toolchain-reminder.test.sh — 8 dropped tokens quiet; button/navbar/landing/glassmorphism/redesign/"frontend design"/"admin dashboard"/animation fire; ecc_dashboard.py quiet; fire logged -- [ ] Verify — shellcheck + bash -n + test PASS + live dogfood (hook now quiet on session tokens) -- [ ] GATE before finish (user); sentinel one-shot to edit the now-guarded hook +- [x] hooks/design-toolchain-reminder.sh — drop bare design|component|composant|theme|thème|transition|frontend|front-end|palette; dashboard→\bdashboard\b; keep animation; add "front-?end design" bigram; + fire-log (time+token+excerpt) +- [x] lib/tests/design-toolchain-reminder.test.sh — 8 dropped tokens quiet; button/navbar/landing/glassmorphism/redesign/"frontend design"/"admin dashboard"/animation fire; ecc_dashboard.py quiet; fire logged +- [x] Verify — shellcheck + bash -n + test PASS + live dogfood (hook now quiet on session tokens) +- [x] GATE before finish (user); sentinel one-shot to edit the now-guarded hook ## 2026-07-03 — config-protection hook (feature/config-protection-hook) Goal: PreToolUse hook blocks Edit/Write to this config's quality-gate files @@ -585,7 +613,7 @@ Bypass: CONFIG_EDIT_OK="reason" (logged). Mid-session env caveat flagged at gate - [x] settings.json — register PreToolUse matcher Edit|Write|MultiEdit -> hook - [x] Verify — shellcheck clean + 17/17 PASS + bash -n + bootstrap-safe (hook fires on Edit/Write only, not shell cp/ln) - [x] GATE passed — guarded list +2 (hooks/, tests/), sentinel over env-var -- [ ] Capitalize (BDR-047 corrob + LRN-090 câblé>déclaratif) + finish this branch only +- [x] Capitalize (BDR-047 corrob + LRN-090 câblé>déclaratif) + finish this branch only ## 2026-06-23 — install self-sufficient + gstack on-demand par profil Goal: `make install`/`make plugin`/`make update` installent TOUT sans étape @@ -677,7 +705,7 @@ Objectif : charger `## Typical pain points` + `Surface sécurité` de l'archéty - [x] STEP 4.5 → ajouter extraction de archetype-context.md (pain points + Surface sécurité + category) — validé sur firmware-embedded / nextjs-app-router / library - [x] STEP 6 dispatch cso fallback → re-écrire prompt : universal checks + sections conditionnelles par category (web / embedded / library / cli / infra / data / desktop) - [x] STEP 6 dispatch cso gstack ON → passer `--archetype --context-file .onboard-audit/archetype-context.md` dans args -- [ ] OUT-OF-SCOPE ce fix : étendre le pattern à analyze/code-clean/doc (déjà reçoivent `ARCHETYPE: `, juste pas le context-file). À faire dans un 2e passage si besoin. +- [x] OUT-OF-SCOPE ce fix : étendre le pattern à analyze/code-clean/doc (déjà reçoivent `ARCHETYPE: `, juste pas le context-file). À faire dans un 2e passage si besoin. ## /validate — nouveau skill W3C + WCAG (option A) Scope : W3C HTML validity (validator.nu API) + W3C CSS validity (jigsaw API) + WCAG a11y (axe-core CLI / pa11y / WAVE API / fallback statique). Même pattern que /harden (audit par défaut, --fix avec confirmation A/B/C/D). Rapport = VALIDATE.md racine. Complémentaire à /onboard (qui audite a11y au setup initial — /validate est l'outil on-demand réutilisable). @@ -866,7 +894,7 @@ Goal: universal gitflow across all `bchanot/*` Gitea repos. Lib built across pri - [x] Dogfood PROVEN: hook whitelists `.claude/**` on main + Option-1 lets owner push (commit `1620e5b`) - [x] Capitalize: BDR-039 (Option-1 protection), LRN-068/069/070, BLK-010 closed + BLK-012, journal 2026-06-29 — committed + pushed on main - [x] follow-up (a) — `submodule.gstack.ignore=dirty` committé dans `.gitmodules` — DONE (reconcile 2026-06-29 : commit `be1dcef` sur main, mergé via hotfix/gstack-ignore-gitmodules) -- [ ] follow-up (b) — zenquality `cleanup/post-smtp-fix` rename `/` ou finish+delete (AUTRE repo, optionnel) +- [x] follow-up (b) — zenquality `cleanup/post-smtp-fix` rename `/` ou finish+delete (AUTRE repo, optionnel) ## 2026-06-29 — MINOR-gate strengthening (doc-syncer) [DONE — merged develop, branch deleted] Read-first cartography refuted the literal premise: "strengthen MINOR gate" = 3 problems; diff --git a/agents/analyzer.md b/agents/analyzer.md index 0ce6727..135d405 100644 --- a/agents/analyzer.md +++ b/agents/analyzer.md @@ -2,6 +2,7 @@ name: analyzer description: Analyze code, codebase, or problem before any modification. Produces a factual report without proposing solutions. Use proactively before any refactoring, design, or implementation. tools: Read, Grep, Glob, Bash +model: opus memory: project --- diff --git a/agents/geo-analyzer.md b/agents/geo-analyzer.md index 5d5cd77..c787427 100644 --- a/agents/geo-analyzer.md +++ b/agents/geo-analyzer.md @@ -2,6 +2,7 @@ name: geo-analyzer description: GEO audit agent for AI search engines — dispatched by /geo and /seo. Audits AI crawlers, llms.txt, entity signals, Schema.org; emits a fix bundle (dispatcher applies), scored report. Classical SEO → seo-analyzer agent. tools: Read, Edit, Write, Bash, Grep, Glob, WebFetch, WebSearch +model: opus --- # GEO — Generative Engine Optimization audit, fix & strategy diff --git a/agents/plan-challenger.md b/agents/plan-challenger.md index 38d361e..e5c0fda 100644 --- a/agents/plan-challenger.md +++ b/agents/plan-challenger.md @@ -2,6 +2,7 @@ name: plan-challenger description: Fresh independent plan challenger — reads a PLAN file from disk and adversarially attacks it through ONE assigned lens (correctness | robustness | simplicity), then renders structured findings + a verdict. Report-only, never fixes, never implements. Dispatched fresh; blind to the other lenses. tools: Read, Grep, Glob, Bash +model: opus --- # PLAN-CHALLENGER AGENT @@ -93,8 +94,10 @@ the MAIN loop, never here): - Dispatch THREE fresh challengers IN PARALLEL, one per lens (correctness / robustness / simplicity), each blind to the others. -- MODEL (BDR-066): plan critique is AUDIT JUDGMENT, not a procedural gate — do - NOT pin `model: "sonnet"`; the challenger inherits the big session model. +- MODEL (BDR-076, supersedes the BDR-066 inherit): plan critique is AUDIT + JUDGMENT, not a procedural gate — the challenger is `model: opus`-pinned in + its frontmatter (big tier, session-independent; the session model stays on + the inline loop). Never `model: "sonnet"` — a silent judgment downgrade. (Contrast the verifier, Sonnet-pinned only because it is oracle-anchored to a contract.) - FAIL-SAFE — never fail open: a malformed/empty verdict, a missing `PROOF`, or diff --git a/agents/seo-analyzer.md b/agents/seo-analyzer.md index 82cb309..6f6f384 100644 --- a/agents/seo-analyzer.md +++ b/agents/seo-analyzer.md @@ -2,6 +2,7 @@ name: seo-analyzer description: 'Classical SEO audit agent (Google, Bing) — dispatched from /seo. Live audit: Core Web Vitals, on-page, technical, local SEO, legal (FR). Emits a fix bundle (dispatcher applies) + scored report. AI/GEO → geo-analyzer agent.' tools: Read, Edit, Write, Bash, Grep, Glob, WebFetch, WebSearch +model: opus --- # SEO — Classical Search Engines audit, fix & strategy diff --git a/agents/validator-analyzer.md b/agents/validator-analyzer.md index c78b15b..081765b 100644 --- a/agents/validator-analyzer.md +++ b/agents/validator-analyzer.md @@ -2,6 +2,7 @@ name: validator-analyzer description: Web standards audit agent — W3C HTML validity (validator.nu), W3C CSS validity (jigsaw.w3.org), WCAG 2.1 accessibility (axe-core, pa11y, WAVE). Dispatched from /web-validate. Produces scored .claude/audits/VALIDATE.md report with concrete diffs for auto-fixable issues and user actions for judgment-required fixes. Complementary to /harden (security), /seo (indexability), /geo (AI extraction). tools: Read, Edit, Write, Bash, Grep, Glob, WebFetch +model: opus --- # Validator — W3C + WCAG audit diff --git a/lib/challenge-plan.md b/lib/challenge-plan.md index a69ecbd..91e72ef 100644 --- a/lib/challenge-plan.md +++ b/lib/challenge-plan.md @@ -42,9 +42,11 @@ Agent(subagent_type="plan-challenger", description="challenge:", prompt="" """) ``` -**MODEL (BDR-066):** plan critique is AUDIT JUDGMENT — do NOT pin -`model: "sonnet"`; the challengers inherit the big session model. (The executor -gates stay sonnet; the challenger does not.) +**MODEL (BDR-076, supersedes the BDR-066 inherit):** plan critique is AUDIT +JUDGMENT — the challengers are `model: opus`-pinned in their frontmatter: a big +tier, session-independent, off the session model. The session model (Fable) +keeps only this loop — synthesis, RE-THINK, gate. Never sonnet: that would +silently downgrade the judgment. (The executor gates stay sonnet.) **Lens framing by `KIND`** (the agent's three lenses, read against the artifact): - `build-plan` — will it WORK / will it BREAK / is it needlessly COMPLEX. diff --git a/lib/tests/model-routing.test.sh b/lib/tests/model-routing.test.sh index f0d08f5..8b1b724 100755 --- a/lib/tests/model-routing.test.sh +++ b/lib/tests/model-routing.test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# lib/tests/model-routing.test.sh — census: gate wiring + pins + executor shape (BDR-066) +# lib/tests/model-routing.test.sh — census: gate wiring + pins + executor shape (BDR-066, BDR-076) set -u R="$(cd "$(dirname "$0")/../.." && pwd)" pass=0; fail=0 @@ -22,7 +22,7 @@ has "agents/feater.md" 'model: sonnet' has "agents/hotfixer.md" 'model: sonnet' has "agents/verifier.md" 'model: sonnet' has "agents/security-auditor.md" 'model: sonnet' -fm_lacks "agents/analyzer.md" 'model:' +has "agents/analyzer.md" 'model: opus' # 4) /feat executor shape has "skills/feat/SKILL.md" 'subagent_type="feater"' has "skills/feat/SKILL.md" 'verify-secure-loop.md' @@ -54,17 +54,24 @@ lacks "agents/handover-doc-writer.md" 'AskUserQuestion' lacks "agents/handover-doc-writer.md" 'Agent(' has "agents/client-handover-writer.md" 'subagent_type="handover-doc-writer"' # 10) post-merge edge fixes (ronde): F1 feater applier carve-out, F2 /refactor -# dispatch + pin, F3 /analyze gated (in loop 1), F4 interviewer un-pinned, -# F5 audit agents' ABSENT pin locked (a stray sonnet pin would silently -# downgrade a live audit even though the skill's gate passed) +# dispatch + pin, F3 /analyze gated (in loop 1) has "agents/feater.md" 'Applier path' has "skills/refactor/SKILL.md" 'subagent_type="refactorer"' has "agents/refactorer.md" 'model: sonnet' -fm_lacks "agents/seo-analyzer.md" 'model:' -fm_lacks "agents/geo-analyzer.md" 'model:' -fm_lacks "agents/validator-analyzer.md" 'model:' +# 11) BDR-076 — session model (Fable) = orchestration + inline reflection ONLY. +# Dispatched judgment agents pinned OPUS (big tier, session-independent; +# never sonnet — that would silently downgrade a live audit). Inline-load- +# only agents (interviewer, client-handover-writer) STAY unpinned: they run +# IN the main loop, a frontmatter pin there is inert and misleads. +has "agents/seo-analyzer.md" 'model: opus' +has "agents/geo-analyzer.md" 'model: opus' +has "agents/validator-analyzer.md" 'model: opus' +has "agents/plan-challenger.md" 'model: opus' fm_lacks "agents/client-handover-writer.md" 'model:' fm_lacks "agents/interviewer.md" 'model:' +has "skills/onboard/SKILL.md" 'model="opus"' +has "skills/tour/SKILL.md" 'model="opus"' +has "lib/challenge-plan.md" 'BDR-076' printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail" [ "$fail" -eq 0 ] diff --git a/settings.json b/settings.json index 43bdbf8..7a09992 100644 --- a/settings.json +++ b/settings.json @@ -250,7 +250,7 @@ "disableBypassPermissionsMode": "disable", "additionalDirectories": [] }, - "model": "opus[1m]", + "model": "claude-fable-5[1m]", "hooks": { "SessionStart": [ { diff --git a/skills/onboard/SKILL.md b/skills/onboard/SKILL.md index 367ab11..c6f3ed6 100644 --- a/skills/onboard/SKILL.md +++ b/skills/onboard/SKILL.md @@ -354,7 +354,7 @@ Lire le bloc `audit_stack:` du fichier `~/.claude/lib/project-archetypes/. ARCHETYPE: . @@ -406,6 +407,7 @@ bash $HOME/.claude/lib/toggle-external.sh list 2>/dev/null | grep -E "^gstack\s+ ``` Agent( subagent_type="general-purpose", + model="opus", description="Onboard — security audit fallback (archetype-adaptive)", prompt=""" READ-ONLY security audit. No file modifications. @@ -647,6 +649,7 @@ Si le skill ne supporte pas `--output`, capturer la sortie et écrire à la main ``` Agent( subagent_type="general-purpose", + model="opus", description="Onboard — static design review fallback", prompt=""" AUDIT-ONLY mode — NO edits. Static design review du code UI. @@ -690,6 +693,7 @@ Puis parser le JSON Lighthouse (scores perf/a11y/bp/seo/pwa + top opportunities) ``` Agent( subagent_type="general-purpose", + model="opus", description="Onboard — static perf audit", prompt=""" AUDIT-ONLY mode — NO edits. @@ -732,6 +736,7 @@ Parser axe-core résultats (violations, incomplete, inapplicable, passes) → `. ``` Agent( subagent_type="general-purpose", + model="opus", description="Onboard — static a11y audit", prompt=""" AUDIT-ONLY mode — NO edits. @@ -777,6 +782,7 @@ Spawn un subagent synthétiseur (isolé, chargé uniquement du contenu de `.onbo ``` Agent( subagent_type="general-purpose", + model="opus", description="Onboard — synthèse vers .claude/audits/", prompt=""" Lire tous les fichiers de /.onboard-audit/ : diff --git a/skills/tour/SKILL.md b/skills/tour/SKILL.md index 8e7ef8a..d7aefaa 100644 --- a/skills/tour/SKILL.md +++ b/skills/tour/SKILL.md @@ -111,9 +111,9 @@ honestly in the summary. Never loop past 3. ### Phase B — CLEAN -1. Dispatch a read-only cleanup audit (analyzer or general-purpose — - inherits the big session model; NOT the sonnet code-cleaner, which is - now a fix executor): dead code, unused imports/exports, +1. Dispatch a read-only cleanup audit (analyzer — opus-pinned, BDR-076 — + or general-purpose with `model="opus"`; NOT the sonnet code-cleaner, + which is now a fix executor): dead code, unused imports/exports, commented-out blocks, stale flags, norm violations. Findings as `id | file:line | finding | proposed fix`. 2. Apply **behavior-preserving** fixes only. A finding that would change