/reflect
Reflect on recent work and propose improvements if patterns are noticed.
Claude Code
$ npx -y skills add gtapps/hermitd --skill reflect --agent claude-code
Codex
$ npx skills add gtapps/hermitd --skill reflect -a codex -y
Cursor
$ npx skills add gtapps/hermitd --skill reflect -a cursor -y
Gemini CLI
$ npx skills add gtapps/hermitd --skill reflect -a gemini-cli -y
GitHub Copilot
$ npx skills add gtapps/hermitd --skill reflect -a github-copilot -y
OpenCode
$ npx skills add gtapps/hermitd --skill reflect -a opencode -y
Windsurf
$ npx skills add gtapps/hermitd --skill reflect -a windsurf -y
SKILL.md
reflect.SKILL.mdname: reflect
description: Reflect on recent work and propose improvements if patterns are noticed.
Record notes only inside an open record's turn, using `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task.ts note .hermit <id>` with the note on stdin. Otherwise skip record notes. Never edit a task file directly.
Reflect
Pause and think about your recent work.
**Silent by default.** Only notify the operator (per § Operator Notification) if reflect produces an outcome: a proposal task, a graduated observation, or a cost spike.
Rare-branch procedures live in `${CLAUDE_PLUGIN_ROOT}/skills/reflect/branches.md`. "Read branches.md § X" means: read that section now and follow it exactly — it is normative.
Commands
- `reflect-precheck`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/reflect-precheck.ts .hermit ${CLAUDE_PLUGIN_ROOT}`
- `update-reflection-state`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/update-reflection-state.ts .hermit/state/reflection-state.json`
- `routines-health`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/routines.ts health .hermit`
- `task-report`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task-report.ts .hermit --recent --limit 3`
- `observations-patterns`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/observations.ts patterns .hermit`
- `observations-observe`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/observations.ts observe .hermit`
- `proposal-anchor`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/proposal.ts anchor .hermit`
- `proposal-gate`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/proposal.ts gate .hermit`
- `task-note`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task.ts note .hermit`
Before writing a `quick-deferral` or `reflect-noticed` row, run `observations-patterns` (Commands) once per run. Reuse an existing label that names the same component and failure; create a short stable label only when none matches. Use that exact label on stdin for each observation.
Quick mode
If `$ARGUMENTS` contains `--quick`, read `${CLAUDE_PLUGIN_ROOT}/skills/reflect/quick.md`, follow it, and stop afterward.
Single-check mode
If `$ARGUMENTS` contains `--check-id` or `--check`, read branches.md § Scheduled checks and follow it exactly, then **stop** (no precheck or numbered steps below). The invocation is `reflect --check-id <id> --check <cmd…>`: everything after `--check` is the skill command, including its arguments, verbatim. A routine owns the cadence and may pin the model for this invocation.
Judge evidence handoff
For every `hermitd:reflection-judge` call, include `Task records:` with the fresh normalized adapter rows already read, preserving their `source_path`, outcome, title, lessons, and waiting reason. Candidate `Sessions:` identifiers for record evidence are task IDs from those source paths. A candidate outside that bounded evidence set needs another targeted adapter read, not an archive fallback.
Scheduled reflect
1. Determine whether a full run is warranted. With `--precheck-verdict '<verdict>'`: the reflect routine already ran the precheck in bash; use `<verdict>` directly, do **not** re-run it (always status `run`; the routine stops on `empty` without loading this skill). Otherwise run it yourself and read its JSON:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/reflect-precheck.ts .hermit ${CLAUDE_PLUGIN_ROOT}- status `empty` → nothing due; the precheck already updated `reflection-state.json`. Emit `reflect: no candidates` and stop.
- status `run` → continue. `phases` lists due phases (`cost_spike`, `behavior`, `compute`, `digest`, `newborn`, `observations_fresh`); skip sections for phases not listed. `observations_fresh` means the ledger has rows newer than `last_run_at`; run step 3b even if `compute` is absent.
2. Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task-report.ts .hermit --recent --limit 3` for the three most recent done, cancelled or unconfirmed records. Read `task.ts list .hermit --open --json` for the execution observation. Read fresh; never fall back to session archives. 3. If `cost_spike` is listed: the precheck already detected the spike and wrote the row (`cost-spike:<YYYY-MM-DD>` — the measured day, which is **yesterday**, carrying `day_total` and `median_7d` as fields), so there is nothing to read or record here — it graduates via step 3b like any other observation. Do **not** re-read cost-log.jsonl to restate a number the precheck already computed.
3a. **Behavioral digest** — if `behavior` is listed: run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/transcript-digest.ts .hermit --record-observation` (bounded ~20-line JSON of ground-truth counters — tool failures, tool_rejections by kind, wakes vs productive_wakes, compaction_events, subagent_dispatches; never `Read` a transcript directly). Two uses of the counters:
- **Defer-loop auto-row**: `--record-observation` makes the script write the `defer-loop` row itself when its own counters cross the threshold, citing the observed `window.from→to` span. Nothing to record here. (The flag is opt-in so an ad-hoc digest run stays a pure read.)
- **Anomaly checklist** — carry the JSON as inherited context to the think-hard step and form one candidate per hit, citing the digest JSON (machine-written-state evidence class): any `tool_rejections.automode-blocked > 0`; any single tool with `tool_failures[tool] ≥ 5`; `compaction_events ≥ 3`. A hit is a **question for the gates** (triage → judge), never a verdict — a quiet week with mostly unproductive wakes is legitimate, so the gates own false-positive pruning.
3b. **Observations ledger** — prune, then graduate recurring patterns.
- Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/prune-observations.ts .hermit` (fail-open).
- Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/observations.ts graduate .hermit`. It prints the patterns that cleared the session threshold and the graduation cursor this run: `{"candidates":[{"pattern", "sessions": [...], "origin": "own-work"|"external-content", "rows": N}]}`. Empty `candidates` means nothing graduated; continue.
- Build one candidate per entry: `Evidence Source: archived-se
Read more
name: reflect description: Reflect on recent work and propose improvements if patterns are noticed.
Record notes only inside an open record's turn, using `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task.ts note .hermit <id>` with the note on stdin. Otherwise skip record notes. Never edit a task file directly.
Reflect
Pause and think about your recent work.
**Silent by default.** Only notify the operator (per § Operator Notification) if reflect produces an outcome: a proposal task, a graduated observation, or a cost spike.
Rare-branch procedures live in `${CLAUDE_PLUGIN_ROOT}/skills/reflect/branches.md`. "Read branches.md § X" means: read that section now and follow it exactly — it is normative.
Commands
- `reflect-precheck`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/reflect-precheck.ts .hermit ${CLAUDE_PLUGIN_ROOT}`
- `update-reflection-state`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/update-reflection-state.ts .hermit/state/reflection-state.json`
- `routines-health`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/routines.ts health .hermit`
- `task-report`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task-report.ts .hermit --recent --limit 3`
- `observations-patterns`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/observations.ts patterns .hermit`
- `observations-observe`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/observations.ts observe .hermit`
- `proposal-anchor`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/proposal.ts anchor .hermit`
- `proposal-gate`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/proposal.ts gate .hermit`
- `task-note`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task.ts note .hermit`
Before writing a `quick-deferral` or `reflect-noticed` row, run `observations-patterns` (Commands) once per run. Reuse an existing label that names the same component and failure; create a short stable label only when none matches. Use that exact label on stdin for each observation.
Quick mode
If `$ARGUMENTS` contains `--quick`, read `${CLAUDE_PLUGIN_ROOT}/skills/reflect/quick.md`, follow it, and stop afterward.
Single-check mode
If `$ARGUMENTS` contains `--check-id` or `--check`, read branches.md § Scheduled checks and follow it exactly, then **stop** (no precheck or numbered steps below). The invocation is `reflect --check-id <id> --check <cmd…>`: everything after `--check` is the skill command, including its arguments, verbatim. A routine owns the cadence and may pin the model for this invocation.
Judge evidence handoff
For every `hermitd:reflection-judge` call, include `Task records:` with the fresh normalized adapter rows already read, preserving their `source_path`, outcome, title, lessons, and waiting reason. Candidate `Sessions:` identifiers for record evidence are task IDs from those source paths. A candidate outside that bounded evidence set needs another targeted adapter read, not an archive fallback.
Scheduled reflect
1. Determine whether a full run is warranted. With `--precheck-verdict '<verdict>'`: the reflect routine already ran the precheck in bash; use `<verdict>` directly, do **not** re-run it (always status `run`; the routine stops on `empty` without loading this skill). Otherwise run it yourself and read its JSON:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/reflect-precheck.ts .hermit ${CLAUDE_PLUGIN_ROOT}- status `empty` → nothing due; the precheck already updated `reflection-state.json`. Emit `reflect: no candidates` and stop.
- status `run` → continue. `phases` lists due phases (`cost_spike`, `behavior`, `compute`, `digest`, `newborn`, `observations_fresh`); skip sections for phases not listed. `observations_fresh` means the ledger has rows newer than `last_run_at`; run step 3b even if `compute` is absent.
2. Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/task-report.ts .hermit --recent --limit 3` for the three most recent done, cancelled or unconfirmed records. Read `task.ts list .hermit --open --json` for the execution observation. Read fresh; never fall back to session archives. 3. If `cost_spike` is listed: the precheck already detected the spike and wrote the row (`cost-spike:<YYYY-MM-DD>` — the measured day, which is **yesterday**, carrying `day_total` and `median_7d` as fields), so there is nothing to read or record here — it graduates via step 3b like any other observation. Do **not** re-read cost-log.jsonl to restate a number the precheck already computed.
3a. **Behavioral digest** — if `behavior` is listed: run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/transcript-digest.ts .hermit --record-observation` (bounded ~20-line JSON of ground-truth counters — tool failures, tool_rejections by kind, wakes vs productive_wakes, compaction_events, subagent_dispatches; never `Read` a transcript directly). Two uses of the counters:
- **Defer-loop auto-row**: `--record-observation` makes the script write the `defer-loop` row itself when its own counters cross the threshold, citing the observed `window.from→to` span. Nothing to record here. (The flag is opt-in so an ad-hoc digest run stays a pure read.)
- **Anomaly checklist** — carry the JSON as inherited context to the think-hard step and form one candidate per hit, citing the digest JSON (machine-written-state evidence class): any `tool_rejections.automode-blocked > 0`; any single tool with `tool_failures[tool] ≥ 5`; `compaction_events ≥ 3`. A hit is a **question for the gates** (triage → judge), never a verdict — a quiet week with mostly unproductive wakes is legitimate, so the gates own false-positive pruning.
3b. **Observations ledger** — prune, then graduate recurring patterns.
- Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/prune-observations.ts .hermit` (fail-open).
- Run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/observations.ts graduate .hermit`. It prints the patterns that cleared the session threshold and the graduation cursor this run: `{"candidates":[{"pattern", "sessions": [...], "origin": "own-work"|"external-content", "rows": N}]}`. Empty `candidates` means nothing graduated; continue.
- Build one candidate per entry: `Evidence Source: archived-se
Run an always-on Claude Code agent on your own machine, for you or your team. Start sessions from your chat in any project it can reach, on the model and effort you choose, and steer them through the agent or take over in the Claude app or 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 reflect.
- Which coding agents can use reflect?
- reflect 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.

