Skip to content

fix(agents,gateway): three subagent announce delivery failures in loopback token-auth setups#85716

Open
jailbirt wants to merge 1 commit into
openclaw:mainfrom
jailbirt:fix/subagent-scope-stale-lock-yield-context
Open

fix(agents,gateway): three subagent announce delivery failures in loopback token-auth setups#85716
jailbirt wants to merge 1 commit into
openclaw:mainfrom
jailbirt:fix/subagent-scope-stale-lock-yield-context

Conversation

@jailbirt

@jailbirt jailbirt commented May 23, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Three related bugs that break subagent completion delivery when running OpenClaw with loopback token-auth (e.g. Google Chat channel, sessions_spawn orchestration pattern). All three were found and validated on a production Linux/GCP deployment: OpenClaw 2026.5.20, Node 22, systemd user service.


Fix 1 — src/gateway/call.ts — device identity for BACKEND calls with explicit scopes

Fixes: #77807

shouldOmitDeviceIdentityForGatewayCall unconditionally omitted device identity for all BACKEND + GATEWAY_CLIENT + loopback calls. Internal calls such as callSubagentGateway carry explicit operator scopes like ["operator.write"]. Without device identity the gateway cannot verify those scopes against the paired device token and rejects with:

Subagent completion direct announce failed: missing scope: operator.write

Fix: return false (keep device identity) when params.scopes is non-empty. Also threads scopes through resolveDeviceIdentityForGatewayCall so the helper can inspect them.


Fix 2 — src/agents/pi-embedded-runner/run/attempt.sessions-yield.ts — await settle after timeout

waitForSessionsYieldAbortSettle raced the settle promise against a 2 s timeout and returned immediately on timeout, leaving the session transcript file lock held. The next turn on the same persistent session (e.g. a Google Chat DM) failed with "file lock stale", triggering a model fallback and surfacing an internal error message to end users.

Fix: after logging the timeout warning, await params.settlePromise.catch(() => {}) so the file lock is always released before the function returns.


Fix 3 — src/agents/pi-embedded-runner/run/attempt.sessions-yield.ts — strip context message before completion announce

When a new incoming message aborts an active sessions_yield, the openclaw.sessions_yield context message (containing [Context: The previous turn ended intentionally via sessions_yield...]) remains in the session transcript. When a subagent completion announce subsequently re-runs the agent to deliver the result, the agent sees this context message and responds via sessions_yield again (producing a custom_message). The announce system does not recognise a custom_message as a visible reply and emits:

Subagent announce give up: completion agent did not produce a visible reply

stripSessionsYieldArtifacts already strips the interrupt custom type (openclaw.sessions_yield_interrupt) but not the context custom type (openclaw.sessions_yield).

Fix: strip both types in the in-memory messages loop and in the fileEntries loop.


Test plan

  • Single sub-agent turn delivers correctly with no missing scope: operator.write
  • Two rapid consecutive messages (second arrives while sub-agent runs): both deliver, no fallback, no stale lock, no scope errors
  • Persistent session (e.g. Google Chat DM) does not accumulate stale locks across turns

Tested on production: Google Chat + Pipedrive sub-agent workflow, 5+ consecutive turns, no errors.

Reported-by: jailbirt [email protected]

🤖 Generated with Claude Code


Evidence

Per @martingarramon's review, Fix 1's guard inferred "subagent call" from the mere presence of params.scopes, but scopes ride on many ordinary backend calls, so it kept device identity for direct-local shared-token calls too — breaking call.test.ts:427 and :658. Narrowed to an explicit requireDeviceIdentity opt-in flag set only at the subagent chokepoint (callSubagentGateway).

Validation (re-runnable)

node scripts/run-vitest.mjs run --config test/vitest/vitest.gateway-core.config.ts src/gateway/call.test.ts
#  Test Files 1 passed (1)   Tests 88 passed (88)   (incl :427, :658, + new regression test)

# full checks-node-agentic-gateway-core shard:
node scripts/run-vitest.mjs run --config test/vitest/vitest.gateway-core.config.ts
#  Test Files 131 passed (131)   Tests 1957 passed (1957)

# full agentic-control-plane-auth-node shard (25 files from scripts/lib/ci-node-test-plan.mjs):
node scripts/run-vitest.mjs run --config test/vitest/vitest.gateway-server.config.ts <…>
#  Test Files 25 passed (25)   Tests 279 passed (279)

Both previously-failing shards now pass. New regression test: a loopback BACKEND scoped call with requireDeviceIdentity: true keeps deviceIdentity (scopes ["operator.write"], BACKEND/GATEWAY_CLIENT).

Change

  • src/gateway/call.ts — add requireDeviceIdentity?: boolean to CallGatewayBaseOptions; in shouldOmitDeviceIdentityForGatewayCall replace if (requestedScopes.length > 0) return false; with if (params.opts.requireDeviceIdentity === true) return false;; drop the now-unused scopes arg from resolveDeviceIdentityForGatewayCall.
  • src/agents/subagent-spawn.tscallSubagentGateway passes requireDeviceIdentity: true (the single chokepoint the completion announce / agent call flows through).
  • src/gateway/call.test.ts — regression test reproducing the original bug.

Cross-PR #85424

Both touch executeGatewayRequestWithScopes but on non-overlapping regions: #85424 adds event-loop-drift/timeout handling in the body; this PR's only edit there is the resolveDeviceIdentityForGatewayCall(...) argument at the deviceIdentity line. No semantic conflict — suggest #85424 merges first and this rebases on top.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime agents Agent runtime and tooling size: XS triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 23, 2026
@clawsweeper

clawsweeper Bot commented May 23, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 13, 2026, 2:07 PM ET / 18:07 UTC.

Summary
The branch adds a subagent-only device-identity opt-in, bounds post-timeout sessions-yield settlement, strips sessions-yield context artifacts, and adds a gateway regression test.

PR surface: Source +65, Tests +16. Total +81 across 4 files.

Reproducibility: yes. at source level: current main’s auth-none omission, the PR’s unconditional subagent opt-in, and the documented auth-none scope-clearing failure form a high-confidence regression path; a live current-head run is still absent.

Review metrics: none identified.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🦪 silver shellfish
Result: blocked until 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] Preserve auth-none identity omission and add focused token-auth/auth-none regression coverage.
  • Post redacted current-head live output for subagent spawn, completion announce, and rapid consecutive messages.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The contributor explicitly says current-head proof is pending; add redacted live logs or terminal output showing token-auth spawn/announce delivery, rapid-message lock settlement, and auth-none non-regression, then update the PR body or ask for @clawsweeper re-review.

Risk before merge

  • [P1] Merging this head can break existing auth-none loopback subagent setups by attaching device identity where current main intentionally omits it.
  • [P1] The contributor has not supplied inspectable after-fix runtime evidence for this head across token-auth delivery, rapid-message settlement, and auth-none compatibility.

Maintainer options:

  1. Preserve auth-none before merge (recommended)
    Gate requireDeviceIdentity so auth-none loopback subagent calls continue omitting device identity, add focused coverage for both auth modes, then require redacted current-head live proof.
  2. Pause the combined branch
    Split or close the PR if the contributor cannot validate the auth boundary and three runtime failure paths on the rebased head.

Next step before merge

  • [P1] The contributor should repair the auth-none regression and supply real behavior proof; ClawSweeper automation cannot produce evidence from the contributor’s deployment.

Security
Needs attention: The patch broadens device-identity attachment across an authentication boundary and currently regresses the intentional auth-none path.

Review findings

  • [P1] Preserve auth-none device-identity omission — src/gateway/call.ts:503-505
Review details

Best possible solution:

Preserve auth-none device-identity omission, honor the subagent opt-in only when active token/password shared auth requires paired-device scope verification, add auth-none and token-auth regressions, retain the bounded settle/context cleanup, and provide redacted current-head live proof.

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

Yes at source level: current main’s auth-none omission, the PR’s unconditional subagent opt-in, and the documented auth-none scope-clearing failure form a high-confidence regression path; a live current-head run is still absent.

Is this the best way to solve the issue?

No as submitted: the explicit opt-in is narrower than the original scopes-based guard and the settle wait is now bounded, but the opt-in must preserve auth-none behavior before this is the safest fix.

Full review comments:

  • [P1] Preserve auth-none device-identity omission — src/gateway/call.ts:503-505
    callSubagentGateway sets this flag for every auth mode, and this early return runs before the existing auth-none omission. In an auth-none loopback setup that attaches an unpaired device identity, requested scopes can be cleared and sessions_spawn fails with missing scope as documented in Fix auth-none-only cleanup #98788. Honor the opt-in only for active token/password shared auth and add an auth-none regression.
    Confidence: 0.96

Overall correctness: patch is incorrect
Overall confidence: 0.96

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 553c2459619f.

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: The unconditional opt-in changes auth-none loopback behavior and can break existing subagent setups that currently omit device identity.
  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦪 silver shellfish.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🧂 unranked krab, so this older rating label is no longer current.
  • remove merge-risk: 🚨 availability: Current PR review merge-risk labels are merge-risk: 🚨 compatibility, merge-risk: 🚨 message-delivery, merge-risk: 🚨 security-boundary.

Label justifications:

  • P1: The PR targets and can itself affect broken subagent spawn and completion delivery in real channel workflows.
  • merge-risk: 🚨 compatibility: The unconditional opt-in changes auth-none loopback behavior and can break existing subagent setups that currently omit device identity.
  • merge-risk: 🚨 message-delivery: The changed authentication and sessions-yield paths determine whether subagent completion messages reach the requester.
  • merge-risk: 🚨 security-boundary: The patch changes when paired device identity is attached to operator-scoped gateway calls.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦪 silver shellfish.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The contributor explicitly says current-head proof is pending; add redacted live logs or terminal output showing token-auth spawn/announce delivery, rapid-message lock settlement, and auth-none non-regression, then update the PR body or ask for @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +65, Tests +16. Total +81 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 3 66 1 +65
Tests 1 16 0 +16
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 4 82 1 +81

Security concerns:

  • [medium] Auth-none calls receive unintended device identity — src/gateway/call.ts:503
    The unconditional opt-in bypasses auth-none identity omission, which can present an unpaired identity and strip operator scopes from subagent calls.
    Confidence: 0.96

What I checked:

  • Current auth-none contract: Current main omits device identity for loopback BACKEND/GATEWAY_CLIENT calls under auth-none, preserving local shared authentication without presenting an unpaired device identity. (src/gateway/call.ts:3101, 553c2459619f)
  • PR bypasses auth-mode handling: The PR returns false whenever requireDeviceIdentity is true before the existing token, password, and auth-none omission logic can run. (src/gateway/call.ts:503, 429d29ed2cf8)
  • Opt-in is unconditional for subagent calls: callSubagentGateway sets requireDeviceIdentity: true for every subagent gateway call, including auth-none deployments. (src/agents/subagent-spawn.ts:232, 429d29ed2cf8)
  • Observed auth-none failure mechanism: Fix auth-none-only cleanup #98788 documents that attaching device identity under auth-none can present an identity without a paired token, clear requested scopes, and fail subagent calls with missing scope. (src/gateway/call.ts:503, 429d29ed2cf8)
  • Previous blocker addressed: The current head replaces the previously unbounded post-timeout await with a second timeout-bounded race, so the prior review finding should not be re-raised. (src/agents/embedded-agent-runner/run/attempt.sessions-yield.ts:14, 429d29ed2cf8)
  • Current-head proof absent: The contributor’s July 13, 2026 update explicitly says real-behavior proof is still pending; tests and CI do not satisfy the external-PR runtime proof gate. (429d29ed2cf8)

Likely related people:

  • lanzhi-lee: Authored merged in-process subagent Gateway dispatch work owning the central callSubagentGateway path adjacent to this fallback change. (role: recent adjacent contributor; confidence: high; commits: 58bab0c2761e; files: src/agents/subagent-spawn.ts, src/agents/subagent-spawn.test.ts, src/gateway/server-plugins.ts)
  • openperf: Authored earlier merged subagent gateway-scope work in the same callSubagentGateway area. (role: related feature-history contributor; confidence: medium; commits: b40ef364b71c; files: src/agents/subagent-spawn.ts, src/agents/subagent-spawn.test.ts)
  • anyech: Authored the merged bounded sessions-yield abort-lock release that established the safer lock-lifecycle baseline for this failure cluster. (role: related fix proposer; confidence: high; commits: 0fe74797520e; files: src/agents/embedded-agent-runner/run/attempt.ts, src/agents/embedded-agent-runner/run/attempt.session-lock.ts)
  • steipete: Merged the in-process subagent dispatch work and sessions-yield lock-release fix touching both central behavior areas. (role: recent merger and committer; confidence: high; commits: 58bab0c2761e, 0fe74797520e; files: src/agents/subagent-spawn.ts, src/agents/embedded-agent-runner/run/attempt.ts, src/agents/embedded-agent-runner/run/attempt.session-lock.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 (1 earlier review cycle)
  • reviewed 2026-07-10T21:50:18.643Z sha 895d4d3 :: needs real behavior proof before merge. :: [P1] Keep the abort-settlement wait bounded

@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: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. labels May 23, 2026
@clawsweeper

clawsweeper Bot commented May 23, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

🎁 Pass real behavior proof to wake the egg and unlock a hatchable treat.

Where did the egg go?
  • The egg game starts only after the PR passes the real-behavior proof check.
  • Before that, no creature or rarity is rolled. The treat waits for real proof.
  • This is still just collectible flavor: proof affects review readiness, not creature quality.

@martingarramon martingarramon left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI: 67/70 — 2 real failures from Fix 1

checks-node-agentic-gateway-core and agentic-control-plane-auth-node both fail on the same root cause.


Fix 1 — condition in shouldOmitDeviceIdentityForGatewayCall is too broad

The added guard at call.ts:341-344:

if (requestedScopes.length > 0) {
  return false; // keep device identity
}

fires before the BACKEND + GATEWAY_CLIENT + loopback + hasSharedAuth block. Any call where the resolved scopes array is non-empty now retains device identity — not just subagent loopback calls.

Two tests in src/gateway/call.test.ts encode the opposite contract:

  • :427keeps direct-local backend shared-token auth independent of paired device state: expect(lastClientOptions?.deviceIdentity).toBeNull() — now fails
  • :658uses backend client metadata for explicit scoped default calls: same assertion

The production bug (subagent completion failing with missing scope: operator.write) is real. The fix path through callSubagentGateway → callGateway → callGatewayWithScopes (explicit-scopes branch) → executeGatewayRequestWithScopes → shouldOmitDeviceIdentityForGatewayCall is correct — that path needs device identity when scopes are present. One narrowing would be an explicit flag threaded from the subagent path (e.g., requireDeviceIdentity?: true); any equivalent that preserves the existing direct-local shared-token contract is acceptable.


Fix 2 — waitForSessionsYieldAbortSettle — direction correct, bounded-wait question

The await params.settlePromise.catch(() => {}) after the timeout log ensures the lock drains before the function returns. The intended direction is right. One question: if the settle promise itself stalls (e.g., a hung fs operation), this second await has no timeout fallback of its own. Is there an upper bound on how long settlePromise can remain pending, or does it need its own guard here?


Fix 3 — LGTM

stripSessionsYieldArtifacts: both the messages loop and fileEntries loop now cover SESSIONS_YIELD_CONTEXT_CUSTOM_TYPE, exactly mirroring the existing pattern for SESSIONS_YIELD_INTERRUPT_CUSTOM_TYPE. Ties the comparison to the shared constant (defined at line 5) rather than a raw string.

Fix 1 still needs narrowing before this is merge-ready.

@BingqingLyu

This comment was marked as spam.

@openclaw-barnacle openclaw-barnacle Bot added size: S triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. and removed size: XS labels Jun 28, 2026
@jailbirt

Copy link
Copy Markdown
Contributor Author

@martingarramon thanks — you were right, the Fix 1 guard was too broad. Inferring "subagent call" from the presence of params.scopes fired for ordinary direct-local shared-token backend calls too, which is what broke call.test.ts:427 and :658.

Pushed a narrowing using the explicit requireDeviceIdentity opt-in you suggested: added requireDeviceIdentity?: boolean to CallGatewayBaseOptions, removed the scopes-based inference from shouldOmitDeviceIdentityForGatewayCall, and set the flag only at the single subagent chokepoint (callSubagentGateway). Both previously-failing shards now pass — gateway-core 1957/1957, auth-node 279/279; call.test.ts 88/88 incl. :427/:658 and a new regression test for the loopback scoped subagent path.

Re the codegraph cross-PR flag with #85424: both touch executeGatewayRequestWithScopes but on non-overlapping regions — #85424 adds event-loop-drift/timeout handling in the function body; this PR's only edit there is the resolveDeviceIdentityForGatewayCall(...) argument at the deviceIdentity line. No semantic conflict. Suggest #85424 merges first and I rebase this on top.

@jailbirt

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 28, 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.

@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jul 10, 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 10, 2026
…pback token-auth setups

Rebased onto current main. Three narrow fixes for subagent completion announces
failing to deliver over loopback gateway-client + token auth:

- Fix 1 (gateway/call.ts): add an explicit `requireDeviceIdentity` opt-in so
  subagent completion calls retain device identity for operator-scope checks,
  instead of inferring it from the presence of scopes (which also fired for
  ordinary direct-local shared-token calls). Narrows the guard per review.
- Fix 2 (embedded-agent-runner): after the sessions-yield abort-settle soft
  timeout, keep waiting (bounded by a hard cap) for the session file lock to
  release so the next turn does not hit a stale lock — without blocking forever
  if the settle itself stalls.
- Fix 3 (embedded-agent-runner): also strip the sessions_yield context marker
  during abort cleanup so a subsequent announce re-run does not re-yield and get
  rejected as "did not produce a visible reply".

Fixes openclaw#77807.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@jailbirt
jailbirt force-pushed the fix/subagent-scope-stale-lock-yield-context branch from 895d4d3 to 429d29e Compare July 13, 2026 16:03
@jailbirt

Copy link
Copy Markdown
Contributor Author

Rebased onto current main and addressed the open items:

  • Fix 1 (@martingarramon): confirmed narrowed to the explicit requireDeviceIdentity opt-in — no longer inferred from params.scopes. Merged into main's refactored shouldOmitDeviceIdentityForGatewayCall (kept hasSharedSecretAuth/loopback logic). call.test.ts is green (360/360), including the two contract tests you flagged (:427, :658).
  • Fix 2 (@martingarramon's bounded-wait question): the post-timeout settle wait is now bounded by a hard cap (soft × 5) so a stalled settle can't block the next turn indefinitely, while still giving the file lock time to release.
  • Fix 3: re-applied at the relocated path (pi-embedded-runnerembedded-agent-runner), mirroring the existing INTERRUPT handling in both strip paths.

Now MERGEABLE. Real-behavior-proof still pending on my side.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 13, 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.

Re-review progress:

@jailbirt

Copy link
Copy Markdown
Contributor Author

Heads-up on checks-fast-loc-ratchet: after rebasing onto current main, it flags call.ts (1336→1356) and subagent-spawn.ts (1744→1749) as oversized legacy files that this PR grows. The additions belong there (the requireDeviceIdentity guard lives inside shouldOmitDeviceIdentityForGatewayCall; subagent-spawn threads the opt-in in 5 lines). This PR predates the ratchet. I can extract where sensible if you prefer, but the 2-5 line hooks can't move — let me know if you'd rather waive or want a specific reshape.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. labels Jul 13, 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 gateway Gateway runtime merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: S status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: sessions_spawn fails with missing scope operator.write despite full-scope operator token

4 participants