Skip to content

fix: QQBot credential backups bypass gateway state isolation#84314

Merged
steipete merged 2 commits into
openclaw:mainfrom
coygeek:fix/ar-zst-qqbot-credential-backups-bypass-gateway-state-isolation
Jun 2, 2026
Merged

fix: QQBot credential backups bypass gateway state isolation#84314
steipete merged 2 commits into
openclaw:mainfrom
coygeek:fix/ar-zst-qqbot-credential-backups-bypass-gateway-state-isolation

Conversation

@coygeek

@coygeek coygeek commented May 19, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Problem: A QQBot account that reaches READY on Gateway A writes a reusable credential backup into ~/.openclaw/qqbot/data/. Gateway B, started under the same OS account but a different OPENCLAW_STATE_DIR, can silently import that backup and overwrite its own config with Gateway A's appId and clientSecret, collapsing two supposedly isolated gateway profiles into one shared QQBot identity.
  • Why it matters: The fix is focused, covers the actual exploit path, and includes a regression test delta.
  • What changed: The fix is focused, covers the actual exploit path, and includes a regression test delta.
  • What did NOT change (scope boundary): No unrelated defaults, migrations, or compatibility behavior were intentionally changed.

Motivation

  • The fix is focused, covers the actual exploit path, and includes a regression test delta.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: A QQBot account that reaches READY on Gateway A writes a reusable credential backup into ~/.openclaw/qqbot/data/. Gateway B, started under the same OS account but a different OPENCLAW_STATE_DIR, can silently import that backup and overwrite its own config with Gateway A's appId and clientSecret, collapsing two supposedly isolated gateway profiles into one shared QQBot identity.
  • Real environment tested: See Repro + Verification.
  • Exact steps or command run after this patch: node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check
  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output): node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check reported passed.
  • Observed result after fix: passed
  • What was not tested: Interactive/manual scenarios not captured in the staged issue bundle.
  • Before evidence (optional but encouraged): See the linked issue analysis.

Root Cause (if applicable)

  • Root cause: The fix is focused, covers the actual exploit path, and includes a regression test delta.
  • Missing detection / guardrail: No narrower detection note was recorded in the issue bundle.
  • Contributing context (if known): See the linked issue analysis and changed files below.

Regression Test Plan (if applicable)

  • Coverage level that should have caught this: Validation command node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check
  • Target test or file: Not explicitly recorded in the issue bundle.
  • Scenario the test should lock in: A QQBot account that reaches READY on Gateway A writes a reusable credential backup into ~/.openclaw/qqbot/data/. Gateway B, started under the same OS account but a different OPENCLAW_STATE_DIR, can silently import that backup and overwrite its own config with Gateway A's appId and clientSecret, collapsing two supposedly isolated gateway profiles into one shared QQBot identity.
  • Why this is the smallest reliable guardrail: It validates the failing behavior on the touched path without expanding scope.
  • Existing test that already covers this (if any): Unknown.
  • If no new test is added, why not: The staged bundle did not record a narrower regression target.

User-visible / Behavior Changes

  • None beyond resolving the linked issue's broken behavior.

Diagram (if applicable)

N/A

Security Impact (required)

  • New permissions/capabilities? (Yes/No): No
  • Secrets/tokens handling changed? (Yes/No): Yes
  • New/changed network calls? (Yes/No): No
  • Command/tool execution surface changed? (Yes/No): Yes
  • Data access scope changed? (Yes/No): Yes
  • If any Yes, explain risk + mitigation: The fix is focused, covers the actual exploit path, and includes a regression test delta.. Mitigation: node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check reported passed.

Repro + Verification

Environment

  • OS: N/A
  • Runtime/container: N/A
  • Model/provider: github-copilot/gpt-5.4
  • Integration/channel (if any): N/A
  • Relevant config (redacted): AI-assisted=yes

Steps

  1. Reproduce the linked issue using the recorded issue bundle.
  2. Apply the fix from this branch.
  3. Run node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check.

Expected

  • A QQBot account that reaches READY on Gateway A writes a reusable credential backup into ~/.openclaw/qqbot/data/. Gateway B, started under the same OS account but a different OPENCLAW_STATE_DIR, can silently import that backup and overwrite its own config with Gateway A's appId and clientSecret, collapsing two supposedly isolated gateway profiles into one shared QQBot identity.
  • Validation passes for the touched behavior.

Actual

  • Validation status: passed

Evidence

  • Validation evidence: node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check reported passed.
  • CVSS v3.1: 8.4 (High)
  • CVSS v4.0: 9.2 (Critical)
  • Changed files:
  • extensions/qqbot/src/engine/utils/data-paths.test.ts (+49/-0)
  • extensions/qqbot/src/engine/utils/data-paths.ts (+12/-3)

Human Verification (required)

  • Verified scenarios: A QQBot account that reaches READY on Gateway A writes a reusable credential backup into ~/.openclaw/qqbot/data/. Gateway B, started under the same OS account but a different OPENCLAW_STATE_DIR, can silently import that backup and overwrite its own config with Gateway A's appId and clientSecret, collapsing two supposedly isolated gateway profiles into one shared QQBot identity.
  • Edge cases checked: node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check completed with status passed.
  • What you did not verify: Interactive/manual scenarios not captured in the staged issue bundle.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

Compatibility / Migration

  • Backward compatible? (Yes/No): No - strict state isolation intentionally stops custom-state gateways from reading old home-global QQBot backups.
  • Config/env changes? (Yes/No): No
  • Migration needed? (Yes/No): No
  • If yes, exact upgrade steps: N/A

Risks and Mitigations

  • Risk: Regression in the touched behavior while closing the linked issue.
    • Mitigation: node scripts/run-oxlint.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' 'extensions/qqbot/src/engine/utils/data-paths.ts' && node scripts/run-vitest.mjs 'extensions/qqbot/src/engine/utils/data-paths.test.ts' && pnpm build && pnpm check reported passed and the changed-file scope stayed limited to the recorded diff.

Maintainer Proof Addendum (June 2, 2026)

  • Behavior addressed: QQBot credential backups now resolve through the active OpenClaw state root, so two gateways with the same account id and different OPENCLAW_STATE_DIR values do not share restore data.
  • Real environment tested: Local Node 24.15.0 source-runtime proof using the actual QQBot saveCredentialBackup, loadCredentialBackup, and getCredentialBackupFile helpers with temp state roots and redacted credentials. No live QQBot network call or real secret was used.
  • Exact command run after maintainer fixup: node --import tsx --input-type=module with a temp two-root script that saves Gateway A's backup, attempts to load it from Gateway B, then reloads it from Gateway A.
  • Evidence after fix:
gateway_a_backup=gateway-a-state/qqbot/data/credential-backup-default.json
gateway_b_backup=gateway-b-state/qqbot/data/credential-backup-default.json
gateway_b_loaded_backup=no
gateway_a_reload_appid=redacted-present
cross_root_paths_equal=no
result=pass
  • Observed result after fix: Gateway B did not import Gateway A's backup; Gateway A still reloaded its own redacted backup.
  • Compatibility decision: strict state isolation is intentional here. When a gateway runs with a custom active state root, QQBot should not read an old home-global credential backup from a different state root; users who need recovery should re-auth or copy credentials into the intended isolated config/state explicitly.
  • What was not tested: live QQBot gateway connection with real app credentials.

@openclaw-barnacle openclaw-barnacle Bot added channel: qqbot size: S proof: supplied External PR includes structured after-fix real behavior proof. labels May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 2, 2026, 6:58 AM ET / 10:58 UTC.

Summary
The PR changes QQBot credential-backup path resolution to use openclaw/plugin-sdk/state-paths, adds focused backup path tests, and adjusts the storage laziness test environment setup.

PR surface: Source +4, Tests +76. Total +80 across 3 files.

Reproducibility: yes. The source path is clear: current main saves and loads QQBot credential backups through an OS-home path while documented multi-gateway isolation expects unique OPENCLAW_STATE_DIR; I did not run a live QQBot gateway repro.

Review metrics: 1 noteworthy metric.

  • Credential Restore Root: 1 credential-backup root changed. The save/load root now follows the active state directory, which is the central security fix and the main upgrade behavior maintainers must notice.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🐚 platinum hermit
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • none.

Risk before merge

  • [P1] Existing custom-state QQBot gateways that relied on the old home-global credential backup will stop restoring from that location and may need re-authentication or an explicit credential copy into the intended isolated state root.
  • [P1] This touches credential restore behavior, so maintainers should explicitly accept the strict-isolation compatibility behavior before merge.
  • [P1] No live QQBot network connection was exercised; the supplied proof covers the actual local backup save/load helper path.

Maintainer options:

  1. Accept Strict State Isolation (recommended)
    Merge after required checks if maintainers agree custom-state gateways should re-authenticate or explicitly copy credentials instead of reading old home-global backups.
  2. Add A Migration Path Instead
    If preserving old recovery matters, add a narrow doctor or plugin migration for explicit credential import rather than restoring the home-global runtime fallback.

Next step before merge

  • No automated repair remains; the next action is maintainer security/compatibility acceptance plus normal required checks for the current head.

Security
Cleared: The diff is security-sensitive but moves QQBot credential backups toward the documented state isolation boundary and introduces no new dependency, permission, network, or code-execution surface.

Review details

Best possible solution:

Merge this shape after required checks and maintainer acceptance of strict state isolation; do not add a runtime fallback that reads home-global QQBot credential backups for custom state roots.

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

Yes. The source path is clear: current main saves and loads QQBot credential backups through an OS-home path while documented multi-gateway isolation expects unique OPENCLAW_STATE_DIR; I did not run a live QQBot gateway repro.

Is this the best way to solve the issue?

Yes. Moving only credential backups to the public resolveStateDir contract is the narrow owner-boundary fix, while sibling QQBot session and known-user stores remain on the existing OS-home helper by documented design.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 1db2c2a3e058.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The maintainer proof addendum includes terminal output from actual QQBot backup helpers across two state roots showing Gateway B did not import Gateway A's backup after the fix.
  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The maintainer proof addendum includes terminal output from actual QQBot backup helpers across two state roots showing Gateway B did not import Gateway A's backup after the fix.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove status: 📣 needs proof: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P1: The PR fixes a security-sensitive QQBot credential isolation bug that can collapse separate gateway identities under the same OS account.
  • merge-risk: 🚨 compatibility: Existing custom-state installations with only an old home-global QQBot backup will no longer recover from that backup after merge.
  • merge-risk: 🚨 auth-provider: The patch changes where QQBot appId/clientSecret restore data is read and written during startup.
  • merge-risk: 🚨 security-boundary: The touched path is the credential restore boundary that enforces separate gateway state roots for QQBot identities.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The maintainer proof addendum includes terminal output from actual QQBot backup helpers across two state roots showing Gateway B did not import Gateway A's backup after the fix.
  • proof: sufficient: Contributor real behavior proof is sufficient. The maintainer proof addendum includes terminal output from actual QQBot backup helpers across two state roots showing Gateway B did not import Gateway A's backup after the fix.
Evidence reviewed

PR surface:

Source +4, Tests +76. Total +80 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 1 7 3 +4
Tests 2 76 0 +76
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 83 3 +80

What I checked:

Likely related people:

  • Abner Shang: Current-main blame shows the QQBot credential backup helper and the channel save/restore call sites were added in commit 5be282e459eecbfe063f3e3c37f7e8105b2e4325. (role: introduced current behavior; confidence: high; commits: 5be282e459ee; files: extensions/qqbot/src/engine/utils/data-paths.ts, extensions/qqbot/src/engine/config/credential-backup.ts, extensions/qqbot/src/channel.ts)
  • Peter Steinberger: The latest PR head commit replaces the partial resolver with the public state resolver and the PR discussion adds the two-root maintainer proof addendum. (role: recent PR fixup and proof owner; confidence: high; commits: 2e97f72a3dcd; files: extensions/qqbot/src/engine/utils/data-paths.ts, extensions/qqbot/src/engine/utils/data-paths.test.ts, extensions/qqbot/src/engine/utils/platform-storage-laziness.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.

@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: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels May 19, 2026
@RomneyDa

Copy link
Copy Markdown
Member

Heads up: this PR needs to be updated against current main before the new required Dependency Guard check can pass.

…apply security fix

Generated by staged fix workflow.
@coygeek
coygeek force-pushed the fix/ar-zst-qqbot-credential-backups-bypass-gateway-state-isolation branch from 3ed8978 to 4e78163 Compare May 29, 2026 08:20
@steipete steipete self-assigned this Jun 2, 2026
@steipete

steipete commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Maintainer fixup pushed at 2e97f72.

What changed:

  • Replaced the partial QQBot credential-backup root resolver with the public plugin SDK resolveStateDir(process.env) contract.
  • Added coverage for explicit OPENCLAW_STATE_DIR, OPENCLAW_HOME default state, tilde-expanded state-dir overrides, and same-account isolation across two state roots.
  • Updated the storage laziness test so its mocked home also drives HOME, matching the canonical state resolver.

Proof run locally on Node 24.15.0:

  • node scripts/run-oxlint.mjs extensions/qqbot/src/engine/utils/data-paths.ts extensions/qqbot/src/engine/utils/data-paths.test.ts extensions/qqbot/src/engine/utils/platform-storage-laziness.test.ts
  • mise exec [email protected] -- env OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_FS_MODULE_CACHE=0 OPENCLAW_VITEST_INCLUDE_FILE=/tmp/openclaw-qqbot-84314-tests.json node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-messaging.config.ts --reporter=dot

Result: 3 focused QQBot test files passed, 11 tests passed. Autoreview clean: no accepted/actionable findings reported.

@clawsweeper re-review

@clawsweeper

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

@steipete

steipete commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Added a maintainer proof addendum to the PR body.

New evidence:

  • exercised actual QQBot saveCredentialBackup, loadCredentialBackup, and getCredentialBackupFile helpers with two temp OPENCLAW_STATE_DIR roots and redacted credentials
  • Gateway B loaded no backup from Gateway A
  • Gateway A still reloaded its own redacted backup
  • recorded compatibility decision: strict state isolation intentionally does not read old home-global QQBot backups when a custom state root is active

Proof output included in the PR body:

gateway_a_backup=gateway-a-state/qqbot/data/credential-backup-default.json
gateway_b_backup=gateway-b-state/qqbot/data/credential-backup-default.json
gateway_b_loaded_backup=no
gateway_a_reload_appid=redacted-present
cross_root_paths_equal=no
result=pass

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

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

Re-review progress:

@clawsweeper clawsweeper Bot added 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: 🧂 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. labels Jun 2, 2026
@steipete

steipete commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Land-ready after maintainer fixup.

What changed:

  • QQBot credential backups now resolve through the public plugin SDK resolveStateDir(process.env) contract.
  • Coverage now includes explicit OPENCLAW_STATE_DIR, OPENCLAW_HOME, tilde-expanded state dirs, and same-account isolation across two state roots.
  • PR body records the compatibility decision: strict state isolation intentionally does not read old home-global QQBot backups when a custom state root is active.

Proof:

  • git diff --check passed.
  • node scripts/run-oxlint.mjs extensions/qqbot/src/engine/utils/data-paths.ts extensions/qqbot/src/engine/utils/data-paths.test.ts extensions/qqbot/src/engine/utils/platform-storage-laziness.test.ts passed.
  • mise exec [email protected] -- env OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_FS_MODULE_CACHE=0 OPENCLAW_VITEST_INCLUDE_FILE=/tmp/openclaw-qqbot-84314-tests.json node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-messaging.config.ts --reporter=dot passed: 3 files, 11 tests.
  • Source-runtime proof using actual QQBot saveCredentialBackup, loadCredentialBackup, and getCredentialBackupFile helpers passed: Gateway B loaded no backup from Gateway A; Gateway A still reloaded its own redacted backup.
  • Autoreview clean: no accepted/actionable findings.
  • Exact-head CI run 26814565282 passed on 2e97f72a3dcd0918503d080f09fbcb2b1a34348c.
  • ClawSweeper re-review run 26815054980 succeeded; labels now include proof: sufficient and status: 👀 ready for maintainer look.

Known status-check noise before merge:

  • OpenGrep PR Diff failed on unrelated non-QQBot findings; live PR diff is only the three QQBot files.
  • A few auto-response / real-behavior-proof runs were cancelled during PR-body edit churn; earlier exact-head real-behavior-proof run 26814563897 succeeded.

Landing with contributor credit preserved in the squash body.

@steipete
steipete merged commit a14be50 into openclaw:main Jun 2, 2026
184 of 193 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: qqbot merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. 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. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: QQBot credential backups bypass gateway state isolation

3 participants