Debug, maintain, and use the joelclaw memory system — observer capture/dreams, Brain .svx stores, neat-memory curation, Telegram delivery, reaction grading, wiki rendering. Load whenever work touches the memory system, the curator, dreams, observations, grading, or a memory surface misbehaves.
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Use the current recall and session-search contracts through the saved memory integration. Private queries belong in structured MCP arguments. All raw session searches, extracts, and local transcript summaries require a scope-bound evidenceDrilldownReceipt; stale or empty projections do not grant access. The command history below does not waive this boundary.
The joelclaw memory system in one breath: accepted Runs remain immutable
evidence → flowing memory derives scoped observations and reflections →
composed recall returns flowing reflections, flowing observations, and curated
Brain pages as separate lanes. The raw-first Observer tick is retired. Dreams
still condense aging Brain pages, and the neat-memory curator still grades
existing eligible Brain candidates. The wiki renders every registered Brain at
brain.joelclaw.com/<root>/<slug>/.
The living map with per-subsystem health verdicts:
https://brain.joelclaw.com/joelclaw/resources/memory-system/ — read it
before deep debugging; regenerate it (fresh survey, not sentence patches)
after material changes. Effort trails:
.brain/projects/memory-system-review/ (survey assets = the receipts)
and .brain/projects/memory-system-repair/ (fixes + open decisions).
Memory retirement (2026-07-17). Versions ≤0.1.0 of this skill described the retired stack —
memory_observations, write gates, and reflect/promote intoMEMORY.md. That collection was archived to NAS and dropped; its functions and MEM/FRIC suites were deleted.joelclaw recallkept its command name but now composes flowing reflections, flowing observations, and curated Brain pages. Do NOT follow old copies of this skill or writememory/observation.submittedevents.
| Surface | Location |
|---|---|
| Observer dev repo | ~/Code/joelhooks/joelclaw-observer (branchless, detached HEAD by design) |
| Observer release (what actually runs) | ~/.joelclaw/observer-release |
| Promotion (the ONLY way to deploy observer) | bin/promote-release.sh — clean-tree gate, smoke checks, receipts to /tmp/observer-release-promotion.log; --dry-run first if unsure |
| Observation pages | ~/Code/joelhooks/dark-wizard/.brain/observations/ (condensed originals under archive/YYYY-MM/) |
| Retros (curator input; hook-fired Inngest event + condenser is being built) | ~/Code/joelhooks/dark-wizard/.brain/resources/retros/ |
| Curator state (0600, atomic writes only) | ~/.joelclaw/observer-neat-memories.json |
| Observer cursor / session / family / pending | ~/.joelclaw/observer-*.json |
| Dispatch rules (what wakes the observer) | <observer repo>/dispatch-rules.json — dispatcher re-reads per classify; no restart needed |
| Logs | /tmp/observer-{tick,dream,neat-memory,self-maintenance,release-promotion}.log |
| LaunchAgents | Observer tick retired 2026-08-25; com.joelclaw.observer-dream (06:10) and com.joelclaw.observer-neat-memory (16:15 dead-man) remain active |
| Message journal fail-open spool | ~/.joelclaw/spool/message-journal/ |
| Current flowing wake spool | ~/.joelclaw/flowing-memory/native-wakes.jsonl (single collector ownership) |
| Legacy Central capture outboxes | flat and namespaced JSON queues; preserve as migration evidence, not current writes |
| Brain root registry | ~/Code/joelhooks/dark-wizard/brain-roots.json |
| Wiki repo + build | ~/Code/joelhooks/joelclaw-wiki; bun run build (includes graph:build; retry once on transient exit 1); 200-check exact URLs before sharing |
| Bus (Inngest) | localhost:8288, signing key in ~/.config/system-bus.env |
ReflectionV2 cards can rank before V1 reflections inside the existing
flowing-reflections lane. They do not add a record kind or recall lane.
Production admits only source-grounded, digest-pinned review artifacts through
the sole semantic worker while daemon mode is stopped. Withdrawal and
restoration append receipts and update the scope head; the card row remains
immutable. Automatic formation, embeddings, and session-start briefing remain
off.
Production receipt:
joelclaw-memory/.brain/projects/joelclaw-memory/reviewed-memory-card-production-receipt-2026-08-28.svx.
"The curator went silent." joelclaw wake list --json — is a
neat-memory-beat pending? Chain alive → read
/tmp/observer-neat-memory.log for the last verdict (holds are normal;
"beat pending; dead-man exits" means the daily LaunchAgent correctly
deferred). Chain dead → the 16:15 dead-man revives it, or run
NEAT_MEMORY_TRIGGER=beat bash ~/.joelclaw/observer-release/bin/neat-memory.sh.
Last output: /tmp/observer-neat-memory-last.json (can be stale — check
log lines first). Cancel pending beats (joelclaw wake cancel <id>)
before manual runs or you'll double-schedule.
"A DM never arrived." Messaging rides the canonical Chat SDK path
(since 2026-07-17). Machine-check visible delivery from the joelclaw
repo: bun scripts/messaging-visible-delivery-canary.ts — exit 0 requires
a confirmed journal row whose Telegram platform id matches. A
notify.compat_v2.confirmed OTEL event alone is NOT proof. Journal rows:
~/.joelclaw/spool/message-journal/ (origin_system_id is a
source:eventId composite). Deeper: skills/messaging/SKILL.md.
"A reaction didn't grade." The pipe: message/inbound.reaction →
message/reaction-bridge → message/reaction.received →
message/neat-memory-reaction-grade → state-file outcome. Verify:
jq --arg slug "<slug>" '.sent[] | select(.slug == $slug) | {slug, outcome}' ~/.joelclaw/observer-neat-memories.json.
Mapping: 👍 ❤️ 🔥 💯 → worked; 👎 💩 → did-not-work; others ignored;
only Joel's reactions count. Entries without flowId fall back to a
two-minute timestamp match — safe only while sends are sparse.
"The dream did nothing." Read /tmp/observer-dream.log. Since the
2026-07-17 fix, pagesRead is the whole corpus and capped:true means
eligible work exceeded the nightly cap (fine, remainder waits) — not
blindness. eligiblePages: 0 usually means the corpus is younger than
minAgeDays (7 for plain pages; rollups re-blur at 30/90 days). That is
patience, not breakage.
"A Brain page isn't on the wiki." In order: root registered in
brain-roots.json? File is .svx (the law — .md is dead to the
renderer)? Excluded (sections captures/compaction-dumps/people/
private-family-health, or privacy: sensitive)? Raw {...} in prose
outside code spans breaks the page at prerender — backtick-escape braces.
Then build on flagg and 200-check the exact URL. Relative .svx links
and [[root/slug]] wikilinks both compile to page URLs.
"Is the observer even running?" launchctl list | grep joelclaw —
tick/dream/neat-memory should show status 0. The self-maintenance check
(inside each tick) surfaces warnings in /tmp/observer-tick.log,
including release-drift (dev HEAD ≠ release HEAD).
"Session capture / SQLite index is stale" (ADR-0243): raw truth is
~/.joelclaw/runs-dev/<user>/<yyyy-mm>/*.jsonl; the live FTS projection
is ~/.joelclaw/search/sessions.db via memory/run.captured. Verify raw
and SQLite timestamps separately; check Inngest queue health; dry-run
bun scripts/backfill-session-index.ts, then apply with
bun scripts/backfill-session-index.ts --apply. Never flood Inngest with
replay events. Typesense runs_dev and run_chunks_dev are retired and
must not be recreated.
.svx pages into a registered .brain tree —
frontmatter title + privacy (public/private render; sensitive
never renders and never reaches the curator). MDSvX-escape literal
braces. All .brain prose is .svx, always.privacy: public|private, a title, and a
non-empty body. Dedupe is forever — a sent slug never resends.joelclaw recall for broad retrieval. It keeps
flowing-reflections, flowing-observations, and curated-pages separate;
never compare scores across lanes. Interactive use must run in a trusted
GitHub checkout or pass --project and --workstream; automatic callers must
also name principal, purpose, and allowed privacy through private stdin. Use
joelclaw sessions search <query> --source both --extract to drill into exact
captured session evidence, and joelclaw docs search for books. Read the
canonical Brain .svx or accepted flowing record before a durable claim.memory_observations, reflect/promote/proposal/batch-review functions,
and the MEM/FRIC suites are retired and deleted from the live stack.slog path is retired. Telemetry is OTel in
Typesense/ClickHouse; durable receipts are Brain .svx.MEMORY.md may point into
~/.brain, but must not grow topic pages or hold content.joelclaw memory doctor is chartered
(.brain/projects/memory-system-repair/build-memory-doctor.svx):
deterministic health checks with a JSON envelope — beat pending, state
freshness, outbox size/age, release drift, dream log, journal spool,
LaunchAgent status. Until it ships, the recipes above are the doctor.
joelhooks/joelclaw
1fb2468
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.