Skip to content

fix(exec): rebuild command authorization on the Tree-sitter command planner#84172

Merged
jesse-merhi merged 26 commits into
mainfrom
jesse/candidate-command-authorization
Jun 18, 2026
Merged

fix(exec): rebuild command authorization on the Tree-sitter command planner#84172
jesse-merhi merged 26 commits into
mainfrom
jesse/candidate-command-authorization

Conversation

@jesse-merhi

@jesse-merhi jesse-merhi commented May 19, 2026

Copy link
Copy Markdown
Member

Summary

This PR rebuilds POSIX command authorization on the Tree-sitter command model. The ad hoc shell splitter that previously decided allowlist matches and allow-always persistence is replaced by a candidate planner (planShellAuthorization) built on the Tree-sitter-backed explainShellCommand, so authorization, persistence, and shell rewriting all read one parsed view of the command instead of three approximations of it.

  • replace the ad hoc POSIX authorization path with a Tree-sitter-backed command candidate planner; src/infra/exec-approvals-analysis.ts shrinks from ~1300 lines to a thin re-export shim, with parsing now owned by exec-authorization-plan.ts / exec-authorization-render.ts
  • route shell/argv allowlist checks, allow-always persistence, and enforced-command rewriting through planned candidates, including static shell-wrapper payloads
  • convert exec control-shell policy to a generic static command matcher over normalized argv/options/operands

Because the planner can now prove what a command does (or admit it cannot), approval trust gets safer as a consequence:

  • reusable executable patterns persist only when plan coverage shows the command is fully represented; otherwise the approval stays one-shot
  • optional unavailable approval decisions (unavailableDecisions) travel from the requesting host through the gateway protocol, and the gateway derives the rendered allowedDecisions snapshot so approval surfaces only offer decisions that can actually be honored

One parsed command model

flowchart LR
    CMD["raw shell command"] --> TS["explainShellCommand<br/>Tree-sitter parse"]
    TS --> PLAN["planShellAuthorization<br/>candidates + transports + trust modes"]
    PLAN --> AL["allowlist evaluation"]
    PLAN --> PERSIST["allow-always persistence<br/>coverage proof"]
    PLAN --> REW["enforced command rewrite"]
    OLD["old: ad hoc splitter<br/>re-derived per consumer"] -. replaced .-> PLAN
Loading

Before this PR, allowlist matching, persistence, and shell rewriting each re-derived command structure through the string splitter in exec-approvals-analysis.ts, and they could disagree. Now the plan is computed once and carried into every consumer; Windows keeps its dedicated analyzer (windows-shell-command.ts, moved out of the old monolith) because cmd/PowerShell parsing genuinely differs.

How an approval flows

sequenceDiagram
    participant H as Agent host (gateway/node exec)
    participant P as Authorization planner
    participant G as Gateway server
    participant U as Approval surfaces (UI, push, channels)

    H->>P: planShellAuthorization(command)
    P-->>H: candidates + trust modes + coverage
    H->>H: resolveAllowAlwaysPersistenceDecision
    H->>G: exec.approval.request (command, ask, unavailableDecisions)
    G->>G: derive allowedDecisions from ask policy<br/>minus unavailable optional decisions
    G->>U: snapshot with allowedDecisions
    U->>G: resolve(decision)
    G->>G: reject decision not in allowedDecisions
    G-->>H: decision
    H->>H: persistAllowAlwaysDecision (patterns / one-shot)
Loading

The requester is the only side that knows whether persistence is safe (it has the prepared argv, transport wrappers, platform, and coverage analysis), so it can mark optional approval decisions unavailable with the new unavailableDecisions request field. Today that list can only contain allow-always; allow-once and deny remain server-owned baseline decisions. The gateway normalizes the request, derives the allowedDecisions snapshot for renderers, and re-validates resolution server-side, so a client that ignores the narrowing still cannot push through a disallowed allow-always.

How allow-always persistence is decided

flowchart TD
    A["allow-always chosen"] --> B{"Plan has hard blockers?<br/>runtime payload, prompt-only, unplanned"}
    B -- yes --> OS["one-shot<br/>nothing persisted"]
    B -- no --> C{"Reusable pattern coverage<br/>complete for every candidate?"}
    C -- yes --> PAT["persist executable patterns"]
    C -- no --> OS
    PAT --> R["future runs auto-allowed via allowlist"]
Loading

On the gateway host, allowlisted commands whose execution plan cannot be safely rewritten (requiresAllowlistPlanApproval) are downgraded to one-shot approval. Pattern-based durable trust deliberately does not bypass that gate, because enforcement cannot pin the resolved executables for an unenforceable plan.

Decisions and rationale

  • POSIX shell authorization now comes from one planned command model: planShellAuthorization() uses the Tree-sitter-backed explainShellCommand() path, and the plan is carried into allowlist evaluation, allow-always persistence, and shell rewrite. The old POSIX splitter/render fallback is no longer an alternate source of candidates.
  • unavailableDecisions is additive protocol: optional field, enum-validated, and currently typed to the only optional exec approval decision (allow-always). Old or native clients that never send it keep the ask-derived behavior. The gateway still stores and publishes computed allowedDecisions for UI/rendering and resolve validation.
  • Safe bins are treated as narrow, argument-profiled execution shortcuts, not blanket shell trust. Dynamic shells, command substitution, line continuations, path-scoped wrapper payloads, and pipe-to-shell cases remain approval-gated unless the whole relevant command graph is allowed.
  • Static reads under .ssh / ~/.ssh through basic read commands are approval-required hard-coded control policy.
  • Background & is preserved as shell topology; the planner models it as a background relationship instead of failing closed.
  • deny still wins when deny-mode policy is active.

Behavior changes

  • Static POSIX shell wrappers like sh -c 'git status' can now be authorized by the inner git candidate when the payload is static and safely parsed.
  • Dynamic wrappers like sh -c '$CMD', command substitution, line continuations, and path-scoped wrapper payloads stay approval-gated instead of becoming reusable inner approvals.
  • Commands that cannot be safely persisted no longer offer Always Allow anywhere (Control UI, native push, channel approvals); they offer Allow Once / Deny.
  • curl URL | sh behavior is preserved: both sides must be allowed for auto-run; allow-always persists curl only; persisted curl alone does not authorize the shell side on rerun.
  • Gateway commands whose allowlist plan cannot be safely rewritten no longer offer Always Allow; they stay Allow Once / Deny.
  • ask=always approval requests no longer offer an unusable Always Allow action.
  • Exec control-shell policy denies OpenClaw channel login commands and requires approval for security audit suppression mutation through the same normalized command matcher.

Protocol and storage

  • unavailableDecisions is an optional gateway protocol request field; no version bump required. Computed allowedDecisions remains in stored/request snapshots for approval renderers.
  • Persisted approvals files are read unchanged.
  • No config surface added.

Known follow-up

Node system.run keeps the shipped behavior of auto-running allowlist-satisfied POSIX shell payloads even when the authorization plan cannot rebuild an enforced command (src/node-host/invoke-system-run-allowlist.ts, resolveSystemRunExecArgv). The gateway host is now stricter for the same case (requiresAllowlistPlanApproval). Extending the plan-unavailable approval gate to the node daemon is deliberate follow-up work, not part of this PR, to keep the diff bounded; node behavior is unchanged from shipped releases.

Verification

Behavior addressed: plan-based command authorization with provable allow-always persistence and decision narrowing across all approval surfaces.

Real environment tested: local macOS focused suites on current head (824c85b), including the final unavailableDecisions protocol change.

Exact steps or command run after this patch:

PATH=/Users/jmerhi/.nvm/versions/node/v24.12.0/bin:$PATH node scripts/run-vitest.mjs packages/gateway-protocol/src/exec-approvals-validators.test.ts src/infra/exec-approvals-policy.test.ts src/gateway/server-methods/server-methods.test.ts src/agents/bash-tools.exec-host-node.test.ts src/agents/bash-tools.exec-host-gateway.test.ts --reporter=verbose
PATH=/Users/jmerhi/.nvm/versions/node/v24.12.0/bin:$PATH corepack pnpm tsgo:prod
PATH=/Users/jmerhi/.nvm/versions/node/v24.12.0/bin:$PATH corepack pnpm exec oxfmt --check packages/gateway-protocol/src/exec-approvals-validators.test.ts packages/gateway-protocol/src/schema/exec-approvals.ts src/agents/bash-tools.exec-approval-request.ts src/agents/bash-tools.exec-host-gateway.test.ts src/agents/bash-tools.exec-host-gateway.ts src/agents/bash-tools.exec-host-node.test.ts src/agents/bash-tools.exec-host-node.ts src/gateway/server-methods/exec-approval.ts src/gateway/server-methods/server-methods.test.ts src/infra/exec-approvals-policy.test.ts src/infra/exec-approvals.ts
git diff --check
.agents/skills/autoreview/scripts/autoreview --mode local --prompt 'Context for compatibility review: the removed exec.approval.request allowedDecisions input was introduced only on this unmerged PR branch. origin/main packages/gateway-protocol/src/schema/exec-approvals.ts has neither allowedDecisions nor unavailableDecisions on ExecApprovalRequestParamsSchema, and origin/main src/agents/bash-tools.exec-approval-request.ts sends neither field. OpenClaw policy does not preserve branch-local/unshipped protocol fields. Do not flag backward compatibility for rejecting the PR-local allowedDecisions input.'

Evidence after fix: targeted Vitest passed 4 shards covering protocol validation, approval policy helpers, gateway approval handlers, and node/gateway host approval behavior; pnpm tsgo:prod exited 0; oxfmt --check exited 0 on the touched TypeScript files; git diff --check exited 0; autoreview reported no accepted/actionable findings after verifying allowedDecisions was PR-local and unshipped.

Observed result after fix: unpersistable commands offer Allow Once / Deny only; allow-always on a coverage-complete command persists executable patterns; unenforceable allowlisted commands stay one-shot; requesters disable only optional exec decisions through unavailableDecisions, while gateway snapshots still expose computed allowedDecisions.

What was not tested: Windows-native end-to-end exec; full GitHub CI for current head.

Copilot AI review requested due to automatic review settings May 19, 2026 14:42
@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui agents Agent runtime and tooling size: XL maintainer Maintainer-authored PR labels May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 15, 2026, 1:50 PM ET / 17:50 UTC.

Summary
The PR replaces POSIX exec approval splitting with a Tree-sitter-backed authorization planner, routes allowlist/persistence/rendering through it, and adds optional unavailableDecisions narrowing for exec approval requests.

PR surface: Source +1105, Tests -43, Other +4. Total +1066 across 51 files.

Reproducibility: yes. by source inspection: current main still has ask-derived exec approval decisions and no unavailableDecisions request field, while PR head routes unpersistable decisions through the planner-backed approval path.

Review metrics: 2 noteworthy metrics.

  • Approval Request Protocol: 1 optional field added. unavailableDecisions changes the exec approval request contract and affects native/gateway approval renderers.
  • Optional Approval Decision: 1 decision can be withheld. Only allow-always is treated as optional, and withholding it changes upgrade-visible approval choices for unpersistable commands.

Stored data model
Persistent data-model change detected: serialized state: src/gateway/server.node-invoke-approval-bypass.test.ts, serialized state: src/infra/exec-approvals-allow-always.test.ts, serialized state: src/node-host/invoke.test.ts, vector/embedding metadata: src/infra/command-explainer/extract.test.ts. Confirm migration or upgrade compatibility proof before merge.

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

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

Rank-up moves:

  • Have exec/gateway owners explicitly accept the stricter allow-always downgrade behavior.
  • Resolve or close the overlapping planner PR before landing this branch.

Mantis proof suggestion
A short visible approval-flow proof would help maintainers confirm the changed approval buttons across real surfaces. A maintainer can ask Mantis to capture proof by posting this exact PR comment:

@openclaw-mantis visual task: verify an unpersistable exec approval shows only Allow Once and Deny, while a reusable command can still offer Allow Always.

Risk before merge

  • [P1] Merging changes user-visible approval behavior: commands whose reusable trust is not planner-proven can no longer offer allow-always and can be converted to one-shot approval.
  • [P1] The patch changes command authorization, approval persistence, gateway resolution validation, and shell rendering for host command execution, so security-boundary review is still a maintainer decision even with green tests.
  • [P1] The older overlapping planner PR at Route allow-always through command authorization planner #80922 remains open and conflicting, so maintainers should explicitly choose this PR as canonical or close/supersede the older branch.
  • [P1] The PR body calls out no Windows-native end-to-end exec proof for this head, while the diff moves Windows shell analysis into a dedicated module.

Maintainer options:

  1. Accept The Stricter Approval Semantics (recommended)
    Exec/gateway owners can approve the one-shot downgrade and hidden allow-always behavior as the intended upgrade behavior, then land this branch as the canonical planner.
  2. Resolve The Overlapping Planner Branch
    Close or explicitly supersede Route allow-always through command authorization planner #80922 before merge so maintainers do not carry two conflicting planner branches.
  3. Pause For A Smaller Landing Path
    If the security-boundary or compatibility change is too broad for one merge, pause this PR and split only the accepted planner subset into a narrower branch.

Next step before merge

  • [P2] Protected maintainer PR with compatibility and security-boundary semantics needs exec/gateway owner review, not automated repair.

Security
Cleared: No concrete supply-chain or code-execution defect was found in the inspected diff, but the changed exec authorization path remains security-boundary-sensitive.

Review details

Best possible solution:

Land this as the canonical planner only after exec/gateway owners accept the stricter durable-trust semantics and resolve the overlapping planner branch.

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

Yes by source inspection: current main still has ask-derived exec approval decisions and no unavailableDecisions request field, while PR head routes unpersistable decisions through the planner-backed approval path.

Is this the best way to solve the issue?

Yes with owner sign-off: using one parsed command model is the clean owner-boundary fix for keeping allowlist, persistence, and rendering consistent, but the stricter durable-trust behavior is a maintainer policy decision.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P2: This is a normal-priority exec authorization hardening PR with limited user-facing blast radius but significant maintainer review needs.
  • merge-risk: 🚨 compatibility: The PR changes durable approval persistence and approval action availability, which can alter existing exec approval workflows after upgrade.
  • merge-risk: 🚨 security-boundary: The diff rewrites command authorization planning, shell rendering, and approval resolution semantics that gate host command execution.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The maintainer PR body includes after-patch local macOS focused test, typecheck, format, diff-check, autoreview commands, and observed approval narrowing on head 824c85b.
  • proof: sufficient: Contributor real behavior proof is sufficient. The maintainer PR body includes after-patch local macOS focused test, typecheck, format, diff-check, autoreview commands, and observed approval narrowing on head 824c85b.
Evidence reviewed

PR surface:

Source +1105, Tests -43, Other +4. Total +1066 across 51 files.

View PR surface stats
Area Files Added Removed Net
Source 27 2668 1563 +1105
Tests 23 2357 2400 -43
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 1 4 0 +4
Total 51 5029 3963 +1066

What I checked:

Likely related people:

  • jesse-merhi: All 24 commits on this PR are authored by @jesse-merhi, and the related open planner PR is also authored by @jesse-merhi, making them the clearest current owner for this branch. (role: current feature author and planner branch owner; confidence: high; commits: 868967c1ffa4, 824c85bcdbf0; files: src/infra/exec-authorization-plan.ts, src/infra/exec-approvals.ts, src/agents/bash-tools.exec-host-gateway.ts)
  • vincentkoc: Recent main history shows @vincentkoc touching exec approval storage and co-authoring the normalized exec auto-mode work this planner builds on. (role: adjacent exec policy contributor; confidence: medium; commits: adad27d7448e, 4d6593642e5a, 80227005a016; files: src/infra/exec-approvals.ts, src/node-host/invoke-system-run.ts)
  • joshavant: Main history shows @joshavant as committer for normalized exec auto-mode and gateway/node auto-review commits that overlap this approval-planner surface. (role: adjacent exec auto-mode merger/committer; confidence: medium; commits: 80227005a016, ab84c8cc0949, c82d7011b57c; files: src/agents/bash-tools.exec-host-gateway.ts, src/node-host/invoke-system-run.ts)
  • steipete: Recent main history and local blame show @steipete touching exec/gateway docs and broad refactors near the current exec approval helpers, so they are a useful adjacent reviewer but not the planner owner. (role: recent adjacent contributor; confidence: low; commits: 6851dc9505f1, 653708067403, 0bbac63d00bc; files: src/infra/exec-approvals.ts, src/agents/bash-tools.exec-host-gateway.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

Copilot AI 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.

Pull request overview

Introduces a new “candidate planner” boundary for command authorization so allowlisting/approval can reason about inner commands within POSIX shell wrappers (when payloads are static), while preserving legacy/Windows paths and existing “curl | sh” semantics. It also updates the UI approval modal to honor allowedDecisions from approval requests.

Changes:

  • Add exec-authorization-plan to produce authorization groups/candidates (including shell-wrapper transport metadata and trust modes) and route non-Windows allowlist evaluation through it.
  • Adjust allowlist evaluation to return “planned” segments where appropriate (e.g., inner candidates for static wrappers, wrapper collapse for safe-bin rewrite), with expanded test coverage.
  • Update exec approval UI parsing/rendering to carry allowedDecisions through and hide disallowed actions.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated no comments.

Show a summary per file
File Description
ui/src/ui/views/exec-approval.ts Hide disallowed approval actions based on allowedDecisions.
ui/src/ui/views/exec-approval.test.ts Add UI coverage ensuring disallowed actions are hidden.
ui/src/ui/controllers/exec-approval.ts Parse/normalize allowedDecisions from approval events.
ui/src/ui/controllers/exec-approval.test.ts Add controller tests for preserving allowedDecisions.
src/node-host/invoke-system-run.test.ts Add integration tests for planner-driven wrapper behavior and rewrites.
src/node-host/invoke-system-run-allowlist.ts Prefer planned segments from allowlist evaluation when available.
src/infra/exec-authorization-plan.ts New planner producing authorization groups/candidates (incl. wrapper unwrapping rules).
src/infra/exec-authorization-plan.test.ts Unit tests for planner behavior (chains, pipelines, wrapper unwrapping/fallback).
src/infra/exec-authorization-allowlist.test.ts New tests for candidate-based allowlist semantics (wrappers, curl
src/infra/exec-approvals-analysis.test.ts Update expectations to reflect planned segment reporting.
src/infra/exec-approvals-allowlist.ts Route non-Windows allowlist checks through planner; refine segment/trust handling.
src/infra/exec-approvals-allow-always.test.ts Prevent persisting path-scoped wrapper payloads as reusable script trust.
src/agents/bash-tools.exec.approval-id.test.ts Normalize allowlist patterns to real paths in tests.
Comments suppressed due to low confidence (1)

ui/src/ui/views/exec-approval.ts:132

  • allowedDecisions is now used to hide actions, but the modal cancel handler still always triggers handleExecApprovalDecision("deny") on Escape/backdrop cancel. If a request omits "deny" from allowedDecisions (e.g. allow-once-only UIs), the user can still send a disallowed decision via cancel, which the gateway will reject. Update handleCancel (and/or the modal’s cancelability) to only submit "deny" when it’s included in allowedDecisions, otherwise treat cancel as a no-op (or keep the modal open).
  const allowedDecisions = request.allowedDecisions ?? ["allow-once", "allow-always", "deny"];
  const title = isPlugin
    ? (active.pluginTitle ?? t("execApproval.pluginApprovalNeeded"))
    : t("execApproval.execApprovalNeeded");
  const titleId = "exec-approval-title";
  const descriptionId = "exec-approval-description";
  const handleCancel = () => {
    if (!state.execApprovalBusy) {
      void state.handleExecApprovalDecision("deny");
    }

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels May 19, 2026
@jesse-merhi
jesse-merhi force-pushed the jesse/candidate-command-authorization branch from ce260c9 to c7cbaba Compare May 20, 2026 01:19
@clawsweeper clawsweeper Bot added P2 Normal backlog priority with limited blast radius. 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. labels May 20, 2026
@clawsweeper

clawsweeper Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

🔥 Warming up: real-behavior proof passed; findings, security review, or rank-up moves are still in progress.

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.
What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@clawsweeper clawsweeper Bot added merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels May 20, 2026
@jesse-merhi jesse-merhi self-assigned this May 21, 2026
@jesse-merhi
jesse-merhi force-pushed the jesse/candidate-command-authorization branch from 1817a26 to 27f001f Compare May 21, 2026 10:14
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels May 21, 2026
@jesse-merhi
jesse-merhi force-pushed the jesse/candidate-command-authorization branch from 27f001f to fe89c09 Compare May 21, 2026 13:37
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels May 21, 2026
@jesse-merhi
jesse-merhi force-pushed the jesse/candidate-command-authorization branch from fe89c09 to e45a6d2 Compare May 21, 2026 13:52
@clawsweeper clawsweeper Bot removed the merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. label May 21, 2026
@jesse-merhi
jesse-merhi force-pushed the jesse/candidate-command-authorization branch from e45a6d2 to 22304c8 Compare May 21, 2026 14:31
@openclaw-barnacle openclaw-barnacle Bot added the docs Improvements or additions to documentation label May 21, 2026
@jesse-merhi

Copy link
Copy Markdown
Member Author

Land-ready proof for ce23811

What changed since the last review:

  • Rebased the branch onto current main and reconciled src/infra/exec-approvals-allow-always.test.ts with main's newer allow-always security coverage.
  • Refreshed plugin SDK surface budgets after CI showed this branch's exec infra additions grow the deprecated infra-runtime surface counts.

Verification:

  • git diff --check passed.
  • /Users/jmerhi/.nvm/versions/node/v24.12.0/bin/node scripts/plugin-sdk-surface-report.mjs --check passed.
  • /Users/jmerhi/.nvm/versions/node/v24.12.0/bin/node scripts/run-vitest.mjs test/scripts/plugin-sdk-surface-report.test.ts --reporter=verbose passed: 1 file, 4 tests.
  • Focused exec approval suite passed earlier on the rebased branch: 13 files, 467 tests.
  • GitHub PR checks for ce2381192df7f28b59b6169112e9fc276ea3ed00: merge state CLEAN, 142 success, 32 skipped, 0 failed, 0 pending.

Known proof note:

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 gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. scripts Repository scripts size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants