ECC/tests/hooks
AlbertChiu777 c7720d41bb
fix(hooks): context-monitor noise — loop-detection false positives + per-call cost-warning spam (#2486)
* fix(hooks): context-monitor noise — loop-detection false positives and per-call cost-warning spam

Two independent noise sources in the PostToolUse context monitor injected
agent-facing warnings on nearly every tool call:

1. LOOP WARNING false positives. hashToolCall() hashed only the first 160
   chars of a Bash command, so distinct long commands sharing a prefix
   (heredocs, long one-liners) collided and consecutive DIFFERENT calls
   looked like a stuck loop. Additionally LOOP_THRESHOLD=3 against a
   5-entry ring buffer fired on legitimate repetition (retries, polling).
   Fix: hash the full command (digest truncated, not the input — same
   treatment the Edit/Write branch already got), and require all 5 of the
   last 5 calls to be identical before warning.

2. COST NOTICE spam. run() deduped warnings on exact message text, but the
   cost figure embedded in the text moves on nearly every call, so once a
   session crossed $5 a 'new' COST NOTICE was injected per tool call for
   the rest of the session. Context warnings had the same defect via the
   remaining-% figure. Fix: dedupe on a stable per-tier key
   (cost:notice/warning/critical, context:warning/critical, scope) so each
   tier fires exactly once and re-fires only on genuine escalation. The
   existing ECC_CONTEXT_MONITOR_COST_WARNINGS opt-out is unchanged.

Tests: loop threshold updated (5-of-5 fires, 4-of-5 does not), long
shared-prefix Bash hash regression, and a run()-level tier-dedupe test
(notice fires once, silent on cost tick, re-emits on escalation).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: keep context warning state immutable

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>
2026-08-10 22:33:10 -04:00
..
auto-tmux-dev.test.js fix(hooks,lib): fix hook detection and parsing edge cases (#2405) 2026-07-28 21:32:42 -04:00
bash-hook-dispatcher.test.js fix(hooks): stop pre/post Bash dispatcher from echoing the input event (#2240) 2026-06-15 13:48:46 -04:00
block-no-verify.test.js fix(hooks): catch the bypass short flag anywhere in a cluster (#2668) 2026-08-04 17:08:56 -04:00
check-hook-enabled.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
config-protection.test.js fix(config-protection): match protected filenames case-insensitively (#2543) 2026-07-22 12:17:04 -04:00
continuous-learning-observe-runner.test.js refactor(hooks): consolidate PostToolUse hooks into sync/async dispatchers (#2494) 2026-07-19 15:47:10 -04:00
continuous-learning-shebang-consistency.test.js chore(continuous-learning-v2): standardize shell shebangs to env bash (#2401) 2026-07-03 20:40:44 -07:00
cost-tracker.test.js fix(hooks): dedupe transcript usage by message.id in cost-tracker (~2.5-3x inflation) (#2483) 2026-07-27 11:14:47 -07:00
cursor-block-no-verify.test.js fix(.cursor/hooks): route block-no-verify through local hook to fix message-body false positives (#2107) (#2177) 2026-06-07 13:01:36 +08:00
design-quality-check.test.js feat: add web frontend rules and design quality hook 2026-04-02 17:33:17 -07:00
detect-project-nongit.test.js fix(continuous-learning-v2): honor non-git CLAUDE_PROJECT_DIR (#2488) 2026-07-26 00:04:35 -07:00
detect-project-worktree.test.js fix(learning): add project registry maintenance 2026-05-19 12:51:18 -04:00
doc-file-warning.test.js fix(hooks): guard doc-file-warning stdin listeners behind require.main (#2358) 2026-06-29 15:54:55 -07:00
ecc-context-monitor.test.js fix(hooks): context-monitor noise — loop-detection false positives + per-call cost-warning spam (#2486) 2026-08-10 22:33:10 -04:00
ecc-metrics-bridge.test.js fix(hooks): context-monitor noise — loop-detection false positives + per-call cost-warning spam (#2486) 2026-08-10 22:33:10 -04:00
ecc-statusline.test.js chore: update statusline ANSI color palette 2026-05-15 23:18:01 -04:00
evaluate-session.test.js fix: remove unused execFileSync import (no-unused-vars ESLint) 2026-02-18 07:15:53 +05:30
gateguard-fact-force.test.js feat(gateguard): add GATEGUARD_EXEMPT_GLOBS path exemptions (#2432) 2026-07-03 20:41:11 -07:00
governance-capture.test.js fix: resolve blocker PR validation regressions 2026-03-25 01:34:29 -04:00
hook-flags.test.js feat(install): add guided multi-harness installer (#2649) 2026-08-06 15:39:49 -04:00
hooks.test.js feat(session-start): rank injected instincts by project/stack relevance (#2466) 2026-08-10 21:46:24 -04:00
insaits-security-monitor.test.js test: skip insaits monitor subprocesses without python 2026-05-18 00:47:05 -04:00
insaits-security-wrapper.test.js test: harden InsAIts wrapper fake Python shim 2026-05-12 01:13:01 -04:00
mcp-health-check.test.js fix(hooks): quote args when probing Windows .cmd MCP servers via shell (#2343) 2026-06-29 15:54:52 -07:00
migrate-homunculus-home-escape.test.js fix(clv2): escape $HOME before pgrep -f in migrate-homunculus.sh (#2339) 2026-06-25 16:47:32 -07:00
observe-entrypoint-allowlist.test.js fix(continuous-learning-v2): accept claude-vscode as valid entrypoint (#2134) 2026-06-07 13:01:24 +08:00
observe-signal-counter-race.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
observe-signal-timeout.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
observe-subdirectory-detection.test.js fix(learning): add project registry maintenance 2026-05-19 12:51:18 -04:00
observer-loop-archive.test.js fix(clv2): archive observations only after successful analysis in observer-loop (#2386) 2026-06-29 18:43:37 -07:00
observer-loop-mktemp.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
observer-memory.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
plan-canvas-pending-hook.test.js fix(plan-canvas): deliver browser chat to the agent every time (#2739) 2026-08-09 18:15:25 -04:00
plan-canvas-sessions-hook.test.js feat: Plan Canvas, a browser review canvas for plans (#2467) 2026-07-08 17:12:48 -04:00
plugin-hook-bootstrap.test.js fix(windows): prefer PowerShell over bash to prevent zombie process accumulation (#2346) 2026-06-29 15:54:58 -07:00
post-bash-hooks.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
posttooluse-dispatcher.test.js feat(install): add guided multi-harness installer (#2649) 2026-08-06 15:39:49 -04:00
pre-bash-commit-quality.test.js fix(hooks,lib): fix hook detection and parsing edge cases (#2405) 2026-07-28 21:32:42 -04:00
pre-bash-dev-server-block.test.js fix(dev-server-block): stop blocking dev-<suffix> scripts (#2179) 2026-06-07 13:25:39 +08:00
pre-bash-reminders.test.js fix: surface warn-only PreToolUse hooks (#2084) 2026-05-28 07:45:46 -04:00
pre-bash-tmux-reminder.test.js fix(hooks): remove stray '?' that made every 'yarn <anything>' fire tmux reminder (#2517) 2026-07-20 16:21:03 -04:00
pre-compact.test.js fix(hooks,lib): fix hook detection and parsing edge cases (#2405) 2026-07-28 21:32:42 -04:00
quality-gate.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
run-with-flags-truncation.test.js fix: stability batch — hook stdin truncation, Codex exa TOML, Stop hook JSON, GateGuard repetition (#2227) 2026-06-11 00:31:33 -04:00
session-activity-tracker.test.js test: cover session activity tracker edge paths 2026-04-29 18:15:51 -04:00
session-end.test.js fix(session-end): preserve $-sequences in user messages when rewriting summary (#2180) 2026-06-07 13:25:36 +08:00
stop-format-typecheck.test.js fix(hooks): never format installed plugin and marketplace clones (#2667) 2026-08-04 17:14:37 -04:00
stop-hooks-stdout.test.js fix(hooks): preserve Stop output through lifecycle wrappers (#2493) 2026-07-26 00:01:57 -07:00
suggest-compact.test.js fix: context-size /compact trigger, Codex marketplace plugin path, live README badges (#2237) 2026-06-11 16:21:53 -04:00
test_insaits_security_monitor.py test: cover hook bootstrap and InsAIts monitor 2026-04-29 17:45:22 -04:00