Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-4314GitHub issuePublicReceived

Agent npx wrappers leak node@latest runtime into workspace commands

Reported by lucasstsx · filed Apr 26, 2026Closed upstream on 2026-04-27 by lucasstsx; the closing comment says it was fixed by PR #5341. GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
Not yet mapped to any requirement or component.
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

Agent npx wrappers leak node@latest runtime into workspace commandsrevision 1 · captured 2026-10-04 11:56 UTC via poll

System details

Omarchy version: 3.6.0
Shell: bash
mise: 2026.3.17 linux-x64 (2026-03-30)
Node versions installed with mise: 24.15.0 and 25.9.0
Affected wrapper: codex

What's wrong?

Omarchy's generated npx wrappers launch tools through node@latest.

For example, ~/.local/bin/codex currently contains:

#!/bin/bash
exec mise exec node@latest -- npx --yes @openai/codex "$@"

This appears to originate from ~/.local/share/omarchy/bin/omarchy-npx-install, which generates wrappers using:

exec mise exec node@latest -- npx --yes $package "$@"

I understand why this was added. It makes sense for npx wrappers to use an independent Node runtime so tools can still start correctly inside projects pinned to older Node versions.

The issue is more specific: for long-running agent CLIs like Codex, the Node runtime used to bootstrap the CLI can be inherited by the agent process and by commands it runs inside the project.

So there are two separate contexts:

  1. The Node runtime used to start Codex.
  2. The Node/runtime used by commands executed inside the project.

It is reasonable for (1) to be independent from the current project. But (2) should still respect the project environment.

Example

Given a project with:

# mise.toml
[tools]
node = "24.15.0"

Running directly with mise respects the pin:

mise exec -- node -v
# v24.15.0

But the Omarchy wrapper starts Codex through node@latest:

mise exec node@latest -- node -v
# v25.9.0

In my case, launching codex inside a project pinned to Node 24 caused commands inside Codex to use Node 25.9.0 instead of the project's Node 24.15.0.

I saw the same pattern in an older Node 20 project, where commands triggered engine warnings due to Node 25.9.0. Codex then started trying to work around the environment mismatch, for example by manually overriding PATH. In practice, this can confuse the agent and make it reason about the wrong problem.

Reproduction Steps

  1. Install two Node versions via mise, for example 24.15.0 and 25.9.0.
  1. Inside a project directory, create a mise.toml:
[tools]
node = "24.15.0"
  1. Confirm the project Node version:
mise exec -- node -v
# v24.15.0
  1. Compare with the wrapper's bootstrap runtime:
mise exec node@latest -- node -v
# v25.9.0
  1. Launch an affected agent wrapper, for example codex, from that project.
  1. Run project commands from inside the agent. They can inherit the wrapper's node@latest environment instead of the project's mise.toml environment.

Expected Behavior

Omarchy wrappers may use an independent mise-managed Node runtime to bootstrap npx-based CLIs.

However, commands executed by agent-style CLIs inside a project should inherit the project's normal command environment and respect the project's mise.toml.

Suggested direction

I do not think the fix is simply changing the wrapper to:

exec mise exec -- npx --yes $package "$@"

That would likely reintroduce the original problem: wrappers can break inside projects pinned to older Node versions.

The issue is that the bootstrap runtime leaks into the workspace command environment. Agent-style wrappers may need runtime isolation, or at least an override / escape hatch for tools like Codex.

Related: #5247 and #5341.

View raw text
### System details

Omarchy version: 3.6.0  
Shell: bash  
mise: 2026.3.17 linux-x64 (2026-03-30)  
Node versions installed with mise: 24.15.0 and 25.9.0  
Affected wrapper: `codex`

### What's wrong?

Omarchy's generated `npx` wrappers launch tools through `node@latest`.

For example, `~/.local/bin/codex` currently contains:

```bash
#!/bin/bash
exec mise exec node@latest -- npx --yes @openai/codex "$@"
```

This appears to originate from `~/.local/share/omarchy/bin/omarchy-npx-install`, which generates wrappers using:

```bash
exec mise exec node@latest -- npx --yes $package "$@"
```

I understand why this was added. It makes sense for npx wrappers to use an independent Node runtime so tools can still start correctly inside projects pinned to older Node versions.

The issue is more specific: for long-running agent CLIs like Codex, the Node runtime used to bootstrap the CLI can be inherited by the agent process and by commands it runs inside the project.

So there are two separate contexts:

1. The Node runtime used to start Codex.
2. The Node/runtime used by commands executed inside the project.

It is reasonable for (1) to be independent from the current project. But (2) should still respect the project environment.

### Example

Given a project with:

```toml
# mise.toml
[tools]
node = "24.15.0"
```

Running directly with mise respects the pin:

```bash
mise exec -- node -v
# v24.15.0
```

But the Omarchy wrapper starts Codex through `node@latest`:

```bash
mise exec node@latest -- node -v
# v25.9.0
```

In my case, launching `codex` inside a project pinned to Node 24 caused commands inside Codex to use Node 25.9.0 instead of the project's Node 24.15.0.

I saw the same pattern in an older Node 20 project, where commands triggered engine warnings due to Node 25.9.0. Codex then started trying to work around the environment mismatch, for example by manually overriding `PATH`. In practice, this can confuse the agent and make it reason about the wrong problem.

### Reproduction Steps

1. Install two Node versions via mise, for example `24.15.0` and `25.9.0`.

2. Inside a project directory, create a `mise.toml`:

```toml
[tools]
node = "24.15.0"
```

3. Confirm the project Node version:

```bash
mise exec -- node -v
# v24.15.0
```

4. Compare with the wrapper's bootstrap runtime:

```bash
mise exec node@latest -- node -v
# v25.9.0
```

5. Launch an affected agent wrapper, for example `codex`, from that project.

6. Run project commands from inside the agent. They can inherit the wrapper's `node@latest` environment instead of the project's `mise.toml` environment.

### Expected Behavior

Omarchy wrappers may use an independent mise-managed Node runtime to bootstrap npx-based CLIs.

However, commands executed by agent-style CLIs inside a project should inherit the project's normal command environment and respect the project's `mise.toml`.

### Suggested direction

I do not think the fix is simply changing the wrapper to:

```bash
exec mise exec -- npx --yes $package "$@"
```

That would likely reintroduce the original problem: wrappers can break inside projects pinned to older Node versions.

The issue is that the bootstrap runtime leaks into the workspace command environment. Agent-style wrappers may need runtime isolation, or at least an override / escape hatch for tools like Codex.

Related: #5247 and #5341.

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Not linked to any known issue, other report or change yet.

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

No decision has been recorded yet.