Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
1cfd0a7
fork: the server and CLI update from the desktop app's repository (#1)
scuttletoby Nov 12, 2026
ee69d98
fork: release workflow for v<upstream>-fork.N on GitHub-hosted runner…
scuttletoby Nov 12, 2026
82bebcb
fork: fast CI on GitHub-hosted runners (fork-tests.yml) (#6)
scuttletoby Nov 12, 2026
ae0d686
fork: CI check that refuses database schema and migration changes (#3)
scuttletoby Nov 12, 2026
36d66b8
fork: green main again (schema-check comments, checkout without submo…
scuttletoby Nov 12, 2026
8b0ad2c
fork: follow each stable upstream release with the patch series (#4)
scuttletoby Nov 12, 2026
537e3ed
test(web): command palette tests clear a leaked last-used project (#3…
scuttletoby Nov 12, 2026
919556a
fork: outside PRs run nothing, one checkout without actions/checkout,…
scuttletoby Nov 12, 2026
f72c880
fork: delete four outside-started upstream workflows and keep them de…
scuttletoby Nov 12, 2026
1f8f6e5
fork: follow upstream's newest nightly tag (FORK_FOLLOW_CHANNEL, defa…
scuttletoby Nov 13, 2026
cf16083
feat(web): file links open remotely, full size, download from their m…
scuttletoby Nov 13, 2026
4264469
fork-ci: docs-scope composite action (docs-only gate and per-job path…
scuttletoby Nov 13, 2026
3e2bf54
fork-ci: gradle-cache composite action (locked Maven local repository…
scuttletoby Nov 13, 2026
b744d05
fork: the fork-follow test's fake gh no longer reads as a real workfl…
scuttletoby Nov 14, 2026
75cd6b5
fork: Fork tests on the repository's own fleet runners, chosen per ru…
scuttletoby Nov 14, 2026
17bbf2a
fork-ci: job-changed composite action (did this workflow job's inputs…
scuttletoby Nov 14, 2026
89ab414
fork-ci pr-queue 1/4: lens review rules and a strict config (#18)
scuttletoby Nov 14, 2026
120974a
fork-ci pr-queue 2/4: the queue's merge path (pr_queue.py) (#19)
scuttletoby Nov 14, 2026
9031591
fork-ci pr-queue 3/4: armed pull requests that cannot merge are told …
scuttletoby Nov 14, 2026
fb86cc3
fork-ci pr-queue 4/4: update a PR that was red only because its base …
scuttletoby Nov 14, 2026
8a719ea
docs(fork): host tools design: agents on a person's own computer (lim…
scuttletoby Nov 14, 2026
36b40ae
fork-ci pr-queue: leftover minors from the stack reviews (#32)
scuttletoby Nov 14, 2026
2af1134
Fork: weekly check that the repository's interaction limit never laps…
scuttletoby Nov 14, 2026
05d8d9f
Fork: head-check action, the queue's required head check with lens.py…
scuttletoby Nov 14, 2026
954235f
fork-ci: release commits that hold only fork-ci, protected tags (#35)
scuttletoby Nov 14, 2026
9cdbb73
feat(server): keep a history of provider usage-limit readings (#24)
scuttletoby Nov 14, 2026
af0a4fc
fix(web): no-project drafts follow load balancing
Silthus Nov 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/fork-ci-release-rulesets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[
{
"name": "fork-ci release tags: never moved or deleted",
"target": "tag",
"enforcement": "active",
"bypass_actors": [],
"conditions": { "ref_name": { "include": ["refs/tags/ci/*"], "exclude": [] } },
"rules": [{ "type": "deletion" }, { "type": "update" }]
},
{
"name": "fork-ci release branch: no force push or delete",
"target": "branch",
"enforcement": "active",
"bypass_actors": [],
"conditions": { "ref_name": { "include": ["refs/heads/ci-release"], "exclude": [] } },
"rules": [{ "type": "deletion" }, { "type": "non_fast_forward" }]
}
]
9 changes: 9 additions & 0 deletions .github/fork-ci-release.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"_comment": "The fork-ci release (.github/scripts/fork-ci-release.py, fork-ci/README.md). paths: the only files a release commit holds, at the same paths as on sourceBranch. legacyTags: tags made before release commits existed (they name a sourceBranch commit, not a release commit, and stay where they are).",
"sourceBranch": "main",
"requiredCheck": "fork-ci-result",
"branch": "ci-release",
"tagPrefix": "ci/v",
"legacyTags": ["ci/v1"],
"paths": ["LICENSE", "fork-ci", ".github/workflows/fork-pr-queue.yml"]
}
39 changes: 39 additions & 0 deletions .github/fork-ci-tests.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Every test file under .github/scripts and fork-ci (*.test.*, subdirectories included) and
# where it runs (.github/scripts/fork-ci-tests.cjs checks this list).
# <test> run by the workflows job, by extension (sh, py, cjs, mjs, js)
# <test> run by <file> run by <file>, which must name the test's path (not one
# of upstream's workflows: they are disabled in the fork)
# A present test that is not listed fails. A listed file that is not present yet
# is a note; one that was present and then deleted fails.
.github/scripts/fork-ci-tests.test.cjs
.github/scripts/fork-contracts.test.py
.github/scripts/fork-fleet.test.py
.github/scripts/fork-follow.test.sh
.github/scripts/fork-interaction-limit.test.sh
.github/scripts/fork-pr-queue-workflow.test.py
.github/scripts/fork-ci-release.test.py
.github/scripts/fork-release-workflow.test.py
.github/scripts/fork-release.test.sh
.github/scripts/fork-schema-check.test.cjs
.github/scripts/fork-secret-scan.test.sh
.github/scripts/fork-test-shards.test.cjs
.github/scripts/fork-tests-drift.test.cjs
.github/scripts/fork-workflow-triggers.test.cjs
fork-ci/actions/docs-scope/docs-scope.test.py
fork-ci/actions/gradle-cache/gradle_cache.test.py
fork-ci/actions/head-check/head_check.test.py
fork-ci/actions/job-changed/job-changed.test.py
fork-ci/actions/pr-queue/lens.test.py
fork-ci/actions/pr-queue/pr_queue.test.py
fork-ci/actions/pr-queue/tested-base/tested_base.test.py

# Upstream's tests, run where fork-tests.yml follows upstream's ci.yml.
.github/scripts/check-nightly-release.test.cjs run by .github/workflows/fork-tests.yml
.github/scripts/mobile-preview-comment.test.cjs run by .github/workflows/fork-tests.yml
.github/scripts/stage-preview-bundle.test.py run by .github/workflows/fork-tests.yml
.github/scripts/test-delta.test.cjs run by .github/workflows/fork-tests.yml
.github/scripts/vercel-deployment-output.test.cjs run by .github/workflows/fork-tests.yml
# Upstream runs this one from thread-transfer-report.yml (workflow_run of the disabled CI).
.github/scripts/thread-transfer-report.test.cjs run by .github/workflows/fork-tests.yml
# Release Smoke runs scripts/release-smoke.ts, which runs this one.
.github/scripts/relay-state-output.test.cjs run by scripts/release-smoke.ts
60 changes: 60 additions & 0 deletions .github/fork-fleet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"_doc": [
"Where fork-tests.yml's Linux jobs run: this repository's own fleet of self-hosted runners, or GitHub-hosted.",
"The one place for every fact about this repository and its fleet: .github/scripts/fork-fleet.py has none.",
"Read by `route` (a step of fork-tests.yml's changes job), `watch` (fork-tests.yml), `sweep` (fork-fleet.yml),",
"and on each fleet host by `dispatch` and `gate` (an installed copy of main's script and of this file).",
"The setting is the repository variable named in `variable`: auto (unset too), fleet or github.",
"Runbook, owner steps and the failure table: .github/fork-fleet.md."
],
"repository": "scuttletoby/t3code",
"variable": "CI_RUNNERS",
"hosted": "ubuntu-24.04",
"trusted": {
"workflows": [".github/workflows/fork-tests.yml"],
"actors": ["scuttletoby"],
"push_branches": ["main"]
},
"upstream_sync": {
"_doc": [
"Upstream's code runs on GitHub-hosted runners only (owner decision). The daily sync pushes main with the owner's",
"token, so its push run would pass `trusted`: scripts/fork-follow-push.sh tags each commit it moves main to as",
"<tag_prefix><sha> before the move, and a push run of a tagged commit never uses the fleet. Keep the tags: a",
"run can be re-run for 30 days."
],
"tag_prefix": "fork-follow/synced/"
},
"pools": [
{
"_doc": "The owner's PC: its dispatcher runs on the always-on host and starts runners on the PC over ssh.",
"name": "pc",
"label": "fleet-pc-t3code",
"slots": 1,
"beacon": "FLEET_BEACON_PC",
"launch": ["/opt/fork-fleet/launch-pc"],
"waits": false
},
{
"_doc": "The always-on host (the owner's workspace, not a VM of its own): each runner runs as its own user in its own network namespace with internet only (fork-fleet.md, Containment). Fleet mode queues here.",
"name": "vm",
"label": "fleet-vm-t3code",
"slots": 2,
"beacon": "FLEET_BEACON_VM",
"launch": ["/opt/fork-fleet/fork-fleet-launch.sh"],
"waits": true
}
],
"beacon_fresh_seconds": 180,
"stuck_seconds": 600,
"fleet_stuck_seconds": 7200,
"dispatch": { "every_seconds": 20, "beacon_seconds": 60, "idle_passes": 3 },
"jobs": [
{ "job": "test", "shards": 2, "gates": ["test"], "memory_mb": 4096 },
{ "job": "test_web", "shards": 2, "gates": ["test_web"], "memory_mb": 4096 },
{ "job": "build", "gates": ["build", "typecheck"], "memory_mb": 4096 },
{ "job": "lint", "gates": [], "memory_mb": 3072 },
{ "job": "rust", "gates": ["rust"], "memory_mb": 2048 },
{ "job": "test_server", "shards": 8, "gates": ["test_server"], "memory_mb": 3072 },
{ "job": "release_smoke", "gates": ["release_smoke"], "memory_mb": 2048 }
]
}
Loading
Loading