cc-safe-setup 29.7.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-circuit-breaker.sh +72 -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 +89 -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/thinking-stall-detector.sh +61 -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-circuit-breaker.sh +134 -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-exploration-budget-guard.sh +164 -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-thinking-stall-detector.sh +151 -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,156 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# non-english-quality-warner.sh — Surface the Cluster 15 non-English output quality regression
|
|
3
|
+
# at session start for operators working in non-English languages with Opus 4.7
|
|
4
|
+
#
|
|
5
|
+
# Background:
|
|
6
|
+
# Starting with Claude Code 2.1.126 (early May 2026), Opus 4.7's non-English outputs
|
|
7
|
+
# began exhibiting register-inappropriate vocabulary at significantly elevated rates.
|
|
8
|
+
# The strongest quantitative evidence comes from issue #62961 (2026-05-28): a Kiwi
|
|
9
|
+
# morpheme-level analysis of 114.9M Korean output tokens across 4,666 sessions over
|
|
10
|
+
# ~2 months (Mar 21 – May 25, 2026) shows:
|
|
11
|
+
#
|
|
12
|
+
# Period (Korean verb 박다 frequency per 10K tokens)
|
|
13
|
+
# Baseline (Mar 21 – May 2, Opus 4.6 → 4.7) : 0.0174 (1.0×)
|
|
14
|
+
# After 2.1.126 (May 3–7, Opus 4.7) : 0.1147 (6.6×)
|
|
15
|
+
# After 2.1.132 (May 8–17, Opus 4.7) : 0.3138 (18.0×)
|
|
16
|
+
# After 2.1.143 (May 18–25, Opus 4.7) : 0.3106 (17.9×)
|
|
17
|
+
#
|
|
18
|
+
# The verb "박다" (bakda) is colloquial/slang ("to hammer/nail in") — register-
|
|
19
|
+
# inappropriate for professional documents. It is being used where formal verbs
|
|
20
|
+
# like "명시하다" (to specify), "기록하다" (to record), or "삽입하다" (to insert)
|
|
21
|
+
# would be expected. The 6.6× → 18.0× jump at 2.1.132 strongly correlates with
|
|
22
|
+
# Claude Code CLI updates, not the model transition (Opus 4.6 → 4.7 happened
|
|
23
|
+
# April 16, well before the spike).
|
|
24
|
+
#
|
|
25
|
+
# The pattern is not limited to Korean. Independent operator reports surface:
|
|
26
|
+
# - Japanese register collapse (2-4× signal)
|
|
27
|
+
# - Mixed Chinese-English code-switching at unexpected rates
|
|
28
|
+
# - Polish/Spanish formality drift (smaller signal, harder to quantify)
|
|
29
|
+
#
|
|
30
|
+
# This is a server-side quality regression. There is no client-side fix that
|
|
31
|
+
# restores baseline register quality. The hook exists to surface the situation
|
|
32
|
+
# to operators who would otherwise notice the degradation only after shipping
|
|
33
|
+
# documents that used slang verbs in formal contexts.
|
|
34
|
+
#
|
|
35
|
+
# References:
|
|
36
|
+
# - https://github.com/anthropics/claude-code/issues/62961 (Korean evidence)
|
|
37
|
+
# - https://gist.github.com/yurukusa/9b882f7009d36ad5477c46f890272acc (field guide)
|
|
38
|
+
#
|
|
39
|
+
# What this hook does:
|
|
40
|
+
# On SessionStart, when CC_NON_ENGLISH_QUALITY_WARNER_REMIND=1 is set, emits a
|
|
41
|
+
# stderr advisory naming the three operator-side workarounds for non-English
|
|
42
|
+
# register-quality work during the Cluster 15 window. The hook is fully opt-in —
|
|
43
|
+
# silent by default. The advisory does not assume the operator's language; it
|
|
44
|
+
# describes the situation and lets the operator decide if it applies.
|
|
45
|
+
#
|
|
46
|
+
# When this hook does NOT emit anything:
|
|
47
|
+
# - CC_NON_ENGLISH_QUALITY_WARNER_REMIND is unset or empty
|
|
48
|
+
# - CC_NON_ENGLISH_QUALITY_WARNER_DISABLE=1
|
|
49
|
+
# - CC_NON_ENGLISH_QUALITY_WARNER_QUIET=1
|
|
50
|
+
#
|
|
51
|
+
# Hook config (settings.json):
|
|
52
|
+
# {
|
|
53
|
+
# "hooks": {
|
|
54
|
+
# "SessionStart": [{
|
|
55
|
+
# "matcher": "",
|
|
56
|
+
# "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/non-english-quality-warner.sh" }]
|
|
57
|
+
# }]
|
|
58
|
+
# }
|
|
59
|
+
# }
|
|
60
|
+
# And in your shell rc, opt in:
|
|
61
|
+
# export CC_NON_ENGLISH_QUALITY_WARNER_REMIND=1
|
|
62
|
+
#
|
|
63
|
+
# Env vars:
|
|
64
|
+
# CC_NON_ENGLISH_QUALITY_WARNER_REMIND=1 — opt-in trigger (required to emit)
|
|
65
|
+
# CC_NON_ENGLISH_QUALITY_WARNER_DISABLE=1 — never emit (overrides REMIND)
|
|
66
|
+
# CC_NON_ENGLISH_QUALITY_WARNER_QUIET=1 — silent (overrides REMIND)
|
|
67
|
+
#
|
|
68
|
+
# Design notes:
|
|
69
|
+
# - Opt-in by default. The advisory is only useful to operators producing non-
|
|
70
|
+
# English output. Defaulting silent avoids noise for the English-language
|
|
71
|
+
# operator majority.
|
|
72
|
+
# - Language-agnostic advisory. The hook does not try to auto-detect the
|
|
73
|
+
# operator's language. Auto-detection from CLAUDE.md or env vars would be
|
|
74
|
+
# unreliable (a Japanese operator may have an English CLAUDE.md), and a wrong
|
|
75
|
+
# guess is worse than no guess.
|
|
76
|
+
# - Never blocks. Exit always 0.
|
|
77
|
+
# - No version gating. The Cluster 15 window started at 2.1.126 and is ongoing
|
|
78
|
+
# as of 2026-05-30. Gating on version would risk silencing the advisory after
|
|
79
|
+
# Anthropic patches the regression (the operator would no longer hear the
|
|
80
|
+
# advisory, but the patch's effectiveness is something they need to verify).
|
|
81
|
+
# The advisory text describes the situation and the verification path; the
|
|
82
|
+
# operator can disable it once they have verified that their workflow is
|
|
83
|
+
# unaffected.
|
|
84
|
+
|
|
85
|
+
set -u
|
|
86
|
+
|
|
87
|
+
# Hard disable path
|
|
88
|
+
if [ "${CC_NON_ENGLISH_QUALITY_WARNER_DISABLE:-0}" = "1" ]; then
|
|
89
|
+
exit 0
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Quiet path
|
|
93
|
+
if [ "${CC_NON_ENGLISH_QUALITY_WARNER_QUIET:-0}" = "1" ]; then
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
# Opt-in gate
|
|
98
|
+
if [ "${CC_NON_ENGLISH_QUALITY_WARNER_REMIND:-0}" != "1" ]; then
|
|
99
|
+
exit 0
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
cat >&2 <<'EOF'
|
|
103
|
+
[non-english-quality-warner] Cluster 15 advisory: non-English output register
|
|
104
|
+
quality has regressed in Opus 4.7 since Claude Code 2.1.126 (early May 2026).
|
|
105
|
+
|
|
106
|
+
Strongest quantitative signal (issue #62961, Korean morpheme analysis):
|
|
107
|
+
Baseline (pre-2.1.126) : 1.0× baseline slang verb frequency
|
|
108
|
+
After 2.1.126 : 6.6× slang verb frequency
|
|
109
|
+
After 2.1.132 and later : 18.0× slang verb frequency
|
|
110
|
+
|
|
111
|
+
The pattern: formal/professional-register verbs are being replaced by colloquial
|
|
112
|
+
or slang alternatives in contexts where the colloquial form would not appear in
|
|
113
|
+
a professional document. The defect is server-side and Opus-4.7-specific; there
|
|
114
|
+
is no client-side patch that restores the baseline register.
|
|
115
|
+
|
|
116
|
+
If you produce non-English output for any document that requires professional
|
|
117
|
+
register (reports, customer-facing content, technical docs in your language),
|
|
118
|
+
three operator-side workarounds reduce the exposure:
|
|
119
|
+
|
|
120
|
+
1) Pin formal register in your system prompt or CLAUDE.md.
|
|
121
|
+
Add an explicit rule naming the registers you want and the registers you do
|
|
122
|
+
not. Example (Japanese):
|
|
123
|
+
"出力は formal register に固定。 colloquial / slang の語彙の混入を避ける。
|
|
124
|
+
書き言葉の規律で、 報告書に出せる調子で書く。"
|
|
125
|
+
For Korean, name the slang verbs you have already observed and exclude them:
|
|
126
|
+
"박다, 박히다 등의 비격식체 동사 사용 금지。 명시하다, 기록하다,
|
|
127
|
+
삽입하다 등의 격식체 동사를 사용。"
|
|
128
|
+
|
|
129
|
+
2) Switch to Sonnet for register-sensitive output.
|
|
130
|
+
Sonnet 4.6 and 4.7 are not affected by the Cluster 15 regression in the
|
|
131
|
+
same way (independent reports — please verify on your own workload before
|
|
132
|
+
trusting this for production output). For the specific turns that produce
|
|
133
|
+
register-sensitive text, swap with:
|
|
134
|
+
export ANTHROPIC_MODEL=claude-sonnet-4-7
|
|
135
|
+
Switch back to Opus for non-register-sensitive work (planning, reasoning).
|
|
136
|
+
|
|
137
|
+
3) Post-process the output for known slang substitutions.
|
|
138
|
+
For high-volume non-English production, maintain a sed/awk substitution
|
|
139
|
+
list of the slang verbs your style guide rejects, applied to the model's
|
|
140
|
+
output before shipping. This is a stop-gap, not a fix, and it does not
|
|
141
|
+
catch register problems your list does not anticipate — but for known
|
|
142
|
+
repeat offenders it works.
|
|
143
|
+
|
|
144
|
+
This advisory will continue to surface until you disable it. To turn it off
|
|
145
|
+
once you have either chosen a workaround or verified Anthropic has patched the
|
|
146
|
+
regression for your workflow:
|
|
147
|
+
unset CC_NON_ENGLISH_QUALITY_WARNER_REMIND
|
|
148
|
+
# or
|
|
149
|
+
export CC_NON_ENGLISH_QUALITY_WARNER_QUIET=1
|
|
150
|
+
|
|
151
|
+
References:
|
|
152
|
+
https://github.com/anthropics/claude-code/issues/62961 (Korean evidence)
|
|
153
|
+
https://gist.github.com/yurukusa/9b882f7009d36ad5477c46f890272acc (field guide)
|
|
154
|
+
EOF
|
|
155
|
+
|
|
156
|
+
exit 0
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
# Linux (notify-send) — skip on WSL2 where D-Bus may not be running
|
|
20
20
|
#
|
|
21
|
-
# TRIGGER:
|
|
21
|
+
# TRIGGER: Notification MATCHER: ""
|
|
22
22
|
if command -v notify-send &>/dev/null && [ -z "$WSL_DISTRO_NAME" ]; then
|
|
23
23
|
notify-send "Claude Code" "Waiting for your input" --urgency=normal 2>/dev/null && exit 0
|
|
24
24
|
fi
|
|
File without changes
|
|
@@ -16,6 +16,18 @@
|
|
|
16
16
|
#
|
|
17
17
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
18
18
|
|
|
19
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
20
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
21
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
22
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
23
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
24
|
+
_nojq_warned="/tmp/cc-nojq-warned-npm-global-install-guard-$PPID"
|
|
25
|
+
[ -f "$_nojq_warned" ] || {
|
|
26
|
+
echo "WARNING [npm-global-install-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
27
|
+
: > "$_nojq_warned"
|
|
28
|
+
}
|
|
29
|
+
fi
|
|
30
|
+
|
|
19
31
|
INPUT=$(cat)
|
|
20
32
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
21
33
|
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
#
|
|
3
3
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
4
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
5
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
6
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
7
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
8
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
9
|
+
_nojq_warned="/tmp/cc-nojq-warned-npm-publish-guard-$PPID"
|
|
10
|
+
[ -f "$_nojq_warned" ] || {
|
|
11
|
+
echo "WARNING [npm-publish-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
12
|
+
: > "$_nojq_warned"
|
|
13
|
+
}
|
|
14
|
+
fi
|
|
15
|
+
|
|
4
16
|
COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
5
17
|
[ -z "$COMMAND" ] && exit 0
|
|
6
18
|
if echo "$COMMAND" | grep -qE '^\s*(npm\s+publish|npx\s+npm\s+publish)' && ! echo "$COMMAND" | grep -qE '\-\-dry-run'; then
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|