# OpenCode 2.2.7 discovery proof

Real Linux web app, Chrome 151, 1440 x 1000, light theme. Each revision ran from its own worktree with `T3CODE_DEV_SEED=0 vp run dev`, a newly created T3 database, no cached OpenCode inventory, and separate empty OpenCode XDG directories. No external OpenCode server or paid agent turn was used. The dev app created its default empty `server` project/thread. OpenCode 2.2.7 came from `npm install --prefix <scratch>/opencode @opencode/cli@2.2.7`.

Base: f313d0a6cb843551fb60e57a454a71e71a3a8c04
Head: 4a17135dee89eb0a9d59270c94a9ab1266603497

The attached executable wrapper is a portable copy: only absolute scratch paths and the per-revision state-directory selection have been replaced with parameters. Only `serve` is CPU-throttled. Version probes run normally. The active head cgroup reported `cpu.max = 10000 100000` and `CPUQuotaPerSecUSec = 100ms`.

## Browser command transcript (identical actions on each revision)

Commands used agent-browser 0.43.0 with the task's own isolated browser session. Pairing URLs were consumed privately before recording.

1. `open <dev-origin>/settings/providers`; `set viewport 1440 1000`.
2. Click Add provider, select the OpenCode radio, click Next, retain default label/instance ID, click Next.
3. Fill Binary path with the wrapper. Leave Server URL and password blank.
4. Apply the attached privacy CSS (environment name hidden; binary path visually masked). This changes no discovery logic or model content.
5. `record start <side>.webm --fps 5`, then click Add instance.
6. Inspect the initial unprobed provider card. Click Refresh provider status once to perform the first discovery. Do not refresh again.
7. Wait for the Refreshing providers button to disappear using:
   `wait --fn '!Array.from(document.querySelectorAll("button")).some(b=>b.textContent.includes("Refreshing providers"))' --timeout 180000`
8. Capture provider status, then scroll the provider-detail viewport to show Models:
   `eval 'document.querySelector("[data-provider-detail] .overflow-auto").scrollTop=500'`
9. Capture Models and stop the recording.
10. Close Settings, open the composer model picker. On base, hover the disabled OpenCode tab; on head, select the enabled OpenCode tab. Capture the picker.

Each published still was accepted only after two screenshots 500 ms apart had identical SHA256 hashes. For the head picker, focus was blurred and capture repeated until stable.

## Observed

Base: Needs attention; "OpenCode 2 is running, but it did not list any models yet."; 0 models; OpenCode tab disabled with that warning.

Head: "OpenCode 2.2.7 lists 20 models."; 20 models rendered in Settings; enabled OpenCode tab lists Beam Free, Big Pickle, DeepSeek V4.1 Flash Free and others. No second manual refresh.

The catalog is the real unconfigured OpenCode catalog, so its size differs from the PR comment's authenticated 121-model catalog. No provider HTTP response was mocked or delayed artificially.

Recordings are uninterrupted, in real time. They show initial discovery from empty inventory; stills separately show the final card, Models section and picker.
