Skip to content

fix(exec): respect OPENCLAW_STATE_DIR for exec approvals#74002

Closed
openclaw-clownfish[bot] wants to merge 1 commit into
mainfrom
clownfish/ghcrawl-191457-agentic-merge
Closed

fix(exec): respect OPENCLAW_STATE_DIR for exec approvals#74002
openclaw-clownfish[bot] wants to merge 1 commit into
mainfrom
clownfish/ghcrawl-191457-agentic-merge

Conversation

@openclaw-clownfish

Copy link
Copy Markdown
Contributor

Summary

  • Repair fix(exec): respect OPENCLAW_STATE_DIR for exec approvals #65736 so exec approvals file/socket/default host-path resolution respects OPENCLAW_STATE_DIR.
  • Preserve the legacy ~/.openclaw fallback when OPENCLAW_STATE_DIR is unset.
  • Address the prior Greptile/Codex findings around parallel env reads and legacy state fallback behavior.

Source PR: #65736
Credit: original fix by @oinoom, with ProjectClownfish repair on the existing branch.

Validation:

  • pnpm check:changed
  • pnpm -s vitest run src/infra/exec-approvals-store.test.ts

ProjectClownfish replacement details:

@aisle-research-bot

aisle-research-bot Bot commented Apr 29, 2026

Copy link
Copy Markdown

🔒 Aisle Security Analysis

We found 2 potential security issue(s) in this PR:

# Severity Title
1 🟡 Medium Exec approvals policy can be silently bypassed by OPENCLAW_STATE_DIR pointing to a fresh directory
2 🟡 Medium Local exec-approvals socket spoofing when OPENCLAW_STATE_DIR points to shared/writable directories
1. 🟡 Exec approvals policy can be silently bypassed by OPENCLAW_STATE_DIR pointing to a fresh directory
Property Value
Severity Medium
CWE CWE-269
Location src/infra/exec-approvals.ts:185-559

Description

exec-approvals.json is now resolved relative to OPENCLAW_STATE_DIR when set. If that environment variable points to a new/empty directory, OpenClaw will ignore an existing hardened approvals file in the default ~/.openclaw/exec-approvals.json and will silently create a new approvals file in the override directory.

This weakens local exec protections because the newly-created file has no explicit defaults policy, so effective defaults fall back to permissive built-ins (security: "full", ask: "off").

Impact:

  • A host-local configuration like ask: "always" (meant to force prompts) can be unintentionally dropped if the process starts with OPENCLAW_STATE_DIR set.
  • ensureExecApprovals() always writes the (possibly empty) normalized config to disk, making the downgrade persistent.

Vulnerable flow:

  • Input: process.env.OPENCLAW_STATE_DIR
  • Decision: resolveExecApprovalsPath() uses the override directory
  • Sink: ensureExecApprovals() creates/saves a new approvals file when none exists at the override location
  • Effect: prior stricter approvals stored at the legacy location are not migrated or even warned about

Vulnerable code:

const override = env.OPENCLAW_STATE_DIR?.trim();
if (override) {
  const resolved = resolveHomeRelativePath(override, { env });
  return { path: resolved, displayPath: resolved };
}
...
export function ensureExecApprovals(): ExecApprovalsFile {
  const loaded = loadExecApprovals();
  ...
  saveExecApprovals(updated);
  return updated;
}

Recommendation

Prevent accidental policy downgrades when switching state roots.

Options (pick one):

  1. Automatic migration with warning: if OPENCLAW_STATE_DIR is set and $OPENCLAW_STATE_DIR/exec-approvals.json does not exist but the legacy ~/.openclaw/exec-approvals.json exists, copy/merge the legacy file into the new location (or at least merge defaults/agents), and emit a clear warning.

  2. Fail closed / require explicit opt-in: if override is set and no approvals file exists at the override path while a legacy file exists, refuse to start unless a --migrate-exec-approvals flag (or similar) is provided.

Example migration logic:

const legacyPath = path.join(expandHomePrefix("~/.openclaw"), "exec-approvals.json");
const newPath = resolveExecApprovalsPath();

if (process.env.OPENCLAW_STATE_DIR && !fs.existsSync(newPath) && fs.existsSync(legacyPath)) {// copy or merge
  fs.mkdirSync(path.dirname(newPath), { recursive: true });
  fs.copyFileSync(legacyPath, newPath, fs.constants.COPYFILE_EXCL);
  console.warn(`Migrated exec approvals from ${legacyPath} to ${newPath}`);
}

Also consider writing explicit defaults into a newly-created approvals file (rather than relying on permissive runtime fallbacks), so the user can see and audit the effective policy.

2. 🟡 Local exec-approvals socket spoofing when OPENCLAW_STATE_DIR points to shared/writable directories
Property Value
Severity Medium
CWE CWE-287
Location src/infra/exec-approvals.ts:185-216

Description

OPENCLAW_STATE_DIR can override the location of the exec-approvals UNIX socket. If it is set to a shared/writable directory (e.g. /tmp), another local user can pre-create/bind a fake socket at that path and spoof approval decisions.

Why this is a security issue:

  • The socket path is derived directly from OPENCLAW_STATE_DIR with no validation of directory ownership/permissions or existing socket type.
  • The client sends the token inside the request payload, so a spoofed server learns the token immediately and can reply with any decision (the token does not authenticate the server).

Vulnerable code (path override + socket usage):

const override = env.OPENCLAW_STATE_DIR?.trim();
...
return path.join(resolveExecApprovalsStateDir().path, EXEC_APPROVALS_SOCKET);
const payload = JSON.stringify({ type: "request", token, ... });
return await requestJsonlSocket({ socketPath, requestLine: payload, ... });

Impact:

  • A local attacker can force allow-once / allow-always responses, effectively bypassing exec approvals prompts/decisions for the operator when the socket is placed in an attacker-controllable location.

Recommendation

Harden the socket location and add peer validation:

  1. Reject unsafe socket directories (especially when overridden):
  • Ensure the parent directory is owned by the current user and is not group/other-writable.
  • Prefer creating/using a dedicated state subdirectory with mode 0700.
  1. Validate the socket file before connecting:
  • lstat() the socket path and require stat.isSocket().
  • Optionally validate ownership (stat.uid) and that it is not group/other-writable.
  1. If you need authentication, use OS-backed peer credentials (e.g., SO_PEERCRED on Linux) or a proper challenge/response where the client does not reveal the only secret first.

Example (pre-connect check):

import os from "node:os";

function assertSafeSocketPath(socketPath: string) {
  const st = fs.lstatSync(socketPath);
  if (!st.isSocket()) throw new Error(`Not a socket: ${socketPath}`);
  if ((st.mode & 0o022) !== 0) throw new Error(`Socket is writable by group/others: ${socketPath}`);
  if (typeof st.uid === "number" && st.uid !== os.userInfo().uid) {
    throw new Error(`Socket not owned by current user: ${socketPath}`);
  }
}

assertSafeSocketPath(socketPath);

And when creating the state directory, set restrictive perms:

fs.mkdirSync(stateDir, { recursive: true, mode: 0o700 });

Analyzed PR: #74002 at commit 3acd668

Last updated on: 2026-04-29T02:47:12Z

@openclaw-clownfish openclaw-clownfish Bot added the clawsweeper Tracked by ClawSweeper automation label Apr 29, 2026
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation size: S r: too-many-prs Auto-close: author has more than twenty active PRs. and removed r: too-many-prs Auto-close: author has more than twenty active PRs. labels Apr 29, 2026
@greptile-apps

greptile-apps Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds OPENCLAW_STATE_DIR awareness to the exec-approvals path resolution (resolveExecApprovalsPath, resolveExecApprovalsSocketPath, resolveExecApprovalsDisplayPath), and propagates the display path into the effective-policy host-source string instead of the previously hardcoded ~/.openclaw/exec-approvals.json. The logic and fallback behaviour look correct; the two findings below are minor style concerns.

Confidence Score: 4/5

Safe to merge; only minor style concerns found, no functional or security regressions.

No P0 or P1 issues found. Two P2 style issues: inconsistent path-separator usage in resolveExecApprovalsDisplayPath and a misleading test fixture that creates .clawdbot with no corresponding implementation logic. Core env-resolution, fallback, and symlink-safety logic are correct.

src/infra/exec-approvals.ts (display-path separator), src/infra/exec-approvals-store.test.ts (legacy test fixture)

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/infra/exec-approvals.ts
Line: 213-215

Comment:
**Inconsistent path separator in display path**

When the state dir is the default (`~/.openclaw`), the function returns a hardcoded forward-slash string literal, while the non-default branch uses `path.join`. On Windows, the default branch would always emit a forward slash while the `OPENCLAW_STATE_DIR` branch would use backslashes — the two display paths would use different separators for the same purpose. Consider using `path.join` in both branches for consistency, or explicitly document that the default display path is intentionally kept in Unix format to match the docs.

```suggestion
  return path.join(stateDir, EXEC_APPROVALS_FILE);
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/infra/exec-approvals-store.test.ts
Line: 120-132

Comment:
**Misleading test fixture — `.clawdbot` directory has no effect**

The test name says "when only legacy state exists" and creates `path.join(dir, ".clawdbot")`, implying there is logic that reacts to a legacy `.clawdbot` directory. However, nothing in the implementation inspects `.clawdbot`; `resolveExecApprovalsPath()` only checks `OPENCLAW_STATE_DIR`. The test passes identically without the `mkdirSync` call and could mislead a future maintainer into searching for legacy-detection code that doesn't exist. Consider renaming the test to describe the actual invariant ("uses the default .openclaw path when OPENCLAW_STATE_DIR is unset") and removing the unused `.clawdbot` setup.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix(exec): respect OPENCLAW_STATE_DIR fo..." | Re-trigger Greptile

Comment on lines +213 to +215
return stateDir === DEFAULT_EXEC_APPROVALS_STATE_DIR
? `${stateDir}/${EXEC_APPROVALS_FILE}`
: path.join(stateDir, EXEC_APPROVALS_FILE);

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.

P2 Inconsistent path separator in display path

When the state dir is the default (~/.openclaw), the function returns a hardcoded forward-slash string literal, while the non-default branch uses path.join. On Windows, the default branch would always emit a forward slash while the OPENCLAW_STATE_DIR branch would use backslashes — the two display paths would use different separators for the same purpose. Consider using path.join in both branches for consistency, or explicitly document that the default display path is intentionally kept in Unix format to match the docs.

Suggested change
return stateDir === DEFAULT_EXEC_APPROVALS_STATE_DIR
? `${stateDir}/${EXEC_APPROVALS_FILE}`
: path.join(stateDir, EXEC_APPROVALS_FILE);
return path.join(stateDir, EXEC_APPROVALS_FILE);
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/infra/exec-approvals.ts
Line: 213-215

Comment:
**Inconsistent path separator in display path**

When the state dir is the default (`~/.openclaw`), the function returns a hardcoded forward-slash string literal, while the non-default branch uses `path.join`. On Windows, the default branch would always emit a forward slash while the `OPENCLAW_STATE_DIR` branch would use backslashes — the two display paths would use different separators for the same purpose. Consider using `path.join` in both branches for consistency, or explicitly document that the default display path is intentionally kept in Unix format to match the docs.

```suggestion
  return path.join(stateDir, EXEC_APPROVALS_FILE);
```

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +120 to +132
it("keeps the default approvals path in .openclaw when only legacy state exists", () => {
const dir = createHomeDir();
fs.mkdirSync(path.join(dir, ".clawdbot"), { recursive: true });

expect(path.normalize(resolveExecApprovalsPath())).toBe(
path.normalize(path.join(dir, ".openclaw", "exec-approvals.json")),
);

ensureExecApprovals();

expect(fs.existsSync(approvalsFilePath(dir))).toBe(true);
expect(fs.existsSync(path.join(dir, ".clawdbot", "exec-approvals.json"))).toBe(false);
});

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.

P2 Misleading test fixture — .clawdbot directory has no effect

The test name says "when only legacy state exists" and creates path.join(dir, ".clawdbot"), implying there is logic that reacts to a legacy .clawdbot directory. However, nothing in the implementation inspects .clawdbot; resolveExecApprovalsPath() only checks OPENCLAW_STATE_DIR. The test passes identically without the mkdirSync call and could mislead a future maintainer into searching for legacy-detection code that doesn't exist. Consider renaming the test to describe the actual invariant ("uses the default .openclaw path when OPENCLAW_STATE_DIR is unset") and removing the unused .clawdbot setup.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/infra/exec-approvals-store.test.ts
Line: 120-132

Comment:
**Misleading test fixture — `.clawdbot` directory has no effect**

The test name says "when only legacy state exists" and creates `path.join(dir, ".clawdbot")`, implying there is logic that reacts to a legacy `.clawdbot` directory. However, nothing in the implementation inspects `.clawdbot`; `resolveExecApprovalsPath()` only checks `OPENCLAW_STATE_DIR`. The test passes identically without the `mkdirSync` call and could mislead a future maintainer into searching for legacy-detection code that doesn't exist. Consider renaming the test to describe the actual invariant ("uses the default .openclaw path when OPENCLAW_STATE_DIR is unset") and removing the unused `.clawdbot` setup.

How can I resolve this? If you propose a fix, please make it concise.

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed May 30, 2026, 1:01 AM ET / 05:01 UTC.

Summary
The PR routes exec approvals file, socket, effective-policy host-source reporting, docs, and focused tests through OPENCLAW_STATE_DIR while preserving the unset default path.

PR surface: Source +26, Tests +72, Docs +9. Total +107 across 6 files.

Reproducibility: yes. for source proof, not live execution: current main hardcodes exec approvals to ~/.openclaw while the canonical state-dir resolver honors OPENCLAW_STATE_DIR. The PR's upgrade downgrade is also source-reproducible through its override branch plus the ensureExecApprovals() write path.

Review metrics: 2 noteworthy metrics.

  • Persisted approval state root: 1 approvals file/socket default root changed. Exec approvals are a security-sensitive persisted preference, so maintainers need upgrade behavior for existing default-path policies before merge.
  • Release-owned changelog: 1 changelog entry added. Normal PRs should carry release-note context outside CHANGELOG.md because release generation owns that file.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🌊 off-meta tidepool
Patch quality: 🧂 unranked krab
Result: blocked by patch quality or review findings.

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

Rank-up moves:

  • [P2] Add migration, refusal, or explicit warning behavior for existing stricter default-path approvals before writing a new state-dir file.
  • Remove the CHANGELOG.md edit and refresh the dirty branch against current main.
  • [P2] Add focused upgrade coverage for OPENCLAW_STATE_DIR with an existing stricter ~/.openclaw/exec-approvals.json.

Risk before merge

  • [P1] Merging as-is can silently drop a user's existing strict ~/.openclaw/exec-approvals.json policy when OPENCLAW_STATE_DIR points at a fresh state root, causing host exec to fall back to permissive built-ins.
  • [P1] The PR is currently reported dirty against main and includes a normal CHANGELOG.md edit, so it needs a refresh that preserves the runtime fix without release-owned churn.

Maintainer options:

  1. Make the state-root move upgrade-safe (recommended)
    Before merge, choose and implement a migration, copy, warning, or fail-closed path for existing stricter ~/.openclaw/exec-approvals.json files when the override target has no approvals file.
  2. Accept an intentional approval reset
    Maintainers could intentionally accept the reset only with explicit release-note and security sign-off that custom state-root users must recreate host approvals.
  3. Pause behind the security/product issue
    If the migration policy is unresolved, keep this PR paused or close it in favor of the canonical security/product thread at Exec approvals path ignores active state root and writes to ~/.openclaw #29736.

Next step before merge

  • [P2] A maintainer security/upgrade decision is needed for how to handle existing stricter approval files before an automated repair can safely finish the branch.

Security
Needs attention: The diff can weaken the host exec approval boundary for users who already hardened the old approvals file before enabling a custom state directory.

Review findings

  • [P1] Preserve existing approval policy when moving state roots — src/infra/exec-approvals.ts:190-195
  • [P3] Drop the release-owned changelog edit — CHANGELOG.md:16
Review details

Best possible solution:

Land a state-dir-aware exec approvals fix only after it preserves or explicitly migrates existing approval policy, removes release-owned changelog churn, and refreshes against current main.

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

Yes for source proof, not live execution: current main hardcodes exec approvals to ~/.openclaw while the canonical state-dir resolver honors OPENCLAW_STATE_DIR. The PR's upgrade downgrade is also source-reproducible through its override branch plus the ensureExecApprovals() write path.

Is this the best way to solve the issue?

No. Routing the path through the state directory is the right direction for fresh setups, but this implementation needs an upgrade-safe migration, warning, or fail-closed behavior before it is the best fix.

Full review comments:

  • [P1] Preserve existing approval policy when moving state roots — src/infra/exec-approvals.ts:190-195
    This switches the default approvals file/socket to OPENCLAW_STATE_DIR without checking whether an existing ~/.openclaw/exec-approvals.json contains stricter defaults. On upgrade, a user who set ask: "always" or security: "allowlist" in the old file and then starts with a state-dir override gets a fresh file at the override path, so effective policy falls back to permissive built-ins. Migrate/copy the legacy policy or fail/warn before creating the new file.
    Confidence: 0.9
  • [P3] Drop the release-owned changelog edit — CHANGELOG.md:16
    Normal PRs should not edit CHANGELOG.md; the release flow owns that file, and this stale insertion is also likely to conflict with current release notes. Keep the release-note context in the PR body or squash message instead.
    Confidence: 0.87

Overall correctness: patch is incorrect
Overall confidence: 0.88

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add P1: The PR targets a real exec approval state-root bug but currently risks weakening a security-sensitive host exec approval workflow on upgrade.
  • add merge-risk: 🚨 compatibility: Changing the default approvals file root for OPENCLAW_STATE_DIR users can strand existing persisted approvals unless a migration or explicit upgrade path is added.
  • add merge-risk: 🚨 security-boundary: Exec approvals gate host command execution, and silently losing stricter approval defaults can bypass the user's intended command-approval boundary.
  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🌊 off-meta tidepool and patch quality is 🧂 unranked krab.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The contributor proof gate is not applied because this is a ProjectClownfish bot repair; the linked source PR reports minimal and Docker verification, but the patch still has merge-blocking security/upgrade issues.
  • remove rating: 🌊 off-meta tidepool: Current PR rating is rating: 🧂 unranked krab, so this older rating label is no longer current.

Label justifications:

  • P1: The PR targets a real exec approval state-root bug but currently risks weakening a security-sensitive host exec approval workflow on upgrade.
  • merge-risk: 🚨 compatibility: Changing the default approvals file root for OPENCLAW_STATE_DIR users can strand existing persisted approvals unless a migration or explicit upgrade path is added.
  • merge-risk: 🚨 security-boundary: Exec approvals gate host command execution, and silently losing stricter approval defaults can bypass the user's intended command-approval boundary.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🌊 off-meta tidepool and patch quality is 🧂 unranked krab.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The contributor proof gate is not applied because this is a ProjectClownfish bot repair; the linked source PR reports minimal and Docker verification, but the patch still has merge-blocking security/upgrade issues.
Evidence reviewed

PR surface:

Source +26, Tests +72, Docs +9. Total +107 across 6 files.

View PR surface stats
Area Files Added Removed Net
Source 2 33 7 +26
Tests 2 72 0 +72
Docs 2 14 5 +9
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 6 119 12 +107

Security concerns:

  • [high] Existing strict approvals can be bypassed on upgrade — src/infra/exec-approvals.ts:190
    When the override target has no approvals file, the PR ignores a stricter legacy ~/.openclaw/exec-approvals.json and persists a fresh file whose omitted defaults resolve to permissive built-ins. That can change approval behavior for host command execution without an operator-visible migration.
    Confidence: 0.88

What I checked:

  • Current main still hardcodes exec approvals storage: resolveExecApprovalsPath() and resolveExecApprovalsSocketPath() still expand ~/.openclaw/exec-approvals.* on current main, so the central bug is not already implemented there. (src/infra/exec-approvals.ts:295, b9933b2ec119)
  • State-dir contract exists elsewhere: The canonical state-dir resolver honors OPENCLAW_STATE_DIR, which supports the PR's intended product direction for relocated mutable state. (src/config/paths.ts:61, b9933b2ec119)
  • PR override branch lacks upgrade handling: The PR sends any non-empty OPENCLAW_STATE_DIR directly to a new approvals path without checking whether a stricter legacy approvals file already exists at the old default path. (src/infra/exec-approvals.ts:190, 3acd66879e0a)
  • Missing-file path persists defaults: On the PR branch, ensureExecApprovals() still saves a normalized file after loading, so an empty override directory can get a fresh approvals file instead of preserving an existing stricter legacy policy. (src/infra/exec-approvals.ts:545, 3acd66879e0a)
  • Release-owned changelog edit: The PR adds a normal unreleased changelog entry even though repository policy keeps CHANGELOG.md release-owned for ordinary PRs. (CHANGELOG.md:16, 3acd66879e0a)
  • Security discussion already flagged the same downgrade: The PR discussion includes an Aisle security finding that OPENCLAW_STATE_DIR pointing at a fresh directory can silently bypass a stricter existing ~/.openclaw/exec-approvals.json policy.

Likely related people:

  • steipete: Git history shows Peter Steinberger introduced and repeatedly hardened the exec approvals flow, including initial tooling, socket requester, security binding, and default host exec policy work. (role: feature owner and heavy area contributor; confidence: high; commits: efdb33c97587, 3686bde783fd, 78a7ff2d50fb; files: src/infra/exec-approvals.ts, src/infra/exec-approvals-effective.ts, docs/tools/exec-approvals.md)
  • vincentkoc: Recent history and blame on the current hardcoded resolver lines point to Vincent Koc through release/restoration and adjacent exec approval fixes, making him a useful routing candidate for the current branch state. (role: recent area contributor; confidence: medium; commits: 086df266ccaf, d9a3ecd109ee, 2d53ffdec1da; files: src/infra/exec-approvals.ts, CHANGELOG.md)
  • gumadeiras: Gustavo Madeira Santana authored nearby effective-policy reporting work, which is one of the PR's touched surfaces. (role: adjacent effective-policy contributor; confidence: medium; commits: ba735d015809, f69570f82020; files: src/infra/exec-approvals-effective.ts, src/infra/exec-approvals-policy.test.ts)
  • Takhoffman: Tak Hoffman added the local exec-policy CLI that reads and writes the same approvals policy surface this PR changes. (role: adjacent CLI policy contributor; confidence: low; commits: 4bf94aa0d669; files: src/infra/exec-approvals.ts, docs/tools/exec-approvals.md)
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.

@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label May 30, 2026
@clawsweeper clawsweeper Bot added the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label May 30, 2026
@barnacle-openclaw barnacle-openclaw Bot removed the stale Marked as stale due to inactivity label May 30, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels May 30, 2026
@vincentkoc

Copy link
Copy Markdown
Member

Closing this uneditable Clownfish branch as superseded. The replacement landed in #92056 via adad27d and preserves the OPENCLAW_STATE_DIR approvals fix with the required migration, fail-closed, and macOS coverage. Thanks to Clownfish for surfacing the issue.

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

Labels

clawsweeper Tracked by ClawSweeper automation docs Improvements or additions to documentation merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: S 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.

1 participant