Skip to content

bug(doctor): "Deployed Skill Count" check ignores skillListingBudgetFraction override; warns persistently after remediation #119

@ChronodeAi

Description

@ChronodeAi

TL;DR

aiwg doctor has two checks that measure the same thing (deployed skill listing tokens) against different baselines. The "Skill Budget" check correctly reads skillListingBudgetFraction from ~/.claude/settings.json and flips to ✓ when the user raises the budget. The "Deployed Skill Count" check is hard-coded to compare against the vendor default (500 tokens) and continues to warn even after the user has taken the documented remediation. Result: doctor produces a persistent, redundant warning that can't be cleared without removing skills.

Environment (REQUIRED — issues missing any field will be returned for clarification)

  • AIWG version: 2026.5.12 [stable]
  • Operating system: Darwin mac-studio.tail10294f.ts.net 24.6.0 Darwin Kernel Version 24.6.0: Mon Jan 19 22:01:58 PST 2026; root:xnu-11417.140.69.708.3~1/RELEASE_ARM64_T6041 arm64
  • Provider (the AIWG harness you were running): claude-code
  • Node version: v26.0.0
  • Install location: npm-global

Steps to reproduce

# 1. Deploy enough skills to exceed the 500-token default
aiwg use all --provider claude

# 2. Verify doctor warns about both checks
aiwg doctor 2>&1 | grep -E "Skill Budget|Deployed Skill Count"
# ⚠ Claude Code Skill Budget: EXCEEDS DEFAULT (2.58×) — ...
# ⚠ Claude Code Deployed Skill Count: 28 deployed skills estimate 1,289 tokens, above ...

# 3. Apply the documented remediation: raise the budget fraction
# (edit ~/.claude/settings.json to add "skillListingBudgetFraction": 0.03)

# 4. Re-run doctor
aiwg doctor 2>&1 | grep -E "Skill Budget|Deployed Skill Count"

Expected behavior

Both checks should respect the user's skillListingBudgetFraction override. After raising the budget to cover deployed skills, both should report ✓.

Actual behavior

Only the "Skill Budget" check flips to ✓. The "Deployed Skill Count" check continues to warn against the vendor default:

✓ Claude Code Skill Budget: tight (0.86×) — 28 skills (avg 165 chars desc), est. 1,289 tokens vs 1,500 tokens budget — 3.00% × 200,000 ctx (override in ~/.claude/settings.json)
⚠ Claude Code Deployed Skill Count: 28 deployed skills estimate 1,289 tokens, above Claude Code's default listing budget (500 tokens). Run `aiwg use all` for workspace-aware filtering or `aiwg list --deployed` to inspect include/exclude reasons.

The two checks now contradict each other: one says "your configured budget is fine", the other says "you're above the default" — without acknowledging the user has explicitly opted out of the default.

Suggested fix

tools/cli/doctor.mjs line 246-253 (the "Deployed Skill Count" check) is hard-coded to use defaultBudgetTokens. The "Skill Budget" check (around line 321-338) already reads the configured fraction and computes the effective budget. The Deployed Skill Count check should use the same effective budget:

// Current (line 246-253):
if (provName === 'claude') {
  const defaultBudgetTokens = Math.floor(
    (CLAUDE_DEFAULT_CONTEXT_WINDOW * CLAUDE_DEFAULT_BUDGET_FRACTION) / CHARS_PER_TOKEN,
  );
  if (stats.totalTokens > defaultBudgetTokens) {
    check(`${label} Deployed Skill Count`, 'warn', `... above Claude Code's default listing budget ...`);
  }
}

// Suggested: read the configured fraction (same code path as the Skill Budget check)
const fraction = readSkillListingBudgetFraction() ?? CLAUDE_DEFAULT_BUDGET_FRACTION;
const effectiveBudgetTokens = Math.floor(
  (CLAUDE_DEFAULT_CONTEXT_WINDOW * fraction) / CHARS_PER_TOKEN,
);
if (stats.totalTokens > effectiveBudgetTokens) {
  check(`${label} Deployed Skill Count`, 'warn', `... above your configured listing budget (${effectiveBudgetTokens} tokens) ...`);
}

Alternatively, if the intent of "Deployed Skill Count" is specifically to surface "you're above vendor defaults" as an informational note, drop the redundant warn severity to note/info-level (the marker doctor already uses for optional things) so it doesn't count against the warning total.

The first option is cleaner — having two warn-severity checks for the same condition that disagree on their baseline is confusing.

Acceptance criteria

  • After setting skillListingBudgetFraction to a value that covers the deployed skill tokens, both the "Skill Budget" and "Deployed Skill Count" checks pass.
  • Doctor warning count is consistent — no redundant warnings for the same condition once the user has applied the documented remediation.
  • Documentation for aiwg doctor describes whether "Deployed Skill Count" reads the override or stays pinned to defaults (so behavior is unambiguous either way).

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions