fix(server): settle threads server-side - #8600
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
There was a problem hiding this comment.
Reviewed the new ThreadSettlementReactor service and its consumers against the Effect service conventions. One finding: the new service is defined in the legacy Services/ + Layers/ split with a standalone Shape interface and a *Live layer export. Everything else (dependency acquisition from the environment, namespaced effect/* subpath imports, Layer.succeed/Layer.mock only in test harnesses, no ManagedRuntime/runPromise in service code, error construction in GitManager.branchPullRequest) matches the conventions.
Posted via Macroscope — Effect Service Conventions
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — The PR introduces server-owned automatic thread settlement that runs without a connected client, including periodic PR lookups, persisted lifecycle changes, and provider-session cleanup. It also changes the scope of the settlement defaults and adds static-analysis suppression directives, so the broader runtime and configuration impact should receive human review. You can add or adjust custom eligibility rules. Learn more. |
There was a problem hiding this comment.
Reviewed the new ThreadSettlementReactor service and the touched call sites against the Effect service conventions. The hoist to apps/server/src/orchestration/ThreadSettlementReactor.ts (inline Context.Service interface, exported make, exported layer, ThreadSettlementReactor["Service"] references, namespaced effect/* and local service imports) looks correct, and the old Services//Layers/ modules are gone. One leftover from that migration: the reactor's test file still lives in orchestration/Layers/.
Posted via Macroscope — Effect Service Conventions
There was a problem hiding this comment.
One UI consistency finding on the newly capability-gated auto-settle rows. Everything else in the web scope (settled state now read from settledOverride in Sidebar, ChatView, and the thread action menu, and the mergeEnvironmentSettings precedence flip) is internally consistent.
Posted via Macroscope — UI Consistency
There was a problem hiding this comment.
One finding: removing the client-side settle pre-flight leaves the Settle affordances enabled for ineligible threads, so users now see a raw server invariant string instead of the product-worded blocked message.
Posted via Macroscope — UI Consistency
510d104 to
8f97a01
Compare
There was a problem hiding this comment.
Service-convention items from earlier runs are resolved: ThreadSettlementReactor now lives in one canonical module (apps/server/src/orchestration/ThreadSettlementReactor.ts) with an inline Context.Service interface, make, layer, and its test alongside it, and consumers reference ThreadSettlementReactor["Service"].
The remaining finding is the un-explained diagnostic suppressions added by this PR. Besides the two commented sites, apps/server/src/git/GitManager.test.ts lines 1055, 1115, 1193, and 1245 add the same bare preferSchemaOverJson:off directive and need the same short justification (the repo already does this elsewhere, e.g. bin.test.ts and bootService.test.ts).
Posted via Macroscope — Effect Service Conventions
917f7d8 to
cd6e7f9
Compare
Move PR-based and inactivity-based settlement and their settings to the server. Clients render saved settlement state for each environment. Use settlement events for provider cleanup and reject stale automatic decisions after new activity or manual state changes.
Move ThreadSettlementReactor to its canonical orchestration module with an inline service interface and exported make and layer. Delete the old service and layer files, and update consumers and the documentation link.
Move ThreadSettlementReactor.test.ts out of Layers and update its relative imports. Keep the test cases unchanged.
Use the primary server's threadAutoSettlement capability for settings search, matching the General panel. Hide both automatic settlement results until the server reports support.
Return a typed blocked-settlement error with the existing friendly message. Keep eligibility checks on the server and preserve rejected command receipts. Remove the unused client error class and test the decider, engine, and RPC.
be78d81 to
3024890
Compare
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator Ports #8600's server-owned settlement to orchestration v2 instead of keeping client-side evaluation. A ThreadSettlementService sweep runs at startup, on auto-settle settings changes, and once per minute: it evaluates inactivity and merged or closed pull requests over v2 thread shells and dispatches the new guarded thread.auto-settle command, which rejects threads that changed after the sweep's snapshot or carry any explicit override, then reuses the orchestrator's settle lifecycle. With the server deciding, the clients drop their effectiveSettled evaluation and partition on the persisted settledOverride like main. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023 media rework (streamed videos, media-file assets, protocol-relative links), #9098 shared live-activity row folded into the v2 working and thinking rows, the #9084/#9078 Claude model catalog for v2 consumers, a native #9005 OpenCode child-session abort in the v2 adapter, #9013's landed LegendList patch, and per-environment sidebar provider entries. For #8600 the server-side pieces land, but auto-settle evaluation stays client-side (reading the new server-owned settings) until the v2 orchestrator grows its own settlement reactor; main's v1-only reactor and coalescer additions are dropped with the rest of the v1 path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Automatic settlement still ran in clients and used device-local settings. Devices could disagree about whether a thread was settled, and the rules did not run without an open client.
The server now owns PR-based and inactivity-based settlement and stores both settings per environment. Clients render the saved settlement state. The server uses the existing settlement events to stop provider sessions. State checks prevent a delayed automatic decision from overriding new activity or a manual reopen.
Defaults stay at 3 days with settlement on merge enabled. Old device-local settings no longer apply. Changing a rule does not reopen settled threads. No database migration is needed.
Focused tests, scoped typechecks, targeted lint, and formatting passed. The browser check used two independent browser sessions against disposable servers with API-seeded data. No agent sessions were started. Native UI was not tested.
The images show the second browser after the first disabled "Auto-settle merged threads". Before this change, the second browser kept the setting on. After this change, both browsers showed it off, including after reload. Disabling inactivity settlement synced between browsers too.
Changes and PR text by GPT-5.6 Sol in T3 Code with the Codex harness.
Note
High Risk
Changes core orchestration settlement, cross-client thread visibility, and git/PR-driven auto-settle decisions; stale or wrong PR identity could mis-classify threads.
Overview
Moves automatic thread settlement off clients and onto the server, so settled state stays consistent without an open app and settings apply per environment.
A new
ThreadSettlementReactorruns periodic sweeps: it evaluates inactivity and PR state viaThreadSettlementPolicy, deduplicates PR lookups (linked PR detail +GitManager.branchPullRequestfor saved branches), and dispatchesthread.auto-settlewith a snapshot-sequence guard and blocks when background work is live. The engine advertisesthreadAutoSettlement;sidebarAutoSettleAfterDays/sidebarAutoSettleOnMergeare server settings (desktop client defaults drop the old keys).Clients render server truth: mobile Thread List v2 partitions on
settledOverrideonly—removed per-row PR streaming, deviceautoSettleOnMerge, andeffectiveSettledinference. Mobile General settings expose per-environment auto-settle-on-merge toggles backed by server settings when the capability is on.Settle command behavior tightens: blocked manual/auto settle returns
OrchestrationThreadSettleBlockedError(persisted rejected receipt); websocket settle no longer chains session stop—ProviderCommandReactorstops the provider onthread.settledwithonlyIfSettled.GitManagergains identity-checked PR lookup caching for settlement and branch lookups without changing checkout.Reviewed by Cursor Bugbot for commit 03db756. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Move thread auto-settlement from client to server with
ThreadSettlementReactorThreadSettlementReactorthat periodically sweeps threads and dispatchesthread.auto-settlecommands based on PR status and inactivity, grouped by PR context to minimize lookups.ThreadSettlementPolicywithshouldAutoSettleThread,isAutoSettlementCandidate,pullRequestSettles, andthreadHasQueuedTurnStart; the decider and engine now enforceOrchestrationThreadSettleBlockedErrorfor blocked settles and rejectthread.auto-settlewhen the thread changed or has live background work.GitManager.branchPullRequestto resolve a branch's PR without changing checkout, with caching keyed by branch existence and remote identity.sidebarAutoSettleAfterDaysandsidebarAutoSettleOnMergefromClientSettingstoServerSettings; web/mobile UIs now rely solely on server-projectedsettledOverrideand render per-environment toggles gated by the newthreadAutoSettlementcapability.effectiveSettled,canSettle,changeRequestAutoSettles, and local PR-state tracking across web/mobile/desktop; clients no longer block settle locally.ClientSettingsSchemano longer acceptssidebarAutoSettleAfterDays/sidebarAutoSettleOnMerge; clients with legacy persisted values may fail validation unless migrated.ws.tsno longer stops provider sessions or closes terminals onthread.settle(onlythread.archivedoes); session stop now happens via theProviderCommandReactorthread.settledhandler.Macroscope summarized 03db756.