Repository navigation
ci: run CI and releases on a fork, with updates from its own releases - #2
Merged
Merged
Conversation
added 3 commits
November 1, 2026 17:21
The CLI, update checks, install links and error pages were hard-coded to pingdotgg/t3code and the `t3` npm package, so a fork's builds offered upstream's releases. Builds now take the release repository from T3CODE_RELEASE_REPOSITORY, else GITHUB_REPOSITORY, which Actions sets, so a fork's CI points at the fork and local builds keep upstream. A build that doesn't publish the npm package checks the repository's GitHub releases for updates instead, reading each release's t3-release.json for the migration number the update check uses to refuse incompatible versions. Claude Opus 5.5 via Claude Code (T3 Code)
Every Blacksmith runner label now reads T3CODE_LINUX_RUNNER, T3CODE_LINUX_ARM_RUNNER, T3CODE_MACOS_RUNNER or T3CODE_WINDOWS_RUNNER first, so a fork without Blacksmith can point them at GitHub-hosted runners. With the variables unset, upstream runs unchanged. Releases run on a fork that sets T3CODE_RELEASES. Publishers that need upstream's accounts (npm, AUR, Vercel, the marketing site, Discord and the release app's version bump) run only upstream or when the fork opts in, and relay tracing is skipped without its deployment state. Each release now attaches t3-release.json plus install scripts that default to the repository that cut it. Claude Opus 5.5 via Claude Code (T3 Code)
Claude Opus 5.5 via Claude Code (T3 Code)
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: unavailable · PR result: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
added 5 commits
November 1, 2026 19:08
Fork CI showed three problems. Web tests read GITHUB_REPOSITORY through the build defines and expected upstream, so tests now keep upstream's identity. The boot error page imported a package the boot bundle can't load, so it reads the repository the web build injects. The relay tracing step tripped set -u when its smoke test ran it without the step's env. Claude Opus 5.5 via Claude Code (T3 Code)
The terminal actions this test loads now use the git account guard, which reads server state through the client runtime the test mocks, so the file failed to import. Claude Opus 5.5 via Claude Code (T3 Code)
Git 2.56 reports a worktree whose .git file points at a deleted directory as 'gitfile does not point to a valid repository' instead of 'not a git repository'. Storage cleanup then marked such a worktree failed instead of changed, and the git driver and manager missed it too. All three now share one check that knows both wordings. Claude Opus 5.5 via Claude Code (T3 Code)
The test wrote a transcript dated 2026-08-01 and read it on the real clock, so it began failing once that date fell outside the 92-day usage retention on 2026-11-01. Claude Opus 5.5 via Claude Code (T3 Code)
One test reloaded the PDF five times and needed most of its 15-second budget even on a fast machine, so it timed out on smaller CI runners. It is now two tests with the same assertions. Claude Opus 5.5 via Claude Code (T3 Code)
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
The fork could run neither CI nor releases. Every CI and release job asks for Blacksmith runners, which only upstream has, so runs sat queued forever. The release workflow is limited to
pingdotgg/t3code. And even a fork-built app would update from upstream: the CLI,t3 update, the server's update check, the install scripts and the error pages were hard-coded topingdotgg/t3codeand thet3npm package.Change
Fork behaviour is now set through repository variables. With none set, upstream runs exactly as before.
T3CODE_LINUX_RUNNER,T3CODE_LINUX_ARM_RUNNER,T3CODE_MACOS_RUNNERorT3CODE_WINDOWS_RUNNERfirst. This fork now points them at GitHub-hosted runners, which are free for public repos.T3CODE_RELEASESistrue. Jobs that need upstream's accounts are skipped on a fork unless it opts in: npm, AUR, Vercel, the marketing site, Discord and the release app's version bump. Relay tracing is skipped when its deployment state isn't available.T3CODE_RELEASE_REPOSITORY, elseGITHUB_REPOSITORY, which Actions sets automatically. Desktop updates,t3 update, the server's update check, the install links and the issue link all point at the fork, while local builds keep upstream.t3-release.json, which carries the migration number the update check uses to refuse incompatible versions, plusinstall.shandinstall.ps1that default to the fork.t3code://scheme, so hosted Connect sign-in keeps working.docs/operations/fork-releases.mdlists every variable.Scope and approval
Requested by the fork's maintainer. It changes no upstream behaviour when the variables are unset.
Verification
write-release-manifest.tsrun locally: wrote{"version":"1.2.3","t3code":{"databaseMigration":76}}.actionlintreports only two upstream items it doesn't know yet (concurrency.queue,github.run_started_at).T3CODE_RELEASES=true, which starts scheduled nightly releases. macOS builds stay unsigned, so they won't update themselves until Apple signing secrets are added.Claude Opus 5.5 via Claude Code, running in T3 Code.