Skip to content

Show built-in Claude Code skill activations without scoring them - #223

Merged
edonadei merged 3 commits into
mainfrom
feat/220-auto-bundled-skills
Sep 28, 2026
Merged

edonadei merged 3 commits into
mainfrom
feat/220-auto-bundled-skills

Conversation

@edonadei

@edonadei edonadei commented Sep 28, 2026 •

Copy link
Copy Markdown
Owner

Closes #220.

Skills the agent CLI ships itself (Claude Code's claude-api, debug, …) stay discoverable in every run, isolated or not. Until now, one firing read as "nothing fired": the detector dropped any name outside the declared, user and plugin sets.

Change

  • Harness: claude-code reads the skills its init event lists. Any that are neither declared nor the user's own are recorded as built-in (AttemptResult.builtin_skill_names). Other backends return None, meaning not observed.
  • Attempt: ActivationDetector.detect_builtin applies the same matching rule to those names and records the result in a new AttemptRecord.builtin_activated. It is never scored, so activates: [] still passes.
  • Report: a Built-in skills claude-api 2/4 (ship with claude-code; not scored) line under the activation table, plus a built-in row in each attempt's details.
  • Docs: spec-reference, results, backends, CONTEXT (new term: Built-in skill), MIGRATING, README and both skill REFERENCE files. The old "a skill you don't declare can never activate" claim is gone.

Verification

  • New tests in test_attempt.py, test_claude_harness.py and test_reporter.py.
  • Live re-run of the Check claude-code for bundled-skill leakage and reference-file reads #217 probe (Claude Code 2.1.283, Haiku 4.5, isolated, k=2): the SDK task records activated=[], activation_passed=true, builtin_activated=["claude-api"], and the report shows Built-in skills claude-api 2/4 while activation stays at 100%.

What it looks like

Taken from the #217 probe run (caliper report --verbose).

A new line under the activation table. It only appears when a built-in skill fired, and it also shows on specs that have no activates::

 Activation  100.0%  ####################  (2 asserted tasks)

+----------------------------------------------------------------------+
| Skill           | wanted | fires when wanted | fires when not wanted |
|-----------------+--------+-------------------+-----------------------|
| unit-normalizer | 2 of 4 |       2/2  100.0% |           0/2    0.0% |
+----------------------------------------------------------------------+
 Built-in skills  claude-api 2/4  (ship with claude-code; not scored)

A built-in row in the attempt details. These panels show for tasks that didn't fully pass, or for every task with --verbose:

+- Anthropic SDK question  - trigger only -----------------------------------+
| should activate  (nothing — silence)                                        |
| OK Attempt 1     12.4s - 76K tok                                            |
|     built-in     claude-api                                                 |
|     output       ...                                                        |
| OK Attempt 2     19.6s - 149K tok                                           |
|     built-in     claude-api                                                 |
|     output       ...                                                        |

And in the results JSON, per attempt:

"activated": [],
"activation_passed": true,
"builtin_activated": ["claude-api"]

Devin Review

…g them

Skills the CLI ships inside its binary (claude-api, debug, ...) stay
discoverable in every run, isolated or not. The detector dropped any name
outside the declared and user sets, so a bundled skill winning a prompt read
as nothing firing.

claude-code now reads the skills it exposed from the init event; any that are
neither declared nor the user's own are auto-bundled. Their activations land
in AttemptRecord.bundled_activated and an 'Auto-bundled' line under the
activation table, and never count against activates:.

Closes #220

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

Devin Review

Comment thread caliper/activation.py Outdated
A plugin skill whose SKILL.md sits under a bundled skill's basename was also
credited to the bundled skill. detect_bundled now strips plugin paths first,
as detect does.
…ndled

'Auto-bundled' read as something Caliper bundled. The report now says
'Built-in skills  claude-api 2/4  (ship with claude-code; not scored)', and the
record field is builtin_activated.
@edonadei edonadei changed the title Show auto-bundled Claude Code skill activations without scoring them Show built-in Claude Code skill activations without scoring them Sep 28, 2026
@edonadei
edonadei merged commit 927c5d3 into main Sep 28, 2026
7 checks passed
@edonadei
edonadei deleted the feat/220-auto-bundled-skills branch September 28, 2026 03:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Show auto-bundled Claude Code skill activations without failing activates:

1 participant