build-plugins.sh generates 35 wrapper files so user-invocable skills appear
as slash commands, with a note to delete them "when #18949 ships". The label says OPEN,
but it was last confirmed against CC 2.1.183 and we run 2.1.226. The milestone's whole
lesson: labels are not evidence. So we asked the binary.
fixture A CONTROL built plugin, commands/ present fixture B PROBE identical, commands/ + plugin.json key removed both installed into isolated CLAUDE_CONFIG_DIRs (real marketplace path) loader's own counter read from <config>/debug/<session>.txt
[A] Total plugin commands loaded: 35 plugin skills: 105 [B] Total plugin commands loaded: 0 plugin skills: 105
KEEP. CC 2.1.226 holds commands and skills in separate registries. Without
commands/, user-invocable skills register as skills and never as commands.
#18949 still bites; the wrappers are load-bearing; the open label is accurate.
The control arm is what makes this a result: a probe whose harness cannot demonstrate the positive case proves nothing. A=35 is that demonstration.
npm run verify:cc-commands re-runs the probe against the newest installed
binary. Simulate a future run:
exit 0 wrappers still required (B=0, control healthy)
exit 1 TRIPPED — execute the DELETE branch (generator, 35 files,
passthrough test + ci.yml wiring, one commit)
exit 2 CANNOT OBSERVE — control broke or the debug line vanished;
no verdict either way, never a silent pass
Local / workflow_dispatch only: ci.yml never installs the CC binary, so wiring this into the PR gate would make it vacuously green — the #959 class this repo already paid for.
| kept | why |
|---|---|
| generate_command_from_skill | load-bearing at 2.1.226, probed not assumed |
| plugins/ork/commands/ ×35 | the only path to /ork:* slash commands |
| passthrough test + ci wiring | guards the wrappers that must exist |
Cost acknowledged: ~2.8k duplicated tokens/session (#2528). That is the price of the upstream bug, now with an automated exit ramp.