Skip to content

fix(memory, builtin backend): eagerly preload session transcript listeners at gateway startup#76666

Open
buyitsydney wants to merge 2 commits into
openclaw:mainfrom
buyitsydney:fix/memory-session-listeners-eager-preload
Open

fix(memory, builtin backend): eagerly preload session transcript listeners at gateway startup#76666
buyitsydney wants to merge 2 commits into
openclaw:mainfrom
buyitsydney:fix/memory-session-listeners-eager-preload

Conversation

@buyitsydney

@buyitsydney buyitsydney commented May 3, 2026

Copy link
Copy Markdown
Contributor

Summary (scope narrowed to builtin backend per Codex review)

Eagerly preload MemoryIndexManager at gateway startup for every agent whose agents.defaults.memorySearch.sources (or per-agent overlay) includes "sessions", when using the builtin session-file backend. This arms ensureSessionListener() before the first sessionTranscriptUpdate event fires, so /reset and /new archive emits actually land in the listener set and get indexed into chunks without the user having to run openclaw memory index --force.

Why it was broken

MemoryIndexManager is lazy-loaded on the first memory_search tool call. If a user types /reset or /new before that first search, the builtin archiveFileOnDisk emit lands in an empty SESSION_TRANSCRIPT_LISTENERS set and is silently dropped, so the resulting .jsonl.reset.<iso> / .jsonl.deleted.<iso> archives never enter chunks. Only memory index --force recovers them (which is #76311 / #76452's escape hatch but is not a cold-start fix).

Why builtin-only (Codex review response)

Thanks @clawsweeper for the P2 catch on the qmd path. The initial revision of this PR treated any successful getActiveMemorySearchManager result as listener-armed, but under the qmd backend that call returns the FallbackMemoryManager wrapper whose inner MemoryIndexManager is only constructed by fallbackFactory. So on qmd, merely obtaining the wrapper does NOT run ensureSessionListener(), and the cold-start race still drops sessionTranscriptUpdate emits.

Three options were on the table (per Codex):

  1. Explicitly preload the builtin MemoryIndexManager listener owner even for qmd — requires reaching into the FallbackMemoryManager fallback slot.
  2. Add qmd-native transcript event handling inside qmd-manager.ts.
  3. Narrow this PR to builtin-only and defer qmd to a follow-up.

This revision takes option 3: added an explicit early-return guard if (params.cfg.memory?.backend === "qmd") { ... return; } at the top of startGatewayMemorySessionListeners, with a log line making the scope decision visible, plus a regression test (skips preload entirely when memory.backend is qmd (Codex review scope guard)). The changelog entry is also retitled Memory/sessions (builtin backend): and calls out the intentional qmd deferral.

Independent verification (builtin only)

CarHer builtin-backend deployment (carher-199 baseline). Three cold restarts, same container, identical /reset sequence:

pre-preload post-preload
archive emit lands in listener set ❌ dropped ✅ captured
chunks delta after 30s +0 +41
verified commit main @ 9a49d143c819 HEAD of this PR

What is NOT included

  • qmd backend session-listener arming (follow-up PR, tracked in body + changelog).
  • Changes to qmd-manager.ts transcript event handling.
  • Changes to FallbackMemoryManager fallback construction.

Refs #56131. AI-assisted.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime size: S labels May 3, 2026
@clawsweeper

clawsweeper Bot commented May 3, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed July 3, 2026, 5:01 PM ET / 21:01 UTC.

Summary
The PR adds a gateway startup sidecar that preloads sessions-enabled builtin memory managers, adds focused gateway startup tests, and adds a CHANGELOG entry.

PR surface: Source +107, Tests +114, Docs +1. Total +222 across 4 files.

Reproducibility: yes. at source level. Current main does not construct a builtin MemoryIndexManager at gateway startup, and the current listener still returns before scheduling reset/deleted archive file events.

Review metrics: 2 noteworthy metrics.

  • Backend scope: 1 covered, 1 deferred. Builtin gets startup listener preloading while qmd remains out of scope, so maintainers should notice the asymmetric backend coverage before merge.
  • Startup lifetime: 1 cached manager per sessions-enabled builtin agent. The diff intentionally leaves non-transient managers open, which affects gateway resource and availability review before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

Risk before merge

  • [P1] Current main still returns before scheduling reset/deleted archive events in memory-core, so this branch can attach the listener but still miss the advertised live archive indexing path until fix(memory-core): keep live reindex of reset/deleted session archives #96132 or equivalent behavior is merged.
  • [P1] The new sidecar keeps a non-transient MemoryIndexManager alive for every sessions-enabled builtin agent, which is a gateway startup resource and lifecycle tradeoff maintainers should explicitly accept.
  • [P1] qmd remains intentionally out of scope, so merging this branch leaves qmd listener-owner parity to a follow-up.
  • [P1] A member comment notes the branch needs an update against current main for the required Dependency Guard check; that is a refresh requirement rather than a code defect.

Maintainer options:

  1. Land archive scheduling first (recommended)
    Update this branch on current main and land it only after fix(memory-core): keep live reindex of reset/deleted session archives #96132 or equivalent archive-event scheduling behavior is present.
  2. Accept builtin-only manager lifetime
    Maintainers can explicitly accept keeping builtin managers alive for sessions-enabled agents while leaving qmd listener parity to a separate follow-up.
  3. Pause for a unified memory fix
    If maintainers want one branch to cover listener attachment timing, archive scheduling, and qmd parity, pause or close this branch in favor of a consolidated fix.

Next step before merge

  • [P2] The remaining action is maintainer coordination with the open archive-scheduling PR, rebase/Dependency Guard refresh, and acceptance of builtin-only manager lifetime rather than a narrow automated repair.

Security
Cleared: No concrete security or supply-chain concern was found; the diff adds no dependencies, workflows, permissions, secrets handling, downloads, or external code execution.

Review findings

  • [P2] Pair preload with archive scheduling — src/gateway/server-startup-memory.ts:172-175
  • [P3] Align the backend-scope comment — src/gateway/server-startup-post-attach.ts:554-555
  • [P3] Remove the release-owned changelog edit — CHANGELOG.md:349
Review details

Best possible solution:

Rebase the branch, pair it with #96132 or equivalent archive scheduling, remove the changelog edit, align the qmd/builtin comment, and land only after maintainers accept the builtin-only manager lifetime tradeoff.

Do we have a high-confidence way to reproduce the issue?

Yes, at source level. Current main does not construct a builtin MemoryIndexManager at gateway startup, and the current listener still returns before scheduling reset/deleted archive file events.

Is this the best way to solve the issue?

No, not as-is against current main. The builtin preload is the right timing fix, but it needs the archive-listener guard removed or already merged so the preloaded listener actually schedules reset/deleted archives.

Full review comments:

  • [P2] Pair preload with archive scheduling — src/gateway/server-startup-memory.ts:172-175
    This call only arms the current memory listener. On current main, that listener returns before scheduling .jsonl.reset.* and .jsonl.deleted.* paths, so the advertised reset/new archive indexing fix still does not work unless this branch includes, waits for, or rebases after fix(memory-core): keep live reindex of reset/deleted session archives #96132 or equivalent behavior.
    Confidence: 0.9
  • [P3] Align the backend-scope comment — src/gateway/server-startup-post-attach.ts:554-555
    The comment says the sidecar runs for both qmd and builtin, but startGatewayMemorySessionListeners immediately returns for qmd. Please align the comment with the intentional builtin-only behavior so future readers do not rely on a qmd startup guarantee.
    Confidence: 0.88
  • [P3] Remove the release-owned changelog edit — CHANGELOG.md:349
    Repository policy keeps CHANGELOG.md release-owned for normal PRs. Please move the release-note context into the PR body or squash message and leave changelog generation to the release flow.
    Confidence: 0.82

Overall correctness: patch is incorrect
Overall confidence: 0.87

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 010b61746379.

Label changes

Label justifications:

  • P2: This is a normal-priority memory/session indexing bug fix with limited blast radius but real user impact for reset archive recall.
  • merge-risk: 🚨 session-state: The changed startup/listener path determines whether reset/deleted session archives become available to memory search during live sessions.
  • merge-risk: 🚨 availability: The diff adds a gateway startup sidecar that can keep background memory managers alive for every sessions-enabled builtin agent.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body includes after-fix real-environment builtin-backend proof with repeated cold restarts and observed archive chunk deltas; current-main pairing still needs merge-context validation.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix real-environment builtin-backend proof with repeated cold restarts and observed archive chunk deltas; current-main pairing still needs merge-context validation.
Evidence reviewed

PR surface:

Source +107, Tests +114, Docs +1. Total +222 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 2 107 0 +107
Tests 1 115 1 +114
Docs 1 1 0 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 4 223 1 +222

What I checked:

Likely related people:

  • jalehman: The archive early return in the memory-core transcript listener appears in commit 4752524, which refactored the transcript update identity contract in the same listener path this PR depends on. (role: regression provenance and recent area contributor; confidence: high; commits: 475252453b4b; files: extensions/memory-core/src/memory/manager-sync-ops.ts, src/sessions/transcript-events.ts)
  • vincentkoc: Recent gateway memory startup work in commit 17be26b changed qmd startup manager lifetime behavior in the same startup files this PR extends. (role: gateway memory startup contributor; confidence: medium; commits: 17be26bc4f8b; files: src/gateway/server-startup-memory.ts, src/gateway/server-startup-post-attach.ts)
  • steipete: Commit 2b811fe added the lazy qmd gateway startup policy and scheduling structure that is the sibling startup surface for this builtin preload path. (role: gateway memory startup contributor; confidence: medium; commits: 2b811fe6d9e3; files: src/gateway/server-startup-memory.ts, src/gateway/server-startup-post-attach.ts)
  • buyitsydney: They authored prior merged archive visibility work and the earlier archive emit/delta handling commit, so they have context beyond merely opening this PR. (role: adjacent archive-indexing contributor; confidence: medium; commits: 2ffdb5d248a1, 04a8aa14cac1, 22b3e0d277c2; files: src/plugin-sdk/session-transcript-hit.ts, src/gateway/session-transcript-files.fs.ts, extensions/memory-core/src/memory/manager-sync-ops.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@buyitsydney
buyitsydney force-pushed the fix/memory-session-listeners-eager-preload branch from 6ccc895 to c2cdae0 Compare May 3, 2026 13:39
@buyitsydney buyitsydney changed the title fix(memory): eagerly preload session transcript listeners at gateway startup fix(memory, builtin backend): eagerly preload session transcript listeners at gateway startup May 3, 2026
@buyitsydney

Copy link
Copy Markdown
Contributor Author

Addressed @clawsweeper P2 finding in the latest push (c2cdae015b). Going with option 3: narrow scope to builtin backend.

Changes in this revision:

  • Added an explicit early-return guard in startGatewayMemorySessionListeners that skips preload entirely when params.cfg.memory?.backend === "qmd", with an info-level log line documenting the scope decision.
  • Added a regression test (skips preload entirely when memory.backend is qmd (Codex review scope guard)) asserting getActiveMemorySearchManager is never called under qmd.
  • Retitled PR + CHANGELOG entry to Memory/sessions (builtin backend) and explicitly documented qmd as out of scope with a follow-up PR deferred for arming the qmd listener owner.
  • Rebased onto latest upstream/main (past the 5.2 release and fix(memory): resolve archived transcript hits during session visibility filtering (follow-up to #76311, AI-assisted) #76452 merge).

Rationale: the qmd wrapper lazy-constructs its inner MemoryIndexManager via fallbackFactory, so a simple getActiveMemorySearchManager call on the qmd path does not arm the listener. That's a separate design problem in the FallbackMemoryManager / qmd-manager path that deserves its own PR and review, not a bolt-on inside this one.

Ready for re-review.

@buyitsydney
buyitsydney force-pushed the fix/memory-session-listeners-eager-preload branch from c2cdae0 to 1da8e47 Compare May 3, 2026 14:02
@buyitsydney

buyitsydney commented May 3, 2026

Copy link
Copy Markdown
Contributor Author

P3 addressed in 1da8e474ca:

  • Added experimental: { sessionMemory: true } to createBuiltinSessionsConfig fixture so resolveMemorySearchConfig keeps the sessions source and the preload path actually reaches getActiveMemorySearchManager.
  • Strengthened the close-check regression test with expect(getMemorySearchManagerMock).toHaveBeenCalledWith(expect.objectContaining({ agentId: "main" })) — so any future regression that silently drops sessions-source resolution (or skips manager acquisition) fails the test instead of passing vacuously.
  • Also added the flag to createBuiltinNoSessionsConfig for symmetry; that fixture's intent is 'the agent has no sessions source', and the flag not being the gating reason makes that clearer.

Ready for re-review.

Re-review progress:

@buyitsydney
buyitsydney marked this pull request as ready for review May 3, 2026 14:03
@buyitsydney
buyitsydney force-pushed the fix/memory-session-listeners-eager-preload branch from c5615a8 to bbeae3e Compare May 3, 2026 14:49
@buyitsydney

Copy link
Copy Markdown
Contributor Author

FYI on the red check: the 3 failing jobs are all the same upstream/main flake, not from this PR's diff.

Failed test: src/gateway/server-startup-web-fetch-bind.test.ts > binds HTTP with credential-free tools.web.fetch config without fetch provider discovery

Error chain:

[vitest] There was an error when mocking a module. 
Caused by: ReferenceError: Cannot access '__vi_import_1__' before initialization
 ❯ src/gateway/test-helpers.mocks.ts:204:3
 ❯ src/agents/context.ts:6:1
 ❯ src/gateway/session-utils.ts:12:1

This is a vitest vi.mock hoisting / circular-import race, not a test assertion failure. None of those files are in this PR's diff (only server-startup-memory.ts/.test.ts, server-startup-post-attach.ts, CHANGELOG.md). The previous upstream commit literally titled ci: retrigger checks (lint + dist-shard flakes in previous run) confirms this is a known-flaky shard.

Just rebased onto the latest upstream/main (past 9e56cfc + friends) to retrigger CI; if the flake persists after re-run, it's a maintainer side fix, not this PR.

My 11 tests in server-startup-memory.test.ts all pass (✓ 11 tests).

@buyitsydney
buyitsydney force-pushed the fix/memory-session-listeners-eager-preload branch from bbeae3e to 05638b1 Compare May 3, 2026 15:08
@buyitsydney

Copy link
Copy Markdown
Contributor Author

Friendly ping — CI is now clean on the latest head (05638b1fa57): 100/100 check runs completed, 79 success / 20 skipped / 1 neutral, 0 failures.

This PR is intentionally scoped to the builtin backend startup listener preload; it leaves the qmd follow-up out of scope per review feedback. Ready for maintainer review when you have bandwidth. Thanks!

…startup

MemoryIndexManager subscribes to sessionTranscriptUpdate events only when it
is instantiated, via ensureSessionListener() inside its constructor. Before
this change the manager was lazy-loaded on the first memory_search tool call,
which means any sessionTranscriptUpdate emit landing earlier in the process
lifetime went to an empty SESSION_TRANSCRIPT_LISTENERS set and was silently
lost.

The most user-visible casualty was the archiveFileOnDisk emit triggered by
/reset and /new: the resulting .jsonl.reset.<iso> / .jsonl.deleted.<iso>
archive file stayed on disk but never entered the chunks table, so
memory_search could not surface it until the user manually ran
`openclaw memory index --force`.

The existing sidecars.memory startup task (startGatewayMemoryBackend) only
runs for the qmd backend (via resolveGatewayMemoryStartupPolicy returning
mode=off on non-qmd), so builtin-backend deployments had no eager-preload
path at all.

Fix
---

Add a sibling startup task sidecars.memory-session-listeners that runs for
every backend. It calls getActiveMemorySearchManager without a purpose
(so MemoryIndexManager.get picks the non-transient 'default' branch and
ensureSessionListener() runs), then deliberately leaves the manager cached
rather than closing it, because close() would unsubscribe the listener we
just attached.

Per-agent failures are swallowed with log.warn; the task as a whole is
wrapped in setImmediate and never blocks gateway boot.

Verification
------------

Independently verified on a builtin-backend deployment running a single
default agent with memorySearch.sources = ["memory", "sessions"]:

  - Before this patch, cold-start (container recreated, no prior
    memory_search call): /reset archive file generated on disk, but
    chunks delta = 0 and files delta = 0 after 3 min of waiting.
  - After this patch, identical cold-start: /reset archive indexed
    within ~30 s (chunks delta = 41, files +1, new path carries the
    .jsonl.reset.<iso> suffix).

Repeated across three consecutive container recreates with stable results.

Refs openclaw#56131.

AI-assisted.
@buyitsydney
buyitsydney force-pushed the fix/memory-session-listeners-eager-preload branch from 05638b1 to b3f39fc Compare May 4, 2026 15:14
@buyitsydney

Copy link
Copy Markdown
Contributor Author

Gentle ping @steipete @vincentkoc — this PR is scoped to the builtin-backend startup listener preload and has been sitting ready for ~45h.

Status:

  • ,
  • CI: 100/100 check runs — 79 success / 20 skipped / 1 neutral, 0 failures on head b3f39fc385
  • clawsweeper verdict: needs-human, confidence=high — no repair job needed, normal maintainer review/merge is the remaining action
  • qmd listener arming intentionally left out of scope as you suggested (separate follow-up)

Happy to rebase if you want it on latest main (currently behind 498 but still merges clean). Appreciate your time!

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 14, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 14, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 14, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 14, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 14, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 18, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jun 22, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gateway Gateway runtime merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: M status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants