Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1303 commits
Select commit Hold shift + click to select a range
d81f1b7
test: a re-gate pass waits for the required checks, and every gate at…
rawphp Oct 25, 2026
807eb53
fix(factory): watched-repos test builds branded provider kinds
rawphp Oct 25, 2026
f113643
feat: a re-gate pass waits for the required checks, and every gate at…
rawphp Oct 25, 2026
7a70dad
Merge pull request #223 from original-solutions/sync/v0.1.3-nightly.2…
tomkaczocha Oct 25, 2026
1f77bca
test: the re-gate's checks wait survives crashes, closed issues, chan…
rawphp Oct 25, 2026
c16c0b2
fix: a resumed re-gate recovers an owed send, notices a closed issue …
rawphp Oct 25, 2026
44c36bf
test: a head pushed during the checks wait is gated fresh, a timed-ou…
rawphp Oct 25, 2026
fc215da
fix: a pushed head is gated fresh during the checks wait, and a recor…
rawphp Oct 25, 2026
5b71f2a
test: a cut-short stuck path is finished and an owed ready state is k…
rawphp Oct 25, 2026
909322e
fix: a recorded timeout is finished whatever the head holds, and an o…
rawphp Oct 25, 2026
12f40df
test: a failed-checks stuck path cut short after the draft is finishe…
rawphp Oct 25, 2026
1f042d6
fix: any read on record for a re-gate pass is finished whatever the h…
rawphp Oct 25, 2026
e1ea2b6
test: the end-to-end ledger expects the gate_finished line, and a rec…
rawphp Oct 25, 2026
c385d45
sync: v0.1.3-nightly.20261025.3669
rawphp Oct 25, 2026
9318edb
fix: a pass an older build recorded still sets the ready state again,…
rawphp Oct 25, 2026
5833fd2
Merge pull request #224 from original-solutions/issue-222-regate-checks
tomkaczocha Oct 25, 2026
7643a17
fix: move the Factory settings page under upstream's chat settings la…
rawphp Oct 25, 2026
741d532
fix: render the exported sidebar footer in the nav icon test
rawphp Oct 25, 2026
3411604
Merge remote-tracking branch 'origin/main' into t3/factory-build-issu…
rawphp Oct 25, 2026
e3c8747
test: the seam test writes the Factory settings route at its new path
rawphp Oct 25, 2026
e17f8a7
test: the Factory settings route stays under the chat settings layout
rawphp Oct 25, 2026
da9999f
fix: fork comments fit upstream's four-line comment rule
rawphp Oct 25, 2026
a8a1b5c
test: the mobile Factory settings section and the sidebar utility hoo…
rawphp Oct 25, 2026
050bf7c
Merge pull request #226 from original-solutions/t3/factory-build-issu…
tomkaczocha Oct 25, 2026
cccf03c
test: factory children get the launch PATH first
rawphp Oct 25, 2026
0134207
fix: factory commands get the LaunchAgent PATH ahead of the login she…
rawphp Oct 25, 2026
337bc20
docs: describe the PATH order factory commands get
rawphp Oct 25, 2026
8e6d56d
test: a launch onto an existing pull request links it to the thread
rawphp Oct 26, 2026
b238895
feat: link the pull request a resumed session continues to its thread…
rawphp Oct 26, 2026
27097a3
test: a plain start carries no pull request URL
rawphp Oct 26, 2026
1242bec
fix: log why a pull request link was dropped at launch
rawphp Oct 26, 2026
9ae6a69
fix(server): the pull request link at launch uses Effect.fn so lint p…
rawphp Oct 26, 2026
2a48a46
test: the mobile Factory screen renders as a Settings page
rawphp Oct 26, 2026
b02eb89
fix(mobile): the Factory screen lays out under the header like other …
rawphp Oct 26, 2026
e30a827
test: the picker's bottom padding keeps its 18pt floor without a home…
rawphp Oct 26, 2026
7a49cd9
fix(mobile): the Factory WebView insets under the floating Settings h…
rawphp Oct 26, 2026
9c7d65a
Merge pull request #232 from original-solutions/t3/factory-issue-231
tomkaczocha Oct 26, 2026
dc1c969
sync: v0.1.3-nightly.20261025.3692
github-actions[bot] Oct 26, 2026
0220c96
Merge pull request #230 from original-solutions/t3/factory-issue-229
tomkaczocha Oct 26, 2026
fa04dfb
Merge remote-tracking branch 'origin/main' into t3/factory-issue-228-1
rawphp Oct 26, 2026
5468d0b
test: autodeploy drains for a pending build and deploys past deploy_w…
rawphp Oct 26, 2026
d3fb15e
test: the PATH passthrough test clears the launch PATH it does not set
rawphp Oct 26, 2026
3d116f0
docs: the install guide shows a prepend to shadow a plist PATH tool
rawphp Oct 26, 2026
0afdc21
feat: autodeploy marks a pending build and deploys past deploy_wait_m…
rawphp Oct 26, 2026
65a0347
test: the pass drains for a pending deploy
rawphp Oct 26, 2026
21cb208
feat: the pass drains for a pending deploy and raises an item past de…
rawphp Oct 26, 2026
612cbe8
test: autodeploy leaves no pending marker when it cannot ask about runs
rawphp Oct 26, 2026
d87ae6c
fix: autodeploy marks the build pending only once it has read the fac…
rawphp Oct 26, 2026
c3c54a7
test: autodeploy's marker shows a live ticker and a person's thread o…
rawphp Oct 26, 2026
3764679
fix(lint): budget the two fork effects upstream's react-effect-budget…
rawphp Oct 26, 2026
09ff36f
fix: autodeploy's marker shows it is ticking and a person's thread ho…
rawphp Oct 26, 2026
c875d4e
test: the pass ignores a deploy-pending marker autodeploy stopped rew…
rawphp Oct 26, 2026
372eabd
fix: the pass ignores a deploy-pending marker autodeploy stopped rewr…
rawphp Oct 26, 2026
f122dde
test: autodeploy deploys past the limit whatever is in the way, keeps…
rawphp Oct 26, 2026
20af662
fix: autodeploy installs past the limit whatever is in the way and ke…
rawphp Oct 26, 2026
f3f19ce
test: pin the deploy-pending staleness limit with literal ages
rawphp Oct 26, 2026
d5ddad4
fix: say that an unreadable thread count waits only until deploy_wait…
rawphp Oct 26, 2026
c997934
docs: the PATH order covers every factory command and names the shims…
rawphp Oct 26, 2026
460fffc
Merge pull request #236 from original-solutions/t3/factory-issue-235
tomkaczocha Oct 26, 2026
3fe3815
Merge remote-tracking branch 'origin/main' into pr234-wt
rawphp Oct 26, 2026
f813e48
test: pin autodeploy's staleness limit at 31 and 29 minutes
rawphp Oct 26, 2026
07d1d08
Merge remote-tracking branch 'origin/main' into t3/factory-issue-227-1
rawphp Oct 26, 2026
2e9ef54
Merge pull request #234 from original-solutions/t3/factory-issue-228
tomkaczocha Oct 26, 2026
f7c19a8
fix: the marker refresher ends with its tick, and lint passes
rawphp Oct 26, 2026
3e9694b
Fix lint on the autodeploy wait: shorter comments, file-clock test times
rawphp Oct 26, 2026
bd2c9f3
Merge origin/t3/factory-issue-227-1: keep this branch's lint fixes
rawphp Oct 26, 2026
7ba7848
Merge pull request #237 from original-solutions/t3/factory-issue-227-1
tomkaczocha Oct 26, 2026
1559bef
test: a provider rate limit waits for a cooldown instead of going stuck
rawphp Oct 26, 2026
de5fc06
test: a rate-limited model moves to its fallback and holds back claims
rawphp Oct 26, 2026
58c5a33
test: a resume that moves a session sends its model and says so
rawphp Oct 26, 2026
2ebf23e
feat: a rate-limited session is told apart and resumed once, on a fal…
rawphp Oct 26, 2026
47e3cb5
feat: the pass backs a rate-limited model off instead of going stuck
rawphp Oct 26, 2026
ba9da61
docs: record how the factory waits out a provider rate limit
rawphp Oct 26, 2026
1fc9c14
test: review round 1 of the rate-limit cooldown
rawphp Oct 26, 2026
63c0e0a
fix: review round 1 of the rate-limit cooldown
rawphp Oct 26, 2026
59bd50b
test: review round 2 of the rate-limit cooldown
rawphp Oct 26, 2026
92ad5b3
fix: take the provider's retry-after as given, up to a day
rawphp Oct 26, 2026
ddbc83b
test: a rate limit after a quiet spell starts a new streak
rawphp Oct 26, 2026
cd5e13d
test: status runs carry last_event and title; runs list carries title…
rawphp Oct 27, 2026
9919aab
fix: a rate limit after a quiet spell starts a new streak
rawphp Oct 27, 2026
d10dbc6
test: the quiet rule goes by when the session ended
rawphp Oct 27, 2026
8124ebe
fix: the quiet rule goes by when the session ended
rawphp Oct 27, 2026
db13510
feat: record the issue title on launch; serve last_event, title and r…
rawphp Oct 27, 2026
3ad2ef6
test: a finished run's title is the first launch's, read without scan…
rawphp Oct 27, 2026
11482b8
test: pin the window's edge and the stale item on a fresh streak
rawphp Oct 27, 2026
88dd8d5
fix: read a finished run's title forwards from its start
rawphp Oct 27, 2026
cdeb0d7
chore: leave relaunch.ts as it was
rawphp Oct 27, 2026
71bdc90
test: the belt control station, its station mapping and the 5 second …
rawphp Oct 27, 2026
c6649e3
feat: the belt control station at the top of /factory
rawphp Oct 27, 2026
134b6cc
fix: cut recordRateLimit's comment to the lint cap
rawphp Oct 27, 2026
bc4484f
Trim cooldown docblock to 4 lines for no-low-value-comments lint
tomkaczocha Oct 27, 2026
e21c5aa
test: a run's title is its first launch's, and a long reason is capped
rawphp Oct 27, 2026
0eb70f3
test: a stale last pass reads "pass overdue", not a countdown at 0s
rawphp Oct 27, 2026
caf4431
test: the 5 second status poll keeps its period when the page renders…
rawphp Oct 27, 2026
cb42a43
fix: a stale last pass reads "pass overdue"; status fields older serv…
rawphp Oct 27, 2026
53eb4bc
fix: the 5 second status poll keeps one timer across renders
rawphp Oct 27, 2026
cb79fe9
fix: a run's title is its first launch's; cap the reason; shorten the…
rawphp Oct 27, 2026
e13cd28
test: the belt shows what it does not know, keeps its pick, and keeps…
rawphp Oct 27, 2026
9b2816c
fix: the belt shows what it does not know, keeps its pick, and keeps …
rawphp Oct 27, 2026
b458d65
fix: review round 1 of the rate-limit cooldown
rawphp Oct 27, 2026
a4cafb7
Merge remote-tracking branch 'origin/t3/factory-issue-238-2' into pr2…
rawphp Oct 27, 2026
c3cb37d
test: pin the belt's decisions: themes, slots, stop, fallbacks, ties …
rawphp Oct 27, 2026
5ad952b
test: the pause note keeps 4.5:1 contrast in light and dark
rawphp Oct 27, 2026
20a9cfe
fix: the pause note uses the 8% warning tint in light, as Badge does
rawphp Oct 27, 2026
a9b4caa
fix: belt.css sets its dark station colours with `@variant dark`
rawphp Oct 27, 2026
57668be
fix: a launch decided again writes its model over a step a crash left…
rawphp Oct 27, 2026
4085b0e
fix: lint: the poll test waits on a deferred, and the readout doc fit…
rawphp Oct 27, 2026
3896b5d
Merge pull request #241 from original-solutions/t3/factory-issue-238-2
tomkaczocha Oct 27, 2026
a8b61a5
Merge remote-tracking branch 'origin/main' into t3/factory-issue-239-1
rawphp Oct 27, 2026
509a655
test: the cooldown launch test expects the title on session_launched
rawphp Oct 27, 2026
4d1dd73
test: pin the belt's refresh-failure, header-count, reason-cap and PR…
rawphp Oct 27, 2026
a03da06
test: a failed recent list is named, not a stuck skeleton; every stop…
rawphp Oct 27, 2026
58203e1
fix: a failed recent list is named and left out of the belt; every st…
rawphp Oct 27, 2026
053e45a
fix: status reads a run file again only when it changed; belt Done/St…
rawphp Oct 27, 2026
2ce46c4
docs: drop the pre-belt Factory page and Needs attention captures fro…
rawphp Oct 27, 2026
edd9dda
Merge pull request #242 from original-solutions/t3/factory-issue-239-2
tomkaczocha Oct 27, 2026
5d7550c
test: a run that changes station slides on the belt and flashes its post
rawphp Oct 27, 2026
825568c
fix(factory): belt review fixes
rawphp Oct 27, 2026
84d9c1b
feat: a run that changes station slides along the belt and flashes it…
rawphp Oct 27, 2026
f03d46a
fix: check:changed on the belt motion (no manual memo, ref callback t…
rawphp Oct 27, 2026
edb4f12
test: two runs that leave one lane in the same poll each fly from whe…
rawphp Oct 27, 2026
fbf7d71
fix: measure every tile on a commit's first removal, so a lane closin…
rawphp Oct 27, 2026
f8ac167
Merge pull request #244 from original-solutions/t3/factory-belt-revie…
tomkaczocha Oct 27, 2026
cf9b421
test: a run that finishes between two polls parks, then flies to its bin
rawphp Oct 27, 2026
cbdde72
fix: a run that finishes between two polls parks where it stood, then…
rawphp Oct 27, 2026
1a0d6db
fix: shorter comments on the belt motion
rawphp Oct 27, 2026
74af2f7
Merge remote-tracking branch 'origin/main' into t3/factory-issue-240
rawphp Oct 27, 2026
395205d
test: a departed tile's place is remembered, not drawn; the data stor…
rawphp Oct 27, 2026
256dc45
fix: remember a departed tile's place instead of drawing it; refresh …
rawphp Oct 27, 2026
d23669c
fix: shorter comment on the motion's memory
rawphp Oct 27, 2026
227c31f
test: a dropped run re-reads only the recent runs list; a runs list t…
rawphp Oct 27, 2026
b2b4cde
fix: a dropped run re-reads only the recent runs list, which the bins…
rawphp Oct 27, 2026
549d86e
test: a run that drops off and comes back to its post fades in, with …
rawphp Oct 27, 2026
8429d10
fix: a run that comes back on the rail fades in; only a move between …
rawphp Oct 27, 2026
9d52c6d
fix: the motion's comments say only a bin uses a remembered place
rawphp Oct 27, 2026
1f6c65b
test: a dropped run flies from where it stood on the belt, though the…
rawphp Oct 27, 2026
619d02f
Merge pull request #247 from original-solutions/t3/factory-issue-240
tomkaczocha Oct 27, 2026
3ed5651
docs: the screenshot seed puts a run at every post of the belt
rawphp Oct 27, 2026
196a3ca
docs: Watch runs guide shows belt-era Factory page and Needs attentio…
rawphp Oct 27, 2026
acf8f2e
chore: knip:check passes with no unused exports in factory code
rawphp Oct 27, 2026
3942eb1
docs: the Factory page shot opens a post whose run shows its title
rawphp Oct 27, 2026
15a9b4a
Merge pull request #248 from original-solutions/t3/factory-issue-246
tomkaczocha Oct 27, 2026
4d58a6a
Merge pull request #249 from original-solutions/t3/factory-issue-245
tomkaczocha Oct 27, 2026
2117512
sync: v0.1.3-nightly.20261027.3748
rawphp Oct 27, 2026
287abf3
refactor(factory): meet the Effect diagnostics upstream now enforces
rawphp Oct 27, 2026
682878b
test(factory): keep Factory in the settings sidebar's Agents group
rawphp Oct 27, 2026
cad932f
fix(factory): meet the lint rules upstream now enforces
rawphp Oct 27, 2026
6a16f3b
Merge pull request #250 from original-solutions/t3/factory-issue-243
tomkaczocha Oct 27, 2026
e805666
test: the factory's gate time is not charged to a run's time limit
rawphp Oct 27, 2026
1c21531
test: cover worktree branch rename once every numeric suffix is taken
rawphp Oct 27, 2026
d1ed7c6
fix: fall back to a random suffix when a branch name's 100 suffixes a…
rawphp Oct 27, 2026
fb090b1
test: pin the suffix scan to the first free number from -1
rawphp Oct 27, 2026
3741a59
fix: the factory's own gate time no longer counts against a run's tim…
rawphp Oct 27, 2026
51fd6be
docs: the time limit does not count the factory's gate
rawphp Oct 27, 2026
fb0df6a
test: stage a random-suffix collision in the exhausted-suffix rename …
rawphp Oct 27, 2026
9ef366c
test: a pull request reported again after a send-back pauses the clock
rawphp Oct 27, 2026
9d6f25a
fix: keep the branch rename fix inside the fork's seam rules
rawphp Oct 27, 2026
dfff8de
fix: a pull request reported again after a send-back pauses the clock
rawphp Oct 27, 2026
ecc81df
test: a gate sent back restarts the clock at its own time
rawphp Oct 27, 2026
23f6cdc
fix: a gate sent back restarts the clock at its own time
rawphp Oct 27, 2026
02604f5
test: type the send-back line in the time-limit test
rawphp Oct 27, 2026
6a26f08
Merge pull request #253 from original-solutions/t3/factory-issue-251
tomkaczocha Oct 27, 2026
3834774
fix: a generated worktree branch is never a model's stand-in word
rawphp Oct 27, 2026
84707b6
Merge pull request #254 from original-solutions/t3/factory-issue-252
tomkaczocha Oct 27, 2026
01de792
feat: the factory prunes stale t3/* thread branches so branch names n…
rawphp Oct 27, 2026
e4588e3
Merge remote-tracking branch 'origin/main' into pr257-wt
rawphp Oct 27, 2026
3144cb8
Merge remote-tracking branch 'origin/main' into pr258-wt
rawphp Oct 27, 2026
a0c7e24
fix: reject stand-in branch names at the launch, for every provider
rawphp Oct 27, 2026
5530ebd
fix: branch prune keeps pruned commits, reports failures and spares s…
rawphp Oct 27, 2026
25c5347
fix: one hook for the launch title in ThreadLaunchService
rawphp Oct 27, 2026
0a78179
fix: branch prune draws its remote branches at random, so refused one…
rawphp Oct 27, 2026
097495e
Merge pull request #257 from original-solutions/t3/factory-issue-255
tomkaczocha Oct 27, 2026
83d7000
Merge remote-tracking branch 'origin/main' into pr258-wt
rawphp Oct 27, 2026
91ea5af
Merge pull request #258 from original-solutions/t3/factory-issue-256
tomkaczocha Oct 27, 2026
872420b
test: gh credential lookups retry and fall back; stalls say busy or s…
rawphp Oct 29, 2026
5d40714
fix: gh credential lookups survive event-loop stalls, and stalls say …
rawphp Oct 29, 2026
ea32642
test: review round 1, cover the layer, every log path and the boundaries
rawphp Oct 29, 2026
58d70ca
fix: review round 1, drop the unused import and append the kind last
rawphp Oct 29, 2026
2c6eafb
style: meet the repo lint on the new factory code
rawphp Oct 29, 2026
960b981
test: review round 1, pin the newer success and upstream's own creden…
rawphp Oct 29, 2026
0838ff2
test: review round 2, pin the server's credential process provision
rawphp Oct 29, 2026
9787337
test: review round 3, name the typecheck that pins the provision's po…
rawphp Oct 29, 2026
5fbf4f7
Merge pull request #262 from original-solutions/t3/gh-credential-stal…
tomkaczocha Oct 29, 2026
ccac912
sync: v0.1.4-nightly.20261029.3853
rawphp Oct 30, 2026
b520e5c
feat(factory): serve the client session list upstream dropped from HTTP
rawphp Oct 30, 2026
fca4a8d
fix(mobile): factory revoke and environment choice survive upstream's…
rawphp Oct 30, 2026
8d3cb16
fix(lint): factory http header and session decoder meet upstream's li…
rawphp Oct 30, 2026
3264a49
test(mobile): factory revoke reports a refused or undecodable session…
rawphp Oct 30, 2026
336ed43
test: a T3 project with no factory block is watched on the machine's …
rawphp Oct 30, 2026
348a9b1
feat: watch a T3 project with no factory block on the machine's defau…
rawphp Oct 30, 2026
c527df3
test: the pass and the settings report on a repo running on the default
rawphp Oct 30, 2026
4b26e7f
test: Settings → Factory marks a repo running on the default config
rawphp Oct 30, 2026
75cd6f4
feat: Settings → Factory marks a repo running on the default config
rawphp Oct 30, 2026
12cef54
docs: default_project and the inference table
rawphp Oct 30, 2026
0fc9417
test: review round 1 of the default block
rawphp Oct 30, 2026
7160845
fix: a defaulted repo asks GitHub first and is never made ambiguous
rawphp Oct 30, 2026
acf21b4
docs: default_project in the example config, README and rollback list
rawphp Oct 30, 2026
f86c15c
fix: type the default reading's result so the server typechecks
rawphp Oct 30, 2026
a1e0f3a
test: review round 2 of the default block
rawphp Oct 30, 2026
7e46a7d
fix: settings labels a repo by the config the pass ran on, and origin…
rawphp Oct 30, 2026
8031aaf
test: type the fake git's exit code
rawphp Oct 30, 2026
fb4264f
docs: where a defaulted repo's files come from, and what watching costs
rawphp Oct 30, 2026
cacb5ed
test: an error reading says whether it came from the default
rawphp Oct 30, 2026
e5bfed1
fix: an error reading says whether it is the default's or the repo's …
rawphp Oct 30, 2026
715e0d1
test: kill the mutation pass's two survivors
rawphp Oct 30, 2026
2e93538
Merge pull request #263 from original-solutions/t3/sync-nightly-confl…
tomkaczocha Oct 30, 2026
12acbfd
fix(lint): factory comments and timeout test meet upstream's lint rules
rawphp Oct 30, 2026
9ec6415
Merge pull request #265 from original-solutions/t3/project-missing-fa…
rawphp Oct 30, 2026
ed2eae8
sync: v0.1.6-nightly.20261030.3904
github-actions[bot] Oct 30, 2026
862f452
test: cover a waiting update's status, snooze and update now
rawphp Oct 30, 2026
7c9ea23
test: a session's own branch is bound when its head is the worktree's…
rawphp Oct 30, 2026
8f762f6
fix(mobile): ExpoObserve compiles under Xcode 26.3 again
rawphp Oct 30, 2026
6f92736
feat: report a waiting update, and let a person snooze it or install …
rawphp Oct 30, 2026
9de6952
revert: drop the expo-observe pnpm patch
rawphp Oct 30, 2026
d8e1bab
test: ExpoObserve builds in Swift 5 mode from a fork config plugin
rawphp Oct 30, 2026
63b7e6e
fix(mobile): ExpoObserve compiles under Xcode 26.3 again
rawphp Oct 30, 2026
b2c1af8
fix: a session that makes its own branch is not released as stuck pr-…
rawphp Oct 30, 2026
04f72eb
test: a snooze withdraws an earlier update now
rawphp Oct 30, 2026
f19affd
fix: a snooze withdraws an earlier update now
rawphp Oct 30, 2026
644248b
test: refuse a pull request another issue's run names, and cover the …
rawphp Oct 30, 2026
1f278c1
fix: never bind a pull request another issue's run names
rawphp Oct 30, 2026
30129c2
refactor: let the pass narrow a waiting deploy without a dead fallback
rawphp Oct 30, 2026
079e5d4
docs: the result-line rule names the other-run check
rawphp Oct 30, 2026
1002783
test: the ExpoObserve plugin rewrites the generated Podfile
rawphp Oct 30, 2026
74d9e0d
test: a sibling run's unreported pull request, and a worktree off the…
rawphp Oct 30, 2026
b2bf231
fix: a self-made branch binds only when no other run's worktree holds it
rawphp Oct 30, 2026
2cf16d7
refactor: read the clock once when weighing a waiting deploy
rawphp Oct 30, 2026
e45742a
test: pin the other-run checks review cycle 3 found loose
rawphp Oct 30, 2026
320b18b
refactor: drop the interruption branch from the other-run names
rawphp Oct 30, 2026
b62000a
test: an interruption's branch still counts after a relaunch moves on
rawphp Oct 30, 2026
d3e3ad0
fix: read the interruption's branch among another run's names again
rawphp Oct 30, 2026
8af9e65
test: another run's first branch counts after two relaunches
rawphp Oct 30, 2026
af662df
fix: read every branch another run's ledger names, not only the newest
rawphp Oct 30, 2026
71cebe1
Merge pull request #270 from original-solutions/t3/fix-ios-archive-ex…
tomkaczocha Oct 30, 2026
c557f69
fix(factory): update now installs only the build shown, and snoozes a…
rawphp Oct 30, 2026
2306bd5
Merge remote-tracking branch 'origin/main' into t3/release-self-branc…
rawphp Oct 30, 2026
75bf1ea
Merge pull request #271 from original-solutions/t3/factory-update-sno…
rawphp Oct 30, 2026
a924b52
test: the belt shows a waiting update with Snooze 1 hour and Update now
rawphp Oct 30, 2026
41fb18e
feat: the Factory page shows a waiting update, with Snooze 1 hour and…
rawphp Oct 30, 2026
be304d7
Merge remote-tracking branch 'origin/main' into pr272-wt
rawphp Oct 30, 2026
55c9e37
test: Update now asks when threads are uncounted, and the banner trac…
rawphp Oct 30, 2026
cea91bf
fix: Update now asks when threads are uncounted, and the banner track…
rawphp Oct 30, 2026
b28166c
test: each reason Update now asks has its own case, and a build swap …
rawphp Oct 30, 2026
e155746
fix: a failed read of another run waits a pass instead of releasing f…
rawphp Oct 30, 2026
5805e30
fix: a failed read of the session's own worktree waits a pass too, an…
rawphp Oct 30, 2026
c2b19df
Merge pull request #272 from original-solutions/t3/release-self-branc…
tomkaczocha Oct 30, 2026
f72383c
fix: Update now also asks while a pass runs, and a refusal stays with…
rawphp Oct 30, 2026
5455ce3
Merge remote-tracking branch 'origin/main' into pr273-wt
rawphp Oct 30, 2026
8ff288a
Merge pull request #273 from original-solutions/t3/factory-waiting-up…
tomkaczocha Oct 30, 2026
f6c8fd5
fix: snooze and Update now name the build the page showed
rawphp Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .dw/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# softfac (the Rust factory) reads this block from the default branch on every pass.
# Design and plan: factory/docs/design.md once issue #1 lands; issues #1 to #21.
factory:
instructors: [tomkaczocha, rawphp]
base: main
provision: [vp i]
gate: [factory/scripts/check.sh]
limits: { gate_retries: 2 }
autonomy: pr
72 changes: 72 additions & 0 deletions .github/workflows/factory-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: Factory CI

on:
pull_request:
branches:
- main
push:
branches:
- main
workflow_dispatch:

permissions:
contents: read

concurrency:
group: factory-ci-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

# This is the fork's own workflow. Upstream's workflows are disabled on this repo.
jobs:
check:
name: Check
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true

- name: Install
run: vp i

- name: Check
run: factory/scripts/check.sh

# Runs the command upstream's ci.yml Lint job runs. check.sh and the factory gate do not run it.
lint:
name: Lint
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true

- name: Install
run: vp i

- name: Lint
run: vp check
38 changes: 38 additions & 0 deletions .github/workflows/factory-desktop-preflight.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Factory desktop preflight

# Checks the macOS signing secrets in the desktop-release environment without
# printing them. Run it by hand after adding or rotating any of them. The checks
# live in factory/scripts/desktop-preflight.sh, which factory-desktop.yml also
# runs before every build.
on:
workflow_dispatch:

permissions:
contents: read

jobs:
preflight:
name: Signing secrets
runs-on: macos-15
timeout-minutes: 10
# The secrets live in this environment, which only main may deploy from,
# so a factory pull request from a branch in this repo never receives them.
environment: desktop-release
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/factory/scripts/
sparse-checkout-cone-mode: false

- name: Check signing secrets
env:
APPLE_TEAM_ID: ${{ vars.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
MACOS_PROVISIONING_PROFILE: ${{ secrets.MACOS_PROVISIONING_PROFILE }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
run: factory/scripts/desktop-preflight.sh
196 changes: 196 additions & 0 deletions .github/workflows/factory-desktop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
name: Factory desktop

# Builds the fork's macOS desktop app (arm64) on every push to main, signs and
# notarizes it with the Developer ID in the desktop-release environment, and
# publishes it as a prerelease on this repo. Installed apps follow those
# prereleases through their nightly update feed. Upstream's release workflows
# stay disabled; the mac build steps here are copied from release-desktop.yml.
on:
push:
branches:
- main
workflow_dispatch:

permissions:
contents: write

# Only the newest commit on main is worth publishing. A re-run gets a group of
# its own, so re-running an old run never cancels the build of a newer commit.
concurrency:
group: factory-desktop${{ github.run_attempt > 1 && format('-rerun-{0}', github.run_id) || '' }}
cancel-in-progress: true

jobs:
build:
name: Build, sign and publish (mac arm64)
runs-on: macos-15
timeout-minutes: 60
# The secrets live in this environment, which only main may deploy from.
environment: desktop-release
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

# Only the publish step needs the write token, and it uses gh, not git, so
# drop checkout's credentials before dependency install and build scripts
# run. persist-credentials: false would do this, but checkout then strips
# them with `git submodule foreach`, which fails hard on the gitlinks under
# .repos/alchemy-effect that have no .gitmodules entry.
- name: Drop checkout credentials
run: |
git config --local --name-only --get-regexp '^includeIf\.gitdir:' | while read -r key; do
git config --local --unset-all "$key"
done
rm -f "$RUNNER_TEMP"/git-credentials-*.config

- name: Retry stapler on dropped connections
run: echo "$GITHUB_WORKSPACE/factory/scripts/xcrun-retry" >> "$GITHUB_PATH"

- name: Check signing secrets
env:
APPLE_TEAM_ID: ${{ vars.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
MACOS_PROVISIONING_PROFILE: ${{ secrets.MACOS_PROVISIONING_PROFILE }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
run: factory/scripts/desktop-preflight.sh

- name: Setup Vite+
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1
with:
node-version-file: package.json
cache: true
run-install: false

- name: Install
run: vp i

- name: Setup Rust
uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable
with:
targets: aarch64-apple-darwin

- id: version
name: Resolve version
run: |
version="$(factory/scripts/desktop-version.sh "$GITHUB_RUN_NUMBER")"
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "Building $version"

- name: Align package versions to the build version
env:
VERSION: ${{ steps.version.outputs.version }}
run: node scripts/update-release-package-versions.ts "$VERSION"

- name: Build signed desktop artifact
env:
VERSION: ${{ steps.version.outputs.version }}
T3CODE_DESKTOP_UPDATE_REPOSITORY: original-solutions/t3code-factory
T3CODE_CLERK_PASSKEY_RP_DOMAINS: ${{ vars.CLERK_PASSKEY_RP_DOMAINS }}
APPLE_TEAM_ID: ${{ vars.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
MACOS_PROVISIONING_PROFILE: ${{ secrets.MACOS_PROVISIONING_PROFILE }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
run: |
set -euo pipefail
# electron-builder notarizes with APPLE_API_KEY as a path to the .p8.
key_path="$RUNNER_TEMP/AuthKey_${APPLE_API_KEY_ID}.p8"
printf '%s' "$APPLE_API_KEY" > "$key_path"
export APPLE_API_KEY="$key_path"

profile_path="$RUNNER_TEMP/t3code-factory.provisionprofile"
printf '%s' "$MACOS_PROVISIONING_PROFILE" | base64 -D > "$profile_path"
export T3CODE_APPLE_TEAM_ID="$APPLE_TEAM_ID"
export T3CODE_MACOS_PROVISIONING_PROFILE="$profile_path"

node scripts/build-desktop-artifact.ts \
--platform mac \
--target dmg \
--arch arm64 \
--build-version "$VERSION" \
--signed \
--verbose

- id: assets
name: Find build artifacts
run: |
set -euo pipefail
shopt -s nullglob
dmgs=(release/*.dmg)
zips=(release/*.zip)
if [[ ${#dmgs[@]} -ne 1 || ${#zips[@]} -ne 1 || ! -f release/nightly-mac.yml ||
! -f "${zips[0]}.blockmap" ]]; then
echo "::error::Expected one dmg, one zip with its blockmap and nightly-mac.yml in release/."
ls -la release
exit 1
fi
# Upstream's build script names assets T3-Code-<version>-<arch>. Renaming
# keeps the bytes, so only the manifest's urls change.
rename() {
local from=$1 to
to="release/T3-Code-Factory-${from#release/T3-Code-}"
mv "$from" "$to"
if [[ -f "$from.blockmap" ]]; then mv "$from.blockmap" "$to.blockmap"; fi
sed -i '' "s|^\( *- url: \)${from#release/}\$|\1${to#release/}|" release/nightly-mac.yml
grep -q "url: ${to#release/}\$" release/nightly-mac.yml ||
{ echo "::error::nightly-mac.yml has no url for ${from#release/}." >&2; exit 1; }
echo "$to"
}
dmg=$(rename "${dmgs[0]}")
zip=$(rename "${zips[0]}")
echo "dmg=$dmg" >> "$GITHUB_OUTPUT"
echo "zip=$zip" >> "$GITHUB_OUTPUT"

- name: Notarize and staple the dmg
env:
DMG: ${{ steps.assets.outputs.dmg }}
APPLE_TEAM_ID: ${{ vars.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
run: factory/scripts/desktop-notarize-dmg.sh "$DMG" release/nightly-mac.yml

- name: Verify signature, Gatekeeper and notarization
env:
DMG: ${{ steps.assets.outputs.dmg }}
ZIP: ${{ steps.assets.outputs.zip }}
run: factory/scripts/desktop-verify.sh "$DMG" "$ZIP"

# Created as a draft and published only once every asset is uploaded, so a
# failed upload never leaves a release an updater could follow.
- name: Publish prerelease
env:
GH_TOKEN: ${{ github.token }}
VERSION: ${{ steps.version.outputs.version }}
DMG: ${{ steps.assets.outputs.dmg }}
ZIP: ${{ steps.assets.outputs.zip }}
run: |
set -euo pipefail
# A re-run of an older run would otherwise publish stale code as the
# newest release, and installed apps would update back to it.
head="$(gh api "repos/$GITHUB_REPOSITORY/commits/main" --jq .sha)"
if [[ "$head" != "$GITHUB_SHA" ]]; then
echo "::warning::main is at $head now, not $GITHUB_SHA; not publishing."
exit 0
fi
tag="v$VERSION"
gh release create "$tag" \
--draft \
--prerelease \
--target "$GITHUB_SHA" \
--title "T3 Code Factory $VERSION" \
--notes "Nightly macOS (Apple Silicon) build of $GITHUB_SHA." \
"$DMG" "$DMG.blockmap" "$ZIP" "$ZIP.blockmap" release/nightly-mac.yml
gh release edit "$tag" --draft=false
75 changes: 75 additions & 0 deletions .github/workflows/factory-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
name: Factory docs

# Builds the docs site in factory/site on pull requests, and deploys it to GitHub Pages from main.
on:
pull_request:
paths:
- factory/site/**
- .github/workflows/factory-docs.yml
push:
branches:
- main
paths:
- factory/site/**
- .github/workflows/factory-docs.yml
workflow_dispatch:

permissions:
contents: read

concurrency:
group: factory-docs-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
build:
name: Build
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: factory/site
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: factory/site

- name: Setup Node
uses: actions/setup-node@v7
with:
node-version: 24
cache: npm
cache-dependency-path: factory/site/package-lock.json

- name: Install
run: npm ci

- name: Build
run: npm run build

- name: Upload Pages artifact
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
uses: actions/upload-pages-artifact@v5
with:
path: factory/site/.vitepress/dist

deploy:
name: Deploy
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
needs: build
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deploy.outputs.page_url }}
steps:
- name: Configure Pages
uses: actions/configure-pages@v6

- name: Deploy
id: deploy
uses: actions/deploy-pages@v5
Loading
Loading