Skip to content

feat(approvals): add plain-language plugin approvals#81864

Closed
kennykankush wants to merge 119 commits into
openclaw:mainfrom
kennykankush:ux/plain-plugin-approval-prompts-pr
Closed

feat(approvals): add plain-language plugin approvals#81864
kennykankush wants to merge 119 commits into
openclaw:mainfrom
kennykankush:ux/plain-plugin-approval-prompts-pr

Conversation

@kennykankush

@kennykankush kennykankush commented May 14, 2026

Copy link
Copy Markdown

Mission

Plugin approvals are a security boundary, but they are often delivered in chat where the old fallback text read like internal debug output. A normal approval could show a raw title, full command text, proposed exec policy, session key, tool/plugin IDs, expiry, and /approve <id> syntax all at once.

That raw format is useful for maintainers, but it is not easy for a Telegram/Matrix user to scan quickly. The goal of this PR is to make opt-in plugin approvals understandable at a glance while preserving the legacy raw behavior by default.

In short: keep the original technical approval prompt as the default, and add a plain-language approval mode for users who explicitly choose it.

What This Adds

This PR adds approvals.plugin.language with three modes:

  • original: existing raw technical plugin approval text. This remains the default.
  • simple: a short plain-language prompt with Action, It will, Risk, and available choices.
  • simple-technical: the plain-language prompt plus the raw technical fields below it.

Example config:

{
  "approvals": {
    "plugin": {
      "language": "simple"
    }
  }
}

The new renderer keeps interactive approval metadata intact so native Telegram/Matrix approval buttons can still be rendered. Text-only channels still get an actionable /approve plugin:<id> allow-once|allow-always|deny fallback.

Implementation

  • Added the typed PluginApprovalLanguage config surface and validation.
  • Wired the configured language through shared plugin approval rendering.
  • Forwarded the language option through fallback delivery and native Telegram/Matrix approval payloads.
  • Added plain-English approval output with risk text and decision-aware fallback instructions.
  • Added Command preview output for commands that are high risk or cannot be summarized completely.
  • Redacted token/password/API-key/bearer/basic-auth/cookie/userinfo forms from previews before they can be posted into chat.
  • Updated generated config and plugin SDK API baselines.
  • Added focused renderer and forwarder tests.

Safety Model

The important rule is: if simple mode hides raw technical details, the summary must either explain the meaningful action or fail closed.

Fail closed means the approval becomes higher risk and shows a redacted command preview instead of pretending the command is harmless.

The renderer now handles and tests common Codex app-server command shapes:

  • shell wrappers: bash -lc, sh -c, zsh -c, env, timeout, set -a, source;
  • shell control: &&, ||, ;, background &, conditionals, loops, and attached redirections like cat notes.txt>out.txt;
  • pipelines: known stages are summarized stage-by-stage; unknown stages become high risk with a preview;
  • file reads/writes/deletes: cat, sed, find, rm, mkdir, touch, cp, mv, redirection writes;
  • network transfers: curl and wget URL targets, upload operands, output operands, stdin upload via redirection, config/header/cookie/auth/netrc forms;
  • credentials: bearer headers, OAuth bearer flags, basic auth, proxy auth, cookie headers, netrc credential sources, URL userinfo;
  • dev/ops commands: git, docker, service managers, package managers, interpreters, logs/process inspection;
  • remote commands: ssh, scp, SSH remote commands, and SSH local-execution options such as ProxyCommand and LocalCommand.

Review And Hardening Trail

This PR went through a long approval-safety review loop because turning verbose technical prompts into plain language makes the summarizer security-sensitive.

Issues fixed during review:

  • Preserved actionable text fallback instructions for channels without buttons.
  • Made pipelines visible before raw command text can be hidden.
  • Made command target extraction command-aware so boolean flags like cat -n .env do not hide sensitive targets.
  • Surfaced curl/wget upload and output operands, including .env style local-file transfers.
  • Handled stdin uploads such as curl --data-binary @- ... < .env.
  • Redacted basic-auth, OAuth bearer, cookie, header, and URL credential forms from command previews.
  • Failed closed on curl config files and curl header-file inputs.
  • Surfaced wget credential/header/cookie options.
  • Showed targets for redirected formatter writes like printf ... > .env.
  • Handled background shell separators such as sleep 1 & rm -rf /tmp/x.
  • Parsed Git global options such as git -C repo reset --hard before classifying subcommands.
  • Treated find output-file predicates like -fprint, -fprint0, -fls, and -fprintf as writes.
  • Detected attached shell redirections like cat notes.txt>out.txt.
  • Failed closed on SSH local-execution options such as ssh -o ProxyCommand=... and ssh -o LocalCommand=....
  • Refreshed against latest upstream/main repeatedly and regenerated the config baseline after conflicts.
  • Stabilized cron test mock state exposed by the refreshed CI shard.

The latest ClawSweeper review no longer reports a concrete repair item. It now asks for human maintainer review of the opt-in approval-safety boundary and branch scope.

Current Status

  • Latest head at time of this update: 91d6303a0e.
  • GitHub reports the PR mergeable and clean.
  • CI/checks are green on the latest head.
  • Real behavior proof is successful.
  • ClawSweeper durable review status: needs maintainer review before merge, not an automated repair.
  • Remaining decision: maintainers need to accept the opt-in plain-language approval UX/security boundary, or ask for scope splitting if they want the unrelated refreshed-base/test-stability churn separated.

Verification

Local verification after the latest SSH hardening and main refresh:

  • pnpm config:docs:check
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.unit-fast.config.ts src/plugin-sdk/approval-renderers.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.infra.config.ts src/infra/plugin-approval-forwarder.test.ts
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo
  • pnpm check:test-types
  • pnpm lint --threads=8

Earlier focused verification also covered config schema/help quality, plugin SDK API baseline, gateway/channel state, and live renderer output.

Real behavior proof

  • Behavior or issue addressed: Chat-delivered plugin approvals can now render as a short plain-English approval card instead of a raw technical dump when approvals.plugin.language is set to simple. The old raw format remains the default through original.
  • Real environment tested: Hadi's live OpenClaw source checkout on Ubuntu 24.04 (/home/hadi/src/openclaw), the PR worktree, and Telegram channel status in polling mode.
  • Exact steps or command run after this patch:
    • Rendered real approval messages through buildPluginApprovalRequestMessage(..., { language: "simple" }).
    • Ran focused approval renderer and forwarder tests.
    • Ran type, lint, config docs, and baseline checks.
    • Cherry-picked the feature into the live source checkout during testing, ran pnpm build, restarted openclaw-gateway.service, and checked gateway/Telegram channel state.
  • Evidence after fix: terminal renderer output showed the intended card shape:
🛡️ Approval needed
Action
Create/check workspace files or folders

It will
- create folder(s): memory
- check whether a condition or file exists: memory/context.md

Risk: Low
Only creates or checks workspace files. No network, service, or delete step detected.

Choose below.
If buttons are unavailable, reply: /approve plugin:example allow-once|allow-always|deny

Pipeline and unknown-stage proof:

--- pipeline curl ---
🛡️ Approval needed
Action
Use the network or download data

It will
- read file contents: notes.txt
- make a network request or download data: https://example.test/upload

Risk: Medium
Network commands can send or fetch data outside this machine.

Choose below.
If buttons are unavailable, reply: /approve plugin:pipeline allow-once|allow-always|deny

--- unknown pipeline ---
🛡️ Approval needed
Action
Run a terminal command

It will
- read file contents: notes.txt
- run custom-uploader

Command preview
cat notes.txt | custom-uploader --send

Risk: High
This command is part of a pipeline I cannot fully summarize, so review it before approving.

Choose below.
If buttons are unavailable, reply: /approve plugin:unknown allow-once|allow-always|deny

Live channel state checked during proof:

Telegram default (Telegram): enabled, configured, running, connected, mode:polling, token:tokenFile

Observed result after fix:

  • simple mode no longer includes the raw technical details block.

  • Escaped shell separators such as &amp;&amp; are decoded before parsing.

  • Shell conditionals no longer surface as fake run if / run then actions.

  • Non-shell pipeline stages are visible or fail closed with a high-risk preview.

  • Sensitive command previews are redacted before being shown in chat.

  • SSH local-execution options now fail closed with a high-risk preview.

  • What was not tested:

  • The Mantis Telegram Desktop GIF run skipped instead of producing before/after GIFs. This PR still has terminal renderer proof, live gateway/channel state proof, earlier Telegram screenshot proof, and a successful Real behavior proof check.

@openclaw-barnacle openclaw-barnacle Bot added channel: matrix Channel integration: matrix channel: telegram Channel integration: telegram size: L triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 14, 2026
@clawsweeper

clawsweeper Bot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 30, 2026, 8:50 PM ET / 00:50 UTC.

Summary
The PR adds an opt-in approvals.plugin.language setting, SDK approval-language exports, plain-language plugin approval rendering, channel wiring, docs, generated baselines, and focused tests.

Reproducibility: not applicable. as a feature PR. Current-main source shows only raw plugin approval text, while the PR body and PR-head source show the proposed opt-in simple rendering path.

Review metrics: 2 noteworthy metrics.

  • Approval config surface: 1 added, 0 changed, 0 removed. approvals.plugin.language is a durable user/operator configuration contract that needs compatibility and product acceptance before merge.
  • Plugin SDK approval surface: 1 helper and 1 type exported. The PR exposes approval language through the plugin SDK, making the feature a plugin-author compatibility surface rather than an internal renderer detail.

Stored data model
Persistent data-model change detected: persistent cache schema: test/scripts/codex-app-server-protocol-source.test.ts, serialized state: test/scripts/cli-startup-bench-spawner.test.ts, serialized state: test/scripts/mock-openai-http.test.ts, unknown-truncated-pull-files, vector/embedding metadata: docs/tools/exec-approvals-advanced.md. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

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

Rank-up moves:

  • Refresh the branch onto current main and rerun focused approval/channel checks.
  • Get explicit maintainer acceptance for the config/SDK and approval-security boundary.
  • Split unrelated refreshed-base churn if it remains hard to review safely.

Mantis proof suggestion
A native Telegram proof would directly show the changed approval copy, buttons, and fallback command in the user-visible transport. A maintainer can ask Mantis to capture proof by posting this exact PR comment:

@openclaw-mantis telegram desktop proof: verify simple plugin approval text and buttons/fallback command in Telegram.

Risk before merge

  • [P1] Merging would add a durable approvals.plugin.language config key and SDK-visible approval-language contract that maintainers have not explicitly accepted in the visible discussion.
  • [P1] The simple mode intentionally hides raw technical fields from the primary approval text, making the summarizer and redaction behavior part of the plugin approval security boundary.
  • [P1] GitHub currently reports the branch as dirty against the base, so the current-base merge result and checks need refresh before any land-ready verdict.
  • [P1] The branch includes substantial refreshed-base, script, test, generated, and channel churn around a security-sensitive UX change, which increases review and conflict risk.

Maintainer options:

  1. Accept the contract and refresh
    If maintainers want this config and SDK surface, refresh the branch onto current main and rerun focused approval and channel proof before merge.
  2. Split the review surface
    If the feature direction is acceptable but the branch remains hard to audit, split the approval-language changes from unrelated refreshed-base, script, and test churn.
  3. Pause the feature direction
    If maintainers do not want approval wording to become a config or SDK contract, pause or close the PR rather than landing unsupported product direction.

Next step before merge

  • [P2] The remaining blocker is maintainer product/security acceptance plus branch refresh, not a narrow automated code repair.

Security
Needs attention: The diff is security-sensitive because it changes the human-facing explanation and redaction boundary used to approve plugin actions.

Review details

Best possible solution:

Land only a maintainer-approved, opt-in approval-language contract on a clean current-base branch, with unrelated refreshed-base churn split out if it keeps obscuring the approval change.

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

Not applicable as a feature PR. Current-main source shows only raw plugin approval text, while the PR body and PR-head source show the proposed opt-in simple rendering path.

Is this the best way to solve the issue?

Unclear until maintainer decision. The default-original, opt-in language mode is a plausible maintainable shape, but the public config/SDK permanence and summarized approval security boundary need owner acceptance before it can be called the best fix.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P2: This is a normal-priority approval UX and plugin SDK/config feature with limited blast radius but meaningful maintainer review needs.
  • merge-risk: 🚨 compatibility: The PR adds a new config key and SDK-visible approval-language contract that existing users and plugin authors may rely on after release.
  • merge-risk: 🚨 security-boundary: The new simple approval mode changes what technical context users see before approving plugin actions.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (terminal): The PR body includes after-fix rendered approval output, terminal proof, an earlier Telegram screenshot, and live gateway/Telegram channel-state evidence for the changed behavior.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix rendered approval output, terminal proof, an earlier Telegram screenshot, and live gateway/Telegram channel-state evidence for the changed behavior.
  • mantis: telegram-visible-proof: Mantis should capture Telegram visible proof. The PR changes visible Telegram plugin approval text and fallback commands that can be demonstrated in a short Telegram Desktop recording.
Evidence reviewed

Security concerns:

  • [medium] Approve the summarized approval boundary — src/infra/plugin-approvals.ts:3699
    The simple language mode can omit raw technical fields from the primary approval text, so maintainers should explicitly accept the summarizer and redaction behavior before users rely on it for plugin action approvals.
    Confidence: 0.84

What I checked:

  • Repository policy applied: Root and scoped policies were read; the relevant guidance treats config additions, plugin SDK changes, channel rendering, and approval security boundaries as compatibility- and review-sensitive surfaces. (AGENTS.md:1, 44b4a0ac0598)
  • Current main has only the raw plugin approval renderer: Current main builds plugin approval text from raw title, description, tool/plugin/agent/id/expiry, and /approve reply fields, with no language-mode option. (src/infra/plugin-approvals.ts:99, 44b4a0ac0598)
  • Current main lacks the proposed language surface: A repository search found no current-main PluginApprovalLanguage, approvals.plugin.language, or simple-technical implementation in the approval paths. (44b4a0ac0598)
  • PR adds a config contract: The PR head adds PluginApprovalLanguage and changes approvals.plugin from the exec forwarding shape to a plugin-specific forwarding config with optional language. (src/config/types.approvals.ts:5, 6bb648d56027)
  • PR adds schema validation for the config key: The PR head extends the approvals Zod schema with original, simple, and simple-technical values under approvals.plugin.language. (src/config/zod-schema.approvals.ts:26, 6bb648d56027)
  • PR changes the approval explanation boundary: The PR head routes simple and simple-technical through a plain-English renderer before optionally appending raw technical fields. (src/infra/plugin-approvals.ts:3687, 6bb648d56027)

Likely related people:

  • joshavant: Authored and merged the async requireApproval work that introduced the central plugin approval request and forwarding surfaces now being extended. (role: introduced behavior; confidence: high; commits: 6ade9c474cf1; files: src/infra/plugin-approvals.ts, src/config/types.approvals.ts, src/infra/exec-approval-forwarder.ts)
  • steipete: Repeatedly refactored approval forwarding, rendering, and Telegram/native approval seams that this PR extends. (role: approval rendering refactor owner; confidence: high; commits: 69eea2cb80e1, 52fb4a149a90, 15c3aa82bffd; files: src/plugin-sdk/approval-renderers.ts, src/infra/exec-approval-forwarder.ts, extensions/telegram/src/approval-handler.runtime.ts)
  • gumadeiras: Authored native approval lifecycle and Matrix approval work that shares the channel approval invariant being changed here. (role: adjacent native approval owner; confidence: medium; commits: d78512b09d1d, 1efa923ab8b5, af4a2faa1da0; files: extensions/telegram/src/approval-handler.runtime.ts, extensions/matrix/src/approval-handler.runtime.ts, src/plugin-sdk/approval-reaction-runtime.ts)
  • vincentkoc: Recent history touches the approval config/rendering files and related release/current-main integration, so this is a useful routing candidate for current-base review. (role: recent area contributor; confidence: medium; commits: e085fa1a3ffd, a88fbf0f6476; files: src/config/types.approvals.ts, src/infra/plugin-approvals.ts, src/plugin-sdk/approval-renderers.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 the mantis: telegram-visible-proof Mantis should capture Telegram visible proof. label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot added the docs Improvements or additions to documentation label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 14, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@kennykankush

Copy link
Copy Markdown
Author

Telegram Screenshot Proof:

Screenshot 2026-05-15 at 3 01 34 AM

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
…lain-plugin-approval-prompts-pr

# Conflicts:
#	docs/.generated/config-baseline.sha256
#	docs/.generated/plugin-sdk-api-baseline.sha256
@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling extensions: oc-path labels May 14, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 14, 2026
@clawsweeper

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

@kennykankush

Copy link
Copy Markdown
Author

Follow-up CI repair pushed in 929a4e0d9d after the main refresh.

What changed:

  • fixed the check-lint no-shadow failure in src/infra/plugin-approval-forwarder.test.ts by renaming the inner test variable only;
  • reran pnpm -s lint locally successfully;
  • reran node scripts/run-vitest.mjs run --config test/vitest/vitest.infra.config.ts src/infra/plugin-approval-forwarder.test.ts locally successfully.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

Merged current main again in dfd393bf88 after upstream moved from ff254a44c9 to a98f292a11.

Status note:

  • the branch is up to date with current main;
  • generated config/plugin SDK baselines still check clean locally;
  • the remaining checks-node-agentic-agents-tools failure is not in the approval PR diff: current upstream/main is failing the same shard on src/agents/tools/pdf-tool.model-config.test.ts (openai/gpt-5.4-mini expected vs openai/gpt-5.5 received);
  • I did not add an unrelated PDF/model-config patch to this approval-language PR.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

Addressed the latest ClawSweeper review in ed9e701d33.

Changes in this refresh:

  • merged current main again after it moved to 8c94131c0d;
  • fixed Telegram simple-technical fallback assertion to expect the concrete plugin:req-1 approval id;
  • fixed Matrix simple-technical fallback assertion to expect the concrete plugin:req-1 approval id;
  • refreshed docs/.generated/plugin-sdk-api-baseline.sha256 after the main refresh.

Local verification:

  • node scripts/run-vitest.mjs run --config test/vitest/vitest.unit-fast.config.ts extensions/telegram/src/approval-handler.runtime.test.ts extensions/matrix/src/approval-handler.runtime.test.ts src/plugin-sdk/approval-renderers.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-telegram.config.ts extensions/telegram/src/approval-handler.runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-matrix.config.ts extensions/matrix/src/approval-handler.runtime.test.ts
  • pnpm config:docs:check && pnpm plugin-sdk:api:check
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo

Note: the prior checks-node-agentic-agents-tools failure was the same PDF model assertion already failing on current main, not a plugin approval diff failure.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

Follow-up CI repair pushed in 1965fd2ef2 after the fresh CI run exposed two current-main test maintenance failures.

Changes:

  • fixed check-lint unused test callback parameters in src/tasks/task-flow-registry.store.test.ts by renaming root to _root;
  • fixed src/commands/doctor-heartbeat-template-repair.test.ts to expect the current clean heartbeat template header.

Local verification:

  • pnpm -s lint
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.commands.config.ts src/commands/doctor-heartbeat-template-repair.test.ts

I intentionally did not patch the remaining checks-node-agentic-agents-tools PDF model assertion because the same failure exists on current main and is outside the approval-language diff.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

Follow-up CI repair pushed in be5a36c67e.

What changed:

  • Updated isHeartbeatContentEffectivelyEmpty so single-line HTML comments in HEARTBEAT.md count as comments-only content.
  • Added regression coverage for the HTML-comment heartbeat template header.

Why:

  • The fresh CI failure in checks-node-agentic-agents-core-runtime was src/agents/workspace-templates.test.ts, caused by the current runtime HEARTBEAT.md template now containing a comments-only HTML header.

Verified locally:

  • node scripts/run-vitest.mjs run --config test/vitest/vitest.unit-fast.config.ts src/auto-reply/heartbeat.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.agents-core.config.ts src/agents/workspace-templates.test.ts

Known remaining unrelated CI note from the prior run:

  • checks-node-agentic-agents-tools was still failing on the inherited PDF model-config assertion (openai/gpt-5.4-mini vs openai/gpt-5.5), which is outside this approval-language diff and was also present on current main.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

P2 channel renderer follow-up pushed in 0026fbb035.

What changed:

  • threaded approvals.plugin.language through the shared reaction approval renderer
  • honored simple/simple-technical plugin approval text in Slack native plugin approvals
  • honored the same language config in iMessage, WhatsApp, and Signal target renderers plus native runtime renderers
  • added regressions for Slack, iMessage, WhatsApp, Signal, and the shared reaction renderer so plugin approvals no longer fall back to raw Title:/technical text when language: "simple" is configured

Verification run:

  • node scripts/run-vitest.mjs run --config test/vitest/vitest.unit-fast.config.ts src/plugin-sdk/approval-renderers.test.ts src/plugin-sdk/approval-reaction-runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-slack.config.ts extensions/slack/src/approval-handler.runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-imessage.config.ts extensions/imessage/src/approval-handler.runtime.test.ts extensions/imessage/src/approval-native.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-whatsapp.config.ts extensions/whatsapp/src/approval-native.test.ts extensions/whatsapp/src/approval-handler.runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-signal.config.ts extensions/signal/src/approval-native.test.ts extensions/signal/src/approval-handler.runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.infra.config.ts src/infra/plugin-approval-forwarder.test.ts
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo
  • pnpm check:test-types
  • touched-file oxfmt --check
  • local agents:autoreview pass: clean, no accepted/actionable findings

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

Follow-up pushed in 6f31345963: removed an unused afterEach import that made check-lint fail after the latest main-branch refresh.

Local verification for this extra fix:

  • node scripts/run-oxlint-shards.mjs --threads=8

The P2 channel-renderer fix remains in 0026fbb035; this second commit is lint-only.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

P2 channel-language follow-up is pushed at 6bb648d56027db4f154252bfb20d3a61dce2d65b.

What changed since the P2 review:

  • Wired configured approvals.plugin.language through Slack native plugin approvals.
  • Wired the shared reaction approval renderer through iMessage, WhatsApp, and Signal native/plugin approval paths.
  • Kept interactive buttons/reactions intact while using the plain-language plugin approval text when simple or simple-technical is configured.
  • Added focused regressions for Slack, iMessage, WhatsApp, Signal, and the shared reaction runtime so channel-specific renderers do not fall back to the legacy raw plugin text.
  • Merged current upstream/main to clear the branch conflict; conflict resolution only kept upstream test cleanup in src/auto-reply/heartbeat.test.ts and src/tasks/task-flow-registry.store.test.ts.

Local verification:

  • node scripts/run-vitest.mjs run --config test/vitest/vitest.unit-fast.config.ts src/plugin-sdk/approval-renderers.test.ts src/plugin-sdk/approval-reaction-runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-slack.config.ts extensions/slack/src/approval-handler.runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-imessage.config.ts extensions/imessage/src/approval-handler.runtime.test.ts extensions/imessage/src/approval-native.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-whatsapp.config.ts extensions/whatsapp/src/approval-native.test.ts extensions/whatsapp/src/approval-handler.runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-signal.config.ts extensions/signal/src/approval-native.test.ts extensions/signal/src/approval-handler.runtime.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.infra.config.ts src/infra/plugin-approval-forwarder.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.unit-fast.config.ts src/auto-reply/heartbeat.test.ts src/tasks/task-flow-registry.store.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.tasks.config.ts src/tasks/task-flow-registry.store.test.ts
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo
  • pnpm check:test-types
  • pnpm exec oxfmt --check ...touched files...
  • node scripts/run-oxlint-shards.mjs --threads=8

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@kennykankush

Copy link
Copy Markdown
Author

@stielemans quick maintainer-review ping now that the P2 follow-up is in.

Current head: 6bb648d56027db4f154252bfb20d3a61dce2d65b

State from my side:

  • P2 channel-language wiring is pushed for Slack, iMessage, WhatsApp, Signal, and the shared reaction renderer.
  • Focused channel/reaction regressions were added and run locally.
  • Latest upstream/main was merged; conflicts are resolved.
  • GitHub CI is green: 121 passing, 0 pending, 0 failing, 10 skipped.
  • ClawSweeper targeted re-review completed and the durable review now says ready for maintainer review, with proof: sufficient and rating 🐚 platinum hermit.

The remaining item appears to be maintainer/security acceptance of the opt-in approvals.plugin.language config/SDK surface rather than another author-side code blocker. Could you re-check or route to the right owner when you have cycles?

@openclaw-barnacle

Copy link
Copy Markdown

Closing due to inactivity.
If you believe this PR should be revived, post in #clawtributors on Discord to talk to a maintainer.
That channel is the escape hatch for high-quality PRs that get auto-closed.

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

Labels

agents Agent runtime and tooling app: web-ui App: web-ui channel: discord Channel integration: discord channel: imessage Channel integration: imessage channel: matrix Channel integration: matrix channel: nostr Channel integration: nostr channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web channel: zalo Channel integration: zalo docker Docker and sandbox tooling docs Improvements or additions to documentation extensions: codex extensions: deepinfra extensions: diagnostics-prometheus extensions: diffs extensions: google extensions: memory-core Extension: memory-core extensions: memory-wiki extensions: oc-path extensions: openrouter extensions: qa-lab mantis: telegram-visible-proof Mantis should capture Telegram visible proof. 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. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. scripts Repository scripts size: XL stale Marked as stale due to inactivity 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.

2 participants