memory-system

v2026.09.24

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.

GitHub
安装命令
npx skhub add joelhooks/memory-system
Markdown
SKILL.md

Memory System

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 into MEMORY.md. That collection was archived to NAS and dropped; its functions and MEM/FRIC suites were deleted. joelclaw recall kept its command name but now composes flowing reflections, flowing observations, and curated Brain pages. Do NOT follow old copies of this skill or write memory/observation.submitted events.

Where everything lives

SurfaceLocation
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
LaunchAgentsObserver 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 outboxesflat 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

Reviewed behavior cards

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.

Debug recipes (symptom → first moves)

"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.

Usage (getting things in and out)

  • Write memory: .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.
  • Reach the curator: candidates = observation + retro pages modified in the last 7 days with privacy: public|private, a title, and a non-empty body. Dedupe is forever — a sent slug never resends.
  • Teach the curator: react to its DMs. The taste bench (2026-07-17) proved one grade changes nothing measurable; ~20–30 graded sends with both polarities is the dataset that could. Every 👍/👎 counts.
  • Query: use composed 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.

Retired and parked surfaces (don't build on these)

  • memory_observations, reflect/promote/proposal/batch-review functions, and the MEM/FRIC suites are retired and deleted from the live stack.
  • The system-log JSONL / slog path is retired. Telemetry is OTel in Typesense/ClickHouse; durable receipts are Brain .svx.
  • Claude auto-memory is a pointer index only: MEMORY.md may point into ~/.brain, but must not grow topic pages or hold content.
  • Chorus/Rhizomatic is parked: no session briefing injection and no real claims. Service shutdown still needs the steering sudo step. If claim graphs return, they return as a Brain-owned projection.

Doctor

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.

发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

Sep 24, 2026

分类

未分类

许可证

未指定

源路径

skills/memory-system

默认分支

main

最新提交

e313432

Tree SHA

eb9cad7