Repository navigation
fix: preserve native plugin permissions across Harness selection and admission - #2258
miguelbranco80 wants to merge 23 commits into
Conversation
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: blocked before merge. What this changesPreserve authored native plugin permissions during Harness selection and reject policies that block the selected runtime or provider. Example: Switch from OpenClaw to Codex with plugins.allow omitted.
Review scores
ProductKind: Bug fix · Worth it: Needs a maintainer decision · Fix scope: Complete Merge readiness⛔ Blocked before merge - 1 item remains Keep this PR open: it fixes a current permission rewrite, with no actionable code findings remaining; the broader admission policy still needs an owner decision. Priority: P2 Decision needed
Before merge
FindingsNone. Agent review detailsHow this fits togetherConsole produces Agent Configuration; OCC authorizes and persists provisioning work, and Kubernetes Compute checks that Configuration before credential and workload effects. flowchart TD
A[Console Harness selection] --> B[Agent Configuration]
B --> C[OCC admission and IAM]
C --> D[PostgreSQL provisioning work]
D --> E[Worker reauthorization]
E --> F[Kubernetes Compute validation]
F --> G[Credentials and workloads]
Technical reviewBest possible solution: Land permission preservation with owner-approved early refusals at the existing Console and Compute admission boundaries. Do we have a high-confidence way to reproduce the issue? Current main directly inserts and removes Codex allowlist entries; the linked report provides concrete browser steps and base-versus-candidate regression results. Is this the best way to solve the issue? Separating Harness wiring from authored permissions fixes the producer, while existing admission owners prevent blocked configurations from reaching runtime effects. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against a77594a92203. Provenance checked
TestingProof path: in-process harness. SecurityNone. EvidenceWhat I checked:
Likely related people:
Review metrics
Root-cause clusterRelationship: Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. LabelsLabel changes:
Label justifications:
Rating scale6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior. WorkflowClawSweeper edits this one comment on every review. Comment HistoryReview history (5 earlier review cycles)
Reviewed October 20, 2026, 6:26 AM ET / 10:26 UTC (Revision 6). |
|
Free's clanker here (an AI agent working on Free's behalf). Review at head Regression: a Harness round trip now widens the default Codex allowlist. The default Codex Preset ships I checked this with a throwaway browser probe ("Start with default Preset", open advanced settings, then Harness Codex → OpenClaw → Codex): The Console can't tell an empty list the operator wrote from one it produced itself by removing Not blocking:
Since this is a draft, I'm leaving it with you. |
…into codex/console-native-plugin-allowlist
|
Free's clanker here (an AI agent working on Free's behalf). Re-review at head 1. CI Required fails on this head because provisioning now masks the named gateway refusal.
This changes more than one test. Before this PR, a provisioning request with an incomplete or ambiguous model policy got the named 400 from Configuration validation later in
2. The default Codex Preset → OpenClaw path now saves an OpenClaw Agent whose plugins are restricted to For an OpenClaw Harness, a non-empty allowlist without the provider's plugin causes two failures:
Nothing in the Console or in admission flags this for OpenClaw, because Checked and fine:
|
Final UI evidence — native GitHub attachmentsCurrent head: Environment: macOS, Node.js 24.3.0, Storybook 10.6.0 and Playwright 1.63.0 Chromium. These are real Console components with simulated API/runtime state and synthetic credentials. The captures prove UI behavior, not native runtime execution, model output or backend effects; the separate accepted security evidence covers real Kubernetes effects. All five Pages/Create Agent stories were rebuilt and operated: Native Plugins Unrestricted, Native Plugins Empty Allowlist, Native Plugins Allowlist, Native Plugins Codex Round Trip, and Native Plugins Deny Conflict. The screenshots show retained omitted/empty/restrictive policies, Codex round-trip preservation, required-provider and deny conflicts, and explicit operator repair. The 10.4-second walkthrough shows Harness switching, refusal and the explicit permission edit. Screenshot order: 01 unrestricted policy, 02 empty allowlist, 03 restrictive allowlist, 04 Codex round trip, 05 OpenClaw provider refusal, 06 explicit permission repair, 07 deny policy retained, 08 deny-policy refusal. Video: 09 native plugin walkthrough. Native Plugins Unrestricted — omitted allowlist retained Native Plugins Empty Allowlist — authored empty list retained Native Plugins Allowlist — authored restrictive list retained Native Plugins Codex Round Trip — Codex-only permission retained Native Plugins Codex Round Trip — OpenClaw provider conflict refused Native Plugins Codex Round Trip — operator explicitly adds permission Native Plugins Deny Conflict — deny policy retained Native Plugins Deny Conflict — denied Codex refused before creation Walkthrough — Harness switches, conflict refusal and explicit repair (10.4 seconds) 09-native-plugin-walkthrough.mp4Changelog maintenance in |
|
@clawsweeper re-review Please review head This head only consolidates the PR’s changelog to one entry per affected flow, preserving upstream history and Manual Notes. Product/UI/Storybook/test source is identical to Please reassess the final UI evidence requirement and identify any remaining actionable findings. Maintainer approval of early required-plugin refusal for Codex and the selected OpenClaw provider, including older conflicting plans, remains a separate owner decision. No product code changed. |
|
🦞👀 Re-review progress:
|
Preserve upstream Namespace and sandbox changes, resolve the Console flow conflict, and shorten the Harness reference below the documentation limit.
Refreshed Console evidence — 2026-10-20Captured 2026-10-20 against the refreshed source at Rebuilt Storybook 10.6.0 with Node.js 24.3.0. Operated all five Pages/Create Agent stories: Native Plugins Unrestricted, Native Plugins Empty Allowlist, Native Plugins Allowlist, Native Plugins Codex Round Trip, and Native Plugins Deny Conflict. Captures use the Codex in-app browser on macOS at 1265 × 712; automated browser tests separately used pinned Playwright Chromium. The 11.4-second screen walkthrough shows Harness switches, a provider refusal, an explicit permission edit and the retained repaired list; its final readback is held for two seconds. Real Console components use simulated API/runtime state and synthetic credentials. These captures prove UI behavior, not backend persistence, native plugin/model execution or production deployment. The separate accepted real-Driver evidence retains its original tested source. All nine native uploads downloaded byte-for-byte equal to the inspected local media. Unrestricted policy: no allowlist added Authored empty allowlist retained Restrictive allowlist retained when selecting Codex Codex-only allowlist retained when switching to OpenClaw Selected OpenClaw provider refused before creation Explicit openai permission retained after another Harness round trip Authored Codex denial retained Denied Codex refused before creation Harness switching, refusal and explicit repair (11.4 seconds) 09-walkthrough.mp4 |
|
@clawsweeper re-review Please review current head Refreshed native UI evidence now shows upstream’s current Console: eight screenshots and an 11.4-second walkthrough across all five Native Plugins stories. Every native upload was downloaded and matched its local capture. The player opens and decodes the walkthrough. Source/environment and simulated-UI limits are in both PRs’ Verification sections. Checks: 217 browser cases, 457 API/Driver cases and all four selected PostgreSQL cases passed; one existing Linux-only API case skips on macOS. Lint, types, formatting, workspace, OpenAPI, docs checks/build, Storybook build and both affected flow validators passed. Disposable PostgreSQL resources were cleaned up. The previously accepted real Kubernetes effect evidence remains pinned to its original source and is not claimed as rerun here. Please reassess the refreshed head and report any remaining actionable finding. Maintainer approval of the broader required-plugin refusal policy remains a separate owner decision; this refresh does not claim that approval or change scope. |
|
🦞👀 Re-review progress:
|
















Fixes #2256.
Fork tracking: raw-labs/openclaw-enterprise#15.
Problem and change
Changing Harness in Create Agent silently rewrites native plugin permissions. Adding Codex can restrict an unrestricted allowlist; removing it can turn a Codex-only restriction into an unrestricted empty list.
Preserve authored
plugins.allowandplugins.deny, updating Codex runtime wiring separately. Missing/empty allowlists remain unrestricted. A blocked required plugin needs an explicit policy edit:codexfor Codex oropenai/anthropicfor OpenClaw’s selected provider. Console refuses before writes; Kubernetes Compute checks Agent save, deployment and fresh/stored provisioning through existing Harness admission. Disabled plugins, denial, allowlist exclusion and duplicate normalized required-entry aliases fail without rewriting Configuration. No new persisted state or Driver interface.Refresh and scope
Refreshed 2026-10-20 through upstream
mainata77594a92203b9da12690591554b385d9970d904(50 commits since the previous integrated base). Current head:bac4fdd4f6856fb9f037a2d8ba3986a78fc06bd0. The normal merge preserves published history and the existing fork branch.raw-labs/openclaw-enterprise:codex/console-native-plugin-allowlist. Parallel draft #2409 stays closed unmerged.Verification
Checks ran on the merged source recorded in
bac4fdd4f, using macOS, Node.js 24.3.0 and Storybook 10.6.0. Upstream’s pinned dependencies were installed only in the replacement isolated checkout under the user’s existing authorization.node --test tests/integration/occ-api.test.mjs tests/integration/console-api.test.mjs tests/integration/agent-create-validate-api.test.mjs tests/conformance/kubernetes-compute.test.mjs: 457 passed, 0 failed, 1 existing macOS skip for LinuxMAX_ARG_STRLEN.console-agent-presets,console-agents,console-agents-2,console-agent-repositories,console-codex-oauth,console-create-agent-provisioning-400,console-agent-plugin-refusals,console-namespace-not-ready,console-namespace-recheck,console-form-fields,console-create-agent-memberandconsole-page-header. Upstream’s new member workflow and our policy refusal controls pass together.postgres-agent-provisioning.test.mjs: 4 passed, 0 failed, 0 skipped. The owned disposable lane used separate migrator/application roles and was cleaned up. These cases use real HTTP/OCC/IAM, PostgreSQL State and workers; external lifecycle Drivers are fixtures, while policy admission uses production Kubernetes Compute. The separate real Kubernetes effect evidence below retains its original source identity.pnpm lint,pnpm typecheck,pnpm format:check,pnpm check:workspace,pnpm openapi:check,pnpm docs:check,pnpm docs:build,pnpm storybook:build, both affected flow validators andgit diff --checkpassed. Docs: 269 pages / 4,253 links, no unapproved hard-limit violations. Each affected long flow/reference still covers one coherent topic; no length exception was added.Real credential and workload effect proof
Full final-head traces, sanitized results and reproduction source were published on 2026-10-19, addressing the fixture-Driver limitation behind the final-effect security finding. Production source stayed unchanged at
09065abd2408da3c5b1170f6e77d37e940ba01f7.f3a74292ab691fc7f9849c243defabd7b8c86ad2admitted the restrictive Codex allowlist and duplicate normalized-entry plans. The candidate rejected stored replay/retry and fresh requests (400); workers failed permanently on attempt 1 with all resource IDs null. Stored replay, worker, retry and status paths performed zero Secret reads and zero Kubernetes writes. Policy status remained readable by the initiating actor (200); retry queued nothing.operatebinding through the public IAM API (204) stopped the real worker before any Secret read or Kubernetes write. The persisted denial named that actor andAUTHORIZATION_DENIED. Other grants remained; retry/status were 403, preserving the initiating-actor/current-authority boundary.Fresh invalid requests still perform the existing, explicitly authorized Slack Secret preflight read before Harness policy validation, then refuse without writes. This was traced and is not included in the zero-I/O stored/revoked claims. Dedicated provisioning used official digest-verified Gateway API/Envoy definitions and scoped route permissions. These are manual production-Driver traces, not a new CI lane, native Codex/model execution, functional Envoy routing, or a production Helm installation. ClawSweeper’s fresh review cleared the authority-chain security finding (Security: None; Findings: None). Maintainer approval of early required-plugin refusal for both Harnesses remains pending, including resolution of older conflicting plans.
Final UI evidence
Published native attachments and captions.
Captured 2026-10-20 against the refreshed source at
bac4fdd4f6856fb9f037a2d8ba3986a78fc06bd0, upstream basea77594a92203b9da12690591554b385d9970d904.Rebuilt Storybook 10.6.0 with Node.js 24.3.0. Operated all five Pages/Create Agent stories: Native Plugins Unrestricted, Native Plugins Empty Allowlist, Native Plugins Allowlist, Native Plugins Codex Round Trip, and Native Plugins Deny Conflict. Captures use the Codex in-app browser on macOS at 1265 × 712; automated browser tests separately used pinned Playwright Chromium. The 11.4-second screen walkthrough shows Harness switches, a provider refusal, an explicit permission edit and the retained repaired list; its final readback is held for two seconds.
Real Console components use simulated API/runtime state and synthetic credentials. These captures prove UI behavior, not backend persistence, native plugin/model execution or production deployment. The separate accepted real-Driver evidence retains its original tested source. All nine native uploads downloaded byte-for-byte equal to the inspected local media.
Unrestricted policy: no allowlist added
Authored empty allowlist retained
Restrictive allowlist retained when selecting Codex
Codex-only allowlist retained when switching to OpenClaw
Selected OpenClaw provider refused before creation
Explicit openai permission retained after another Harness round trip
Authored Codex denial retained
Denied Codex refused before creation
Harness switching, refusal and explicit repair (11.4 seconds)
09-walkthrough.mp4
Status
Both PRs remain open with their existing ready-for-review status. The last upstream review accepted the linked UI and real-Driver proof (
proof: sufficient) and reported no code/security findings. This refresh resolves the new upstream conflicts and preserves its accepted proof scope. Hosted checks and review must qualify the new head. Maintainer approval of the required-plugin refusal policy remains pending.No force push, PR merge, release or production deployment. Fork
mainandcodex/raw-integrationwere not modified.