Windows quick start: install the Microsoft Store ChatGPT/Codex app, close it, and double-click
Launch Luna Ultra.cmd. Luna supplies its x64 native boundary and can provision its pinned app-local Python runtime automatically. SeeWINDOWS_PORT.md.
This project adds two GUI aliases for Codex core's native
Ultra/Proactive Multi-Agent V2 state in the normal ChatGPT desktop app. It
is not a prompt-only imitation:
| GUI selection | Codex core | Upstream inference effort | GUI display |
|---|---|---|---|
| Sol / High | Ultra / Proactive | High on managed Sol/High branches | Sol / High |
| Luna / Max | Ultra / Proactive | Max | Luna / Max |
| Sol / Ultra | Native Ultra / Proactive | Max | Sol / Ultra |
| Every other pair | Selected model/effort under the shared V2 profile | No inference-effort rewrite | Unchanged |
Codex selects its built-in Proactive policy and all six V2 collaboration operations for the two aliases, and you choose the active spawned-agent concurrency cap at launch. Sol/High is deliberately split: Codex core sees Ultra, while its root and recursively correlated descendants use High at the provider boundary whenever their logical branch remains Sol/High. The bridge masks the internal Ultra value back to the GUI label that activated it. Native Sol/Ultra is never relabeled.
Install the Microsoft Store ChatGPT/Codex app, close it, and double-click
Launch Luna Ultra.cmd. No separate Python or Visual Studio installation is
required for an ordinary launch. If no compatible x64 CPython is already
available, the first launch downloads the official CPython 3.13.15 x64
embeddable archive from python.org, verifies its pinned SHA-256, and publishes
it under the checkout's private runtime/python/ cache. It does not install
Python system-wide, require administrator rights, or change PATH.
The launcher prompts for the maximum number of concurrently open spawned-agent
threads, excluding the primary; pressing Return accepts the default of 3.
After validation, the console remains open for the full Luna session. Press
Return or Ctrl+C there to close only the ChatGPT process tree created by that
launcher. Closing ChatGPT first ends the console session as well. The created
GUI is bound to a private kill-on-close Windows Job before it begins running,
so closing the launcher window or otherwise terminating its session cannot
leave that modified GUI tree running without its launcher. For an explicit
noninteractive selection, run Launch Luna Ultra.cmd --agents N from Command
Prompt (or prefix the quoted path with & in PowerShell).
The .cmd entrypoint invokes the tracked bootstrap helper with a process-only
PowerShell execution-policy override; it does not change the user or machine
policy. An offline machine can be seeded with the pinned archive as documented
in WINDOWS_PORT.md.
Each launch validates the installed OpenAI.Codex_2p2nqsd0c76g0 package,
Store status, full-trust manifest, OpenAI Authenticode signer, PE architecture,
and the hashes of the desktop and bundled runtime pair. It copies the signed
Codex pair into a fresh private stage, validates and stages Luna's hash-pinned
prebuilt PE x64 wrapper and launcher, and selects a PE x64 CPython bridge. It
launches only the new packaged GUI with a process-scoped CODEX_CLI_PATH. An
elevated invocation uses the normal
Explorer token; an unelevated invocation uses CreateProcessW directly. It
never enables package debugging and refuses to redirect an already-running
ChatGPT GUI.
The external Store package is architecture-neutral input: its signed runtime
may be x64 or ARM64, while Luna's wrapper, launcher, and Python bridge are x64.
Package updates are accepted only after the live
identity, signature, architecture, version, and hashes pass again; there is no
stale ARM release pin. The bridge records a fresh owner-private audit under
runtime/audit/; preflight binds that root to the exact desktop user even when
staging runs elevated. Windows uses user-approved-untested compatibility with
the exact Codex version observed during that launch.
For a read-only discovery check or an isolated marker smoke:
"Preflight Luna Ultra.cmd" --json
"Preflight Luna Ultra.cmd" --marker-smoke --jsonThe smoke closes only the GUI tree it created and fails if process exit cannot
be proven. Close ChatGPT before a normal launch: Windows single-instance
redirection cannot add an environment override to a process that is already
running. See WINDOWS_PORT.md for cleanup, security details,
and current limitations.
This is tested and pinned to one exact Apple-silicon ChatGPT desktop release. An authentic OpenAI-signed but untested release can be tried through an explicit, default-No per-launch override. If your installation meets the macOS requirements:
git clone https://github.com/mapleroyal/luna-ultra-gui.git
cd luna-ultra-gui
/bin/zsh scripts/generate-commandThen double-click Launch Luna Ultra.command in Finder to run it.
The generator creates an executable, byte-for-byte .command copy locally and
removes any quarantine attribute from that new file. The generated launcher is
Git-ignored; it is intentionally not part of the repository.
The launcher asks for the maximum number of concurrently open spawned-agent
threads, excluding the primary. Like Windows, it accepts 1 through 64,
defaults to 3, and requests confirmation above 16. It keeps its Terminal
window open for the full Luna session. Press Return or Ctrl+C there, or close
the Terminal window, to close only the exact ChatGPT process tree created by
that launcher. Closing ChatGPT first ends the launcher automatically. The
launch lock and staged runtime remain owned by the launcher until that session
cleanup completes.
This repository is deliberately release- and platform-specific:
- macOS on
arm64; - ChatGPT desktop
26.818.41509(build6962) with bundledcodex-cli 0.149.0-alpha.4.1and itscodex-code-mode-hostcompanion; - the app named
ChatGPT.apporCodex.appunder/Applicationsor~/Applications; - a signed-in account with access to GPT-5.6 Sol or Luna (the local preflight cannot verify account entitlement);
- for the tested path, the exact signed app and Codex identities recorded in
evidence/release-manifest.json; an untested run still requires authentic OpenAI signatures and the other safeguards described below; /bin/zsh,/usr/bin/python3, and standard macOS tools such ascodesign,git,lipo,lsappinfo,osascript,open, andshasum;- a writable Git checkout kept in its original directory layout.
The runtime uses only the Python standard library. The committed tests are verified with Apple's Python 3.9.6. ChatGPT auto-updates normally. If a newer authentic app does not match the tested manifest, the launcher shows both versions and asks whether to run the local prompt/config compatibility preflight and try it once. Declining changes nothing.
From the repository root:
/usr/bin/python3 -m unittest discover -s tests -vThe unit/evidence suite covers protocol and outbound-effort rewriting, rollback, loopback routing and framing, wrapper dispatch, marker/lock safety, release-evidence schema, artifact attestations, and cross-file configuration parity.
The real app-server matrix is a separate, local-only check:
/usr/bin/python3 tests/integration_probe.pyIt runs only when the installed app exactly matches the release manifest.
Otherwise it emits a machine-readable skipped result and exits successfully.
Use --strict-release when a mismatch should fail automation:
/usr/bin/python3 tests/integration_probe.py --strict-releaseThe probe uses an in-process deterministic HTTP Responses endpoint. It never
sends a model request to OpenAI, and its output contains no captured prompts,
protocol IDs, or credentials. It iterates all supported installation locations,
strictly verifies the app, Codex, and the code-mode host, reports only mismatch
field names, and executes owner-private sealed copies of the authenticated
Codex runtime pair and current proxy bytes. It also executes a deterministic
code-mode custom-tool call through the staged host. For Sol/High it verifies
root-turn, compaction, inherited-child, and inherited-grandchild requests reach
the deterministic upstream at High while the alias branch remains
Proactive/Ultra. It also checks an explicit Medium branch, recursive Medium
inheritance, model-only logical-effort inheritance, exact
spawn-call-to-child-thread lineage, and allowlisted server acknowledgments. It
includes repository-relative hashes of the hardened project artifacts in every
ordinary result. The committed passing result is
evidence/macos-26.818.41509-integration-summary.json.
It is macOS ARM64 evidence bound to project commit
cdb4da94306949d3d76f07fd10002611eca249d0, not a claim about current
worktree bytes or Windows. See
evidence/historical-integration-summary.json
for the recovered, explicitly scoped earlier evidence.
Double-click the locally generated Launch Luna Ultra.command in Finder.
After pulling a change to Launch Luna Ultra.zsh, remove the old generated
copy and rerun /bin/zsh scripts/generate-command. The generator refuses to
overwrite a different file or follow a symlink.
Enter the spawned-agent thread cap. The primary agent is not included, matching
agents.max_concurrent_threads_per_session semantics. For example, entering
5 permits five spawned agents plus the primary.
If the installed app is authentic and OpenAI-signed but does not match the
tested release, the launcher offers Launch this untested release anyway? [y/N]. Approval applies only to that run. It relaxes release-specific
version/build, CDHash, and Codex hash/version pins, but still requires the
expected bundle ID, OpenAI Team ID, architecture, strict signatures, a passing
native-Ultra prompt comparison, and stable observed identities throughout the
launch. There is no promise that an untested release will pass or behave
correctly.
If ChatGPT is already running, the launcher asks permission to quit and relaunch
it because an existing desktop process cannot retroactively adopt a different
CODEX_CLI_PATH. It waits for the original processes to exit and never
force-kills that pre-existing desktop. If a newly launched, still-unverified
process fails attestation, cleanup is limited to marker/PID/start-identity-bound
processes from that launch. The launcher freezes the bound process forest,
tracks descendants that reparent within its owned process groups, requests
termination, and uses SIGKILL only for survivors.
While the profile is active, Sol / High and Luna / Max requests are kept at native core Ultra across new, resumed, forked, settings-changed, and subsequent-turn flows. A Sol/High root additionally starts a launch-local managed descendant tree. Its root, compaction, and recursively correlated Sol/High descendants are lowered from core's serialized Max to upstream High. Luna/Max and native Ultra stay Max upstream. Changing either the model or effort away from a trigger pair stops the root alias rewrite. Failed and out-of-order changes roll back to the last accepted pair.
Inside that managed Sol/High tree, a spawn_agent call that omits
reasoning_effort inherits its parent's logical effort, recursively. This also
applies when the call supplies only a model. An explicit none, minimal,
low, medium, high, xhigh, max, or ultra starts that child's branch
at the requested effort: Sol/High remains the Ultra-core/High-wire alias, while
native Ultra is serialized as Max. These inheritance rules are deliberately
confined to the managed Sol/High tree; spawns under Luna/Max, native Sol/Ultra,
and other roots retain ordinary Codex behavior.
Codex 0.149.0-alpha.4.1 reports a follow-up to an already-loaded child as
subAgentActivity: interacted, rather than replaying its original started
edge. When that child predates the current launcher process—or a started
edge arrives after its spawn intent was lost during a restart—the bridge
admits only the exact parent/turn/child activity and preserves the model and
core effort it actually observes. It never guesses that an ambiguous
Sol/serialized-Max child was the Sol/High alias, so this recovery path remains
Max upstream. Proactive/serialized-Max is retained as core Ultra for nested
work. A deterministic request or lineage rejection is returned as a
non-retryable client error instead of a retryable 502 loop.
For a fresh resume, the request may reveal neither the persisted model nor effort. The bridge passes that resume through and learns from Codex's response. A returned Luna/Ultra can be recognized as the persisted Luna/Max alias because Luna does not advertise native Ultra; a returned Sol/Ultra remains visible as native Ultra. Explicit non-alias pairs are never inferred as aliases. The app-wide V2 and capacity fields are still canonicalized on every start, resume, and fork, including this flow.
The launcher does not persistently edit ~/.codex/config.toml, the signed app
bundle, or the model catalog.
It starts ChatGPT with a process-scoped wrapper. The wrapper runs an identity-bound JSONL bridge between the desktop and the original signed Codex app-server. That bridge canonicalizes the app-wide V2/capacity fields on start/resume/fork and rewrites the two exact GUI aliases into core Ultra.
The same process also runs an ephemeral HTTP provider bridge on a random
loopback capability path. Codex's built-in OpenAI provider is routed through it
with request compression disabled and WebSocket requests deliberately moved to
HTTP. All provider traffic passes through this local bridge, but only an
identified Sol/High root, its compaction, or a correlated Sol/High descendant
has reasoning.effort changed from Max to High. The private alias marker is
removed before forwarding. Other roots and non-Sol/High descendant branches
receive no inference-effort rewrite, although every task shares the selected
V2 orchestration/capacity settings and custom model providers are not preserved
by this profile.
Quitting ChatGPT removes the process-scoped override. Starting ChatGPT normally restores ordinary behavior.
Each launcher run also creates:
- a verification marker under
runtime/markers/; - a token-bound pair containing the authenticated Codex executable and its
codex-code-mode-hostcompanion underruntime/staging/; - an owner-private JSONL audit under
runtime/audit/containing rewrite metadata and, for managed Sol/High requests, allowlisted lineage and effort diagnostics.
Runtime directories are owner-only. Marker/audit files are private, and both
staged runtime executables plus their token directory are sealed
read/execute-only for the owner. Diagnostics may record raw thread, turn,
parent, call, child, and response IDs; model/effort decisions; HTTP status; and
the model/effort scalars reported by the response header or
response.created. They never record prompts, full request or response bodies,
full headers, environment dumps, Authorization or Cookie values, ChatGPT
account identity, or attestation/routing secrets. Those credentials and
provider bodies necessarily transit the loopback bridge in memory only.
Before asking to quit ChatGPT, the launcher:
- Checks runtime-directory writability and acquires an owner-only launch lock.
- Requires the manifest's bundle ID, app version/build,
arm64architecture, OpenAI Team ID, full app/Codex/code-mode-host CDHashes, Codex version, and both runtime-executable SHA-256 values. For a user-approved untested run, only the release-specific pins are relaxed; bundle ID, Team ID, architecture, and strict signature checks remain mandatory. Signature verification uses an explicit Apple-anchored Developer ID requirement for OpenAI, and the observed identities become the per-launch pins. - Verifies both signatures with
codesign --strict. - Copies the exact no-follow Codex and code-mode-host source descriptors into a random private launch directory, verifies and seals that runtime closure, and never executes the mutable source-bundle pathnames.
- Requires the installed catalog to advertise Sol/High, Sol/Ultra with V2, and Luna/Max, then renders Sol's native Ultra prompt in a clean temporary Codex home.
- Renders Luna in native Ultra/V2 through the wrapper.
- Requires the two selected multi-agent developer messages and dynamic capacity text to match.
- Hash-binds both staged runtime executables, their source identities, release manifest, wrapper, bridge, control script, and instruction fingerprint to the launched process.
After launch, it verifies the exact ChatGPT → bridge → primary signed Codex
app-server process chain. LaunchServices is also checked for every running
instance of the bundle ID, including copies outside the supported install
directories. The bridge retains descriptors for the staged root, token
directory, and both executables; it rechecks their identities and hashes before the
version probe, primary app-server, and every local configuration validator.
It removes that stage only after all of its tracked private process groups are
gone. A failed new launch is cleaned by its private marker, exact PID
and process-start identity, and bound process groups rather than by application
name. Before admitting a custom Sol/High or Luna/Max task, the bridge reads the
effective local V2 configuration for that task's working directory. It tracks
sticky working-directory changes, rolls state back when Codex rejects a
request, and rejects dependent requests while a model, effort, or cwd change is
unresolved. Conflicting alias fields, unsupported advanced V2 fields, or
missing native-Ultra confirmation stop the bridge instead of silently
downgrading. For exact recursive Sol/High inheritance, effective subagent
model/effort defaults and user-defined agent roles are also rejected; only the
verified built-in default, worker, and explorer roles are admitted.
The final historical observation run exercised direct Ultra, the GUI downgrade
control, proxy start/settings/subsequent-turn behavior, durable resume and fork,
wire-level Max, GUI-side Max masking, the built-in Proactive marker, and all six
expected collaboration tools. Its project bytes were later preserved by commit
fbc1a9c3e4f70de5d200b11eb79fa25a0a29304f; the release manifest records
selected repository-state hashes. That private development history is not part
of this public repository because it contained machine-local metadata. Only the
proxy was directly executed by that historical matrix. The launcher, wrapper,
control, and unit-test hashes establish repository state, not matrix coverage.
A narrow checker covering the principal control and proxy cases passed twice earlier in development, before the final proxy hardening patch. Those two passes are not bound to the commit above. No automated checker was applied to the final observation run, so its redacted values are labeled archived observations rather than checker assertions.
The recovered historical harness is not published because it predates output
redaction and embedded machine-local metadata. The hardened replay harness is
retained in tests/integration_probe.py. Its
committed sanitized exact-release result is retained separately as
evidence/macos-26.818.41509-integration-summary.json
and remains explicitly bound to the older project bytes it exercised.
Each active audit is capped at 8 MiB and fails closed if that bound would be exceeded. Once no desktop instance remains and before opening the new one, the control script removes owner-managed marker, audit, and temporary files older than 30 days, plus stale token-bound staged executables. A token whose marker still binds any live exact process is preserved together with its stage. Quit ChatGPT before manual cleanup. To preview eligible files:
find runtime/audit runtime/markers -type f \
\( -name '*.jsonl' -o -name '*.json' -o -name '*.tmp' \) \
-mtime +30 -print
find runtime/staging -mindepth 1 -maxdepth 1 -type d -mtime +30 -printAfter reviewing that list, invoke the same guarded cleanup used by the launcher:
/usr/bin/python3 scripts/control.py cleanup-runtime --days 30See runtime/README.md for contents, permissions, and
retention details.
- Luna is cataloged as V1/Max, not V2/Ultra. The Luna/Max alias uses real Codex core behavior in an unsupported combination; it is not an OpenAI product guarantee.
- Sol/High is split-mode: core is genuinely Ultra/Proactive, while its managed root, compaction, and recursively correlated Sol/High descendant requests reach the upstream provider at High. Native Sol/Ultra remains Max upstream.
- Luna is rewritten only when Max is selected. Lower Luna efforts pass through unchanged, and the GUI does not gain a Luna/Ultra picker label.
- Recursive effort guarantees are launch-local and apply only to the managed
Sol/High lineage that the bridge correlates by parent turn, spawn call, and
child thread. Omitted effort—including a model-only spawn—means logical
inheritance inside that tree; an explicit supported effort begins a new
branch. An exact
interactedor unmatched-startedactivity under a live managed parent may conservatively recover an older/crash-window child, but historical Sol/High provenance is never inferred and its observed core request is not lowered. Other missing, conflicting, or timed-out lineage fails once without a retryable 5xx storm. A child reloaded directly, without an active managed parent activity, remains outside the managed policy. Other roots remain outside this policy. - Multi-Agent V2 has no separate core nesting-depth ceiling in this pinned release. The launch-selected cap limits active spawned threads at every depth and applies to every model/effort combination. The bridge also retains at most 4,096 launch-local lineage records; an exceptionally large managed tree fails closed at that safety bound instead of losing effort provenance.
- This profile forces Codex's built-in OpenAI/ChatGPT model provider so a thread can safely switch into or out of Sol/High later. Custom provider selection is therefore not preserved. All provider traffic traverses the owner-process loopback bridge; only the identified Sol/High managed tree is modified.
- The launcher affects only the ChatGPT process it starts on this Mac. Opening the same task in an independently running app on another host does not carry this process-local bridge or its launch-local descendant records.
- Resuming preserves existing conversation history, including older developer messages. Start a new task when a completely clean current Ultra context matters.
- User or project advanced V2 policy/prompt overrides, including
multi_agent_mode_hint_text, are rejected for custom alias tasks because they no longer match the verified profile. - This release accepts
wait_agent_enabledas a configuration override. The launcher pins it totrue, andwait_agentexposure is covered by the exact-release integration matrix. - The committed real app-server evidence applies only to the exact macOS ARM64
release and project commit named in
evidence/macos-26.818.41509-integration-summary.json. It does not attest the current worktree or Windows. Any artifact change requires a new exact-releasepassedresult before making the same evidence claim. - The untested-release override carries no integration-evidence claim. It may be useful when only packaging identities changed, but protocol changes can still make startup fail or cause incorrect behavior.
- Runtime hardening assumes processes already running as the same macOS user are trusted. Owner-private staging prevents bundle updates and ordinary pathname replacement from changing the selected executable unnoticed, but macOS Python exposes no descriptor-bound Mach-O execution primitive: a malicious same-user process could race the final identity check and pathname execution, or deliberately escape a tracked process group with a new session.
- Agent swarms consume additional tokens and account usage. Proactive mode may still decline to delegate when parallel work would not help.
See TECHNICAL_NOTES.md for implementation evidence, release provenance, and source links. For sensitive reports, follow SECURITY.md instead of opening a public issue.
Released under the MIT License. The optional Windows CPython runtime keeps its upstream license; see Third-party notices.