Skip to content

Capture Claude/Codex harness events as Basic Memory producer envelopes #997

@phernandez

Description

@phernandez

Summary

Add a safe, opt-in "harness WAL" path for the Claude Code and Codex plugins that normalizes supported hook/transcript events into Basic Memory producer envelopes and writes useful agent-memory artifacts.

Design note: memory://basic-memory-7020de4e925843c68c9056c60d101d9e/basic-memory-llc/product/ideas/harness-wal-capture-river-ingestion

Why

Claude Code and Codex sessions generate a stream of useful work context: prompts, tool calls, file changes, tests, blockers, decisions, handoffs, and compaction points. Today we capture some high-signal checkpoints, but the broader session stream still mostly evaporates.

The idea is to treat the harness output like an append-only event log:

Claude/Codex hook event
  -> normalized producer envelope
  -> durable inbox/raw event record
  -> coalesced artifact writer
  -> SessionNote / ToolLedger / RecallQuery / DecisionNote candidates
  -> consolidation or memory_routine follow-up

This implements the producer side of SPEC-55 and feeds SPEC-61 memory routines without turning Basic Memory into an agent runtime.

Scope for v0

  • Add a shared event/envelope helper for Claude Code and Codex plugins.
  • Capture supported lifecycle hooks into a normalized envelope shape.
  • Include source, session id, turn id when available, cwd, project hint, timestamp, hook name, and safe payload summary.
  • Coalesce events into existing artifact types from SPEC-55, especially SessionNote and ToolLedger.
  • Keep hooks fast; expensive summarization and consolidation should happen out of band.
  • Add idempotency keys so repeated hooks do not duplicate notes.
  • Add opt-in configuration and clear redaction controls.
  • Emit provenance observations such as [source] codex/<session_id> or [source] claude-code/<session_id>.

Possible normalized event types

  • session_started
  • user_prompted
  • assistant_message
  • tool_called
  • tool_result
  • file_changed
  • test_ran
  • decision_observed
  • blocked
  • handoff_requested
  • compaction_imminent
  • session_ended

V0 should only capture events exposed through supported harness hooks and visible transcript artifacts. It should not try to capture private model reasoning.

Privacy and safety constraints

  • Capture must be opt-in or clearly tied to plugin installation/configuration.
  • Do not capture hidden chain-of-thought or private model reasoning.
  • Prefer summaries, metadata, and selected visible turns over raw transcript dumps.
  • Redact obvious secrets before writing artifacts.
  • Provide deny rules for paths, tools, environment-like values, and large payloads.
  • Preserve source offsets or hook event ids so artifacts can be audited without storing everything forever.
  • Fail fast on missing Basic Memory project mapping rather than writing to the wrong project.

Related specs

  • SPEC-55: Agent Memory Pipeline (Producer Framework)
  • SPEC-61: Event-Driven Memory Routines
  • SPEC-56: Memory Consolidation (Dream Mode)
  • SPEC-74: Semantic Diff for Basic Memory Notes

Open questions

  • Should raw envelopes be stored locally in an inbox first, or should plugin hooks write directly through existing Basic Memory MCP/API calls for v0?
  • Which hook events are available and stable enough across Claude Code and Codex today?
  • Should Codex and Claude plugins share one helper package/script, or duplicate thin adapters with a shared envelope schema?
  • What is the minimum useful artifact: session checkpoint, tool ledger, recall query, or all three?
  • How should users configure redaction and excluded paths?
  • Should the first version only run on PreCompact and SessionEnd, or also capture PostToolUse events?
  • Where should raw event retention live once the local daemon exists?

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions