hermit-health
Show alert state, pending task decisions, routine engagement, knowledge state, channel availability, plus fragile zones, long-waiting decisions, and recent learnings. Activates on messages like 'health check', 'how's the hermit', 'is anything broken', 'hermit health', 'system health', 'anything wrong', 'hermitd status', 'hermit brain', 'are routines running', 'what's stuck', 'any fragile zones', 'show me what's blocked', 'recent learnings', 'what have you learned lately', 'where are the weak spots', 'check knowledge', 'lint knowledge', 'knowledge health'.
- License 许可
- MIT
- 所属仓库
- gtapps/hermitd
- 最近更新
- 2026-11-11
- Stars
- ★ 84
- Forks
- 16
01 前言 Front Matter
- name
- hermit-health
- model
- haiku
- description
- Show alert state, pending task decisions, routine engagement, knowledge state, channel availability, plus fragile zones, long-waiting decisions, and recent learnings. Activates on messages like 'health check', 'how's the hermit', 'is anything broken', 'hermit health', 'system health', 'anything wrong', 'hermitd status', 'hermit brain', 'are routines running', 'what's stuck', 'any fragile zones', 'show me what's blocked', 'recent learnings', 'what have you learned lately', 'where are the weak spots', 'check knowledge', 'lint knowledge', 'knowledge health'.
02 资源文件 1
- 参考文档reference.md1009 B
03 SKILL.md 正文
Hermit Health
Synthesize a compact "state of the hermit" snapshot in two halves: infrastructure (active alerts, pending decisions, routine engagement, knowledge state, channel readiness) and analysis (fragile zones, long-waiting decisions, recent learnings). Everything is read directly in main — this skill is on-demand and runner-free.
Step 0 — Channel reply
If this skill was invoked from a channel-arrived message (the inbound prompt contains a <channel source="..."> tag), reply via that channel's reply tool. Otherwise emit to conversation.
Scope
Read the following (gracefully skip any file that doesn't exist). The sources are independent — read them concurrently:
.hermit/state/alert-state.json— thealertsobject, keyed by alert id (checklist:*,custom:*). Each entry hastext,count,first_seen,last_seen,suppressed,consecutive_clean..hermit/state/runtime.json—last_activity,session_id..hermit/state/reflection-state.json—last_reflectiontimestamp,counters(includingjudge_suppress_by_codemap and run/output fields), and run/output counters..hermit/config.json—routinesarray (id, schedule, enabled);channelsobject (each channel'sdefault_chat_id).bun ${CLAUDE_PLUGIN_ROOT}/scripts/task.ts list .hermit --open --limit 20 --jsonfor open tasks and their pending decisions. Usetotalfor the open count, describe only the returned sample, and reportomittedrather than scanning more files. A proposal is a task withkind: proposal; authority, purpose and wait age come from its decision and record, never a separate queue.- Glob counts:
.hermit/raw/**(excluding.archive/),.hermit/compiled/**,.hermit/raw/.archive/**. bun ${CLAUDE_PLUGIN_ROOT}/scripts/task-report.ts .hermit --limit 5for normalized recent task records: titles, outcomes, waiting reasons and lessons. Never read frozen session archives or the old live shell document.
Analysis
Alerts: From alert-state.json → alerts, active means suppressed is not true; suppressed ones are digest-only and reported separately. Compute each entry's age from first_seen. Report the active count with the oldest entry's text and age, then the suppressed count with its oldest age. If no active entries: "No active alerts" (still name the suppressed count when there is one).
Proposal queue: Count proposals with status: proposed (pending operator review), status: accepted (in flight, not yet resolved), and status: in_progress. If all zero: "Queue empty."
Routine engagement: From config.json.routines, list each routine and its schedule. For the reflect routine, use reflection-state.json → last_reflection to show when it last ran; also append counter info from reflection-state.json → counters: apply the reflect-line rules below, then append the suppress-mix suffix if any judge_suppress_by_code code has a non-zero count: suppress mix — no-evidence:N, covered-by-memory:N, no-sessions:N (omit codes with count 0; omit the suffix entirely when all counts are 0 or the map is absent). For every routine, run bun ${CLAUDE_PLUGIN_ROOT}/scripts/routines.ts health .hermit once and take last run, fire count and skip reason from its rows.
Reflect-line rules (applied to the reflect routine bullet):
- If
countersis absent: omit the counter clause entirely - If
total_runsis 0: showno runs yet (since YYYY-MM-DD)where the date iscounters.since - Otherwise:
N runs, N empty | output: N proposal tasks, N input decisions | since YYYY-MM-DDwhere the date iscounters.since; omit| output: ...if bothproposals_createdandmicro_proposals_queuedare 0
Micro: Count entries with status: "pending" in pending decisions.json. Omit this section entirely if count is zero.
Knowledge: Report glob counts for raw (excl. archive), compiled, and archived files. Omit if all three are zero and the directories are missing. If the operator explicitly asked to check or lint knowledge ("check knowledge", "lint knowledge", "knowledge health"), also run bun ${CLAUDE_PLUGIN_ROOT}/scripts/knowledge-lint.ts .hermit and list its findings by type (file, age in days, detail) beneath the counts, each type with its fix from reference.md. It is read-only.
Channel availability: From config.json.channels, for each configured channel, check whether default_chat_id is set — the same home field the outbound resolver uses. Report "ready" or "not yet paired (no chat id — send a message first)".
Fragile zones: From the last five normalized task records, identify repeated themes in cancelled outcomes and open waiting reasons. Combine these with proposal tags for dismissed or blocked proposals. Surface the top two or three themes with the actual outcomes; unconfirmed is not completed. If none recur, report "No fragile zones detected."
Stale proposals: From proposals, find those with status: accepted and resolved_date absent or null. Sort by accepted_date ascending (oldest first). Show up to 3. Compute days open = today minus accepted_date. If none: "No accepted proposals awaiting resolution."
Recent learnings: From reflection-state.json, read queue entries with status: accepted or status: pending and surface the most recent 3 question/observation fields. If the queue is empty or absent, use the normalized records’ lessons. Surface top 3. If nothing: "No recent learnings — reflect hasn't run yet."
Output
Reply in ≤1500 chars. Use exactly this section structure:
### Alerts
- N active (oldest: [text] Xd ago), M suppressed (oldest Xd ago) [with N = 0: "No active alerts, M suppressed (oldest Xd ago)"; omit the suppressed clause entirely when M is 0]
(or: Alerts — alert-state.json not found (hermit not yet initialized).)
### Proposal queue
- N proposed (pending review), N accepted (in flight), N in_progress
(or: Queue empty.)
### Routine engagement
- [id]: enabled, schedule [cron], [last ran Xh ago | N runs, N empty | output: N proposal tasks, N input decisions | since YYYY-MM-DD] [suppress mix suffix if applicable]
- [id]: disabled
(or: Routine engagement — config.json not found.)
### Micro
- N pending decision
(omit section entirely if zero pending)
### Knowledge
- N raw, N compiled, N archived
### Channel availability
- [channel]: ready (chat id set) [or "not yet paired"]
(or: No channels configured — type /hermitd:channel-setup in a terminal or the Claude app.)
### Fragile zones
- [tag or theme]: [one-line reason]
(or: No fragile zones detected — no recurring cancelled or waiting tasks yet.)
### Stale proposals
- T-...: [title] (accepted N days ago)
(or: No accepted proposals awaiting resolution.)
### Recent learnings
- [learning]
(or: No recent learnings — reflect hasn't run yet.)
Omit sections that have no data rather than showing a heading with an empty body. Keep each bullet to one line. If the assembled report would exceed 1500 chars, keep Alerts, Proposal queue, and Fragile zones in full and truncate the longer lists (Routine engagement, Recent learnings) to their top 2 entries.
04 同仓库更多 Skills
dream
Nightly memory maintenance from transcript ground truth. Verifies, enriches and tidies auto-memory and topic pages with snapshot validation and undo. Also handles 'undo the dream'.
when-done-switch-to
Arm a deferred model or effort switch. Use for "when done switch to", "after this drop to sonnet", or "switch model when idle".
weekly-review
Generate the weekly review report for the current ISO week. Writes to .hermit/compiled/review-weekly-YYYY-Www.md (dev-facing detail) and sends a plain-language channel summary (Delivered / Decisions / Waiting on you / Spend). Runs every Sunday at 23:00 via routine.
watch
Background events via the config watch monitor or ad-hoc Monitor tool. Quiet watches cost zero tokens.
watch-activate
Activate the config watch monitor.
voice-notes
Transcribe and respond to voice notes. Activates when any channel message carries an audio attachment, or when asked to transcribe an inbound voice message.