Repository navigation
chore: sync upstream v0.1.3 (T3O-74) - #199
Conversation
…gdotgg#25128) Co-authored-by: Claude Opus 5.5 <[email protected]>
…pened (pingdotgg#25133) Co-authored-by: Claude Opus 5.5 <[email protected]>
…gdotgg#25126) Co-authored-by: Claude Opus 5.5 <[email protected]>
… every render (pingdotgg#25134) Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
…ingdotgg#25145) Co-authored-by: Claude Opus 5.5 <[email protected]>
…he Duo fold composer (pingdotgg#25141) Co-authored-by: Claude Opus 5.5 <[email protected]>
…cing it (pingdotgg#25068) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ingdotgg#25067) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ffects (pingdotgg#25079) Co-authored-by: Claude Opus 5.5 <[email protected]>
…a a shared deadline clock (pingdotgg#25005) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ngdotgg#25164) Co-authored-by: Claude Opus 5.5 <[email protected]>
…the budget (pingdotgg#25163) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ingdotgg#25170) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ngdotgg#25169) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ingdotgg#25009) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ngdotgg#25008) Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: Claude Opus 5.5 <[email protected]>
…ingdotgg#21383) Co-authored-by: Claude Opus 5.5 <[email protected]>
… reconnect (pingdotgg#25712) Co-authored-by: Claude Opus 5.5 <[email protected]>
…ingdotgg#25731) Co-authored-by: Claude Opus 5.5 <[email protected]>
…s refetch by construction (pingdotgg#25732) Co-authored-by: Claude Opus 5.5 <[email protected]>
…5753) Co-authored-by: Claude Opus 5.5 <[email protected]>
…idget stops re-rendering on every presentation change (pingdotgg#25740) Co-authored-by: Claude Opus 5.5 <[email protected]>
…achable environment (pingdotgg#25703) Co-authored-by: Claude Opus 5.5 <[email protected]>
… pickers drop timer and sync effects (pingdotgg#25733) Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
pingdotgg#25766) Co-authored-by: Claude Opus 5.5 <[email protected]>
Merge upstream release v0.1.3 into t3o. Conflicts resolved as upstream's code with each T3o seam re-seated; judgment calls are recorded in docs/t3o/seams.md (v0.1.3 sync notes). Co-Authored-By: Claude Opus 5.5 <[email protected]>
… projection_state Upstream v0.1.3's migration 063 drops main.projection_state, so board migration 031's watermark carry-over failed on any new install. Skip the carry-over when the table is gone. Also port the deleted MCP registration test into a board-owned test. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…d settings pages seams.md gains the v0.1.3 sync notes and its inventory, workflow and debt tables are brought up to date. Settings → Connections is now Settings → Environments upstream, and authorized clients moved to Sharing & access, so the board's worker copy and guide say so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ream) Co-Authored-By: Claude Opus 5.5 <[email protected]>
…rule Upstream pingdotgg#24610 holds a monitor only when the agent waits on it; the board's thread state delegates to that rule, so its tests mark the monitor awaited and cover the unawaited case. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ep timing Upstream's VcsProcess sets safe.bareRepository=explicit, so reading the bare test remote needs --git-dir. The draft-merge test advanced the clock to exactly the rung's end, between two sweep ticks; it now waits one tick past it, which is what the behaviour promises. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
brentkelly
left a comment
There was a problem hiding this comment.
High-level summary
This PR merges upstream v0.1.3 into t3o as a two-parent merge commit with six follow-up commits. It re-seats every T3o seam on upstream's reworked code: gitenv now sits on GitHubRequestPolicy.credential and the GraphQL batchKey, the T3O-8/T3O-54 scope fallback is rebuilt on upstream's generated operations, and the board settings route, worker prefill, Tiptap destroyed-editor guard and migration 031 are updated for upstream's changes. Fork-only lint and Effect-diagnostic deferrals sit in clearly marked override blocks.
I traced the riskiest seams end to end:
checksUnreadstill reachesboardMergeStatethrough the provider's spread.- The summary fallback's filled
commits: {nodes: []}decodes tochecksState: null(unknown), not "passing". isMissingScopeRefusalmatches theGitHubApiResponseErrorthat upstream'sfromClientErrorproduces.- The Add environment prefill isn't clobbered by the dialog's open handler.
- Migration 031 now skips the carry-over cleanly when upstream has dropped
projection_state.
The merge looks sound. This round has one improvement and one nitpick. The improvement is a board test whose clock advance was widened during the sync with a rationale that doesn't hold for one of the two tests. The nitpick is board copy that still names the old "Connections" page. Nothing else blocks.
| // The click came 20s in, so its rung ends between two 30s sweep ticks: | ||
| // the retry fires on the next tick after it. | ||
| yield* TestClock.adjust(Duration.sum(RUNG_ONE, Duration.seconds(30))); |
There was a problem hiding this comment.
Warning
Improvement (1/1): merge-retry tests were loosened by a full sweep tick, with a rationale that doesn't hold for this test
Before the sync, both draft-merge tests passed with TestClock.adjust(RUNG_ONE). Upstream's changes broke that, and the fix pads each by 30s. The comment justifies this with "The click came 20s in", which is true only of the second test (line 276), where TestClock.adjust(Duration.seconds(20)) comes before the click. In this test the click happens at t=0 with no prior adjust, so by the comment's own reasoning the rung would end on a sweep tick and RUNG_ONE should still be enough.
The build notes also describe this as "the timing one", rerun 8/8 times. Under TestClock that hints at a scheduling race rather than a deterministic offset. Padding the advance hides the cause, and it would also hide a real regression where the soft-hold retry fires up to a sweep late, or depends on fiber ordering after upstream's reactor/worker changes.
Suggested fix: Find out why exactly RUNG_ONE no longer fires after the merge (for example, log retryAt against the sweep schedule). Then either restore the exact advance with the real fix, or assert on autoMergeHold.retryAt and advance to precisely that instant plus one tick. Make the comment true for each test.
There was a problem hiding this comment.
Fixed in 026d9bf. Root cause: the auto-merge retry has no timer of its own. It fires from the reactor's 30s sweep (supervisorReactor.ts, Effect.sleep("30 seconds") loop from t=0), and retryAt is 3m ±60s of jitter, so it is always under 4m after the click.
- Click at t=0: the rung ends before 4m and the 4m tick picks it up, so
RUNG_ONEis enough. The padding is reverted. - Click at t=20s: the rung ends by 4m20s, and
RUNG_ONEfrom the click lands exactly there, between ticks. The first tick that is guaranteed is 4m30s, so the test now advancesRUNG_ONE + 10s: the exact minimum across the whole jitter envelope. The comment says that.
Ran draftPullRequests.test.ts 5×: 14/14 each time.
There was a problem hiding this comment.
Adjudication, round 1: fix-upheld. I checked this at the line. The retry has no timer of its own. It fires on the reactor's Effect.sleep("30 seconds") sweep (supervisorReactor.ts:9037), and jittered spreads it by ±60s (supervisorReactor.ts:3984), so rung one lands at most 4m after the click. The click-at-0 test is back to RUNG_ONE (4m = a tick). The click-at-20s test advances RUNG_ONE + 10s, which reaches the 4m30s tick: the first tick at or after the latest possible retryAt of 4m20s. It has no extra padding and its comment is accurate. draftPullRequests.test.ts passed 14/14 in each of 5 runs I did myself.
| @@ -54,7 +54,7 @@ export function workerStatusPresentation( | |||
| label: "Access revoked", | |||
| detail: `Revoked in ${worker.label}'s Connections`, | |||
There was a problem hiding this comment.
Note
Nitpick (1/1): board copy still names the old "Connections" page
The sync renamed most worker copy to upstream's new page names. Upstream's SETTINGS_SECTION_LABELS now labels /settings/connections as "Environments" and moves clients under "Sharing & access". A few user-visible strings were missed:
- this
detail("Revoked in …'s Connections") apps/web/src/board/workers/threadWorker.ts:131("Add it under Connections on this device")apps/web/src/board/BoardServerSettings.tsx:87and:135("Pair with the central board server in Connections", "Open Connections")
There's also a stale doc comment at apps/server/src/board/workers/workerCredential.ts:138 ("Settings → Connections → Clients"). Users will look for a page label that no longer exists.
Suggested fix: Change these to "Environments", or "Sharing & access → Authorized clients" for the revoked-access detail, matching the rest of the renamed copy.
There was a problem hiding this comment.
Fixed in the copy commit (HEAD 03901c5). workerCopy.ts:55 now reads "Revoked in 's Sharing & access". threadWorker.ts:131 and BoardServerSettings.tsx:87 say Environments, and the button there reads "Open Environments". workerCredential.ts:138 now says Settings → Sharing & access → Authorized clients. The remaining 'Connections' doc comments in threadWorker.ts and connectionsPrefill.ts also say Environments. Route paths (/settings/connections) and identifiers are unchanged, because upstream kept the route.
There was a problem hiding this comment.
Adjudication, round 1: fix-upheld. All the strings the finding listed are updated in f825455: workerCopy.ts, threadWorker.ts, BoardServerSettings.tsx (the description and the button), and the workerCredential.ts doc comment. One doc comment is left over and doesn't block: boardWorkersState.ts:24 still says "the worker's Connections list". That list is now Sharing & access → Authorized clients.
…past the rung The click-at-0 test needs only RUNG_ONE; the click-at-20s test needs the tick at 4m30s, ten seconds past RUNG_ONE from the click, across the whole ±60s jitter envelope. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ccess pages Co-Authored-By: Claude Opus 5.5 <[email protected]>
boardThreadState.test.ts follows upstream's awaited?: true schema, and boardWorkspace.ts drops a no-control-regex disable the rule no longer needs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
brentkelly
left a comment
There was a problem hiding this comment.
High-level summary — round 2 (re-review at 03901c5)
This PR merges upstream v0.1.3 into t3o and re-seats the fork's seams: the gitenv credential and batchKey, the GitHub scope fallback rebuilt on upstream's generated operations, migration 031's guard for upstream dropping projection_state, the board MCP registration test, the settings-route moves, and the worker copy. Both round-1 fixes hold at this head. The draft-merge tests now advance exactly to the first 30s sweep tick that can follow the jittered rung, and the board copy names Environments and Sharing & access. Reading the merge with fresh eyes turned up one new improvement. The fork's root test.maxWorkers: 4 conflicts with the root projects list that upstream added in this release. From the repo root, any vp test run that touches both the root project and a package project now fails before running a single test, and so does the test step of vp run check:changed. Triage put that failure down to something this card didn't touch, but this merge is what causes it. There are also two nitpicks: the board's lint override switches off two test-hygiene rules alongside the style rules, and one doc comment still says "Connections". That makes 1 blocking improvement and 2 non-blocking nitpicks.
Status of round-1 findings
| # | prior finding | status |
|---|---|---|
| 1 | 🟡 Merge-retry tests were loosened by a full sweep tick, with a rationale that doesn't hold for one test | ✅ closed. The click-at-0 test is back to RUNG_ONE. The click-at-20s test advances RUNG_ONE + 10s, the exact distance to the 4m30s tick, and its comment is accurate. |
| 2 | 🟢 Board copy still names the old "Connections" page | ✅ closed. One leftover doc comment, boardWorkersState.ts:24, is raised below as a nitpick. |
Findings GitHub can't anchor inline
This PR changes 6,242 files, and GitHub's review API only resolves the first 3,000. vite.config.ts falls outside that, so these two findings can't be inline comments. Each one gives its exact file and lines instead.
vite.config.ts:102-107
Warning
Improvement (1/1): the root maxWorkers: 4 breaks repo-root test runs against upstream's new projects list
Upstream v0.1.3 added a root test.projects list, used when isRepoRootTestRun. It holds every package in TEST_CONFIG_PACKAGES plus a root project with extends: true. The root project inherits this fork-only maxWorkers: 4, but @t3tools/web (unit) and the other package projects do not. Vitest refuses to mix projects that have different maxWorkers and the same sequence.groupOrder. Reproduced at this head:
$ vp test run packages/shared/src/boardThreadState.test.ts apps/web/src/board/workers/workerCopy.test.ts
Error: Projects "@t3tools/web (unit)" and "root" have different 'maxWorkers' but same 'sequence.groupOrder'.
Test Files no tests
With line 107 removed, the same command passes 2 files and 18 tests. origin/t3o has no root projects, so the merge introduced this break. It takes out the test step of vp run check:changed, which runs one root vp test run across all the changed packages. That is the pre-push gate in AGENTS.md, and this repo runs no CI checks on the PR to catch it instead. The triage note filed it as "not touched by this card", but the fork's seam colliding with upstream's new config is exactly what this card has to resolve.
Suggested fix: keep the memory bound without making projects disagree. Apply pool/maxWorkers only when !isRepoRootTestRun (package runs and vp run -r test still get it). Or give the root project its own sequence.groupOrder. Then record the decision in the seams.md v0.1.3 notes, and rerun vp run check:changed to confirm the test step runs.
vite.config.ts:667-668 (and :698)
Note
Nitpick (1/2): the board lint deferral also switches off two test-hygiene rules
This block is described as deferring upstream's style rules (tokens, React Compiler, copy), and T3O-75 removes it later. It also switches off t3code/no-wall-clock-in-tests and t3code/no-real-time-wait-in-tests for all of apps/web/src/board/**. The server block at line 698 does the same for wall-clock checks. Those two rules prevent flaky tests rather than enforce style. While the override stands, any new board test can sleep or read Date.now() without lint objecting. Only 8 existing call sites trip them: 5 in BoardCardItem.test.tsx, plus boardCardNotice.test.ts:232, BoardModeTabs.test.ts:49 and gitenv.test.ts:137.
Suggested fix: fix those 8 sites, or put per-line oxlint-disable-next-line directives with a reason on them. Then drop the two rules from both override blocks, so the deferral covers only style rules.
| @@ -25,19 +25,21 @@ export class WorkerEnvironmentNotConnected extends Data.TaggedError( | |||
| */ | |||
There was a problem hiding this comment.
Note
Nitpick (2/2): leftover "Connections" in a doc comment
Round 1 renamed the board copy to upstream's page names. The doc comment just above, at line 24, still says the worker's "Connections list". The board's session now appears under Settings → Sharing & access → Authorized clients on the worker. The round-1 adjudication noted the same thing.
Suggested fix: change it to "so the worker's Sharing & access → Authorized clients list names it."
There was a problem hiding this comment.
Fixed in 8cf062e. The comment now says the worker's Authorized clients list (Sharing & access → Authorized clients), which matches workerCredential.ts. I grepped the board's web, server and user docs for Connections list, Connections page and Connections settings, and nothing else turned up.
….3 sync The fork's root maxWorkers cap clashed with upstream's new root test.projects list, so it now applies only to per-package runs. The board lint deferral no longer switches off the wall-clock and real-time-wait test rules; the eight board test sites that tripped them use fixed epochs or the router's load promise. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
Triage, round 2. This covers the two findings posted in the review body, because GitHub can't anchor vite.config.ts in this diff. Everything is in 8cf062e. r2-improvement-1: root r2-nitpick-1: the board lint deferral switched off test-hygiene rules. Fixed.
|
|
Round 2 adjudication (8cf062e)
|
brentkelly
left a comment
There was a problem hiding this comment.
High-level summary — round 3 (re-review at 8cf062e)
This PR merges upstream v0.1.3 into t3o. It re-seats every T3o seam: gitenv on GitHub request policy, the scope fallback on the generated GraphQL operations, board migration 031, the settings routes and the worker prefill. It also adjusts the fork's test and lint config so they fit upstream's new tooling. This round re-reviewed the latest triage commit (8cf062e0f5) and re-checked the whole diff for leftover conflict markers and mis-cased T3O: markers. The cap in vite.config.ts now applies only to per-package runs, which matches the vp run -r --concurrency-limit 1 test path it was written for. The eight board test sites now pin their clocks instead of reading wall time. BoardModeTabs.test.ts now awaits router.latestLoadPromise. I checked that against TanStack router-core 1.171.8: with no history subscribers, commitLocation calls load() synchronously, so the promise is set before the test awaits it. From the repo root, the touched tests plus the draft-merge retry suite pass: 5 files, 108 tests, and the groupOrder error is gone. There are no new findings this round, so nothing blocks. The open items are the ones the build already flagged: the manual browser checklist, disabling the three inherited workflows after landing, and landing with a merge commit rather than a squash.
Status of round-2 findings
| # | Prior finding | Status |
|---|---|---|
| 1 | 🟡 Root maxWorkers: 4 breaks repo-root test runs against upstream's projects list |
✅ closed |
| 2 | 🟢 Board lint deferral also switches off test-hygiene rules | ✅ closed |
| 3 | 🟢 Leftover "Connections" in the boardWorkersState.ts doc comment |
✅ closed |
Syncs upstream release
v0.1.3intot3o(T3O-74). Upstream had moved 2,264 commits past ourv0.1.0base, and a trial merge hit about 70 conflicts.Land this with a merge commit, never a squash. The two-parent merge is what keeps future upstream syncs conflict-free.
How:
maintov0.1.3and merged it as a two-parent commit. Re-seated every T3o seam or retired it on purpose. The decisions are recorded indocs/t3o/seams.md.GitHubRequestPolicy.credentialandGitHubGraphQlClient.batchKey. The scope fallback is rebuilt on upstream's generated GraphQL operations.projection_state. A fresh-DB regression test covers it._chat.settings.board.tsx. The workeraddHostprefill moved to_chat.settings.connections.tsx/AddEnvironmentDialog.Follow-ups after landing: disable
relay-preview.yml,relay-preview-cleanup.ymlandstale-needs-more-info.yml, then pushmainand the tag as the runbook describes.Manual checklist (no browser pass yet): board with New design on and off; card detail; Board settings from the settings modal; a worker thread's "Open Settings → Environments" link opening Add environment prefilled.
Claude Opus 5.5 via Claude Code (T3o board).
🤖 Generated with Claude Code