Repository navigation
fix(web): SSH environments on an older reused remote server explain the version mismatch instead of reconnecting forever - #23647
Conversation
…other build Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion mismatch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Needs Human Approval Macroscope's review found this PR requires human approval — This is a narrowly scoped SSH version-mismatch bug fix with tests, changing only the handling of a specific bearer-pairing failure while leaving other retries unchanged. Because it changes authentication/pairing failure behavior on a production connection path, it warrants human review. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
## What's Changed * fix(web): clear stale resource monitor errors after retry by @juliusmarminge in pingdotgg/t3code#24229 * fix(mobile): align draft workspace controls with the composer by @PixPMusic in pingdotgg/t3code#24239 * feat(mobile): thread header minimizes on the Duo while reading back through history by @juliusmarminge in pingdotgg/t3code#24235 * fix(web): center pull request timeline actions by @PixPMusic in pingdotgg/t3code#24259 * fix(server): find the resource monitor when the server runs from its build output by @yordis in pingdotgg/t3code#23965 * fix(pull-requests): list filters narrow on every host that can by @juliusmarminge in pingdotgg/t3code#23922 * fix(pull-requests): a filtered list fills its page instead of waiting for a scroll by @juliusmarminge in pingdotgg/t3code#23923 * feat(pull-requests): label and author filters search the host by @juliusmarminge in pingdotgg/t3code#23924 * fix(mobile): chat and composer chips stay readable in light mode by @flamboh in pingdotgg/t3code#22585 * fix(web): review thread avatars no longer clip in collapsed activity rows by @flamboh in pingdotgg/t3code#23545 * ci: close "needs more info" issues after 7 days without a reply by @juliusmarminge in pingdotgg/t3code#22628 * fix(server): Codex accounts show ChatGPT's current plan names by @flamboh in pingdotgg/t3code#24200 * fix(observability): desktop dev version and web environment match the other services by @yordis in pingdotgg/t3code#23975 * fix(observability): custom resource attributes use the t3code prefix by @yordis in pingdotgg/t3code#23974 * fix(mobile): Home and pull request lists let UIKit own their top inset by @juliusmarminge in pingdotgg/t3code#24284 * fix(mobile): keep the Duo's Home and pull request headers fixed by @juliusmarminge in pingdotgg/t3code#24295 * fix(server): interrupts started by an agent no longer say "by user" in the timeline by @juliusmarminge in pingdotgg/t3code#24299 * ci(relay): deploy labeled PRs to relay preview stages by @juliusmarminge in pingdotgg/t3code#23872 * fix(mobile): HTML links in pull request comments open when tapped by @flamboh in pingdotgg/t3code#22110 * perf(client): avoid full ordering scans for streamed replacements by @juliusmarminge in pingdotgg/t3code#24264 * fix(server): a fork's first /compact compacts its inherited history by @juliusmarminge in pingdotgg/t3code#24172 * fix(server): agent recordings honor the browser frame rate setting by @juliusmarminge in pingdotgg/t3code#23895 * fix(client-runtime): Stop clears commands already finished on the server by @juliusmarminge in pingdotgg/t3code#23814 * fix(web): SSH environments on an older reused remote server explain the version mismatch instead of reconnecting forever by @juliusmarminge in pingdotgg/t3code#23647 * fix(web): keep usage-limit wake action visible by @juliusmarminge in pingdotgg/t3code#23803 * fix(server): reject pairing with an incompatible server protocol by @juliusmarminge in pingdotgg/t3code#23789 **Full Changelog**: pingdotgg/t3code@v0.1.3-nightly.20261023.3592...v0.1.3-nightly.20261024.3604 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.3-nightly.20261024.3604
* test: delete low-value tests and dead test-only exports (pingdotgg#24058) * test(server): restore DST scheduling tests deleted in the test snap (pingdotgg#23991) * test(web): restore project settings permission tests deleted in the test snap (pingdotgg#24011) * test(mobile): restore clipboard secret-redaction test deleted in the test snap (pingdotgg#23980) * fix(web): Cmd+B toggles the sidebar unless text is selected (pingdotgg#24063) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): agent-browser and Chrome no longer outlive the agent that started them (pingdotgg#21299) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * test(client-runtime): restore render scheduler tests deleted in the test snap (pingdotgg#23977) * fix(web): cmd+k search hides subagents and favors recent, whole-word matches (pingdotgg#24032) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * test(lint): new polling loops in tests now fail lint (pingdotgg#23983) * ci: unused dependency patches fail in check:changed, not after push (pingdotgg#23988) * fix(desktop): PDFs in the preview can be annotated (pingdotgg#24022) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): instructed compact runs without a bare compaction first (pingdotgg#24008) Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> * fix(desktop): reduce app crashes when a preview tab's renderer dies during agent screenshots (pingdotgg#24056) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Stop stops a thread's subagents again (pingdotgg#23886) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(desktop): a stuck quit no longer leaves the app unkillable (pingdotgg#23873) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep blockquote text readable in every theme (pingdotgg#24036) * fix(bitbucket): stop the startup sweep from flooding Bitbucket with 429s (pingdotgg#23889) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): screen readers hear when the open thread starts, needs you or finishes (pingdotgg#23752) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): reduce allocations in streaming timeline scans (pingdotgg#23739) * perf(web): reuse a collator when sorting changed-file trees (pingdotgg#23776) * perf(scripts): check:changed finishes in about 10 s (pingdotgg#23581) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): size Usage header controls to the available width (pingdotgg#24123) * perf(server): speed up large terminal clipboard sequences (pingdotgg#23819) Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(server): make stale CLI service recovery actionable (pingdotgg#23541) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): pasted images show their upload tile instantly (pingdotgg#23832) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(server): clean up deleted threads worktrees with subagents (pingdotgg#23900) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): pause periodic PR discovery without foreground clients (pingdotgg#23852) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): meter checkpoint git subprocess attempts (pingdotgg#24218) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(web): clear stale resource monitor errors after retry (pingdotgg#24229) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(mobile): align draft workspace controls with the composer (pingdotgg#24239) * feat(mobile): thread header minimizes on the Duo while reading back through history (pingdotgg#24235) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): center pull request timeline actions (pingdotgg#24259) * fix(server): find the resource monitor when the server runs from its build output (pingdotgg#23965) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Victor Vogel <satsdev@only21mil.xyz> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Joseph Vidal <135430578+josephv123@users.noreply.github.com> Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com> Co-authored-by: Akshar Patel <123344143+AksharP5@users.noreply.github.com> Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com> * fix(pull-requests): list filters narrow on every host that can (pingdotgg#23922) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(pull-requests): a filtered list fills its page instead of waiting for a scroll (pingdotgg#23923) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(pull-requests): label and author filters search the host (pingdotgg#23924) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): chat and composer chips stay readable in light mode (pingdotgg#22585) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): review thread avatars no longer clip in collapsed activity rows (pingdotgg#23545) * ci: close "needs more info" issues after 7 days without a reply (pingdotgg#22628) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> * fix(server): Codex accounts show ChatGPT's current plan names (pingdotgg#24200) * fix(observability): desktop dev version and web environment match the other services (pingdotgg#23975) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(observability): custom resource attributes use the t3code prefix (pingdotgg#23974) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(mobile): Home and pull request lists let UIKit own their top inset (pingdotgg#24284) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): keep the Duo's Home and pull request headers fixed (pingdotgg#24295) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): interrupts started by an agent no longer say "by user" in the timeline (pingdotgg#24299) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(relay): deploy on-demand preview stages for labeled PRs Labeled same-repo PRs deploy stage pr-<n> behind the relay-preview environment reviewer gate. Unlabel or close tears the stage down, and a nightly job retries failed teardowns. Runtime-created managed endpoint tunnels and CNAMEs are swept by a PreviewTunnelSweep resource. Known gaps, tracked as follow-ups: an interrupted preview deploy can leave runtime tunnels behind; repo-level relay secrets still bypass the environment gate until moved. 🤖 Generated with [Claude Code](https://claude.com/claude-code) * fix(mobile): HTML links in pull request comments open when tapped (pingdotgg#22110) * perf(client): avoid full ordering scans for streamed replacements (pingdotgg#24264) * fix(server): a fork's first /compact compacts its inherited history (pingdotgg#24172) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): agent recordings honor the browser frame rate setting (pingdotgg#23895) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): Stop clears commands already finished on the server (pingdotgg#23814) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): SSH environments on an older reused remote server explain the version mismatch instead of reconnecting forever (pingdotgg#23647) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep usage-limit wake action visible (pingdotgg#23803) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): reject pairing with an incompatible server protocol (pingdotgg#23789) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): Live Activity stops shouting the running-agent count (pingdotgg#24329) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(usage): include Muse Code session history (pingdotgg#22443) Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(mobile): add Usage and Settings to workspace navigation (pingdotgg#23841) * fix(mobile): keep iPad workspace columns aligned while resizing (pingdotgg#24182) * fix(mobile): no-project threads show a chat bubble instead of a monogram (pingdotgg#21546) * fix(mobile): stabilize Duo search and portrait navigation (pingdotgg#24206) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): the unfolded Duo keeps its header in portrait (pingdotgg#24339) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): avoid duplicate handoff previews during startup (pingdotgg#24349) * fix(mobile): Usage and Settings use the glass header and the Duo rail (pingdotgg#24348) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): coalesce superseded streaming text updates (pingdotgg#24267) * fix(server): stop flooding analytics with successful MCP tool calls (pingdotgg#24287) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(search): Cmd+K finds the right thread first, with indexed message search (pingdotgg#24343) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Joseph Vidal <135430578+josephv123@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com> Co-authored-by: Akshar Patel <123344143+AksharP5@users.noreply.github.com> Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com> Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Alex <me@pixp.cc> Co-authored-by: Victor Vogel <satsdev@only21mil.xyz> Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com> Co-authored-by: Wiktor Golicz <56449542+Wiktor102@users.noreply.github.com>
…he version mismatch instead of reconnecting forever (pingdotgg#23647) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 79e392c)
Problem
After a desktop update, an SSH environment can stay on " is reconnecting" forever. When the remote host already has a T3 server running that the desktop did not start, the launcher adopts it whatever its version. The desktop's newly installed runner then mints the pairing token into the shared database. An older server cannot decode the newer scopes in that grant, so
POST /oauth/tokenreturns 500access_token_issuance_failedon every attempt. The client treated that as a transient failure and kept retrying without saying why.Repro with the real Linux release builds: start
t3 v0.0.46-nightly.20261004.2652 serve --base-dir <home>. Mint a token against the same home with the20261007.2787CLI (auth pairing create --json, 13 scopes). Exchanging it returns HTTP 500. A token minted by the running Oct 4 build exchanges fine.Change
In
provisionDesktopSshEnvironment, a bearer-bootstrap failure becomes a blocked connection with an explanation when both of these hold:[ssh_http:500];serverVersiondiffers from this client's version.Blocked means no backoff loop. The message names both versions and says to restart the remote T3 server on the desktop's version, then retry. A blocked connection retries on the next wake signal, so it reconnects once the server has been restarted, without re-enabling the environment. Every other bootstrap failure behaves as before: matching versions, failures with no status or a non-500 status, and cancellation. A one-line comment on the desktop error notes that the renderer matches that prefix.
Scope and approval
Fixes #16984
GitCafe: https://git.cafe/pingdotgg/t3code/issues/16984
Triaged bug via the automated issue flow.
Verification
vp test run apps/web/src/connection/platform.test.ts: 16 passed.blocks with both versions when a server on another build rejects pairingfails onmain. It getsConnectionTransientErrorwithCould not prepare the SSH environment: [ssh_http:500] …instead ofConnectionBlockedError.keeps retrying pairing failures that are not a version mismatchcovers a matching version with a 500, and differing versions with no HTTP status.vp run check:changed: format, lint, knip, typecheck (2 packages) and tests all pass.Not checked: there is no before/after capture of the desktop connection banner over a real SSH session. Reproducing it end to end needs an SSH account whose
~/.t3is not this machine's live T3 install, and none was available here. The changed decision is covered by the tests above, and the 500 by the transcript.🤖 Generated with Claude Code (Claude Opus 5.5 in T3 Code; reviews by Claude Opus 5.5 and Claude Sonnet 5.5)
Takeover
No code changes; evidence and verification added below.
Evidence
Rendering: Linux Electron desktop (
vp run dev:desktop, Electron 44.9.3) on Xvfb 1440×900×24, captured with ImageMagickimport/ffmpeg x11grab. Before = merge-basef054d1b801, after = head31019fac0f. Both sides run the same seededstatev2.sqlite(sha2569657a7f8…). The remote is a real SSH host (a private sshd on 127.0.0.1:2222 with its own HOME) running the releasedt3 0.0.46-nightly.20261004.2652from npm as an already-running server. The desktop's own runner mints the pairing token, as in the issue. Driver scripts: driver.tgz (sha256356d5c4b…9618). Fixture matrix: matrix.md.R1a: Add environment dialog
R1b: composer banner on a thread in the SSH environment's project. Before: "fs-29 is reconnecting", retrying forever. After: "fs-29 is offline" with Reconnect.
Recordings and steps (before):
What else changed between the before and after captures: nothing outside the error text and the banner's reconnecting→offline state. A provider-update toast appears on both sides and was dismissed before each still.
Round 5 completion — supersedes the round-1 missing cells and “Unverified” list below. Head 31019fac0f; merge-base re-derived as f054d1b801. One installed worktree, fresh synthetic state, Linux Electron/Xvfb. Real old released server for R1a/R1b/R5; deterministic HTTP fixture behind real SSH for controls. No new tests or reviews.
| Control | Before (merge-base) | After (head) |
|---|---|---|
| R2: same version + pairing 500; both retry through attempt 5 | R2-before.mp4 R2-before.steps.txt
| R3a: old version + pairing 502; both retry through attempt 5 | R3a-before.mp4 R3a-before.steps.txt
| R3b: old version + pairing socket close/no status; both retry through attempt 5 | R3b-before.mp4 R3b-before.steps.txt
Independent head R1a recapture:
Claim corrections: published round-1 variants are 1440/light and 390/dark (not all four combinations); narrow stills are cropped. The version explanation is in Settings Details, not the row headline or composer banner. “Host version” remains stale at 0.1.1 while the error names the old build. New control/Settings diffs include timing, scroll and fixture differences; the original “nothing else changed” statement is not a claim of zero pixel differences.
Diffs below: zero threshold amplifies every nonzero RGB-channel delta to magenta; stated threshold is max RGB-channel delta >16/255. No alignment, crops or masks. Includes every published still pair and the independent after/after rebuild.
| Pair | Threshold 0, amplified | Threshold >16/255 |
|---|---|---|
| R1a 1440/light |
| R1a 390/dark |
| R1b banner 1440/light |
| R1b banner 390/dark |
| R1b Settings Details |
| R2 |
| R3a |
| R3b |
| R1a original after ↔ rebuilt after |
Proof audit pass 2: audit-pass-2.md — VERDICT: SUFFICIENT. Six captured rows / eight matrix rows; R4 and R6 are explicit exclusions from capture scope. All requested missing rows are resolved. The author’s historical “Not checked” paragraph is superseded; prior test/review results were not rerun.
Verification log
Reviews (one round, head
31019fac0f): Claude Sonnet 5.5 → MERGE; Claude Opus 5.5 → MERGE. Neither found a bug or any change to what pairing or auth accepts. Both confirmed that blocked waits for a wake signal or an explicit retry, then re-pairs.Real-runtime check at head: the Add flow against the 20261004 build returns
[ssh_http:500]frombootstrap-ssh-bearer-session, and the dialog shows the version message. The merge-base shows the raw[ssh_http:500]error.In the after R1b run, the explanation appears only after the attempt that reaches the 500. Earlier attempts hit unrelated, status-less ensure failures (remote swap race; SSH timeouts under host load), and those correctly kept retrying (steps).
Unverified: a clean after recording for R1b and R5; an after Settings-row still showing the blocked explanation; R2 (same version + 500); R3a (502); diff images; proof audit pass 2. Reason: the run went over its time budget while the shared VM was saturated by an unrelated Android build.
Model: Claude Opus 5.5 in T3 Code (lead, audit); reviews by Claude Opus 5.5 and Claude Sonnet 5.5.
Round 5 drivers: drivers-r5.tgz (archive sha256
2a16268b4c3402efc1009e3eb7c5c62400f7121ecbb6c291750e151c0fd2a575); metadata-only HTTP transcript, full decode checks, diff metrics, capture hashes, source hashes and PID/cleanup log: verification-r5.log. Each round-5 driver sha256:setup.py=bc7ee115081f9aacc24a415c051bb475ad4baf60c8270910cb431b204f1e3e8e;launch.sh=14eb96a71a05023c3e3148957e7e5d7659ec0ff2ac19adec62fcd8f2ff2f45d1;record-r1b.sh=0959dd3b70c1f578bb7218347f0013cda75fab7abeac283949c755c693e23aa3;record-r5.sh=956fd734059e29e207bdc261bafcb49231ee9e1b14068abb501941c3882308ee;controls.sh=32f8b2e62066891eb2313db3c94813112d0f2c01e9feea6e129da7df8fcfa675;controls-R2-after-captured.sh=e10ec48ece4663db3bea7fcdb789bf897b6dd44900b8567e9d0d1b4f926a5481;driver/cdp.mjs=ff970c2eb8aa798e91866ef8109feb36dd6fb5cf7adf3802623188d90ad1a31b;fake-remote.mjs=c3a93750bf3761a5e2359357160a1e4ea4e9062c0181a9b9778642c062ffc679;diff.py=ccb92aefe257ac91e6391e77052204dcb9947f206df5804e040ceb2d23a3028c;pids.py=57b6e806f79f26331ec044539b3be40a8dd1cd80b52cca2275227d051c465c02;stop-port.py=6a788682a91f020362611d307f9c90a0c3d9840de760e7a03140e639e354c111;audit-artifacts.py=8bf873593d2d2f4c462dd5833bdd9e42ca3d6cf49f3b00c46e224d8e7d4bfc17;inspect-videos.py=5cff910bab2cfeb33e5f06620589dfe132d8b99d529ceda4b63d20a4536b6687;bin/ssh=d40a4f8c6a9e6a370263ff57ae316c2a081a54038bdd68920b5f4985b764e10d;bin/pkill=470555b8831d1ba5cbc878fed047d5e31ee2330e43a643214ef58e2b2d214290;ssh/forced.sh=27361afee4882d50b8ba4551fb9fb9665ca49f2a684ac8ee49252175b5d4e101.Operational exceptions: initial automatic dev seeding began reading/copying the live database; stopped immediately, aborted copy deleted, then fresh state with
T3CODE_DEV_SEED=0. An orphan recorder PID was recovered from a process listing before cwd-checked SIGINT, breaching the requested PID-discovery rule. No database or aborted-seed data is uploaded. Missingxdotoolandlibsecret-1-devwere installed; interrupted/corrupt capture attempts were discarded. Teardown: task servers, sshd, Xvfb and Electron stopped through retained sessions/recorded port-owner PIDs and cwd checks; created worktree removed. Disk stayed ≥10 GB during capture (start 12 GB rounded). Model/harness: GPT-6.1-sol, Codex in T3 Code.