pr: https://git.cafe/pingdotgg/t3code/pulls/24100 head: ca82cea91605322cb5fbe48570bc88cc0e0a13f2 baseline github/main: 9f33a1c8361e18f553b387cbb5d3c2c62d56f8ba real openssh loopback host, isolated HOME=/home/user/ssh-task-home service config: Environment=T3CODE_HOME="/home/user/ssh custom home" $ git worktree add ../main github/main; vp i $ setsid nohup timeout 6900 vp run dev --home-dir '/home/user/ssh custom home' --no-seed ... & [dev-runner] serverPort=16733 webPort=8693 $ main production issueRemotePairingToken(target, {batchMode:'yes'}, sourceCliRunner) $ POST /api/auth/browser-session to the running custom-home server with that token HTTP 401 auth_invalid / invalid_credential Stopped main by its captured launch process group before starting the PR. $ git checkout -b codex/fix-17039-ssh-custom-home ca82cea91605322cb5fbe48570bc88cc0e0a13f2 $ vp i; setsid nohup timeout 6600 vp run dev --home-dir '/home/user/ssh custom home' --no-seed ... & [dev-runner] serverPort=13773 webPort=5733 $ ssh pr24100 'node /home/user/t3code/apps/server/src/bin.ts __ssh-helper home-dir' /home/user/ssh custom home $ pr production issueRemotePairingToken(...) and POST /api/auth/browser-session HTTP 200, pairing accepted Playwright + /usr/bin/google-chrome: Add project -> Local folder -> real git repo. Actual Codex gpt-6.1-sol turn ran pwd and cat README.md without edits. Result: SSH_CUSTOM_HOME_OK /home/user/ssh-verification-repo Stopped dev; ran the source CLI serving built web assets against the same custom home. $ SshEnvironmentManager.ensureEnvironment(target, {issuePairingToken:true}) remotePort=13773 remoteServerKind=external httpBaseUrl=http://127.0.0.1:36691/ Existing server PID 24343 preserved. Actual SSH forward and real pairing credential. $ ensureEnvironment(target, {issuePairingToken:false}) Same forward reused, no new token. $ vp run dev:web --port 36691 --home-dir '/home/user/ssh custom home' Vite's /api and /ws proxy now traverses SSH. Paired browser using the manager token. Second real Codex gpt-6.1-sol turn ran pwd and git status --short, without edits. Result: SSH_FORWARDED_TURN_OK /home/user/ssh-verification-repo $ disconnectEnvironment(target) Forward closed; external server PID 24343 unchanged; GET / -> HTTP 200. Changed actual service config to another home after launch: helper resolved new service home, but pairing stayed in recorded launch home -> HTTP 200. Explicit T3CODE_HOME=/home/user/explicit home beat the service config. Without either setting, helper resolved /home/user/ssh-task-home/.t3. Default-home managed launch -> port 3774, PID 31031, pairing HTTP 200. Restored custom-home service config while default-home managed process was alive: launch exit 1: "Stop it before changing the T3 home"; PID 31031 preserved; GET / -> 200. Explicit disconnect stopped the managed server and forward. With no existing server to adopt, custom-home managed launch also passed: $ SshEnvironmentManager.ensureEnvironment(target, {issuePairingToken:true}) remotePort=3774 remoteServerKind=managed httpBaseUrl=http://127.0.0.1:38271/ Actual new source CLI PID 39223 wrote runtime info under /home/user/ssh custom home. Launcher server-home file: /home/user/ssh custom home Real SSH pairing credential accepted by this managed custom-home server: HTTP 200. Explicit disconnect stopped the managed server and forward. Blacksmith existing focused suites: 44 passed (tunnel.test.ts, bootService.test.ts). Blacksmith web build: passed. CI: 21 successful, 9 skipped, 1 neutral; no failures/pending. No source changes, commits, pushes, label changes, merge/rebase/force-push actions. Limitations: dev backend root HTTP 302 fails the existing SSH readiness probe. Built client startup failed at icons-Dqr5UY3I.js:108:305 (undefined.map). Used source CLI with built assets for readiness and Vite via SSH for client/provider proof. Unverified: packaged desktop, macOS/launchd, Windows, iOS/Android, separate physical SSH machine, archive runner. No mocks, fixtures, replay provider, or seeded database.