Repository navigation
chore: track fixes from the 2026-10-04 Windows performance audit #6244
Description
Problem
A performance audit of one Windows 11 workstation (SETWORKS-KSDEV1, Claude Code 2.1.289, Git for
Windows 2.55) on 2026-10-04 traced the user's typing lag and part of the steady per-call overhead to
plugins in this repository. This issue tracks the nine plugin fixes it produced, highest value
first.
Headline measurement: four dead-parent rm/du processes left by the testing plugin's
test-judge.test.sh cleanup had run since 03:08 and burned 26.1 CPU-hours. Stopping them dropped
machine CPU from 58% to a median of 31% and ended the lag (one trial).
Evidence
Evidence labels used in every child issue:
- E1: measured on this host and attributed to a cause.
- E2: aggregate measurement here; the cause is inferred.
- E3: structural inference (from code, config or docs), not measured.
- E4: suspicion or judgment.
Measured process start cost on this host (medium confidence): PowerShell 7 541 ms (887 ms with a
profile), bash 53 ms, node 95 ms, python 85 ms. The audit's reading of the Claude Code docs: all
matching hooks run in parallel, plugin copies of a hook are not deduplicated, an if condition that
does not match starts no process, and mod (in-process) hooks need no process from 2.1.287 but fail
open without a .catch.
The audit's local evidence files are not durable; each child carries the facts it needs.
Proposed approach
- testing: gate
test-judge.test.shlink fixtures on a real symlink so cleanup cannot spin (E1).
fix(testing): gate test-judge.test.sh link fixtures on a real symlink so cleanup cannot spin #6248 - harness-ops: rank dead-parent processes by CPU time in
audit-performance; its census missed
all four (E1). feat(harness-ops): rank dead-parent processes by CPU time in audit-performance #6249 - testing: test-judge Stop hook blocked the turn on "0 FLAG, N PASS" (E1). Already fixed on main
by fix(testing): do not block Stop when the judge has nothing to decide #6092 (testing 0.22.5, closing fix(testing): skip temp-copy tests and stop blocking Stop on judge runs with nothing to decide #6037). Blocks still seen after it are 0 FLAG with an UNKNOWN,
which blocks by design; the UNKNOWN cause seen is fix(testing): test judge marks a linked-worktree test UNKNOWN because its quotes are grounded against the wrong repository #6206. Message noise is fix(testing): test-judge Stop hook floods task end with every deferred test name and relays all-pass verdicts #6226. - animation, explainer-video, speech: pass
pydeps.pyto native Python as a Windows path. Low:
did not reproduce outside the audit's ownMSYS_NO_PATHCONV=1 claude -plaunches.
fix(animation, explainer-video, speech): pass pydeps.py to native Python as a Windows path #6250 - Edit/Write hook chain: Edit wait p50 5 to 7 s against Read under 1 s (E2).
perf(guardrails): skip the verify rows before bash when all verifiers are off #6252 - guardrails Bash PreToolUse bundle: p50 1.3 to 1.6 s, two interpreters per call; security class,
consolidation is Kyle's call (E2). perf(guardrails): decide the route to one guard process per shell call #6245 - SessionStart burst: about 75 to 80 processes on every start, resume, /clear and compaction
(E3 count, E2 time). perf(hooks): skip node-notice and probe SessionStart rows on compaction #6251 - Hooks that spawn and then do nothing (E3).
perf(testing): skip test-scan-bash before bash when no bashEditDiff #6253, perf(harness-ops): decide whether the session event log moves into a mod #6246, perf(autonomy, disk-hygiene): decide how Stop rows skip bash when idle #6254 - Stale plugin paths in long-running sessions (E1).
fix(harness-ops): name stale hook config and suggest /reload-plugins #6247
Acceptance criteria
- Every child issue above is closed, or closed as not planned with a reason.
- No child removes a guard or a security test case; each one consolidates or gates instead.
Constraints and gotchas
- Kyle's standing rule: guards change only when Kyle says so. Consolidate or gate, never remove.
Security-class items (fix 6 and any guard change) are Kyle's call. - Every number comes from one host on one morning, during heavy agent activity; re-measure before
claiming a win.
Context
Source: local handoff item 20261004-150216-claude-perf-audit-plugin-fixes.md (retired into this
issue and its children).
Activity
github-actions commentedon Oct 4, 2026
Thanks for the detailed writeup. This reads as a tracking issue for a 2026-10-04 Windows performance audit on one workstation, rolling up nine already-filed child fixes (highest-value first: dead-parent process cleanup, audit-performance census gaps, a Windows-path fix, hook-chain latency, a guardrails consolidation call, SessionStart fan-out, no-op hook spawns, and stale plugin paths). Evidence levels and acceptance criteria are already spelled out, and each line links its child issue, so scope looks clear and nothing appears missing for this parent itself. No open duplicate tracking issue was found; a few related performance issues exist (e.g. #3623, #4373), but none cover this specific audit or its linked children. The actual work and any guard-consolidation decisions live in the child issues this one tracks.
Automated triage. A maintainer reviews it.
kyle-sexton commentedon Oct 13, 2026
Decision recorded. The owner approved applying independently verified recommendations (confirmed, low-risk set) on 2026-10-13.
Parent tracker for nine plugin fixes from a Windows performance audit. All children (#6245 to #6254) are closed, most by PR #6323, so the tracker can close.
Verified by an independent fresh-context check (confirmed, risk low): gh issue view 6244 body (children #6245-#6254, plus #6037/#6092/#6206/#6226); all 13 referenced issues CLOSED; #6245 NOT_PLANNED with owner decision 2026-10-05 (Option A, no code change, no guard removed); gh pr view 6323 body: Closes #6247-#6253 and others
Closing: Tracking issue whose acceptance is met: every child is closed and PR #6323 states no guard was removed.