fix(vcs): treat bare repositories as valid worktree sources - #307
Merged
Conversation
A repository with `core.bare=true` was reported as "not a repository" at detection, because `detectRepository` gated on `rev-parse --is-inside-work-tree` — which conflates "is a Git repository" with "has a checkout". Every Git route then failed with "Failed to resolve the VCS driver for this Git command", including `fetchRemote` and `createWorktree`, so no thread could start against that repository. Starting a thread does not need the source repository to have a checkout: the thread gets its own worktree, and `git worktree add`, `git fetch`, and ref plumbing all work against a bare repository. Only operations that touch a checkout need one. - Detect bare repositories instead of rejecting them, and carry `bare` on the repository identity. Detection now uses one combined `rev-parse --is-bare-repository --is-inside-work-tree`, which separates "no repository" / "bare" / "checkout" in a single call, so negative detection stays at one git invocation. - Let the bare-safe routes through: createWorktree, fetchRemote, resolveRemoteTrackingCommit, removeWorktree, renameBranch, and createRef when it is not also switching. - Checkout-dependent routes (switchRef, pullCurrentBranch, stacked actions, PR thread preparation) now fail with the actual reason — that the repository has no working tree — instead of a routing error. - Status polling reports a bare repository as having no workspace rather than erroring on every poll.
Whitespace only, no behavior change. These three files were already unformatted on fork/changes and are untouched by this branch's fix, but the agent ship gate runs a whole-repo `vp check`, so publishing is blocked until they are formatted.
`ElectronApp` gained `removeCommandLineSwitch`, but the DesktopUpdates test mock was not updated, so `@t3tools/desktop` failed typecheck on fork/changes before this branch. Untouched by this branch's fix, but the agent ship gate runs the workspace typecheck, so publishing is blocked until it compiles.
…scriptor serverRuntimeStartup wrote and cleaned up the runtime descriptor with `node:fs/promises`, `node:path`, and hand-rolled `JSON.stringify`/`JSON.parse`, which the Effect diagnostics flag (nodeBuiltinImport, preferSchemaOverJson) and which failed the workspace typecheck. - Write and remove the descriptor through Effect `FileSystem` (`mode: 0o600` is preserved) and join its path with Effect `Path`. - Encode and decode with the existing `ServerRuntimeDescriptor` schema from `@t3tools/shared/serverRuntime` rather than untyped JSON. That schema was already the one the desktop client decodes with, so the file now round-trips through a single definition instead of two hand-written shapes. - Keep prior failure semantics: a descriptor that cannot be written is a defect (as it was under `Effect.promise`), and cleanup stays best-effort so a missing, unreadable, or malformed file cannot fail shutdown. - Pin the on-disk format with a test that decodes the written contents the same way `DesktopExistingBackend` does, since that shape is a cross-process contract.
patroza
marked this pull request as ready for review
August 4, 2026 11:02
patroza
added a commit
that referenced
this pull request
Aug 4, 2026
* fix(vcs): treat bare repositories as valid worktree sources A repository with `core.bare=true` was reported as "not a repository" at detection, because `detectRepository` gated on `rev-parse --is-inside-work-tree` — which conflates "is a Git repository" with "has a checkout". Every Git route then failed with "Failed to resolve the VCS driver for this Git command", including `fetchRemote` and `createWorktree`, so no thread could start against that repository. Starting a thread does not need the source repository to have a checkout: the thread gets its own worktree, and `git worktree add`, `git fetch`, and ref plumbing all work against a bare repository. Only operations that touch a checkout need one. - Detect bare repositories instead of rejecting them, and carry `bare` on the repository identity. Detection now uses one combined `rev-parse --is-bare-repository --is-inside-work-tree`, which separates "no repository" / "bare" / "checkout" in a single call, so negative detection stays at one git invocation. - Let the bare-safe routes through: createWorktree, fetchRemote, resolveRemoteTrackingCommit, removeWorktree, renameBranch, and createRef when it is not also switching. - Checkout-dependent routes (switchRef, pullCurrentBranch, stacked actions, PR thread preparation) now fail with the actual reason — that the repository has no working tree — instead of a routing error. - Status polling reports a bare repository as having no workspace rather than erroring on every poll. * style: format files drifted on fork/changes Whitespace only, no behavior change. These three files were already unformatted on fork/changes and are untouched by this branch's fix, but the agent ship gate runs a whole-repo `vp check`, so publishing is blocked until they are formatted. * fix(desktop): add the missing removeCommandLineSwitch test stub `ElectronApp` gained `removeCommandLineSwitch`, but the DesktopUpdates test mock was not updated, so `@t3tools/desktop` failed typecheck on fork/changes before this branch. Untouched by this branch's fix, but the agent ship gate runs the workspace typecheck, so publishing is blocked until it compiles. * fix(vcs): supply the required worktree path in the bare-repo test input * refactor(server): use Effect FileSystem and Schema for the runtime descriptor serverRuntimeStartup wrote and cleaned up the runtime descriptor with `node:fs/promises`, `node:path`, and hand-rolled `JSON.stringify`/`JSON.parse`, which the Effect diagnostics flag (nodeBuiltinImport, preferSchemaOverJson) and which failed the workspace typecheck. - Write and remove the descriptor through Effect `FileSystem` (`mode: 0o600` is preserved) and join its path with Effect `Path`. - Encode and decode with the existing `ServerRuntimeDescriptor` schema from `@t3tools/shared/serverRuntime` rather than untyped JSON. That schema was already the one the desktop client decodes with, so the file now round-trips through a single definition instead of two hand-written shapes. - Keep prior failure semantics: a descriptor that cannot be written is a defect (as it was under `Effect.promise`), and cleanup stays best-effort so a missing, unreadable, or malformed file cannot fail shutdown. - Pin the on-disk format with a test that decodes the written contents the same way `DesktopExistingBackend` does, since that shape is a cross-process contract. * test(server): decode the descriptor via the schema JSON codec --------- Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
patroza
added a commit
that referenced
this pull request
Aug 4, 2026
* fix(vcs): treat bare repositories as valid worktree sources A repository with `core.bare=true` was reported as "not a repository" at detection, because `detectRepository` gated on `rev-parse --is-inside-work-tree` — which conflates "is a Git repository" with "has a checkout". Every Git route then failed with "Failed to resolve the VCS driver for this Git command", including `fetchRemote` and `createWorktree`, so no thread could start against that repository. Starting a thread does not need the source repository to have a checkout: the thread gets its own worktree, and `git worktree add`, `git fetch`, and ref plumbing all work against a bare repository. Only operations that touch a checkout need one. - Detect bare repositories instead of rejecting them, and carry `bare` on the repository identity. Detection now uses one combined `rev-parse --is-bare-repository --is-inside-work-tree`, which separates "no repository" / "bare" / "checkout" in a single call, so negative detection stays at one git invocation. - Let the bare-safe routes through: createWorktree, fetchRemote, resolveRemoteTrackingCommit, removeWorktree, renameBranch, and createRef when it is not also switching. - Checkout-dependent routes (switchRef, pullCurrentBranch, stacked actions, PR thread preparation) now fail with the actual reason — that the repository has no working tree — instead of a routing error. - Status polling reports a bare repository as having no workspace rather than erroring on every poll. * style: format files drifted on fork/changes Whitespace only, no behavior change. These three files were already unformatted on fork/changes and are untouched by this branch's fix, but the agent ship gate runs a whole-repo `vp check`, so publishing is blocked until they are formatted. * fix(desktop): add the missing removeCommandLineSwitch test stub `ElectronApp` gained `removeCommandLineSwitch`, but the DesktopUpdates test mock was not updated, so `@t3tools/desktop` failed typecheck on fork/changes before this branch. Untouched by this branch's fix, but the agent ship gate runs the workspace typecheck, so publishing is blocked until it compiles. * fix(vcs): supply the required worktree path in the bare-repo test input * refactor(server): use Effect FileSystem and Schema for the runtime descriptor serverRuntimeStartup wrote and cleaned up the runtime descriptor with `node:fs/promises`, `node:path`, and hand-rolled `JSON.stringify`/`JSON.parse`, which the Effect diagnostics flag (nodeBuiltinImport, preferSchemaOverJson) and which failed the workspace typecheck. - Write and remove the descriptor through Effect `FileSystem` (`mode: 0o600` is preserved) and join its path with Effect `Path`. - Encode and decode with the existing `ServerRuntimeDescriptor` schema from `@t3tools/shared/serverRuntime` rather than untyped JSON. That schema was already the one the desktop client decodes with, so the file now round-trips through a single definition instead of two hand-written shapes. - Keep prior failure semantics: a descriptor that cannot be written is a defect (as it was under `Effect.promise`), and cleanup stays best-effort so a missing, unreadable, or malformed file cannot fail shutdown. - Pin the on-disk format with a test that decodes the written contents the same way `DesktopExistingBackend` does, since that shape is a cross-process contract. * test(server): decode the descriptor via the schema JSON codec --------- Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
patroza
added a commit
that referenced
this pull request
Aug 4, 2026
* fix(vcs): treat bare repositories as valid worktree sources A repository with `core.bare=true` was reported as "not a repository" at detection, because `detectRepository` gated on `rev-parse --is-inside-work-tree` — which conflates "is a Git repository" with "has a checkout". Every Git route then failed with "Failed to resolve the VCS driver for this Git command", including `fetchRemote` and `createWorktree`, so no thread could start against that repository. Starting a thread does not need the source repository to have a checkout: the thread gets its own worktree, and `git worktree add`, `git fetch`, and ref plumbing all work against a bare repository. Only operations that touch a checkout need one. - Detect bare repositories instead of rejecting them, and carry `bare` on the repository identity. Detection now uses one combined `rev-parse --is-bare-repository --is-inside-work-tree`, which separates "no repository" / "bare" / "checkout" in a single call, so negative detection stays at one git invocation. - Let the bare-safe routes through: createWorktree, fetchRemote, resolveRemoteTrackingCommit, removeWorktree, renameBranch, and createRef when it is not also switching. - Checkout-dependent routes (switchRef, pullCurrentBranch, stacked actions, PR thread preparation) now fail with the actual reason — that the repository has no working tree — instead of a routing error. - Status polling reports a bare repository as having no workspace rather than erroring on every poll. * style: format files drifted on fork/changes Whitespace only, no behavior change. These three files were already unformatted on fork/changes and are untouched by this branch's fix, but the agent ship gate runs a whole-repo `vp check`, so publishing is blocked until they are formatted. * fix(desktop): add the missing removeCommandLineSwitch test stub `ElectronApp` gained `removeCommandLineSwitch`, but the DesktopUpdates test mock was not updated, so `@t3tools/desktop` failed typecheck on fork/changes before this branch. Untouched by this branch's fix, but the agent ship gate runs the workspace typecheck, so publishing is blocked until it compiles. * fix(vcs): supply the required worktree path in the bare-repo test input * refactor(server): use Effect FileSystem and Schema for the runtime descriptor serverRuntimeStartup wrote and cleaned up the runtime descriptor with `node:fs/promises`, `node:path`, and hand-rolled `JSON.stringify`/`JSON.parse`, which the Effect diagnostics flag (nodeBuiltinImport, preferSchemaOverJson) and which failed the workspace typecheck. - Write and remove the descriptor through Effect `FileSystem` (`mode: 0o600` is preserved) and join its path with Effect `Path`. - Encode and decode with the existing `ServerRuntimeDescriptor` schema from `@t3tools/shared/serverRuntime` rather than untyped JSON. That schema was already the one the desktop client decodes with, so the file now round-trips through a single definition instead of two hand-written shapes. - Keep prior failure semantics: a descriptor that cannot be written is a defect (as it was under `Effect.promise`), and cleanup stays best-effort so a missing, unreadable, or malformed file cannot fail shutdown. - Pin the on-disk format with a test that decodes the written contents the same way `DesktopExistingBackend` does, since that shape is a cross-process contract. * test(server): decode the descriptor via the schema JSON codec --------- Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
patroza
added a commit
that referenced
this pull request
Aug 5, 2026
* fix(vcs): treat bare repositories as valid worktree sources A repository with `core.bare=true` was reported as "not a repository" at detection, because `detectRepository` gated on `rev-parse --is-inside-work-tree` — which conflates "is a Git repository" with "has a checkout". Every Git route then failed with "Failed to resolve the VCS driver for this Git command", including `fetchRemote` and `createWorktree`, so no thread could start against that repository. Starting a thread does not need the source repository to have a checkout: the thread gets its own worktree, and `git worktree add`, `git fetch`, and ref plumbing all work against a bare repository. Only operations that touch a checkout need one. - Detect bare repositories instead of rejecting them, and carry `bare` on the repository identity. Detection now uses one combined `rev-parse --is-bare-repository --is-inside-work-tree`, which separates "no repository" / "bare" / "checkout" in a single call, so negative detection stays at one git invocation. - Let the bare-safe routes through: createWorktree, fetchRemote, resolveRemoteTrackingCommit, removeWorktree, renameBranch, and createRef when it is not also switching. - Checkout-dependent routes (switchRef, pullCurrentBranch, stacked actions, PR thread preparation) now fail with the actual reason — that the repository has no working tree — instead of a routing error. - Status polling reports a bare repository as having no workspace rather than erroring on every poll. * style: format files drifted on fork/changes Whitespace only, no behavior change. These three files were already unformatted on fork/changes and are untouched by this branch's fix, but the agent ship gate runs a whole-repo `vp check`, so publishing is blocked until they are formatted. * fix(desktop): add the missing removeCommandLineSwitch test stub `ElectronApp` gained `removeCommandLineSwitch`, but the DesktopUpdates test mock was not updated, so `@t3tools/desktop` failed typecheck on fork/changes before this branch. Untouched by this branch's fix, but the agent ship gate runs the workspace typecheck, so publishing is blocked until it compiles. * fix(vcs): supply the required worktree path in the bare-repo test input * refactor(server): use Effect FileSystem and Schema for the runtime descriptor serverRuntimeStartup wrote and cleaned up the runtime descriptor with `node:fs/promises`, `node:path`, and hand-rolled `JSON.stringify`/`JSON.parse`, which the Effect diagnostics flag (nodeBuiltinImport, preferSchemaOverJson) and which failed the workspace typecheck. - Write and remove the descriptor through Effect `FileSystem` (`mode: 0o600` is preserved) and join its path with Effect `Path`. - Encode and decode with the existing `ServerRuntimeDescriptor` schema from `@t3tools/shared/serverRuntime` rather than untyped JSON. That schema was already the one the desktop client decodes with, so the file now round-trips through a single definition instead of two hand-written shapes. - Keep prior failure semantics: a descriptor that cannot be written is a defect (as it was under `Effect.promise`), and cleanup stays best-effort so a missing, unreadable, or malformed file cannot fail shutdown. - Pin the on-disk format with a test that decodes the written contents the same way `DesktopExistingBackend` does, since that shape is a cross-process contract. * test(server): decode the descriptor via the schema JSON codec --------- Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
patroza
added a commit
that referenced
this pull request
Aug 5, 2026
* fix(vcs): treat bare repositories as valid worktree sources A repository with `core.bare=true` was reported as "not a repository" at detection, because `detectRepository` gated on `rev-parse --is-inside-work-tree` — which conflates "is a Git repository" with "has a checkout". Every Git route then failed with "Failed to resolve the VCS driver for this Git command", including `fetchRemote` and `createWorktree`, so no thread could start against that repository. Starting a thread does not need the source repository to have a checkout: the thread gets its own worktree, and `git worktree add`, `git fetch`, and ref plumbing all work against a bare repository. Only operations that touch a checkout need one. - Detect bare repositories instead of rejecting them, and carry `bare` on the repository identity. Detection now uses one combined `rev-parse --is-bare-repository --is-inside-work-tree`, which separates "no repository" / "bare" / "checkout" in a single call, so negative detection stays at one git invocation. - Let the bare-safe routes through: createWorktree, fetchRemote, resolveRemoteTrackingCommit, removeWorktree, renameBranch, and createRef when it is not also switching. - Checkout-dependent routes (switchRef, pullCurrentBranch, stacked actions, PR thread preparation) now fail with the actual reason — that the repository has no working tree — instead of a routing error. - Status polling reports a bare repository as having no workspace rather than erroring on every poll. * style: format files drifted on fork/changes Whitespace only, no behavior change. These three files were already unformatted on fork/changes and are untouched by this branch's fix, but the agent ship gate runs a whole-repo `vp check`, so publishing is blocked until they are formatted. * fix(desktop): add the missing removeCommandLineSwitch test stub `ElectronApp` gained `removeCommandLineSwitch`, but the DesktopUpdates test mock was not updated, so `@t3tools/desktop` failed typecheck on fork/changes before this branch. Untouched by this branch's fix, but the agent ship gate runs the workspace typecheck, so publishing is blocked until it compiles. * fix(vcs): supply the required worktree path in the bare-repo test input * refactor(server): use Effect FileSystem and Schema for the runtime descriptor serverRuntimeStartup wrote and cleaned up the runtime descriptor with `node:fs/promises`, `node:path`, and hand-rolled `JSON.stringify`/`JSON.parse`, which the Effect diagnostics flag (nodeBuiltinImport, preferSchemaOverJson) and which failed the workspace typecheck. - Write and remove the descriptor through Effect `FileSystem` (`mode: 0o600` is preserved) and join its path with Effect `Path`. - Encode and decode with the existing `ServerRuntimeDescriptor` schema from `@t3tools/shared/serverRuntime` rather than untyped JSON. That schema was already the one the desktop client decodes with, so the file now round-trips through a single definition instead of two hand-written shapes. - Keep prior failure semantics: a descriptor that cannot be written is a defect (as it was under `Effect.promise`), and cleanup stays best-effort so a missing, unreadable, or malformed file cannot fail shutdown. - Pin the on-disk format with a test that decodes the written contents the same way `DesktopExistingBackend` does, since that shape is a cross-process contract. * test(server): decode the descriptor via the schema JSON codec --------- Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
patroza
added a commit
that referenced
this pull request
Aug 5, 2026
* fix(vcs): treat bare repositories as valid worktree sources A repository with `core.bare=true` was reported as "not a repository" at detection, because `detectRepository` gated on `rev-parse --is-inside-work-tree` — which conflates "is a Git repository" with "has a checkout". Every Git route then failed with "Failed to resolve the VCS driver for this Git command", including `fetchRemote` and `createWorktree`, so no thread could start against that repository. Starting a thread does not need the source repository to have a checkout: the thread gets its own worktree, and `git worktree add`, `git fetch`, and ref plumbing all work against a bare repository. Only operations that touch a checkout need one. - Detect bare repositories instead of rejecting them, and carry `bare` on the repository identity. Detection now uses one combined `rev-parse --is-bare-repository --is-inside-work-tree`, which separates "no repository" / "bare" / "checkout" in a single call, so negative detection stays at one git invocation. - Let the bare-safe routes through: createWorktree, fetchRemote, resolveRemoteTrackingCommit, removeWorktree, renameBranch, and createRef when it is not also switching. - Checkout-dependent routes (switchRef, pullCurrentBranch, stacked actions, PR thread preparation) now fail with the actual reason — that the repository has no working tree — instead of a routing error. - Status polling reports a bare repository as having no workspace rather than erroring on every poll. * style: format files drifted on fork/changes Whitespace only, no behavior change. These three files were already unformatted on fork/changes and are untouched by this branch's fix, but the agent ship gate runs a whole-repo `vp check`, so publishing is blocked until they are formatted. * fix(desktop): add the missing removeCommandLineSwitch test stub `ElectronApp` gained `removeCommandLineSwitch`, but the DesktopUpdates test mock was not updated, so `@t3tools/desktop` failed typecheck on fork/changes before this branch. Untouched by this branch's fix, but the agent ship gate runs the workspace typecheck, so publishing is blocked until it compiles. * fix(vcs): supply the required worktree path in the bare-repo test input * refactor(server): use Effect FileSystem and Schema for the runtime descriptor serverRuntimeStartup wrote and cleaned up the runtime descriptor with `node:fs/promises`, `node:path`, and hand-rolled `JSON.stringify`/`JSON.parse`, which the Effect diagnostics flag (nodeBuiltinImport, preferSchemaOverJson) and which failed the workspace typecheck. - Write and remove the descriptor through Effect `FileSystem` (`mode: 0o600` is preserved) and join its path with Effect `Path`. - Encode and decode with the existing `ServerRuntimeDescriptor` schema from `@t3tools/shared/serverRuntime` rather than untyped JSON. That schema was already the one the desktop client decodes with, so the file now round-trips through a single definition instead of two hand-written shapes. - Keep prior failure semantics: a descriptor that cannot be written is a defect (as it was under `Effect.promise`), and cleanup stays best-effort so a missing, unreadable, or malformed file cannot fail shutdown. - Pin the on-disk format with a test that decodes the written contents the same way `DesktopExistingBackend` does, since that shape is a cross-process contract. * test(server): decode the descriptor via the schema JSON codec --------- Co-authored-by: T3 Code PR Stack <41898282+github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Every T3 turn against
/var/lib/t3/src/t3codeon t3vm failed with:The repository had
core.bare = true.GitVcsDriver.detectRepositorygated onrev-parse --is-inside-work-tree, which conflates "is a Git repository" with"has a checkout". A bare repository therefore detected as no repository at all, so
VcsDriverRegistry.resolveraisedVcsUnsupportedOperationErrorand every Git routefailed — including the two a thread actually needs,
fetchRemoteandcreateWorktree.Nothing was logged server-side: the error reached Discord but produced zero
t3code-serverjournal lines, so the host looked healthy.Why bare should work
Starting a thread never needs the source repository to have a checkout — the thread gets
its own worktree.
git worktree add,git fetch, and ref plumbing all work fineagainst a bare repository. Only operations that touch a checkout need one.
The lower layer already agreed:
resolveRepositoryPathstolerates a failing--show-topleveland modelsworktreeRoot: null. Only the detection gate rejected bare.Change
bareonVcsRepositoryIdentity.rootPathis the metadata directory when bare.rev-parse --is-bare-repository --is-inside-work-tree, which separates no repository /bare / checkout in one call. Negative detection stays at one git invocation, so
there is no added load on the status-poll path.
allowBare: true:createWorktree,fetchRemote,resolveRemoteTrackingCommit,removeWorktree,renameBranch, andcreateRefwhen itis not also switching.
switchRef,pullCurrentBranch, stacked actions, PRthread preparation) keep the default and now fail with the real reason — the repository
has no working tree — instead of a generic routing error.
on every poll.
Tests
GitVcsDriver.test.ts— bare repo detects asbare: true; a repo whose config marks anexisting checkout bare (the exact shape that broke t3vm) detects instead of returning
null; non-repositories still return null; and a usable worktree is created from a bare
repository, with the resulting checkout detecting as
bare: false.GitWorkflowService.test.ts—createWorktreeandfetchRemoterun against a barehandle;
switchRefis refused before reaching the driver with an actionable message;localStatusdegrades to "no workspace".VcsDriverRegistry.test.ts— updated to the new probe, asserting one probe per detect.bare: falsefor ordinary repositories.Note
The immediate outage was already mitigated on t3vm by
git config core.bare false— thatrepository has a full checkout and 15 linked worktrees, so its config flag was simply wrong.
This change is about the routing behavior: a repository without a checkout should not take
down thread creation, and when a checkout genuinely is required the error should say so.
🤖 Generated with Claude Code
Also in this PR: unblocking a red
fork/changesfork/changeswas red when this branch was cut (Fork CI failing on Check and Test),so the ship gate could not pass on the VCS fix alone. These commits fix that breakage. They
are unrelated to the VCS change and are separated per commit for review:
style: format files drifted on fork/changes— whitespace only, in three files thisbranch does not otherwise touch (
ThreadComposer.tsx,ProviderCommandReactor.ts,serverRuntimeStartup.ts). This is what CI's Check job was failing on.fix(desktop): add the missing removeCommandLineSwitch test stub—ElectronAppgained
removeCommandLineSwitch, but theDesktopUpdatestest mock was never updated, so@t3tools/desktopfailed typecheck.refactor(server): use Effect FileSystem and Schema for the runtime descriptor—serverRuntimeStartup.tswrote and cleaned up the runtime descriptor withnode:fs/promises,node:path, and hand-rolled JSON, which the Effect diagnostics reject(
nodeBuiltinImport,preferSchemaOverJson). It now uses EffectFileSystem/Pathandthe existing
ServerRuntimeDescriptorschema from@t3tools/shared/serverRuntime—the same schema the desktop client already decodes the file with, so the format now comes
from one definition instead of two hand-written shapes.
mode: 0o600and the best-effortcleanup semantics are preserved, and a test pins the on-disk format against the consumer's
decode path.
Known flake (not fixed here)
apps/desktop/src/app/DesktopPreReadyPlatform.test.ts > acquires a synchronous pre-ready layer before an asynchronous Clerk-shaped layerfails intermittently. It failed in one localfull-suite run, then passed on re-run, in isolation (3×), and in the full desktop suite
(456 tests) — and CI hit the same test on
fork/changesthis morning. It is pre-existing andtiming-sensitive; left alone rather than papered over.