Skip to content

fix(agent): route explicit channel targets per recipient#73403

Closed
vincentkoc wants to merge 1 commit into
mainfrom
clownfish/ghcrawl-157028-autonomous-smoke
Closed

fix(agent): route explicit channel targets per recipient#73403
vincentkoc wants to merge 1 commit into
mainfrom
clownfish/ghcrawl-157028-autonomous-smoke

Conversation

@vincentkoc

Copy link
Copy Markdown
Member

Summary

Review notes

  • Keep explicit --session-key authoritative over --session-id lookup.
  • Preserve global-session continuity for non-deliverable-channel paths.
  • Ensure cross-store session-id scans skip the already-searched primary agent store, not an unrelated default store.

Validation

  • pnpm check:changed

ProjectClownfish replacement details:

@aisle-research-bot

aisle-research-bot Bot commented Apr 28, 2026

Copy link
Copy Markdown

🔒 Aisle Security Analysis

We found 2 potential security issue(s) in this PR:

# Severity Title
1 🟡 Medium Unbounded session key derivation from user-controlled --channel/--to can bloat sessions.json (DoS)
2 🟡 Medium PII exposure: session keys embed recipient identifiers (e.g., phone numbers) and may be persisted/logged
1. 🟡 Unbounded session key derivation from user-controlled --channel/--to can bloat sessions.json (DoS)
Property Value
Severity Medium
CWE CWE-400
Location src/agents/command/session.ts:235-249

Description

resolveSessionKeyForRequest now derives a session key from CLI-provided --channel and --to via buildAgentPeerSessionKey. These values are user-controlled strings with no length bound.

Impact:

  • buildAgentPeerSessionKey lowercases but does not enforce a maximum length for channel/peerId.
  • The resulting sessionKey is used as a key into the in-memory sessionStore object loaded from disk (sessions.json).
  • Downstream, session updates persist the whole store back to disk; extremely large keys can cause excessive memory usage and large JSON writes, leading to resource exhaustion / denial of service.

Vulnerable code (new behavior):

const explicitChannelSessionKey =
  requestedAgentId && explicitChannel && explicitTo && !requestedSessionId
    ? buildAgentPeerSessionKey({
        channel: explicitChannel,
        peerId: explicitTo,
        dmScope: "per-channel-peer",
      })
    : undefined;

While this does not appear to be used as a filesystem path, the lack of size bounds allows attacker-controlled inputs to create pathological session keys and oversized session stores.

Recommendation

Enforce strict validation and size limits on inputs used to derive session keys.

Suggested approach:

  1. Add a maximum length for channel and to (and/or for the final sessionKey).
  2. Reject or truncate values that exceed the limit.

Example:

function assertBoundedToken(name: string, value: string, max = 128) {
  const trimmed = value.trim();
  if (!trimmed) throw new Error(`${name} must not be empty`);
  if (trimmed.length > max) throw new Error(`${name} too long`);
  return trimmed;
}

const explicitChannel = opts.channel ? assertBoundedToken("channel", opts.channel, 64) : undefined;
const explicitTo = opts.to ? assertBoundedToken("to", opts.to, 128) : undefined;

Optionally, also add an upper bound in buildAgentPeerSessionKey (defense in depth) and/or hash long peer IDs (e.g., sha256(peerId) with a prefix) to keep keys stable and small.

2. 🟡 PII exposure: session keys embed recipient identifiers (e.g., phone numbers) and may be persisted/logged
Property Value
Severity Medium
CWE CWE-532
Location src/agents/command/session.ts:235-245

Description

The session key derivation for explicit --agent --channel --to requests now embeds the raw recipient identifier (often an E.164 phone number) into sessionKey.

  • Input (PII): opts.to / explicitTo may contain a phone number or other recipient identifier.
  • Transformation: buildAgentPeerSessionKey({ dmScope: "per-channel-peer", peerId: explicitTo }) constructs a session key like agent:ops:whatsapp:direct:+15551234567.
  • Exposure: sessionKey is then sent to the Gateway as a request parameter, and is also used as a session-store key. Session store operations may log activeSessionKey (e.g., maintenance warnings) and persist session keys in session-store JSON files. This creates a data/PII leakage risk via logs, local state files, telemetry, crash reports, etc.

Vulnerable code (new behavior):

const explicitChannelSessionKey =
  requestedAgentId && explicitChannel && explicitTo && !requestedSessionId
    ? buildAgentPeerSessionKey({
        agentId: storeAgentId,
        mainKey,
        channel: explicitChannel,
        peerKind: "direct",
        peerId: explicitTo,
        dmScope: "per-channel-peer",
      })
    : undefined;

Recommendation

Avoid embedding raw recipient identifiers (phone numbers, handles, emails) directly in session keys.

Recommended approaches:

  1. Use an opaque, non-PII identifier for per-peer sessions (store a mapping in the session entry):
import crypto from "node:crypto";

function peerSessionSuffix(channel: string, peerId: string) {// Use a keyed HMAC so it cannot be reversed and is stable per deployment.
  const secret = process.env.OPENCLAW_SESSION_KEY_SALT!; // provision securely
  const h = crypto.createHmac("sha256", secret);
  h.update(`${channel}:${peerId}`);
  return h.digest("hex").slice(0, 32);
}

const explicitChannelSessionKey =
  requestedAgentId && explicitChannel && explicitTo && !requestedSessionId
    ? `agent:${storeAgentId}:${explicitChannel}:direct:${peerSessionSuffix(explicitChannel, explicitTo)}`
    : undefined;
  1. Additionally redact session keys in logs/telemetry (e.g., avoid logging activeSessionKey, or log only the non-PII prefix + hash).

These changes preserve per-peer isolation without leaking PII into request parameters, disk state, or logs.


Analyzed PR: #73403 at commit 765765a

Last updated on: 2026-04-28T08:01:09Z

@vincentkoc vincentkoc added clownfish:merge-ready clawsweeper Tracked by ClawSweeper automation labels Apr 28, 2026
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation commands Command implementations agents Agent runtime and tooling size: S maintainer Maintainer-authored PR labels Apr 28, 2026
@greptile-apps

greptile-apps Bot commented Apr 28, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes openclaw agent --agent ... --channel ... --to ... so it derives a per-recipient session key (agent:<id>:<channel>:direct:<peer>) instead of falling back to the agent main session. It correctly preserves --session-id and --session-key precedence, skips the right primary agent store during cross-store ID scans, and ships focused unit tests that cover all three priority paths.

One minor guard asymmetry: explicitChannelSessionKey is computed (but safely discarded via ??) when requestedSessionKey is already set, whereas shouldPreferExplicitChannelSession already includes !requestedSessionKey as a guard. Aligning the two conditions would eliminate the unnecessary buildAgentPeerSessionKey call and make the precedence invariant self-documenting.

Confidence Score: 4/5

Safe to merge — core session-key derivation logic is correct and well-tested; only a minor code-consistency P2 noted.

No P0 or P1 issues found. The fix is logically sound: --session-key and --session-id both correctly suppress the new channel-derived key path; the ?? operator ensures the right precedence even with the guard asymmetry. Tests cover the main session, the new channel-recipient path, the --session-id override, and the global-scope non-channel path. Score capped at 4 due to the one P2 style finding.

src/agents/command/session.ts — minor guard asymmetry between shouldPreferExplicitChannelSession and explicitChannelSessionKey computation condition.

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/agents/command/session.ts
Line: 235-245

Comment:
**Asymmetric guard for `!requestedSessionKey`**

`shouldPreferExplicitChannelSession` (line 214) requires `!requestedSessionKey` to suppress `resolveExplicitAgentSessionKey`, but `explicitChannelSessionKey`'s guard omits that same check. When a caller provides an explicit session key together with agent, channel, and recipient, `buildAgentPeerSessionKey` is called and a channel-derived key is built — only to be silently discarded because `explicitSessionKey` wins via `??`. The behavior is correct, but the extra computation and the divergence between the two guards makes the precedence intent harder to follow. Adding `&& !requestedSessionKey` to the `explicitChannelSessionKey` ternary would align the two guards and avoid the unnecessary call.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix(agent): route explicit channel targe..." | Re-trigger Greptile

Comment on lines +235 to +245
const explicitChannelSessionKey =
requestedAgentId && explicitChannel && explicitTo && !requestedSessionId
? buildAgentPeerSessionKey({
agentId: storeAgentId,
mainKey,
channel: explicitChannel,
peerKind: "direct",
peerId: explicitTo,
dmScope: "per-channel-peer",
})
: undefined;

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.

P2 Asymmetric guard for !requestedSessionKey

shouldPreferExplicitChannelSession (line 214) requires !requestedSessionKey to suppress resolveExplicitAgentSessionKey, but explicitChannelSessionKey's guard omits that same check. When a caller provides an explicit session key together with agent, channel, and recipient, buildAgentPeerSessionKey is called and a channel-derived key is built — only to be silently discarded because explicitSessionKey wins via ??. The behavior is correct, but the extra computation and the divergence between the two guards makes the precedence intent harder to follow. Adding && !requestedSessionKey to the explicitChannelSessionKey ternary would align the two guards and avoid the unnecessary call.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/agents/command/session.ts
Line: 235-245

Comment:
**Asymmetric guard for `!requestedSessionKey`**

`shouldPreferExplicitChannelSession` (line 214) requires `!requestedSessionKey` to suppress `resolveExplicitAgentSessionKey`, but `explicitChannelSessionKey`'s guard omits that same check. When a caller provides an explicit session key together with agent, channel, and recipient, `buildAgentPeerSessionKey` is called and a channel-derived key is built — only to be silently discarded because `explicitSessionKey` wins via `??`. The behavior is correct, but the extra computation and the divergence between the two guards makes the precedence intent harder to follow. Adding `&& !requestedSessionKey` to the `explicitChannelSessionKey` ternary would align the two guards and avoid the unnecessary call.

How can I resolve this? If you propose a fix, please make it concise.

@clawsweeper

clawsweeper Bot commented Apr 28, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed July 3, 2026, 6:01 AM ET / 10:01 UTC.

Summary
The PR changes openclaw agent --agent --channel --to session resolution to derive agent-scoped channel-recipient keys, adds resolver and Gateway regression tests, and updates CLI docs plus CHANGELOG.md.

PR surface: Source +26, Tests +87, Docs +1. Total +114 across 7 files.

Reproducibility: yes. Source-level reproduction is high confidence: current main computes the explicit agent/main session before any channel-aware recipient key can be derived for openclaw agent --agent --channel --to; I did not run a live bridge flow in this read-only review.

Review metrics: 2 noteworthy metrics.

  • Session Selection Behavior: 1 existing CLI flag combination changed. Explicit openclaw agent --agent --channel --to sends move from agent-main continuity to a channel-recipient key, so upgrade continuity matters before merge.
  • Recipient-Derived Key Path: 1 raw recipient-derived session-key path added. CLI recipient values become Gateway params and persisted session-store keys, which is privacy and resource-safety relevant.

Stored data model
Persistent data-model change detected: serialized state: src/agents/command/session.ts, serialized state: src/commands/agent/session.test.ts, unknown-data-model-change: src/agents/command/session.ts, unknown-data-model-change: src/commands/agent/session.test.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #41483
Summary: This PR is the active fix candidate for the canonical explicit agent/channel/recipient session-routing bug; earlier same-shape PRs are closed unmerged attempts, while session-id and fresh-session reports are adjacent work.

Members:

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

Merge readiness
Overall: 🧂 unranked krab
Proof: 🌊 off-meta tidepool
Patch quality: 🧂 unranked krab
Result: blocked by patch quality or review findings.

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

Rank-up moves:

  • Refresh the branch on current main while preserving explicit --session-key and --session-id behavior.
  • [P2] Resolve the raw-recipient key and upgrade compatibility contract before merge.
  • Remove the release-owned CHANGELOG.md edit and keep release-note context in the PR body or merge message.

Risk before merge

  • [P1] GitHub reports the branch as CONFLICTING/DIRTY and maintainerCanModify: false, so maintainers cannot trust or land the exact merge result without an author refresh or replacement branch.
  • [P1] Changing explicit --agent --channel --to sends from the agent main session to a channel-recipient key can fork existing stored conversations, transcript state, and session-scoped settings unless maintainers accept that break or add upgrade handling.
  • [P1] The new key path persists and forwards raw --to recipient identifiers and does not visibly bound channel or recipient key material, which is privacy and resource-safety sensitive.
  • [P1] Validation is mostly source/CI-level; no redacted live Chatwoot, WhatsApp, Instagram, or equivalent bridge proof was inspected for a refreshed current-main merge result.

Maintainer options:

  1. Refresh And Settle The Key Contract (recommended)
    Resolve conflicts on current main, preserve explicit session selectors, and decide whether existing --agent --channel --to main-session rows need migration, compatibility handling, or an accepted break before merge.
  2. Accept Raw Recipient Keys Deliberately
    Maintainers can intentionally land raw recipient-derived keys only if the PR body and tests make the persisted/forwarded identifier contract explicit and accepted.
  3. Pause For Opaque Peer Identity
    If raw phone numbers or handles in session keys are not acceptable, pause this branch and choose a bounded hashed or mapped peer-identity design first.

Next step before merge

  • [P2] Protected maintainer PR needs an author/member refresh plus explicit compatibility and recipient-key privacy/resource decisions before repair or merge.

Security
Needs attention: No dependency, workflow, or permission change was found, but the diff expands raw recipient-derived session keys into explicit CLI channel sends and needs privacy/resource review.

Review findings

  • [P1] Add upgrade handling for the session-key switch — src/agents/command/session.ts:235-249
  • [P1] Bound or make recipient key material opaque — src/agents/command/session.ts:240-242
  • [P3] Remove the release-owned changelog entry — CHANGELOG.md:16
Review details

Best possible solution:

Refresh or replace the branch on current main, keep the shared resolver boundary, remove release-owned changelog churn, and land only after maintainers choose and test the compatibility path plus bounded or explicitly accepted recipient-key contract.

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

Yes. Source-level reproduction is high confidence: current main computes the explicit agent/main session before any channel-aware recipient key can be derived for openclaw agent --agent --channel --to; I did not run a live bridge flow in this read-only review.

Is this the best way to solve the issue?

No, not in the submitted form. The shared resolver plus Gateway/embedded caller boundary is the right fix direction, but the branch must first resolve conflicts and settle upgrade plus recipient-key privacy/resource behavior.

Full review comments:

  • [P1] Add upgrade handling for the session-key switch — src/agents/command/session.ts:235-249
    This changes explicit --agent --channel --to sends from the agent main session to a channel-recipient key. Existing users with stored main-session conversations or session-scoped settings for this flag shape will fork continuity unless the PR adds tested migration/compatibility handling or maintainers explicitly accept the break.
    Confidence: 0.88
  • [P1] Bound or make recipient key material opaque — src/agents/command/session.ts:240-242
    The new key is built from raw CLI --channel and --to values, so phone numbers, handles, and very long recipient strings become persisted session-key material and Gateway params. Use a bounded opaque representation or record a maintainer-approved raw-key contract before landing.
    Confidence: 0.86
  • [P3] Remove the release-owned changelog entry — CHANGELOG.md:16
    CHANGELOG.md is release-generated in this repository, so this normal PR should keep release-note context in the PR body or merge message instead of editing the changelog directly.
    Confidence: 0.93

Overall correctness: patch is incorrect
Overall confidence: 0.88

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 36dd9ee3c3c1.

Label changes

Label justifications:

  • P1: The linked bug can mix multi-recipient agent sessions and break real channel bridge workflows, while the active fix remains blocked on merge and safety review.
  • merge-risk: 🚨 compatibility: The PR changes shipped CLI session selection for an existing flag combination and currently conflicts with newer main behavior.
  • merge-risk: 🚨 session-state: The patch changes the persisted session key used for explicit channel-recipient sends, which can fork existing session history and settings.
  • merge-risk: 🚨 security-boundary: The new key path persists and forwards raw recipient identifiers, so maintainers need an explicit privacy and resource-safety decision.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🌊 off-meta tidepool and patch quality is 🧂 unranked krab.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The external-contributor proof gate does not apply to this maintainer-authored/protected PR, though maintainers should still refresh and validate the real bridge path before merge.
Evidence reviewed

PR surface:

Source +26, Tests +87, Docs +1. Total +114 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 3 30 4 +26
Tests 2 90 3 +87
Docs 2 3 2 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 7 123 9 +114

Security concerns:

  • [medium] Raw recipient identifiers enter persisted session keys — src/agents/command/session.ts:242
    peerId: explicitTo feeds the derived session key, so phone numbers, handles, or customer identifiers can be persisted as session-store keys and forwarded as Gateway params.
    Confidence: 0.88
  • [medium] Recipient key material has no visible bound — src/routing/session-key.ts:248
    buildAgentPeerSessionKey lowercases peer text and interpolates it into the key without a visible length cap, so user-controlled recipient text can enlarge session-store keys and writes.
    Confidence: 0.83

What I checked:

  • Protected live PR state: Live GitHub state reports the PR is non-draft but conflicting, has maintainerCanModify: false, and carries the protected maintainer label plus existing P1/merge-risk labels. (765765a972cc)
  • Current main still has the reported routing shape: Current main resolves explicitSessionKey from resolveExplicitAgentSessionKey before recipient context, and resolveSessionKey collapses direct non-group --to contexts to the agent main key. (src/agents/command/session.ts:262, 36dd9ee3c3c1)
  • Gateway caller on current main lacks channel-aware session resolution: Current main passes agentId, to, sessionId, and sessionKey into resolveSessionKeyForRequest, then sends the normalized channel separately to Gateway params. (src/commands/agent-via-gateway.ts:718, 36dd9ee3c3c1)
  • PR introduces raw recipient-derived session keys: The PR head builds explicitChannelSessionKey from channel: explicitChannel and peerId: explicitTo, then prefers it before normal context-derived session routing. (src/agents/command/session.ts:235, 765765a972cc)
  • Session-key helper preserves unbounded peer text: buildAgentPeerSessionKey lowercases the direct peer id and interpolates it into agent:<id>:<channel>:direct:<peer> for per-channel-peer; the normalization helper trims/lowercases but does not impose a size or opacity bound. (src/routing/session-key.ts:248, 36dd9ee3c3c1)
  • Session keys are persisted as store keys: Session persistence writes the normalized session key into the session store and saves the store; agent command persistence keeps the caller's in-memory sessionStore[sessionKey] aligned with the persisted entry. (src/config/sessions/store.ts:1698, 36dd9ee3c3c1)

Likely related people:

  • vincentkoc: Authored this PR and recently merged the default-agent session-routing compatibility fix in the same resolver and tests, so this person has direct current-history context beyond this proposal. (role: recent resolver contributor and current fix owner; confidence: high; commits: 61a18e5596c8, e349bdb949f5, 765765a972cc; files: src/agents/command/session.ts, src/commands/agent/session.test.ts, src/commands/agent-via-gateway.ts)
  • frankekn: Authored the merged --agent plus --session-id routing fix that this PR explicitly preserves and that lives in the same resolver/Gateway boundary. (role: adjacent session-id routing contributor; confidence: medium; commits: 934dd5b3a738; files: src/agents/command/session.ts, src/commands/agent/session.test.ts, src/gateway/server-methods/agent.ts)
  • Kaspre: Authored the merged explicit CLI --session-key support across the resolver, Gateway dispatch, and docs, which is a precedence rule this PR must not regress. (role: adjacent explicit session-key contributor; confidence: medium; commits: eb7f3b7b50c5, 01fce88082e5; files: src/agents/command/session.ts, src/commands/agent-via-gateway.ts, docs/cli/agent.md)
  • steipete: Recent history shows repeated routing/session-key helper work and docs around the same session-key contract that this PR changes. (role: session-key contract contributor; confidence: medium; commits: 9b30ff181c14, 6b940ed3ca8f, 8c8162f1f7d7; files: src/routing/session-key.ts, src/agents/command/session.ts, src/commands/agent-via-gateway.ts)
  • zhangguiping-xydt: Authored the merged subagent callback fix that promotes full agent-scoped session keys from to without falling back to main, an adjacent invariant for this PR. (role: adjacent agent-scoped target routing contributor; confidence: medium; commits: ba1be23821da; files: src/agents/command/session.ts, src/commands/agent-via-gateway.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.

@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. 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. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed 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. labels 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. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed 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. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 17, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 28, 2026
@steipete

steipete commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Landed the reviewed and hardened replay in #101507 as a2a68d1.

The replacement keeps this PR's core fix, adds provider-owned identity classification, binding/main-key handling, Gateway cancellation/idempotency safety, targeted SecretRef resolution, docs, and broad regression coverage. The original branch could not be updated because maintainer edits are disabled, so I am closing this PR in favor of the landed replacement.

Thank you @vincentkoc for the implementation and @pingfanfan for the original focused approach. For future PRs, enabling Allow edits by maintainers lets us apply review fixups without replaying the branch.

@steipete steipete closed this Jul 7, 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 clawsweeper Tracked by ClawSweeper automation commands Command implementations docs Improvements or additions to documentation maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. 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. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: S status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: --to flag ignored when using --agent with custom channel, all sessions map to main

2 participants