/brief
Returns a 5-line executive summary of recent work. Checks open records first, then recent task outcomes. Activates on messages like "brief", "what happened", "morning update", "overnight summary", "progress", "what are you working on", "how's it going".
Claude Code
$ npx -y skills add gtapps/hermitd --skill brief --agent claude-code
Codex
$ npx skills add gtapps/hermitd --skill brief -a codex -y
Cursor
$ npx skills add gtapps/hermitd --skill brief -a cursor -y
Gemini CLI
$ npx skills add gtapps/hermitd --skill brief -a gemini-cli -y
GitHub Copilot
$ npx skills add gtapps/hermitd --skill brief -a github-copilot -y
OpenCode
$ npx skills add gtapps/hermitd --skill brief -a opencode -y
Windsurf
$ npx skills add gtapps/hermitd --skill brief -a windsurf -y
SKILL.md
brief.SKILL.mdname: brief
description: Returns a 5-line executive summary of recent work. Checks open records first, then recent task outcomes. Activates on messages like "brief", "what happened", "morning update", "overnight summary", "progress", "what are you working on", "how's it going".
Task Brief
Provide a concise executive summary of recent task activity. Designed for morning check-ins, phone/channel consumption, and quick status updates.
Commands
- `brief-digest`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/brief-digest.ts .hermit`
- `artifact-render`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/artifact.ts render <type> .hermit`
Always-On Delivery Rule
If `config.always_on` is `true`, deliver all operator-facing output per `prompts/resident.md § Operator Notification`. The terminal is unmonitored in always-on mode. For the push-fallback branch, condense the brief to a single line (per § Operator Notification push format): include whichever of waiting decision count and active heartbeat alerts are present and non-zero; omit zero or unavailable fields. Example: `Brief: 16 decisions waiting, 1 alert — open CC to view`. In interactive mode, output to terminal. This applies to all flags below.
Dispatch
Resolve scope before composing or dispatching any brief:
1. Build `<selector>`: when told `This is routine <id>.`, use `--routine <id>`; otherwise, when asked in a chat, use `--chat <source>:<chat_id>` from that message's conversation key, including its `~<thread>` suffix when the channel maps threads; otherwise, from the terminal or Remote Control, use `--agent`. 2. Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/brief-digest.ts .hermit context <selector>` before any other step. Its `scope` decides which records the brief covers. When its `agent_steps` is `false`, skip agent-wide admin decisions, duties, the upgrade check, `last-brief.json` writes, dashboard refresh and `OPERATOR.md` priorities. Deliver to the answering chat; a routine uses its resolved `destination`. 3. Resolve the active flag (`--morning`, `--evening`, "brief today"/"daily summary"/"what happened today", or no flag). 4. For morning, evening and daily, always dispatch `hermitd:skill-eval-runner` pointed at `${CLAUDE_PLUGIN_ROOT}/skills/brief/reference.md`. Do not compose the brief before the runner returns. After context, dispatch before any other read or mutation. 5. For a no-flag brief, read only `bun ${CLAUDE_PLUGIN_ROOT}/scripts/brief-digest.ts .hermit morning <selector>`, compose in main, and never dispatch.
Read the digest fresh each turn. Pass the runner `plugin_root` (resolved absolute path), `mode` (`morning`, `evening`, or `daily`) and the exact selector arguments (`--agent`, `--routine <id>` or `--chat <key>`). The digest already enforces `agent_steps` and chat scope for `decisions_pending`; never age a queue or make a separate decision read.
Copy this skill's Commands entries verbatim into the dispatch prompt (already absolute); the runner uses them with the reference's arguments.
Every mode uses `brief-digest` for bounded task, duty and pending-decision data. Keep the project root as the working directory, including in the runner; do not change into `plugin_root`. Never open frozen session archives. If the runner fails or returns malformed JSON, read `${CLAUDE_PLUGIN_ROOT}/skills/brief/reference.md` and follow it for the active mode with the same selector.
**Eval runner return schema** — the runner returns a JSON object conforming to this block. The schema is byte-identical in `reference.md` (producer) and here (consumer); a contract test asserts this.
<!-- brief-eval-schema:start -->
{
"report_summary": { "date": "<ISO>", "tags": ["<tag>"], "working_on": "<one-line>",
"status": "<completed|partial|blocked>", "next_start_point": "<text>" }|null,
"tasks_today": [ { "task": "T-...", "summary": "<one-line>" } ],
"findings": ["<text>"],
"decisions": ["<text>"],
"tomorrow": ["<text>"],
"decisions_pending": ["<title and waiting authority>"],
"operator_priorities": ["<text>"],
"queued_work": ["<text>"],
"waiting": [ { "title": "<text>", "state": "<finishing|unconfirmed|waiting>", "waiting_on": "<key>"|null } ],
"duties": ["<one line: name, requested, observed>"],
"omitted": { "clipped": 0, "lessons": 0, "records": 0, "decisions": 0, "open": 0, "decisions_pending": 0, "duties": 0 }
}<!-- brief-eval-schema:end -->
Compose `runner.waiting` entries in the operator's language from `title`, `state` and `waiting_on`: `finishing` means nothing is needed from the operator; `unconfirmed` means a result awaits confirmation, from `waiting_on` when set; `waiting` means work needs the named party. For every routine brief, say plainly when `runner.omitted` has non-zero counts, including clipped text and items left out. When `scope` is `chat`, `omitted.open` counts work that belongs to other chats: never mention it, and never read task records, `TASKS.md`, memory or the channel log to find it. A chat-scoped brief names only the work the digest returned.
Flags
--morning (routine mode)
**Delivery:** For `agent_steps: false`, skip the `last-brief.json` write and dashboard refresh and deliver per the Always-On Delivery Rule. For `agent_steps: true`, write the full composed brief text (before any push-fallback single-line condensing) to `.hermit/state/last-brief.json` as `{"kind":"morning","text":"<brief text>","generated_at":"<now, ISO>"}`, so the dashboard's "latest brief" section can pick it up. Then refresh the dashboard per `${CLAUDE_PLUGIN_ROOT}/docs/artifacts.md`; if it returns a URL, append a final line `📎 <url>`. Then deliver the brief to the operator (see Always-On Delivery Rule above).
Emphasize forward-looking content. Compose from runner JSON (see Dispatch above) and live main-session data:
- **Waiting decisions:** use `runner.decisions_pending`
- **Operator priorities:** use `runner.operator_priorities`
- **Queued work:** use `runner.queued_work`
- **Waiting
Read more
name: brief description: Returns a 5-line executive summary of recent work. Checks open records first, then recent task outcomes. Activates on messages like "brief", "what happened", "morning update", "overnight summary", "progress", "what are you working on", "how's it going".
Task Brief
Provide a concise executive summary of recent task activity. Designed for morning check-ins, phone/channel consumption, and quick status updates.
Commands
- `brief-digest`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/brief-digest.ts .hermit`
- `artifact-render`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/artifact.ts render <type> .hermit`
Always-On Delivery Rule
If `config.always_on` is `true`, deliver all operator-facing output per `prompts/resident.md § Operator Notification`. The terminal is unmonitored in always-on mode. For the push-fallback branch, condense the brief to a single line (per § Operator Notification push format): include whichever of waiting decision count and active heartbeat alerts are present and non-zero; omit zero or unavailable fields. Example: `Brief: 16 decisions waiting, 1 alert — open CC to view`. In interactive mode, output to terminal. This applies to all flags below.
Dispatch
Resolve scope before composing or dispatching any brief:
1. Build `<selector>`: when told `This is routine <id>.`, use `--routine <id>`; otherwise, when asked in a chat, use `--chat <source>:<chat_id>` from that message's conversation key, including its `~<thread>` suffix when the channel maps threads; otherwise, from the terminal or Remote Control, use `--agent`. 2. Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/brief-digest.ts .hermit context <selector>` before any other step. Its `scope` decides which records the brief covers. When its `agent_steps` is `false`, skip agent-wide admin decisions, duties, the upgrade check, `last-brief.json` writes, dashboard refresh and `OPERATOR.md` priorities. Deliver to the answering chat; a routine uses its resolved `destination`. 3. Resolve the active flag (`--morning`, `--evening`, "brief today"/"daily summary"/"what happened today", or no flag). 4. For morning, evening and daily, always dispatch `hermitd:skill-eval-runner` pointed at `${CLAUDE_PLUGIN_ROOT}/skills/brief/reference.md`. Do not compose the brief before the runner returns. After context, dispatch before any other read or mutation. 5. For a no-flag brief, read only `bun ${CLAUDE_PLUGIN_ROOT}/scripts/brief-digest.ts .hermit morning <selector>`, compose in main, and never dispatch.
Read the digest fresh each turn. Pass the runner `plugin_root` (resolved absolute path), `mode` (`morning`, `evening`, or `daily`) and the exact selector arguments (`--agent`, `--routine <id>` or `--chat <key>`). The digest already enforces `agent_steps` and chat scope for `decisions_pending`; never age a queue or make a separate decision read.
Copy this skill's Commands entries verbatim into the dispatch prompt (already absolute); the runner uses them with the reference's arguments.
Every mode uses `brief-digest` for bounded task, duty and pending-decision data. Keep the project root as the working directory, including in the runner; do not change into `plugin_root`. Never open frozen session archives. If the runner fails or returns malformed JSON, read `${CLAUDE_PLUGIN_ROOT}/skills/brief/reference.md` and follow it for the active mode with the same selector.
**Eval runner return schema** — the runner returns a JSON object conforming to this block. The schema is byte-identical in `reference.md` (producer) and here (consumer); a contract test asserts this.
<!-- brief-eval-schema:start -->
{
"report_summary": { "date": "<ISO>", "tags": ["<tag>"], "working_on": "<one-line>",
"status": "<completed|partial|blocked>", "next_start_point": "<text>" }|null,
"tasks_today": [ { "task": "T-...", "summary": "<one-line>" } ],
"findings": ["<text>"],
"decisions": ["<text>"],
"tomorrow": ["<text>"],
"decisions_pending": ["<title and waiting authority>"],
"operator_priorities": ["<text>"],
"queued_work": ["<text>"],
"waiting": [ { "title": "<text>", "state": "<finishing|unconfirmed|waiting>", "waiting_on": "<key>"|null } ],
"duties": ["<one line: name, requested, observed>"],
"omitted": { "clipped": 0, "lessons": 0, "records": 0, "decisions": 0, "open": 0, "decisions_pending": 0, "duties": 0 }
}<!-- brief-eval-schema:end -->
Compose `runner.waiting` entries in the operator's language from `title`, `state` and `waiting_on`: `finishing` means nothing is needed from the operator; `unconfirmed` means a result awaits confirmation, from `waiting_on` when set; `waiting` means work needs the named party. For every routine brief, say plainly when `runner.omitted` has non-zero counts, including clipped text and items left out. When `scope` is `chat`, `omitted.open` counts work that belongs to other chats: never mention it, and never read task records, `TASKS.md`, memory or the channel log to find it. A chat-scoped brief names only the work the digest returned.
Flags
--morning (routine mode)
**Delivery:** For `agent_steps: false`, skip the `last-brief.json` write and dashboard refresh and deliver per the Always-On Delivery Rule. For `agent_steps: true`, write the full composed brief text (before any push-fallback single-line condensing) to `.hermit/state/last-brief.json` as `{"kind":"morning","text":"<brief text>","generated_at":"<now, ISO>"}`, so the dashboard's "latest brief" section can pick it up. Then refresh the dashboard per `${CLAUDE_PLUGIN_ROOT}/docs/artifacts.md`; if it returns a URL, append a final line `📎 <url>`. Then deliver the brief to the operator (see Always-On Delivery Rule above).
Emphasize forward-looking content. Compose from runner JSON (see Dispatch above) and live main-session data:
- **Waiting decisions:** use `runner.decisions_pending`
- **Operator priorities:** use `runner.operator_priorities`
- **Queued work:** use `runner.queued_work`
- **Waiting
Run an always-on Claude Code agent on your own machine, for you or your team. Start and orchestrate sessions from chat in any project it can reach. Take over the same session in the Claude app or the CLI.
Other skills on hermitd.
More skills from other plugins.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…
Questions about brief.
- Which coding agents can use brief?
- brief installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

