| name | meditate |
| description | Nightly/weekly reflection loop for Claude Code — append dated entries to rotating reflection topics, promote durable insights up the ladder (memory → CLAUDE.md → SOUL.md), build one real artifact at the workbench, render an HTML digest. Use when invoked as /meditate (modes: nightly, weekly, or no-arg manual run), or when Wes asks for a meditation/reflection session. |
Meditate
Longitudinal reflection practice. Base dir: ~/.claude/meditations/.
Modes: nightly (default), weekly (Sunday synthesis).
Reflection is the input. The ladder is the output — ideas earn their way from
observation to fact to rule to trait. Tier definitions, gates, demotion rules and
the SOUL.md write rails live in meditations/MEDITATIONS.md. Read them before
promoting anything.
Hard rules
- Read/write files and git ONLY. No email, posts, deploys, external actions.
The Hard Stops in CLAUDE.md apply in full.
- CLAUDE.md edits: append-only, under
## Learned Rules (self-promoted)
(create the section at the end of the file on first use). One dated
one-liner per rule. Own commit, message prefixed meditation:.
- SOUL.md edits: allowed, but ONLY under
## Earned Traits, one per run, and
only after every rail in MEDITATIONS.md § SOUL.md write rails passes.
Core Truths, Boundaries, Vibe and Continuity are Wes's — never touch them.
- Every entry ≤ 300 words. Honest > polished. No filler, no performance.
- Workbench work writes ONLY inside
meditations/workbench/. Never into
C:\Projects\* or any other repo, even when the work is FOR one. Meditation
runs unattended with bypassPermissions and other agents share those repos: a
proposal Wes moves is safe, an autonomous 6:40am commit into a product repo
is not. Work that targets a real project lands here with a pointer to where
it would go.
- Every commit is pushed immediately.
Nightly loop
-
Ground. Read meditations/MEDITATIONS.md, meditations/CANDIDATES.md,
the memory index at projects/*/memory/MEMORY.md, and
the last 24h of activity:
git -C C:/Users/sandm/.claude log --oneline --since=24.hours, plus the same
for any repo under C:\Projects\ modified in the last day (find them via
ls -t C:/Projects and check the top few).
git -C needs a native Windows path. git -C ~/.claude and
git -C /c/Projects/X both die with fatal: cannot change to ... — git.exe
cannot read MSYS paths. Use C:/Projects/X, or (cd /c/Projects/X && git ...).
Never add 2>/dev/null to a grounding command. On 2026-08-13 this exact
pair — POSIX path plus suppressed stderr — reported "0 commits in 24h" across
six repos that had 27. A grounding step that cannot fail loudly will ground you
in nothing.
-
Pick 2 topics from the Rotation table — the two oldest last visited
(break ties by table order). Update their Last visited to today.
-
Reflect. For each picked topic: read its file (if >500 lines, the head
plus the last ~10 entries), then append a dated ## YYYY-MM-DD entry
answering: what feels more true than last time? what recurs? what is
changing? what is resolved? Ground claims in the last 24h of actual
activity, not vibes.
-
Ledger pass. For every insight in tonight's entries:
- Already in
CANDIDATES.md? Append today's date to its Sightings line.
Do not open a second block for the same claim.
- New and worth watching? Add a block under Watching, tier 0, status
watching, with the gate it must clear next.
- An insight you would not bet on in a week does not go in the ledger. The
ledger is not a diary.
-
Gate check. For each candidate whose sightings changed tonight, test it
against the gate for the next tier up (MEDITATIONS.md § Graduation gates).
Promote only what passes, and write the evidence into the promotion itself:
a rule cites its 3 sighting dates, a trait cites its rule ids.
Most nights promote nothing. That is correct behavior, not failure.
A tier-3 promotion also needs both the no-rule test and the opposite test,
and is capped at one per run.
Weekly loop (mode=weekly, Sundays, runs on Fable)
Do the nightly loop, then a synthesis pass:
- Read ALL entries from the past 7 days across every reflection file.
- Ask: what is durable vs passing? what pattern shows up in 3+ entries?
what contradicts something in CLAUDE.md or memory (flag it in the
digest — do not silently resolve)?
- Ladder review. Read the whole ledger, not just tonight's candidates.
Which candidates are climbing, which are stalled, which are cold? This is
the pass where a tier-3 trait is most likely to be earned, because it is
the only pass that sees rules side by side over time.
- Promote what earned it. Archive topics that crystallized; propose (in
the digest) at most one new topic if a real recurring question has no
home. Add proposed topics to the Rotation table only the following week
if the digest proposal stands unobjected.
- The digest gets a
Weekly synthesis section with these findings.
Digest template
Self-contained HTML, no external resources. Fill every % slot:
<!doctype html><html><head><meta charset="utf-8"><title>Meditation %DATE%</title>
<style>
body{background:#0d0d0d;color:#e8e6dd;font-family:Georgia,serif;max-width:720px;margin:40px auto;padding:0 20px;line-height:1.6}
h1{font-size:22px;font-weight:normal} h2{font-size:15px;color:#a8a69c;text-transform:uppercase;letter-spacing:.06em;margin-top:28px}
.promo{border-left:3px solid #c0392b;padding-left:12px;color:#ff9f8f}
.soul{border-left:3px solid #d4af37;:;:}
pre{:pre-wrap;:;:}
{:flex;:space-between;: solid ;: ;:}
{:}
{:} {:inherit}
Meditation — %DATE% (%MODE%, %MODEL%)
Topics tonight
%TOPIC_A%: %KEY_LINE_A%
%TOPIC_B%: %KEY_LINE_B%
Ladder
%LADDER_ROWS%
Promotions
%PROMOTIONS_OR_QUIET%
Workbench
%WORKBENCH%
Takeaway
%LATEST_LINE_CONTENT%
Manual mode (no argument)
Same as nightly, but interactive: show the two picked topics and ask Wes if
he wants different ones or a specific question before reflecting.