PR 23247 (GitCafe) / 23250 (GitHub) evidence-only runtime capture
Source /home/ubuntu/wt/pr-23250 HEAD 0df1ba9eaefa23c18c535514cbf0ece4a67aae75
Model/harness: codex gpt-6.1-sol. Linux x86_64, real systemd user service.
No source changes, package.json edits (even temporary), commits, pushes, forge comments/edits, claim, or PR monitoring. Focused tests owned by lead and not repeated here.

Reproduction on this VM, after account teardown:
1. Keep the exact source worktree with installed dependencies. No live ~/.t3 is used.
2. Node 26.8.2 is under capture/node-v26.8.2-linux-x64, downloaded from nodejs.org. node-verification.txt records upstream checksum verification.
3. Run bash capture/build.sh (log build.log); this rebuilds the exact head with the production build-exe command. It changes only ignored build output. No web/client bundle was needed for server descriptor/RPC proof.
4. Run node-v26.8.2-linux-x64/bin/node capture/fixtures.mjs. The script copies installed runtime external dependency closures and builds real Node SEAs. It changes exactly one generated bundle declaration: var version$1 = "0.1.1", -> the fixture's version. No other app logic transformation. All fixture bundle differences are asserted by provenance.py. Five versions: A=.1.1, B=.1.2, C=.1.3, D=.1.4, E=.1.5.
   Each archive has a single wrapper directory because the production extractor uses strip-components=1. The final fixtures.mjs emits this correct layout. repack.sh corrected the original attempt's layout; friction-archive-layout.log preserves that failure. fixtures.log includes original archive hashes BEFORE repack; only provenance.json and releases/*/SHA256SUMS identify the final served archives.
5. bash capture/setup.sh creates account evidence23250 and enables its systemd user manager. Requires sudo -n and unused ports 17490/17491. Account uid/gid was 1001; production.mjs explicitly drops to 1001. If occupied on another VM, change only the scratch helper's uid/gid and account path, never production source.
6. python3 capture/runtime.py one: fresh install A, authenticated real RPC updates B then C, stop, age all completed versions two hours, production prune keep=[C] with references omitted, verify control deleted/A B C retained, CLI A service restart, HTTP200 C and server.probe success.
7. python3 capture/runtime.py two: reinstall A; production BootService.install({start:false}) B succeeds while A launcher PID stays the same; unit file points B, current launcher still A; remote C then D; stop/age/prune keep=[D], references omitted; B is neither active nor update.from/target; verify A/control removed and B C D retained; daemon-reload/start unit B; HTTP200 D and probe.
8. python3 capture/runtime.py three: independent A -> B -> C; request E, externally rename E's executable after accepted RPC and before delayed handoff, observe production failure/rollback, restore executable bytes unchanged; stop/age/prune only C/no references; retain launcher/from/failed target; restart and verify terminal outcome and C descriptor/probe. This is an availability fault, not an application logic mock.
9. python3 capture/provenance.py records head, clean status, exact version transformation assertion, SHA256 hashes of all bundles/SEAs/archives. Run bash capture/teardown.sh after capture. It stops/disables/removes only our unit/user manager, deletes the isolated account/home/runtime, and verifies no listeners on owned ports. Release transport runs inside runtime.py and shuts down in finally; no separate lingering process.

Credential handling:
CLI auth session issue runs against the isolated home; output is deliberately withheld from logs and kept in /home/evidence23250/rpc-token, mode 0600. rpc.cjs reads it privately. No DB, auth token, service.env, raw QR/pairing output, or environment secrets are included in the uploaded proof bundle. Teardown deletes the credential/account. Real runtime RPC request/response JSON is logged.

Transport/runtime caveats:
Only release HTTP transport is mocked (loopback server). Production archive checksum verification, install, launch, authenticated update RPC, preflight, state persistence, pruning, restart, descriptor, and probe execute for real. Fixture runtime externals come from installed dependency closures rather than the full release packaging helper. No browser, UI/client asset, macOS launchd, Windows, relay/tunnel, or legacy-launcher migration proof is claimed. Bounded readiness checks inspect only this owned runtime; no forge polling/watch was used.

Known unresolved limitation:
The production launcher's state update is still read/merge/write. A concurrent successful start:false install repoint to B can be overwritten by a stale A read. The sequential successful repoint row does NOT prove concurrency safety. No fix authorized, implemented, or claimed. This capture cannot justify a broad race-free or universally solved claim.

Historical before proof was not repeated. Existing after transcript is /tmp/pr23250-evidence/existing-after.txt; prior binaries predated the requested integration head. This capture rebuilds that exact head.

Row3 continuation caveat:
The first run hit the unmodified unit's StartLimitBurst=5 / StartLimitIntervalSec=300 on its final restart after the prior rapid rows. It had already persisted candidate-start-failed, served C successfully, and pruned the control/B while retaining A/C/E. The manager refused the next start before executing the app (Result=start-limit-hit). runtime.py three-restart records manager Result, resets only this unit's failure/start counter, starts through A, and checks persisted outcome, HTTP200 C, and probe. The final script resets the counter before an independent row3; the actual two-part capture is preserved in row3-console.log and row3-restart-console.log.
