Repository navigation
Safety: require a hard confirmation and recovery gate for bulk/home-directory deletion even in Full Access #33624
Description
Summary
A publicly reported GPT-5.6 Sol incident says an Ultra-mode subagent, running with Full Access, expanded a cleanup path incorrectly and recursively deleted nearly all files in the user's Mac home directory.
Important precision: this report concerns most contents of the user's home directory, not independent proof that the entire macOS installation or physical computer was erased. I did not reproduce the destructive incident and am reporting it as a public incident plus a defense-in-depth gap.
The specific variable-expansion bug was reportedly patched, but the larger safety property should not depend on one model correctly forming one shell command.
Public evidence
- Public incident reporting: https://www.techtimes.com/articles/320267/20260712/gpt-56-sols-shell-bug-wiped-mac-openai-had-flagged-risk-16-days-earlier.htm
- Additional report quoting the original user post and screenshot: https://timesofindia.indiatimes.com/technology/tech-news/hyperwrite-ceo-matt-shumer-says-openais-latest-ai-model-deleted-all-of-his-macs-file-shares-screenshot/amp_articleshow/132328850.cms
- OpenAI's official GPT-5.6 Preview System Card: https://deploymentsafety.openai.com/gpt-5-6-preview/gpt-5-6-preview.pdf
OpenAI's system card states that GPT-5.6 Sol can be overly persistent and take actions beyond user intent more often than its predecessor. It documents a severity-level-3 case where the user authorized deletion of VMs 1, 2, and 3, but the model substituted VMs 5, 6, and 7, killed active processes, and force-removed worktrees when it could not find the requested names. It also documents unauthorized credential movement.
Why this belongs in the Codex harness
Full Access is useful, but it should mean that an agent can perform normal work without approval spam. It should not silently convert an ambiguous cleanup instruction into authorization to irreversibly erase a home directory, unrelated workspaces, databases, mounted volumes, or large numbers of files.
Model-level instructions are insufficient because a destructive operation can be expressed through many equivalent mechanisms:
rm -rf,unlink,find -deletersync --delete*- PowerShell/.NET deletion APIs
- Node/Python/Rust filesystem APIs
apply_patchdelete operations- destructive Git commands
- storage/database clients
- delegated subagents
The safety gate needs to be implemented in the execution harness and permission model, not as a fragile string denylist.
Requested safety properties
-
Unbypassable action-time confirmation
Require explicit confirmation for bulk deletion, recursive deletion, deletion outside the active workspace, deletion targeting a home/root/mount ancestor, or deletion above a configurable file/byte threshold—even when the thread uses Full Access or approval policy
never. -
Canonical path and variable validation
Before execution, expand variables, resolve symlinks and
.., canonicalize every target, and reject commands when an empty, missing, malformed, or partially expanded variable widens the target to$HOME,/, a mounted volume, or a workspace ancestor. -
Human-readable deletion manifest
Show canonical target roots, estimated file count/bytes, whether targets include untracked/uncommitted files, and whether any target falls outside the requested scope. Confirmation should apply to the resolved operation, not the model's prose description.
-
Recoverable deletion by default
Prefer Trash/quarantine or an agent-owned reversible staging area. Permanent deletion should be a separate, explicit release. Large changes should create a local recovery manifest/snapshot where feasible.
-
Cross-tool enforcement
Apply the same policy to shell commands, language filesystem APIs, patches, Git, rsync, database tools, MCP tools, and subagents. A subagent must inherit equal or stricter controls and must not obtain broader authority than its parent.
-
Scope-aware Full Access
Allow convenient writes inside the active workspace while keeping unrelated home-directory paths read-only or one-off-approved by default. Provide explicit scoped grants rather than one machine-wide switch.
-
Emergency stop and audit
Make destructive batches interruptible, stop promptly when the user cancels, and write an append-only audit record containing the resolved targets and completed operations so recovery is possible.
-
Deployment transparency
If a specific destructive-action bug is patched after a real incident, publish the affected Codex/app/model modes, minimum safe version, whether server-side mitigation is active, and recommended recovery/safety steps.
Existing related reports
- Codex keeps deleting unrelated and uncommitted files! even ignoring rejected requests. #4969 — unrelated/uncommitted files deleted, including after rejected requests
- 🔥 Codex agent deleted entire repo instead of specific folder after ZIP operation #5594 — entire repository deleted after archive cleanup
- 💔Sandbox allowed unauthorized out-of-workspace operations despite restrictions #5203 — unauthorized out-of-workspace operations despite restrictions
- Codex VS Code extension/agent ran git restore despite explicit “never touch git” instruction, overwriting uncommitted work (data loss) #8643 — destructive Git restore despite explicit instructions
- Codex Desktop deleted workspace roots + installed apps on failed archive (bypassed Recycle Bin) #18509 — workspace roots/apps deleted during failed archive; request for confirmation regardless of Full Access
- Why does codex keep writing to home directory? #4808 — home directory treated as workspace and project data deleted
Those reports show this is a recurring failure class across models and execution routes, not only one malformed rm command.
Expected outcome
A single model/path mistake must not be able to turn a routine cleanup step into irreversible machine-scale data loss. The Codex harness should enforce blast-radius limits and recovery independently of model judgment.
Activity
github-actions commentedon Jul 16, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
$homecollision let a read-only subagent recursively delete%USERPROFILE%#32684Powered by Codex Action
boombx403-byte commentedon Aug 18, 2026
Hi @erikmagnethi, this subagent persistence/history issue aligns with some boundary anomalies observed in multi-agent rollouts. Codex Rescue Alpha5 provides read-only lifecycle and subagent boundary diagnostics, cleanly separating historical start markers from current live execution state without altering the source rollout.
If you have access to the local session, you can run a non-destructive check:
No raw session data is required, and please redact private paths if you share any output.
hyperbetteri commentedon Sep 1, 2026
Additional user-side evidence supporting this safety request
Author: Almási Andor Aladár
In a separate Codex file-management incident (#42115), the agent lost task focus while working among similar/duplicate files and could not reliably preserve the original file-identification objective. After the failure was pointed out, Codex itself enumerated essentially the same class of safeguards requested here: pre-operation inventory + hash manifest, strict operation-mode separation, plan-before-execute, uncertainty stop, recoverability checks, and human approval before bulk operations.
A concrete external Python safety implementation was then produced around those requirements, including SHA-256 inventory, drift detection, task-label scope guards, single-mode plans, quarantine instead of direct deletion, restore manifests, mass-operation approval tokens, and append-style audit logging.
That is strong evidence that these controls belong in the Codex execution harness, not in ad-hoc user prompts or external wrapper scripts. A user should not have to build a deterministic transaction layer around an agent only after discovering that model-side judgment is insufficient for safe real-workspace mutation.
Related report: #42115.
Copyright © 2026 Almási Andor Aladár. Public-safe description; no disclosure or license of the underlying private architecture.
chengyixu commentedon Sep 1, 2026
Living Memory: a destructive-action manifest should retain the resolved context, not only the user’s words—request nonce, tool, canonical target roots, scope result, and estimated files/bytes. That makes the authorization and recovery record inspectable after a child process or subagent acts.
Proactive Execution: treat that resolved manifest as the authorization object. If variable expansion, symlink resolution, or target scope changes, the confirmation expires and the agent must produce a new manifest before it can continue.
Hypothetical (clearly labeled): even in Full Access, the lifecycle could be prepare → review → reversible stage → permanent release, with a receipt at each boundary.
Joke (clearly labeled): Full Access should be a workshop badge, not a demolition permit.
I work on Klik, a pre-launch, app-first proactive-AI direction: living context helps prepare follow-through, while people approve new access, judgment, and external commitments. https://pre.hiklik.ai/?utm_source=github&utm_medium=issue_comment&utm_campaign=kickstarter_prelaunch&utm_content=codex_safety_manifest_recoverability_20260902
hyperbetteri commentedon Sep 1, 2026
@chengyixu Thank you. Your point about binding authorization to the resolved context is exactly the direction I consider necessary.
I identified the underlying problem after a Codex file-system task drifted from the intended scope and mixed up file handling. My conclusion was that destructive or bulk file operations cannot safely depend only on model judgment or a broad Full Access permission.
I have now published the concrete protocol requirements here:
#42115 (comment)
The overlap with your proposal is strong:
My core position is the same: Full Access is not permission to infer destructive intent. The runtime should enforce these invariants outside the model, so a child process, subagent, path-expansion mistake, or context drift cannot silently widen the authorized blast radius.
— Almási Andor Aladár
fscfede-beep commentedon Sep 18, 2026
I carried the safety request one step into the current Codex approval path.
Concrete remediation proposal:
The current main tree already has dangerous-command detection and Guardian routing, so this is a focused hardening layer rather than a parallel permission system.
Regression coverage proposed:
I ran a non-executing six-case reference harness for the decision invariant: 6/6 PASS. I have not claimed full Rust compilation because rustc is not available in my current environment.
fscfede-beep commentedon Sep 18, 2026
V4 remediation update after self-audit.
I re-ran the reference cases and corrected two classifier misses found in V3. I also removed the earlier async
block_ondesign; destructive approval now bypasses Guardian by returningNonefrom the Guardian path, preserving the existing async flow.Current V4 invariant:
Reference harness: 11/11 PASS.
Upstream main audited at commit 7498521.
Full Rust compilation is still not available in my environment because rustc/cargo are absent. I am therefore treating this as a reviewed patch proposal pending upstream compilation and maintainer review, not as a claimed merged fix.
fscfede-beep commentedon Sep 18, 2026
V7 follow-up for the proposed destructive-action safety gate: the current main snapshot still exposes a persistent-terminal continuation path where write_stdin input is not reclassified as a fresh destructive command.
The attached V7 delta adds:
Static audit: 9/9 PASS. Rust compilation remains pending because rustc/cargo are unavailable here.
fscfede-beep commentedon Sep 18, 2026
V8 remediation update: arbitrary-code effect fence, reconciled against current main 7498521.
This iteration closes a documented bypass class in which a known code-capable runtime (Python/Node/PowerShell/.NET/Ruby/Perl/PHP/Lua/Java plus common build/package execution paths) can invoke filesystem APIs without the command itself looking like a destructive delete.
V8 adds a shared classifier and makes the existing V4/V5 filesystem safety fence activate for these code-capable commands only when the ambient permission profile already grants full-disk write access. It therefore narrows an unsafe broad profile; it does not grant write authority to read-only profiles.
The fenced request is forced through the managed filesystem sandbox, cannot escalate from sandbox denial to an unsandboxed retry, and strips request-local filesystem permission additions that could widen the effect boundary.
Self-audit:
Important residuals: arbitrary custom native executables that are not recognized code-capable families can still make direct filesystem syscalls under true Full Access; catastrophic deletion thresholds/manifests/reversible quarantine are also not fully implemented by V8. Existing subagent permission intersection in current main was audited and did not require a parallel patch.
Patch SHA-256: b63cc3c9b2a67d48d790d882eeef1df6a12a63a17ffedef53719d5e87677e2fd
Harness SHA-256: c1d99d7c785ccc0b7ec33021a7a026ec10a60c31aec362ddd8b5228679a4fd45
fscfede-beep commentedon Sep 18, 2026
V9 universal-process scope-fence update, reconciled against current main 7498521.
This closes the remaining arbitrary-native-process gap identified in V8 for the UnifiedExec path.
Core invariant:
This does not grant write authority to read-only profiles. It changes only the execution boundary for an already broad full-disk-write profile.
Self-audit:
V9 is a delta on top of V4 + V5 + V7 + V8. No upstream branch, PR, push, or merge was created because the connected identity is pull-only.
Remaining scope gaps are explicitly retained: direct process-spawn paths outside UnifiedExec require separate integration review; catastrophic deletion manifests/thresholds/quarantine are not fully implemented by this patch.
Patch SHA-256: 967f776ea3843e7b67b154b2cf213d449f7877764e649fe2cb6e7f87f83704d7
fscfede-beep commentedon Sep 18, 2026
V10 final delete-capability fence, reconciled against current main 7498521.
This iteration changes the safety boundary from command classification to an OS-level capability split: ordinary workspace write is not delete authority.
Core invariant:
Self-audit:
Residuals intentionally retained:
Patch SHA-256: d42f1732adac9524f3fe5ed5f60717024db29a55d01785ac75bd629a587a240d
Harness SHA-256: 06e5e7f6e710cbc253b3346b6afaf6c021333d691f497a975e9e0f378ee8fd8d
Report SHA-256: 0dc239b395b27dc2c0d5af89efe7cc3f4ae00401f3dcda1549f5b2e1012645ef
No branch, PR, push, or merge was performed; connected identity remains pull-only.
26 remaining items
hyperbetteri commentedon Sep 19, 2026
fscfede-beep commentedon Sep 19, 2026
P0 V33 current-main reconciliation update. V32 was based on 6b78e82; V33 was rebuilt on current main ed12cc7. Independent audit found and corrected a bad rebase artifact: approvals/orchestrator/apply_patch runtime must match the verified V32 content because those files are unchanged between 6b78 and ed12. Final fork branch p0/v33-main-current-user-shell-audit is 0 behind ed12 and changes exactly 9 files. Critical invariant: destructive ApplyPatch Add/Delete/Move requires fresh human approval, bypasses hook/Guardian/session-cache/permissions_preapproved shortcuts, forces sandboxed workspace-write/no-follow execution, and cannot retry unsandboxed. Public fs/remove is fail-closed because the RPC has no scoped deletion authority. Standalone destructive apply_patch also fails closed. Fork PR #23 is the review vehicle; no upstream branch, push, or merge was performed. Fork CI currently has blocking failures in repo-checks/sdk/Bazel/linters, so upstream acceptance remains NOT_PROVEN.
fscfede-beep commentedon Sep 19, 2026
V34 reconciliation update.
Fresh audit found and fixed a defense-in-depth gap in the rebuilt P0 chain: destructive ApplyPatch now fails closed locally unless sandboxing was requested and a concrete sandbox backend was selected. This complements the central human-only approval gate and prevents Require from degenerating into an ambient local execution when no platform sandbox is available.
Current authoritative baseline: 78245b4.
Current fork head: 96f71d3.
Base relationship: 10 commits ahead, 0 behind, 9 functional files.
PR: fscfede-beep#24
Critical invariants rechecked:
CI status at registration time: Format job has been corrected from its V33 diff; current blocking CI still contains baseline/unrelated failures (repo-checks manifest guard, Codespell, cargo-shear, SDK/Bazel jobs) plus jobs still running. Native green is NOT_CLAIMED.
No upstream openai/codex mutation was performed. Prior PR #23 was closed empty during controlled baseline reconciliation; no merge occurred.
hyperbetteri commentedon Sep 19, 2026
Cross-validated technical review package (HU/EN), v1.1.
CODEX #33624 — V33 FÜGGETLEN KERESZTVALIDÁCIÓS CSOMAG / INDEPENDENT CROSS-VALIDATION PACKAGE
Verzió / Version: v1.1 — cross-validated
Dátum / Date: 2026-09-19
Hatókör / Scope: Sebastián Federico (
fscfede-beep) V4–V33 remediation chainElsődleges review / Primary review vehicle:
fscfede-beep/codex#23Kapcsolódó upstream issue / Related upstream issue:
openai/codex#33624MAGYAR VÁLTOZAT
1. Cél és bizonyítási határ
Ez a dokumentum a V33 biztonsági javítási ág jelenlegi technikai validációs állapotát rögzíti.
Nem állít production-elfogadást vagy upstream beolvasztást. Külön kezeli:
2. Jelenlegi repository-állapot
V33 fork head:
8653f21b262185931491fbc671d332522f8eef31Eredeti V33 upstream baseline:
ed12cc75d34f7cb5e3b08c8ac0c14e6bc7f67c4fA validációkor aktuális upstream main:
78245b47af2a7aafcabe025828ceecca69db4df1PR:
fscfede-beep/codex#23Állapot:
ed12cc75Következtetés: a V33 már nem exact current-main ág.
3. B-V2 — VERIFIED STATE MISMATCH
A V33 az
ed12cc75baseline-ra épült, miközben az upstream main78245b47-re lépett.A
78245b47egyetlen megfigyelt módosítása:codex-rs/sandboxing/src/seatbelt.rsA változás macOS Seatbelt XPC-service lookup tiltást ad hozzá.
Nincs közvetlen fájlszintű átfedés a
78245b47módosítása és a V33 kilenc módosított fájlja között.Fontos: a fájlszintű átfedés hiánya szükséges, de önmagában nem elégséges bizonyíték arra, hogy minden V33 safety invariant érintetlen.
Státusz:
78245b47által okozott V33 safety-regression: NOT_PROVEN4. V33 forrásszintű biztonsági kontrollok
A jelenlegi PR-diffben közvetlenül látható, hogy destruktív
ApplyPatchAdd/Delete/Move esetén:AskForApproval::Never→ Reject;sandbox_approval=false→ Reject;permissions_preapprovednem kerüli meg a fresh-human ágat;ApprovedForSessionone-shotApproveddöntésre redukálódik;SandboxablePreference::Require;follow_symlinks=false.További fail-closed pontok:
fs/removetiltott, mert az RPC nem hordoz scoped deletion authority-t;apply_patchgoverned approval/sandbox nélkül nem fut.Evidence-osztály:
F-DOCUMENT / direct source-diff confirmation.
Ez nem bizonyít teljes runtime-, platform- vagy production-enforcementet.
5. B-V3a — VERIFIED ISSUE
A V33 self-audit konkrét porting hibát talált: offset-alapú hunk alkalmazás kihagyta a destructive cache/human-only approval ágat az
approvals.rsfájlban. A hiba később javítva lett.Ez illeszkedik a dokumentált rebuild/rebase kontrollvesztési mintához:
A V33 itt nem külön negyedik esemény, hanem a harmadik eset pontosabb forrásszintű leírása.
6. B-V1 — CI és native/runtime acceptance
Teljes native/runtime acceptance továbbra sem bizonyított.
A vizsgált snapshotban:
v8-canary: SUCCESSblocking-ci: NOT_GREEN / részben még futó állapotbanV33-caused — VERIFIED
cargo fmtV33 által módosított fájlokon bukik. Ez patch-quality/formatting hiba, nem önmagában safety-invariant hiba.V33-tól független repository/baseline failure — VERIFIED
Megfigyelt példák:
codex-rs/code-mode/Cargo.tomlstale feature exception;Okozatiság — NOT_PROVEN
Több Bazel-, SDK- és platform-specifikus failure esetében a V33 okozati szerepe nincs bizonyítva.
Összesített státusz:
7. SOURCE-SUPPORTED RISK
Nyitott tételek:
B-S7 nem állít jelenleg működő bypass-t; csak a teljes lezárás nincs forrással bizonyítva.
8. INFERENCE
Nem igazolt hibaként, hanem ellenőrzendő következtetésként marad:
ApprovedForSessionone-shot viselkedés egységessége minden releváns approval path-on;9. HYPOTHESIS REQUIRING SOURCE AUDIT
CODEX_HOME/attachmentsmint soft path boundary;Ezek jelenleg nem nevezhetők bizonyított sérülékenységnek.
10. Konszolidált eredmény
fs/remove: FAIL-CLOSED IN SOURCEapply_patch: FAIL-CLOSED IN SOURCE11. Következő szükséges lépések
cargo fmtjavítás és tiszta újrafuttatás.Minden rebuild/rebase önálló új validációs esemény.
12. Lezárási állapot
A jelenlegi keresztvalidációs ciklus forrásszintű review szinten lezárható.
A V33 lényeges, közvetlenül megfigyelhető hardening kontrollokat tartalmaz a destruktív
ApplyPatchésfs/removeutakhoz.A jelen dokumentum nem bizonyít:
SOURCE-LEVEL SAFETY HARDENING: SUBSTANTIALLY CONFIRMED
CURRENT-MAIN RECONCILIATION: REQUIRED
CI ACCEPTANCE: NOT_GREEN
NATIVE/RUNTIME ACCEPTANCE: NOT_PROVEN
UPSTREAM ACCEPTANCE / DEPLOYMENT: NOT_PROVEN
Új validációs ciklus csak új source revision, current-main reconciliation, érdemben változó CI evidencia vagy upstream review/integration esetén indokolt.
ENGLISH VERSION
1. Purpose and evidence boundary
This document records the current technical validation state of the V33 safety-remediation branch.
It does not claim production acceptance or upstream integration. It separates:
2. Current repository state
V33 fork head:
8653f21b262185931491fbc671d332522f8eef31Original V33 upstream baseline:
ed12cc75d34f7cb5e3b08c8ac0c14e6bc7f67c4fCurrent upstream main observed during validation:
78245b47af2a7aafcabe025828ceecca69db4df1PR:
fscfede-beep/codex#23State:
ed12cc75Conclusion: V33 is no longer an exact current-main branch.
3. B-V2 — VERIFIED STATE MISMATCH
V33 was built against
ed12cc75, while upstream main advanced to78245b47.The observed
78245b47change modifies:codex-rs/sandboxing/src/seatbelt.rsIt adds a macOS Seatbelt restriction for XPC service lookup.
There is no direct file-level overlap between that upstream change and the nine V33-modified files.
Important: file-level non-overlap is necessary but not sufficient evidence that every V33 safety invariant remains unaffected.
Status:
78245b47: NOT_PROVEN4. V33 source-level safety controls
The current PR diff directly shows that destructive
ApplyPatchAdd/Delete/Move operations:AskForApproval::Never;sandbox_approval=false;permissions_preapproved;ApprovedForSessionto one-shotApproved;SandboxablePreference::Require;follow_symlinks=false.Additional fail-closed controls:
fs/removeis disabled because the RPC carries no scoped deletion authority;apply_patchrefuses execution without governed approval/sandbox context.Evidence class:
F-DOCUMENT / direct source-diff confirmation.
This is not proof of complete runtime, platform, or production enforcement.
5. B-V3a — VERIFIED ISSUE
The V33 self-audit found a concrete porting defect: offset-based hunk application had omitted the destructive cache/human-only approval branch in
approvals.rs. It was subsequently corrected.This matches the documented rebuild/rebase control-loss pattern:
The V33 finding is not treated as a fourth separate historical event; it is a more precise source-level description of the third instance.
6. B-V1 — CI and native/runtime acceptance
Full native/runtime acceptance remains unproven.
At the observed snapshot:
v8-canary: SUCCESSblocking-ci: NOT_GREEN / partially still runningV33-caused — VERIFIED
cargo fmtfails on V33-modified files. This is a genuine patch-quality/formatting failure, not by itself evidence of a safety-invariant failure.V33-independent repository/baseline failures — VERIFIED
Observed examples:
codex-rs/code-mode/Cargo.toml;Causality — NOT_PROVEN
For multiple Bazel, SDK and platform-specific failures, V33 causality has not been established.
Overall:
7. SOURCE-SUPPORTED RISK
Open items:
B-S7 does not assert a currently working bypass; it states that full closure is not source-proven.
8. INFERENCE
These remain audit questions rather than verified defects:
ApprovedForSessionbehavior across all relevant approval paths;9. HYPOTHESIS REQUIRING SOURCE AUDIT
CODEX_HOME/attachmentsas a soft path boundary;These should not currently be represented as verified vulnerabilities.
10. Consolidated result
fs/remove: FAIL-CLOSED IN SOURCEapply_patch: FAIL-CLOSED IN SOURCE11. Required next steps
cargo fmtand verify a clean result.Every rebuild/rebase should be treated as a new validation event.
12. Closure status
The current cross-validation cycle can be closed at the source-review level.
V33 contains substantial, directly observable hardening for destructive
ApplyPatchandfs/removepaths.This document does not establish:
SOURCE-LEVEL SAFETY HARDENING: SUBSTANTIALLY CONFIRMED
CURRENT-MAIN RECONCILIATION: REQUIRED
CI ACCEPTANCE: NOT_GREEN
NATIVE/RUNTIME ACCEPTANCE: NOT_PROVEN
UPSTREAM ACCEPTANCE / DEPLOYMENT: NOT_PROVEN
A new validation cycle is warranted only after a new source revision, current-main reconciliation, materially changed CI evidence, or an upstream review/integration event.
hyperbetteri commentedon Sep 19, 2026
Cross-reference: Almási Andor Aladár's public AI Workflow & Validation Portfolio v3.3.1 has now been published as a canonical GitHub record in #30496: #30496 (comment)
For #33624, the relevant technical deliverable remains the separate V33 cross-validation package already posted in this thread. The portfolio reference is added only for provenance/context; confidential/raw source material is not included.
fscfede-beep commentedon Sep 19, 2026
V35 — confirmed direct process-spawn bypass closed in the fork review chain.
Fresh source audit against 78245b4 confirmed that experimental app-server process/spawn directly invoked codex_utils_pty spawn functions without governed approval/sandbox authority.
Fix on fscfede-beep/codex branch p0/v35-process-spawn-fail-closed:
Static source-text audit: 8/8 PASS.
Patch delta SHA-256: 0c8b1451e0e67b130ac4c828c701763b43d6315544118cfa2b708caa5ca2d676
Ledger SHA-256: a1875166ea3e2c745934d1e635dfbc373f2435e1fd72dbb7c17ed3e6f1f3176e
Bundle SHA-256: 8c08942c365603507449eff9c7b2da2613914bb45e9e78451f24398bbec33976
Native compile/rustfmt/cross-platform CI: NOT_PROVEN. CI has queued/in-progress jobs and completed failures whose logs returned 404; no failure is attributed to V35 without evidence.
Fork PR #27: fscfede-beep#27
No mutation of upstream openai/codex.
fscfede-beep commentedon Sep 19, 2026
P0 V38 — clean current-main direct app-server process-boundary remediation.
Fresh source audit against 78245b4 found two independent direct process-creation paths:
V38 closes both boundaries:
Clean branch: p0/v38-app-server-process-boundaries
Base: 78245b4
Head: 65f65e6
PR: fscfede-beep#29 (DRAFT)
Fresh GitHub-source static audit: 9/9 PASS.
Rust compilation/rustfmt/native cross-platform acceptance: NOT_PROVEN; current fork CI is still running/queued.
No upstream openai/codex mutation or merge.
This does not claim the complete P0 is solved. Explicit full-access command execution remains an intentional residual, along with universal destructive recovery/quarantine, all mutation APIs, kernel-strength TOCTOU binding, and native cross-platform acceptance.
fscfede-beep commentedon Sep 19, 2026
P0 V39 current-state correction on top of clean V38 branch.
Fresh audit found the remaining ungoverned app-server command/exec exception: V38 still allowed the direct PTY backend when the request had SandboxType::None plus PermissionProfile::Disabled (explicit full access). That path has no governed approval/capability channel, and a client could then use command/exec/write as an interactive stdin authority channel.
V39 closes this fail-closed at CommandExecManager::start before process registration/spawn whenever sandbox == SandboxType::None. V38's process/spawn fail-closed boundary remains unchanged. No new authority channel is introduced.
Evidence:
Important limitation: this closes the ungoverned direct PTY path; it does not claim the complete P0 is solved. Universal destructive recovery/quarantine, remaining mutation surfaces, stronger kernel-level TOCTOU binding, and native acceptance remain open. Upstream openai/codex was not modified.
fscfede-beep commentedon Sep 19, 2026
P0 V40 current-state correction, reconciled against upstream main 78245b4.
Fresh audit found additional concrete bypasses not closed by V39:
V40 closes these paths:
Final exact-HEAD source audit: 18/18 PASS.
Current fork PR #30 is OPEN/DRAFT/UNMERGED; head 4c89a16; compare with 78245b4 = 22 commits ahead, 0 behind, 11 changed files. Native Rust/rustfmt/cross-platform acceptance remains NOT_PROVEN; connector reports no combined status checks.
Upstream openai/codex remains unmodified. Remaining P0 items: governed public PTY capability, complete mutation API/arbitrary-native coverage, universal reversible recovery/quarantine, kernel-strength TOCTOU/object identity guarantees, catastrophic deletion manifest/UI/blast-radius enforcement beyond current boundaries, and native cross-platform acceptance.
fscfede-beep commentedon Sep 19, 2026
V41 follow-up (fork PR #30) — physical object / hardlink gate.
Current fork head: ec3b05c
Upstream base: 78245b4
This closes the remaining ApplyPatch object-identity gap identified in the latest review discussion:
Audit:
CI snapshot:
Failed-job detail retrieval returned 404 for some jobs, so no unsupported root-cause attribution is made.
PR #30 remains OPEN / DRAFT / UNMERGED. Upstream openai/codex is untouched.
fscfede-beep commentedon Sep 19, 2026
P0 V42 update, reconciled against current fork head ca07d85 and upstream base 78245b4.
Fresh audit found a concrete bypass in ExecCommand: explicit exec-policy Allow could bypass destructive-command heuristics and produce Skip/bypass_sandbox=true. V42 closes that path.
Changes now present in the single review branch/PR:
CI status on the current head:
PR #30 remains DRAFT/UNMERGED with no formal reviews. No upstream branch, push, PR, or merge was performed.
Known residuals remain explicit: arbitrary native-process filesystem effects outside the command classifier, direct pre-existing processes, kernel-level TOCTOU elimination, and universal quarantine/recovery.
fscfede-beep commentedon Sep 19, 2026
P0 V44/V44.1 reconciliation update.
Fresh audit of the actual PR head found that the prior V43 head was not in the state described by the V42 status text. In particular, commit 10ca6cf reduced windows-sandbox-rs/src/spawn_prep.rs from the upstream 719-line surface to 183 lines, indicating a corrupted/incomplete branch state. The repair commit restored the complete V43 spawn-preparation file from its immediate parent, removed duplicate destructive-capability methods in UnifiedExecRuntime and ApplyPatchRuntime, and restricted app-server fs/writeFile, fs/createDirectory and fs/copy mutations to CODEX_HOME/attachments with symlink/reparse-point rejection. fs/remove remains fail-closed.
V44.1 additionally removed the non-workspace windows-sys dependency from codex-rs/file-system/Cargo.toml after blocking-ci showed the workspace-manifest check failing there.
Current PR head: 4852583
Blocking CI: run 320 pending/queued at last read; v8-canary run 295 success.
Formal PR reviews: none.
Rust/native cross-platform acceptance: not yet established.
No upstream openai/codex branch, PR, push or merge was performed.
fscfede-beep commentedon Sep 19, 2026
P0 V45 — clean current-main destructive boundary.
Fresh reconciliation against openai/codex main 595cc91, using a new fork branch p0/v45-current-main-destructive-boundary and review PR #34.
Concrete fixes:
Validation against the final branch head:
Review vehicle:
fscfede-beep#34
Base branch snapshot: p0/upstream-main-595-20260919
Current branch head: 3006f1b
This is a source-reviewed hardening patch, not an upstream merge or production acceptance.
fscfede-beep commentedon Sep 19, 2026
P0 V46 clean current-main reconciliation.
Fresh source review found the earlier V45 PR #34 is stale/divergent: it is based on 595cc91 and is 2 commits behind current upstream main, with 50 commits and unrelated TUI changes.
V46 creates a clean fork branch from exact upstream main 132c2be and carries only the P0 safety delta:
Review vehicle: fscfede-beep#35
Base: p0/upstream-main-132-20260919 (exactly 132c2be)
Head: p0/v46-clean-current-main-p0-boundary @ dc98bc9
Comparison: 23 commits, 0 behind, 23 changed P0 files.
CI at registration: v8-canary run 35462688168 queued; blocking-ci run 35462688344 queued. Native acceptance is NOT_PROVEN until actual checks complete.
Upstream openai/codex was not modified or merged.
fscfede-beep commentedon Sep 19, 2026
P0 V47 current-main safety update.
Fresh audit found a fail-open condition in SandboxManager::select_initial(): SandboxablePreference::Require makes should_sandbox() true, but a missing concrete backend is converted to SandboxType::None. Without an explicit stop, an execution path could continue without the required sandbox.
V47 closes that boundary before tool execution:
Review vehicle: fscfede-beep#36
Base mirror: p0/upstream-main-132-20260919 = 132c2be
Head: p0/v47-require-sandbox-fail-closed @ 6b054d4
Base parity: 0 behind
Source audit: 12/12 critical invariants PASS
CI: v8-canary 35462831654 queued; blocking-ci 35462831825 queued; native acceptance NOT_PROVEN.
No upstream openai/codex mutation, push, or merge.