fix(slack): preserve long legacy interactive text by original4422 · Pull Request #127994 · openclaw/openclaw · GitHub
Skip to content

fix(slack): preserve long legacy interactive text - #127994

Merged
steipete merged 4 commits into
openclaw:mainfrom
original4422:codex/issue-126018
Aug 25, 2026
Merged

steipete merged 4 commits into
openclaw:mainfrom
original4422:codex/issue-126018

Conversation

@original4422

@original4422 original4422 commented Aug 22, 2026 •

Copy link
Copy Markdown
Contributor

Closes #126018

What Problem This Solves

Slack silently discarded everything after 3,000 characters in legacy interactive replies. The current shared presentation renderer also truncated modern text and context blocks, and its capability check incorrectly rejected content that could have been rendered losslessly. The existing Slack mrkdwn chunker additionally removed whitespace at chunk boundaries and exploded short inline-code spans into separate chunks.

Why This Change Was Made

The fix keeps the current canonical legacyInteractiveReplyToPresentation → buildSlackPresentationBlocks flow. That shared owner now splits both section and context text with the existing Slack-aware mrkdwn chunker, while the capability check recognizes both as natively renderable. Slack's existing reply resolver still owns its 50-block message boundary, and its existing send/accessibility planner still owns complete, bounded screen-reader fallbacks and actual provider posts.

The existing mrkdwn chunker now preserves ordinary boundary whitespace and keeps inline/fenced code together until an actual size boundary; protected Slack entities, links, Unicode surrogate pairs, wrapper-ineligible configured limits, and controls retain their existing contracts. Actual provider-boundary testing also exposed a second owner bug: Slack's outbound payload adapter returned only the final segment's receipt, silently forgetting earlier attachments and provider posts. Its existing media callback and the existing Plugin SDK receipt aggregator now retain every nested physical delivery in order, globally reindex receipt parts, and preserve an earlier question card's exact finalization identity.

Sending a new message can split oversized presentation blocks; editing an existing message cannot. The edit action owner therefore preserves its existing single-message contract: oversized presentation text/context uses the existing complete fallback, and the existing Slack-rendered UTF-8 byte guard rejects updates over 4,000 bytes without silently truncating them. Safe complete edits below that limit still succeed, while send-side native block segmentation remains lossless. No duplicate renderer, new configuration, public API, dependency, or fallback path is introduced.

Production LOC: +68/-40 (net +28). Tests: +323/-30. The positive production delta is necessary to retain every delivered attachment/platform message and its question-card lifecycle metadata at the payload owner, while preserving the distinct unsplittable edit action contract; no new helper, compatibility layer, or alternate transport path is added.

User Impact

Legacy Slack interactive replies and modern Slack presentation text/context no longer lose authored content after 3,000 characters. Long replies keep their order, styling, complete screen-reader text, and exactly one copy of every trailing control. Existing Slack API section, Block Kit message, and accessible fallback limits remain enforced.

Evidence

  • Before the production fix, seven focused regressions failed: legacy 3,000-character truncation; modern text/context rejected as unrenderable; both legacy and modern 150,001-character replies failing the 50-block logical boundary; ordinary whitespace disappearing at a section boundary; and 750 short inline-code spans incorrectly expanding into 1,501 chunks.
  • Initial renderer fix: node scripts/run-vitest.mjs extensions/slack/src/shared-interactive.test.ts extensions/slack/src/reply-blocks.test.ts extensions/slack/src/format.test.ts extensions/slack/src/channel.test.ts --run — 4 files, 150 tests passed.
  • After the additional provider-receipt root cause was exposed: OPENCLAW_VITEST_MAX_WORKERS=1 node scripts/run-vitest.mjs extensions/slack/src/channel.test.ts extensions/slack/src/question-finalization.test.ts extensions/slack/src/send.blocks.test.ts --run — 3 files, 126 tests passed, including a new failing-before-fix regression covering media receipt + earlier question receipt + final text receipt, globally indexed parts, preserved final message identity, and original question-card finalization.
  • Full hosted Slack suite surfaced four additional sibling-contract regressions before landing. The corrected owner paths were then verified with OPENCLAW_VITEST_MAX_WORKERS=1 node scripts/run-vitest.mjs extensions/slack/src/channel.test.ts extensions/slack/src/format.test.ts extensions/slack/src/shared-interactive.test.ts extensions/slack/src/reply-blocks.test.ts extensions/slack/src/message-action-dispatch.test.ts extensions/slack/src/outbound-adapter.test.ts extensions/slack/src/outbound-payload.test.ts extensions/slack/src/question-finalization.test.ts extensions/slack/src/send.blocks.test.ts extensions/slack/src/actions.blocks.test.ts --run — 10 files, 325 tests passed, including 3,001-character text/context edits that remain complete, markup-expanded and multibyte updates that correctly reject above the 4,000-byte edit boundary, all attachment receipt IDs, and bounded native text/context sends.
  • The exact hosted extension-test type gate passes locally: node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.extensions.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/extensions-test.tsbuildinfo. Slack SDK's generic Block.type: string is narrowed structurally before reading section/context properties; no casts or any are introduced.
  • Independent focused outbound verification: node scripts/run-vitest.mjs extensions/slack/src/channel.test.ts -t 'delivers oversized .* in order across the real Slack outbound adapter' --run — 3 cases passed, covering legacy interactive text, modern presentation text, and modern presentation context.
  • Real production Slack WebClient → ephemeral localhost Slack HTTP API, without injected send mocks or live credentials:
{"surface":"interactive","type":"text","inputCharacters":150001,"httpPostCount":51,"receiptPlatformMessageIds":51,"receiptOrderPreserved":true,"receiptIndicesSequential":true,"exactContentPreserved":true,"maximumAccessibilityFallbackCharacters":3000,"privateCallbackExposed":false,"actionCount":1}
{"surface":"presentation","type":"text","inputCharacters":150001,"httpPostCount":51,"receiptPlatformMessageIds":51,"receiptOrderPreserved":true,"receiptIndicesSequential":true,"exactContentPreserved":true,"maximumAccessibilityFallbackCharacters":3000,"privateCallbackExposed":false,"actionCount":1}
{"surface":"presentation","type":"context","inputCharacters":150001,"httpPostCount":51,"receiptPlatformMessageIds":51,"receiptOrderPreserved":true,"receiptIndicesSequential":true,"exactContentPreserved":true,"maximumAccessibilityFallbackCharacters":3000,"privateCallbackExposed":false,"actionCount":1}
{"surface":"actual-provider-50-block-boundary","inputCharacters":3001,"httpPostCount":2,"receiptPlatformMessageIds":2,"blocksPerMessage":[50,2],"exactContentPreserved":true,"maximumAccessibilityFallbackCharacters":3000,"privateCallbackExposed":false,"actionCount":1}

The 51 HTTP posts for 150,001 characters are intentional: Slack screen readers consume complete top-level text, Slack recommends 4,000 characters, and its documented truncation boundary is 40,000. Existing native-data/accessibility planning therefore subdivides logical 50-block batches when the 40,000-character hard boundary is crossed, without losing accessible content or private callback isolation. Existing covered behavior below the hard boundary, including complete fallbacks above 8,000 characters, remains unchanged. The independent 49-divider + 3,001-character case confirms the actual Slack HTTP provider still receives exactly two messages with 50 and 2 blocks at the Block Kit boundary. Official Slack limits: 3,000 characters per section and 50 blocks per message.

  • Targeted formatting and 12 changed-file guards passed, including conflict markers, max-lines ratchet, assertion safety, doctor closure tests, dependency pins, coercion helpers, and extension boundary guards. The broad remaining changed gate was intentionally stopped to reserve shared host capacity; exact-head hosted CI owns full extension typechecking and lint.
  • Fresh structured autoreview: clean. Independent maintainer verification personally reran both real localhost Slack HTTP proofs and confirmed canonical ownership, private callback isolation, accessibility, all sibling presentation surfaces, and primary contributor attribution.
  • No external Slack workspace or real Slack credentials were used.

Original contribution by @original4422 (Daniel Peng), preserved as the primary Git author.

@clawsweeper

clawsweeper Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

@openclaw-barnacle openclaw-barnacle Bot added channel: slack Channel integration: slack size: S labels Aug 22, 2026
@original4422
original4422 marked this pull request as ready for review August 22, 2026 17:28

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5f797c56f2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread extensions/slack/src/blocks-render.ts Outdated
Comment thread extensions/slack/src/blocks-render.ts Outdated
@clawsweeper clawsweeper Bot added merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. 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. labels Aug 22, 2026
@clawsweeper

clawsweeper Bot commented Aug 22, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed August 24, 2026, 7:44 PM ET / 23:44 UTC.

ClawSweeper review

What this changes

This PR changes legacy Slack interactive text from one truncated section to Slack-aware bounded sections, with regression tests for long and formatted text.

Merge readiness

⛔ Blocked until real behavior proof from a real setup is added - 6 items remain

Keep open: current main still truncates this legacy Slack path, but the branch conflicts with current main and replaces its shared renderer with a duplicate legacy implementation. It needs a rebase, a narrower owner-boundary fix, and real delivery proof.

Priority: P2
Reviewed head: deb62479c522d997b92015f4552a62e26acb3570

Review scores

Measure Result What it means
Overall readiness 🦪 silver shellfish (2/6) The patch has focused source-level coverage but needs current-main integration and real delivery-boundary proof.
Proof confidence 🦪 silver shellfish (2/6) Needs real behavior proof before merge: Needs real behavior proof before merge: injected sendSlack tests cover section and message counts, but the PR body says a mock-gateway or live Slack trace remains outstanding; add redacted after-fix boundary evidence. 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.
Patch quality 🦐 gold shrimp (3/6) 1 actionable review finding remain.

Verification

Check Result Evidence
Real behavior Needs proof Needs real behavior proof before merge: Needs real behavior proof before merge: injected sendSlack tests cover section and message counts, but the PR body says a mock-gateway or live Slack trace remains outstanding; add redacted after-fix boundary evidence. 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 5 items Current-main reproduction: Current main converts legacy interactive content through the shared presentation renderer, whose text branch truncates the resulting Slack section at 3,000 characters; its current test only asserts the capped result.
Caller and delivery boundary: The current resolver invokes the legacy renderer and appends its blocks into ordered 50-block segments, so the truncation occurs before existing multi-message delivery.
Current-main integration conflict: The PR replaces the shared legacy-to-presentation bridge with a 114-line direct renderer, duplicating current button/select rendering policy instead of changing only legacy text handling.
Findings 1 actionable finding [P1] Retain the shared legacy-to-presentation renderer
Security None None.

Live Verification

Command: pnpm test extensions/slack/src/channel.test.ts -- --reporter=verbose

Result: FAIL (failed) — execution before step 1 run: live-proof package manager pnpm is unavailable after its official installer (curl -fsSL https://get.pnpm.io/install.sh | sh -): command failed without output

live-proof package manager pnpm is unavailable after its official installer (curl -fsSL https://get.pnpm.io/install.sh | sh -): command failed without output

Assertions:

  • FAIL expect_output: delivers long legacy interactive text across ordered 50-block messages

How this fits together

Legacy Slack interactive replies become Block Kit blocks, then the reply resolver groups them into messages of at most 50 blocks. This change affects the text-rendering step before the existing outbound Slack delivery path.

flowchart LR
A[Legacy interactive text] --> B[Legacy-to-presentation bridge]
B --> C[Slack block renderer]
C --> D[Mrkdwn section chunks]
D --> E[Reply block resolver]
E --> F[Slack outbound messages]
Loading

Before merge

  • Add real behavior proof - Needs real behavior proof before merge: Needs real behavior proof before merge: injected sendSlack tests cover section and message counts, but the PR body says a mock-gateway or live Slack trace remains outstanding; add redacted after-fix boundary evidence. 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.
  • Retain the shared legacy-to-presentation renderer (P1) - Current main routes legacy payloads through legacyInteractiveReplyToPresentation and the shared presentation renderer. This replacement creates a second full renderer for controls and text; rebase and add the lossless text path without bypassing that shared flow.
  • Resolve merge risk (P1) - GitHub reports this branch as conflicting, and its duplicate renderer can drift from current shared control-rendering policy.
  • Resolve merge risk (P1) - The net +5 production LOC is not justified on current main while the shared legacy bridge is bypassed.
  • Resolve merge risk (P1) - A mock-gateway verdict or live Slack trace is still needed to prove the transport boundary rather than only injected-client behavior.
  • Complete next step (P2) - The current-main integration repair is mechanical, but contributor-supplied transport proof remains a merge gate.

Findings

  • [P1] Retain the shared legacy-to-presentation renderer — extensions/slack/src/blocks-render.ts:247-268
Agent review details

Security

None.

PR surface

Source +5, Tests +215. Total +220 across 6 files.

View PR surface stats
Area Files Added Removed Net
Source 2 27 22 +5
Tests 4 224 9 +215
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 6 251 31 +220

Review metrics

Metric Value Why it matters
Production versus test LOC production +5, tests +215 The positive production delta currently comes from bypassing the shared renderer and should be reassessed after rebase.

Root-cause cluster

Relationship: fixed_by_candidate
Canonical: #126018
Summary: This PR is the explicit candidate fix for the linked Slack interactive-text truncation report.

Members:

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

Merge-risk options

Maintainer options:

  1. Integrate with the shared renderer (recommended)
    Rebase and preserve the current legacy-to-presentation bridge while adding only the required lossless text handling and delivery-boundary proof.
  2. Pause the conflicting branch
    Pause or close this branch if the fix cannot be rebased without retaining a parallel legacy renderer.

Technical review

Best possible solution:

Rebase onto current main, retain the shared legacy-to-presentation path, add lossless legacy-text chunking at its owner boundary, and attach redacted mock-gateway or live Slack delivery evidence.

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

Yes, by source: current main routes legacy interactive text to truncateSlackText at the 3,000-character section boundary before reply segmentation.

Is this the best way to solve the issue?

No: the branch fixes the symptom but duplicates the renderer that current main centralized behind the legacy-to-presentation bridge.

Full review comments:

  • [P1] Retain the shared legacy-to-presentation renderer — extensions/slack/src/blocks-render.ts:247-268
    Current main routes legacy payloads through legacyInteractiveReplyToPresentation and the shared presentation renderer. This replacement creates a second full renderer for controls and text; rebase and add the lossless text path without bypassing that shared flow.
    Confidence: 0.95

Overall correctness: patch is incorrect
Overall confidence: 0.95

AGENTS.md: found and applied where relevant.

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

Labels

Label justifications:

  • P2: This repairs silent truncation in a legacy Slack interactive-reply path with bounded channel-specific blast radius.
  • merge-risk: 🚨 compatibility: The branch bypasses current main's shared conversion from legacy interactive payloads to presentation blocks.
  • merge-risk: 🚨 message-delivery: The changed renderer determines how long text is split and sequenced into Slack messages.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: Needs real behavior proof before merge: injected sendSlack tests cover section and message counts, but the PR body says a mock-gateway or live Slack trace remains outstanding; add redacted after-fix boundary evidence. 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

Acceptance criteria:

  • [P1] pnpm test extensions/slack/src/format.test.ts extensions/slack/src/shared-interactive.test.ts extensions/slack/src/reply-blocks.test.ts extensions/slack/src/channel.test.ts.
  • [P1] pnpm check:changed.

What I checked:

  • Current-main reproduction: Current main converts legacy interactive content through the shared presentation renderer, whose text branch truncates the resulting Slack section at 3,000 characters; its current test only asserts the capped result. (extensions/slack/src/blocks-render.ts:301, b71a09fd8a3e)
  • Caller and delivery boundary: The current resolver invokes the legacy renderer and appends its blocks into ordered 50-block segments, so the truncation occurs before existing multi-message delivery. (extensions/slack/src/reply-blocks.ts:471, b71a09fd8a3e)
  • Current-main integration conflict: The PR replaces the shared legacy-to-presentation bridge with a 114-line direct renderer, duplicating current button/select rendering policy instead of changing only legacy text handling. (extensions/slack/src/blocks-render.ts:247, deb62479c522)
  • Test coverage and remaining proof gap: The branch adds formatter, resolver, and injected-send coverage, but its body expressly says a mock-gateway or live Slack trace remains outstanding; injected sendSlack tests are mock-only proof. (extensions/slack/src/channel.test.ts:1675, deb62479c522)
  • Feature-history provenance: The current shared Slack renderer dates to commit 59a9221; it is an ancestor of current main and establishes the canonical bridge this PR bypasses. (extensions/slack/src/blocks-render.ts:251, 59a92211801e)

Likely related people:

  • shakkernerd: Authored the current-main Slack renderer that establishes the shared legacy-to-presentation route. (role: recent area contributor; confidence: high; commits: 59a92211801e; files: extensions/slack/src/blocks-render.ts, extensions/slack/src/format.ts)
  • Peter Steinberger: Authored the surrounding plugin-SDK runtime refactor in this rendering history. (role: shared-runtime refactor contributor; confidence: medium; commits: 3378e07d50bf; files: src/plugin-sdk/interactive-runtime.ts, extensions/slack/src/blocks-render.ts)
  • Vincent Koc: Appears in prior Slack interactive delivery work in the feature history. (role: interactive-rendering history contributor; confidence: medium; commits: 12ae4eee7ed1, f2475a7f705f; files: extensions/slack/src/blocks-render.ts, extensions/slack/src/reply-blocks.ts)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Rebase the repair onto the shared legacy-to-presentation path and remove the duplicate renderer.
  • Add a redacted mock-gateway verdict or live Slack trace showing ordered delivery beyond the 50-block boundary.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
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.

Workflow

  • 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.

History

Review history (4 earlier review cycles)
  • reviewed 2026-08-22T18:18:51.516Z sha cf54f1f1f33ef955aed7a3d863c6aed711f8bd9d :: needs real behavior proof before merge. :: [P2] Clear carried markers after oversized protected tokens
  • reviewed 2026-08-22T19:02:19.590Z sha 0f6794a65bfbf711064c006817a00350f4a70eb1 :: needs real behavior proof before merge. :: none
  • reviewed 2026-08-23T16:41:10.830Z sha 0f6794a65bfbf711064c006817a00350f4a70eb1 :: needs real behavior proof before merge. :: [P1] Handle configured limits too small for a code wrapper
  • reviewed 2026-08-23T19:07:36.423Z sha deb62479c522d997b92015f4552a62e26acb3570 :: needs real behavior proof before merge. :: none

@original4422

Copy link
Copy Markdown
Contributor Author

Fixed in 6d3b14c9 (now included in head 0f6794a6). The finding was valid: after an oversized allowed angle token was emitted as balanced code fragments, the chunker retained a synthetic opener, so the source closer became a marker-only section.

Deterministic RED covered both forms: inline code produced 4 chunks instead of 3, and fenced code produced 6 instead of 5. The owner-level fix now clears continuation state after a flush, reopens code lazily only for later content, and consumes a closer when there is no unflushed content. Both regressions reconstruct the protected token exactly from balanced, non-marker-only chunks.

I also added a local mocked outbound boundary proof for both inline and fenced code: each input produces exactly 50 real Slack sections, calls the injected sendSlack dependency once, and reconstructs the original token exactly. This did not call a real Slack API or use credentials.

Validation: focused Slack 5 files / 195 tests; full Slack 137 files / 2,446 tests; check-changed passed; post-merge exact sanity 4/4; fresh branch autoreview and TruffleHog clean with no actionable findings.

@original4422

Copy link
Copy Markdown
Contributor Author

Hi maintainers — could you please rerun the failed CI jobs for exact head 0f6794a65bfbf711064c006817a00350f4a70eb1?

The only primary failure is check-lint; openclaw/ci-gate is derivative. The complete log contains no lint diagnostic: the extension lint process received SIGTERM, exited 143, and the Actions step was marked cancelled after about five minutes despite the workflow's 20-minute timeout. The exact CI lint command passes locally on Node 24.19.0 in 208.04s, and pnpm format:check passes all 29,898 files. I also tried the normal failed-job rerun, but GitHub rejected it because repository admin rights are required.

Thank you.

@clawsweeper clawsweeper Bot added the merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. label Aug 23, 2026
@original4422

Copy link
Copy Markdown
Contributor Author

Addressed the current ClawSweeper P1 in deb62479c522d997b92015f4552a62e26acb3570.

The finding was valid. A focused RED on the prior exact head showed that wrapper-ineligible positive limits emitted orphan code markers: inline limits 1/2 and fenced limits 1/5/6 now have regression coverage. The owner-level chunker fix consumes only the formatting delimiters when a balanced wrapper cannot fit and preserves the payload as bounded literal text.

Validation on the new exact head:

  • focused formatter + outbound: 2 files, 75 tests passed;
  • full Slack extension suite, with uppercase/lowercase proxy variables unset: 137 files, 2,448 tests passed;
  • the two upload-guard cases that failed under the machine SOCKS proxy passed 2/2 proxy-free;
  • git diff --check passed.

The exact-head check-changed rerun was stopped during its max-lines ratchet to preserve the controller's 20 GiB disk reserve; no static failure had been reported before cancellation. I updated the PR body with the RED/GREEN evidence, cumulative +5 production LOC rationale, and the still-outstanding mock-gateway or live Slack proof gap.

original4422 and others added 3 commits August 25, 2026 09:08
@steipete
steipete force-pushed the codex/issue-126018 branch from deb6247 to bffcfcc Compare August 25, 2026 16:39
@steipete

Copy link
Copy Markdown
Contributor

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Aug 25, 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 exact_review_queue).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
@steipete
steipete merged commit a2ef21e into openclaw:main Aug 25, 2026
105 of 107 checks passed
@steipete

Copy link
Copy Markdown
Contributor

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Aug 26, 2026
* fix(slack): preserve long interactive and presentation text

* fix(slack): retain every outbound delivery receipt

Co-authored-by: Peter Steinberger <steipete@gmail.com>

* test(slack): narrow presentation regression fixtures

Co-authored-by: Peter Steinberger <steipete@gmail.com>

* fix(slack): preserve single-message presentation edits

Co-authored-by: Peter Steinberger <steipete@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: slack Channel integration: slack 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. 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]: Slack legacy interactive text is truncated at 3,000 characters

2 participants