3.1 KiB
Row 64 probe: how a managed session gets its skills (2026-10-19)
Sage, 18:50Z to 18:53Z. Claude Code 2.1.303 (~/.local/bin/claude), pi
from the pinned @earendil-works/pi-coding-agent. Every Claude Code run
was a short -p with --model haiku, in an empty workspace, with
--restricted --strict-mcp-config --mcp-config '{"mcpServers":{}}' --permission-mode dontAsk --debug-file <log> and a probe plug-in passed
as --plugin-dir plug:
plug/.claude-plugin/plugin.json {"name":"mosaic-skills",...}
plug/skills/probe-alpha/SKILL.md name probe-alpha; "The probe word is ZEBRA-4471."
The operator's own ~/.claude/skills holds the ms-* skills, so a leak
would have shown up.
Claude Code
| Run | Tools | Settings | Skills offered | Result |
|---|---|---|---|---|
| A | --tools "" |
none | none | model: "I don't see any skills". Debug: Loaded 1 skills from plugin mosaic-skills, user: 0 |
| B | --tools Skill |
none | 14: probe-alpha plus Claude Code's own (loop, run, update-config, init, claude-api, dataviz, ...) | read the skill, printed ZEBRA-4471 |
| C1 | --tools Skill |
disableBundledSkills, disableSkillShellExecution |
2: probe-alpha, plugin-authoring | |
| C2 | --tools Skill |
env CLAUDE_CODE_DISABLE_BUNDLED_SKILLS=1 |
2: same | |
| D | --tools Skill |
C1 plus skillOverrides: {"plugin-authoring": "off"} |
1: probe-alpha | printed ZEBRA-4471. Debug still: getSkills returning: ... 2 bundled skills, 1 builtin plugin skills, Sending 1 skills via attachment |
| E | as D | as D | asked to call plugin-authoring, loop, update-config, run, init, claude-api, dataviz | all 7 refused at validation (Skill tool validation error: code=7 twice, code=2 five times); none loaded |
What it shows:
--restrictedkeeps user skills out (user: 0in every run).- A
--plugin-dirskill works only with theSkilltool on. With it on, "only the contracted skills" holds only through settings that name Claude Code's own skills (plugin-authoring), and two bundled skills stay loaded under names the log doesn't give. That list belongs to the Claude Code version. - The
Skilltool would be a new built-in on--tools, so the gate hook (PreToolUse*) would see it.
Pi
docs/skills.md:67-69 in the pinned package: at startup pi puts each
skill's name and description in the prompt, and "when a task matches, the
agent uses read, or bash when read is unavailable, to load the full
SKILL.md". packages/harness/src/gate.mjs:3-4: "every path argument of a
file tool must resolve inside the workspace". The bundle is in the run
directory, outside the workspace, so a --skill copy can't be read.
Choice
The skill text goes into prompt.md on both harnesses, rendered from the
bundle copies. Pi keeps --no-skills, Claude Code keeps
--disable-slash-commands and --restricted. Neither harness discovers a
skill, nothing new passes the gate, and the manifest's digests cover what
the model reads. The cost is the skill text in every turn's prompt: by
wc -c over the repo's skills/ copies, coder 16.9 KB, reviewer 16.3 KB,
cto 35.9 KB, pm 29.1 KB.