diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index fdfb1e9..d91825b 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -312,3 +312,5 @@ rules: - Shipped config-protection hook (feature/config-protection-hook): PreToolUse blocks Edit/Write to quality-gate files (settings/gitflow/.githooks/doctor/hooks-self/lib-tests/lint). One-shot sentinel .claude/.config-edit-ok (non-empty reason, logged+consumed) — NOT env-var (launch-time = set-and-forget = garde mort). Own idiom, not ECC import. shellcheck clean, test 20/20. - Live dogfood: hook went active mid-session via symlinked settings (link.sh); v1 (no self-guard) let its OWN edit through → v2 added hooks/*.sh + lib/tests/* self-guard, then blocked the test-file edit; recovered via sentinel. User's self-guard requirement vindicated. - Next: #2 design-toolchain trigger fix (residual false-fires post-ed2408e, 5× this session). +- #2 done (bugfix/design-toolchain-trigger): trigger tightened — dropped bare design|component|composant|theme|thème|transition|frontend|front-end|palette; dashboard→\bdashboard\b (kills ecc_dashboard.py filename match, keeps "admin dashboard"); kept animation; added "front-?end design" bigram + fire-log counter (time+token+excerpt, ~/.claude/logs/design-toolchain-fires.log) so future "re-firing?" is measured. Test 18/18, shellcheck clean, live dogfood green. [[LRN-091]] corrob [[LRN-047]]. +- Double dogfood of #1 guard: config-protection blocked + sentinel-bypassed my own edits to the now-guarded design hook + its test — first real use of the guard, friction validated in passing (one-shot sentinel .claude/.config-edit-ok, non-empty reason, logged+consumed). ECC second-regard closed: #1 config-protection + #2 trigger fix, both merged to develop, nothing pushed. diff --git a/.claude/memory/learnings.md b/.claude/memory/learnings.md index 7b8953f..377556d 100644 --- a/.claude/memory/learnings.md +++ b/.claude/memory/learnings.md @@ -971,3 +971,9 @@ rules: - **context**: ECC 2nd-look 2026-07-03 (Opus 4.8, 6 agents, repo unchanged since 01/07). [[BDR-047]] audit (01/07) inventoried the declarative surface + concluded zero import — right on facts, but hooks/ (ECC's only live subsystem) was OUT of scope and held the sole real adaptation → config-protection PreToolUse guard. - **future application**: next external-repo value audit → enumerate hooks/, scripts/, runners FIRST; treat rules/docs/SKILL.md as claims to verify ("is it wired?"), not value. Described capability ≠ wired capability. - **cousin**: [[LRN-087]] presence-flag ≠ capability; [[LRN-089]] forwarded-args silently dropped — same family: a visible signal (a file, a flag, a `paths:`) lying about real behavior. + +## LRN-091 — a soft-nudge hook that over-fires gets ignored (banner-blindness) +- **pattern**: keyword-triggered nudge (design-toolchain reminder) with bare common tokens fires on non-UI work → reader tunes it out. Same class as a diagnostic that cries false [[LRN-047]]: a signal wrong too often stops being read. +- **rule**: keep a token BARE only when its UI sense dominates largely in a dev context (glassmorphism, navbar). Token common in non-UI talk (design, component, theme, transition, frontend) → require a UI-specific bigram (design system, front-end design) or drop; in doubt → bigram-or-drop. Borderline standalone nouns (dashboard, animation) may stay bare as an assumed call — the fire-log arbitrates later on data, not gut. (NOT "never bare tokens" — animation stays bare here by design.) +- **context**: design-toolchain-reminder.sh — 07-02 tightening (dropped page/form/menu/…) insufficient; 6 bare tokens still false-fired ~6×/session during the ECC config audit (design, ecc_dashboard.py, component, frontend, theme, transition, palette). 07-03 fix: dropped them, dashboard→`\bdashboard\b` (filename match killed, "admin dashboard" kept), added a fire-log (time+token+excerpt). `lib/tests/design-toolchain-reminder.test.sh` locks it (18 checks). +- **cousin**: [[LRN-047]] a doctor that cries false is ignored. diff --git a/.claude/tasks/TODO.md b/.claude/tasks/TODO.md index 81c6fab..e17c1fe 100644 --- a/.claude/tasks/TODO.md +++ b/.claude/tasks/TODO.md @@ -1,5 +1,17 @@ # TODO +## 2026-07-03 — design-toolchain trigger fix (bugfix/design-toolchain-trigger) +Root cause (NOT a kill-switch, per user): ed2408e (07-02) dropped ultra-generic +tokens but left bare tokens common in non-UI talk → ~6× false-fire THIS session +(design, dashboard via ecc_dashboard.py, component, frontend, theme, transition, +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 + ## 2026-07-03 — config-protection hook (feature/config-protection-hook) Goal: PreToolUse hook blocks Edit/Write to this config's quality-gate files (guardrails an agent must not weaken to make an error pass). Adaptation from ECC