fix(codex): rename destructive approval mode to ask#98501
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b8a7e95685
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Codex review: found issues before merge. Reviewed July 1, 2026, 6:10 PM ET / 22:10 UTC. Summary PR surface: Source 0, Tests +149, Docs +9. Total +158 across 20 files. Reproducibility: yes. at source level. PR head forks side conversations with the base reviewer while Codex Review metrics: 2 noteworthy metrics.
Stored data model Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Replay the persisted plugin app policy config into side-thread forks, keep the app-scoped reviewer shape, then have maintainers explicitly accept or revise the current-main-only Do we have a high-confidence way to reproduce the issue? Yes, at source level. PR head forks side conversations with the base reviewer while Codex Is this the best way to solve the issue? No, not yet. The rename and app-scoped reviewer shape are the right owner-boundary direction, but the side-thread fork path must preserve the same app config before this is the best complete fix. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against eb417fa206e6. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source 0, Tests +149, Docs +9. Total +158 across 20 files. View PR surface stats
Security concerns:
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
b8a7e95 to
8819678
Compare
ca58a1d to
41e41ee
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
|
Exact-head live proof is now complete on
The PR body now contains the exact steps, image/head, adjacent-policy snapshot, result, and caveats. Internal Slack and Linear artifact links are intentionally omitted from this public PR. @clawsweeper re-review |
|
@clawsweeper re-review |
|
Merged via squash.
|
* fix(codex): rename destructive approval mode to ask * fix(codex): keep ask reviewer app-scoped * test: fix current-main CI regressions
* fix(codex): rename destructive approval mode to ask * fix(codex): keep ask reviewer app-scoped * test: fix current-main CI regressions
* fix(codex): rename destructive approval mode to ask * fix(codex): keep ask reviewer app-scoped * test: fix current-main CI regressions
Closes #98499
Related: #97123
Related: #97327
What Problem This Solves
Fixes an issue where users configuring Codex plugin write/destructive approvals had to use the value
"always"even though the behavior asks the user for every action. The contradictory name makes the approval contract easy to misread and can lead operators to make incorrect permission assumptions.Why This Change Was Made
The Codex plugin contract now uses
"ask"across the manifest, public types, runtime policy, persisted binding shape, migration contracts, examples, tests, and documentation. This is an intentional hard cut:"always"fails validation and is neither aliased nor migrated."ask"preserves the existing app-scoped approval behavior. Codex receivesapprovals_reviewer: "user"only on the affectedapps.<id>entry; the thread-level reviewer remains unchanged for unrelated shell, file, permission, and MCP approvals. Per-app policy context remains authoritative in the elicitation bridge, so mixedtrue,false,"auto", and"ask"configurations do not broaden sibling app permissions.AI-assisted: yes. Codex implemented the change and completed a clean current-main repository autoreview.
User Impact
Operators can express the behavior directly with
allow_destructive_actions: "ask": destructive plugin actions remain available but require user approval every time. Existing boolean and"auto"policies are unchanged. Old configurations using"always"must be updated and will now fail validation instead of being silently accepted or migrated.Evidence
mainadvanced, the branch was rebased througheb417fa206. Two newly merged base commits exposed stale test fixtures: a daemon provider fixture lacked requiredbaseUrl, a raw Telegram SecretRef needed the established config-boundary cast, and two cron assertions still described pre-detachment state. The three test-only corrections now pass 105 focused tests plus the core test typecheck.git diff --checkpassed.rust-v0.142.4source confirmed thatapps.<id>.approvals_revieweris the supported app-scoped reviewer contract and is resolved forcodex_appswithout changing the thread reviewer.28548825324passed all required build, type, lint, test, security, and docs jobs.Commands:
Real behavior proof
"always"with"ask", reject the retired value, and retain per-app user approval without changing unrelated reviewers.openclaw-debug:codex-destructive-ask-41e41eec-20260701t2138zbuilt from exact PR head41e41eec010fcf39fc75210beee8ff4dbfaa88c8. The existing devbox was preserved and the prior gateway container was retained as rollback.Linear.save_issue; observed the generated plugin approval; confirmed the pending gateway record exposed onlyallow-onceanddeny; resolved that exact approval once through the authenticated local gateway; then read the Slack thread response.destructiveApprovalMode: "ask", while Google Calendar remained"auto"and Google Drive, Notion, and Slack remained"allow". The Linear write did not execute before approval. After the one-time decision, Slack reportedPlugin approval: Allowed once, returned the required completion marker, and included the created issue URL.