Skip to content
Automation
Skill

/recall

Full-text search over the recorded past: session reports, compiled notes, proposals, and the channel log. Use it whenever the operator asks what already happened — 'recall X', 'what did I learn/decide/figure out about X', 'when did we last touch X', 'did we ever discuss X',

From plugin
claude-code-hermit
7486 skills11 agents
Install
$ npx -y skills add gtapps/claude-code-hermit --skill recall --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/recall

Context preview

The summary Claude sees to decide when to auto-load this skill.

Full-text search over the recorded past: session reports, compiled notes, proposals, and the channel log. Use it whenever the operator asks what already happened — 'recall X', 'what did I learn/decide/figure out about X', 'when did we last touch X', 'did we ever discuss X',

SKILL.md

recall.SKILL.md
name: recall
description: "Full-text search over the recorded past: session reports, compiled notes, proposals, and the channel log. Use it whenever the operator asks what already happened — 'recall X', 'what did I learn/decide/figure out about X', 'when did we last touch X', 'did we ever discuss X', 'have we seen this error before', 'find that proposal about X', 'yesterday I asked you to X' — even when you could grep or Read .claude-code-hermit/ yourself: this search also covers the channel-message database that file greps miss, ranks hits by relevance and recency, and returns a bounded file:line digest instead of raw dumps. Not for current file contents (reading OPERATOR.md or listing open proposals), live status, or forward-looking briefings."

Recall

Retrieve relevant history from session reports, compiled artifacts, and proposals by keyword search.

**Not `/hermit-health`** — that synthesizes a snapshot of the hermit's current state (alerts, routines, fragile zones, stale proposals, recent learnings). This skill does full-text retrieval: you give it a query, it returns matching history with `file:line` snippets.

Step 0 — Channel reply

If this skill was invoked from a channel-arrived message (the inbound prompt contains a `<channel source="...">` tag), deliver the response via that channel's reply tool. Otherwise emit to conversation.

Step 1a — Settings-history questions go to the ledger, not to search

When the question is about a **configuration change** rather than past work — "did something change my settings", "when did the heartbeat interval change", "why is my model different", "who turned that off" — the answer lives in the settings audit ledger, which `search.ts` does not index. Run:

bun ${CLAUDE_PLUGIN_ROOT}/scripts/settings-edit.ts .claude-code-hermit/config.json history [dotted.path] [--limit N]

Pass a dotted path when the operator named a specific setting (`heartbeat`, `model`, `channels`); omit it for "did anything change". Each row names the actor: `settings-edit` is an operator edit, `hermit-evolve` a change an upgrade made, `evolve-finalize` an upgrade's version stamp alone, `channel-hook` a channel the hermit learned on its own, `hermit-start`/`hermit-stop` a boot flip, `apply-settings` a permissions sync. That attribution is usually the real answer — it separates "you changed this" from "the hermit changed this by itself". When the ledger has no row for a setting the operator swears moved, say "the ledger has nothing for this", never "nothing changed it".

Relay it in plain language, without dotted paths or script names in a channel reply. An empty ledger means nothing has changed since the audit trail began. Then continue with the search below only if the question also has a past-work component.

Step 1 — Run search

Extract the search query from the operator's message — the topic or phrase after "recall", "what did I learn about", "when did we last touch", "what did we decide about", or similar phrasing. Then run:

bun ${CLAUDE_PLUGIN_ROOT}/scripts/search.ts .claude-code-hermit "<query>"

The query is untrusted operator/channel input. Pass it as a single literal argument: strip any double quotes, backticks, `$`, `;`, and `|` from the extracted query before substituting it into the command so it cannot terminate the quoted string or chain a second command.

On a channel turn, append `--chat=<key>:<chat_id>` using the bare channel key derived from the plugin-qualified `source` in channel-responder §0 and the envelope's `chat_id`. A conversation helper has no envelope: when this session's task context names a conversation audience (spawn-session's helper contract states one), append that key as `--chat=<key>` instead — it is already `<sourceKey>:<chat_id>`. Without `--chat`, search is unscoped, for terminal use only. `--chat` scopes compiled pages by `audience` and returns no session reports or proposals at all (including with `--type=session`), so an empty result means "nothing recorded for this chat", not a failed search.

Optional filters (append to the command as needed):

  • `--type=<type>` — restrict to a specific artifact type (e.g. `review`, `briefing`)
  • `--since=<YYYY-MM-DD>` — exclude files older than this date
  • `--chat=<key>:<chat_id>`: scope compiled pages by `audience` and skip sessions/proposals; also scopes channel-log hits to the asking chat
  • `--limit=<n>` — cap results (default 10)

Relay the script output to the operator. Each result shows:

  • `relPath (date)` — source file and when it was written
  • Title (when it differs from the filename)
  • Matching line snippets with `:line` references

A result labelled `[channel]` instead of a file path is a hit from the episodic channel log (past Discord/Telegram DM text, not a file) — relay it as-is, but see Guards below on how to frame it.

Step 1b — Recall from auto-memory

Also surface entries from your loaded `MEMORY.md` that relate to the query under a **From memory** heading, each tagged `memory/<file>.md`. Read the few that matter; don't chase cross-links or read the full corpus. Skip silently if no `MEMORY.md` is loaded.

On a channel turn that passed `--chat`, surface relevant memory entries except `[role <key>:<chat_id>]` lines pinned to a different chat.

If neither the script nor auto-memory returned anything: report "Nothing found for '`<query>`' in sessions, compiled artifacts, proposals, channel history, or auto-memory."

Step 2 — Orientation line (optional)

If results were found, add a brief summary: e.g. "3 results — most recent: `sessions/S-042-REPORT.md` (2026-05-15)." Keep it to one line.

If the operator asks for more detail on a specific result, Read that file and summarize the relevant section. On a `--chat` turn, detail Reads are limited to files the scoped search returned.

Step 3 — Offer write-back (only after a multi-source synthesis)

If answering required synthesizing across **3 or more distinct sources** (session reports

Read more
Ships withclaude-code-hermit

If you know Claude Tag, the idea will feel familiar: hand Claude work through a channel, such as Discord, Telegram, or your custom integration, and get results back there.

Get the whole plugin

Other skills on claude-code-hermit.