Windows Codex Desktop Real-Install E2E
August 5, 2026 · View on GitHub
This runbook lets Claude Desktop use computer control to drive Codex Desktop through an authorized real installation of Codex SDLC Wizard in an existing Windows product repository. It is both an adoption procedure and a black-box E2E test.
Do not use codex-sdlc-wizard itself as the target repository. This repository contains the runbook and wizard source; the target must be the separate product repository where SDLC guardrails should be installed.
What to paste into Claude Desktop
Open Claude Desktop in a fresh session with computer use enabled, then paste exactly:
Use computer control to operate Codex Desktop on this Windows machine. Read WINDOWS-CODEX-DESKTOP-E2E.md from the current codex-sdlc-wizard checkout and execute the complete runbook. The installation target is the separate product repository currently open in Codex Desktop. Do not install the wizard into its own source repository. Do not commit, push, tag, publish, deploy, or begin product implementation. Return the required evidence report when finished.
If Codex Desktop is not already open to the intended product repository, Claude must stop and ask for the target repository rather than guessing.
Operating contract
- Use Claude Desktop only as the external computer-use operator. Perform the repository work through the visible Codex Desktop user interface.
- After the Phase 1 profile inspection, use GPT-5.6 Sol at
highreasoning. If an initialized repository still pins an older driver orxhigh, the repository pin wins and cannot be overridden from the picker: use that pinned model only to run the verified update, then restart and enforce the migrated post-update profile in Phase 4. - Preserve every existing source file, document, hook, configuration file, customization, and uncommitted change.
- Do not clean, stash, reset, discard, or commit existing work.
- Do not commit, push, tag, publish, deploy, or open a pull request during this run.
- Do not manually delete
.codex,.agents,.codex-sdlc,AGENTS.md, or existing SDLC documents. - Do not uninstall the plugin initially. Inspect the current state first.
- If a wizard defect occurs, gather exact evidence and stop the affected phase. Do not modify the cached plugin or wizard source to hide the failure.
- Never include secrets, tokens, private source contents, or customer data in the final report.
- Redact secrets, tokens, private source text, and customer data from every warning, error, transcript, and screenshot included in the report. Replace only sensitive values with
[REDACTED]so the diagnostic shape remains useful.
Phase 1: Establish the real target and baseline
- Bring Codex Desktop to the foreground.
- Report the repository name and absolute Windows path shown by Codex.
- Stop if the selected target is the
codex-sdlc-wizardsource repository. - Confirm the selected directory is the intended real product repository.
- Confirm the separate
codex-sdlc-wizardcheckout is at the intended committed candidate and has no modified, staged, or untracked files. Stop if it is dirty. Export its committedHEADwithout changing the checkout: rungit -C "<wizard-checkout>" archive --format=zip --output="<temporary-directory>\wizard-head.zip" HEAD, expand that archive outside both repositories, and record the expanded directory as<verified-head-export>. The repository's.gitattributespins*.shto LF for normal checkouts; the committed export additionally avoids treating a pre-existing CRLF working tree as candidate payload. - In Codex, run read-only inspection commands to record:
- Windows version and architecture
- Codex Desktop package version, plus the Codex CLI version and executable path returned by
Get-Command codexandcodex --version - whether another global npm shim or executable shadows the Desktop installation on
PATH - the Desktop-bundled CLI version when it can be obtained without bypassing Windows security; WindowsApps may prevent direct execution, so record
bundled CLI version unavailableand the exact redacted error when it cannot be executed. Do not fail the run merely because this separate bundled version is unavailable; the Desktop package version is not a substitute CLI version. - Node.js and Git versions
- repository root, branch, and
git status --short --branch - configured remotes without contacting or changing them
- the expected Codex SDLC Wizard release version from
<verified-head-export>\package.json - an exact canonical candidate-payload manifest for every shipped file selected by the committed export's
package.jsonfilesplus automatically includedpackage.json; derive the path list withnpm pack "<verified-head-export>" --dry-run --jsonand sort paths ordinally. In the committed export and every plugin or extracted-package source being compared, inspect each shipped.shfile as raw bytes before hashing: stop if it contains any carriage-return byte (including CRLF), and hash accepted.shbytes exactly unchanged. Git Bash requires LF-only shell payloads. For other UTF-8 text, normalize CRLF and lone CR to LF before SHA-256 hashing; hash binary bytes unchanged. For.codex-plugin/plugin.json, parse JSON, canonicalize only the platform-generated+codex...suffix out of the top-levelversion, recursively sort object keys, and serialize compact UTF-8 JSON before hashing in every compared source; still record and compare the visible full plugin version separately.
- Stop before plugin or npm work if the PATH-resolved Codex CLI returned by
Get-Command codexis older than0.144.0or Node.js is older than 18. Report the resolved executable and unsupported prerequisite; do not let an update mutate the repository first. The0.144.0floor applies to this resolved PATH Codex CLI because it is the CLI the Phase 2 npm fallback and its handoff invoke, even when a global npm shim shadows Codex Desktop. It does not apply to an inaccessible WindowsApps executable whose bundled version is unavailable.
Before continuing, run Get-Command bash -ErrorAction SilentlyContinue, bash --version, and bash -lc 'uname -s' in PowerShell. Continue only when uname identifies an MSYS, MINGW, or CYGWIN environment. A WSL launcher named bash.exe is not Git Bash and cannot safely consume the Windows package paths used here. If compatible Bash is unavailable on PATH, stop before plugin mutation or npm fallback and report that this adaptive E2E requires Git Bash.
- Record whether these paths already exist:
AGENTS.md.codex/config.toml.codex/hooks.json.agents/skills/sdlc/SKILL.md.codex-sdlc/SDLC.mdTESTING.mdARCHITECTURE.md
- If
.codex-sdlc/manifest.jsonexists but is invalid JSON or lacks the expected manifest object, stop before plugin inspection, setup, or update. A broken manifest is neither initialized nor safely uninitialized, and setup can partially mutate the repository before failing. - If
.codex/hooks.jsonexists, parse and validate it before any setup, update, plugin mutation, or fallback execution. Require a JSON object; whenhooksexists, require it to be an object whose event values are arrays, whose entries containhooksarrays, and whose hook entries are objects with stringcommandvalues when present. If.codex/hooks.jsonis invalid, stop before setup or mutation. Do not let setup create documents before discovering malformed hook configuration. - Before enforcing or validating the model contract, read
.codex-sdlc/model-profile.jsonand.codex/config.toml. If.codex-sdlc/manifest.jsonis valid, record the repository as initialized, its existing selected profile, and its pre-update driver and reasoning effort. An initialized update must preserve that selected profile unless the user separately authorizes migration. When the existing repo pin conflicts with the current consumer default, do not fight the picker: run the update under the preserved repo-pinned model, then verify the migrated post-update driver and effort separately in Phase 4. - If the repository is uninitialized, stop when any unconditional installer target already exists:
.codex-sdlc/model-profile.json,.codex/hooks/bash-guard.sh,.codex/hooks/session-start.sh,.codex/hooks/git-guard.cjs,.codex/hooks/session-start.cjs,.codex/hooks/compact-guard.cjs,.codex/hooks/git-guard.ps1,.codex/hooks/session-start.ps1,.codex/hooks/git-guard.js,.codex/hooks/session-start.js, or.codex/hooks/sdlc-prompt-check.sh. The model-profile file is an unconditional destructive collision because setup rewrites it, while the.jsnames andsdlc-prompt-check.share retired targets that current setup removes. Perform this collision preflight before either the plugin path or npm fallback. - Hash every pre-existing modified or untracked path reported by Git, recursively hashing files inside dirty directories. Record deleted paths as absent. Also hash every pre-existing manifest-managed path and every pre-existing installer-targeted path named in steps 8 and 12, regardless of Git status; this explicitly includes
.codex-sdlc/manifest.json,.codex/hooks/sdlc-prompt-check.sh, and all other retired names known to the candidate'slib/remove-retired-files.cjs. These include ignored wizard files that update may rewrite or remove. If every dirty, managed, retired, and installer-targeted path cannot be captured, stop rather than claim preservation from Git status alone. - Resolve the active Codex home (normally
%USERPROFILE%\.codex) and record existence plus recursive file hashes—never file contents—for itsskills\feedback,skills\setup-wizard,skills\update-wizard,skills\sdlc,skills\codex-sdlc,skills\codex-sdlc-wizard,backups\skills, andskill-backupspaths. The last two backup locations are distinct.feedback,setup-wizard, andupdate-wizardare supported global helper skills and are expected to be refreshed with recoverable backups. Thecodex-sdlc-wizardinstaller skill is plugin-owned and must not be copied into globalskills\codex-sdlc-wizard; report a pre-existing standalone copy as legacy and preserve it unless the user authorizes the documented cleanup. These user-level mutations and legacy-installer migrations do not appear in repository Git status. - Preserve the complete baseline output for the final comparison.
Phase 2: Inspect the plugin before changing it
- Open Codex Desktop's Plugins interface.
- Inspect both Personal and Installed.
- Find Codex SDLC Wizard and record:
- exact plugin version
- installed/enabled state
- whether duplicate plugin or installer entries appear
- If the plugin is visible but not installed, use Install. If it is installed but disabled or not enabled, use Enable.
- Compare the plugin's release version with the expected version recorded from this checkout's
package.json, but do not treat a version-only match as candidate identity. - If the interface offers an Update or Reinstall action for an older or mismatched version, use that action and verify the version again.
- Only uninstall and reinstall the plugin package when no in-place update path exists. Do not remove repository-local guardrails as part of a plugin reinstall.
- If duplicate legacy installer skills appear, record their labels and scopes. Use only the wizard's documented recoverable legacy-skill cleanup; do not delete repository data.
- Start a fresh Codex session after any plugin installation, enablement, update, reinstall, or legacy-skill cleanup.
- Resolve the active installer skill's source path from Codex's visible work log and derive its native Windows plugin root. Convert it for Git Bash with
bash -lc 'cygpath -u "\$1"' -- "<native-plugin-root>"and record the result as<verified-plugin-root>. Recompute the complete canonical payload manifest using the exact Phase 1 path list and normalization rules. Every shipped payload path and hash must match before the plugin path can mutate the target; missing or extra expected payload files fail identity. A matching release-version label or+codex...build suffix alone is insufficient.
If the plugin is unavailable through the visible interface, or its exact payload manifest remains stale/mismatched after the supported update or reinstall path, use the exact committed HEAD export prepared in Phase 1 as the candidate fallback instead of resolving a registry dist-tag or packing potentially CRLF-converted working-tree files. Confirm that the Phase 1 Git Bash compatibility preflight passed, then run npm pack "<verified-head-export>" --pack-destination "<temporary-directory>" and extract that tarball outside both repositories. Do not use @latest for this candidate test. Recompute the complete canonical payload manifest for the extracted package using the Phase 1 path list and normalization rules. Every payload hash and the package version must match before execution. If either comparison differs, stop because neither available path can validate the intended candidate.
Execute the already verified extracted package directly; do not use npx after verification because it can resolve a different dist-tag or cached package. Choose the command from repository state, substituting the absolute extracted-package path for <verified-package>:
- Initialized repository (a valid
.codex-sdlc/manifest.jsonexists):node "<verified-package>\bin\codex-sdlc-wizard.js" update - Uninitialized repository:
node "<verified-package>\bin\codex-sdlc-wizard.js" setup --yes --model-profile maximum
For an initialized repository with a pre-update model conflict recorded in Phase 1, run this update under the preserved repo-pinned model; do not claim the current model contract is active until the update finishes and a restarted session verifies the post-update configuration.
Do not install the npm package globally. Record that the verified-package fallback was required. When the selected command finishes, run node "<verified-package>\bin\codex-sdlc-wizard.js" check and capture the result. Keep the verified package through Phase 4 so the same trusted check command remains available, and remove its temporary directory only after the preservation comparison in Phase 5. Restart Codex Desktop in the same target repository, skip Phase 3, and continue with Phase 4. This npm fallback performs the repo operation directly and does not make the plugin-only $codex-sdlc-wizard installer entry available.
Phase 3: Install or repair the real product repository
Skip this phase when the npm fallback completed successfully; it already performed the repository setup. This phase is only for the plugin UI path.
-
Reopen the target product repository in Codex Desktop.
-
Inspect
.codex-sdlc/manifest.jsonand the existing.codex/hooks/scripts before mutation. -
Search for
$codex-sdlc-wizardand select Install SDLC Guardrails. -
Give Codex this instruction, replacing
<verified-plugin-root>with the exact plugin root fingerprinted in Phase 2:Install or repair Codex SDLC guardrails in this repository using only the verified plugin payload. If the repository is initialized, preserve its existing selected profile and run exactly `bash "<verified-plugin-root>/update.sh"`. If it is uninitialized, confirm the Phase 1 collision preflight passed and run exactly `bash "<verified-plugin-root>/setup.sh" --yes --model-profile maximum`. After either operation, run exactly `bash "<verified-plugin-root>/check.sh"`. Do not use npx or any other package copy. Preserve every existing customization, document, hook, configuration file, application file, and uncommitted change. Do not commit or push. -
Allow the selected bundled setup/update/check workflow to finish.
-
Do not substitute raw package edits or manual generated-file changes for a failed installer step.
-
Capture all visible output, warnings, approval requests, exit codes, created-file counts, and verification results.
-
If the operation recommends a restart, fully restart Codex Desktop or start a fresh session rooted in the same repository.
Phase 4: Verify the installed workflow
-
Confirm Codex reopens the target repository without a hook, configuration, locale, or startup error.
-
Open
/hooks. Review any pending repository hooks and confirm the wizard hooks are approved and active before relying on enforcement or declaring the install ready. Inspect the stored enabled state as well as approval/trust: require the repositoryPreToolUseevent to be explicitly enabled, and treatenabled = falseor a wizard-checkhook_activation.disabled_eventsentry as a warning that commit/push enforcement is not ready. Approval alone is insufficient. -
Confirm exactly one repo-scoped
$sdlcappears for the target repository. Report and preserve any separate user-owned global$sdlc; do not count it as a second repository-scoped entry and do not delete or rewrite it without permission. Also confirm the supported global helper skillsfeedback,setup-wizard, andupdate-wizardare expected user-level entries, whilecodex-sdlc-wizardremains plugin-owned rather than copied into the global skills directory. -
Invoke
$sdlcwith this read-only request:Inspect the installed SDLC configuration and explain the active model profile, planning policy, TDD requirements, verification requirements, review gates, and commit/push rules. Cite the repo files that define each rule. Do not edit files and do not claim that any review has already passed. -
Run the bundled wizard check from the same verified source used for mutation and capture its complete structured result:
bash "<verified-plugin-root>/check.sh"for the plugin path, ornode "<verified-package>\bin\codex-sdlc-wizard.js" checkfor the verified-package fallback. -
Confirm all of the following:
- repository state is initialized
- an uninitialized installation selected
maximum; an initialized update preserved the selected profile recorded in Phase 1 - pre-update model values remain historical evidence only; after the update and restart, the driver matches the preserved/selected profile:
maximumusesgpt-5.6-solathigh; an explicitly preservedmixedprofile usesgpt-5.6-terraatmediumwithgpt-5.6-solreview explicitly set tohigh - required managed artifacts are present
- no managed artifact is missing or drifted/broken
- existing customizations are preserved according to the complete baseline comparison; preserved files may report as
matchwhen first recorded in a new manifest, whilecustomizedis reserved for drift from an existing manifest - there is no duplicate legacy
$codex-sdlcor duplicate wizard installer entry - the post-install Git status contains only intentional wizard installation changes plus the exact pre-existing changes
Phase 5: Preservation comparison
- Re-run the baseline Git status and file hashes.
- Compare every pre-existing modified/untracked path against the baseline.
- Compare the recorded Codex-home skill and backup paths, and disclose every user-level skill replacement, backup, migration, or removal.
- Explain every new, changed, or removed wizard-managed path, including deletion of any retired file captured from
lib/remove-retired-files.cjs. - Treat an unexplained change to application code, an existing customization, or a user-level Codex skill as a failure.
- Do not repair a preservation failure locally. Preserve evidence for the upstream issue.
- After all comparisons and evidence capture finish, remove only the exact temporary verified-package files and extraction directory outside the target repository. If PowerShell
Remove-Itemis blocked, use Windows-native cleanup with explicit resolved paths:cmd /c del /f /q "<temporary-package-file>"for files andcmd /c rmdir /s /q "<temporary-extraction-directory>"for directories. Verify each target is the previously recorded temporary path and is outside both repositories before deletion, then confirm it is absent.
Required final report
Return one of: PASS, PASS WITH FOLLOW-UP, or FAIL.
Include:
- target repository name and absolute path
- Windows version and architecture
- Codex Desktop package, PATH-resolved Codex CLI (with executable path), Node.js, Git, expected checkout, plugin, npm package, and adapter versions, including whether the plugin release version matched the checkout; report the Desktop-bundled CLI as unavailable when Windows prevents obtaining it
- installation path used: plugin UI or verified-package fallback
- before/after Git status
- files created, updated, preserved, customized, missing, or drifted/broken
- complete wizard check counts and repository/profile state
- whether restart succeeded cleanly
- whether exactly one repo-scoped
$sdlcappeared and answered correctly, plus any preserved user-owned global$sdlc - every warning or error with diagnostic wording preserved but all sensitive values redacted
- redacted screenshots or visible transcript evidence
- confirmation that no commit, push, tag, publish, deployment, or PR occurred
- whether the repository is ready for normal work with
$sdlc
For every defect, append a GitHub-issue-ready block containing:
- concise title
- severity and user impact
- expected behavior
- actual behavior
- exact reproduction steps
- environment and versions
- relevant logs/output with secrets removed
- workaround, only if one was safely verified without changing wizard internals
Stop after the report. Do not begin the product's implementation work until the installation result is accepted.