# Proof audit pass 1

Scope: branch `fix/issue-8578`, [e85b25d13d](https://git.cafe/pingdotgg/t3code/commit/e85b25d13d3203be20bb51e6d42590277548f3f3) against [3b95e7831b](https://git.cafe/pingdotgg/t3code/commit/3b95e7831b11). Read AGENTS.md, the full two-file diff, the helper, relevant existing tests, launch call sites, and the two supplied before transcripts. Worktree was clean at inspection. No code edits, tests, browsers, servers, captures, pushes, forge comments, or delegation performed. This report is the sole new artifact, outside the worktree.

## UI fixture matrix

`[]` — EMPTY. Changed render paths: zero.

Only `apps/server/src/provider/Drivers/CodexHomeLayout.ts` and its test file change. No client components, styles, navigation, contracts, transports, or render branches change. Web (hosted and local), desktop, mobile, Settings, chat, palette, and keybindings need no visual fixtures. Other providers are unaffected. Local/remote/tunnel clients all use the same server-side Codex preparation. No new UI surface or visual treatment is introduced. Existing generic error UI may display a setup failure for newly rejected layouts; that is the intentional backend outcome, not a changed render path requiring captures.

## Proof standard and findings

The checked-out AGENTS.md explicitly says: “A server-only fix with no visible surface ships the test plus a short runtime transcript.” Screenshots or browser runs are unnecessary.

The name filter is case-insensitive `^auth(?:$|[._-])`. New shared auth-like entries are excluded; unrelated `author.json` remains shared. Shadow directory enumeration checks auth-like entries with readLink, so both live and dangling links fail. Regular local files pass without being replaced. Direct mode still returns immediately. Existing session/config/skills/cache sharing remains in the same path.

The existing private-symlink error is propagated before adapter construction/runtime resolution completes in CodexDriver, CodexAdapterV2, and CodexManagedRuntime. Runtime proof should corroborate this ordering with a fixture launcher marker. Failure need not be filesystem-transactional: normal directory/link preparation can precede the private-link check. The requirement is rejection before Codex launch, not zero filesystem mutations.

No correctness bug found in this proof audit. Both earlier independent reviews reportedly found none; their underlying reports were not independently inspected here. Credential scope verdict remains NEEDS_JULIUS as supplied. It is a maintainer decision, not a stop to this proof workflow. Upgrade fail-closed behavior is an explicit issue requirement: do not demand automatic unlinking, copying, or self-healing of existing auth-like symlinks.

## Existing evidence inspected

`/tmp/issue8578-server-before.txt` identifies the base revision, Linux x64, `vp run dev:server`, isolated settings, and fixture-only homes. It records shared links for `auth-fixture-a.json`, `auth_fixture_b.json`, `auth.json.bak`, and `AUTH.Backup`; `author.json` is also shared and `auth.json` stays a regular file. This establishes the bug through the real dev server.

`/tmp/issue8578-runtime-before.txt` corroborates those links in a direct fixture runtime and records acceptance of a dangling `auth-orphan.json` symlink. Both supplied transcripts contain fixture paths and file metadata only, with no credential contents.

The supplied task states two red tests on main and ten green after the fix. This audit did not run tests or inspect raw red/green output. Retain the actual command, revision, failing test names/assertions, exit status, and final count with the evidence. The two added tests cover new-link exclusion/shared-copy preservation and dangling-link rejection. Existing tests cover ordinary shared state and local auth. Do not represent these tests alone as runtime proof of every scenario below.

`/tmp/issue8578-check-changed.log` ends at knip without a final completion result in the inspected tail. It does not establish an overall passing check:changed run.

## Minimum after-runtime transcript for the lead/capturer

Use isolated fixture homes/settings and synthetic content only, at the audited head. Reuse the real dev-server path from the before proof, with a harmless fixture executable recording launch attempts. Print revision, command, success/error, lstat/readlink results, fixture-content equality checks, and launch-marker count. Avoid credentials, auth tokens, pairing links, provider environments, or real user data. A short direct-helper transcript can supplement the server run but must be labelled as such.

1. Clean overlay: shared home contains the four auth-like fixtures from the before transcript. Shadow home has its own regular auth.json. Show successful preparation, all four entries absent in shadow using lstat (not exists, which follows dangling links), and shared fixtures unchanged. Show the safe fixture runtime can launch on this successful path.
2. Existing regular private files: put distinct synthetic regular auth-like files in both homes, including auth.json and at least one alternate/backup name. Show the shadow entries remain regular files with unchanged distinct content, and shared copies are unchanged. Repeat setup once to establish preservation on reuse.
3. Ordinary sharing: in a successful fixture overlay show author.json, sessions, config.toml, skills, and cache still resolve to their shared-home targets. Include a sentinel read/write through a shared directory if needed to make sharing observable. Distinguish shared cache/ from private models_cache.json; the latter must retain its existing behavior.
4. Existing live auth-like symlink: in a separate fixture point an alternate auth-like shadow entry at a real synthetic shared file. Show the private-entry error with the entry name, unchanged link/target, and zero runtime launches. Use a fresh marker so prior successful launches cannot mask this result.
5. Existing dangling auth-like symlink: point auth-orphan.json at an absent shared target. Show lstat/readlink proves the link exists, preparation returns the private-entry error, the dangling link remains, and zero runtime launches. This must not be skipped because the target is absent.

The first three scenarios may share one successful run with clearly labelled phases. The live and dangling rejection cases must be separate so one failure cannot hide the other. These are runtime scenarios, not UI fixture matrix entries. Optional direct-mode sanity evidence is useful but not needed to expand the minimum matrix.

## Friction

FRICTION evidence|Only before runtime transcripts were supplied; after-runtime and raw red/green test output were not independently verified|Lead attaches the short fixture-only after transcript and existing two-red/ten-green output, without rerunning unrelated checks.

FRICTION tooling|Initial recursive temporary-file search included unrelated cache filenames; no repository state changed|Restrict evidence discovery to named files or the top level of /tmp.

FRICTION credential-scope|NEEDS_JULIUS remains the supplied scope verdict|Record the maintainer decision separately; continue proof collection and preserve the requested fail-closed behavior.

Matrix verdict: EMPTY CONFIRMED. Proof selection is correct; runtime after evidence remains for the lead/capturer to supply.
