Added
- Known Limitations database: 215 → 640 entries -- 425 new hook/agent bugs documented since v0.12.0 (42 critical, 266 high, 237 medium, 95 low), taxonomy consolidated from 36 fragmented categories down to 17 canonical ones. Notable CRITICAL disclosures: unsolicited session injection, subagent git-staging data loss, a
FileChanged-hook credential leak, Buddy ghost prompt injection, an infinite token-burn loop, and OAuth token revocation silently not taking effect. - Recipes page (
docs/recipes.html) -- Maps common Claude Code pain points (rules ignored, files deleted, dangerous commands, git disasters, token waste, tool-switching bypass) to the specific hook that fixes each one, with install commands and issue references. - Machine-readable JSON export of the Known Limitations database (
tools/export-kl.py) -- id, title, category, severity, issue URLs, and description for every entry, enabling programmatic consumption. - Limitations page: stats dashboard and sharing -- Clickable severity-breakdown pills, sort controls (number/severity/newest), and per-entry permalink buttons for sharing in GitHub discussions.
- SEO for the framework site -- Open Graph/Twitter card meta tags on all pages,
sitemap.xml, androbots.txt. - bash-guard: layered config hierarchy -- Global, project, and local config layers, so teams can set an org-wide baseline while projects add stricter rules (#20).
- bash-guard:
gh apimutation guard -- Blocks PUT/PATCH/DELETE against branch-protection and ruleset endpoints, plusgh repo delete, closing a path an agent previously used to disable repo protections and force-push unattended (#42849). - broca memory: TTL-tagged facts -- Entries can declare
ttl: Nin frontmatter; past the TTL they surface a staleness warning (⚠ stale) in recall. New--ttlflag onboucle memory rememberandttl_daysfield on thebroca_rememberMCP tool. - read-once: PostCompact hook (
compact.sh/compact.ps1) -- Clears the read-once cache on context compaction so stale "already read" state can't survive a compaction and mask a fresh read requirement. - Installer: missing-CLI warning -- Warns if the
claudeCLI itself isn't on PATH before installing hooks, without blocking install for users setting up ahead of time. - Loop runner: owner-checked structured lock v2 --
.boucle.locknow carries version/pid/token/started_at plus a process-start fingerprint; only the token-owningLockGuardcan delete its own lock, and a crashed loop's lock is detected as stale (viaps -o lstart=) instead of wedging or letting another loop steal it. loop.llm_timeout_secondsconfig (default 7200s) -- Bounds LLM subprocess runtime with a graceful-shutdown grace period before the process is killed, plus doctor/config validation.- Memory-context truncation -- Oversized STATE/HOT memory (>96KB) injected into the prompt is now truncated to a 64KB head + 16KB tail with an advisory marker instead of blowing up the prompt.
- file-guard: MultiEdit and NotebookEdit coverage -- Write protection and relative-path rejection, previously only on Write/Edit, now also cover MultiEdit and NotebookEdit (including
notebook_pathextraction). - enforce: token-aware bash pattern matching -- A rule targeting
rmno longer misfires on words liketerm; the read-only recipe was also expanded to block shell write paths (>,>>,tee,touch,mkdir,sed -i,perl -pi,mv,cp,chmod,chown). - safety-check: hardened
--verifymode -- CLI version checks now run under a hard timeout (a hangingclaude --versionno longer stalls the audit), verification timeouts are tracked and surfaced, warnings gained copy-pasteableIssue:reference lines, and aCLAUDE_CODE_SIMPLE(any non-empty value) hook-disable warning was added. - read-once:
stats --json-- machine-readable token-savings stats for scripting and dashboards. - read-once:
statsworks withoutjq-- stats parsing now uses python3 with an awk/sed fallback;jqis only needed for install/verify/hook paths. - install.ps1: command parity with install.sh --
upgrade,uninstall,list, andverifysubcommands now work on Windows/PowerShell.
Changed
- LLM backend is now model-driven -- models starting with
gpt-invokecodex exec(system prompt prepended to stdin, project-local.codex-home/honored, reasoning effort set); all other models invokeclaude -pwith--system-prompt,--allowed-tools, and--mcp-configas before.boucle doctorchecks whichever CLI the configured model needs. - install.sh / install.ps1: non-interactive default --
curl | bashwith no arguments used to hang at a read prompt or exit with "Nothing selected"; non-TTY stdin now defaults to the recommended hook set. Post-install command list trimmed from 9 to 4 lines (full list viahelp). - safety-check: bypass-gated warnings -- The hallucinated
Human:prefix warning and the unstoppable-background-agent warning used to fire for every user; they now only surface whenbypassPermissionsis active, where the risk they describe actually applies. - Download flags hardened (
-sL→-fsSL) -- Standardized across 14 install scripts and docs so an HTTP error page can no longer be silently piped intobashon a failed download.
Fixed
- bash-guard: ssh-keygen known_hosts exemption --
ssh-keygen -R/-F/-l(remove/find host, show fingerprint) create no keys and grant no remote access, but were previously blocked outright, forcing users to enable the wholessh-keysallow rule (which also unblocks the far riskierssh-add). These read/edit subcommands are now exempted while key generation andssh-addremain blocked -- community contribution by @Dzhuneyt (#27). - PreToolUse hook output schema -- Deny payloads were missing
hookEventNamealongsidehookSpecificOutput, causing Claude Code to reject them; now included (#21). - git-safe: matcher registration -- Completed and repaired matcher metadata across installers so the hook actually attaches to Bash calls in previously-affected legacy installs (#26).
- branch-guard: commit-command matching -- Now parses git-command argument position, catching commit aliases it previously missed and no longer false-positiving on arguments that merely contain the word "commit" (#22).
- read-once: Windows Git Bash path handling -- Normalized Windows-style paths; related installer tests hardened (#24).
- session-log: stdin and uninstall -- Fixed unsafe stdin path handling and removed legacy session-log installer entries during uninstall (#23).
- installer: false WARN on working hooks -- Post-install verification grepped for the string "block", but hooks emit
"permissionDecision":"deny"; everyinstall.sh recommendedrun showed false warnings for hooks that were actually working. All 4 patterns fixed and a standaloneverifycommand added. - installer: read-once firing on every tool call -- A missing
Readmatcher meant read-once ran on every Bash/Write/Edit/etc. call instead of just Read, adding unnecessary latency; the fix was also ported into theupgradesubcommand for existing installs. - installer: fragile version check -- A variable named for "minor" actually extracted the patch field, and lacked a major.minor guard, so update-nagging could misfire on future 2.2.x/3.x Claude Code releases.
- installer:
listand bash-guard matcher --listnow shows only actually-installed hooks; bash-guard matcher and deny-enforcement fixes ported into the unified installer. - CI: broken test workflow on main -- Fixed broca entry/gc/search and read-once hook path handling that had been breaking the test workflow.
- Known Limitations metadata drift -- Fixed
last_updatedfield drift and stale count references on the framework site landing page. - failure alerting:
alert_sentno longer latches on a failed send -- Alert-send failures are now logged with stderr instead of the alert being marked sent regardless of outcome. - improve engine: classify no longer re-counts all historical signals every run -- Fixes pattern-count inflation in
boucle improve run.
Security
gh apimutation guard in bash-guard -- Blocks branch-protection and ruleset mutations plusgh repo deleteby default, closing a path an agent used to strip repo protections and force-push unattended (#42849).- Install script download flags hardened (
-sL→-fsSL) -- A failed download can no longer silently pipe an HTTP error page intobashas if it were the install script.
Full changelog: CHANGELOG.md
Note: auto-generated notes were replaced — the previous v0.12.0 tag is not an ancestor of main, so the computed PR range was wrong.