skills/smoke-test/SKILL.md
Post-hatch validation — checks config, OPERATOR.md, plugin references, routines, and optionally sends a channel test message. Run after hatch to verify setup.
npx skillsauth add gtapps/claude-code-hermit smoke-testInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Validate the post-hatch setup. Produces a structured report with PASS/WARN/FAIL per check.
Track passed, warnings, failures counts. Collect output lines for the final report.
.claude-code-hermit/config.json
config.json missing or invalidconfig.json parsed${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json to get the current plugin versionconfig._hermit_versions["claude-code-hermit"] with the plugin version
version matches plugin (X.Y.Z)config version X.Y.Z != plugin X.Y.Z — run /claude-code-hermit:hermit-evolveagent_name, channels, env, heartbeat
missing required key: <key>.claude-code-hermit/OPERATOR.md exists
OPERATOR.md missing — run hatch or create manuallyOPERATOR.md is empty — fill in project context{{ placeholder patterns (NOT <!-- which are legitimate HTML comments)
OPERATOR.md contains unfilled {{ placeholdersOPERATOR.md readablescheduled_checks array from config.jsonskill field (format: /plugin:skill-name or plugin:skill-name)${CLAUDE_PLUGIN_ROOT}/../<plugin>/skills/<skill-name>/SKILL.mdscheduled_checks[N]: <id> resolvesscheduled_checks[N]: skill not found at <path> — may be installed globally (sibling directory layout is not guaranteed for marketplace installs)routines array from config.jsonid, schedule, skill, enabled): FAIL per missing keytime or days keys are present: FAIL routine "<id>" uses legacy "time"/"days" — migrate to "schedule" (5-field cron)schedule is a 5-field cron expression (space-separated, 5 fields: min hour dom month dow): FAIL if malformedskill contains : (plugin:skill-name format): FAIL with expected formatroutine "<id>" valid (<schedule>, <skill>)Template defaults: ${CLAUDE_PLUGIN_ROOT}/state-templates/ — alert-state.json.template, micro-proposals.json.template.
For each file: parse JSON. If missing or unparseable, rewrite from the corresponding template. If parseable but wrong shape, repair in place — backfill missing keys from template defaults, overwrite keys that exist with the wrong type, preserve all other existing data. Emit one WARN per file that needed repair (noting what was fixed), or PASS if valid.
.claude-code-hermit/state/alert-state.json — object with: alerts (object), self_eval (object), total_ticks (number), last_digest_date (any, presence required)
alerts: {}, self_eval: {}, total_ticks: 0, last_digest_date: null) → WARN alert-state.json repaired: <keys>.claude-code-hermit/state/micro-proposals.json — object with pending key (array)
pending key (and active key present): migrate — read active value; if non-null, set pending: [<active value>]; if null, set pending: []; remove active key → WARN micro-proposals.json migrated: active → pendingpending key (and no active key): add "pending": [] → WARN micro-proposals.json missing pending key — backfilledpending is not an array: overwrite with [] → WARN micro-proposals.json pending is not an array — reset"Smoke test — channel is working." (include agent name if configured)<channel> test message sent<channel> test message failed: <error><channel> plugin not available for testOutput each check result as exactly one line:
PASS config.json parsed and version matches plugin (0.3.4)
WARN OPERATOR.md contains unfilled {{ placeholders
WARN scheduled_checks[0]: skill not found at ../claude-code-setup/skills/claude-automation-recommender — may be installed globally
PASS routine "heartbeat-restart" valid (0 4 * * *, claude-code-hermit:heartbeat start)
PASS routine "morning" valid (0 9 * * *, claude-code-hermit:reflect)
FAIL routine "bad" uses legacy "time" field — migrate to "schedule" (5-field cron)
Summary line at end:
Smoke test: 4 passed, 1 warning, 1 failed
For each FAIL, include a remediation hint on the same line or the line after.
tools
Composes and delivers the daily fitness brief — a forward-looking morning read (readiness + today's plan) or a backward-looking evening read (today's training, or an earned-rest note, + tomorrow's setup) — in the operator's configured voice. Invoke with /claude-code-fitness-hermit:fitness-brief --morning|--evening|--slot <name>. Becomes the plugin's two daily beats — the morning Strava connectivity check and the evening activity sync, RPE binding, and Run deep-dive.
development
Renew the hermit's long-lived Claude login token over the channel, before it expires. Relays a one-time sign-in link to the operator, takes the code back, installs the new token, and restarts. Activates on messages like 'relogin', 'renew my login', 'reauth', 'the login is expiring', or when doctor's credential-expiry check flags setup-token.
development
Synthesizes the past 7 days of archived briefs into a weekly digest — top stories, emerging vs faded themes, category activity, and per-source performance built from archive frontmatter. Delivers to the operator's configured channel and archives a weekly note. Designed as a weekly routine. Invoke with /feed-hermit:weekly-digest.
development
Manage developing story arcs tracked across briefs — add, resolve, and list active arcs in compiled/story-arcs-*.md. Arc Watch keywords drive the feed-brief arc-tagging enrichment. Invoke with /feed-hermit:story-arcs add|resolve|list.