Skip to content

perf(skills): trim skill descriptions until the listing fits, then lower skillListingBudgetFraction #6846

Open

Description

@kyle-sexton

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:audit 1,010, mutation-testing:audit 1,007, visualization:visualize 996, bugs:scan 993, evals:plugin-eval 993, review:audit-enforceability 991, writing:be-concise 986, playbooks:fable-5 985, coupling:reduce 982.
  • 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

  1. 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.
  2. Then re-measure and lower skillListingBudgetFraction in .claude/settings.json to the smallest value whose 1M/3 budget fits the measured listing with at least 15% headroom. Update docs/cloud-sessions.md's budget section to the new figures.
  3. 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.
  • skillListingBudgetFraction is 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.md states the new value and measurement.

Related

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.sh run with CHECK_SKILL_LISTING_BUDGET_CHARS set to the 1M-window, 3-bytes-per-token budget for the new fraction reports at least 15% headroom.
  • .claude/settings.json holds the new skillListingBudgetFraction, 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-capture shows 0 descriptions shed at the new value.
  • docs/cloud-sessions.md states the new value and the measurement.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 10, 2026
  2. github-actions commented on Oct 10, 2026

    @github-actions
    Contributor

    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

    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.

    [quote truncated; the full decision is at the link]

    #6846 (comment)

    The decision settles the open questions. The remaining work is to re-measure the listing after the #6476 trims, set the new skillListingBudgetFraction in .claude/settings.json, and update docs/cloud-sessions.md. The fresh-session listing capture needs an attended claude run, which this lane can't do. It is not a reason to hold the rest.

    Automated triage, applied by the lanes App.

  3. kyle-sexton commented on Oct 11, 2026

    @kyle-sexton
    MemberAuthor

    Overnight worker: stopped before any change. One decision is needed first.

    Question: which budget target does this issue serve?

    The two recorded positions conflict:

    Acceptance criteria 2 and 3 here (lowered fraction, 0 shed) only make sense under the second position.

    Options:

    1. (Recommended) The chore(config): raise skillListingBudgetFraction to 0.07 so every description fits #6805 position stands. Keep an override, trim, then lower it as this issue says. Record on feat(context-budget): keep plugin skill descriptions visible when the skill listing overflows #6458 that its item 1 is superseded. Reason: it is the later of the two, and at 0.01 on a 1M window (about 30,000 characters at 3 bytes per token), no amount of trimming fits this repo's listing alone.
    2. The feat(context-budget): keep plugin skill descriptions visible when the skill listing overflows #6458 position stands. Rewrite this issue to "trim descriptions, then remove the override", and drop criteria 2 and 3.
    3. Split the work. File the trims as their own issue, since both positions want them, and decide the fraction after the trims are measured.

    Second blocker, whichever option you pick: the trims cannot ship from an unattended run tonight.

    • The skill criteria (plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md, Measurement) require a model-graded before/after trigger-rate run for each trimmed description. The lexical listing-overlap floor is only a tripwire.
    • /skill-quality:check says fleet-wide description rewrites stay attended.
    • This worker's worktree isolation refuses claude plugin eval.

    Current state:

    • No branch and no commits. Nothing was changed.
    • One measurement for whoever picks this up, taken at 8fa9df0 by a frontmatter scan of plugins/*/skills/*/SKILL.md, skipping disable-model-invocation:
      • This repo has 280 listing-eligible skills, with 146,814 description characters in total.
      • The 50 longest add up to 42,971 characters, and the shortest of them is 684.
      • Halving those 50 saves about 21,500 characters. That is short of the 28,000 in criterion 1, so either more skills get trimmed or the target counts skills from outside this repo too (the 177k measure was an installed listing).

    Next step once you answer: an attended session takes the first batch, for example the 10 longest from testing:audit (1,010) down to skill-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, with Refs: #6846.

    I added needs-human to this issue.


    Generated by Claude Code

  4. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 11, 2026
  5. kyle-sexton commented on Oct 11, 2026

    @kyle-sexton
    MemberAuthor

    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-status by design until it is marked ready.


    Generated by Claude Code

  6. kyle-sexton commented on Oct 13, 2026

    @kyle-sexton
    MemberAuthor

    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.

  7. added theissue type on Oct 15, 2026
  8. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 15, 2026
  9. kyle-sexton commented on Oct 24, 2026

    @kyle-sexton
    MemberAuthor

    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.

  10. kyle-sexton commented on Oct 24, 2026

    @kyle-sexton
    MemberAuthor

    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.

  11. github-actions commented on Oct 25, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  12. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    on Oct 25, 2026
  13. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: blocker #6476 is not closed by a listed human or a merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    No fields configured for Task.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions