Health check for the bb/pt/ctf workflow driver subsystem - verifies everything is in place so every machine runs the same. Checks vault-content consistency (scripts present, JSON valid, routing wired, all 69 tool pages carry phase:, the tool index resolves, the hook edits are in place) AND per-machine wiring (the three workflow skills symlinked, hooks registered, imports work), then runs a live init->board->next smoke test. Use when setting up the workflow on a new machine, after a vault sync, when the driver misbehaves, or on "bb-health", "campaign health", "is the workflow set up", "check hooks and scripts", "why is the board not working".
npx skills add https://github.com/Encod3d-Sec/TORCH --skill campaign-health
The vault syncs across machines; ~/.claude (hook registration, skill symlinks, deps) does not.
So "it works here" does not mean "it works there". This skill confirms both halves before you rely on
bb-workflow / pt-workflow / ctf-workflow on this machine.
python3 scripts/campaign-doctor.py # summary (only WARN/FAIL shown)
python3 scripts/campaign-doctor.py --verbose # every check
Exit 0 = all green. Exit 1 = at least one FAIL; the driver will not run correctly here until fixed.
approach exists in playbook.json and coverage-classes.json, the two hook edits (recon-capture
emits spec['tools'], tool-telemetry logs binaries) are present, all 69 wiki/tools/ pages carry
phase:, and campaign.tool_index() resolves an invocation for every tool.
~/.claude/skills,hooks are registered (via check-hooks.py), and _engagement imports.
init -> board -> next against a throwaway copy of the fixture, assertingthe board writes rows and next withholds the exploit at G1.
bash setup/install-skills.sh (skills) or bash setup/install-hooks.sh (hooks).
its phase:, re-run python3 scripts/tool-phase-backfill.py --write.
Run this first on any new machine, and after every vault sync, so all machines run the same driver.
Take encod3d-sec/campaign-health from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.