- BDR-006: Caveman as 4th always-on plugin (output compression, sym with rtk's input compression). Full install rationale, alternatives rejected, caveats around path normalization + gitignore. - LRN-005: claude plugin install does NOT enable — explicit claude plugin enable required for ALWAYS-ON plugins. Pattern: read enabledPlugins, never hardcode plugin names in status displays. - LRN-006: caveman-shrink (and any MCP middleware proxy) needs an upstream wrapper. Bare registration fails health checks. Pattern: register under derived names (proxy-upstream), don't auto-register. - Journal: 2026-05-03 entry summarizing the session. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
11 KiB
11 KiB
| type | entry_prefix | schema | rules | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| decisions_registry | BDR |
|
|
Decisions registry (BDR)
Index
| ID | Date | Title | Status |
|---|---|---|---|
| BDR-001 | 2026-04-22 | Uniform --help helper via session-start hook (option C) | accepted |
| BDR-002 | 2026-04-23 | Move tasks/ + introduce memory + audits under .claude/ | accepted |
| BDR-003 | 2026-04-23 | Gitignore wildcard + negations pattern for .claude/ | accepted |
| BDR-004 | 2026-04-27 | Adopt auto permission mode as default | accepted |
| BDR-005 | 2026-04-27 | motion as default animation library; advisor stays read-only |
accepted |
| BDR-006 | 2026-05-03 | Caveman as 4th always-on plugin (output compression) | accepted |
BDR-001 — Uniform --help helper via session-start hook (option C)
- Date: 2026-04-22
- Status: accepted
- Decision: every skill exposes
--helpvia a shared snippet injected by the session-start hook, rather than duplicating the helper in each SKILL.md. - Why: 25+ skills — keeping the same helper synced across every file guarantees drift. A single injection point = single source of truth.
- Alternatives rejected:
- Option A (copy the helper into each SKILL.md) — rejected: maintenance entropy.
- Option B (external wrapper
/help <skill>) — rejected: breaks the "one command = one skill" experience.
- Reference: commit
3968a29.
BDR-002 — Move tasks/ + introduce memory + audits under .claude/
- Date: 2026-04-23
- Status: accepted
- Decision: migrate
./tasks/to.claude/tasks/, create.claude/memory/(5 registries BDR/LRN/BLK/journal/EVAL) and.claude/audits/for AUDIT_* files. Adapt skills/agents/CLAUDE.md. Integrate a CAPITALIZE step into completion skills (ship-feature, feat, bugfix, hotfix, commit-change) and add a/closeskill for the session-end ritual. - Why: grouping all meta-project state (AI config + tasks + memory + audits) under
.claude/isolates Claude governance from real code. Aligned with the official Claude Code memory docs. Without integration in completion skills, the registries would stay empty (aspirational text). - Alternatives rejected:
- Keep
./tasks/at root — rejected: clutters the repo, mixes code signal with governance signal. - Use
.claude/agent-memory/for everything — rejected:agent-memory/has a distinct role (already used by other tools). - Ritual as aspirational text only in CLAUDE.md — rejected: zero execution guarantee, registries would stay empty.
Stophook to ask the 3 questions every turn — rejected: too noisy.
- Keep
BDR-003 — Gitignore wildcard + negations pattern for .claude/
- Date: 2026-04-23
- Status: accepted
- Decision: use
.claude/*(wildcard match of immediate children) + negations!.claude/tasks/,!.claude/memory/, etc., rather than.claude/(recursive ignore). - Why: when a parent is ignored via
.claude/, git does not descend into it (performance optimization) and negations on children are ignored — documented ingitignore(5). With.claude/*, git matches each child individually, making negations active. - Alternatives rejected:
.claude/+!.claude/tasks/(naive) — rejected: negations have no effect, everything stays ignored.- Drop
.claude/from gitignore entirely — rejected:.claude/settings.local.jsonand.claude/agent-memory/must stay ignored (per-machine). - Track paths via
.gitattributesor an external tool — rejected: over-engineering, git handles this natively.
- Reference: commit
499cd07,git check-ignore -vverified on 4 paths (2 tracked, 2 ignored).
BDR-004 — Adopt auto permission mode as default
- Date: 2026-04-27
- Status: accepted
- Decision: set
permissions.defaultModeto"auto"in user-scopesettings.jsonand dropdisableAutoMode: "disable". Auto mode runs a classifier on every action and blocks risky operations (curl|bash, prod deploys, force push, IAM grants, mass deletes, exfiltration to external endpoints) while auto-approving local edits, lockfile-declared dep installs, and read-only HTTP. - Why: prompt fatigue under
defaultmode is significant on multi-step autonomous work. Auto mode keeps a safety net (classifier review) without the per-tool friction. The classifier also re-evaluates conversation-stated boundaries ("don't push", "wait for review") on every check, so verbal constraints carry weight. - Alternatives rejected:
- Keep
default— too many prompts, breaks flow on long tasks. acceptEdits— eliminates prompts but no classifier, blanket trust on Bash beyond filesystem helpers.bypassPermissions— skips all checks, no prompt-injection guard. Only for isolated containers.dontAsk— full denylist, breaks anything not pre-approved. Suited to CI, not interactive work.
- Keep
- Caveats: requires Claude Code v2.1.83+, plan ≠ Pro (Max/Team/Enterprise/API only), Sonnet 4.6 / Opus 4.6 / Opus 4.7, Anthropic API provider. On entering auto mode, blanket allow rules (
Bash(*),Bash(python*), package-manager run,Agent) are dropped and restored on exit. - Reference: commit
1421578.
BDR-005 — motion as default animation library; advisor stays read-only
- Date: 2026-04-27
- Status: accepted
- Decision: when a project's stack supports it, the framework installs
motion(ormotion-vfor Vue 3 / Nuxt) as the default animation library. Install is automatic in/init-projectSTEP 5e (post-scaffold) and opt-in in/onboardSTEP 2.5 (existing projects).plugin-advisoronly detects and reports the status — it never runsnpm installitself. Detection logic lives inlib/animation-lib-check.sh(sourced by all three layers). - Why: framer-motion was rebranded
motionin November 2024 (single package supporting Reactmotion/react, Svelte, vanilla JS;motion-vis the parallel package for Vue). Baking the new name in now avoids legacy-import sprawl across new projects. The split init-vs-onboard behavior follows the trust gradient: at init, the user has just validated the entire scaffold so silent install is fine; at onboard, we are touching an existingpackage.json, which is invasive without explicit consent. Plugin-advisor was kept read-only to preserve its "Never modify files" contract (PHASE 4 already mutates plugin state with confirmation; piling npm installs on top would blur its responsibility). - Alternatives rejected:
- Pin
framer-motion(legacy name) — rejected: the package is in maintenance mode, every new project would inherit the old import path. - Auto-install during
/onboardwithout asking — rejected: silently adds a runtime dep + ~50 KB gzip to a project the user did not ask to modify. - Make
plugin-advisorinstall missing libs — rejected: violates its read-only spec and breaks separation of concerns (advisor advises; orchestrators mutate). - React-only scope — rejected: Vue/Svelte teams should also benefit;
motion-vmakes the Vue case clean.
- Pin
- Eligibility rules (helper output):
eligible|motion: React, Next.js, Remix, Astro+React, Svelte/SvelteKiteligible|motion-v: Vue 3, Nuxtno|-: backend, CLI, embedded, Flutter, static HTML, React Native (usereact-native-reanimated), Astro without UI integration, nopackage.json
- Reference: helper at
lib/animation-lib-check.sh; integration inskills/init-project/SKILL.mdSTEP 5e,skills/onboard/SKILL.mdSTEP 2.5,agents/plugin-advisor.mdPHASE 1/2/3,lib/design-gate.md.
BDR-006 — Caveman as 4th always-on plugin (output compression)
- Date: 2026-05-03
- Status: accepted
- Decision: install
JuliusBrussee/cavemanin the always-on tier alongsidesecurity-guidance,superpowers, andrtk. "Full" install = plugin (/caveman+ cavecrew agents + plugin-scoped SessionStart/UserPromptSubmit hooks) + standalone hooks (statusline + stats badge in~/.claude/hooks/) +caveman-shrinkMCP scaffold (NOT auto-registered — proxy needs upstream wrapper).install-plugins.shSTEP 5.5 callsenable_plugin "caveman" "caveman"to write it intoenabledPlugins. Hook paths insettings.jsonare normalized to~/.claude/hooks/...post-install so this user's home dir doesn't leak across machines. - Why: caveman compresses Claude's output ~75% via caveman-speak while preserving technical substance. Symmetrical with rtk (input compression hook) — rtk shrinks tool I/O, caveman shrinks model output. Both hooks pay zero passive cost in a clean session and amortize across long runs. Always-on is justified: the plugin auto-deactivates with phrases like "stop caveman" / "normal mode", so toggle would be friction without benefit.
- Alternatives rejected:
- Toggle plugin (start OFF) — rejected: misses the by-default benefit; the user would need to remember
claude plugin enable caveman@cavemanper session, which negates the auto-compression value. --minimalinstall (plugin only) — rejected: loses the standalone stats badge that surfaces token-saving telemetry.--allinstall (adds per-repocaveman-rules.mdetc. into$PWD) — rejected: would litter THIS config repo (the cwd at install time) with rule files meant for project repos. Let users opt in per-repo when they want it.- Auto-register
caveman-shrinkMCP — rejected: the proxy errors with "missing upstream command" without an upstream MCP to wrap, fails health checks. Print a snippet instead and let the user pick which upstream they want compressed (filesystem, github, …).
- Toggle plugin (start OFF) — rejected: misses the by-default benefit; the user would need to remember
- Caveats:
- Caveman's
hooks/install.shwrites absolute paths ($HOME/.claude/hooks/caveman-*.js) intosettings.json. Sincesettings.jsonis symlinked into the repo, the absolute path would commit a username. STEP 5.5 runs a Python post-process to rewrite to portable~/.claude/hooks/...form (bash expands~before passing tonode). - Caveman's hook files materialize in
hooks/(the repo dir, not~/.claude/hooks/) because the latter is a symlink. They're added to.gitignoreto prevent accidental commit of user-scope state.
- Caveman's
- Reference: install-plugins.sh STEP 5.5, lib/detect-plugins.sh
detect_caveman*+plugin_enabled, doctor.sh caveman block, commit9b20b84.