# Tagged source build proof

Linux x64; repository-required Node 26.12.1 (including VP_NODE_VERSION=26.12.1); browser 1440x1000, light theme; Electron 44.10.1 under headless-desktop. Fresh isolated T3 homes, T3CODE_DEV_SEED=0, synthetic project only, no provider turns.

Base: 9efd960925f0899c0a6d045d128557c5d82818e8. Head: 49b966501a95ecd3cb1b3b918cbd7f110aefdcc1.

1. Create separate checkouts at these commits and run `vp i` in each.
2. Put one temporary stable tag, `v0.1.28534`, on the side being built; move it between sides. Both server and web manifests remain at 0.1.9. APP_VERSION is unset for the default builds. The transcripts record tag, SHA, manifest diff, Node version, web build, executable build and executable output.
3. Run `python3 prove-tagged-build.py before cli <base-checkout> <before-output>` and its `after` equivalent. Run the `desktop` phase on each side with that same tag in place. It invokes the real Linux directory artifact packager, without a version argument or skip-build.
4. Copy the built client with `cp -r apps/web/dist/. apps/server/dist-exe/client/`. Run `T3CODE_DEV_SEED=0 apps/server/dist-exe/t3 --no-browser --host 127.0.0.1 --port 18434 --base-dir .t3/production-proof --auto-bootstrap-project-from-cwd`. Add/rename the synthetic project to Tagged source proof through the CLI. Pair a browser, then visit Settings > About and Sharing & access. `capture-app.py` automates pairing, navigation and captures; `CAPTURE_RESUME=1` resumes an already paired browser after initial dev compilation.
5. Run each generated `linux-unpacked/t3code` with its own T3CODE_HOME and user-data-dir under `headless-desktop`, passing `--no-sandbox --disable-gpu --remote-debugging-port=19434`. Decline project/history import, start, and visit About. `capture-desktop.py` records that flow. `inspect-desktop.mjs` reads package metadata from the actual generated app.asar. The packager's own runtime validation output is also in the build transcript.
6. Run the `built-dev` phase on each tagged side. Both successfully shared, executed `vp build --watch`, and completed the build; neither fell back to Vite. Pair and capture About and Sharing & access using `capture-app.py`. The source server and client both show 0.1.9, with no mismatch banner. The initial HTTP backend URL redirects to the actual shared HTTPS origin, which is what the built-dev browser used.
7. Run the `dev` phase on each tagged side and capture the same pages at its printed localhost Vite origin. Both client/server versions are 0.1.9. Vite bound IPv6 loopback, so use localhost, not 127.0.0.1, for this check.
8. On head with tag still v0.1.28534 and unchanged manifests, run `explicit-cli`: it sets APP_VERSION=0.1.28536, rebuilds web and executable, then executes --version. Copy/serve that matching client with a fresh .t3/explicit-proof home and capture the same settings pages. Both show 0.1.28536, demonstrating the override remains authoritative.

`capture-stable.py` accepts a still only when two PNGs captured at least 500ms apart are byte-identical. Every published PNG was opened and visually inspected. Only environment names, tailnet URLs and the desktop command's local path are redacted; versions are untouched. Build transcripts have private paths, hostnames and pairing tokens redacted. Capture values are observations, not test results. Static version rendering needs stills, so no interaction video is offered as evidence.

Observed default result: base CLI/web/server/desktop 0.1.9; head CLI/web/server/desktop 0.1.28534. Built-dev and ordinary dev remain 0.1.9 on both sides. Head explicit APP_VERSION overrides the tag with 0.1.28536.
