Repository navigation
refactor(board): ThreadGateway, one seam for all board→thread access - #181
Conversation
…O-58, WIP) Adds board/ThreadGateway.ts (board-vocabulary commands, reads and signals) and ThreadGatewayV1, which wraps today's v1 engine, projection, provider and SQL reads one for one. Re-points the supervisor reactor, board engine, todo-cache tail, board RPC, MCP board toolkit, worktree retirer, pull-request gateway and usage-limit detector at it. Test suites follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and boundary suites (T3O-58, WIP) The supervisor harness drops its engine, snapshot and provider stubs for one in-memory ThreadGateway; its signal builders speak ThreadSignal. Adds the gateway contract suite on the real v1 stack and a source-level boundary test that only ThreadGatewayV1 reaches upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hanging (T3O-58, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every board suite now speaks gateway calls (thread.spawn, thread.send, thread.interrupt, thread.settle, thread.delete), BoardThreadState and ThreadSignal instead of v1 commands, shells and engine events. Stubs of upstream's engine, snapshot query and provider are gone from the supervisor and PR-gateway suites. Adds unit coverage for the v1 shell-to-state rules that moved out of the reactor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brentkelly
left a comment
There was a problem hiding this comment.
High-level summary
This PR puts every board→thread interaction behind a board-owned ThreadGateway service with one implementation, ThreadGatewayV1, that wraps the v1 engine, projections and provider stream. It re-points the supervisor reactor, the decider context, the todo tail, the orphan sweep, board RPC, the MCP board toolkit, worktreeRetire, the PR gateway and the usage-limit detector onto it. The harness now runs on an in-memory fake, and a boundary test holds the import/SQL line. The shape is good: the vocabulary really is the board's, the signal mapping is a faithful move of the old reactor branches, and the boundary test is a sharp instrument. Most of the wrapper is 1:1 as claimed, but not all of it. This round has three improvements and two nitpicks. The most important is that settle({auto: true}) now stamps snapshotSequence at dispatch time, which turns the engine's optimistic-concurrency guard on automatic settles into a no-op. projects() now materialises the whole command read model where the decider used to run a single cheap query. The in-memory fake's delete also leaves a thread readable as live, which contradicts the contract the harness is supposed to pin. None of these is an incident on its own, but the first is a behaviour change hidden inside a refactor that was meant to change no behaviour.
| settle: (input) => | ||
| input.auto | ||
| ? Effect.gen(function* () { | ||
| yield* run({ | ||
| type: "thread.auto-settle", | ||
| commandId: input.commandId, | ||
| threadId: input.threadId, | ||
| snapshotSequence: yield* engine.latestSequence, | ||
| settledAt: yield* nowIso, | ||
| }); | ||
| }) | ||
| : run({ type: "thread.settle", commandId: input.commandId, threadId: input.threadId }), |
There was a problem hiding this comment.
Warning
Improvement (1/3): auto-settle's snapshotSequence is read at dispatch time, which disables the engine's change-since-snapshot guard
OrchestrationEngine.dispatch refuses a thread.auto-settle when eventStore.hasEventAfter({ aggregateId: threadId, sequenceExclusive: command.snapshotSequence }), giving the error "changed before automatic settlement". The guard exists so that a settle decided against a stale view of the thread is refused. Before this PR, the release sweep took model.snapshotSequence from the read model it loaded at the top of the pass, before it read the shell and evaluated isAutoSettlementCandidate. The sequence therefore bounded the view the decision was made on.
settle({ auto: true }) now reads engine.latestSequence here, after the caller has already evaluated autoSettleCandidate in a separate threadState read (supervisorReactor.ts:767-776). Any thread event that lands between the candidacy read and the dispatch is now before the stamped sequence, so the guard can never fire. Picture a human sending a message that completes quickly, or a new activity row that would reset the inactivity window. The decider's session/pending-request checks still catch a thread that is visibly busy at dispatch, but the "changed since you looked" protection is gone. This is a behaviour change in a PR whose contract is a 1:1 wrap.
Suggested fix: keep the sequence bound to the view the decision was made on. The simplest option within the current interface is for V1's auto-settle to capture engine.latestSequence first, then re-read the shell and re-check isAutoSettlementCandidate, then dispatch with the captured sequence. Alternatively, carry an opaque stateRef on BoardThreadState and pass it back through ThreadSettleInput. Add a contract test in which a thread event lands after the candidacy read and the auto-settle is refused.
There was a problem hiding this comment.
Fixed in c0ad107. settle({auto: true}) now reads the projection's getSnapshotSequence() first, then re-reads the shell and re-checks isAutoSettlementCandidate. It refuses a non-candidate, and otherwise dispatches with the sequence it captured first. Any event the thread logs after that sequence trips the engine's hasEventAfter guard again, as it does in upstream's ThreadSettlementReactor. Doing the check inside V1 keeps the interface free of a v1 sequence number. Test: ThreadGatewayV1.contract.test.ts › "an automatic settle refuses a thread that is no longer a candidate" snoozes a candidate thread and expects a refusal. It failed before this change (the settle landed) and passes now.
There was a problem hiding this comment.
Adjudication (round 1): fix-upheld. Checked c0ad107. settle({auto}) now reads getSnapshotSequence() first, then re-reads the shell and re-checks isAutoSettlementCandidate, and dispatches with the sequence it captured first. A change after the re-read now trips the engine's hasEventAfter guard. A change between the caller's read and the re-read is caught by the re-check. The new contract test (a snoozed thread is refused) passes. It would have failed before, because without the re-check the engine accepts a settle on a snoozed thread.
| projects: () => | ||
| snapshotQuery.getCommandReadModel().pipe( | ||
| Effect.map((model) => | ||
| model.projects.map((project) => ({ | ||
| id: project.id, | ||
| title: project.title, | ||
| workspaceRoot: project.workspaceRoot, | ||
| deleted: project.deletedAt !== null, | ||
| scripts: project.scripts, | ||
| })), | ||
| ), | ||
| Effect.mapError(readError("projects")), | ||
| ), |
There was a problem hiding this comment.
Warning
Improvement (2/3): projects() materialises the full command read model, and the decider now pays for it on every create/set-project
getCommandReadModel() reads every project, thread, proposed plan, thread PR, session and latest turn in one transaction. projects() keeps only model.projects and throws the rest away. Before this PR, loadDecisionContext used boardUpstreamReads.listProjects, which was a single SELECT id, title, deleted_at FROM main.projection_projects. Now every board.card.create and board.card.set-project dispatch loads the whole read model inside the board engine's command path (BoardEngine.ts:114-122). That is the path plan approval uses to create child cards in a burst. board_create_card reads it twice: once in listProjects and once in the decider. worktreeRetire also went from one read-model load to two, because threadsInWorktree and projects each call getCommandReadModel() (worktreeRetire.ts:491-498). Performance is a stated non-negotiable for this repo, and on a mature install the thread set is the large part of that read.
Suggested fix: back projects() with a direct projects query (the old listProjectRows SQL or a projects-only snapshot read) instead of getCommandReadModel(). Optionally let threadsInWorktree filter in SQL on worktree_path, so retirement does not load every thread either.
There was a problem hiding this comment.
Fixed in 1a232f5. projects() is now one SELECT on projection_projects (id, title, workspace_root, deleted_at, scripts_json). That is the old boardProjects query plus the two columns worktreeRetire's hooks need. The decider context and board_create_card no longer load the read model. worktreeRetire is back to one full read (threadsInWorktree), the same as before this PR. The contract suite now also asserts scripts.
There was a problem hiding this comment.
Adjudication (round 1): fix-upheld. Checked 1a232f5. projects() is now a single projection_projects SELECT, and the read model is no longer hydrated. Scripts are decoded with fromJsonString(Array(ProjectScript)). The contract suite asserts scripts and passes.
| delete: (input) => | ||
| Effect.gen(function* () { | ||
| yield* record({ type: "thread.delete", ...input }); | ||
| yield* Ref.update(records, (current) => { | ||
| const next = new Map(current); | ||
| next.delete(String(input.threadId)); | ||
| return next; | ||
| }); | ||
| }), |
There was a problem hiding this comment.
Warning
Improvement (3/3): the fake's delete leaves the thread readable as alive, which contradicts the gateway contract
delete removes the entry from records but leaves states alone, so threadState(id) still returns the fixture's state after a delete: deleted: false, and alive: true if it was mid-turn. ThreadGatewayV1.threadState returns deleted: true, alive: false for a deleted thread, and the interface says "One thread, deleted ones included". The fake was introduced so that the harness tests pin the board's behaviour against the contract and survive the v2 merge. A fake that disagrees with V1 on a basic transition means a supervisor path that deletes a thread and then reads it back, such as card deletion, project change or spawn cleanup, is exercised against a state the real gateway never produces. Tests can then pass for the wrong reason.
Suggested fix: on delete, also replace the thread's state with the same deleted shape V1 returns (deleted: true, alive: false, sessionStatus: "none", …). Mirror that in records too (deleted: true instead of removal), so threadRecords matches V1, which keeps deleted rows.
There was a problem hiding this comment.
Fixed in eb933d2. The fake's delete now keeps the record, marked deleted: true, and replaces the state with deletedThreadState(...). That builder is now exported from ThreadGateway.ts, and V1 uses the same one, so the two can't drift apart. exists (the send precondition) now treats a deleted thread as gone, matching the engine. All 93 board and MCP-board files pass (1,391 tests).
There was a problem hiding this comment.
Adjudication (round 1): fix-upheld. Checked eb933d2. On delete, the fake now marks the record deleted and stores deletedThreadState(). That builder is shared with V1, so the two can't drift apart. exists also treats deleted threads as gone. The full board suite passes: 91 files, 1,302 tests.
| // A step going back to the build queue (T3O-23). Emitted by every | ||
| // recovery too, which is a handful of events an hour at most — far | ||
| // below the volume that made `thread.activity-appended` need its own | ||
| // pre-filter above. |
There was a problem hiding this comment.
Note
Nitpick (1/2): stale comment points at a pre-filter that no longer exists
The comment justifies board.card-step-recovered by comparison with "the volume that made thread.activity-appended need its own pre-filter above". That pre-filter moved into ThreadGatewayV1.observe, and this stream now carries only board events.
Suggested fix: drop the comparison, or point it at the gateway's filter in ThreadGatewayV1.ts.
There was a problem hiding this comment.
Fixed in 349ed37. The comment now points at ThreadGatewayV1.observe, which is where thread activity gets filtered.
There was a problem hiding this comment.
Adjudication (round 1): fix-upheld. The comment now points at ThreadGatewayV1.observe, where the thread-activity filtering actually happens.
| }).pipe( | ||
| // The thread exists but will never run a turn. Delete it rather than | ||
| // leave an empty thread in the sidebar for a run that never started — | ||
| // the same cleanup the WS bootstrap path performs. An interrupt is a | ||
| // teardown, not a refusal, so it does not compensate. | ||
| Effect.tapError(() => | ||
| run({ | ||
| type: "thread.delete", | ||
| commandId: CommandId.make(`${input.commandId}:cleanup`), | ||
| threadId: input.threadId, | ||
| }).pipe(Effect.ignore), | ||
| ), | ||
| ); |
There was a problem hiding this comment.
Note
Nitpick (2/2): the spawn compensation is now a gateway contract, but it is untested
ThreadGatewayShape.spawn documents that "A thread whose first turn is refused is deleted again", and v2 will have to honour that. Neither the contract suite nor any other test covers this tapError → thread.delete path, which the build summary also acknowledges. The old reactor code was untested too, so this is no regression. But this is the moment the behaviour became an interface promise, so it is the cheapest time to pin it.
Suggested fix: add a ThreadGatewayV1 test with a stub OrchestrationEngineService whose dispatch refuses thread.turn.start. Assert that a thread.delete with the :cleanup command id follows and that spawn fails with ThreadCommandRefusedError.
There was a problem hiding this comment.
Fixed in 349ed37. New test ThreadGatewayV1.test.ts › "a refused first turn deletes the thread it created and reports the refusal". It runs makeThreadGatewayV1 against a mocked engine that refuses thread.turn.start, and asserts the dispatch sequence create → :turn → :cleanup delete, plus a ThreadCommandRefusedError.
There was a problem hiding this comment.
Adjudication (round 1): fix-upheld. The new ThreadGatewayV1.test.ts case runs a mocked engine that refuses thread.turn.start. It asserts the dispatch order create → :turn → :cleanup delete and a ThreadCommandRefusedError, and it passes.
…ed first (T3O-58) Review r1-i1. The engine's changed-since-snapshot guard was disabled because the sequence was read at dispatch time, after the caller's candidacy read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ad model (T3O-58) Review r1-i2. The decider context and worktreeRetire paid for a full command read model on every project-bearing command; back to one projects-only query. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…deleted (T3O-58) Review r1-i3. One deletedThreadState builder now serves V1 and the fake, so the two cannot disagree on what a deleted thread reads as. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e comment (T3O-58) Review r1-n2 and r1-n1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brentkelly
left a comment
There was a problem hiding this comment.
High-level summary — round 2 (re-review at 349ed37)
This PR moves every board→thread interaction behind one board-owned ThreadGateway, with a ThreadGatewayV1 that wraps the v1 engine, projection reads, provider stream and settlement policy. It re-points the supervisor reactor, decider context, todo tail, MCP board tools, board RPC, PR gateway, usage-limit detector and worktree retirer onto that gateway, and runs the harness on an in-memory fake. I re-read the gateway, V1 and the re-pointed callers against board/t3o-55. Spawn, settle and refusal classification match the old dispatchLanded / dispatchOptional semantics. The thread-signal fan-in matches what the two old forked subscriptions delivered. The todo tail's cursor and catch-up logic is unchanged apart from vocabulary. All five round-1 fixes still hold at the line. The gateway-focused suites (contract, V1, boundary, todos, settle, worktreeRetire) pass locally: 67/67.
This round has no critical or improvement findings, only three nitpicks: a fake observe that is not a broadcast as the interface promises, a stale requirements comment in the MCP registration, and an orphan-todo sweep that is no longer a single statement. Nothing here blocks. Separately, GitHub reports the PR as CONFLICTING against board/t3o-55, since T3O-57 (#180) landed there. That is a sync job, not a review finding.
Status of round-1 findings
| # | prior finding | status |
|---|---|---|
| r1-i1 | 🟡 Auto-settle snapshotSequence read at dispatch time disables the change-since-snapshot guard |
✅ closed: sequence captured before the shell re-read and candidacy re-check (ThreadGatewayV1.ts:480-500) |
| r1-i2 | 🟡 projects() materialises the full command read model |
✅ closed: a single projection_projects SELECT |
| r1-i3 | 🟡 Fake delete leaves the thread readable as alive |
✅ closed: shared deletedThreadState, record kept as deleted |
| r1-n1 | 🟢 Stale comment about the removed thread.activity-appended pre-filter |
✅ closed |
| r1-n2 | 🟢 Spawn compensation untested | ✅ closed: ThreadGatewayV1.test.ts covers create → :turn refused → :cleanup |
| project: (projectId) => | ||
| Effect.succeed(projects.find((project) => project.id === projectId) ?? null), | ||
|
|
||
| observe: Stream.fromQueue(signals), |
There was a problem hiding this comment.
Note
Nitpick (1/3): the fake's observe is a shared queue, not a per-subscriber stream
ThreadGatewayShape.observe is documented as "Each access is its own subscription", and V1 honours that, since every run of the merged streamDomainEvents / streamEvents is a fresh PubSub subscription. The fake's Stream.fromQueue(signals) shares one queue across all runners, so a second observe consumer would split the signals between them. Each consumer would miss signals instead of every consumer seeing all of them. The reactor is the only consumer today, so nothing is wrong yet. But the fake is meant to be the contract the harness survives the v2 merge on, and a future second observer would get silently wrong test results.
Suggested fix: back emit with a PubSub plus a replay buffer (or PubSub.unbounded({ replay })), and make observe Stream.fromPubSub. That keeps both the "never lost before attach" buffering and per-subscriber delivery.
There was a problem hiding this comment.
Fixed in the first of the three commits ending at b1d2848. The fake now backs observe with an unbounded PubSub that has an unbounded replay buffer, so every subscription gets every signal, and a late subscriber still sees signals emitted before it attached (the buffering the harness relies on). Test: threadGateway.testkit.test.ts › "delivers every signal to every subscription, including late ones". Two concurrent readers each take two signals. On the old Queue-backed fake the signals were split between them and the test hung until timeout. It passes now.
| const scope = yield* McpInvocationContext.McpInvocationContext; | ||
| const boardEngine = yield* BoardEngine; | ||
| const snapshotQuery = yield* ProjectionSnapshotQuery; | ||
| const threads = yield* ThreadGateway; |
There was a problem hiding this comment.
Note
Nitpick (2/3): the registration comment still lists ProjectionSnapshotQuery as a requirement
The board MCP handlers now take ThreadGateway here and no longer require ProjectionSnapshotQuery. The header comment in mcp/toolkits/board/registration.ts:8-9, which isn't in this diff, still names the old requirement set, which now contradicts the boundary rule this PR introduced.
Suggested fix: replace ProjectionSnapshotQuery with ThreadGateway in that file's requirements list.
There was a problem hiding this comment.
Fixed in b1d2848. The header in mcp/toolkits/board/registration.ts now lists ThreadGateway where it said ProjectionSnapshotQuery.
| const sweepOrphans = SqlSchema.void({ | ||
| Request: Schema.String, | ||
| execute: (liveThreadIdsJson) => sql` | ||
| DELETE FROM boards.board_thread_todos | ||
| WHERE thread_id NOT IN ( | ||
| SELECT thread_id FROM boards.board_card_thread_links WHERE tombstoned_at IS NULL | ||
| ) | ||
| OR card_id NOT IN (SELECT card_id FROM boards.board_cards WHERE archived_at IS NULL) | ||
| OR thread_id NOT IN (SELECT value FROM json_each(${liveThreadIdsJson})) | ||
| `, | ||
| }); | ||
| return { |
There was a problem hiding this comment.
Note
Nitpick (3/3): the orphan-todo sweep is no longer a single statement
Before this change, the sweep was one DELETE … WHERE thread_id NOT IN (SELECT … FROM main.projection_threads …), so the live set and the delete were evaluated together. Now the reactor reads listLiveThreadIds() and passes the snapshot to a separate DELETE (supervisorReactor.ts boot reconcile). A thread that is created, linked and posts its first plan update between those two calls would have its fresh todo row dropped. At boot that window is tiny, and the next turn.plan.updated rebuilds the row, so the only cost is a briefly missing todo list. This is an inherent cost of keeping board SQL off upstream tables, but it isn't stated anywhere.
Suggested fix: add a one-line note at the call site that the snapshot is best-effort and self-heals on the next plan update, or restrict the json_each arm to rows whose updated_at predates the snapshot read.
There was a problem hiding this comment.
Fixed by bounding the delete, rather than only documenting that it self-heals. boardSweepThreadTodos(liveThreadIds, listedAt): the supervisor reads the clock before listLiveThreadIds(), and the live-set clause now applies only to rows with updated_at < listedAt. A row written after the list was taken belongs to a thread the list may have missed, so the sweep spares it. The link and card clauses are unchanged. Test: boardThreadTodos.test.ts › "AC 20: the boot sweep spares a row written after the live list was taken". It fails with the bound neutralised and passes with it, and the existing AC 20 test still passes.
…y subscription (T3O-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…list was taken (T3O-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ent (T3O-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolved on the merits: - boardClientConnection (and its test) is gone with T3O-57; its actor stamp now reads projects through the thread gateway inside boardRpcHandlers, so the RPC layer needs ThreadGateway instead of ProjectionSnapshotQuery. - projection.ts keeps the gateway-fed, listedAt-bounded orphan-todo sweep and T3O-57's board-owned snapshot; the shell enrichers stay deleted. - The supervisor and its harness keep the gateway's BoardWorld / BoardReadModel; BoardOrchestrationReadModel survives only for decider test fixtures. - seams.md carries both cards' census paragraphs and the T3O-58 rows on T3O-57's table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…T3O-55) — DO NOT SQUASH (#183) * fix(web): hide stash menu behind maximized panel (#18115) Co-authored-by: maria <maria@kuuro.net> * fix(web): sidebar toggle no longer sits under the macOS window buttons (#18193) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): missing agent binaries report launch failure Return exit 125 when the Linux cgroup wrapper target is missing, including when /bin/sh is Bash. Preserve arguments and child exit codes. * feat(android): add Pull Requests tab (#18372) * fix(mobile): Forgejo change requests ask for the summary they require (#18455) * fix(server): cap automatic thread continuations and turn them on by default (#18461) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(mobile): stock tab bar, glass filter pills, and saved list filters (#18476) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): keep PR surfaces and Android tab selection visible across themes (#18479) * fix(mobile): keep preview count badges inside the working pill (#18449) * fix(mobile): show rounded pull request selection in the sidebar (#18480) * feat(web): model options for source control writer and review guide models (#18488) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * ci(mobile): cut a store build when the native fingerprint has no build (#18496) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): terminal colors no longer look washed out (#17168) * refactor(settings): centralize schema-declared secrets and inputs (#18505) * fix(mobile): restore native scroll-edge effects on forms and PRs (#18507) * feat(mobile): native-sized pull request action bar (#18527) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): preserve theme contrast across surfaces and actions (#18506) * refactor(mobile): share themed list rows and sections (#18510) * refactor(mobile): share themed toggle rows in settings (#18511) * refactor(mobile): share themed choice rows in settings (#18516) * fix(server): consolidate browser credential handling (#18509) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat: open T3 Code from a link with a prompt ready to send (#18454) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(release): drop placeholder allowBuilds entry that broke nightly builds (#18560) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * ci: fail PRs on invalid allowBuilds entries in pnpm-workspace.yaml (#18564) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): menu dismiss taps no longer press the view underneath (#18565) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(web): one sidebar click updates every machine and provider (#18053) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(release): avoid PowerShell crashes on Windows ARM (#18573) * fix(server): Forgejo pull requests report their head commit (#18463) * test(provider-acp): terminal kill test passes on Windows hosts (#18450) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): context meter no longer reads 1000k just under a million tokens (#17539) * fix(desktop): avoid Hyprland 0.48–0.50 Wayland color-manager startup crashes (#18566) Disable WaylandWpColorManagerV1 before Electron is ready only on native Wayland Hyprland sessions running a stock 0.48.0-0.50.1 release, which advertise FEATURE_SET_PRIMARIES but reject set_primaries (hyprwm/Hyprland#9444; fixed in 0.51.0 by hyprwm/Hyprland#11499). Any probe failure or explicit feature override keeps the default. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): iPhones on iOS 27.2 beta no longer open to a black screen (#18654) Co-authored-by: T3 Code Test <t3code-test@example.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): installs skip the Enriched math download again (#18679) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): setup wizards follow custom themes (#18725) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): resolve configured PR bases to branch names (#18754) * fix: expose running terminals and prevent setup install stalls (#18740) * fix(mobile): hide Claude Read image placeholders when previews exist (#18761) * fix(gitlab): merge request details report their head commit (#18608) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(server): rename built-in models from settings (#18840) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Git actions follow the selected thread (#18862) * fix(desktop): preserve updater failure causes in diagnostics (#18864) * fix(web): attach dropped threads to pending answers (#18789) * fix(web): keep button text stable during press scaling (#18866) * fix(bitbucket): preserve PR head commits for review guides (#18402) * fix(server): return null for unresolved optional commands (#18871) * fix: show computer-use action titles and align app icons (#18865) * fix(server): apply confirmed Claude subagent outcomes (#18778) * fix(mobile): Browser page no longer logs a duplicate key warning (#18776) * fix(web): a numeric q in the pull requests URL no longer crashes the page (#18666) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client): T3 Connect clients reconnect once a new tunnel is ready (#16554) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(web): leaving the home page while the app loads no longer bounces you to a new draft (#18672) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): attachment images no longer re-download on every reconnect (#18824) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a migration id clash stops startup with a clear error instead of crash-looping (#15925) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: PR Batch Tester <agent@local.test> * fix(server): a thread with an event type from a newer build can still resync after a downgrade (#15937) Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: PR Batch Tester <agent@local.test> * fix(server): Codex titles and branch names no longer start the user's MCP servers (#17058) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * fix(server): Claude thinking before a tool call stays a collapsed Thought (#18887) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * perf(server): cached branch PR lookups no longer start git processes (#17063) * fix(web): compact merge buttons show when they need a second click (#18878) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): pull requests load from another environment when theirs is offline (#18698) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): collect active tool calls without array shifts (#18853) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * fix(web): center the pace icon on the limit card's "left" label (#18580) * fix(web): update everything includes npm-installed servers again (#18709) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): review guides find Bitbucket heads reported by short hash (#18900) Co-authored-by: Pawel Mikolajczuk <pmikolajczuk@atlassian.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): scheduled task model picker no longer shifts the dialog (#18940) * fix(ci): CodeRabbit reviews no longer request changes (#18954) * fix(web): links in HTML renders open like chat links (#18897) * fix(web): remember editor selections before opening folders (#19078) * fix(ci): retry Cursor webhook HTTP 400s on main (#19077) * fix(web): let context handoff details use the available width (#19098) * fix(server): snoozed threads allow queued automatic wakes (#19099) * fix(web): merge button fits its label and animates width changes (#18478) * fix(web): Cmd+Enter creates the new project while an option is highlighted (#18901) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(pi): queue turn-start prompts when native work is running (#18639) * fix(pi): load T3 tool schemas for completion gateways (#18643) * fix(devices): report agent tool startup failures (#18502) * fix(web): settings warn when an environment silently drops a setting (#18334) * fix(desktop): stop unsolicited Messages code autofill (#19118) * feat(chat): show pending context handoff when selecting a model (#18369) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): collect SQLite planner statistics when the database opens (#18471) * fix(server): failed threads no longer scan every tool item for errors (#18628) * fix(web): keep clone folder names readable in the setup project picker (#12474) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * fix(composer): allow slash skill search within messages (#19107) * fix(claude): default background text generation to haiku 5.5 (#18781) * chore(typecheck): bump tsc-rs to 0.6.0 (#19187) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): keep OpenCode timeouts from crashing the error formatter (#12469) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * feat(server): run delegated tasks in separate worktrees (#19102) * fix(git): preserve whitespace in file paths (#12464) (#12465) Co-authored-by: Yash Singh <saiansh2525@gmail.com> * fix(server): stop fsyncing SQLite on every commit so slow disks no longer drop clients (#19205) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(chat): make links in agent questions clickable (#19197) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(usage): show one Antigravity account once, not once per machine (#19207) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Android beta links point to the APK release, not the banned Google group (#18955) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client): "Subagent needs input" no longer sticks after the subagent finishes (#18996) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): stop question answers from resetting the editor caret (#11337) * fix(web): app shortcuts keep working after clicking into an HTML render (#18898) * fix(source-control): keep distinct CI checks with overlapping names (#19162) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * fix(server): avoid excessive backtracking in webhook templates (#19160) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * fix(web): auto-merge button fits its label and animates width changes (#19111) * fix(web): scroll terminal output with touch gestures (#11305) * feat(web): view visual replies full screen with zoom (#17561) * fix(web): removing a project no longer opens a new thread for it (#15864) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(server): usage hubs with a host-less URL no longer vanish from Limits (#11368) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): search bar animates in on iOS 26+ instead of popping (#19209) * chore(deps): Effect 4.0.4 and OpenCode 2.0.28, dropping the patches they made unnecessary (#19213) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a Claude 403 no longer tells you to log in again (#15872) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(server): persist only changed pull request links (#19248) * fix(server): delegate_task explains that supervised runtime modes pause the child (#14416) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> * fix(server): Claude subagent progress no longer re-stores the unchanged prompt (#18375) * fix(server): thread list reads no longer freeze the server on large databases (#19226) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: Alex Southwell <saphid@gmail.com> * perf(server): streamed events no longer rewrite the whole thread row (#18890) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs: close PRs written by Gemini or Muse Wonder (#19286) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix: update all no longer runs agents twice or loses background work (#19291) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): enforce one database owner and guard update rollback (#16102) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * perf(server): reuse stored turn item positions (#19230) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): avoid quadratic resource history replay (#18825) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * fix(server): repair ownership UUID generation (#19298) * fix(client-runtime): slow config snapshots no longer drop working connections (#14518) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> * fix(server): bound activity publishes so stalled responses release the worker (#18830) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * perf(shared): cached SQLite statements no longer hold large parameters (#19305) Takeover of #17785 by @tris203. Executions binding more than 64 KiB of text or blob data run on a throwaway statement, in the writer and the reader worker, so cached statements no longer pin large payloads in native memory. Co-authored-by: tris203 <admin@snappeh.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(provider-cursor): Cursor text generation no longer leaks SQLite file handles on every call (#19310) Takeover of #18154. Per-call SqliteLocalAgentStore so Cursor text generation closes its SQLite handles, and the agent now closes before its store on sign-out. Fixes #18151. Co-authored-by: Aaron Queen <bompus@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): make SQLite checkpoints durable on macOS (#19304) Co-authored-by: Soroush Baraouf <soroushraouf44@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): Codex plan streaming no longer commits every token (#19317) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): large file edits no longer store their full diff twice (#19316) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): settings save again after a stored value fails decode (#19312) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): HTML and Markdown attachments no longer fail OpenCode turns (#19319) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): worktree paths no longer vanish on git before 2.36 (#19315) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(acp): custom models now reach the agent instead of failing to open (#19313) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Claude no longer shows unavailable when its health check can't run in $HOME (#19320) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): stalled OAuth token requests no longer block credential calls (#19321) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): steered Claude turns no longer undercount token usage (#19314) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): closing a Claude session no longer leaves plugin MCP servers running (#19322) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): T3 Connect link timeouts explain the relay 504 (#19329) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): settle shortcut moves to the next thread like the sidebar (#19328) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(acp): Copilot's default agent no longer disappears from the Agent menu (#19330) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): SQLite checkpoints no longer block the event loop (#19324) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): incompatible environments now say whether to update the app or the host (#19331) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): live reasoning stays scrolled to the newest text while it streams (#19334) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): T3 Connect no longer stays down after a network change (#19335) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): host images say when the connection lacks file access (#19337) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): a resumed subagent no longer moves the later turn's Worked for row (#19338) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix: Claude and Codex no longer time out behind mise wrappers (#19340) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): turns no longer re-read merged PRs from GitHub (#19344) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs(settings): explain that provider update checks also gate the model catalog (#18208) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(web): an unsaved citation comment survives a question or approval (#19350) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): changing Claude effort no longer fails while background agents run (#19341) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): service updates no longer fail on full disks or large databases (#19311) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> * fix(clients): # suggestions include pull requests linked to the thread (#19357) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): pairing a switched-off computer again turns it back on (#19354) Co-authored-by: Mnigos <makowskiigor@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(cli): t3 triage reports the server's version, not its own, as the user's build (#19359) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): a new WSL backend no longer shows Limited permissions until reload (#19361) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): action shortcuts recorded in the browser now save (#19365) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): large pasted images no longer break later Claude image reads (#19364) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): settled and idle-released threads no longer stay Waiting (#19355) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(client-runtime): merged pull requests are no longer re-read every minute (#19374) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): new Codex threads no longer miss slow MCP servers' tools (#19368) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(github): requested teams now show in pull request reviewers (#19375) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(ssh): SSH launch no longer picks a port another server answers on (#19372) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a failed T3 Connect relink no longer leaves a stale managed tunnel (#19383) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(shared): Windows .cmd shims no longer print DEP0190 on every spawn (#19385) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): commit and title generation use your custom model when no text model is set (#19386) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): T3 Connect settings can repair a link that drifted to publish-only (#19389) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): failed Claude text generation shows the CLI's own error (#19394) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): terminal tells the shell its new width as soon as you release a resize drag (#19395) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keybindings page says to connect an environment when none is connected (#19400) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(chat): Codex follow-up suggestions show their label instead of raw markup (#19401) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): open in editor works over Tailscale SSH without a local sshd (#19402) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a deregistered T3 Connect host shows it was removed and offers a relink (#19379) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): idle servers no longer scan every process every 5 seconds (#19399) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * chore(typecheck): bump tsc-rs to 0.7.0 (#19408) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): bound Bitbucket API requests with 30s timeout (#14140) * fix(server): new worktrees no longer fail when a background fetch runs at the same time (#19411) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): thread search runs on the SQLite reader worker (#19382) * perf(server): traces keep ~40% more history and no longer block the event loop (#19430) Co-authored-by: Aaron Queen <bompus@users.noreply.github.com> Co-authored-by: Daniyal <115576848+daniyal-sh@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(shared): SQLite checkpoints no longer fall back to the main thread silently (#19417) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): unchanged node updates no longer write to SQLite (#19429) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(ssh): reconnecting keeps the remote server and its agents running (#19432) Co-authored-by: puccez <emanuele.puccetti@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: luke2x <97411838+luke2x@users.noreply.github.com> * feat(observability): SQL spans show lock wait and connection; stalls keep their own history (#19425) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): threads woken by notifications no longer load their whole history (#19423) Co-authored-by: Eldar Politkin <32969822+EldarPolitkin@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): worktree cleanup no longer runs sweeps back to back (#19418) Co-authored-by: Tanner Sharon <tannermsharon@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): only Claude progress updates before a tool call show as text (#18923) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(pr): keep known state in sync across controls (#18408) * fix(web): review summary only says optional when it is (#18451) * fix(web): subagent lists in the composer banner no longer start lines with a comma (#19170) * fix(web,mobile): pull request filters no longer offer the Scratch folder (#19179) * fix(web,mobile): pull request project filter follows the sidebar order (#19180) * feat(settings): inactivity auto-settle can keep threads with a PR (#14642) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): Claude works next to an enterprise managed-mcp.json (#18706) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web,mobile): muse code uses meta's official blue logo (#19562) * fix(desktop): import CA trust variables from the login shell (#19604) * fix(server): preview copy only forwards text from the viewer's copy keys (#19561) * fix(muse): Supervised threads ask before commands again (#19558) * fix(server): restarts no longer stall on old subagent result deliveries (#19631) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): a thread comes back when its subagent needs approval (#19630) A delegated subagent waiting on an approval or question now shows on its parent thread: Working section, status badge, notifications, snooze, and the composer banner on web and mobile. Takes over #19614. Co-authored-by: lovelycodemonkey <ghassemimahyad@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(usage): cold usage scans no longer stall the server (#19446) Co-authored-by: Victor Vogel <263261067+only21mil@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): "Always allow this session" stops Codex asking for every command (#19635) After "Always allow this session", the Codex adapter answers later command (or file change) approvals in that thread for the rest of the session. A turn in another runtime mode, or the thread unloading, ends it. Takes over #19598. Co-authored-by: lovelycodemonkey <ghassemimahyad@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep vertical cursor stops outside styled markers (#19651) * fix(web): mermaid code toggle stays in place when switching views (#19601) * fix(server): Reveal in File Explorer and browser launches work on Windows again (#19656) Windows PowerShell started with detached: true exits 0 without running its command. Native Windows PowerShell launches (reveal and browser) now start attached, unref'd, with ignored stdio. Takes over #10387. Fixes #11780. Co-authored-by: doubletwisted <118005273+doubletwisted@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): GitHub App tokens can merge and use other write actions (#19103) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): commands on busy threads stop decoding thousands of finished tool nodes (#19675) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): use workspace-scoped Bitbucket permissions API (#10984) Co-authored-by: RealDoc06 <73218979+RealDoc06@users.noreply.github.com> Co-authored-by: Theo Browne <me@t3.gg> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(composer): read dropped threads across environments (#15210) * test(web): remove duplicate change request parser tests (#13591) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(server): a delegated task's question ends the parent's blocking wait (#19538) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): a delegated task's question now wakes its parent agent (#19521) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): a cancelled delegated task no longer shows its child's question (#18459) Co-authored-by: maria-rcks <maria@kuuro.net> * feat(storage): clean up settled thread worktrees (#15208) Co-authored-by: maria-rcks <maria@kuuro.net> * feat(web,mobile): waiting status shows a dot-dashed icon and a timer (#19617) * feat(pr): delete branches after merge or close (#19257) * fix(web): the sidebar no longer keeps old renders alive (#19852) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): update everything no longer waits on slow servers, and shows progress in the sidebar (#19837) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): text generation no longer falls back to the expensive flagship model (#19722) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(web): setting to open pull request links on GitHub (#19719) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): middle-click opens pull requests in the browser, like cmd+click (#19854) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): the chat view and composer no longer keep old renders alive (#19869) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): steering no longer ends running subagents (#19210) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web,mobile): sent queued messages say "from queue", not "queued" (#19849) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): OTLP exports say which machine and build they came from (#19370) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(prs): bound refreshes by each tracker read (#19403) * fix(mobile): new threads no longer get stuck on Starting (#15870) * fix(mobile): agent-spawned threads can be mentioned from the @ picker (#15841) Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): pull request lists fill the available scroll viewport (#18767) * fix(server): Cursor threads in Auto use Cursor's Auto-review (#19712) Co-authored-by: Cursor <cursoragent@cursor.com> * fix(web): text selection keeps going under the turn minimap (#16748) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(server): Antigravity installs on Windows ARM (#18472) * perf(server): cut fff-node FFI marshaling overhead on large workspaces (#18514) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): replace Windows PowerShell port polling with netstat (#18524) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Windows Codex install uses system tar and retries rename (#18523) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): fall back to windows-x86_64 ACP binaries on Windows on ARM (#18521) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): fail runs whose provider stream ends without a terminal (#19131) Co-authored-by: GPT-6.1-Sol at high effort <noreply@openai.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a dropped HTTP/2 connection no longer crashes the server (#18378) Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Stop re-probing hosting CLIs for unrecognized hosts (#19692) Co-authored-by: Victor Vogel <263261067+only21mil@users.noreply.github.com> Co-authored-by: Jorrin <43169049+JorrinKievit@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): Android nested list markers no longer overlap their text (#19970) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): release iOS audio session after video playback (#18539) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep wrapped split diffs from jumping while scrolling (#20022) * fix(web): model picker search lists newest models first (#18494) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Gabriel De Andrade <gabrieldeandradeleal@gmail.com> * fix(acp): one malformed session update no longer ends the session (#20015) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): HTML renders show a layout skeleton and reuse cached pages (#19654) * chore: change product branding from Alpha to Beta (#20032) * feat(board): board-owned engine and event log in boards.sqlite (T3O-56) (#179) * feat(board): board-owned engine, event log and query service (T3O-56, WIP) Adds BoardEngine (own receipts, log in boards.board_events, atomic append+project+receipt, serialised publish), BoardQueries, the read-only upstream thread tail for the todo cache, and migration 044 copying board history out of main.orchestration_events. Removes the board delegation from the v1 decider, projector, engine and projection pipeline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(board): route every board caller through BoardEngine (T3O-56, WIP) Board events and commands leave upstream's OrchestrationEvent and OrchestrationCommand unions (BoardEvent/BoardCommand in contracts). ws.ts routes client board commands to the board engine and merges the board's shell deltas; the supervisor, MCP toolkit and board RPCs read and write the board through BoardEngine and BoardQueries. The shell coalescer and the board-aware projection-state repository are gone with the v1 seams. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): re-point board suites at BoardEngine; engine and migration tests (T3O-56, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): client applies board deltas on their own sequence; contracts and shell-sync coverage (T3O-56, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(board): the upstream tail resumes at the head when its cursor runs ahead; lint and test tidy (T3O-56) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(board): record the board's own engine in the seam inventory and decisions (T3O-56) Rewrites overview D2 and t3o-26 D1/D2 for the board-owned engine and log, updates the seam grammar, inventory and marker census. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(board): the upstream tail retries failed applies; 044 keeps the legacy watermark (T3O-56) - boardThreadTail pins its persisted cursor before the first event that fails to apply (or a failed catch-up), so the next boot replays it. - Migration 044 leaves projection.board-cards in place so a rollback does not replay main's board events from 0. - TODO(board-subscription) on the full-snapshot shell resume. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(board): receipts name the command's aggregate; card-threads refetches run in one lane (T3O-56) A multi-card command (archive, unarchive, move re-flagging a dependent) wrote its receipt with the last event's card, so a retry failed with an id conflict. Receipts now name the command's own aggregate, and a replay accepts a legacy receipt when the command touched its own aggregate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: brentkelly <d-ai@zeald.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(board): board subscription off the orchestration shell (T3O-57) (#180) * feat(contracts): board subscription, dispatch and archive RPCs; board off the shell (T3O-57, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(board): board.subscribeBoard, board.dispatchCommand and board.getArchivedCards; board off the shell stream (T3O-57, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(client-runtime): board subscription state and reducer off the orchestration shell (T3O-57, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(web): board views read the board's own subscription; archive sheet reads board.getArchivedCards (T3O-57, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): subscription contract tests; docs: seam census and t3o-26 AC8 for the board subscription (T3O-57) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(board): resume-by-replay re-sends every card's thread summaries (T3O-57) Todo changes and thread deletions are not in the board log, so a replayed resume left card-threads stale. Narrow the client doc on replaced-board detection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(client-runtime): rewrap board subscription doc comment (T3O-57) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: brentkelly <d-ai@zeald.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * refactor(board): ThreadGateway, one seam for all board→thread access (#181) * refactor(board): ThreadGateway, the board's one seam onto threads (T3O-58, WIP) Adds board/ThreadGateway.ts (board-vocabulary commands, reads and signals) and ThreadGatewayV1, which wraps today's v1 engine, projection, provider and SQL reads one for one. Re-points the supervisor reactor, board engine, todo-cache tail, board RPC, MCP board toolkit, worktree retirer, pull-request gateway and usage-limit detector at it. Test suites follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): in-memory ThreadGateway fake, harness on it, V1 contract and boundary suites (T3O-58, WIP) The supervisor harness drops its engine, snapshot and provider stubs for one in-memory ThreadGateway; its signal builders speak ThreadSignal. Adds the gateway contract suite on the real v1 stack and a source-level boundary test that only ThreadGatewayV1 reaches upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(board): the thread gateway in the seam inventory and t3o-26 (T3O-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): the harness refuses an engine-shaped fixture instead of hanging (T3O-58, WIP) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): suites on the thread gateway's vocabulary (T3O-58) Every board suite now speaks gateway calls (thread.spawn, thread.send, thread.interrupt, thread.settle, thread.delete), BoardThreadState and ThreadSignal instead of v1 commands, shells and engine events. Stubs of upstream's engine, snapshot query and provider are gone from the supervisor and PR-gateway suites. Adds unit coverage for the v1 shell-to-state rules that moved out of the reactor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(board): auto-settle re-checks candidacy against a sequence captured first (T3O-58) Review r1-i1. The engine's changed-since-snapshot guard was disabled because the sequence was read at dispatch time, after the caller's candidacy read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * perf(board): gateway projects() reads projection_projects, not the read model (T3O-58) Review r1-i2. The decider context and worktreeRetire paid for a full command read model on every project-bearing command; back to one projects-only query. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): the fake gateway's delete leaves the thread readable as deleted (T3O-58) Review r1-i3. One deletedThreadState builder now serves V1 and the fake, so the two cannot disagree on what a deleted thread reads as. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): spawn deletes a thread whose first turn is refused; stale comment (T3O-58) Review r1-n2 and r1-n1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(board): the fake gateway's observe delivers every signal to every subscription (T3O-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(board): the orphan-todo sweep spares rows written after the live list was taken (T3O-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(board): MCP board registration names ThreadGateway as a requirement (T3O-58) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: brentkelly <d-ai@zeald.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * chore(sync): merge upstream v0.1.0 and run the board on orchestration-v2 (#182) * ci(mobile): cut a store build when the native fingerprint has no build (#18496) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): terminal colors no longer look washed out (#17168) * refactor(settings): centralize schema-declared secrets and inputs (#18505) * fix(mobile): restore native scroll-edge effects on forms and PRs (#18507) * feat(mobile): native-sized pull request action bar (#18527) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): preserve theme contrast across surfaces and actions (#18506) * refactor(mobile): share themed list rows and sections (#18510) * refactor(mobile): share themed toggle rows in settings (#18511) * refactor(mobile): share themed choice rows in settings (#18516) * fix(server): consolidate browser credential handling (#18509) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat: open T3 Code from a link with a prompt ready to send (#18454) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(release): drop placeholder allowBuilds entry that broke nightly builds (#18560) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * ci: fail PRs on invalid allowBuilds entries in pnpm-workspace.yaml (#18564) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): menu dismiss taps no longer press the view underneath (#18565) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(web): one sidebar click updates every machine and provider (#18053) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(release): avoid PowerShell crashes on Windows ARM (#18573) * fix(server): Forgejo pull requests report their head commit (#18463) * test(provider-acp): terminal kill test passes on Windows hosts (#18450) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): context meter no longer reads 1000k just under a million tokens (#17539) * fix(desktop): avoid Hyprland 0.48–0.50 Wayland color-manager startup crashes (#18566) Disable WaylandWpColorManagerV1 before Electron is ready only on native Wayland Hyprland sessions running a stock 0.48.0-0.50.1 release, which advertise FEATURE_SET_PRIMARIES but reject set_primaries (hyprwm/Hyprland#9444; fixed in 0.51.0 by hyprwm/Hyprland#11499). Any probe failure or explicit feature override keeps the default. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): iPhones on iOS 27.2 beta no longer open to a black screen (#18654) Co-authored-by: T3 Code Test <t3code-test@example.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): installs skip the Enriched math download again (#18679) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): setup wizards follow custom themes (#18725) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): resolve configured PR bases to branch names (#18754) * fix: expose running terminals and prevent setup install stalls (#18740) * fix(mobile): hide Claude Read image placeholders when previews exist (#18761) * fix(gitlab): merge request details report their head commit (#18608) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(server): rename built-in models from settings (#18840) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Git actions follow the selected thread (#18862) * fix(desktop): preserve updater failure causes in diagnostics (#18864) * fix(web): attach dropped threads to pending answers (#18789) * fix(web): keep button text stable during press scaling (#18866) * fix(bitbucket): preserve PR head commits for review guides (#18402) * fix(server): return null for unresolved optional commands (#18871) * fix: show computer-use action titles and align app icons (#18865) * fix(server): apply confirmed Claude subagent outcomes (#18778) * fix(mobile): Browser page no longer logs a duplicate key warning (#18776) * fix(web): a numeric q in the pull requests URL no longer crashes the page (#18666) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client): T3 Connect clients reconnect once a new tunnel is ready (#16554) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(web): leaving the home page while the app loads no longer bounces you to a new draft (#18672) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): attachment images no longer re-download on every reconnect (#18824) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a migration id clash stops startup with a clear error instead of crash-looping (#15925) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: PR Batch Tester <agent@local.test> * fix(server): a thread with an event type from a newer build can still resync after a downgrade (#15937) Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: PR Batch Tester <agent@local.test> * fix(server): Codex titles and branch names no longer start the user's MCP servers (#17058) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * fix(server): Claude thinking before a tool call stays a collapsed Thought (#18887) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * perf(server): cached branch PR lookups no longer start git processes (#17063) * fix(web): compact merge buttons show when they need a second click (#18878) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): pull requests load from another environment when theirs is offline (#18698) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): collect active tool calls without array shifts (#18853) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * fix(web): center the pace icon on the limit card's "left" label (#18580) * fix(web): update everything includes npm-installed servers again (#18709) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): review guides find Bitbucket heads reported by short hash (#18900) Co-authored-by: Pawel Mikolajczuk <pmikolajczuk@atlassian.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): scheduled task model picker no longer shifts the dialog (#18940) * fix(ci): CodeRabbit reviews no longer request changes (#18954) * fix(web): links in HTML renders open like chat links (#18897) * fix(web): remember editor selections before opening folders (#19078) * fix(ci): retry Cursor webhook HTTP 400s on main (#19077) * fix(web): let context handoff details use the available width (#19098) * fix(server): snoozed threads allow queued automatic wakes (#19099) * fix(web): merge button fits its label and animates width changes (#18478) * fix(web): Cmd+Enter creates the new project while an option is highlighted (#18901) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(pi): queue turn-start prompts when native work is running (#18639) * fix(pi): load T3 tool schemas for completion gateways (#18643) * fix(devices): report agent tool startup failures (#18502) * fix(web): settings warn when an environment silently drops a setting (#18334) * fix(desktop): stop unsolicited Messages code autofill (#19118) * feat(chat): show pending context handoff when selecting a model (#18369) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): collect SQLite planner statistics when the database opens (#18471) * fix(server): failed threads no longer scan every tool item for errors (#18628) * fix(web): keep clone folder names readable in the setup project picker (#12474) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * fix(composer): allow slash skill search within messages (#19107) * fix(claude): default background text generation to haiku 5.5 (#18781) * chore(typecheck): bump tsc-rs to 0.6.0 (#19187) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): keep OpenCode timeouts from crashing the error formatter (#12469) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * feat(server): run delegated tasks in separate worktrees (#19102) * fix(git): preserve whitespace in file paths (#12464) (#12465) Co-authored-by: Yash Singh <saiansh2525@gmail.com> * fix(server): stop fsyncing SQLite on every commit so slow disks no longer drop clients (#19205) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(chat): make links in agent questions clickable (#19197) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(usage): show one Antigravity account once, not once per machine (#19207) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Android beta links point to the APK release, not the banned Google group (#18955) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client): "Subagent needs input" no longer sticks after the subagent finishes (#18996) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): stop question answers from resetting the editor caret (#11337) * fix(web): app shortcuts keep working after clicking into an HTML render (#18898) * fix(source-control): keep distinct CI checks with overlapping names (#19162) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * fix(server): avoid excessive backtracking in webhook templates (#19160) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> * fix(web): auto-merge button fits its label and animates width changes (#19111) * fix(web): scroll terminal output with touch gestures (#11305) * feat(web): view visual replies full screen with zoom (#17561) * fix(web): removing a project no longer opens a new thread for it (#15864) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(server): usage hubs with a host-less URL no longer vanish from Limits (#11368) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): search bar animates in on iOS 26+ instead of popping (#19209) * chore(deps): Effect 4.0.4 and OpenCode 2.0.28, dropping the patches they made unnecessary (#19213) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a Claude 403 no longer tells you to log in again (#15872) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(server): persist only changed pull request links (#19248) * fix(server): delegate_task explains that supervised runtime modes pause the child (#14416) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> * fix(server): Claude subagent progress no longer re-stores the unchanged prompt (#18375) * fix(server): thread list reads no longer freeze the server on large databases (#19226) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: Alex Southwell <saphid@gmail.com> * perf(server): streamed events no longer rewrite the whole thread row (#18890) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs: close PRs written by Gemini or Muse Wonder (#19286) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix: update all no longer runs agents twice or loses background work (#19291) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): enforce one database owner and guard update rollback (#16102) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * perf(server): reuse stored turn item positions (#19230) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): avoid quadratic resource history replay (#18825) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * fix(server): repair ownership UUID generation (#19298) * fix(client-runtime): slow config snapshots no longer drop working connections (#14518) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> * fix(server): bound activity publishes so stalled responses release the worker (#18830) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * perf(shared): cached SQLite statements no longer hold large parameters (#19305) Takeover of #17785 by @tris203. Executions binding more than 64 KiB of text or blob data run on a throwaway statement, in the writer and the reader worker, so cached statements no longer pin large payloads in native memory. Co-authored-by: tris203 <admin@snappeh.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(provider-cursor): Cursor text generation no longer leaks SQLite file handles on every call (#19310) Takeover of #18154. Per-call SqliteLocalAgentStore so Cursor text generation closes its SQLite handles, and the agent now closes before its store on sign-out. Fixes #18151. Co-authored-by: Aaron Queen <bompus@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): make SQLite checkpoints durable on macOS (#19304) Co-authored-by: Soroush Baraouf <soroushraouf44@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): Codex plan streaming no longer commits every token (#19317) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): large file edits no longer store their full diff twice (#19316) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): settings save again after a stored value fails decode (#19312) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): HTML and Markdown attachments no longer fail OpenCode turns (#19319) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): worktree paths no longer vanish on git before 2.36 (#19315) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(acp): custom models now reach the agent instead of failing to open (#19313) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Claude no longer shows unavailable when its health check can't run in $HOME (#19320) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): stalled OAuth token requests no longer block credential calls (#19321) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): steered Claude turns no longer undercount token usage (#19314) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): closing a Claude session no longer leaves plugin MCP servers running (#19322) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): T3 Connect link timeouts explain the relay 504 (#19329) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): settle shortcut moves to the next thread like the sidebar (#19328) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(acp): Copilot's default agent no longer disappears from the Agent menu (#19330) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): SQLite checkpoints no longer block the event loop (#19324) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): incompatible environments now say whether to update the app or the host (#19331) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): live reasoning stays scrolled to the newest text while it streams (#19334) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): T3 Connect no longer stays down after a network change (#19335) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): host images say when the connection lacks file access (#19337) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): a resumed subagent no longer moves the later turn's Worked for row (#19338) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix: Claude and Codex no longer time out behind mise wrappers (#19340) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): turns no longer re-read merged PRs from GitHub (#19344) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs(settings): explain that provider update checks also gate the model catalog (#18208) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(web): an unsaved citation comment survives a question or approval (#19350) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): changing Claude effort no longer fails while background agents run (#19341) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): service updates no longer fail on full disks or large databases (#19311) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> * fix(clients): # suggestions include pull requests linked to the thread (#19357) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): pairing a switched-off computer again turns it back on (#19354) Co-authored-by: Mnigos <makowskiigor@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(cli): t3 triage reports the server's version, not its own, as the user's build (#19359) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): a new WSL backend no longer shows Limited permissions until reload (#19361) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): action shortcuts recorded in the browser now save (#19365) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): large pasted images no longer break later Claude image reads (#19364) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): settled and idle-released threads no longer stay Waiting (#19355) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(client-runtime): merged pull requests are no longer re-read every minute (#19374) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): new Codex threads no longer miss slow MCP servers' tools (#19368) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(github): requested teams now show in pull request reviewers (#19375) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(ssh): SSH launch no longer picks a port another server answers on (#19372) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a failed T3 Connect relink no longer leaves a stale managed tunnel (#19383) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(shared): Windows .cmd shims no longer print DEP0190 on every spawn (#19385) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): commit and title generation use your custom model when no text model is set (#19386) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): T3 Connect settings can repair a link that drifted to publish-only (#19389) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): failed Claude text generation shows the CLI's own error (#19394) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): terminal tells the shell its new width as soon as you release a resize drag (#19395) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keybindings page says to connect an environment when none is connected (#19400) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(chat): Codex follow-up suggestions show their label instead of raw markup (#19401) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): open in editor works over Tailscale SSH without a local sshd (#19402) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a deregistered T3 Connect host shows it was removed and offers a relink (#19379) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): idle servers no longer scan every process every 5 seconds (#19399) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * chore(typecheck): bump tsc-rs to 0.7.0 (#19408) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): bound Bitbucket API requests with 30s timeout (#14140) * fix(server): new worktrees no longer fail when a background fetch runs at the same time (#19411) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): thread search runs on the SQLite reader worker (#19382) * perf(server): traces keep ~40% more history and no longer block the event loop (#19430) Co-authored-by: Aaron Queen <bompus@users.noreply.github.com> Co-authored-by: Daniyal <115576848+daniyal-sh@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(shared): SQLite checkpoints no longer fall back to the main thread silently (#19417) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): unchanged node updates no longer write to SQLite (#19429) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(ssh): reconnecting keeps the remote server and its agents running (#19432) Co-authored-by: puccez <emanuele.puccetti@icloud.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: luke2x <97411838+luke2x@users.noreply.github.com> * feat(observability): SQL spans show lock wait and connection; stalls keep their own history (#19425) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): threads woken by notifications no longer load their whole history (#19423) Co-authored-by: Eldar Politkin <32969822+EldarPolitkin@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): worktree cleanup no longer runs sweeps back to back (#19418) Co-authored-by: Tanner Sharon <tannermsharon@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): only Claude progress updates before a tool call show as text (#18923) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(pr): keep known state in sync across controls (#18408) * fix(web): review summary only says optional when it is (#18451) * fix(web): subagent lists in the composer banner no longer start lines with a comma (#19170) * fix(web,mobile): pull request filters no longer offer the Scratch folder (#19179) * fix(web,mobile): pull request project filter follows the sidebar order (#19180) * feat(settings): inactivity auto-settle can keep threads with a PR (#14642) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): Claude works next to an enterprise managed-mcp.json (#18706) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web,mobile): muse code uses meta's official blue logo (#19562) * fix(desktop): import CA trust variables from the login shell (#19604) * fix(server): preview copy only forwards text from the viewer's copy keys (#19561) * fix(muse): Supervised threads ask before commands again (#19558) * fix(server): restarts no longer stall on old subagent result deliveries (#19631) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): a thread comes back when its subagent needs approval (#19630) A delegated subagent waiting on an approval or question now shows on its parent thread: Working section, status badge, notifications, snooze, and the composer banner on web and mobile. Takes over #19614. Co-authored-by: lovelycodemonkey <ghassemimahyad@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(usage): cold usage scans no longer stall the server (#19446) Co-authored-by: Victor…
The board reached threads through a dozen scattered upstream calls (engine dispatches, domain event streams, provider event streams, read-model snapshots and raw SQL on upstream projection tables). The v2 merge would have had to rewrite all of them inside
supervisorReactor.ts.This adds
board/ThreadGateway.ts, one board-owned Effect service in board vocabulary (commands,BoardThreadStatereads,ThreadSignalevents), andThreadGatewayV1, which wraps today's v1 calls one for one. The supervisor reactor, decider context, todo tail, orphan sweep, board RPC, MCP board toolkit,worktreeRetire, PR gateway and usage-limit detector all go through it. Tests run on an in-memory fake; a contract suite runs against V1 on a real stack, and a boundary test enforces that onlyThreadGatewayV1imports orchestration/provider/persistence code or names upstream tables.Part of T3O-55 (card T3O-58).
🤖 Generated with Claude Code