cc-safe-setup 29.8.0 → 30.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +72 -19
- package/.claude-plugin/plugin.json +1 -1
- package/CONTRIBUTING.md +7 -2
- package/COOKBOOK.md +50 -46
- package/LICENSE +21 -0
- package/MIGRATION.md +8 -8
- package/README.md +419 -512
- package/SAFETY_CHECKLIST.md +15 -7
- package/SERVICES.md +194 -0
- package/SETTINGS_REFERENCE.md +236 -17
- package/SKILL.md +5 -5
- package/TROUBLESHOOTING.md +35 -14
- package/action.yml +12 -4
- package/audit/README.md +84 -0
- package/audit/audit-checklist.md +152 -0
- package/audit/boundary-selftest.sh +85 -0
- package/audit/boundary.sh +123 -0
- package/audit/count-hooks.py +42 -0
- package/audit/find-dead-hooks.sh +82 -0
- package/audit/find-unfirable-rules.sh +142 -0
- package/audit/fire.sh +97 -0
- package/audit/selftest.sh +42 -0
- package/audit/unfirable-selftest.sh +81 -0
- package/audit-web/index.html +9 -9
- package/examples/README.md +54 -17
- package/examples/account-billing-log.sh +98 -0
- package/examples/account-routing-preflight.sh +123 -0
- package/examples/agent-sdk-credit-pool-monitor.sh +145 -0
- package/examples/agent-view-quota-decrement.sh +32 -0
- package/examples/agent-view-quota-warn.sh +94 -0
- package/examples/agents-md-edit-drift-warner.sh +223 -0
- package/examples/agents-md-loader.sh +160 -0
- package/examples/agents-md-sync-checker.sh +102 -0
- package/examples/ai-slop-punctuation-arrest.sh +210 -0
- package/examples/allowlist.sh +70 -10
- package/examples/always-allow-pattern-suggester.sh +125 -0
- package/examples/ansible-vault-guard.sh +2 -1
- package/examples/anthropic-base-url-guard.sh +76 -0
- package/examples/api-busyloop-guard.sh +123 -0
- package/examples/api-endpoint-guard.sh +12 -0
- package/examples/api-key-in-url-guard.sh +17 -1
- package/examples/api-rate-limit-guard.sh +36 -1
- package/examples/api-rate-limit-tracker.sh +12 -0
- package/examples/articulated-scope-capture.sh +101 -0
- package/examples/askuserquestion-autonomy-gate.sh +102 -0
- package/examples/attachment-traversal-guard.sh +118 -0
- package/examples/aup-block-pattern-logger.sh +161 -0
- package/examples/aup-false-positive-helper.sh +124 -0
- package/examples/aup-large-tool-output-warner.sh +282 -0
- package/examples/aup-retry-loop-guard.sh +229 -0
- package/examples/auth-expiry-reminder.sh +157 -0
- package/examples/auth-macos-sleep-detector.sh +185 -0
- package/examples/auth-path-detector.sh +171 -0
- package/examples/auth-status-checker.sh +157 -0
- package/examples/authorized-reconfirmation-detector.sh +195 -0
- package/examples/auto-approve-build.sh +39 -0
- package/examples/auto-approve-cargo.sh +31 -1
- package/examples/auto-approve-docker.sh +35 -0
- package/examples/auto-approve-git-read.sh +37 -14
- package/examples/auto-approve-go.sh +30 -1
- package/examples/auto-approve-gradle.sh +29 -1
- package/examples/auto-approve-make.sh +29 -1
- package/examples/auto-approve-maven.sh +29 -1
- package/examples/auto-approve-python.sh +41 -1
- package/examples/auto-approve-readonly-tools.sh +1 -0
- package/examples/auto-approve-readonly.sh +110 -33
- package/examples/auto-approve-ssh.sh +30 -1
- package/examples/auto-approve-test.sh +44 -0
- package/examples/auto-checkpoint.sh +1 -1
- package/examples/auto-compact-prep.sh +0 -0
- package/examples/auto-git-checkpoint.sh +0 -0
- package/examples/auto-mode-safe-commands.sh +53 -1
- package/examples/auto-mode-safety-enforcer.sh +151 -4
- package/examples/auto-push-session-branch.sh +22 -0
- package/examples/aws-production-guard.sh +13 -1
- package/examples/aws-region-guard.sh +1 -1
- package/examples/background-cost-launch-guard.sh +82 -0
- package/examples/background-task-guard.sh +12 -0
- package/examples/backup-before-refactor.sh +0 -0
- package/examples/banned-command-guard.sh +12 -0
- package/examples/bash-allowlist-secondary-check.sh +157 -0
- package/examples/bash-domain-allowlist.sh +12 -0
- package/examples/bash-fanout-bounded-rewriter.sh +191 -0
- package/examples/bash-heuristic-approver.sh +112 -10
- package/examples/bash-project-fence.sh +194 -0
- package/examples/bash-safety-auto-deny.sh +12 -0
- package/examples/bash-secret-output-detector.sh +44 -3
- package/examples/bash-trace-guard.sh +12 -0
- package/examples/bashrc-safety-check.sh +0 -0
- package/examples/bg-permission-prompt-warner.sh +182 -0
- package/examples/bg-task-cooldown-guard.sh +12 -0
- package/examples/binary-read-detector.sh +135 -0
- package/examples/binary-upload-guard.sh +12 -0
- package/examples/block-database-wipe.sh +35 -10
- package/examples/branch-name-check.sh +8 -3
- package/examples/branch-naming-convention.sh +0 -0
- package/examples/broad-find-guard.sh +12 -0
- package/examples/broad-prefix-session-trap-warner.sh +106 -0
- package/examples/bulk-file-delete-guard.sh +45 -0
- package/examples/bypass-mode-effective-verifier.sh +203 -0
- package/examples/cache-creation-drift-detector.sh +120 -0
- package/examples/cache-residue-detector.sh +195 -0
- package/examples/cache-tier-logger.sh +70 -0
- package/examples/cache-ttl-eviction-detector.sh +149 -0
- package/examples/cargo-publish-guard.sh +14 -1
- package/examples/case-insensitive-path-guard.sh +21 -2
- package/examples/case-sensitive-guard.sh +23 -2
- package/examples/cch-cache-guard.sh +0 -0
- package/examples/cch-sentinel-precommit-guard.sh +47 -0
- package/examples/check-abort-controller.sh +1 -1
- package/examples/check-accessibility.sh +0 -0
- package/examples/check-aria-labels.sh +0 -0
- package/examples/check-before-act-enforcer.sh +12 -0
- package/examples/check-charset-meta.sh +0 -0
- package/examples/check-cookie-flags.sh +0 -0
- package/examples/check-cors-config.sh +0 -0
- package/examples/check-csp-headers.sh +0 -0
- package/examples/check-csrf-protection.sh +0 -0
- package/examples/check-debounce.sh +1 -1
- package/examples/check-dependency-age.sh +0 -0
- package/examples/check-dependency-license.sh +0 -0
- package/examples/check-dockerfile-best-practice.sh +0 -0
- package/examples/check-error-boundaries.sh +0 -0
- package/examples/check-error-class.sh +1 -1
- package/examples/check-error-handling.sh +0 -0
- package/examples/check-error-logging.sh +1 -1
- package/examples/check-error-message.sh +0 -0
- package/examples/check-error-stack.sh +0 -0
- package/examples/check-favicon.sh +0 -0
- package/examples/check-git-hooks-compat.sh +0 -0
- package/examples/check-gitattributes.sh +0 -0
- package/examples/check-https-redirect.sh +0 -0
- package/examples/check-input-validation.sh +0 -0
- package/examples/check-lang-attribute.sh +0 -0
- package/examples/check-npm-scripts-exist.sh +0 -0
- package/examples/check-package-size.sh +0 -0
- package/examples/check-port-availability.sh +0 -0
- package/examples/check-promise-all.sh +1 -1
- package/examples/check-rate-limiting.sh +0 -0
- package/examples/check-return-types.sh +0 -0
- package/examples/check-semantic-versioning.sh +0 -0
- package/examples/check-suspense-fallback.sh +1 -1
- package/examples/check-test-exists.sh +0 -0
- package/examples/check-test-naming.sh +0 -0
- package/examples/check-timeout-cleanup.sh +1 -1
- package/examples/check-tls-version.sh +0 -0
- package/examples/check-unsubscribe.sh +1 -1
- package/examples/check-viewport-meta.sh +0 -0
- package/examples/check-worker-terminate.sh +1 -1
- package/examples/checkpoint-tamper-guard.sh +12 -0
- package/examples/chmod-guard.sh +12 -0
- package/examples/chown-guard.sh +24 -0
- package/examples/ci-workflow-guard.sh +6 -1
- package/examples/claim-verify-detector.sh +109 -0
- package/examples/claim-vs-caveat-checker.sh +77 -0
- package/examples/classifier-fallback-allow.sh +114 -40
- package/examples/claude-cache-gc.sh +1 -0
- package/examples/claude-code-version-pin-advisor.sh +183 -0
- package/examples/claude-md-reinjector.sh +129 -0
- package/examples/claude-md-size-monitor.sh +66 -0
- package/examples/claude-update-budget-guard.sh +123 -0
- package/examples/claude-update-smart.sh +113 -0
- package/examples/claudeignore-enforce-guard.sh +12 -0
- package/examples/claudemd-enforcer.sh +0 -0
- package/examples/claudemd-tool-prohibition.sh +128 -0
- package/examples/clear-command-confirm-guard.sh +32 -15
- package/examples/cli-config-pinning-detector.sh +162 -0
- package/examples/cliff-countdown-advisor.sh +96 -0
- package/examples/clipboard-secret-guard.sh +12 -0
- package/examples/closure-word-verify-gate.sh +150 -0
- package/examples/cloud-cli-guard.sh +39 -2
- package/examples/commit-all-scope-guard.sh +44 -0
- package/examples/commit-message-check.sh +1 -1
- package/examples/commit-message-quality.sh +6 -1
- package/examples/commitment-carry-forward-arrest.sh +361 -0
- package/examples/compact-alert-notification.sh +0 -0
- package/examples/compact-dispatch-watchdog.sh +149 -0
- package/examples/completion-claim-without-verification-detector.sh +207 -0
- package/examples/composer-guard.sh +12 -0
- package/examples/compound-bash-permission-resolver.sh +156 -0
- package/examples/compound-command-allow.sh +1 -1
- package/examples/compound-command-deny-enforcer.sh +183 -0
- package/examples/compound-inject-guard.sh +12 -0
- package/examples/concurrent-edit-lock.sh +12 -0
- package/examples/conflict-marker-guard.sh +12 -0
- package/examples/consecutive-error-breaker.sh +0 -0
- package/examples/console-log-count.sh +1 -0
- package/examples/context-compact-advisor.sh +29 -2
- package/examples/context-length-budget.sh +69 -0
- package/examples/context-threshold-alert.sh +12 -0
- package/examples/context-usage-drift-alert.sh +41 -13
- package/examples/conversation-history-guard.sh +12 -0
- package/examples/core-file-protect-guard.sh +12 -0
- package/examples/cors-star-warn.sh +0 -0
- package/examples/cost-incident-self-audit.sh +162 -0
- package/examples/cowork-claude-md-load-checker.sh +100 -0
- package/examples/cowork-fuse-staleness-watcher.sh +140 -0
- package/examples/cowork-hook-absence-warner.sh +167 -0
- package/examples/cowork-model-picker-advisor.sh +115 -0
- package/examples/credential-exfil-guard.sh +65 -4
- package/examples/credential-file-cat-guard.sh +17 -1
- package/examples/cron-create-receipt.sh +112 -0
- package/examples/cron-modification-guard.sh +12 -0
- package/examples/cross-product-mcp-spawn-detector.sh +178 -0
- package/examples/cwd-project-boundary-guard.sh +0 -0
- package/examples/daemon-zombie-worker-surfacer.sh +118 -0
- package/examples/daily-cost-guard.sh +164 -0
- package/examples/daily-usage-tracker.sh +0 -0
- package/examples/dangerous-pip-flag-guard.sh +12 -0
- package/examples/db-connect-guard.sh +13 -1
- package/examples/denied-action-retry-guard.sh +12 -0
- package/examples/deny-bypass-detector.sh +12 -0
- package/examples/deny-rule-integrity-verifier.sh +181 -0
- package/examples/dependency-install-guard.sh +12 -0
- package/examples/deploy-guard.sh +14 -2
- package/examples/deploy-path-verify-guard.sh +12 -0
- package/examples/deployment-readback-gate.sh +135 -0
- package/examples/deployment-readback-gh-adapter.sh +247 -0
- package/examples/deployment-verify-guard.sh +25 -2
- package/examples/destructive-db-script-write-guard.sh +166 -0
- package/examples/destructive-migration-write-guard.sh +163 -0
- package/examples/diff-size-guard.sh +12 -0
- package/examples/disabled-feature-toggle-advisor.sh +88 -0
- package/examples/disk-partition-guard.sh +12 -0
- package/examples/dispatch-allowlist-preflight.sh +301 -0
- package/examples/dispatch-liveness-watchdog.sh +216 -0
- package/examples/dispatch-receipt.sh +174 -0
- package/examples/django-migrate-guard.sh +12 -0
- package/examples/dns-config-guard.sh +12 -0
- package/examples/docker-dangerous-guard.sh +12 -0
- package/examples/docker-volume-guard.sh +0 -0
- package/examples/dockerfile-latest-guard.sh +1 -0
- package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
- package/examples/dotenv-commit-guard.sh +12 -0
- package/examples/dotenv-read-guard.sh +12 -0
- package/examples/dotfile-protection-guard.sh +12 -0
- package/examples/dotnet-build-on-edit.sh +1 -1
- package/examples/drizzle-migrate-guard.sh +27 -2
- package/examples/echo-probe-spam-detector.sh +176 -0
- package/examples/edit-counter-test-gate.sh +12 -0
- package/examples/edit-error-counter.sh +1 -1
- package/examples/edit-guard.sh +12 -0
- package/examples/edit-old-string-validator.sh +12 -0
- package/examples/edit-quote-ambiguity-guard.sh +97 -0
- package/examples/edit-retry-loop-guard.sh +0 -0
- package/examples/edit-verify.sh +0 -0
- package/examples/env-inline-secret-guard.sh +14 -2
- package/examples/env-naming-convention.sh +0 -0
- package/examples/env-prod-guard.sh +0 -0
- package/examples/env-required-check.sh +0 -0
- package/examples/env-source-guard.sh +12 -0
- package/examples/env-var-check.sh +24 -1
- package/examples/ephemeral-container-detector.sh +147 -0
- package/examples/error-memory-guard.sh +12 -0
- package/examples/evidence-claim-gate.sh +187 -0
- package/examples/exploration-budget-guard.sh +12 -0
- package/examples/expo-eject-guard.sh +13 -0
- package/examples/extended-thinking-loop-guard.sh +139 -0
- package/examples/extended-thinking-resume-warning.sh +119 -0
- package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
- package/examples/fabricated-command-detector.sh +145 -0
- package/examples/false-disk-full-guard.sh +63 -0
- package/examples/feature-deprecation-detector.sh +109 -0
- package/examples/file-change-tracker.sh +1 -1
- package/examples/file-change-undo-tracker.sh +0 -0
- package/examples/file-edit-backup.sh +63 -14
- package/examples/file-reference-check.sh +0 -0
- package/examples/file-size-limit.sh +12 -0
- package/examples/financial-operation-guard.sh +12 -0
- package/examples/firewall-guard.sh +12 -0
- package/examples/fish-shell-wrapper.sh +125 -7
- package/examples/five-hundred-milestone.sh +1 -0
- package/examples/flask-static-route-guard.sh +89 -0
- package/examples/forbidden-response-phrase-detector.sh +161 -0
- package/examples/gem-push-guard.sh +13 -0
- package/examples/gh-cli-destructive-guard.sh +13 -1
- package/examples/git-checkout-safety-guard.sh +12 -0
- package/examples/git-checkout-uncommitted-guard.sh +12 -0
- package/examples/git-config-guard.sh +12 -0
- package/examples/git-crypt-worktree-guard.sh +12 -0
- package/examples/git-filter-repo-guard.sh +56 -0
- package/examples/git-history-rewrite-guard.sh +12 -0
- package/examples/git-hook-bypass-guard.sh +0 -0
- package/examples/git-maintenance-guard.sh +83 -0
- package/examples/git-merge-conflict-prevent.sh +0 -0
- package/examples/git-message-length-check.sh +0 -0
- package/examples/git-message-length.sh +0 -0
- package/examples/git-operations-require-approval.sh +68 -14
- package/examples/git-pack-temp-cleanup-guard.sh +102 -0
- package/examples/git-push-blast-radius-guard.sh +218 -0
- package/examples/git-remote-guard.sh +24 -3
- package/examples/git-rm-orphan-wipe-guard.sh +85 -0
- package/examples/git-stash-before-checkout.sh +12 -0
- package/examples/git-stash-before-danger.sh +0 -0
- package/examples/git-submodule-guard.sh +69 -2
- package/examples/git-tag-guard.sh +12 -0
- package/examples/github-actions-secret-guard.sh +0 -0
- package/examples/gitignore-check.sh +0 -0
- package/examples/gitops-drift-guard.sh +12 -0
- package/examples/go-mod-tidy-warn.sh +1 -0
- package/examples/go-vet-after-edit.sh +12 -0
- package/examples/goal-iteration-limit-warner.sh +152 -0
- package/examples/grep-nul-false-negative-guard.sh +30 -0
- package/examples/growthbook-flag-monitor.sh +257 -0
- package/examples/hallucination-url-check.sh +1 -1
- package/examples/halt-signal-detector.sh +135 -0
- package/examples/handoff-on-clear.sh +65 -0
- package/examples/hardcoded-ip-guard.sh +1 -0
- package/examples/headless-empty-result-guard.sh +0 -0
- package/examples/headless-stop-guard.sh +0 -0
- package/examples/helm-install-guard.sh +2 -1
- package/examples/home-critical-bash-guard.sh +17 -1
- package/examples/hook-debug-wrapper.sh +6 -2
- package/examples/hook-permission-fixer.sh +0 -0
- package/examples/hook-self-disable-detector.sh +99 -0
- package/examples/hook-stdout-sanitizer.sh +6 -2
- package/examples/hook-tamper-guard.sh +12 -0
- package/examples/idle-session-cost-alert.sh +0 -0
- package/examples/image-dimension-guard.sh +109 -0
- package/examples/image-file-validator.sh +0 -0
- package/examples/iteration-quality-degradation-detector.sh +170 -0
- package/examples/java-compile-on-edit.sh +1 -1
- package/examples/json-syntax-check.sh +0 -0
- package/examples/k8s-production-guard.sh +13 -1
- package/examples/kill-process-guard.sh +12 -0
- package/examples/kubernetes-guard.sh +13 -1
- package/examples/laravel-artisan-guard.sh +13 -0
- package/examples/large-file-guard.sh +1 -1
- package/examples/log-level-guard.sh +0 -0
- package/examples/log-truncation-guard.sh +12 -0
- package/examples/long-session-malformed-tool-call-detector.sh +183 -0
- package/examples/loop-detector.sh +12 -0
- package/examples/magic-number-warn.sh +1 -0
- package/examples/main-branch-warn.sh +12 -0
- package/examples/markdown-link-check.sh +0 -0
- package/examples/max-concurrent-agents.sh +12 -0
- package/examples/max-edit-size-guard.sh +13 -0
- package/examples/max-file-count-guard.sh +0 -0
- package/examples/max-file-delete-count.sh +0 -0
- package/examples/max-function-length.sh +1 -0
- package/examples/max-import-count.sh +0 -0
- package/examples/max-subagent-count.sh +0 -0
- package/examples/mcp-config-freeze.sh +12 -0
- package/examples/mcp-config-poisoning-audit.sh +150 -0
- package/examples/mcp-data-boundary.sh +1 -1
- package/examples/mcp-misdiagnosis-arrest.sh +209 -0
- package/examples/mcp-orphan-leak-warner.sh +49 -0
- package/examples/mcp-permissions-ask-warner.sh +151 -0
- package/examples/mcp-routine-approval-detector.sh +154 -0
- package/examples/mcp-server-allowlist.sh +12 -0
- package/examples/mcp-server-guard.sh +12 -0
- package/examples/mcp-startup-bloat-detector.sh +87 -0
- package/examples/mcp-stdio-compatibility-test.sh +153 -0
- package/examples/mcp-tool-audit-log.sh +0 -0
- package/examples/mcp-tool-guard.sh +101 -1
- package/examples/mcp-warmup-wait.sh +0 -0
- package/examples/memory-chain-audit.sh +56 -0
- package/examples/memory-orphan-detector.sh +188 -0
- package/examples/memory-write-guard.sh +99 -17
- package/examples/migration-verify-guard.sh +12 -0
- package/examples/model-swap-suggester.sh +177 -0
- package/examples/model-version-alert.sh +5 -1
- package/examples/model-version-lock.sh +63 -0
- package/examples/move-delete-sequence-guard.sh +33 -2
- package/examples/multi-file-plan-routing-gate.sh +192 -0
- package/examples/multi-vendor-concurrent-warner.sh +108 -0
- package/examples/multi-window-auth-drift-detector.sh +183 -0
- package/examples/multiline-command-approver.sh +161 -23
- package/examples/nested-background-agent-guard.sh +109 -0
- package/examples/nested-spawn-inflight-guard.sh +178 -0
- package/examples/network-exfil-guard.sh +12 -0
- package/examples/network-guard.sh +12 -0
- package/examples/network-interface-guard.sh +12 -0
- package/examples/nextjs-env-guard.sh +1 -1
- package/examples/no-absolute-import.sh +0 -0
- package/examples/no-alert-confirm-prompt.sh +0 -0
- package/examples/no-anonymous-default-export.sh +0 -0
- package/examples/no-any-type.sh +0 -0
- package/examples/no-any-typescript.sh +1 -0
- package/examples/no-ask-human.sh +12 -0
- package/examples/no-assignment-in-condition.sh +0 -0
- package/examples/no-base64-exfil.sh +12 -0
- package/examples/no-callback-hell.sh +0 -0
- package/examples/no-circular-dependency.sh +0 -0
- package/examples/no-cleartext-storage.sh +0 -0
- package/examples/no-commented-code.sh +0 -0
- package/examples/no-commit-fixup.sh +0 -0
- package/examples/no-console-assert.sh +0 -0
- package/examples/no-console-error-swallow.sh +0 -0
- package/examples/no-console-in-prod.sh +0 -0
- package/examples/no-console-log-commit.sh +12 -0
- package/examples/no-console-log.sh +0 -0
- package/examples/no-console-time.sh +0 -0
- package/examples/no-cors-wildcard.sh +4 -1
- package/examples/no-curl-upload.sh +0 -0
- package/examples/no-dangerouslySetInnerHTML.sh +0 -0
- package/examples/no-dangling-await.sh +1 -0
- package/examples/no-debug-commit.sh +12 -0
- package/examples/no-debug-in-commit.sh +0 -0
- package/examples/no-deep-nesting.sh +0 -0
- package/examples/no-deep-relative-import.sh +1 -0
- package/examples/no-default-credentials.sh +0 -0
- package/examples/no-deploy-friday.sh +13 -1
- package/examples/no-disabled-test.sh +0 -0
- package/examples/no-document-write.sh +0 -0
- package/examples/no-empty-function.sh +0 -0
- package/examples/no-eval-in-template.sh +0 -0
- package/examples/no-eval-template.sh +3 -1
- package/examples/no-eval.sh +0 -0
- package/examples/no-exec-user-input.sh +0 -0
- package/examples/no-fixme-ship.sh +12 -0
- package/examples/no-floating-promises.sh +0 -0
- package/examples/no-force-flag.sh +22 -5
- package/examples/no-force-install.sh +0 -0
- package/examples/no-git-amend.sh +12 -0
- package/examples/no-git-rebase-public.sh +0 -0
- package/examples/no-global-install.sh +12 -0
- package/examples/no-global-state.sh +0 -0
- package/examples/no-hardcoded-port.sh +1 -0
- package/examples/no-hardcoded-url.sh +0 -0
- package/examples/no-helmet-missing.sh +0 -0
- package/examples/no-http-url.sh +1 -0
- package/examples/no-http-without-https.sh +0 -0
- package/examples/no-inline-style.sh +0 -0
- package/examples/no-inline-styles.sh +1 -0
- package/examples/no-innerhtml.sh +0 -0
- package/examples/no-install-global.sh +12 -0
- package/examples/no-jwt-in-url.sh +0 -0
- package/examples/no-large-commit.sh +0 -0
- package/examples/no-localhost-expose.sh +0 -0
- package/examples/no-magic-number.sh +0 -0
- package/examples/no-md5-sha1.sh +0 -0
- package/examples/no-mixed-line-endings.sh +8 -1
- package/examples/no-mutation-in-reducer.sh +0 -0
- package/examples/no-nested-ternary.sh +0 -0
- package/examples/no-network-exfil.sh +0 -0
- package/examples/no-open-redirect.sh +0 -0
- package/examples/no-output-truncation.sh +12 -0
- package/examples/no-package-downgrade.sh +0 -0
- package/examples/no-package-lock-edit.sh +12 -0
- package/examples/no-path-join-user-input.sh +0 -0
- package/examples/no-port-bind.sh +0 -0
- package/examples/no-process-exit.sh +0 -0
- package/examples/no-prototype-pollution.sh +0 -0
- package/examples/no-push-without-ci.sh +0 -0
- package/examples/no-push-without-tests.sh +12 -0
- package/examples/no-raw-password-in-url.sh +0 -0
- package/examples/no-root-user-docker.sh +1 -0
- package/examples/no-root-write.sh +12 -0
- package/examples/no-secrets-in-args.sh +4 -1
- package/examples/no-secrets-in-logs.sh +0 -0
- package/examples/no-sensitive-log.sh +0 -0
- package/examples/no-sleep-in-hooks.sh +0 -0
- package/examples/no-star-import-python.sh +1 -0
- package/examples/no-string-concat-sql.sh +0 -0
- package/examples/no-sudo-guard.sh +12 -0
- package/examples/no-sync-fs.sh +0 -0
- package/examples/no-todo-in-merge.sh +0 -0
- package/examples/no-todo-in-production.sh +1 -0
- package/examples/no-todo-without-issue.sh +0 -0
- package/examples/no-unused-import.sh +0 -0
- package/examples/no-var-keyword.sh +0 -0
- package/examples/no-verify-blocker.sh +12 -0
- package/examples/no-wget-piped-bash.sh +12 -0
- package/examples/no-wildcard-cors.sh +0 -0
- package/examples/no-wildcard-delete.sh +0 -0
- package/examples/no-wildcard-import.sh +0 -0
- package/examples/no-with-statement.sh +0 -0
- package/examples/no-write-outside-src.sh +0 -0
- package/examples/no-xml-external-entity.sh +0 -0
- package/examples/non-english-quality-warner.sh +156 -0
- package/examples/notify-waiting.sh +1 -1
- package/examples/npm-audit-warn.sh +0 -0
- package/examples/npm-global-install-guard.sh +12 -0
- package/examples/npm-publish-guard.sh +12 -0
- package/examples/npm-script-injection.sh +0 -0
- package/examples/npm-supply-chain-guard.sh +0 -0
- package/examples/nuxt-config-guard.sh +1 -0
- package/examples/oauth-refresh-monitor.sh +210 -0
- package/examples/opus-degradation-tracker.sh +187 -0
- package/examples/opus48-routine-task-warning.sh +196 -0
- package/examples/opus48-thinking-wedge-advisor.sh +143 -0
- package/examples/output-credential-scan.sh +1 -1
- package/examples/output-secret-mask.sh +31 -9
- package/examples/output-token-spike-detector.sh +145 -0
- package/examples/package-json-guard.sh +12 -0
- package/examples/package-lock-frozen.sh +12 -0
- package/examples/parallel-batch-size-limiter.sh +121 -0
- package/examples/parallel-cascade-detector.sh +116 -0
- package/examples/partial-view-claim-arrest.sh +174 -0
- package/examples/path-deny-bash-guard.sh +12 -0
- package/examples/path-traversal-guard.sh +12 -0
- package/examples/per-prompt-token-cap.sh +124 -0
- package/examples/permission-audit-log.sh +1 -1
- package/examples/permission-denial-enforcer.sh +12 -0
- package/examples/permission-entry-validator.sh +0 -0
- package/examples/persisted-1m-model-advisor.sh +88 -0
- package/examples/php-lint-on-edit.sh +1 -1
- package/examples/pii-upload-guard.sh +12 -0
- package/examples/pip-publish-guard.sh +13 -0
- package/examples/pip-requirements-guard.sh +12 -0
- package/examples/pip-venv-required.sh +12 -0
- package/examples/plan-mode-edit-guard.sh +12 -0
- package/examples/plan-mode-enforcer.sh +12 -0
- package/examples/plan-mode-strict-guard.sh +12 -0
- package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
- package/examples/plugin-process-cleanup.sh +0 -0
- package/examples/polyglot-rm-guard.sh +12 -0
- package/examples/post-compact-safety.sh +12 -0
- package/examples/post-edit-disk-verify.sh +152 -0
- package/examples/powershell-remove-item-guard.sh +85 -0
- package/examples/pr-description-check.sh +0 -0
- package/examples/pr-duplicate-guard.sh +13 -0
- package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
- package/examples/pre-compact-knowledge-save.sh +0 -0
- package/examples/pre-compact-transcript-backup.sh +0 -0
- package/examples/pre-execution-claim-detector.sh +179 -0
- package/examples/prefer-builtin-tools.sh +10 -1
- package/examples/prefer-const.sh +0 -0
- package/examples/prefer-dedicated-tools.sh +12 -0
- package/examples/prefer-optional-chaining.sh +0 -0
- package/examples/prisma-migrate-guard.sh +24 -7
- package/examples/production-port-kill-guard.sh +12 -0
- package/examples/prompt-injection-guard.sh +2 -1
- package/examples/prompt-usage-logger.sh +0 -0
- package/examples/protect-claudemd.sh +12 -0
- package/examples/protect-dotfiles.sh +12 -0
- package/examples/proxy-capture-suggester.sh +159 -0
- package/examples/public-artefact-socratic-narrowing.sh +232 -0
- package/examples/public-repo-push-guard.sh +12 -0
- package/examples/push-requires-test-pass-record.sh +0 -0
- package/examples/push-requires-test-pass.sh +12 -0
- package/examples/quota-anomaly-detector.sh +173 -0
- package/examples/quota-reset-audit.sh +58 -0
- package/examples/quoted-flag-approver.sh +99 -10
- package/examples/rails-migration-guard.sh +12 -0
- package/examples/rate-limit-guard.sh +0 -0
- package/examples/read-all-files-enforcer.sh +0 -0
- package/examples/read-budget-guard.sh +12 -0
- package/examples/read-loop-detector.sh +59 -0
- package/examples/read-once-guard.sh +96 -0
- package/examples/read-only-mode.sh +12 -0
- package/examples/readme-exists-check.sh +0 -0
- package/examples/record-read-coverage.sh +73 -0
- package/examples/redirect-fragment-warner.sh +149 -0
- package/examples/redis-flushall-guard.sh +13 -0
- package/examples/redundant-read-blocker.sh +132 -0
- package/examples/refusal-arrest-gate.sh +248 -0
- package/examples/registry-publish-guard.sh +13 -1
- package/examples/remote-control-billing-classifier.sh +135 -0
- package/examples/replace-all-guard.sh +12 -0
- package/examples/repo-visibility-guard.sh +12 -0
- package/examples/reroute-after-block-guard.sh +150 -0
- package/examples/response-budget-guard.sh +0 -0
- package/examples/resume-drift-watcher.sh +57 -0
- package/examples/rg-replace-flag-detector.sh +125 -0
- package/examples/rhetorical-verification-prompt-detector.sh +102 -0
- package/examples/ripgrep-permission-fix.sh +0 -0
- package/examples/rm-safety-net.sh +151 -8
- package/examples/role-tool-guard.sh +12 -0
- package/examples/route-handler-emptiness-gate.sh +324 -0
- package/examples/ruby-lint-on-edit.sh +1 -1
- package/examples/runtime-binary-change-detector.sh +102 -0
- package/examples/same-command-repeat-detector.sh +196 -0
- package/examples/same-correction-arrest.sh +169 -0
- package/examples/sandbox-denywrite-enforcer.sh +78 -0
- package/examples/sandbox-relative-path-audit.sh +83 -25
- package/examples/sandbox-write-verify.sh +12 -0
- package/examples/schema-migration-guard.sh +0 -0
- package/examples/scope-expansion-receipt.sh +178 -0
- package/examples/scope-guard.sh +88 -9
- package/examples/secret-file-read-guard.sh +12 -0
- package/examples/secret-file-write-guard.sh +150 -0
- package/examples/self-modify-bypass-guard.sh +0 -0
- package/examples/sensitive-file-read-guard.sh +23 -3
- package/examples/sensitive-log-guard.sh +1 -0
- package/examples/server-side-prompt-injection-detector.sh +69 -0
- package/examples/session-agent-cost-limiter.sh +12 -0
- package/examples/session-backup-on-start.sh +1 -1
- package/examples/session-cost-alert.sh +12 -0
- package/examples/session-drift-guard.sh +12 -0
- package/examples/session-duration-guard.sh +25 -2
- package/examples/session-end-logger.sh +0 -0
- package/examples/session-health-monitor.sh +0 -0
- package/examples/session-index-repair.sh +1 -1
- package/examples/session-memory-watchdog.sh +1 -0
- package/examples/session-permission-reset-guard.sh +12 -0
- package/examples/session-persistence-verifier.sh +93 -0
- package/examples/session-plugin-pin-watch.sh +68 -0
- package/examples/session-rate-monitor.sh +176 -0
- package/examples/session-resume-env-fix.sh +0 -0
- package/examples/session-start-quota-status.sh +193 -0
- package/examples/session-start-safety-check.sh +55 -3
- package/examples/session-state-saver.sh +0 -0
- package/examples/session-summary-stop.sh +1 -1
- package/examples/session-summary.sh +0 -0
- package/examples/session-token-counter.sh +1 -1
- package/examples/settings-hooks-key-restorer.sh +99 -0
- package/examples/settings-json-health-check.sh +57 -0
- package/examples/settings-json-model-guard.sh +0 -0
- package/examples/settings-regression-tester.sh +188 -0
- package/examples/shell-config-truncation-guard.sh +12 -0
- package/examples/shell-wrapper-guard.sh +12 -0
- package/examples/skill-cumulative-size-detector.sh +104 -0
- package/examples/skill-description-drop-detector.sh +148 -0
- package/examples/skill-gate.sh +0 -0
- package/examples/skill-truncation-detector.sh +154 -0
- package/examples/skills-context-recorder.sh +167 -0
- package/examples/skills-load-verifier.sh +96 -0
- package/examples/skills-settings-validator.sh +139 -0
- package/examples/sonnet-45-deprecation-helper.sh +85 -0
- package/examples/spec-file-scope-guard.sh +12 -0
- package/examples/spring-profile-guard.sh +1 -0
- package/examples/spurious-malformed-notice-detector.sh +247 -0
- package/examples/sql-bulk-delete-warn.sh +88 -0
- package/examples/sql-injection-detect.sh +0 -0
- package/examples/ssh-key-protect.sh +12 -0
- package/examples/staged-secret-scan.sh +22 -1
- package/examples/stale-temp-settings-detector.sh +86 -0
- package/examples/standing-rule-session-surfacer.sh +137 -0
- package/examples/stop-hook-sigterm-wrapper.sh +182 -0
- package/examples/stop-transcript-write-health.sh +64 -0
- package/examples/strict-allowlist.sh +57 -15
- package/examples/strip-coauthored-by.sh +50 -10
- package/examples/subagent-blast-radius-guard.sh +184 -0
- package/examples/subagent-boundary-precheck.sh +126 -0
- package/examples/subagent-budget-guard.sh +12 -0
- package/examples/subagent-claudemd-inject.sh +0 -0
- package/examples/subagent-closure-verify-gate.sh +164 -0
- package/examples/subagent-destructive-git-guard.sh +120 -0
- package/examples/subagent-error-detector.sh +0 -0
- package/examples/subagent-forged-system-reminder-guard.sh +156 -0
- package/examples/subagent-identity-leak-guard.sh +102 -0
- package/examples/subagent-identity-reassertion.sh +51 -0
- package/examples/subagent-inheritance-tester.sh +179 -0
- package/examples/subagent-permission-mode-guard.sh +110 -0
- package/examples/subagent-scope-guard.sh +12 -0
- package/examples/subagent-spawn-verification-enforcer.sh +102 -0
- package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
- package/examples/subagent-tool-call-limiter.sh +87 -15
- package/examples/subcommand-chain-guard.sh +12 -0
- package/examples/subscription-api-billing-warner.sh +160 -0
- package/examples/subscription-bypass-detector.sh +152 -0
- package/examples/svelte-lint-on-edit.sh +1 -0
- package/examples/swift-build-on-edit.sh +1 -1
- package/examples/symlink-guard.sh +27 -2
- package/examples/symlink-protect.sh +1 -0
- package/examples/system-dir-protection-guard.sh +73 -8
- package/examples/system-message-workaround.sh +38 -13
- package/examples/system-package-guard.sh +12 -0
- package/examples/systemd-service-guard.sh +12 -0
- package/examples/task-integrity-guard.sh +12 -0
- package/examples/temp-file-cleanup.sh +1 -1
- package/examples/temporal-suggestion-detector.sh +135 -0
- package/examples/terraform-guard.sh +27 -6
- package/examples/test-after-edit.sh +1 -1
- package/examples/test-before-push.sh +12 -0
- package/examples/test-coverage-reminder.sh +24 -1
- package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
- package/examples/timezone-guard.sh +0 -0
- package/examples/tmp-output-size-guard.sh +0 -0
- package/examples/todo-check.sh +1 -1
- package/examples/token-budget-guard.sh +12 -0
- package/examples/token-budget-per-task.sh +12 -0
- package/examples/token-usage-tracker.sh +7 -1
- package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
- package/examples/tokenizer-ratio-alert.sh +104 -0
- package/examples/tool-call-rate-limiter.sh +0 -0
- package/examples/tool-result-correlation-checker.sh +167 -0
- package/examples/tool-result-size-guard.sh +132 -0
- package/examples/tool-retry-budget-guard.sh +12 -0
- package/examples/transcript-contamination-detector.sh +138 -0
- package/examples/trustfall-mcp-injection-guard.sh +103 -0
- package/examples/ultrareview-large-diff-advisor.sh +184 -0
- package/examples/unbounded-output-guard.sh +94 -0
- package/examples/uncommitted-changes-stop.sh +1 -0
- package/examples/uncommitted-discard-guard.sh +23 -5
- package/examples/uncommitted-work-guard.sh +12 -0
- package/examples/usage-warn.sh +0 -0
- package/examples/user-account-guard.sh +12 -0
- package/examples/userprompt-submit-receipt.sh +123 -0
- package/examples/variable-expansion-guard.sh +12 -0
- package/examples/verify-after-publish-reminder.sh +93 -0
- package/examples/verify-before-commit.sh +12 -0
- package/examples/version-bump-detector.sh +156 -0
- package/examples/version-regression-warner.sh +144 -0
- package/examples/vue-lint-on-edit.sh +1 -0
- package/examples/warn-cron-cost-trap.sh +173 -0
- package/examples/webfetch-runaway-guard.sh +89 -0
- package/examples/wellness-break-reminder.sh +118 -0
- package/examples/windows-destructive-command-guard.sh +177 -0
- package/examples/windows-path-guard.sh +12 -0
- package/examples/windows-python-stub-detector.sh +63 -0
- package/examples/work-hours-guard.sh +12 -0
- package/examples/working-directory-fence.sh +12 -0
- package/examples/workspace-lease-guard.sh +205 -0
- package/examples/worktree-create-log.sh +1 -0
- package/examples/worktree-delete-guard.sh +12 -0
- package/examples/worktree-edit-boundary-guard.sh +127 -0
- package/examples/worktree-escape-write-guard.sh +114 -0
- package/examples/worktree-hook-linker.sh +0 -0
- package/examples/worktree-hooks-path-fix.sh +111 -0
- package/examples/worktree-parent-write-guard.sh +43 -0
- package/examples/worktree-project-unify.sh +2 -1
- package/examples/worktree-remove-uncommitted-guard.sh +13 -0
- package/examples/worktree-unmerged-guard.sh +7 -1
- package/examples/write-byte-integrity-verifier.sh +190 -0
- package/examples/write-empty-content-guard.sh +67 -0
- package/examples/write-nul-corruption-detector.sh +61 -0
- package/examples/write-overwrite-confirm.sh +160 -14
- package/examples/write-secret-guard.sh +27 -5
- package/examples/write-shrink-guard.sh +12 -0
- package/examples/write-test-ratio.sh +0 -0
- package/examples/wsl-host-disk-space-guard.sh +97 -0
- package/examples/xml-format-leak-detector.sh +266 -0
- package/examples/yaml-syntax-check.sh +12 -0
- package/hooks/hooks.json +6 -6
- package/index.mjs +1699 -183
- package/mission.md +2 -0
- package/package.json +4 -4
- package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
- package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
- package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
- package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
- package/scripts/agents-md-sync-setup.sh +156 -0
- package/scripts/autonomy-blocked-summary.sh +148 -0
- package/scripts/build-search-index.py +43 -0
- package/scripts/build-sitemap.py +119 -0
- package/scripts/cc-doctor.sh +192 -0
- package/scripts/check-hook-event-names.py +127 -0
- package/scripts/check-misfire-instrument.sh +64 -0
- package/scripts/claim-verify-audit.sh +467 -0
- package/scripts/cowork-claudemd-helper.sh +136 -0
- package/scripts/june-15-deprecated-model-scan.sh +111 -0
- package/scripts/measure-heredoc-shapes.sh +67 -0
- package/scripts/measure-literal-match-misfire.sh +110 -0
- package/scripts/probe-scope-guard-branches.sh +48 -0
- package/scripts/probe-skip-line-both-ways.sh +65 -0
- package/scripts/receipts-aggregate.py +199 -0
- package/scripts/session-forensic-audit.py +360 -0
- package/scripts.json +9 -9
- package/scripts.json.bak-2026-07-27-find +13 -0
- package/skills/safety-setup/SKILL.md +5 -5
- package/tests/approve-side-remaining-two.test.sh +129 -0
- package/tests/approver-list-granularity.test.sh +145 -0
- package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
- package/tests/audit-ci-gate.test.sh +87 -0
- package/tests/audit-cross-layer-claudemd.test.sh +170 -0
- package/tests/audit-fail-open-parse.test.sh +100 -0
- package/tests/auto-approve-compound-tail.test.sh +194 -0
- package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
- package/tests/auto-mode-quoted-targets.test.sh +127 -0
- package/tests/auto-mode-unquoted-targets.test.sh +112 -0
- package/tests/bash-secret-output-detector-detects.test.sh +102 -0
- package/tests/blindspots-cross-layer.test.sh +177 -0
- package/tests/block-database-wipe.test.sh +64 -0
- package/tests/bundled-short-flags-bypass.test.sh +85 -0
- package/tests/cd-git-allow-compound-tail.test.sh +67 -0
- package/tests/chown-guard-filesystem-root.test.sh +64 -0
- package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
- package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
- package/tests/core-scripts-parser-fallback.test.sh +140 -0
- package/tests/destructive-guard-bare-glob.test.sh +74 -0
- package/tests/destructive-guard-every-operand.test.sh +100 -0
- package/tests/destructive-guard-find-deletion.test.sh +114 -0
- package/tests/destructive-guard-flag-order.test.sh +106 -0
- package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
- package/tests/destructive-guard-quoted-target.test.sh +89 -0
- package/tests/destructive-guard-separators.test.sh +105 -0
- package/tests/destructive-guard-variable-target.test.sh +98 -0
- package/tests/destructive-guard-wrapped-command.test.sh +91 -0
- package/tests/doctor-hook-disabling-env.test.sh +92 -0
- package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
- package/tests/example-guards-wrapped-command.test.sh +169 -0
- package/tests/file-edit-backup.test.sh +93 -0
- package/tests/git-filter-repo-guard.test.sh +60 -0
- package/tests/git-global-options-bypass.test.sh +141 -0
- package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
- package/tests/git-maintenance-guard.test.sh +83 -0
- package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
- package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
- package/tests/git-submodule-guard.test.sh +50 -0
- package/tests/grep-pcre-portability.test.sh +155 -0
- package/tests/hook-registration-matches-input.test.sh +73 -0
- package/tests/hook-trigger-matches-envelope.test.sh +178 -0
- package/tests/install-does-not-claim-protection.test.sh +110 -0
- package/tests/install-example-standalone-tools.test.sh +139 -0
- package/tests/line-continuation-bypass.test.sh +114 -0
- package/tests/mcp-config-poisoning-audit.test.sh +106 -0
- package/tests/nested-background-agent-guard.test.sh +58 -0
- package/tests/no-unqualified-safety-claims.test.sh +114 -0
- package/tests/option-eating-grep-patterns.test.sh +130 -0
- package/tests/outdated-core-guards.test.sh +134 -0
- package/tests/outdated-report.test.sh +155 -0
- package/tests/output-secret-mask-warns.test.sh +73 -0
- package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
- package/tests/plugins-word-order.test.sh +126 -0
- package/tests/powershell-remove-item-guard.test.sh +85 -0
- package/tests/project-dir-naming.test.sh +103 -0
- package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
- package/tests/reroute-after-block-guard.test.sh +104 -0
- package/tests/secret-guard-documented-promises.test.sh +97 -0
- package/tests/session-plugin-pin-watch.test.sh +45 -0
- package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
- package/tests/shield-no-silent-adoption.test.py +110 -0
- package/tests/shield-no-silent-adoption.test.sh +46 -0
- package/tests/stop-transcript-write-health.test.sh +46 -0
- package/tests/system-dir-guard-root-erased.test.sh +66 -0
- package/tests/test-account-billing-log.sh +100 -0
- package/tests/test-account-routing-preflight.sh +77 -0
- package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
- package/tests/test-agent-view-quota-warn.sh +184 -0
- package/tests/test-agents-md-edit-drift-warner.sh +176 -0
- package/tests/test-agents-md-loader.sh +204 -0
- package/tests/test-agents-md-sync-checker.sh +125 -0
- package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
- package/tests/test-allowlist.sh +60 -0
- package/tests/test-always-allow-pattern-suggester.sh +147 -0
- package/tests/test-anthropic-base-url-guard.sh +88 -0
- package/tests/test-articulated-scope-capture.sh +139 -0
- package/tests/test-attachment-traversal-guard.sh +168 -0
- package/tests/test-aup-block-pattern-logger.sh +315 -0
- package/tests/test-aup-false-positive-helper.sh +188 -0
- package/tests/test-aup-large-tool-output-warner.sh +370 -0
- package/tests/test-aup-retry-loop-guard.sh +341 -0
- package/tests/test-auth-expiry-reminder.sh +303 -0
- package/tests/test-auth-macos-sleep-detector.sh +254 -0
- package/tests/test-auth-path-detector.sh +232 -0
- package/tests/test-auth-status-checker.sh +233 -0
- package/tests/test-authorized-reconfirmation-detector.sh +280 -0
- package/tests/test-background-cost-launch-guard.sh +62 -0
- package/tests/test-bash-allowlist-secondary-check.sh +143 -0
- package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
- package/tests/test-bash-project-fence.sh +127 -0
- package/tests/test-bg-permission-prompt-warner.sh +221 -0
- package/tests/test-binary-read-detector.sh +173 -0
- package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
- package/tests/test-bulk-delete-target-resolution.sh +49 -0
- package/tests/test-bypass-mode-effective-verifier.sh +179 -0
- package/tests/test-cache-creation-drift-detector.sh +244 -0
- package/tests/test-cache-residue-detector.sh +429 -0
- package/tests/test-cache-tier-logger.sh +59 -0
- package/tests/test-cache-ttl-eviction-detector.sh +282 -0
- package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
- package/tests/test-claim-verify-detector.sh +222 -0
- package/tests/test-claim-vs-caveat-checker.sh +134 -0
- package/tests/test-claude-code-version-pin-advisor.sh +353 -0
- package/tests/test-claude-md-reinjector.sh +173 -0
- package/tests/test-claude-md-size-monitor.sh +107 -0
- package/tests/test-claude-update-budget-guard.sh +132 -0
- package/tests/test-claude-update-smart.sh +91 -0
- package/tests/test-claudemd-tool-prohibition.sh +239 -0
- package/tests/test-cli-config-pinning-detector.sh +233 -0
- package/tests/test-cliff-countdown-advisor.sh +138 -0
- package/tests/test-closure-word-verify-gate.sh +158 -0
- package/tests/test-commit-all-scope-guard.sh +73 -0
- package/tests/test-commitment-carry-forward-arrest.sh +250 -0
- package/tests/test-compact-dispatch-watchdog.sh +147 -0
- package/tests/test-completion-claim-without-verification-detector.sh +326 -0
- package/tests/test-compound-bash-permission-resolver.sh +264 -0
- package/tests/test-compound-command-deny-enforcer.sh +67 -0
- package/tests/test-context-length-budget.sh +68 -0
- package/tests/test-context-usage-drift-alert.sh +52 -22
- package/tests/test-cost-incident-self-audit.sh +94 -0
- package/tests/test-cowork-claude-md-load-checker.sh +257 -0
- package/tests/test-cowork-claudemd-helper.sh +141 -0
- package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
- package/tests/test-cowork-hook-absence-warner.sh +230 -0
- package/tests/test-cowork-model-picker-advisor.sh +317 -0
- package/tests/test-credential-exfil-guard.sh +62 -0
- package/tests/test-cron-create-receipt.sh +165 -0
- package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
- package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
- package/tests/test-daily-cost-guard.sh +131 -0
- package/tests/test-deny-rule-integrity-verifier.sh +288 -0
- package/tests/test-deployment-readback-gate.sh +92 -0
- package/tests/test-deployment-readback-gh-adapter.sh +163 -0
- package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
- package/tests/test-dispatch-allowlist-preflight.sh +385 -0
- package/tests/test-dispatch-liveness-watchdog.sh +319 -0
- package/tests/test-dispatch-receipt.sh +314 -0
- package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
- package/tests/test-echo-probe-spam-detector.sh +143 -0
- package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
- package/tests/test-ephemeral-container-detector.sh +251 -0
- package/tests/test-evidence-claim-gate.sh +291 -0
- package/tests/test-extended-thinking-loop-guard.sh +289 -0
- package/tests/test-extended-thinking-resume-warning.sh +240 -0
- package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
- package/tests/test-fabricated-command-detector.sh +296 -0
- package/tests/test-false-disk-full-guard.sh +36 -0
- package/tests/test-feature-deprecation-detector.sh +117 -0
- package/tests/test-forbidden-response-phrase-detector.sh +246 -0
- package/tests/test-git-operations-require-approval.sh +53 -0
- package/tests/test-git-push-blast-radius-guard.sh +115 -0
- package/tests/test-goal-iteration-limit-warner.sh +128 -0
- package/tests/test-growthbook-flag-monitor.sh +428 -0
- package/tests/test-halt-signal-detector.sh +120 -0
- package/tests/test-hook-self-disable-detector.sh +232 -0
- package/tests/test-iteration-quality-degradation-detector.sh +244 -0
- package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
- package/tests/test-marketplace-plugins.sh +193 -0
- package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
- package/tests/test-mcp-orphan-leak-warner.sh +71 -0
- package/tests/test-mcp-permissions-ask-warner.sh +207 -0
- package/tests/test-mcp-routine-approval-detector.sh +229 -0
- package/tests/test-mcp-startup-bloat-detector.sh +141 -0
- package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
- package/tests/test-memory-chain-audit.sh +59 -0
- package/tests/test-memory-orphan-detector.sh +227 -0
- package/tests/test-model-swap-suggester.sh +368 -0
- package/tests/test-model-version-lock.sh +83 -0
- package/tests/test-multi-file-plan-routing-gate.sh +277 -0
- package/tests/test-multi-window-auth-drift-detector.sh +262 -0
- package/tests/test-nested-spawn-inflight-guard.sh +281 -0
- package/tests/test-no-force-flag.sh +49 -0
- package/tests/test-non-english-quality-warner.sh +229 -0
- package/tests/test-oauth-refresh-monitor.sh +311 -0
- package/tests/test-opus-degradation-tracker.sh +274 -0
- package/tests/test-opus48-routine-task-warning.sh +201 -0
- package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
- package/tests/test-output-token-spike-detector.sh +315 -0
- package/tests/test-parallel-batch-size-limiter.sh +228 -0
- package/tests/test-parallel-cascade-detector.sh +191 -0
- package/tests/test-partial-view-claim-arrest.sh +272 -0
- package/tests/test-per-prompt-token-cap.sh +136 -0
- package/tests/test-persisted-1m-model-advisor.sh +71 -0
- package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
- package/tests/test-post-edit-disk-verify.sh +294 -0
- package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
- package/tests/test-pre-execution-claim-detector.sh +366 -0
- package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
- package/tests/test-proxy-capture-suggester.sh +214 -0
- package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
- package/tests/test-quota-anomaly-detector.sh +321 -0
- package/tests/test-quota-reset-audit.sh +81 -0
- package/tests/test-read-loop-detector.sh +137 -0
- package/tests/test-read-once-guard.sh +85 -0
- package/tests/test-receipts-aggregate.sh +143 -0
- package/tests/test-redirect-fragment-warner.sh +130 -0
- package/tests/test-redundant-read-blocker.sh +155 -0
- package/tests/test-refusal-arrest-gate.sh +303 -0
- package/tests/test-remote-control-billing-classifier.sh +125 -0
- package/tests/test-resume-drift-watcher.sh +65 -0
- package/tests/test-rg-replace-flag-detector.sh +175 -0
- package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
- package/tests/test-rm-safety-net.sh +115 -0
- package/tests/test-route-handler-emptiness-gate.sh +300 -0
- package/tests/test-runtime-binary-change-detector.sh +196 -0
- package/tests/test-same-command-repeat-detector.sh +165 -0
- package/tests/test-same-correction-arrest.sh +165 -0
- package/tests/test-scope-expansion-receipt.sh +207 -0
- package/tests/test-server-side-prompt-injection-detector.sh +181 -0
- package/tests/test-session-persistence-verifier.sh +128 -0
- package/tests/test-session-rate-monitor.sh +284 -0
- package/tests/test-session-start-quota-status.sh +210 -0
- package/tests/test-session-start-safety-check.sh +138 -0
- package/tests/test-settings-hooks-key-restorer.sh +257 -0
- package/tests/test-settings-json-health-check.sh +70 -0
- package/tests/test-settings-regression-tester.sh +197 -0
- package/tests/test-skill-cumulative-size-detector.sh +198 -0
- package/tests/test-skill-description-drop-detector.sh +236 -0
- package/tests/test-skill-truncation-detector.sh +263 -0
- package/tests/test-skills-context-recorder.sh +329 -0
- package/tests/test-skills-load-verifier.sh +184 -0
- package/tests/test-skills-settings-validator.sh +242 -0
- package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
- package/tests/test-spurious-malformed-notice-detector.sh +290 -0
- package/tests/test-sql-bulk-delete-warn.sh +123 -0
- package/tests/test-ssh-key-protect.sh +81 -0
- package/tests/test-stale-temp-settings-detector.sh +161 -0
- package/tests/test-standing-rule-session-surfacer.sh +215 -0
- package/tests/test-starter-hooks-manifest.sh +96 -0
- package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
- package/tests/test-strict-allowlist.sh +72 -0
- package/tests/test-subagent-boundary-precheck.sh +137 -0
- package/tests/test-subagent-closure-verify-gate.sh +193 -0
- package/tests/test-subagent-destructive-git-guard.sh +86 -0
- package/tests/test-subagent-identity-leak-guard.sh +62 -0
- package/tests/test-subagent-identity-reassertion.sh +61 -0
- package/tests/test-subagent-inheritance-tester.sh +319 -0
- package/tests/test-subagent-permission-mode-guard.sh +61 -0
- package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
- package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
- package/tests/test-subagent-tool-call-limiter.sh +97 -0
- package/tests/test-subscription-api-billing-warner.sh +138 -0
- package/tests/test-subscription-bypass-detector.sh +255 -0
- package/tests/test-temporal-suggestion-detector.sh +183 -0
- package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
- package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
- package/tests/test-tokenizer-ratio-alert.sh +93 -0
- package/tests/test-tool-result-correlation-checker.sh +264 -0
- package/tests/test-tool-result-size-guard.sh +121 -0
- package/tests/test-transcript-contamination-detector.sh +264 -0
- package/tests/test-trigger-header-parsing.sh +151 -0
- package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
- package/tests/test-userprompt-submit-receipt.sh +181 -0
- package/tests/test-verify-after-publish-reminder.sh +184 -0
- package/tests/test-version-bump-detector.sh +212 -0
- package/tests/test-version-regression-warner.sh +165 -0
- package/tests/test-warn-cron-cost-trap.sh +82 -0
- package/tests/test-webfetch-runaway-guard.sh +77 -0
- package/tests/test-wellness-break-reminder.sh +138 -0
- package/tests/test-windows-destructive-command-guard.sh +169 -0
- package/tests/test-windows-python-stub-detector.sh +146 -0
- package/tests/test-worktree-edit-boundary-guard.sh +219 -0
- package/tests/test-write-byte-integrity-verifier.sh +192 -0
- package/tests/test-xml-format-leak-detector.sh +299 -0
- package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
- package/tests/workspace-lease-guard.test.sh +144 -0
- package/tests/worktree-escape-write-guard.test.sh +68 -0
- package/tests/worktree-hooks-path-fix.test.sh +181 -0
- package/tests/worktree-parent-write-guard.test.sh +51 -0
- package/tests/write-empty-content-guard.test.sh +39 -0
- package/tests/write-nul-corruption-detector.test.sh +29 -0
- package/tests/write-overwrite-unread-content.test.sh +178 -0
- package/tests/wsl-host-disk-space-guard.test.sh +55 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# oauth-refresh-monitor.sh — Detect OAuth refresh corruption patterns in tool output
|
|
3
|
+
# and warn before the operator hits the persistent 401 loop (Cluster 19 candidate, axis 19A)
|
|
4
|
+
#
|
|
5
|
+
# Background:
|
|
6
|
+
# Cluster 19 candidate axis 19A documents OAuth refresh failure paths where a
|
|
7
|
+
# transient upstream error during a refresh operation corrupts the credentials
|
|
8
|
+
# state into a persistent broken loop. The specific anchor case:
|
|
9
|
+
#
|
|
10
|
+
# #61912 (2026-05-23) — OAuth refresh corrupts credentials state during
|
|
11
|
+
# transient upstream 5xx → persistent 401 loop. A single transient error
|
|
12
|
+
# during refresh creates a permanent broken state.
|
|
13
|
+
#
|
|
14
|
+
# The pattern is structurally distinct from straightforward 401 expiry: the
|
|
15
|
+
# operator's credential state was valid just before the refresh, the upstream
|
|
16
|
+
# returned 5xx on the refresh request, and now subsequent requests return 401
|
|
17
|
+
# even though the user did not log out and the original session was not
|
|
18
|
+
# expired. The recovery requires a full re-auth, not just a retry.
|
|
19
|
+
#
|
|
20
|
+
# Adjacent cases in axis 19A:
|
|
21
|
+
# #59460 — MCP OAuth re-runs DCR on every authenticate, orphaning prior tokens
|
|
22
|
+
# #59725 — Slack MCP OAuth stores empty accessToken after flow completion
|
|
23
|
+
# #60260 — MCP OAuth completes but token is not honored
|
|
24
|
+
# #61139 — Shopify MCP token-expired loop after multi-shop switch
|
|
25
|
+
#
|
|
26
|
+
# All share the structural shape: an OAuth flow surface reports success and a
|
|
27
|
+
# downstream call fails with 401 / "Needs authentication" / similar. The
|
|
28
|
+
# common detection signal is the appearance of one of these strings in tool
|
|
29
|
+
# output AFTER a successful login or refresh signal.
|
|
30
|
+
#
|
|
31
|
+
# Reference:
|
|
32
|
+
# https://gist.github.com/yurukusa/58cb17bfda4d5ab31bd804809809d22f (field guide)
|
|
33
|
+
#
|
|
34
|
+
# What this hook does:
|
|
35
|
+
# On PostToolUse, scans tool output for OAuth-refresh-corruption signatures.
|
|
36
|
+
# When a signature is detected, emits a one-shot per-session stderr advisory
|
|
37
|
+
# recommending the recovery path (full re-auth, not a retry) and the
|
|
38
|
+
# verification steps from the auth-status-checker companion hook.
|
|
39
|
+
#
|
|
40
|
+
# Detection signatures (case-insensitive):
|
|
41
|
+
# - "needs authentication"
|
|
42
|
+
# - "401 unauthorized" + "refresh" within the same tool output
|
|
43
|
+
# - "oauth" + "expired" within the same tool output
|
|
44
|
+
# - "refresh token rejected"
|
|
45
|
+
# - "401" + "token" within the same tool output (broad fallback)
|
|
46
|
+
#
|
|
47
|
+
# When this hook does NOT emit anything:
|
|
48
|
+
# - CC_OAUTH_REFRESH_MONITOR_DISABLE=1
|
|
49
|
+
# - CC_OAUTH_REFRESH_MONITOR_QUIET=1
|
|
50
|
+
# - tool output does not contain any of the detection signatures
|
|
51
|
+
# - the same signature already fired the advisory in this session
|
|
52
|
+
#
|
|
53
|
+
# Hook config (settings.json):
|
|
54
|
+
# {
|
|
55
|
+
# "hooks": {
|
|
56
|
+
# "PostToolUse": [{
|
|
57
|
+
# "matcher": "",
|
|
58
|
+
# "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/oauth-refresh-monitor.sh" }]
|
|
59
|
+
# }]
|
|
60
|
+
# }
|
|
61
|
+
# }
|
|
62
|
+
#
|
|
63
|
+
# Env vars:
|
|
64
|
+
# CC_OAUTH_REFRESH_MONITOR_DISABLE=1 — never emit
|
|
65
|
+
# CC_OAUTH_REFRESH_MONITOR_QUIET=1 — silent
|
|
66
|
+
# CC_OAUTH_REFRESH_MONITOR_STATE_DIR=<p> — one-shot state dir
|
|
67
|
+
# CC_OAUTH_REFRESH_MONITOR_SESSION_ID=<id> — session id override (tests)
|
|
68
|
+
#
|
|
69
|
+
# Design notes:
|
|
70
|
+
# - Opt-out, not opt-in. Unlike the other Cluster 19 hooks (auth-status-checker,
|
|
71
|
+
# auth-expiry-reminder) which need explicit REMIND=1 to fire, this hook
|
|
72
|
+
# fires automatically when the signature appears. The reasoning: the
|
|
73
|
+
# signature is specific enough that a false positive is unlikely, and the
|
|
74
|
+
# cost of missing the advisory (an operator entering the persistent 401 loop
|
|
75
|
+
# without knowing) exceeds the cost of an occasional spurious advisory.
|
|
76
|
+
# - One-shot per session. The advisory fires once per session per signature.
|
|
77
|
+
# Repeating the same advisory N times in a session would itself become
|
|
78
|
+
# noise.
|
|
79
|
+
# - Never blocks. Exit always 0. The corruption pattern is server-side; a
|
|
80
|
+
# blocking hook would only add operator pain without preventing the
|
|
81
|
+
# corruption.
|
|
82
|
+
#
|
|
83
|
+
# The registration was missing from this header. The installer reads TRIGGER
|
|
84
|
+
# and MATCHER from here and falls back to PreToolUse / Bash when both are
|
|
85
|
+
# absent, so this hook was being registered at a moment where the field it
|
|
86
|
+
# reads is always empty: it installed, it appeared in the settings, and it
|
|
87
|
+
# did nothing. Measured 2026-08-04 across examples/: 14 files were like this.
|
|
88
|
+
# TRIGGER: PostToolUse
|
|
89
|
+
# MATCHER: ""
|
|
90
|
+
|
|
91
|
+
set -u
|
|
92
|
+
|
|
93
|
+
# Disable path
|
|
94
|
+
if [ "${CC_OAUTH_REFRESH_MONITOR_DISABLE:-0}" = "1" ]; then
|
|
95
|
+
exit 0
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# Quiet path
|
|
99
|
+
if [ "${CC_OAUTH_REFRESH_MONITOR_QUIET:-0}" = "1" ]; then
|
|
100
|
+
exit 0
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# Read PostToolUse payload from stdin
|
|
104
|
+
INPUT=$(cat 2>/dev/null) || exit 0
|
|
105
|
+
[ -n "$INPUT" ] || exit 0
|
|
106
|
+
|
|
107
|
+
# Extract tool output. Try jq first; fall back to a permissive grep.
|
|
108
|
+
TOOL_OUTPUT=""
|
|
109
|
+
if command -v jq >/dev/null 2>&1; then
|
|
110
|
+
TOOL_OUTPUT=$(printf '%s' "$INPUT" | jq -r '
|
|
111
|
+
.tool_response.output //
|
|
112
|
+
.tool_response //
|
|
113
|
+
.output //
|
|
114
|
+
empty
|
|
115
|
+
' 2>/dev/null)
|
|
116
|
+
fi
|
|
117
|
+
if [ -z "$TOOL_OUTPUT" ]; then
|
|
118
|
+
TOOL_OUTPUT="$INPUT"
|
|
119
|
+
fi
|
|
120
|
+
[ -n "$TOOL_OUTPUT" ] || exit 0
|
|
121
|
+
|
|
122
|
+
# Lowercase for matching
|
|
123
|
+
LOWER=$(printf '%s' "$TOOL_OUTPUT" | tr '[:upper:]' '[:lower:]')
|
|
124
|
+
|
|
125
|
+
# Detect signatures
|
|
126
|
+
SIGNATURE=""
|
|
127
|
+
if printf '%s' "$LOWER" | grep -q "needs authentication"; then
|
|
128
|
+
SIGNATURE="needs-authentication"
|
|
129
|
+
elif printf '%s' "$LOWER" | grep -q "refresh token rejected"; then
|
|
130
|
+
SIGNATURE="refresh-token-rejected"
|
|
131
|
+
elif printf '%s' "$LOWER" | grep -q "401" && printf '%s' "$LOWER" | grep -q "refresh"; then
|
|
132
|
+
SIGNATURE="401-after-refresh"
|
|
133
|
+
elif printf '%s' "$LOWER" | grep -q "oauth" && printf '%s' "$LOWER" | grep -q "expired"; then
|
|
134
|
+
SIGNATURE="oauth-expired"
|
|
135
|
+
elif printf '%s' "$LOWER" | grep -q "401" && printf '%s' "$LOWER" | grep -q "token"; then
|
|
136
|
+
SIGNATURE="401-token"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
# No signature → silent
|
|
140
|
+
[ -n "$SIGNATURE" ] || exit 0
|
|
141
|
+
|
|
142
|
+
# One-shot per session per signature
|
|
143
|
+
STATE_DIR="${CC_OAUTH_REFRESH_MONITOR_STATE_DIR:-$HOME/.claude}"
|
|
144
|
+
mkdir -p "$STATE_DIR" 2>/dev/null || exit 0
|
|
145
|
+
STATE_FILE="$STATE_DIR/oauth-refresh-monitor.fired"
|
|
146
|
+
|
|
147
|
+
SESSION_ID="${CC_OAUTH_REFRESH_MONITOR_SESSION_ID:-}"
|
|
148
|
+
if [ -z "$SESSION_ID" ]; then
|
|
149
|
+
SESSION_ID="${CLAUDECODE_SESSION_ID:-}"
|
|
150
|
+
fi
|
|
151
|
+
if [ -z "$SESSION_ID" ] && command -v tty >/dev/null 2>&1; then
|
|
152
|
+
TTY_PATH=$(tty 2>/dev/null)
|
|
153
|
+
if [ -n "$TTY_PATH" ] && [ "$TTY_PATH" != "not a tty" ]; then
|
|
154
|
+
SESSION_ID=$(printf '%s' "$TTY_PATH" | tr '/' '_')
|
|
155
|
+
fi
|
|
156
|
+
fi
|
|
157
|
+
[ -n "$SESSION_ID" ] || SESSION_ID="ppid-${PPID:-0}"
|
|
158
|
+
|
|
159
|
+
FIRED_KEY="${SESSION_ID}::${SIGNATURE}"
|
|
160
|
+
if [ -f "$STATE_FILE" ] && grep -Fq -- "$FIRED_KEY" "$STATE_FILE" 2>/dev/null; then
|
|
161
|
+
exit 0
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
# Bound state file
|
|
165
|
+
if [ -f "$STATE_FILE" ]; then
|
|
166
|
+
tail -n 100 "$STATE_FILE" > "${STATE_FILE}.tmp" 2>/dev/null \
|
|
167
|
+
&& mv "${STATE_FILE}.tmp" "$STATE_FILE" 2>/dev/null || true
|
|
168
|
+
fi
|
|
169
|
+
printf '%s\n' "$FIRED_KEY" >> "$STATE_FILE" 2>/dev/null || true
|
|
170
|
+
|
|
171
|
+
cat >&2 <<EOF
|
|
172
|
+
[oauth-refresh-monitor] OAuth refresh corruption signature detected in tool
|
|
173
|
+
output: "$SIGNATURE".
|
|
174
|
+
|
|
175
|
+
Cluster 19 candidate axis 19A documents OAuth refresh failure paths where a
|
|
176
|
+
transient upstream error during a refresh operation corrupts the credentials
|
|
177
|
+
state into a persistent broken loop (anchor case: issue #61912). The pattern
|
|
178
|
+
is structurally distinct from straightforward 401 expiry — the operator's
|
|
179
|
+
credential state was valid just before the refresh, the upstream returned 5xx
|
|
180
|
+
or rejected the refresh, and now subsequent requests return 401 even though
|
|
181
|
+
the user did not log out and the original session was not expired.
|
|
182
|
+
|
|
183
|
+
Recovery (NOT a retry — retry compounds the corruption):
|
|
184
|
+
1. Run /account to confirm the current auth state.
|
|
185
|
+
2. If "Not authenticated," do a full re-auth (logout then login) rather
|
|
186
|
+
than relying on automatic refresh.
|
|
187
|
+
3. For MCP servers, restart the MCP connection rather than relying on
|
|
188
|
+
in-session token refresh; the MCP refresh paths (#59460 / #59725 /
|
|
189
|
+
#60260 / #61139) are the specific failure modes here.
|
|
190
|
+
|
|
191
|
+
Why the recovery is "full re-auth, not retry":
|
|
192
|
+
The corruption is in the refresh token state itself, so subsequent
|
|
193
|
+
refresh attempts fail in the same way. Only a fresh authentication
|
|
194
|
+
bypasses the corrupted refresh path.
|
|
195
|
+
|
|
196
|
+
This advisory fires once per session per signature. To silence:
|
|
197
|
+
export CC_OAUTH_REFRESH_MONITOR_QUIET=1
|
|
198
|
+
|
|
199
|
+
Companion hooks:
|
|
200
|
+
auth-status-checker.sh — full Cluster 19 mitigation menu (SessionStart, opt-in)
|
|
201
|
+
auth-expiry-reminder.sh — daily checkpoint reminder (SessionStart, opt-in)
|
|
202
|
+
|
|
203
|
+
References:
|
|
204
|
+
https://github.com/anthropics/claude-code/issues/61912 (axis 19A anchor)
|
|
205
|
+
https://github.com/anthropics/claude-code/issues/59460 (MCP OAuth DCR re-runs)
|
|
206
|
+
https://github.com/anthropics/claude-code/issues/61923 (refresh token rejection)
|
|
207
|
+
https://gist.github.com/yurukusa/58cb17bfda4d5ab31bd804809809d22f (field guide)
|
|
208
|
+
EOF
|
|
209
|
+
|
|
210
|
+
exit 0
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# opus-degradation-tracker.sh — Personal Opus 4.7 pass-rate tracker that alerts on statistical degradation
|
|
3
|
+
#
|
|
4
|
+
# Background:
|
|
5
|
+
# On 2026-05-22, an independent third party (Margin Lab) detected statistically
|
|
6
|
+
# significant degradation in Claude Code Opus 4.7's SWE-Bench-Pro daily pass rate
|
|
7
|
+
# (65% baseline → 57% on the 7-day window, delta -8 points, exceeds the 4.3%
|
|
8
|
+
# significance threshold at 95% CI). The aggregate signal is documented at
|
|
9
|
+
# https://gist.github.com/yurukusa/77bf08523bda41132087a03de4523d7a — but each
|
|
10
|
+
# operator's workload responds differently to model drift. This hook lets an
|
|
11
|
+
# operator translate Margin Lab's aggregate signal into a workload-specific
|
|
12
|
+
# decision input.
|
|
13
|
+
#
|
|
14
|
+
# The operator records pass/fail outcomes from their own Claude Code sessions
|
|
15
|
+
# (one line per session, simple shell append) and this hook computes:
|
|
16
|
+
# - baseline pass rate (first N days of the log, default 30)
|
|
17
|
+
# - recent pass rate (last 7 days)
|
|
18
|
+
# - delta and whether it crosses the configured threshold
|
|
19
|
+
#
|
|
20
|
+
# When degradation crosses the threshold, the hook surfaces the four operator
|
|
21
|
+
# paths from Migration Playbook v2 plus the Margin Lab Gist for cross-source
|
|
22
|
+
# verification. Silent in the happy path.
|
|
23
|
+
#
|
|
24
|
+
# What this hook does:
|
|
25
|
+
# On SessionStart, read ~/.cc-eval-log (or CC_EVAL_LOG_PATH), compute baseline
|
|
26
|
+
# vs recent pass rate, emit a one-line advisory if recent drops below baseline
|
|
27
|
+
# by more than the threshold (default 5 percentage points). Otherwise silent.
|
|
28
|
+
#
|
|
29
|
+
# Log format (one line per session, append by hand or via shell function):
|
|
30
|
+
# YYYY-MM-DD HH:MM session-tag pass|fail
|
|
31
|
+
#
|
|
32
|
+
# Example:
|
|
33
|
+
# 2026-05-15 14:23 pr-review-task pass
|
|
34
|
+
# 2026-05-15 18:01 doc-rewrite fail
|
|
35
|
+
# 2026-05-22 09:12 pr-review-task fail
|
|
36
|
+
# 2026-05-23 11:30 doc-rewrite fail
|
|
37
|
+
#
|
|
38
|
+
# Optional fourth column "notes" is ignored — useful for human context.
|
|
39
|
+
#
|
|
40
|
+
# Suggested helper (add to ~/.bashrc or ~/.zshrc):
|
|
41
|
+
# cc-eval-pass() { echo "$(date '+%Y-%m-%d %H:%M') ${1:-session} pass" >> ~/.cc-eval-log; }
|
|
42
|
+
# cc-eval-fail() { echo "$(date '+%Y-%m-%d %H:%M') ${1:-session} fail" >> ~/.cc-eval-log; }
|
|
43
|
+
#
|
|
44
|
+
# When this hook does NOT fire a warning:
|
|
45
|
+
# - CC_OPUS_DEGRADATION_TRACKER_QUIET=1
|
|
46
|
+
# - log file does not exist or has fewer than CC_OPUS_DEGRADATION_TRACKER_MIN_SAMPLES (default 20) entries
|
|
47
|
+
# - recent pass rate is within threshold of baseline (default 5 pp)
|
|
48
|
+
# - log file is malformed (logs to stderr, exits 0 so SessionStart continues)
|
|
49
|
+
#
|
|
50
|
+
# Hook config (settings.json):
|
|
51
|
+
# {
|
|
52
|
+
# "hooks": {
|
|
53
|
+
# "SessionStart": [{
|
|
54
|
+
# "matcher": "",
|
|
55
|
+
# "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/opus-degradation-tracker.sh" }]
|
|
56
|
+
# }]
|
|
57
|
+
# }
|
|
58
|
+
# }
|
|
59
|
+
#
|
|
60
|
+
# Env vars:
|
|
61
|
+
# CC_EVAL_LOG_PATH — log file location (default ~/.cc-eval-log)
|
|
62
|
+
# CC_OPUS_DEGRADATION_TRACKER_QUIET=1 — never emit anything
|
|
63
|
+
# CC_OPUS_DEGRADATION_TRACKER_THRESHOLD=N — percentage-point threshold for alert (default 5)
|
|
64
|
+
# CC_OPUS_DEGRADATION_TRACKER_MIN_SAMPLES=N — minimum entries before stats run (default 20)
|
|
65
|
+
# CC_OPUS_DEGRADATION_TRACKER_BASELINE_DAYS=N — days at the front of the log treated as baseline (default 30)
|
|
66
|
+
# CC_OPUS_DEGRADATION_TRACKER_RECENT_DAYS=N — days at the tail of the log treated as recent window (default 7)
|
|
67
|
+
|
|
68
|
+
set -u
|
|
69
|
+
|
|
70
|
+
# Silence path
|
|
71
|
+
if [ "${CC_OPUS_DEGRADATION_TRACKER_QUIET:-0}" = "1" ]; then
|
|
72
|
+
exit 0
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
LOG_PATH="${CC_EVAL_LOG_PATH:-$HOME/.cc-eval-log}"
|
|
76
|
+
THRESHOLD="${CC_OPUS_DEGRADATION_TRACKER_THRESHOLD:-5}"
|
|
77
|
+
MIN_SAMPLES="${CC_OPUS_DEGRADATION_TRACKER_MIN_SAMPLES:-20}"
|
|
78
|
+
BASELINE_DAYS="${CC_OPUS_DEGRADATION_TRACKER_BASELINE_DAYS:-30}"
|
|
79
|
+
RECENT_DAYS="${CC_OPUS_DEGRADATION_TRACKER_RECENT_DAYS:-7}"
|
|
80
|
+
|
|
81
|
+
# Log file missing → user hasn't set up tracking yet → silent
|
|
82
|
+
if [ ! -f "$LOG_PATH" ]; then
|
|
83
|
+
exit 0
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# Read and parse the log. Each valid line: YYYY-MM-DD HH:MM tag pass|fail
|
|
87
|
+
# Use awk for portable parsing without external date dependencies.
|
|
88
|
+
analysis=$(awk -v threshold="$THRESHOLD" -v min_samples="$MIN_SAMPLES" -v baseline_days="$BASELINE_DAYS" -v recent_days="$RECENT_DAYS" '
|
|
89
|
+
BEGIN {
|
|
90
|
+
total = 0
|
|
91
|
+
baseline_pass = 0; baseline_total = 0
|
|
92
|
+
recent_pass = 0; recent_total = 0
|
|
93
|
+
today_epoch = systime()
|
|
94
|
+
baseline_cutoff_epoch = today_epoch - (baseline_days * 86400)
|
|
95
|
+
recent_cutoff_epoch = today_epoch - (recent_days * 86400)
|
|
96
|
+
}
|
|
97
|
+
/^[0-9]{4}-[0-9]{2}-[0-9]{2}[ \t]+[0-9]{2}:[0-9]{2}[ \t]+[^ \t]+[ \t]+(pass|fail)([ \t]|$)/ {
|
|
98
|
+
# Parse date into epoch (assumes GNU/BSD compatible mktime via awk)
|
|
99
|
+
split($1, d, "-")
|
|
100
|
+
split($2, t, ":")
|
|
101
|
+
line_epoch = mktime(d[1] " " d[2] " " d[3] " " t[1] " " t[2] " 00")
|
|
102
|
+
if (line_epoch <= 0) next
|
|
103
|
+
total++
|
|
104
|
+
is_pass = ($4 == "pass") ? 1 : 0
|
|
105
|
+
|
|
106
|
+
# Recent window: last RECENT_DAYS days
|
|
107
|
+
if (line_epoch >= recent_cutoff_epoch) {
|
|
108
|
+
recent_total++
|
|
109
|
+
if (is_pass) recent_pass++
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
# Baseline window: oldest BASELINE_DAYS days of recorded history
|
|
113
|
+
# We compute this in a second pass with "min_epoch" tracking.
|
|
114
|
+
# Use total==1 (first valid entry) instead of NR==1: NR counts every
|
|
115
|
+
# file line including malformed ones that fail the regex match.
|
|
116
|
+
if (total == 1 || line_epoch < min_epoch) min_epoch = line_epoch
|
|
117
|
+
sample[total, "epoch"] = line_epoch
|
|
118
|
+
sample[total, "pass"] = is_pass
|
|
119
|
+
}
|
|
120
|
+
END {
|
|
121
|
+
if (total < min_samples) {
|
|
122
|
+
print "INSUFFICIENT " total
|
|
123
|
+
exit
|
|
124
|
+
}
|
|
125
|
+
# Now compute baseline window from the oldest BASELINE_DAYS of recorded data
|
|
126
|
+
baseline_cutoff_from_first = min_epoch + (baseline_days * 86400)
|
|
127
|
+
for (i = 1; i <= total; i++) {
|
|
128
|
+
if (sample[i, "epoch"] <= baseline_cutoff_from_first) {
|
|
129
|
+
baseline_total++
|
|
130
|
+
if (sample[i, "pass"]) baseline_pass++
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (baseline_total < min_samples / 2) {
|
|
134
|
+
print "BASELINE_TOO_SMALL " baseline_total
|
|
135
|
+
exit
|
|
136
|
+
}
|
|
137
|
+
if (recent_total < min_samples / 4) {
|
|
138
|
+
print "RECENT_TOO_SMALL " recent_total
|
|
139
|
+
exit
|
|
140
|
+
}
|
|
141
|
+
baseline_rate = (baseline_pass / baseline_total) * 100
|
|
142
|
+
recent_rate = (recent_pass / recent_total) * 100
|
|
143
|
+
delta = baseline_rate - recent_rate
|
|
144
|
+
if (delta > threshold) {
|
|
145
|
+
printf "DEGRADED %d %d %d %d %.1f %.1f %.1f\n", baseline_pass, baseline_total, recent_pass, recent_total, baseline_rate, recent_rate, delta
|
|
146
|
+
} else {
|
|
147
|
+
printf "HEALTHY %d %d %d %d %.1f %.1f %.1f\n", baseline_pass, baseline_total, recent_pass, recent_total, baseline_rate, recent_rate, delta
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
' "$LOG_PATH" 2>/dev/null) || {
|
|
151
|
+
# awk failure → log is malformed in a way the parser cannot recover from
|
|
152
|
+
# Exit silently so SessionStart is not blocked
|
|
153
|
+
exit 0
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
status="${analysis%% *}"
|
|
157
|
+
case "$status" in
|
|
158
|
+
INSUFFICIENT|BASELINE_TOO_SMALL|RECENT_TOO_SMALL|HEALTHY|"")
|
|
159
|
+
# Healthy or not enough data — silent
|
|
160
|
+
exit 0
|
|
161
|
+
;;
|
|
162
|
+
DEGRADED)
|
|
163
|
+
# Parse the rest of the line for the numbers
|
|
164
|
+
read -r _ baseline_pass baseline_total recent_pass recent_total baseline_rate recent_rate delta <<< "$analysis"
|
|
165
|
+
cat >&2 <<EOF
|
|
166
|
+
[opus-degradation-tracker] Personal pass rate dropped from ${baseline_rate}% baseline (${baseline_pass}/${baseline_total}) to ${recent_rate}% recent (${recent_pass}/${recent_total}) — delta -${delta} pp, exceeding the configured threshold of -${THRESHOLD} pp.
|
|
167
|
+
|
|
168
|
+
This is your own workload's signal. The independent third-party Margin Lab tracker
|
|
169
|
+
(SWE-Bench-Pro daily evals on Opus 4.7) also shows -8 pp degradation since 2026-05-22.
|
|
170
|
+
The two signals together suggest a model-side change rather than a workload-specific issue.
|
|
171
|
+
|
|
172
|
+
Cross-source verification:
|
|
173
|
+
https://gist.github.com/yurukusa/77bf08523bda41132087a03de4523d7a
|
|
174
|
+
(4 operator-side paths + 7-day audit sequence)
|
|
175
|
+
|
|
176
|
+
Decision context for the 2026-06-15 credit pool split (\$20 Pro / \$100 Max 5x / \$200 Max 20x):
|
|
177
|
+
https://yurukusa.gumroad.com/l/claude-code-migration-playbook?utm_source=hook-opus-degradation-tracker&utm_medium=hook&utm_campaign=5-22-degradation
|
|
178
|
+
|
|
179
|
+
To stop seeing this alert: \`export CC_OPUS_DEGRADATION_TRACKER_QUIET=1\` in your shell rc.
|
|
180
|
+
EOF
|
|
181
|
+
exit 0
|
|
182
|
+
;;
|
|
183
|
+
*)
|
|
184
|
+
# Unknown status — log to stderr but don't block
|
|
185
|
+
exit 0
|
|
186
|
+
;;
|
|
187
|
+
esac
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# opus48-routine-task-warning.sh — Surface the Cluster 23 candidate (Opus 4.8
|
|
3
|
+
# effort-budget regression) at session start for operators running Opus 4.8 on
|
|
4
|
+
# routine coding workflows.
|
|
5
|
+
#
|
|
6
|
+
# Background:
|
|
7
|
+
# Cluster 23 candidate documents that Opus 4.8 under effort=medium can spend
|
|
8
|
+
# 40-50k output tokens on hidden thinking for a routine coding turn — Issue
|
|
9
|
+
# #64153 anchor (46,433 output tokens / 22m 43s of thinking on a small
|
|
10
|
+
# rename-impact scan; transcript stop_reason=end_turn so this completed
|
|
11
|
+
# normally, not a retry / not an API 400). The reporter explicitly compares:
|
|
12
|
+
# Opus 4.6 / Opus 4.7 do NOT show this magnitude for comparable routine work.
|
|
13
|
+
#
|
|
14
|
+
# Five independent filings 2026-05-31:
|
|
15
|
+
# #64153 (anchor, 46k output / 22m43s thinking, macOS 2.1.158)
|
|
16
|
+
# #64152 (Opus over-engineers simple tasks in agentic/CLI mode)
|
|
17
|
+
# #64143 (Session limits maxing out without user interaction)
|
|
18
|
+
# #64102 (excessive token consumption + API disconnects)
|
|
19
|
+
# #63455 (simple tasks consuming 40-50k tokens)
|
|
20
|
+
#
|
|
21
|
+
# Four sub-cluster axes:
|
|
22
|
+
# 23A single-turn thinking-budget magnitude (40-50k output on routine work)
|
|
23
|
+
# 23B effort-tier perception mismatch (medium behaves like high/xhigh)
|
|
24
|
+
# 23C operator-attribution gap (operator sees quota burn that was not theirs)
|
|
25
|
+
# 23D over-engineering on simple tasks
|
|
26
|
+
#
|
|
27
|
+
# Cluster 23 is still a candidate; tracked at cluster-tracker.html pending
|
|
28
|
+
# full promotion criteria (15+ aggregate reactions or sixth independent
|
|
29
|
+
# filing surfacing).
|
|
30
|
+
#
|
|
31
|
+
# Reference:
|
|
32
|
+
# https://github.com/anthropics/claude-code/issues/64153 (anchor)
|
|
33
|
+
# Internal research: customer-pain-research-cluster-23-opus48-thinking-cost-2026-05-31.md
|
|
34
|
+
#
|
|
35
|
+
# What this hook does:
|
|
36
|
+
# On SessionStart, when CC_OPUS48_ROUTINE_WARN=1 is set, emits a stderr
|
|
37
|
+
# advisory naming the three operator-side mitigations from the Cluster 23
|
|
38
|
+
# candidate articulation. The hook is fully opt-in — silent by default.
|
|
39
|
+
# The advisory does not try to detect whether Opus 4.8 is actually the
|
|
40
|
+
# active model; the SessionStart payload often does not include model
|
|
41
|
+
# information, and a wrong guess about model identity is worse than a
|
|
42
|
+
# neutral advisory.
|
|
43
|
+
#
|
|
44
|
+
# Pairs with: output-token-spike-detector.sh (PostToolUse, observes the
|
|
45
|
+
# per-turn output_tokens magnitude after the fact). The SessionStart
|
|
46
|
+
# advisory frames the cluster up front; the PostToolUse detector
|
|
47
|
+
# surfaces specific events.
|
|
48
|
+
#
|
|
49
|
+
# When this hook does NOT emit anything:
|
|
50
|
+
# - CC_OPUS48_ROUTINE_WARN is unset or empty
|
|
51
|
+
# - CC_OPUS48_ROUTINE_DISABLE=1
|
|
52
|
+
# - CC_OPUS48_ROUTINE_QUIET=1
|
|
53
|
+
#
|
|
54
|
+
# Hook config (settings.json):
|
|
55
|
+
# {
|
|
56
|
+
# "hooks": {
|
|
57
|
+
# "SessionStart": [{
|
|
58
|
+
# "matcher": "",
|
|
59
|
+
# "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/opus48-routine-task-warning.sh" }]
|
|
60
|
+
# }]
|
|
61
|
+
# }
|
|
62
|
+
# }
|
|
63
|
+
# And in your shell rc, opt in:
|
|
64
|
+
# export CC_OPUS48_ROUTINE_WARN=1
|
|
65
|
+
#
|
|
66
|
+
# Env vars:
|
|
67
|
+
# CC_OPUS48_ROUTINE_WARN=1 — opt-in trigger (required to emit)
|
|
68
|
+
# CC_OPUS48_ROUTINE_DISABLE=1 — never emit (overrides WARN)
|
|
69
|
+
# CC_OPUS48_ROUTINE_QUIET=1 — silent (overrides WARN)
|
|
70
|
+
#
|
|
71
|
+
# Design notes:
|
|
72
|
+
# - Opt-in by default. Operators not on Opus 4.8, or operators who do not
|
|
73
|
+
# run routine coding turns, do not benefit from the advisory.
|
|
74
|
+
# - No model auto-detection. The SessionStart payload is not guaranteed
|
|
75
|
+
# to include model identity, and assuming Opus 4.8 when the operator
|
|
76
|
+
# is on a different model would be a noise event.
|
|
77
|
+
# - Candidate-cluster framing. The advisory clearly states Cluster 23 is
|
|
78
|
+
# a candidate (not yet promoted) and links the anchor issue for
|
|
79
|
+
# verification.
|
|
80
|
+
# - Never blocks. Exit always 0.
|
|
81
|
+
|
|
82
|
+
set -u
|
|
83
|
+
|
|
84
|
+
# Hard disable path
|
|
85
|
+
if [ "${CC_OPUS48_ROUTINE_DISABLE:-0}" = "1" ]; then
|
|
86
|
+
exit 0
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# Quiet path
|
|
90
|
+
if [ "${CC_OPUS48_ROUTINE_QUIET:-0}" = "1" ]; then
|
|
91
|
+
exit 0
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Opt-in gate
|
|
95
|
+
if [ "${CC_OPUS48_ROUTINE_WARN:-0}" != "1" ]; then
|
|
96
|
+
exit 0
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
cat >&2 <<'EOF'
|
|
100
|
+
[opus48-routine-task-warning] Cluster 23 candidate advisory: Opus 4.8 under
|
|
101
|
+
effort=medium can spend 40-50k output tokens on hidden thinking for a routine
|
|
102
|
+
coding turn — a magnitude the anchor reporter explicitly states does NOT occur
|
|
103
|
+
on Opus 4.6 / Opus 4.7 for comparable work.
|
|
104
|
+
|
|
105
|
+
Five independent filings within the last week document the pattern:
|
|
106
|
+
|
|
107
|
+
#64153 (anchor) — medium effort burned 46,433 output tokens / 22m 43s of
|
|
108
|
+
thinking on a routine rename-impact scan. Transcript:
|
|
109
|
+
input_tokens 131, cache_read 91,877, cache_creation 4,054,
|
|
110
|
+
output 46,433, stop_reason end_turn (completed normally,
|
|
111
|
+
not a retry, not an API 400). macOS 2.1.158.
|
|
112
|
+
|
|
113
|
+
#64152 Opus over-engineers simple tasks in agentic/CLI mode, wasting
|
|
114
|
+
tokens (area:tools + area:model, Linux).
|
|
115
|
+
|
|
116
|
+
#64143 Session limits maxing out on their own, without any interaction
|
|
117
|
+
from user — the operator-visible signal of the underlying budget
|
|
118
|
+
drain (area:cost + area:mcp).
|
|
119
|
+
|
|
120
|
+
#64102 Excessive token consumption mixed with API disconnects.
|
|
121
|
+
|
|
122
|
+
#63455 Simple tasks consuming 40-50k tokens.
|
|
123
|
+
|
|
124
|
+
Four sub-cluster axes:
|
|
125
|
+
|
|
126
|
+
23A Single-turn thinking-budget magnitude (40-50k output tokens on
|
|
127
|
+
routine work where 1-5k would be the expected baseline).
|
|
128
|
+
23B Effort-tier perception mismatch: "medium effort behaved much
|
|
129
|
+
closer to a high/xhigh thinking budget" per the anchor reporter.
|
|
130
|
+
23C Operator-attribution gap: the operator sees quota burn that was
|
|
131
|
+
not their action, intersection with Cluster 4 (Pro Max quota
|
|
132
|
+
anomaly).
|
|
133
|
+
23D Over-engineering on simple tasks: the model elaborates approaches
|
|
134
|
+
that the visible work does not require.
|
|
135
|
+
|
|
136
|
+
This is independent from Cluster 22 (Opus 4.8 pre-execution fabrication).
|
|
137
|
+
Cluster 22 is the correctness hazard (model asserts tool-output values
|
|
138
|
+
before tools return); Cluster 23 candidate is the cost hazard (model
|
|
139
|
+
burns 10× the expected hidden-thinking budget for the same routine
|
|
140
|
+
work). Same version window (v2.1.156-v2.1.158, Opus 4.8 default),
|
|
141
|
+
possibly the same root cause manifesting in two distinct surface
|
|
142
|
+
failures.
|
|
143
|
+
|
|
144
|
+
It is also independent from Cluster 4 (Pro Max quota anomaly), which
|
|
145
|
+
is server-side cache_creation_input_tokens inflation. Cluster 23
|
|
146
|
+
candidate is output_tokens growth — #64153's transcript shows
|
|
147
|
+
cache_creation 4,054 vs output 46,433, the opposite ratio of Cluster
|
|
148
|
+
4's signature. So Cluster 4's defense hooks (cache-creation-drift-
|
|
149
|
+
detector.sh etc.) do not catch Cluster 23 candidate directly; they
|
|
150
|
+
catch it indirectly only as it accumulates into session-rate anomalies.
|
|
151
|
+
|
|
152
|
+
Three operator-side mitigations:
|
|
153
|
+
|
|
154
|
+
1) Switch to Opus 4.7 (/model claude-opus-4-7)
|
|
155
|
+
The reporter's own comparison: Opus 4.6 and 4.7 do not show this
|
|
156
|
+
magnitude on comparable routine work. This is full cluster
|
|
157
|
+
elimination — no per-turn measurement or threshold tuning needed.
|
|
158
|
+
|
|
159
|
+
2) Set effort=low for routine coding turns
|
|
160
|
+
The anchor signal is that medium effort behaves like high/xhigh.
|
|
161
|
+
Explicit effort=low constrains the thinking budget regardless of
|
|
162
|
+
whether the underlying calibration regression has been fixed.
|
|
163
|
+
|
|
164
|
+
3) Periodic audit of output_tokens magnitude
|
|
165
|
+
Run on your transcript directory:
|
|
166
|
+
jq -s 'map(.message.usage.output_tokens // 0) | sort | .[length/2]' \
|
|
167
|
+
~/.claude/projects/**/recent.jsonl
|
|
168
|
+
Routine coding turns should produce 1-5k output tokens. A median
|
|
169
|
+
above 10k is the Cluster 23 candidate signal — pair with the
|
|
170
|
+
companion hook output-token-spike-detector.sh (PostToolUse,
|
|
171
|
+
surfaces per-turn spikes in real time).
|
|
172
|
+
|
|
173
|
+
Companion hook (recommended pairing):
|
|
174
|
+
examples/output-token-spike-detector.sh
|
|
175
|
+
PostToolUse, rolling-window comparison of output_tokens against
|
|
176
|
+
trailing baseline, fires above 3× the recent mean and above a
|
|
177
|
+
configurable absolute floor (default 10000) to suppress noise on
|
|
178
|
+
small turns.
|
|
179
|
+
|
|
180
|
+
This is a candidate cluster — full Cluster 23 promotion happens when
|
|
181
|
+
cumulative reactions cross 15 or a sixth independent filing surfaces.
|
|
182
|
+
The cc-safe-setup tracker (cluster-tracker.html) records the current
|
|
183
|
+
state.
|
|
184
|
+
|
|
185
|
+
To silence this advisory once you have applied the relevant mitigations:
|
|
186
|
+
unset CC_OPUS48_ROUTINE_WARN
|
|
187
|
+
# or
|
|
188
|
+
export CC_OPUS48_ROUTINE_QUIET=1
|
|
189
|
+
|
|
190
|
+
References:
|
|
191
|
+
https://github.com/anthropics/claude-code/issues/64153 (anchor)
|
|
192
|
+
https://github.com/anthropics/claude-code/issues/64152 (over-engineering)
|
|
193
|
+
https://github.com/anthropics/claude-code/issues/64143 (silent quota drain)
|
|
194
|
+
EOF
|
|
195
|
+
|
|
196
|
+
exit 0
|