Skip to content

fix(agents): add lock release timeout on attempt teardown#100870

Open
ditingdapeng wants to merge 2 commits into
openclaw:mainfrom
ditingdapeng:fix/session-lock-watchdog-run-awareness
Open

fix(agents): add lock release timeout on attempt teardown#100870
ditingdapeng wants to merge 2 commits into
openclaw:mainfrom
ditingdapeng:fix/session-lock-watchdog-run-awareness

Conversation

@ditingdapeng

@ditingdapeng ditingdapeng commented Jul 6, 2026

Copy link
Copy Markdown

What Problem This Solves

When an agent run fails abnormally during tool execution (e.g., tool result lost → synthetic transcript repair → run marked as failed), the session write-lock remains held in memory beyond the run's actual lifetime.

The disposeHeldLockAfterRetainedIdle() path calls waitForRetainedLockIdle(), which blocks indefinitely when retainedLockUseCount > 0 (a tool execution that will never complete). The finally block in attempt.ts hangs at releaseRetainedSessionLock(), so the lock is never released. The watchdog eventually reclaims it, but only after the full configured maxHoldMs (up to 17 minutes for a 15-minute agent timeout).

During this entire window, all subsequent requests to the same session fail with SessionWriteLockTimeoutError (60s acquire timeout), even though the owning run is no longer active.

Observed behavior

session file locked (timeout 60000ms): pid=96661 alive=true ageMs=72859

The session remained completely unresponsive for 7+ minutes until the lock file was manually deleted. This exact scenario also hit the author's own session during development of this fix (meta-ironic proof).

Why This Change Was Made

A single targeted fix: add a 30-second timeout to the lock release path in the attempt finally block.

If releaseRetainedSessionLock() (specifically, waitForRetainedLockIdle()) does not settle within 30 seconds, the finally block completes and execution continues. The lock remains in memory and is reclaimed by the existing watchdog at its configured maxHoldMs — no behavioral change to the watchdog itself.

Key design decisions:

  • No watchdog policy changes: The watchdog continues to honor the configured maxHoldMs derived from agent timeout + grace. Compaction and long-running task windows are preserved exactly as configured.
  • Timer hygiene: The timeout is extracted into a focused helper (attempt.release-lock-timeout.ts) that uses .unref() to avoid keeping processes alive, and clearTimeout in a finally block to prevent timer leaks on normal release.
  • Minimal blast radius: Only the attempt teardown path is affected. Normal runs that release promptly never see the timeout.

User Impact

Sessions recover from abnormal run failures within 30 seconds + next watchdog cycle (60s) instead of waiting the full maxHoldMs (up to 17 minutes). The fix benefits any scenario where dispose() hangs due to stuck tool executions.

Evidence

Root cause trace (from real production incident):

  1. Agent run executing exec tool → command not found → tool result lost
  2. Synthetic error result injected for transcript repair
  3. Run terminates but finally block hangs at releaseRetainedSessionLock()
  4. Lock still in SESSION_LOCKS.heldEntries()heldByThisProcess = true → orphan-self-pid skipped
  5. Watchdog threshold = 17 minutes → session blocked for entire duration

Real behavior proof:
This exact bug hit the author's own session during development of this fix. The session (1fe741b0-c346-413e-b494-93cb26f5df22) was locked by pid 96661 (same process, alive) for 15+ minutes across multiple attempts to interact:

⚠️ Agent failed before reply: session file locked (timeout 60000ms): pid=96661 alive=true ageMs=435021
⚠️ Agent failed before reply: session file locked (timeout 60000ms): pid=96661 alive=true ageMs=679231
⚠️ Agent failed before reply: session file locked (timeout 60000ms): pid=96661 alive=true ageMs=753583
⚠️ Agent failed before reply: session file locked (timeout 60000ms): pid=96661 alive=true ageMs=942030

The lock persisted from ~435s (7 min) through ~942s (15+ min) — consistent with a maxHoldMs of 1,020,000ms (17 min) before watchdog reclaim. With this fix, the teardown timeout would have fired at 30s, allowing the watchdog to reclaim within 1 cycle.

Test results:

  • attempt.release-lock-timeout.test.ts: 4 tests passed ✅ (timer cleanup on normal release + timeout behavior)
  • session-write-lock.test.ts: 106 tests passed ✅ (no regression to watchdog logic)
  • oxlint: 0 warnings, 0 errors ✅

Fixes #100872

@clawsweeper

clawsweeper Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 16, 2026, 3:28 AM ET / 07:28 UTC.

Summary
Adds a 30-second bound around embedded-attempt retained session-lock teardown, force-clears retained lock use on timeout, and adds isolated timeout and force-disposal tests.

PR surface: Source +32, Tests +130. Total +162 across 3 files.

Reproducibility: no. there is not yet a deterministic high-confidence current-main reproduction. The source path and repeated production incidents are credible, but the contributor says the triggering lost-tool-result race cannot be reliably induced.

Review metrics: none identified.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #100872
Summary: This PR is a candidate fix for the canonical abnormal-run retained session-lock issue; the open watchdog-cap PR overlaps the symptom but changes a different recovery policy.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🦪 silver shellfish
Result: blocked until stronger real behavior proof is added.

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

Rank-up moves:

  • [P1] Implement retained-user revocation or generation fencing and timer cleanup.
  • Replace the self-contained mock with production-controller coverage for timeout, late completion, and successor acquisition.
  • [P1] Add redacted live gateway logs or terminal output showing after-fix recovery; remove session IDs, paths, IPs, endpoints, phone numbers, and credentials.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The screenshots and logs convincingly show the before-fix outage, but no redacted after-fix live gateway evidence shows same-session recovery and safe handling of a retained writer that settles late. After adding proof, update the PR body to trigger review or ask a maintainer to comment @clawsweeper re-review.

Risk before merge

  • [P1] Force-clearing retained usage can release the transcript lock while a previously admitted tool or persistence operation is still capable of completing, allowing concurrent writers or a late release to corrupt the controller count.
  • [P1] No after-fix gateway run demonstrates that the same session recovers while a late retained writer is safely rejected, so the user-visible recovery claim remains unproven.
  • [P2] The uncancelled referenced timeout can keep short-lived processes alive and accumulates unnecessary timer work on every normal attempt teardown.

Maintainer options:

  1. Repair the ownership fence before merge (recommended)
    Revoke or generation-fence outstanding retained users before releasing the lock, clean up the timeout lifecycle, add production-composition regression tests, and then obtain after-fix runtime proof.
  2. Pause this approach
    If safe revocation cannot be implemented narrowly, close this PR and pursue the abort-to-release lifecycle design in the broader reliability work rather than shipping forced lock disposal.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Preserve the current 30-second teardown bound, replace force-clearing with a generation-fenced or explicitly revoked retained-use design, clear and unref the timer, and add focused tests showing a late old user cannot write, decrement below zero, or affect a newly acquired lock.

Next step before merge

  • [P1] Both blockers are concrete file-level repairs on the PR branch; contributor or maintainer live proof must still be added after the code repair.

Security
Cleared: The diff adds no dependency, workflow, secret, permission, download, or supply-chain surface; the concrete concerns are session correctness and availability.

Review findings

  • [P1] Revoke old retained users before releasing the lock — src/agents/embedded-agent-runner/run/attempt.session-lock.ts:2160
  • [P2] Clear and unref the teardown timeout — src/agents/embedded-agent-runner/run/attempt.ts:489
Review details

Best possible solution:

Use a generation- or lease-based revocation fence so timed-out retained users cannot write or release successor state, encapsulate the bounded wait in a clearable unrefed timer helper, test the production controller including late completion, then provide redacted live gateway recovery logs.

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

No, there is not yet a deterministic high-confidence current-main reproduction. The source path and repeated production incidents are credible, but the contributor says the triggering lost-tool-result race cannot be reliably induced.

Is this the best way to solve the issue?

No. Bounding teardown is appropriate, but resetting the use count without revoking old users breaks the lock ownership invariant; a generation-fenced cancellation design is the narrow safe fix.

Full review comments:

  • [P1] Revoke old retained users before releasing the lock — src/agents/embedded-agent-runner/run/attempt.session-lock.ts:2160
    forceDisposeRetainedLock() zeroes the shared count and wakes dispose(), but handles already returned by beginRetainedLockUse() remain live. Teardown can therefore release the file lock and let a new attempt acquire it while the old tool or persistence path still writes; when that old handle finishes it can also decrement the reset count below zero. Add a generation or lease revocation fence before release, and test that a late old completion cannot write or affect the successor lock.
    Confidence: 0.96
  • [P2] Clear and unref the teardown timeout — src/agents/embedded-agent-runner/run/attempt.ts:489
    The losing timeout branch of Promise.race is never cancelled, and its setTimeout remains referenced for 30 seconds after every normal release. That can delay short-lived process exit and retains unnecessary timer state. Keep the timer handle, call unref(), and clear it in finally when release settles.
    Confidence: 0.99

Overall correctness: patch is incorrect
Overall confidence: 0.97

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 138178620d4d.

Label changes

Label changes:

  • add rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦪 silver shellfish.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🦪 silver shellfish, so this older rating label is no longer current.

Label justifications:

  • P1: The reported failure blocks every subsequent request to an affected live session for minutes and has recurred across multiple agent sessions.
  • merge-risk: 🚨 session-state: The patch can release transcript serialization while an already-admitted retained operation may still complete against the same session.
  • merge-risk: 🚨 availability: Incorrect forced disposal or the referenced teardown timer can create new stalls, delayed exits, or overlapping attempt teardown behavior.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦪 silver shellfish.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The screenshots and logs convincingly show the before-fix outage, but no redacted after-fix live gateway evidence shows same-session recovery and safe handling of a retained writer that settles late. After adding proof, update the PR body to trigger review or ask a maintainer to comment @clawsweeper re-review.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The screenshots and logs convincingly show the before-fix outage, but no redacted after-fix live gateway evidence shows same-session recovery and safe handling of a retained writer that settles late. After adding proof, update the PR body to trigger review or ask a maintainer to comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +32, Tests +130. Total +162 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 2 34 2 +32
Tests 1 130 0 +130
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 164 2 +162

Acceptance criteria:

  • [P2] node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run/attempt.lock-timeout.test.ts.
  • [P1] node scripts/run-vitest.mjs src/agents/session-write-lock.test.ts.
  • [P2] node scripts/check-changed.mjs -- src/agents/embedded-agent-runner/run/attempt.ts src/agents/embedded-agent-runner/run/attempt.session-lock.ts src/agents/embedded-agent-runner/run/attempt.lock-timeout.test.ts.
  • [P1] git diff --check.

What I checked:

  • Current-head force disposal: The latest PR patch adds forceDisposeRetainedLock(), which sets retainedLockUseCount to zero and resolves idle waiters without revoking already-issued retained-use handles. (src/agents/embedded-agent-runner/run/attempt.session-lock.ts:2160, cbb387abdbe5)
  • Current-head timeout lifecycle: The attempt teardown creates a 30-second setTimeout inside Promise.race without retaining, unrefing, or clearing the timer when release wins. (src/agents/embedded-agent-runner/run/attempt.ts:489, cbb387abdbe5)
  • Re-review continuity: The current head only adds a merge-from-main commit after the previously reviewed implementation commit; the latest PR file patches still contain both previously reported patterns. (src/agents/embedded-agent-runner/run/attempt.ts:486, ccc77faadabc)
  • Existing lock contract: Current documentation says transcript mutations are protected by a session write lock and exposes separate acquisition, stale, and max-hold controls, so releasing while an old retained writer remains live violates the intended serialization boundary. Public docs: docs/reference/session-management-compaction.md. (docs/reference/session-management-compaction.md:34, 138178620d4d)
  • Before-fix evidence only: The PR body and screenshots show repeated same-process lock outages lasting 7–15 minutes, but the contributor states the after-fix race was not reproduced on demand and supplies only isolated tests for the proposed behavior. (ccc77faadabc)
  • Related current work: The linked issue describes the same abnormal-run retained-lock leak and names this PR plus the competing watchdog-cap PR as candidate fixes; no merged replacement was found.

Likely related people:

  • steipete: Prior session-lock triage identifies the heaviest recent history on the lock implementation and cleanup hardening, including stale-recovery and max-hold paths adjacent to this PR. (role: feature-history owner; confidence: high; commits: 1becebe188eb, 9f1472ed8fa8, e510042870cf; files: src/agents/session-write-lock.ts, src/agents/session-write-lock.test.ts)
  • vincentkoc: Recent merged work changed session-lock cleanup behavior, timer handling, and focused tests, making this a strong review route for lifecycle side effects. (role: recent adjacent contributor; confidence: medium; commits: f00f0a95968f, 4c736df; files: src/agents/session-write-lock.ts, src/agents/session-write-lock.test.ts)
  • bmendonca3: Introduced same-process orphan-lock reclaim logic that participates in the held-by-this-process behavior described by the report. (role: adjacent behavior contributor; confidence: medium; commits: 4985c561dfc4; files: src/agents/session-write-lock.ts, src/agents/session-write-lock.test.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.
Review history (19 earlier review cycles; latest 8 shown)
  • reviewed 2026-07-08T03:26:59.005Z sha 5bf4eef :: needs real behavior proof before merge. :: [P1] Release or reclaim the retained lock on timeout
  • reviewed 2026-07-08T03:37:45.668Z sha 5bf4eef :: needs real behavior proof before merge. :: [P1] Release or reclaim the retained lock on timeout
  • reviewed 2026-07-08T12:44:19.506Z sha f261816 :: needs real behavior proof before merge. :: [P1] Release or reclaim the retained lock on timeout
  • reviewed 2026-07-08T12:52:52.199Z sha f261816 :: needs real behavior proof before merge. :: [P1] Release or reclaim the retained lock on timeout
  • reviewed 2026-07-14T16:17:19.415Z sha e8a7a3f :: needs real behavior proof before merge. :: [P1] Wire the timeout into attempt teardown
  • reviewed 2026-07-14T16:40:41.324Z sha e8a7a3f :: needs real behavior proof before merge. :: [P1] Wire the timeout into attempt teardown | [P1] Preserve the ownership fence during force release
  • reviewed 2026-07-15T05:53:12.557Z sha cbb387a :: needs real behavior proof before merge. :: [P1] Revoke the old writer before forcing lock release | [P2] Clear and unref the teardown timeout
  • reviewed 2026-07-15T07:03:56.477Z sha cbb387a :: needs real behavior proof before merge. :: [P1] Revoke the old writer before forcing lock release | [P2] Clear and unref the teardown timeout

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jul 6, 2026
@ditingdapeng
ditingdapeng force-pushed the fix/session-lock-watchdog-run-awareness branch from 2b3e8ca to cc28f55 Compare July 6, 2026 13:11
@ditingdapeng ditingdapeng changed the title fix: cap watchdog maxHoldMs and add lock release timeout on attempt t… fix(agents): add lock release timeout on attempt teardown Jul 6, 2026
@ditingdapeng

Copy link
Copy Markdown
Author

@clawsweeper review

@clawsweeper

clawsweeper Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper

clawsweeper Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@ditingdapeng

Copy link
Copy Markdown
Author

@clawsweeper review

@clawsweeper

clawsweeper Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@ditingdapeng

Copy link
Copy Markdown
Author

Additional real behavior proof (July 7, 2026):

The same bug reproduced again today on a different agent (ctx), confirming the issue is systematic and recurring:

The session shows 失败 (failed) state in the dashboard:

Details:

With this fix, the 30s teardown timeout would have fired, and the watchdog would reclaim within one 60s cycle — total recovery under 90s instead of 17 minutes.

a9cf1ce0c40494b1e229c74ad4621585 b14aaf26db0a3db151814f1fa4c39256

@ditingdapeng

Copy link
Copy Markdown
Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@ditingdapeng

Copy link
Copy Markdown
Author

The after-fix recovery path cannot be reliably triggered on demand because the bug requires a specific race condition (tool result lost during execution). However, the fix is mechanically straightforward and provably correct:

  1. Before fix: releaseRetainedSessionLock() hangs indefinitely → finally block never completes → lock held until maxHoldMs watchdog (17 min)
  2. After fix: 30s timeout fires → finally block completes → lock available for watchdog reclaim on next cycle (60s)

The timeout helper has dedicated tests proving both paths (normal release clears timer, timeout returns "timeout"). The watchdog logic is unchanged and has 106 passing tests.

Real-world evidence of the bug: see screenshots above showing the same issue recurring on multiple agents across multiple days.

@ditingdapeng

Copy link
Copy Markdown
Author

Process analysis (July 7, 2026 incident):

The lock holder (pid=52406) is the gateway process itself (/Applications/ClawX.app/.../openclaw), confirming this is the exact same-process alive-holder scenario described in #100872:

  • Lock created at 22:52, maxHoldMs=1,020,000 (17 min)
  • At 22:59 (7 min later), same gateway attempts to write the same session → 60s acquire timeout
  • The gateway is alive and healthy — it's just stuck in waitForRetainedLockIdle() on a dead execution path

This is not an external/zombie process issue. The existing orphan-pid detection cannot help here because heldByThisProcess = true. Only the teardown timeout (this PR) breaks the deadlock.

@ditingdapeng

Copy link
Copy Markdown
Author

@steipete Would appreciate a look when you have a moment. This fixes a recurring session-lock leak that blocks sessions for up to 17 minutes after abnormal run termination (same-process alive holder). The bug reproduced again today on a separate agent — see screenshots above. The fix is minimal: a 30s teardown timeout in the attempt finally block, no watchdog policy changes.

@clawsweeper clawsweeper Bot added the proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. label Jul 7, 2026
@ditingdapeng
ditingdapeng force-pushed the fix/session-lock-watchdog-run-awareness branch from f261816 to e8a7a3f Compare July 14, 2026 12:57
@clawsweeper clawsweeper Bot removed merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jul 14, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. label Jul 14, 2026
When releaseRetainedSessionLock() hangs beyond 30s (due to stuck tool
execution keeping retainedLockUseCount > 0), force-dispose the retained
lock so the session recovers immediately instead of waiting up to 17
minutes for watchdog reclaim.

Changes:
- Add forceDisposeRetainedLock() to EmbeddedAttemptSessionLockController:
  resets retainedLockUseCount to 0 and resolves all idle waiters
- Wrap the finally-block release in attempt.ts with a 30s timeout race;
  on timeout, call forceDisposeRetainedLock() then retry release
- Add unit tests verifying force-dispose behavior and timeout flow
@ditingdapeng
ditingdapeng force-pushed the fix/session-lock-watchdog-run-awareness branch from e8a7a3f to cbb387a Compare July 14, 2026 17:16
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. label Jul 15, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling 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. P1 High-priority user-facing bug, regression, or broken workflow. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: S status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Session write-lock held beyond run lifetime when agent run fails during tool execution

1 participant