reflect · git:20260615.d335473 · 2026-06-15 · sha256 5e81f3757b849cb3

reflect git:20260615.d335473A

Immutable. This exact content is served forever at /api/v1/blob/5e81f3757b849cb3.

---
name: reflect
description: Per-project self-improvement - reads the .harness ledger and feedback memories, then proposes gated rule/threshold/ADR changes so the project stops repeating mistakes. Run periodically.
user_invocable: true
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
  - Glob
  - Grep
---

# Reflect: Per-Project Self-Improvement

You are performing a reflection - turning the signal this project has captured
into durable improvements. Nothing is applied without the developer's approval.

## Phase 1 - Orient (gather signal)

- Run the stats script over the ledger:
  `~/.claude/hooks/harness-ledger-stats.sh --ledger .harness/ledger.jsonl --min-recurr 3`
  If that path doesn't exist, the hooks aren't installed at `~/.claude/hooks/` - run the
  copy from wherever this project keeps them. If the script prints all zeros there is no
  ledger yet (no signal captured) - stop; there is nothing to reflect on.
- Read the current project rules in `CLAUDE.md` so you improve them rather than duplicate.
- Read recent `feedback`-type memory files - these are the developer's explicit
  corrections and are the highest-value signal. Locate the memory directory first
  (it sits next to `MEMORY.md`; `find . -name MEMORY.md` if unsure), then
  `grep -l 'type: feedback' <memory-dir>/*.md`.
- Read the most recent `.harness/reflections/*.md` report (if any) to recall the last
  metric snapshot and what was already changed.

## Phase 2 - Cluster

From the stats output and feedback memories, identify recurring problems:
- Each `recurring <rule> <prefix> <count>` line is a friction cluster - the same check
  keeps firing in the same area.
- Group related feedback corrections by theme.
- Ignore one-off events; focus on what repeats.

## Phase 3 - Propose (one candidate per cluster)

For each cluster, draft exactly one proposed change, choosing the fitting type:

| Type | When | Where it lands |
|------|------|----------------|
| **Project rule** | a convention would stop the repeat | append to `CLAUDE.md` project-specific section |
| **Threshold change** | a guardrail is too strict/loose | a diff to `.claude/settings.json` or the hook - **shown, never auto-applied** |
| **Lint rule** | the mistake is mechanically catchable | a diff to `eslint.config.mjs` / `biome.json` |
| **ADR / knowledge** | durable "why" worth keeping | a new memory file or `docs/adr/` note |

Present all proposals together as a numbered list with the concrete change for each.

## Phase 4 - Gate & Record

- Ask the developer to approve, edit, or reject each proposal (like `/remember`).
- Apply only the approved ones, then commit them (use `/commit`).
- Create `.harness/reflections/` if needed (`mkdir -p .harness/reflections`), then write a
  reflection report to `.harness/reflections/YYYY-MM-DD.md` containing:
  - the full stats output (the **metric snapshot**, so the next reflection can compare),
  - the clusters you found,
  - which proposals were approved / rejected and why.

The report is committed; the raw `.harness/ledger.jsonl` stays gitignored. Signal is
private; wisdom is shared.

## Measuring success

The headline metric is `recurring_events` from the stats output. Compare it to the value
in the previous reflection report. If a rule you promoted last time worked, the cluster it
targeted should have shrunk. Note the trend explicitly in the new report.