Repository navigation
perf(skills): trim skill descriptions until the listing fits, then lower skillListingBudgetFraction #6846
Description
Problem
The skill listing outgrew its budget again. At skillListingBudgetFraction: 0.05, a 1M-window claude-opus-5-5 session got exactly 150,000 characters (1M × 3 bytes per token × 0.05). It shed 38 descriptions, 25 of them from this repository's plugins (review:audit-enforceability, review:explain-change, session-flow:audit-friction, session-flow:reconcile, session-flow:running-retro, five user-experience:*, user-interface:design, visualization:present, work-items:onboard-adapter, work-items:scan-todos, work-items:ship, prototype:explore-directions, plugin-quality:report, and eight :check prerequisite skills). A skill listed by name only gets no proactive invocation.
#6805 raises the fraction to 0.07 as a stopgap. Raising it again later only resets the clock, because the aggregate grows; the earlier trim passes (#4555, #4657, #4661) are closed.
Evidence
Measured 2026-10-10, Claude Code 2.1.296, /harness-ops:audit-skill-visibility --installed --context-window 1000000 --listing-capture <session transcript>:
- Full listing: about 177,000 characters, from 302 competing skills at 169,124 plus 8,237 for capture-only entries.
- The longest competing descriptions are all near the cap of 1,000 characters:
testing:audit1,010,mutation-testing:audit1,007,visualization:visualize996,bugs:scan993,evals:plugin-eval993,review:audit-enforceability991,writing:be-concise986,playbooks:fable-5985,coupling:reduce982. - To fit at 0.05 on a 1M/3 window, the listing needs about 28,000 fewer characters, which is roughly halving the 50 longest descriptions.
Proposed approach
- Trim the longest descriptions in this repository's skills to what routing needs: trigger phrases and a skip line, no restated mechanism. Use
/skill-quality:check measure-invocation, or the skill-quality: measure and improve description-driven auto-invocation (eval-based) #3526 probe machinery, so a trim does not lose invocations. - Then re-measure and lower
skillListingBudgetFractionin.claude/settings.jsonto the smallest value whose 1M/3 budget fits the measured listing with at least 15% headroom. Updatedocs/cloud-sessions.md's budget section to the new figures. - Hand the user-scope value (dotfiles) the same reassessment.
Acceptance criteria
- The full installed listing measures at least 28,000 characters shorter than 177,000, with no invocation-probe regression on the trimmed skills.
-
skillListingBudgetFractionis re-measured after the trim and lowered to the smallest value that fits on 1M/3 with at least 15% headroom, or the issue records why it cannot go lower. - A fresh session's listing capture shows 0 descriptions shed at the new value.
-
docs/cloud-sessions.mdstates the new value and measurement.
Related
- chore(config): raise skillListingBudgetFraction to 0.07 so every description fits #6805 (stopgap raise to 0.07)
- skill-quality: measure and improve description-driven auto-invocation (eval-based) #3526, perf(skills): finish cutting the shared skill-listing cost after #4555 #4657, perf(skills): trim the longest skill descriptions in the heaviest plugins #4661 (earlier passes, closed)
Scope after the 2026-10-12 decision
The owner chose Option A (decision): keep an override, and lower skillListingBudgetFraction from 0.07 only after the #6476 rollout's trims are measured. Criterion 1 (the trims) is delivered by the #6476 rollout, not here; this issue re-measures and sets the fraction. It is blocked by #6476.
Done when
-
bash plugins/skill-quality/scripts/check-listing-budget.shrun withCHECK_SKILL_LISTING_BUDGET_CHARSset to the 1M-window, 3-bytes-per-token budget for the new fraction reports at least 15% headroom. -
.claude/settings.jsonholds the newskillListingBudgetFraction, or the issue records why 0.07 cannot go lower. - A fresh-session listing capture through
/harness-ops:audit-skill-visibility --installed --context-window 1000000 --listing-captureshows 0 descriptions shed at the new value. -
docs/cloud-sessions.mdstates the new value and the measurement.
Activity
github-actions commentedon Oct 10, 2026
Proposed work class: work-class: scoped
Basis: automated intake triage; the lanes App applied this class.
Size: Small
Complexity: Low
Uncertainty: Knowable
Flags: none
Blocked by: #6476
#6846 (comment)
The decision settles the open questions. The remaining work is to re-measure the listing after the #6476 trims, set the new
skillListingBudgetFractionin.claude/settings.json, and updatedocs/cloud-sessions.md. The fresh-session listing capture needs an attendedclauderun, which this lane can't do. It is not a reason to hold the rest.Automated triage, applied by the lanes App.
kyle-sexton commentedon Oct 11, 2026
Overnight worker: stopped before any change. One decision is needed first.
Question: which budget target does this issue serve?
The two recorded positions conflict:
skillListingBudgetFractionat the shipped default (0.01), remove the repo override, and let Claude Code drop the least-used descriptions.0.07at.claude/settings.json:49), then lower it to the smallest value that fits with 15% headroom and 0 descriptions shed.Acceptance criteria 2 and 3 here (lowered fraction, 0 shed) only make sense under the second position.
Options:
Second blocker, whichever option you pick: the trims cannot ship from an unattended run tonight.
plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md, Measurement) require a model-graded before/after trigger-rate run for each trimmed description. The lexicallisting-overlapfloor is only a tripwire./skill-quality:checksays fleet-wide description rewrites stay attended.claude plugin eval.Current state:
8fa9df0by a frontmatter scan ofplugins/*/skills/*/SKILL.md, skippingdisable-model-invocation:Next step once you answer: an attended session takes the first batch, for example the 10 longest from
testing:audit(1,010) down toskill-quality:check(982). For each skill it freezes a probe set plus a held-out set and runs before and after concurrently. It ships only the trims that pass non-inferiority, withRefs: #6846.I added
needs-humanto this issue.Generated by Claude Code
kyle-sexton commentedon Oct 11, 2026
Handoff note for whoever picks this up next. The overnight Claude run has stopped, and Kyle is moving issue work to Cursor.
Where a branch is listed it is pushed, so it can be taken over as is. A draft PR shows a red
ci-statusby design until it is marked ready.Generated by Claude Code
kyle-sexton commentedon Oct 13, 2026
Decision recorded. The owner accepted the adjudicated recommendation on 2026-10-12.
Option A: keep an override. After the #6476 rollout trims are measured, lower skillListingBudgetFraction from 0.07 to the smallest value that fits the installed listing on a 1M window at 3 bytes per token with 15% headroom and no descriptions shed. 0.07 stays until then.
Why: Precedence rule 2: the newest explicit owner decision on the fraction is #6458 (2026-10-05, keep 0.01 and remove the overrides); PR #6805 (merged 2026-10-10 by the owner) and #6846 (filed 2026-10-10) take the opposite position but never name that decision, so they flag a possible change of course without proving one, and current upstream facts (default 0.01 means about 30,000 chars on a 1M/3-byte window against a 146,814 to 153,232 char repo listing; skillOverrides name-only does not apply to plugin skills) make the 0.01 position a knowing acceptance of shedding rather than a fit target. The trims are wanted under both positions and already have an owner-approved, eval-gated home in #6476 (brief confirmed 2026-10-07; standard and tooling merged in #6503, #6529, #6539, #6546), so a separate trim issue would be a parallel second way. Changing the fraction now in either direction is premature: lowering it sheds about 38 descriptions again, and the issue's own criterion 2 says to lower it only after re-measuring.
Precedence applied: Rule 2 (newest explicit owner decision): #6458 2026-10-05 is the last stated decision on the fraction; #6805 and #6846 are later owner-account actions that do not name it, so per the brief they flag a possible change of course and the conflict goes to the owner. Rule 2 also settles where the trims go: the #6476 brief (2026-10-07) is an explicit owner decision that concise-skill rewrites run fleet-wide per plugin with eval gates, and no later decision carves description trims out of it. Rule 4 (current upstream docs for 2.1.296) supplies the facts the owner weighs; no ADR applies.
Sources:
Next: Read-only on GitHub in this pass; the owner (or a session the owner starts) does the following. (1) Post the fraction decision on #6458 and #6846. (2) Re-scope #6846: title and body become 're-measure the listing after the #6476 rollout and set skillListingBudgetFraction', keep criteria 2 to 4 under Option A or replace them with 'remove the override, retire listing_budget_configured in pr-require-checks.yml, rewrite docs/cloud-sessions.md' under Option B, keep the user-scope and medley reassessment, and add 'Refs #6476' with a note that criterion 1 (the trims) is delivered by that rollout. (3) In #6476, order the fleet rollout to start with the plugins owning the longest descriptions (testing, mutation-testing, visualization, bugs, evals, review, writing, playbooks, coupling), one draft PR per plugin, each run attended with measure-invocation probes and claude plugin eval before and after, per the #6476 measurement section. (4) Leave .claude/settings.json at 0.07 until the post-rollout re-measure; then one PR to .claude/settings.json and docs/cloud-sessions.md (and the CI step under Option B), verified by a fresh-session listing capture through /harness-ops:audit-skill-visibility --installed --context-window 1000000 --listing-capture. (5) Where check-listing-budget.sh is used for the fit verdict, pass the 3-bytes-per-token budget explicitly (CHECK_SKILL_LISTING_BUDGET_CHARS), since the script's 4 chars/token default overstates headroom for current models.
Researched by two independent agents (local evidence and upstream docs) and adjudicated by a third.
kyle-sexton commentedon Oct 24, 2026
Released by the owner's HITL session (2026-10-24, C12): it waited only on a removed gate. Intake triage re-runs on it to set its fields, then admission takes it.
kyle-sexton commentedon Oct 24, 2026
Needs a run of
claude(eval, probe or /usage), which the issue lane cannot do (pr-pipeline.yaml:289-314). The owner's HITL session runs it on the operator machine; no owner action needed.github-actions commentedon Oct 25, 2026
The triage sweep dispatched intake triage for this issue (attempt 1 of 2).
melodic-automation-lanes commentedon Oct 25, 2026
Not admitted to the issue lane yet: blocker #6476 is not closed by a listed human or a merge.