# Server-only evidence for issue 22336

Captured 2026-10-22 on Linux x86_64. Matrix was empty, confirmed in proof pass 1 (lead-provided context). No browser visuals apply to this server-only fix.

- before: [8acbefefc5](https://git.cafe/pingdotgg/t3code/commit/8acbefefc51b4d281dcd04108c82baa1ab902b0e)
- after runtime: [46b9ec3c0b](https://git.cafe/pingdotgg/t3code/commit/46b9ec3c0be3e7beff0b99763119f99362540b1c)
- current merge: [d4a08f9c8a](https://git.cafe/pingdotgg/t3code/commit/d4a08f9c8a59e0591253102f6cde12bb8d079450)

The after runtime was already run by the lead. This capture reads those existing artifacts; it does not claim a new runtime run. The fix in `apps/server/src/os-jank.ts` is unchanged between the after runtime commit and current merge (verified with `git diff 46b9ec3c0b HEAD -- apps/server/src/os-jank.ts`, empty output). Current tests were run at the current merge, swapping only the implementation for the red run.

## Literal test capture commands

Executed from `/home/ubuntu/wt/issue-22336`; the backup is outside the repository. EXIT restores on normal exit and on the INT/TERM handlers.

```bash
set -u
backup=$(mktemp /tmp/22336-os-jank-current.XXXXXX.ts)
cp -p apps/server/src/os-jank.ts "$backup"
restore() { cp -p "$backup" apps/server/src/os-jank.ts; }
trap restore EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
git show 8acbefefc5:apps/server/src/os-jank.ts > apps/server/src/os-jank.ts
./node_modules/.bin/vp test run apps/server/src/os-jank.test.ts > /tmp/22336-red-current.log 2>&1
red_status=$?
restore
cmp -s "$backup" apps/server/src/os-jank.ts || exit 2
./node_modules/.bin/vp test run apps/server/src/os-jank.test.ts > /tmp/22336-final-green.log 2>&1
green_status=$?
```

Red exit status: 1. Green exit status: 0. Both logs contain real test-runner output. The timeout warnings are generated by mocked shell probes, not fresh real-shell timing measurements.

Red excerpts:

```text
FAIL src/os-jank.test.ts > waits longer for a login shell that times out at startup
AssertionError: expected '/usr/bin' to equal '/opt/tools/bin:/usr/bin'
FAIL src/os-jank.test.ts > waits longer for only one hung login shell
AssertionError: expected +0 to equal 1
Test Files  1 failed (1)
Tests  2 failed | 6 passed (8)
```

Green excerpts:

```text
Test Files  1 passed (1)
Tests  8 passed (8)
```

## Existing real-server runtime transcript

Before source: `/tmp/22336-runtime/before-transcript.txt`. Its older test-commit result is omitted here because the current regression tests above supersede it. Before setup and runtime excerpts follow; fixture paths are placeholders.

```text
Issue 22336 runtime reproduction
Base: before commit linked above (origin/main when fetched 2026-10-22)
Environment: Linux x86_64 VM, Node 24.21.0, real server CLI (dev server entry point).
Isolated worktree T3 data, no existing service restarted. No browser/UI behavior changed.

Repro setup:
- Private mount namespace binds a temporary /etc/profile. No host profile changed.
- Profile: if slow-login sentinel exists, sleep 8; export PATH=<fixture-cli-dir>:$PATH.
- SHELL=/bin/bash; inherited PATH excludes fixture-cli-dir. Shell candidates dedupe to bash.
- Enabled OpenCode, binaryPath=triage-opencode-22336, a fixture-dir symlink to real OpenCode.
- Start: node apps/server/src/bin.ts --port 16428 --base-dir <issue-worktree>/.t3 --dev-url http://localhost:8388 --no-browser
- Also initially reproduced via node scripts/dev-runner.ts dev:server (same startup path).

BEFORE, slow shell startup:
[server] Failed to read PATH from login shell /bin/bash. spawnSync /bin/bash ETIMEDOUT
server.getConfig: installed=false, status=error, models=0
server.refreshProviders fresh=true: installed=false, status=error, models=0
message: OpenCode CLI (`opencode`) is not installed or not on PATH.

BEFORE, remove delay without restarting server:
Fresh login shell: command -v triage-opencode-22336 -> <fixture-cli-dir>/triage-opencode-22336
server.getConfig: installed=false, status=error, models=0
server.refreshProviders fresh=true: installed=false, status=error, models=0
message: OpenCode CLI (`opencode`) is not installed or not on PATH.

CONTROL, restart with fast shell:
server.getConfig and server.refreshProviders: installed=true.
Executable discovered; subsequent real OpenCode version health probe timed out under host load.
This control proves PATH discovery only, not provider turn execution.
```

Runtime entry-point command as recorded in the before transcript (the base-dir is sanitized):

```bash
node apps/server/src/bin.ts --port 16428 --base-dir <issue-worktree>/.t3 --dev-url http://localhost:8388 --no-browser
```

The existing probe invokes `server.getConfig` with `{}` and `server.refreshProviders` with `{"fresh":true,"refreshModels":false}`. Authentication material, session data, the raw probe source, full provider/model configuration, and raw server logs are excluded.

After excerpts extracted from the lead-owned runtime JSON artifacts:

```text
after-refresh.json: OpenCode installed=true, enabled=true, status=ready, version=1.18.18, models=11
message: 1 upstream provider connected through OpenCode.
after-confirm-initial.json: OpenCode installed=true, enabled=true, status=ready, version=1.18.18, models=11
message: 1 upstream provider connected through OpenCode.
after-confirm-refresh.json: OpenCode installed=true, enabled=true, status=ready, version=1.18.18, models=11
message: 1 upstream provider connected through OpenCode.
```

## Scope and limitations

This proves Linux real-server OpenCode discovery under the isolated slow-login profile fixture, plus focused mocked regression coverage of the startup retry. It does not prove provider turns, an actual NixOS deployment, systemd installation, desktop launch behavior, or macOS runtime behavior. Before had a stale failed provider discovery even after shell recovery; after reports installed and ready with 11 models. The initial fast-shell control had an unrelated version-probe timeout under host load.

No live installation data was written. No server was started, stopped, or killed during this evidence capture; the lead retains ownership of the existing server. No browser/computer use, commits, or pushes. Final `git status --porcelain` was empty.

FRICTION: none during this capture. The old before transcript described a different historical test revision (1 failed / 6 passed); it is retained only as runtime provenance and replaced here by the genuine current-test red result (2 failed / 6 passed). Raw `after.log` contains a synthetic dev credential and is intentionally excluded.
