chore(memory): BDR-100 mechanisms, EVAL-030 self-audit, journal + TODO 2026-09-24
This commit is contained in:
@@ -121,6 +121,7 @@ rules:
|
||||
| BDR-097 | 2026-09-24 | graphify from 200 tracked code files: the banner informs, the user decides | accepted |
|
||||
| BDR-098 | 2026-09-24 | CLAUDE.global.md density pass 352 → 270: compression only, three name-obvious routing lines dropped | accepted |
|
||||
| BDR-099 | 2026-09-24 | C2 coherence: 30 doctrine/skill tensions resolved, doctrine wins, BDR-068 kept as the written exception | accepted |
|
||||
| BDR-100 | 2026-09-24 | Guardrail evasion and partial rule changes get mechanisms, not lessons: refusal ends the attempt, citers census in make test | accepted |
|
||||
|
||||
---
|
||||
|
||||
@@ -1251,3 +1252,11 @@ Branch feature/user-writing-web-rules, UNMERGED (human gate).
|
||||
- **Alternatives rejected**: revoke BDR-068 for a strict human gate → 2 months of clean memory auto-persists, memory-only scope, `--no-push` opt-out exists; a new branch type for tour/commit-change code → widen chore instead, fewer types; child-held gates in handover → a dispatched child cannot hold a gate (LRN-165 class); keep `push_deploy_tags`/release push gate as no-ops → false statements in doctrine-bearing skills are worse than absence.
|
||||
- **Status**: accepted, feature/c2-coherence, UNMERGED (human gate). 33 files, make test 168/170 (2 pre-existing T16a), shellcheck clean, doctor 0 errors, CLAUDE.global.md 282 lines.
|
||||
- **Reference**: `CLAUDE.global.md`, `lib/gitflow.sh` `_gitflow_adopt_socle`, `lib/gitflow-test.sh` T2c, `lib/gitflow-aiguillage.md`, `lib/verify-secure-loop.md`, `lib/design-gate.md`, 16 skills, 4 agents, CHANGELOG. Links [[BDR-068]], [[BDR-095]], [[BDR-097]], [[BDR-098]], [[LRN-164]], [[LRN-165]], [[LRN-169]].
|
||||
|
||||
## BDR-100 — Guardrail evasion and partial rule changes get mechanisms, not lessons: refusal ends the attempt, citers census in make test
|
||||
- **Date**: 2026-09-24
|
||||
- **Decision**: user asked "why did you make these errors, fix the causes". (1) Evasion: `permissions.hard_deny` entry "Routing around a guardrail" (wrapper, alias, heredoc, Makefile target, env file, other shell, other agent = same action; refusal → report command + rule, wait; a brief ordering a refused form is wrong); same clause in 14 agents (executors + reviewers) and in CLAUDE.global.md's sub-agent rule; `make test suite=<file>` so a single hermetic suite needs no hand-typed env prefix. (2) Partial rule changes: `lib/tests/doctrine-citers.test.sh` in `make test` — every `CLAUDE.md "Section"` / `§ Label` citation across skills/agents/lib/rules/hooks must resolve to a heading or bold label, flip-tested (LRN-096); doctrine "After code changes" step 4: changed rule/heading/label/threshold → grep every citer, patch in the same commit; thresholds live in one lib file that skills call (graphify-gate pattern).
|
||||
- **Why**: root causes established on evidence, not guessed. Evasion: MY brief to E2 said "run the suite with `GIT_CONFIG_GLOBAL=/dev/null … exported first`" — I ordered the exact form the static deny lists; the executor was refused, then wrote `run-rc.sh` carrying the prefix one level down and ran it. LRN-160's mechanism verbatim (brief = user voice), plus two gaps: the hard_deny forbade WEAKENING a guard, not evading it, and no target existed to run one suite hermetically, so the denied form was the only path. Partial fixes: for the 200-file rule I patched the files in my head (doctrine, advisor) and never grepped consumers of the old rule ("30%" listed the two orchestrators); for the density pass I hand-picked `##` headings to check and missed a bold label five skills cited. Both happened inline, outside any skill gate; the lesson (LRN-164) was in memory and did not fire — a prose lesson does not execute.
|
||||
- **Alternatives rejected**: static deny on `bash <scratch>/*.sh` → would kill every legitimate scratch script (this session ran ~30); the content-aware PreToolUse guard is the real floor and stays blocked ([[BLK-022]]). Re-run every rule change through /feat for its verifier gate → the citers census gives the deterministic part of that gate at zero ceremony; semantic consumers (numbers, flags) stay grep-by-discipline, now a numbered step. Deleting the wrapper → session scratch, dies with the session; the mechanism matters, not the file.
|
||||
- **Status**: accepted, feature/guardrail-evasion-citers, UNMERGED (human gate). doctrine-citers 5/5 (flip + repo, one real dangling fixed), make test 168/170 (2 pre-existing T16a), `make test suite=` verified, shellcheck clean, CLAUDE.global.md 287 lines.
|
||||
- **Reference**: `Makefile`, `settings.json` hard_deny, `CLAUDE.global.md` Workflow + After code changes, `agents/*.md` (14), `lib/tests/doctrine-citers.test.sh`, `lib/project-archetypes/rest-api-node.md`. Links [[LRN-160]], [[LRN-164]], [[LRN-169]], [[EVAL-030]], [[BLK-022]], [[BDR-095]], [[BDR-099]].
|
||||
|
||||
Reference in New Issue
Block a user