src/codex/cli-update-plan.ts constructs the read-only update plan;
src/codex/app-server-processes.ts supplies its process observation.
Installation inspection follows the runtime inspection contract,
and explicit Windows observation follows its separate read-only contract.
Explicit Codex CLI installation observation does not discover a Codex home or read/write its state. See the read-only observation contract.
The read-only CLI update plan binds npm executable selection to the inspected launcher PATH.
Registry integrity requires a canonical base64 SHA-512 digest of exactly 64 bytes; malformed or truncated tokens refuse the target.
Selection observation uses the runtime resolver with provenance's bounded no-follow, nonblocking state reader and local executable-path policy. Windows returns before invoking the resolver; its deferred inspection performs no candidate or configuration I/O.
Its child environment drops npm configuration overrides, named Node startup/output controls,
the LD_*/DYLD_* loader families and the OpenSSL startup configuration and
provider/engine search variables; proxy settings and NODE_EXTRA_CA_CERTS remain supported.
Distinct npm config files, cache and logs stay under the owned temporary root with best-effort
cleanup; a cleanup error does not replace the computed plan/refusal. The POSIX update
scan includes all readable users by default, retaining an explicitly injected UID scope.
Linux per-process status/cmdline read failures invalidate a complete observation except for ENOENT
(a process that disappeared); incomplete observation refuses with blocked_process_state_unknown;
the restart/kill path skips unreadable entries while retaining independently verified same-user app-server targets. This plan neither installs a runtime nor signals
an existing Codex session. Windows enumeration/installation limits remain unchanged.