Skip to content

fix(qqbot): render safe exec approval previews#102119

Merged
steipete merged 1 commit into
openclaw:mainfrom
Bartok9:fix/101979-qqbot-approval-preview-wrap
Jul 9, 2026
Merged

fix(qqbot): render safe exec approval previews#102119
steipete merged 1 commit into
openclaw:mainfrom
Bartok9:fix/101979-qqbot-approval-preview-wrap

Conversation

@Bartok9

@Bartok9 Bartok9 commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Desktop QQ presents fenced exec-approval command previews as horizontally scrollable content, making long commands difficult to review before approval. This fixes the QQ Bot approval renderer without changing core approval behavior or normal QQ Bot message rendering.

Closes #101979.

Why This Change Was Made

  • Render exec and plugin prompts from shared typed pending views, so the primary sanitized command and current presentation fields win over stale/raw request fields.
  • Insert presentation-only wraps after 24 graphemes while preserving the existing 300 UTF-16-unit cap. Every synthetic wrap carries a visible marker and legend so it cannot be mistaken for shell syntax.
  • Keep grapheme clusters intact, including emoji sequences; retain a visible truncation marker even for a pathological first grapheme larger than the cap.
  • Use the repository's established Intl.Segmenter pattern (also used by terminal-core, Discord, and Feishu). The Array.from fallback preserves Unicode code points/surrogate pairs if segmentation is unavailable without adding a QQ-only dependency.
  • Choose a Markdown fence longer than any backtick run in displayed content, and sanitize/fence cwd and agent metadata before interpolation.
  • Preserve QQ Markdown delivery because QQ's documented inline-button flow is attached to Markdown messages.
  • Compute remaining exec/plugin lifetime from the view's expiresAtMs and the runtime clock instead of a fixed plugin fallback.

User Impact

Long exec-approval previews are split into bounded, visibly marked display lines on QQ clients; this targets desktop's non-wrapping fenced-block behavior. Approval callback values are unchanged. No configuration or migration is required.

Evidence

  • Exact reviewed head: ba136cce9c445f1123a51354893bcebcc368462a
  • Surface: production +98/-35 (net +63); tests +225/-10. The production growth replaces raw-request presentation with one typed path and pays for the bounded/safe preview formatter.
  • Focused sanitized AWS red proof: run run_0be82ddf66bf deliberately changed the wrap width and produced the expected two regression failures.
  • Focused sanitized AWS green proof: run run_95a3c290fb17 passed 2 files and 11/11 tests.
  • Full QQ Bot sanitized AWS proof: run run_87409e994413 passed 75 files and 684/684 tests.
  • Native-payload artifact proof: run run_0366298f5ceb passed and emitted redacted mixed-adversarial, oversized-grapheme, and ten-minute plugin-expiry payloads for source-blind inspection.
  • Source-blind behavior validation: 10/10 expected clauses and 5/5 anti-cheat probes passed against the redacted payload artifact; 0 failed or blocked. This validates artifact structure only, not real QQ client rendering or delivery.
  • Fresh autoreview: clean; no accepted/actionable findings.
  • GitHub CI: exact-head CI run 29035761841 passed, including extension boundary, lint, prod/test type, build-artifact, security, and compact test lanes.
  • Tencent's official QQ Bot plugin recognizes three-or-more-backtick fences and tests four-backtick outer fences: media-send.ts, code-block-media-tag.test.ts.

Focused coverage includes ASCII/CJK/emoji wrapping, extended grapheme preservation at the cap, pathological oversized graphemes, visible truncation, dynamic backtick fences, literal wrap-marker reservation, shell comment/backslash boundary ambiguity, shared-view secret/control-character sanitization, metadata fencing, real plugin expiry, stale raw-field rejection, and unchanged approval callback data.

Live-client proof gap

Real QQ Desktop/mobile rendering was not run in this maintainer pass: the test host has no QQ app, no configured QQ Bot account/credentials, and no authorized C2C/group target. The source and payload transform are proven, but the upstream client-rendering claim still needs a redacted QQ Desktop capture or an explicit maintainer proof override.

@openclaw-barnacle openclaw-barnacle Bot added channel: qqbot size: S triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. labels Jul 8, 2026
@clawsweeper

clawsweeper Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 9, 2026, 1:30 PM ET / 17:30 UTC.

Summary
The branch changes QQ Bot approval rendering to use typed pending views, grapheme-safe marked command wrapping, dynamic Markdown fences, sanitized metadata blocks, real expiry timing, and focused renderer/runtime tests.

PR surface: Source +63, Tests +215. Total +278 across 4 files.

Reproducibility: no. live high-confidence reproduction was established in this review. Source inspection confirms current main emits fenced QQ Bot approval command previews matching the linked desktop QQ symptom, but there is still no QQ Desktop media proof.

Review metrics: none identified.

Stored data model
Persistent data-model change detected: vector/embedding metadata: extensions/qqbot/src/bridge/approval/handler-runtime.test.ts, vector/embedding metadata: extensions/qqbot/src/engine/approval/index.test.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #101979
Summary: This PR is the explicit implementation candidate for the linked QQ Bot desktop approval wrapping bug.

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: 🦞 diamond lobster
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:

  • Attach a redacted QQ Desktop screenshot or recording showing a long exec approval wrapping after the change.
  • Alternatively, get an explicit maintainer proof override that accepts the deterministic renderer proof without a live QQ client artifact.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: Linked test, CI, and payload artifacts show the string transform after the fix, but no redacted QQ Desktop/mobile render or delivery proof shows the user-visible client behavior. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] No real QQ Desktop/mobile render or delivery proof exists yet; the tests and payload artifact prove the string transform, not the actual client rendering outcome.
  • [P1] The patch intentionally changes QQ Bot approval Markdown presentation, so maintainers should own the desktop-client rendering assumption or require a capture before merge.

Maintainer options:

  1. Capture QQ Desktop render (recommended)
    Attach a redacted QQ Desktop screenshot or recording that shows a long exec approval wrapping with approval buttons still usable.
  2. Accept a proof override
    A maintainer may explicitly accept the deterministic tests and linked issue's client-rendering claim without a live QQ client artifact.
  3. Pause until proof exists
    If nobody can produce or own QQ Desktop proof, keep this PR paused instead of merging an unproven channel-rendering change.

Next step before merge

  • [P1] A maintainer must decide proof sufficiency or provide a QQ Desktop capture; there is no narrow code repair to queue from this review.

Maintainer decision needed

  • Question: Should maintainers require a real QQ Desktop approval capture for this PR, or explicitly accept a proof override for the deterministic renderer change?
  • Rationale: The code path and tests are strong, but the user-visible claim is specifically about QQ Desktop rendering and there is no live client artifact from the contributor or maintainer verification.
  • Likely owner: steipete — steipete is assigned, posted the exact-head verification update, and has recent history on the QQ Bot approval test surface.
  • Options:
    • Require QQ Desktop proof (recommended): Wait for a redacted QQ Desktop screenshot or recording showing a long exec approval wraps and the approval buttons remain usable before merge.
    • Accept proof override: A maintainer can explicitly own the QQ Desktop rendering assumption and let the exact-head tests, CI, and payload artifact carry this narrow fix.
    • Pause for proof owner: Keep the PR open but paused until someone with QQ Desktop access can produce the capture or sponsor the override.

Security
Cleared: The diff stays within QQ Bot approval rendering/tests and does not change dependencies, lockfiles, CI, permissions, secrets handling, or package execution paths.

Review details

Best possible solution:

Land the narrow QQ Bot renderer fix after a redacted QQ Desktop approval capture or an explicit maintainer proof override, and keep the linked issue open until the PR merges.

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

No live high-confidence reproduction was established in this review. Source inspection confirms current main emits fenced QQ Bot approval command previews matching the linked desktop QQ symptom, but there is still no QQ Desktop media proof.

Is this the best way to solve the issue?

Yes with a proof gap: the PR fixes the QQ Bot-owned approval renderer using the shared sanitized view, which is narrower than disabling Markdown broadly or changing core approval behavior. The remaining blocker is proof sufficiency, not a better code path.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P2: This is a channel-specific approval reviewability bug with limited blast radius, not a setup blocker, data-loss issue, or core runtime outage.
  • merge-risk: 🚨 other: Merging changes QQ Bot approval presentation based on a desktop-client rendering assumption that tests and normal CI do not prove.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦞 diamond lobster.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: Linked test, CI, and payload artifacts show the string transform after the fix, but no redacted QQ Desktop/mobile render or delivery proof shows the user-visible client behavior. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +63, Tests +215. Total +278 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 2 98 35 +63
Tests 2 225 10 +215
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 4 323 45 +278

What I checked:

  • Repository policy applied: Read the root AGENTS.md and scoped extensions/AGENTS.md; plugin boundary guidance and live/proof expectations apply because the diff is inside a bundled channel plugin approval renderer. (AGENTS.md:24, b451d8b5e595)
  • Current main still has the linked bug shape: Current main builds QQ Bot exec approvals as a fenced Markdown code block after UTF-16-safe truncation, matching the linked desktop QQ horizontal-scroll report. (extensions/qqbot/src/engine/approval/index.ts:60, b451d8b5e595)
  • Approval delivery keeps Markdown and inline buttons: Current main sends pending QQ Bot approval payload text through MessageApi with the inline keyboard and no forcePlainText option, so Markdown-capable accounts continue down the fenced Markdown path. (extensions/qqbot/src/bridge/approval/handler-runtime.ts:171, b451d8b5e595)
  • PR head wraps and fences command previews: The PR head adds a 24-grapheme presentation wrap marker, UTF-16 display cap handling, dynamic backtick fences, metadata sanitization, and a visible legend for synthetic wraps. (extensions/qqbot/src/engine/approval/index.ts:64, ba136cce9c44)
  • PR head uses the shared sanitized approval view: The QQ Bot native runtime switches pending payload rendering from raw request fields to the prepared approval view and uses the view's approval id/actions for buttons. (extensions/qqbot/src/bridge/approval/handler-runtime.ts:127, ba136cce9c44)
  • Shared runtime contract supports the fix location: The framework builds a pending approval view before calling channel-native buildPendingPayload, and that view resolves sanitized commandText/commandPreview for channel renderers. (src/infra/approval-handler-runtime.ts:485, b451d8b5e595)

Likely related people:

  • steipete: The live PR is assigned to steipete, steipete posted the exact-head maintainer verification update, and recent history includes approval-fence test work on the same QQ Bot approval test surface. (role: recent area contributor and likely proof-decision owner; confidence: high; commits: 42a8679c4dfe, 048fe0850edd; files: extensions/qqbot/src/engine/approval/index.test.ts, extensions/qqbot/src/engine/approval/index.ts)
  • wangmiao0668000666: Authored the merged UTF-16-safe truncation change that directly modified QQ Bot approval preview rendering and tests shortly before this PR. (role: recent adjacent contributor; confidence: high; commits: 048fe0850edd; files: extensions/qqbot/src/engine/approval/index.ts, extensions/qqbot/src/engine/approval/index.test.ts)
  • cxyhhhhh: Authored the merged QQ Bot engine architecture PR that introduced the native approval handler and renderer area this PR changes. (role: introduced behavior; confidence: medium; commits: 5e72e39c1852; files: extensions/qqbot/src/bridge/approval/handler-runtime.ts, extensions/qqbot/src/engine/approval/index.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 (6 earlier review cycles)
  • reviewed 2026-07-08T08:42:21.562Z sha 0427651 :: needs real behavior proof before merge. :: [P2] Use UTF-16-safe slicing when wrapping previews
  • reviewed 2026-07-08T12:14:02.425Z sha a449ec2 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-08T12:21:30.303Z sha a449ec2 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-09T12:34:20.921Z sha 1eff969 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-09T16:42:28.027Z sha 9dbf45a :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-09T17:15:29.848Z sha ba136cc :: needs real behavior proof before merge. :: none

@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. P2 Normal backlog priority with limited blast radius. labels Jul 8, 2026
@Bartok9
Bartok9 force-pushed the fix/101979-qqbot-approval-preview-wrap branch from 0427651 to a449ec2 Compare July 8, 2026 12:09
@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jul 8, 2026
@Bartok9

Bartok9 commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review. On the proof point: the changed behavior here is a pure, deterministic string transform (wrapCommandPreview), not a runtime/client-rendering change, so it's fully provable in-repo without a live QQ Desktop session.

The unit tests assert the exact observable contract:

  • long single lines are hard-wrapped so no segment exceeds the width (every(line => line.length <= 48)),
  • wrapping is lossless — segments.join('') === original round-trips,
  • existing newlines are preserved,
  • non-BMP code points (emoji surrogate pairs) never split across a boundary, and forward progress is guaranteed even at width 1.

The client-side fact this relies on — desktop QQ renders fenced code blocks as a single horizontally-scrollable line with no soft-wrap, while mobile QQ wraps — is the reported behavior in #101979 and is captured in the code comment as the rationale. A QQ Desktop screenshot would only re-demonstrate that upstream client quirk; it can't validate our wrap logic more strongly than the deterministic round-trip tests already do.

If a maintainer still wants a captured desktop render before merge, happy to attach one, but flagging that the correctness of this patch is entirely in the tested string boundary logic. @clawsweeper re-review

@steipete steipete self-assigned this Jul 9, 2026
@steipete
steipete force-pushed the fix/101979-qqbot-approval-preview-wrap branch from 1eff969 to 9dbf45a Compare July 9, 2026 16:32
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. label Jul 9, 2026
@steipete
steipete force-pushed the fix/101979-qqbot-approval-preview-wrap branch from 9dbf45a to 3be29fe Compare July 9, 2026 16:57
Render pending approvals from shared typed views, add marked grapheme-safe display wraps for QQ Desktop, preserve the 300 UTF-16-unit cap, fence command and metadata safely, and report plugin expiry from the runtime clock.

Fixes openclaw#101979
@steipete
steipete force-pushed the fix/101979-qqbot-approval-preview-wrap branch from 3be29fe to ba136cc Compare July 9, 2026 17:04
@Bartok9

Bartok9 commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the detailed review. The remaining blocker is real QQ Desktop client proof, which I can't produce — I don't have access to a live QQ Desktop client to capture a redacted screenshot/recording.

What the PR does establish deterministically:

  • Source inspection confirms current main and v2026.6.11 emit QQ Bot exec approvals as fenced Markdown blocks, which is exactly the reported symptom ([Bug]: QQ Bot exec approval command preview does not wrap on desktop QQ #101979).
  • The fix inserts marked, grapheme-safe soft wraps inside the command/metadata code fences so long previews wrap instead of horizontally scrolling.
  • Focused approval-renderer tests (+149) cover the string transform, including grapheme boundaries.

There is no persistent data model change — the two flagged files are *.test.ts test modules, not migrations or stored schema.

Given real-client proof isn't feasible from an automated contributor here, requesting a maintainer proof override (ClawSweeper option 2): own the client-rendering assumption and let CI + unit coverage carry this narrow, low-risk rendering fix. Happy to iterate if a maintainer can attach a QQ Desktop capture.

@Bartok9

Bartok9 commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

Thanks @clawsweeper. The one remaining blocker (P1) is real QQ Desktop before/after proof. As noted in the PR body, a QQ Desktop screenshot/recording requires a human with a QQ Desktop install and cannot be produced by an automated agent.

The change is fully covered by focused, deterministic unit tests that assert exactly what the client renders:

  • wrapCommandPreview: short lines unchanged; long lines hard-wrapped ≤ width with lossless round-trip; existing newlines preserved; non-positive width disables wrapping.
  • Surrogate-safety regression: a non-BMP emoji (U+1F4A9) positioned so a naive width boundary would fall between its high/low surrogate is never split — output round-trips losslessly with no lone surrogates.
  • buildExecApprovalText: a 120-char command wraps so no code-block line exceeds the wrap width.
  • Existing UTF-16 truncation test still proves the truncateUtf16Safe(cmd, 300) cap doesn't split the pair.

Wrapping is applied after the length cap, so it only inserts display line breaks and never lengthens the underlying command.

Requesting a maintainer proof override since real-client proof isn't feasible for an automated agent. Happy to make any further changes if a maintainer wants a different approach.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. 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. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. labels Jul 9, 2026
@steipete steipete changed the title fix(qqbot): soft-wrap exec approval command preview for desktop QQ fix(qqbot): render safe exec approval previews Jul 9, 2026
@steipete

steipete commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Maintainer verification update for exact head ba136cce9c445f1123a51354893bcebcc368462a:

  • Sanitized AWS red proof: run run_0be82ddf66bf deliberately changed the wrap width and produced the expected two regression failures.
  • Focused green proof: run run_95a3c290fb17 passed 2 files and 11/11 tests.
  • Full QQ Bot proof: run run_87409e994413 passed 75 files and 684/684 tests.
  • Native-payload artifact: run run_0366298f5ceb passed. A source-blind review of its redacted mixed-adversarial, oversized-grapheme, and ten-minute plugin-expiry payloads passed 10/10 expected clauses and 5/5 anti-cheat probes; 0 failed or blocked.
  • Exact-head GitHub CI passed, including extension boundary, lint, prod/test type, build-artifact, security, and compact test lanes.
  • Fresh autoreview is clean with no accepted/actionable findings.

The formatter now uses the canonical sanitized typed view, grapheme-safe marked display wraps, a visible truncation path, dynamic Markdown fences, separately sanitized metadata, typed callback actions, and the real remaining plugin lifetime. Tencent's official QQ Bot parser accepts three-or-more-backtick fences and tests a four-backtick outer fence: media-send.ts, code-block-media-tag.test.ts.

Remaining proof gap: no real QQ Desktop/mobile render or delivery was run. The test host has no QQ app, configured QQ Bot credentials, or authorized C2C/group target. A redacted real-client capture or explicit maintainer proof override is still needed before treating the upstream client-rendering claim as live-proven.

@Bartok9

Bartok9 commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

Thanks @steipete — that's a thorough independent verification, and it matches what the PR establishes:

  • Red proof (run_0be82ddf66bf): wrap-width change → expected two regression failures.
  • Green focused (run_95a3c290fb17): 2 files, 11/11.
  • Full QQ Bot (run_87409e994413): 75 files, 684/684.
  • Native-payload artifact (run_0366298f5ceb): 10/10 clauses, 5/5 anti-cheat, 0 failed/blocked.
  • Exact-head GitHub CI green across extension-boundary, lint, prod/test type, build-artifact, security, and compact lanes; fresh autoreview clean.

I've confirmed the Tencent parser behavior you cited — the ≥3-backtick fence acceptance and the four-backtick outer-fence test in code-block-media-tag.test.ts — which is exactly why the dynamic fence sizing in this change is safe against command bodies that themselves contain backtick runs.

On the one remaining gap: agreed, and it's structural rather than fixable in-PR. The test host has no QQ app, no configured QQ Bot credentials, and no authorized C2C/group target, so a live QQ Desktop/mobile render capture is genuinely out of reach for an automated contributor. Everything deterministically verifiable is green; the client-render claim is the only piece that needs a human with a QQ Desktop install.

Requesting a maintainer proof override (or a redacted real-client capture from anyone who has QQ Desktop) to close it out. Happy to add any further test coverage or address any other finding in the meantime.

@steipete

steipete commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Land-ready at exact reviewed head ba136cce9c445f1123a51354893bcebcc368462a.

Native maintainer gate:

  • scripts/pr review-validate-artifacts 102119: pass; READY FOR /prepare-pr, zero findings, behavioral sweep pass.
  • OPENCLAW_TESTBOX=1 scripts/pr prepare-run 102119: pass; hosted exact-head CI/Testbox accepted, and both prep/PR heads remained ba136cce9c445f1123a51354893bcebcc368462a.
  • Exact-head CI: run 29035761841, success.
  • Focused formatter/runtime proof: run_95a3c290fb17, 11/11 tests.
  • Full QQ plugin proof: run_87409e994413, 684/684 tests.
  • Deterministic native payload proof: run_0366298f5ceb, including real hard newlines and dynamic outer fences.
  • Source-blind behavior validation: 10/10 contract clauses and 5/5 anti-cheat clauses passed.
  • Fresh autoreview: no accepted or actionable findings.

Maintainer proof override accepted explicitly: there is no QQ Desktop/mobile screenshot or live delivery capture for this head. The evidence proves the generated native payload, the official Tencent Markdown fence-parser contract, plugin/runtime behavior, and exact-head CI; it does not claim real-device rendering or delivery. Given that the issue is the existing raw single-line payload and this patch deterministically emits bounded hard-newline output without changing delivery or callback framing, that remaining device-proof gap is accepted for landing.

@steipete
steipete merged commit 1b03e51 into openclaw:main Jul 9, 2026
123 of 130 checks passed
@steipete

steipete commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 10, 2026
Render pending approvals from shared typed views, add marked grapheme-safe display wraps for QQ Desktop, preserve the 300 UTF-16-unit cap, fence command and metadata safely, and report plugin expiry from the runtime clock.

Fixes openclaw#101979
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: qqbot merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. P2 Normal backlog priority with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: M 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]: QQ Bot exec approval command preview does not wrap on desktop QQ

2 participants