ci(fork): run the test suite on runners this fork actually has - #17
Merged
Conversation
The upstream `CI` workflow runs all seven of its jobs on Blacksmith runners, which this fork cannot reach. Its jobs queue until something cancels them. In the last sixty runs of that workflow here, zero completed: fifty cancelled and ten still queued, one of them for over two hours. Every fork release so far has shipped with no automated testing behind it, and `gh pr checks` on any pull request reports a permanent wall of pending that hides a real failure. This adds the fork's own gate on standard GitHub-hosted runners, which are free for a public repository. It covers typecheck, format, lint, the sharded server suite and the remaining packages. It leaves out the desktop build, knip and the mobile static analysis, which cost more than they catch here. A separate file rather than a patch to `ci.yml`, for two reasons. Editing that file would conflict on every upstream sync that touches it, which is the exact cost this fork keeps paying elsewhere. And a plain `runs-on` swap would not even work, because the upstream job rewrites `/etc/apt/blacksmith-ubuntu-mirrors.txt`, a path that does not exist on a GitHub-hosted runner. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
matheustimbo
added a commit
that referenced
this pull request
Sep 12, 2026
`feat(fork): add independent update channel` dropped the `command -v t3` short-circuit from the remote runner script, because this fork ships its own server package and exec'ing whatever `t3` sits on the remote PATH would launch someone else's build. `tunnel.test.ts` pins that removal, but the process-level `existing-cli` case in `runnerProcess.test.ts` still asserted the upstream behavior. It went unnoticed until PR #17 gave the fork a CI gate that actually runs the suite, and it has been the only real failure in `Fork CI` since. Rather than delete the case, this turns it into a guard for the fork's own invariant. `bin/t3` is now a decoy that prints a different argv instead of a symlink to the installed CLI, so the assertions distinguish which binary ran, and the installer call is expected rather than forbidden. Re-adding the short-circuit to `tunnel.ts` fails the case with `expected [ 'path-cli' ] to deeply equal [ 'serve', 'a path with spaces' ]`. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.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.
The problem
The upstream
CIworkflow runs all seven of its jobs on Blacksmith runners. This fork has no access to them, so every job queues until something cancels it.In the last sixty runs of that workflow on this repository, zero completed. Fifty were cancelled and ten are still queued, one of them from
mainfor over two hours.mobile-fingerprint-check.ymlhas the same problem on a smaller scale, at two queued and two cancelled.Two consequences. Every fork release so far, 0.1.48 included, shipped with no automated testing behind it. And
gh pr checkson any pull request shows a permanent wall of pending, which is where a real failure would hide.This was found while resolving #15. Nothing was in
in_progressafter 72 minutes, which is not what slow CI looks like.The fix
A fork-owned workflow on
ubuntu-24.04, which is free for a public repository. It covers typecheck,vp fmt --check,vp lint, the server suite sharded three ways exactly as upstream shards it, and the remaining packages.Left out on purpose: the desktop build,
knip:check, and the mobile static analysis. They cost more than they catch here, and this workflow is meant to be the gate that runs, not a mirror of upstream's.Why a new file instead of editing
ci.ymlTwo reasons, and the second is decisive.
Editing
ci.ymlmakes it fork-only code inside a file upstream actively maintains, so it conflicts on every sync that touches it. That is the exact cost that made #15 a nine-conflict merge.And a plain
runs-onswap would not work anyway. The upstream jobs runsudo sed -i ... /etc/apt/blacksmith-ubuntu-mirrors.txt, a path that only exists on a Blacksmith runner. This workflow uses plainapt-getinstead.Follow-up
Once this is green,
ci.ymlandmobile-fingerprint-check.ymlshould be disabled in repository settings, the same wayRelease,Mobile EAS ProductionandDeploy T3 Connect relayalready are perdocs/operations/fork-releases.md. Disabling is a settings change, so it adds no file to conflict on. I have not done it yet, because the replacement should be proven working first.Verification
The suite this workflow runs was executed locally against the #15 merge before it landed: 2656 tests passing across 174 files. Two failures in
packages/ssh/src/runnerProcess.test.tsare pre-existing and environment-dependent, proven by running them on the pre-merge base in a throwaway worktree, where they fail identically. They are live tests that shell out to realnpmandnpx, andpackages/sshhad zero diff in that merge. Expect this workflow to report them until they are fixed or quarantined separately.Model and harness: Claude Opus 5 via Claude Code, in T3 Code.