Skip to content

Resume chain broken: cliSessionId / previousSessionIds / transcriptPath remain null in agent session record #76986

Description

@JackDA10

Summary

~/.openclaw/agents/<name>/sessions/sessions.json keeps cliSessionId, previousSessionIds, and transcriptPath as null indefinitely on the main agent record. As a result, when the runtime spawns a fresh claude -p for the same agent (e.g. after a cron callback or compaction-induced restart), it can't --resume the prior CLI session — every CLI process exit becomes a context wipe.

Versions

  • openclaw 2026.4.21
  • claude CLI 2.1.114
  • macOS Darwin 25.3.0

Repro

  1. Run main agent for an extended session via claude -p. Confirm transcript accumulates under ~/.claude/projects/<workspace-path>/<sessionId>.jsonl.
  2. Trigger a fresh CLI process (cron callback with wakeMode: now, or let the underlying CLI session rotate from a config change / plugin reload).
  3. Inspect ~/.openclaw/agents/<name>/sessions/sessions.json for the agent.

Observed:
```json
{
"sessionId": "41eda629-c62a-4e36-a98c-86653422682a",
"cliSessionId": null,
"previousSessionIds": null,
"transcriptPath": null,
"sessionFile": "/Users/.../agents/main/sessions/41eda629-...jsonl"
}
```

The runtime never populated the resume-chain fields, even though the actual CLI transcripts exist on disk under ~/.claude/projects/.

Expected

On each CLI process spawn, the runtime should:

  • Capture the new claude -p session ID into cliSessionId
  • Append the prior cliSessionId to previousSessionIds (or maintain a chain)
  • Resolve and store the transcript path so resume can be reattempted

When spawning a fresh CLI for the same agent (e.g. cron callback), pass --resume <cliSessionId> so the new process inherits the prior session's history.

Real-world impact

Today's session went: long productive run ended at session 3b7fe27b... (982KB transcript, 18:22 EDT) → cron callback at 18:23 EDT spawned 6d0a999c... with no resume → user's next message in 336dcf95... at 18:26 EDT had zero context for the immediately-prior conversation. From the user's perspective: "are you sure the callbacks need to be that long?" → "what callbacks?"

Workaround in place

At the content layer, installed a Claude Code SessionStart hook in ~/.claude/settings.json that reads STATE.md and MEMORY.md from the workspace and emits them via hookSpecificOutput.additionalContext. Plus overrode agents.defaults.heartbeat.prompt in ~/.openclaw/openclaw.json because the default prompt (in dist/heartbeat-BARAswcJ.js) contains "Do not infer or repeat old tasks from prior chats" — which directly contradicted the hook-injected continuity context.

These workarounds restore summarized continuity. They can't substitute for actual --resume because STATE.md only captures the current state, not the conversation history (intermediate tool calls, sub-agent reasoning, etc.).

Suggested fix scope

  • Where the runtime invokes claude -p, capture the resulting session ID (visible via Claude Code SDK output / transcript filename) and persist it onto the agent record before any subsequent spawn.
  • On subsequent spawns, prefer --resume <previous> and only fall back to fresh-session when resume fails (e.g. transcript was rotated/cleaned up).

Happy to provide more transcripts or a minimal repro on request.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions