Repository navigation
Description
Client or integration
Codex CLI — Windows updater
Area
Platform (Windows / macOS / Linux)
Summary
Track the six unresolved review findings after #7648 merged as c655484d9cccf316f3da41047d508bf10d92070a (reviewed head 6618aadd6dd445001c433c86828cce8e90bee62c). Keep the integrated updater stack and superseded sibling PRs closed; do not reapply their old refusal paths. This is a bounded follow-up to the post-merge disposition request, not a replacement for the broader #2811 feature.
Reproduction
This follow-up is read-only source/review verification, not a new Windows runtime reproduction. The relevant job-store, selection-gate, recovery and ACL product-file blobs still match the merge on current dev (checked 2026-10-28). The six review threads remain unresolved. Merge/security acceptance and passing CI do not by themselves dispose of these functional/availability findings.
Availability findings
- Major — lock release after verification failure: r4396883857.
release()setsclosedbeforeverifyHeld(); an exception skipsreleaseLock()while finally closes pins, and later release returns early. Statically confirm and correct the conditional persistent-lock path without weakening ownership/identity checks. Add regressions for ACL-only verification failure, identity mismatch, pin cleanup, repeated release and a subsequent apply to the same prefix. Native Windows lock persistence has not been independently reproduced here. - Major — synchronous recovery ACL work on parent admission: r4396932202. With an existing recovery directory,
beginCodexCliSelectionParentWrite()reaches synchronous recovery-store ACL checks and PowerShellspawnSyncon the parent thread. The ancestry batch and directory are checked, with additional checks for record leaves; each call is bounded by up to 5 seconds. That is a per-call maximum, not a measured stall duration. Move this work off the parent event loop while preserving gate/pin ownership, fail-closed behavior and caller admission semantics; verify event-loop progress plus denial, cancellation/cleanup and concurrent parent/worker cases on Windows.
Remaining review corrections
- Directory identity precision: r4396883860.
cli-update-windows-observation.tsstill builds directory identity from number-valuedlstatSyncdev/ino. Preserve exact identity representation and test values beyond safe-integer precision; no native identity collision was executed here. - Retention fixture root contract: r4396883869. The worker requires a direct drive-root child while the session creates an OS-temp child. Align validation with the intended private fixture contract and test a normal nested Windows temp path, preserving execution authorization and refusal of unsafe roots.
- Structure source map: r4396932208. The current
codex-cli-update.mdmanifest entry still omitssrc/codex/cli-windows-plan-provenance.ts,src/codex/windows-installation-files.ts,src/codex/windows-npm-execution.tsandsrc/lib/windows-owner-acl.ts, although the document describes them. Complete the entry, regenerate the index and run the structure checks. - Chinese POSIX managed condition: r4396883854. Restore the reported-version-matches-manifest condition in the zh-cn and zh-tw CLI references and corresponding agent pages, preserving the ownership and
selectionAttestedwording. The current four paragraphs still omit that condition; this is a targeted clause check, not a complete translation review.
Close when all six items have a linked verified fix or an explicit evidence-backed maintainer disposition. Availability fixes and documentation/test corrections may land separately. The config-root ACL-overlap work (#7815/#7869), atomic-writer timeout-memo work (#7834/#7843) and macOS execution-validation issue #7860 do not address these paths.
Version
Reviewed merge c655484d9cccf316f3da41047d508bf10d92070a (#7648); follow-up base dev@f9e7d939d125c810aa3f3d700dcb8b0cb4129a0f.
Operating system
Windows execution paths. The evidence above is source/review verification; portable follow-up tests run on Linux. Native Windows runtime acceptance remains separate.
Provider and model
Not provider-specific. No provider request is needed for these regressions.
Logs or error output
The linked original review threads and post-merge verification contain the evidence and its limits. No new product log or native platform reproduction is claimed by this issue-format correction.
Screenshots and supporting files
See the source, review and validation links above.
Redacted configuration
Not applicable; no account, credential, installed application or live service configuration was changed for this report.
Checks
- I searched existing issues and documentation.
- I removed secrets, tokens, account details, request credentials, and personal data.
Activity
coderabbitai commentedon Oct 28, 2026
🔗 Related PRs
#7648 - feat(codex): apply Windows CLI updates with owned transactions [open]
📝 Issue Planner
Check the box below or use the
@coderabbitai plancommand to generate an implementation plan and prompts that you can use with your favorite coding assistant.🧪 Issue enrichment is currently in open beta.
To disable automatic issue enrichment, add the following to your
.coderabbit.yaml:💬 Have feedback or questions? Drop into our discord!
luvs01 commentedon Oct 28, 2026
Partial verified candidate published as Draft PR #7875: #7875
Head
1a8c8c2aa7d3b9cf839d2b977aeeb3a0ed446606, based ondev@f9e7d939; the remote tree exactly matches the locally validated index. This addresses items 1, 3, 4, 5 and 6: ACL-only release cleanup with both identity checks and the existing token/handle fences retained; bigint directory identity; canonical private OS-temp retention fixtures; structure mappings; and the four Chinese reported-version clauses.Focused selection: 95 passed / 59 native-Windows skips / 0 failed. Final portable model: 3 passed / 4 native-Windows skips / 0 failed. Typecheck, structure, privacy, size ratchet and docs build passed (593 pages / 85,232 internal links). Native skips are not evidence of Windows installer acceptance or a second actual apply.
Item 2 remains unmodified and open: synchronous parent-admission recovery ACL work. Runtime persist/clear and shim install/restore/uninstall have synchronous caller contracts; a safe correction requires coordinated async admission/caller migration or an explicitly accepted busy/retry contract, with exclusive generation ownership and fresh checks across awaits. A background cached verdict or a bare Promise conversion would not satisfy that contract. The PR records the concrete remaining implementation and native concurrency conditions.
No issue checkbox is marked complete merely because a candidate is published. Current-head hosted CI, explicit maintainer/security review, native acceptance and item 2 remain. The candidate merges cleanly in a read-only integration check with
dev@492c1a15.Implementation update at 05:28 UTC: a second caller-level trace found that even the existing async runtime resolver re-enters synchronous persistence. I am now preparing item 2 separately from #7875 on
dev@492c1a15, preserving the synchronous compatibility exports while migrating the actual asynchronous parent paths and their callers. The management configuration critical section needs an explicit preflight/commit separation with the ownership gate held correctly. No completion or native acceptance is claimed; this investigation does not change #7875's five-item scope.coderabbitai commentedon Oct 28, 2026
Coding Plan
Summary
Design Choices
Design Choice 1: Use dev as the base revision
Options Considered:
dev, which the ticket states contains the merged#7648blobs.maincheckout.Chosen Option: 1
Rationale: Option 1: the target files exist only on
dev. Re-confirm the cited line numbers ondevbefore editing.Design Choice 2: Distinguish ACL-only failure from identity mismatch in release()
Options Considered:
closedunset on failure so that a laterrelease()can retry. Pins stay open.Chosen Option: 3
Rationale: Option 3:
Design Choice 3: Use async admission to move parent recovery ACL work off the event loop
Options Considered:
Chosen Option: 4
Rationale: Option 4:
windows-owner-acl.ts:312–363andcli-update-job-store-windows.ts:390–397.Design Choice 4: Acquire the parent gate before async recovery inspection
Options Considered:
FREE → PARENT_WRITE(the current order). The order now has an await between the two steps.FREE → PARENT_WRITEfirst, then inspect recovery while the parent holds the gate. On denial, release with an exact-value CAS.Chosen Option: 2
Rationale: Option 2:
Design Choice 5: Define retention root validation in the shared fixture helper
Options Considered:
windows-temp-ancestry.tscontainment.Chosen Option: 2
Rationale: Option 2: one definition prevents the session and the worker from drifting apart again. Authorization checks stay separate from the predicate.
💡 User Tips
Regenerate the plan with different choices with
@coderabbitai <feedback>.Implementation Steps
Phase 1: Persistent-lock release after verification failure
Objective: a transient ACL failure must not leave a persistent lock that blocks the same prefix permanently. A real identity mismatch must still fail closed.
Failure mode in
src/codex/cli-update-job-store-windows.ts:release()setsclosed = true(:843–844). It then awaitsverifyHeld()(:805–808).verifyAcl()returns false, it maps the result tounsafe_store(:390–392). A PowerShell timeout also counts as false (windows-owner-acl.ts:367–373).releaseLock()(:659–674) is skipped.finallyblock runscloseAll(). The lock directory and owner record stay on disk.release()returnsfalseat:843.CodexCliJobStoreBusyErrorfrommkdir(:618–623). There is no reclamation.As a result, one slow ACL subprocess can stop all future applies to that prefix. A failed verification can come from the ACL proof or the identity proof. These failures have different ownership consequences.
Task 1: Separate ACL-only failure from identity mismatch in release()
Allow lock removal after an ACL-only failure. Keep every identity and ownership check.
src/codex/cli-update-job-store-windows.ts, restructure the release path. Do not reuseverifyHeld()as one throwing unit.closed = trueas the first statement. This keeps re-entrancy protection and thefalseresult for repeated release.verifyIdentitySync(). If it throws, propagate the error. Do not callreleaseLock(). This keeps the current identity-mismatch behavior.verifyAcl(entries)inside a local try. Capture an ACL failure without throwing at once.verifyIdentitySync()again. If it throws, propagate the identity error. Do not callreleaseLock().heldis set, callreleaseLock(ctx, held)even after an ACL failure.releaseLock()re-proves owner identity,links === 1, the exact bounded record bytes, and directory identity. It then deletes only through held handles withmarkDelete()(:356–361). Never delete by path.unsafe_store). Keep the caller's existing error contract.ctx.pins.closeAll(kernel)infinally. Keep the existingWindowsApplyAuthorityPinsfailed-close retention (:167–182) unchanged.Task 2: Keep caller cleanup classification accurate
Make the apply result describe the real lock state after an ACL-only failure.
src/codex/cli-update-windows-apply.ts, inspect release and cleanup handling at approximately:235–287. Check how a rejectedrelease()maps toleaseRetainedand cleanup errors.unsafe_storecleanup error recorded.leaseRetainedto true only when the persistent lock still exists or authority pins remain. A rejection alone must not set it.Task 3: Add regressions for release failure paths
Extend the Windows-x64-gated lifecycle block in
tests/codex-integration/codex-cli-update-windows-apply.test.ts(:147–196). The current tests prove reacquisition only after a successful release.ACL-only failure:
windows-owner-acl.ts:347–350) to return false. Add a second variant that returns a timeout.unsafe_store.release()resolvesfalseand calls no extraCloseHandle.finally.Identity mismatch:
false.CodexCliJobStoreBusyError. This is the documented fail-closed result.Full same-prefix apply:
:385–391.applied, no retained lease, empty cleanup errors, and no lock.🤖 Prompt for AI agents
Phase 2: Move recovery ACL work off the parent event loop
Objective: parent admission must not block the event loop while PowerShell ACL subprocesses run. Keep gate and pin ownership, fail-closed denial, denial before any mutation, and the process-wide exclusion domain unchanged.
All current parent callers use synchronous
beginCodexCliSelectionParentWrite().Current blocking chain:
beginCodexCliSelectionParentWrite()(cli-update-selection-gate.ts:115–131).codexCliUpdateRecoveryBlocksAdmission()(cli-update-recovery.ts:152–170).withWindowsCliRecoveryStore()(cli-update-job-store-windows.ts:687–754).verifyWindowsEntriesAcl().Bun.spawnSync(windows-owner-acl.ts:117–135).Each verifier call has a budget of up to 5,000 ms (
:112). The calls cover the ancestry batch, the directory, and each record leaf. The total is not one 5-second deadline.Task 1: Add async recovery-store inspection
Use the existing async ACL verifier. Keep native pins held across each await.
src/codex/cli-update-job-store-windows.ts, add an async counterpart towithWindowsCliRecoveryStore(). Use asyncverifyAcl(:390–397) with the same policies:"trusted-ancestry"for ancestors;"write-private"for the final two components;"private"for the directory and record leaves (:697–724).:406–427), no-reparse and canonical checks, single-link rule, and 1,024-byte limit.verifyHeld()(:797–808).finallyonly after all awaited verifications settle.src/codex/cli-update-recovery.ts, addcodexCliUpdateRecoveryBlocksAdmissionAsync(). Keep these behaviors:ENOENTlstatSyncfast path (:152–170);:172–224);windows-owner-acl.ts:331–343does not wait for the post-timeout reap. A timed-out verifier can still hold transient handles. Admission denies on timeout. Do not treat async completion as proof that subprocess resources have settled.Task 2: Add async parent admission in the selection gate
Make contention denial immediate. Keep exact ownership across the await.
src/codex/cli-update-selection-gate.ts, add async parent admission next tobeginCodexCliSelectionParentWrite(). Return the same{ entered, exit() }shape.FREE → PARENT_WRITECAS synchronously. If the gate is held, return the denied handle at once. Do not run recovery or ACL work.codexCliUpdateRecoveryBlocksAdmissionAsync().PARENT_WRITEvalue with a CAS. Then return{ entered: false, exit() {} }.exit()idempotent.:17–26), worker generations (:73–86), cancel-versus-commit CASes (:89–102,:198–202),childStarting()sealing (:204–217), or retained-ownership retry after a failed durable terminal publication (:224–232).tryEnter()reports busy.waitEnter()yields until the parent exits or is denied. Its default contention deadline is 30 seconds.beginCodexCliSelectionParentWrite()exported. After the caller migration, no in-repo production parent caller uses it.Task 3: Migrate parent callers to async admission
Keep each caller's denial result. Deny before any mutation.
src/codex/runtime.ts:409–427,:437–461CodexCliSelectionMutationBusyErrorbefore any mutation or cache invalidation. Release infinally.src/codex/shim.ts:979–993,:1116–1122src/codex/shim-overlay.ts:448–464,:481–508src/codex/desktop-app-restart.ts:249–299selection_mutation_busybefore restart-lock acquisition.src/remote-control/workspace-codex-runtime.ts:370–425bun run typecheckto find every affected call site.Task 4: Add admission tests for event-loop progress, denial, cancellation, and concurrency
Verify behavior that the current tests do not show.
Gate unit tests: adapt
tests/codex-integration/codex-cli-update-worker.test.ts:268–343to async admission.Windows-gated tests: use
tests/codex-integration/codex-cli-update-windows-recovery.test.ts, an existing recovery directory, and a deferred async runner seam.tryEnter()is busy.waitEnter()enters after the parent exits.Existing cases to adapt:
:111–192) must deny through the async path.commit()ortryEnter()is false must stay false.Native PowerShell test, with no seam:
windows-owner-acl.ts:129–135). Assert that parent admission never calls it. This proves thatspawnSyncis no longer on the path.Other updates: update existing tests for migrated callers to await admission.
🤖 Prompt for AI agents
Phase 3: Directory identity precision and retention fixture root contract
Objective: fix two review corrections.
Number.MAX_SAFE_INTEGER.Task 1: Use exact bigint-derived strings for directory identity
NTFS file IDs are 64-bit. The current
${relative}:${st.dev}:${st.ino}(cli-update-windows-observation.ts:30–39) uses number-valuedlstatSync. Two distinct directories can serialize to the same identity.src/codex/cli-update-windows-observation.ts, change the per-entry stat at:30tolstatSync(path, { bigint: true }). Use one stat call. Do not introduce a race between two stats.st.nlink !== 1n.:42–43), refuse sizes aboveBigInt(Number.MAX_SAFE_INTEGER). Then convert tonumber. This matcheswindows-installation-files.ts:35–41.${relative}:${String(st.dev)}:${String(st.ino)}. Extract this serializer as a small exported pure function for direct tests.":"split (cli-update-windows-apply.ts:38–47) and JSON snapshot equality (:82–91) need no change.maxBytesstat (:69–71). It is not an identity.Tests:
tests/clients/aside-profile-identity.test.ts:12–13,68–106. Use2n ** 53nand2n ** 53n + 1n. Show that theirNumbervalues collide and the serialized identities differ.Task 2: Align retention worker root validation with the session contract
Failure mode: the session creates roots under canonical OS temp (
windows-cli-apply-retention-session.ts:25–35). The worker accepts only/^[A-Z]:[\\/]ocx-actual-apply-[^\\/]+$/i(windows-cli-apply-retention-worker.ts:256–261). The worker therefore rejects every root that the session creates. The worker also accepts drive-root children that no privacy check covers.tests/helpers/windows-cli-apply-retention-fixture.ts, which the worker already imports, add one exported root predicate. A root is valid only when all conditions are true:realpathequals the supplied path. There is no junction or short-name alias at the root.ocx-actual-apply-.tests/helpers/windows-temp-ancestry.ts:19–42.executionAuthorized, Windows x64, the 36-character nonce, and the 4-byte failure fence.windows-temp-ancestry.ts:44–55. Do not add a second anchor mechanism.…session.ts:158–162,…fixture.ts:31–35), native reparse/ACL checks at and below the fixture, or cleanup order (…worker.ts:187–219).Tests: create a focused Windows-x64-gated test file under
tests/codex-integration/. Register it inscripts/test-layout/layout.jsonand atests/fixtures/test-layout-expected*.jsonshard. Cover these cases:C:\ocx-actual-apply-*drive-root child → refused.🤖 Prompt for AI agents
Phase 4: Structure map, Chinese clause, and validation
Objective: complete the structure source map. Update the contract prose for Phases 1–2 and exact directory identity. Restore the missing Chinese clause. Run the repository validation commands.
Task 1: Complete the codex-cli-update.md manifest entry and review mapped prose
devthat all four paths below are tracked by git.structure/manifest.json, add these four paths to thedocumentsarray of thecodex-cli-update.mdentry:src/codex/cli-windows-plan-provenance.tsstructure/codex-cli-update.md:67src/codex/windows-npm-execution.ts:110src/lib/windows-owner-acl.ts:454; keep its existingremote-link.mdmappingsrc/codex/windows-installation-files.ts:467structure/codex-cli-update.md, update the current-contract prose:remote-link.mdonly ifwindows-owner-acl.tsbehavior changed.bun run structure:index, thenbun run structure:check. Do not editstructure/INDEX.mdby hand.Task 2: Restore the reported-version clause in four Chinese paragraphs
docs-site/src/content/docs/zh-cn/reference/cli/agents.md(approximately:225).docs-site/src/content/docs/zh-cn/reference/cli.md(approximately:20).docs-site/src/content/docs/zh-tw/reference/cli/agents.md(approximately:226).docs-site/src/content/docs/zh-tw/reference/cli.md(approximately:31).maincheckout. Locate the paragraphs again ondev.reference/cli/agents.md:1162–1163,reference/cli.md:~151). Compare against this English sentence ondev.selectionAttestedwording unchanged.attestparagraphs (zh-cn …agents.md:238,zh-tw …agents.md:239) or the fr/ja pages.Task 3: Run validation and report unexecuted Windows scope
bun run typecheckbun run testbun run structure:checkbun run privacy:scancd docs-site && bun install --frozen-lockfile && bun run buildmain/preview. Do not add Windows PR jobs.🤖 Prompt for AI agents
Research
Ticket summary
Resolve the six open review findings from
#7648. The change landed asc655484d9cccf316f3da41047d508bf10d92070a. The reviewed head was6618aadd6dd445001c433c86828cce8e90bee62c.managedclause.Each fix must keep the integrated updater stack, its ownership and identity checks, and its fail-closed behavior. Do not reapply old refusal paths.
Codebase summary
Opencodex is a Bun-native strict TypeScript ES-module codebase. The
#7648Windows updater is insrc/codex/.cli-update-job-store-windows.ts: apply authority, persistent lock, pins, and the recovery store.cli-update-selection-gate.ts: process-wide parent/worker exclusion and commit windows.cli-update-recovery.ts: durable recovery inspection.cli-update-windows-observation.ts: install snapshots.cli-update-windows-apply.ts: the apply sequence.windows-installation-files.ts: native handle-bound identity.src/lib/windows-owner-acl.ts: ACL verification. It has a syncBun.spawnSyncrunner, an asyncBun.spawnrunner, and test seams for both.The parent-write callers are in
src/codex/runtime.ts,shim.ts,shim-overlay.ts,desktop-app-restart.ts, andsrc/remote-control/workspace-codex-runtime.ts.Windows-native tests are in
tests/codex-integration/andtests/windows/. They are Windows-x64-gated. Retention fixtures are intests/helpers/windows-cli-apply-retention-*.ts. Temp-ancestry support is intests/helpers/windows-temp-ancestry.ts.structure/manifest.jsongeneratesstructure/INDEX.md. Thestructure:indexandstructure:checkscripts enforce that mapping. Docs are indocs-site/src/content/docs/. English is canonical.Revision constraint: the inspected checkout (
88aaa754…, detachedmain) does not contain the#7648tree. All implementation line references are atc655484…, except where the plan identifies references frommain. The ticket states that these blobs still match ondev.File-level change summary
Source
src/codex/cli-update-job-store-windows.ts:842–848,:797–808). Add async recovery-store inspection next to:687–754.src/codex/cli-update-windows-apply.tsleaseRetainedand cleanup classification follow the real lock and pin state.src/codex/cli-update-recovery.tscodexCliUpdateRecoveryBlocksAdmissionAsync().src/codex/cli-update-selection-gate.tssrc/codex/runtime.ts,shim.ts,shim-overlay.ts,desktop-app-restart.ts,src/remote-control/workspace-codex-runtime.tssrc/codex/cli-update-windows-observation.tslstatSyncand an exported exact serializer.Tests and helpers
tests/codex-integration/codex-cli-update-windows-apply.test.tstests/codex-integration/codex-cli-update-windows-recovery.test.tstests/codex-integration/codex-cli-update-worker.test.tstests/helpers/windows-cli-apply-retention-fixture.tstests/helpers/windows-cli-apply-retention-worker.ts,…-session.tstests/codex-integration/Docs and structure
structure/manifest.jsonstructure/INDEX.mdstructure/codex-cli-update.mdFollow-up agent instructions
dev, not the88aaa754…checkout. Re-confirm eachc655484…line reference before editing.#7815/fix(windows): admit local config writer phases after config-root ACL settlement #7869,#7834/fix(config): re-arm the atomic writer's ACL timeout memo #7843 or#7860areas.releaseLock()after an identity mismatch. Never delete by path. Keepclosed = truefirst.🚀 Next Steps
🤖 All AI agent prompts combined
💡 Iterate on the plan with:
@coderabbitai <feedback>Start Coding →
fix(codex): address Windows updater release and observation reviews (#…
lidge-jun commentedon Oct 28, 2026
Status after #7875 merged to
dev(53a98e9f). Independent security review PASS (0 blocking); exact-head PR CI 30/30; native Windows updater suite 378 pass / 0 fail.src/codex/cli-update-selection-gate.tsstill reaches synchronous ACL/PowerShell verification insrc/codex/cli-update-job-store-windows.ts(each call bounded by ~5s). Kept open here for a follow-up.Leaving this issue open for the remaining synchronous-admission item.
github-actions commentedon Oct 28, 2026
Automated translation bookkeeping — detected language: English.
luvs01 commentedon Oct 29, 2026
Item 2 follow-up published as Draft PR #7931: #7931
Head 391f48b, based on dev 8eb970d; the latest dev 9c33e46 adds a disjoint CI-sharding change. The published 30-file tree matches the locally reviewed/tested blobs. No #7875 work is repeated and no issue checkbox is marked complete.
The candidate reserves a unique gate owner before fresh async recovery ACL checks, holds and revalidates native pins across awaits, and migrates async runtime/shim/restart/remote/management callers through a root-bound synchronous commit scope. Denial-before-mutation, exact-owner release, original DACL policies and pending-child recovery remain. Independent review found and fixed stale results after refused admission and parent/worker diagnostic misclassification.
Final Linux focus: 143 pass / 38 Windows-native skip / 0 fail, 494 assertions; layout/size regressions 11 pass; typecheck (2,228 files), structure, privacy and diff checks pass. Independent final-diff source review found no further blocking finding; it is separate from maintainer acceptance and hosted CI. An earlier 269-pass caller run is labeled historical, and interrupted
test:changedis recorded as incomplete/exit 143.Still open: the 8 newly added Windows native cases (within the 38 skips) need exact-head execution; general atomic publication/native feature subprocesses and explicit synchronous compatibility catalog paths remain synchronous. This is not whole-process async conversion, native acceptance, subprocess-reap proof, or completion of item 2.
New-head automatic checks: Cross-platform 40797643817 and Service lifecycle 40797643802 queued; Catalog 40797643886 started. No manual approval/dispatch/rerun, merge, force push, deployment or permission change.
fix(codex): await recovery ACL checks in async parent admission (#7931)
lidge-jun commentedon Oct 30, 2026
Item 2, synchronous recovery ACL/PowerShell work on parent admission, landed with #7931, merged into
devascb483626c8f6af0c0120642179d3336e42b68151. Parent selection admission now reserves its gate owner first and then awaits the recovery ACL checks off the event loop. Pins and identity checks are held across the awaits, and the async callers are migrated. Before merge, a dedicated security review passed, the Windows-native recovery/admission files passed (181/0), and exact-head CI run 41058615039 succeeded.With items 1 and 3–6 landed by #7875 (
53a98e9f), all six tracked findings now have a merged fix, so I'm closing this tracking issue. The synchronous compatibility exports that #7931 documents as residual stay as they are, and are not regressions of these findings.