perf(skills): trim over-cap listing entries and flag uncited side-effect skills manual-only - #3677
Conversation
Phase 6 of the hook-performance program (skill listing budget, tracking issue #3623). Claude Code truncates each skill's combined description and when_to_use at 1,536 characters in the listing and scales the shared listing budget at 1% of the model's context window, so the ten largest entries were rewritten to spend fewer characters: mechanism narration and parenthetical enumerations moved out, every single-quoted trigger phrase and every Not for / Skip when / sibling disambiguation kept verbatim. check-skill.sh check 3 reports every base-ref trigger phrase preserved on all ten. Aggregate listing estimate: 136,209 -> 135,424 chars over 182 listing-eligible skills. Over-cap entries: 0 before, 0 after (the largest entry was already 1,526). No skill gains disable-model-invocation: true. Every listing-eligible side-effect skill is cited as /<plugin>:<skill> by at least one external file (plugin READMEs included per the program ruling), so none is a manual-only candidate. babysit-loop (source-control) sits in the top ten but is deferred: that plugin has an open PR. Each touched plugin gets a patch bump and a CHANGELOG entry. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 2m 39s —— View job Code review:
|
|
Claude finished @kyle-sexton's task in 55s —— View job Claude finished the security review
Skip gate hit: no security-relevant surface. Read the full diff (
No source code, scripts, hooks, GitHub Actions workflow files, permissions, or config semantics are touched. There is no injection surface, no credential/token handling, no trust-boundary change, and no supply-chain-relevant pin change in this diff — it's a documentation-only tightening of existing SKILL.md descriptions plus routine version/changelog bookkeeping. No security findings to report. |
|
Last security-reviewed head: |
|
Claude has reviewed this PR 2 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
…udit-performance listing Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 3s —— View job Claude finished the security review
Skip gate hit: no security-relevant surface. Reviewed the full diff (
No source code, scripts, hooks, GitHub Actions workflow files, permissions, or config semantics are touched. There is no injection surface, no credential/token handling, no trust-boundary change, and no supply-chain-relevant pin change in this diff — it remains a documentation-only tightening of existing SKILL.md descriptions plus routine version/changelog bookkeeping. No security findings to report. |
|
Claude finished @kyle-sexton's task in 2m 24s —— View job Code review:
|
… main Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
No related issue: phase 8 of the hook-performance program, tracking issue #3623 ## Summary The hook-performance program landed nine PRs today (#3621, #3662, #3666, #3668, #3671, #3675, #3676, #3677, #3678, plus dotfiles #620). This PR records the outcome where the convention says it lives: the hook-budget convention gains a dated reference-figures section in spawn-equivalents with the harness sha256, and the four plugins that lacked a hook budget accounting row gain one under Requirements. Documentation only; no hook, script or registration changes. ## Fix - `docs/conventions/hook-budget/README.md`: a "Reference figures (2026-09-02, after the hook-performance program)" section with the harness identity, the before-and-after spawn-equivalents per surface (before at S = 33 ms, after at S = 18 ms on `main` `5e3d749cb`), the reference-host conversion, and a plain reading against the budget table: per-turn rows meet the 500 ms ceiling; per-tool-call rows sit at 1.4 to 1.9 s against the 1 s typical ceiling, with the guardrails dispatcher named as the whole of the remainder. - `plugins/typos-format/README.md`, `plugins/eol-normalizer/README.md`, `plugins/markdown-format/README.md`, `plugins/context-guard/README.md`: a "Hook budget accounting" section each, carrying the measured rows their CHANGELOG entries already state (36.3 to 26.0, 41.0 to 21.5, 41.6 to 32.0 spawn-equivalents; 11 to 2, 9 to 4 and 6 to 1 processes for context-guard), what changed, and the residual. guardrails and rate-limit-guard already carried one. - Version bumps with a documentation-only CHANGELOG entry: typos-format 0.6.37, eol-normalizer 0.6.30, markdown-format 0.11.40, context-guard 0.7.36. ## Verification - Final harness run on the installed cache at `main` `5e3d749cb`, `--runs 3`, S = 18 ms, valid, quiet host; every measured plugin's cache directory byte-compared against `origin/main` (0 stale files in 17); `enabledPlugins` unchanged against the pre-program snapshot; 52 `hooks.json` entries listed, every one `type: command`, no `async` row. The per-event block, the STATED CHECK and the reading against goal (B) are in the program's PLAN.md and DEVIATIONS.md on `perf/hook-performance-program`. - Per event (ms, slowest hook): PreToolUse:Bash 2,475 before to 1,599 after; PostToolBatch 1,254 to 282; UserPromptSubmit 975 to 297; in-repo PostToolUse:Write 13,225 to 1,949; in-repo PostToolUse:Edit 17,192 to 3,048. - `markdownlint-cli2` 0 issues on the five files; em dash counts unchanged; `scripts/check-changelog-parity.sh --check-bump origin/main` exit 0; `scripts/affected-tests.sh --explain` selects no suites (every changed file is a recorded no-suite class covered by a non-shell CI lane). ## Related - #3623 (tracking issue) - Merged today: #3621, #3662, #3666, #3668, #3671, #3675, #3676, #3677, #3678; dotfiles #620 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
No related issue: phase 6 of the hook-performance program, tracking issue #3623
Summary
Phase 6 of the hook-performance program (skill listing budget). The Claude Code skills doc states that the combined
descriptionandwhen_to_usetext is truncated at 1,536 characters in the skill listing and that the shared listing budget scales at 1% of the model's context window. This PR rewrites the ten largest listing entries in the marketplace to spend fewer characters while keeping every single-quoted trigger phrase and everyNot for/Skip when/ sibling disambiguation verbatim, and records the outcome of the manual-only (disable-model-invocation: true) sweep over side-effect skills.Baseline finding: the over-cap clause of the program ruling was already satisfied. The largest entry was 1,526 characters, so zero entries exceeded the 1,536 cap before this PR and zero exceed it after. The substance here is the aggregate reduction.
Fix
Ten
SKILL.mddescriptions tightened (old chars, new chars):What was cut: mechanism narration and parenthetical enumerations (the suspect labels in audit-performance, the twenty-five-check list in check, the verdict enumeration in audit-native-overlap, the budget-drop explanation in audit-skill-visibility). What was kept: every quoted trigger phrase, every
/plugin:skillreference inside the disambiguation sentences (those references are the citation edges the manual-only rule reads), and the argument names. No description grew.Manual-only sweep: no skill gains
disable-model-invocation: true. The rule applied was "a skill cited as/<plugin>:<skill>by any external file (SKILL.md, agent, plugin README, or skill spoke) is not a candidate." Every listing-eligible side-effect skill has at least one external citing file. Three side-effect skills are cited only by their own plugin README (overengineering:realign, coupling:reduce, code-tidying:dissolve-comments); they would be candidates under a stricter presence-gate reading and are listed for the program lead to re-rule.Deferred (plugin has an open PR): source-control:babysit-loop sits in the top ten at 1,196 characters and was not touched. instruction-placement:realign is a side-effect skill in a no-touch plugin.
Eight plugins get a patch bump and a
## [<version>]CHANGELOG entry: claude-ops 0.41.8, claude-config 0.40.32, work-items 0.39.53, skill-quality 0.20.11, improvement 0.1.7, code-tidying 0.15.4, overengineering 0.3.6, architecture 0.6.8.Verification
Listing-budget script, before (
bash plugins/skill-quality/scripts/check-listing-budget.sh plugins/*/skills):After:
Aggregate reduction: 785 characters (0.58%). Over-cap entries (combined description plus when_to_use over 1,536): 0 before, 0 after, computed per skill from frontmatter across all 243 SKILL.md files (182 listing-eligible). Phase 0 recorded 178 eligible skills at 132,552 characters; the fleet grew by four skills between phase 0 and this baseline.
check-skill.sh(withCHECK_SKILL_SKILLS_ROOTset per plugin andCHECK_SKILL_SKIP_MARKDOWNLINT=1, matching the repo gate): PASS on nine of ten, each reporting "all N base-ref trigger phrase(s) preserved" for check 3. audit-skill-visibility reports every trigger phrase preserved but FAILs on its bundled script test,scripts/audit_skill_visibility.test.sh: all 96 Python unit tests pass and the shell fixture then errors withno installed skills resolved from '<mktemp dir>/cfg'. That fixture does not read SKILL.md and the only change to that skill is the description line, so this is a Windows-host fixture-path issue, not a regression from this PR; CI runs the suite on Linux.bash scripts/check-changelog-parity.sh --check-bump origin/main: exit 0 after re-fetching origin/main.bash scripts/check-purged-em-dashes.sh: exit 0 (86 declared paths, 105 files scanned, no em dashes). Em-dash line counts per touched file did not grow versus HEAD; architecture:improve dropped from 2 lines to 1.bash scripts/affected-tests.sh --explain: no suites selected. Every changed file (SKILL.md, CHANGELOG.md, plugin.json) is a recorded no-suite class covered by a non-shell CI lane.Related
🤖 Generated with Claude Code