Repository navigation
feat(orchestration): retain native outcome purpose - #388
Conversation
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. |
Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
62a127b to
a948563
Compare
Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
a948563 to
e10b793
Compare
Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
e10b793 to
94945e3
Compare
|
What: One blocking child inheritance gap remains in PR #388. Finding
No tests or typechecks were run, as requested. Verdict: failure (blocking finding). |
|
What: Exact-head review of Reviewed read-only at head Blocking
Non-blocking
Checked, not a defect
Decisions for you
Verdict: FAIL |
Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…te children Review round 1 on #388: - `inherit` now carries the parent run's exact scope, unscoped included, locally, through thread launch and through remote delegation. - A remote child launched without purpose intent records no launch evidence; its omitted-intent follow-up now continues as warned legacy unscoped, as a local one does, instead of being refused. - Muse and OpenCode v2 advertise unavailable usage finality, matching their unsupported evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1eac47a to
b72b01e
Compare
Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…te children Review round 1 on #388: - `inherit` now carries the parent run's exact scope, unscoped included, locally, through thread launch and through remote delegation. - A remote child launched without purpose intent records no launch evidence; its omitted-intent follow-up now continues as warned legacy unscoped, as a local one does, instead of being refused. - Muse and OpenCode v2 advertise unavailable usage finality, matching their unsupported evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
FYI from the #393 planner: PR #512 (#402, Run groups) changes |
b72b01e to
0e8faab
Compare
Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…te children Review round 1 on #388: - `inherit` now carries the parent run's exact scope, unscoped included, locally, through thread launch and through remote delegation. - A remote child launched without purpose intent records no launch evidence; its omitted-intent follow-up now continues as warned legacy unscoped, as a local one does, instead of being refused. - Muse and OpenCode v2 advertise unavailable usage finality, matching their unsupported evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
What: Round 2 review of Reviewed exact SHA FindingsNone. Round-1 blockers checked
Rebase checksThe exact candidate retains main’s stop-disposed follow-up wake behavior in Verdict: SUCCESS (no blocking finding). |
Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…te children Review round 1 on #388: - `inherit` now carries the parent run's exact scope, unscoped included, locally, through thread launch and through remote delegation. - A remote child launched without purpose intent records no launch evidence; its omitted-intent follow-up now continues as warned legacy unscoped, as a local one does, instead of being refused. - Muse and OpenCode v2 advertise unavailable usage finality, matching their unsupported evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
0e8faab to
7bf9c74
Compare
|
What: Round 2 review of exact SHA Reviewed read-only against Blocking at
|
Review round 2 on #388: - Group cancel keeps main's order (stop, then dispose on success). A member stopped by that cancel and ending before its own disposal no longer releases the cancelled group's wake; a member that refuses the cancel is never stopped, so its result still wakes the parent. - A PR watch started without purpose intent (mobile, older agents) is saved as warned legacy unscoped instead of being rejected; re-watching without intent keeps a purpose saved earlier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
What: Reviewed PR #388 at
Verdict: FAILURE |
|
What: Round 3 review of exact SHA Reviewed read-only against Blocking
Non-blocking
Verified at this SHA
Out of scope as agreed: mobile Steer after run end, Verdict for |
Review round 3 on #388: - A whole-group task_cancel first records its id on every member in one command. While a member carries it, its wake is suppressed whenever and in whatever order it ends. A member whose stop is refused has the mark cleared under the same id, and a result it finished meanwhile is re-planned, so its result and any later user Stop wake the parent. The order-dependent hold rule in runGroupWake is removed. - The shared client-runtime watch action saves the thread's purpose choice on a new watch, so mobile and web both send it; the web-only wrapper is gone. Agents calling watch_pull_request without intent stay warned legacy unscoped. - SelectionRestart's replay assertion checks the replayed sequence, events and admitted run instead of the exact result shape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
What: At I did not run tests, as requested. The release/wake path above is traced from the pushed source. Verdict: FAILURE |
|
What: Round 4 review of exact SHA Reviewed read-only against Verified at this SHA
Non-blocking
Out of scope as agreed: mobile Steer after run end, Verdict for |
…r ends last Review round 4 on #388: a refused member released from the group cancel after it had already ended is held for the group. When the last running member then ends under the cancel's mark, it is quieted and now plans the group's one wake for those held members. The release step also re-plans a refused member that ended before the cancel and was still held. SelectionRestart's messageId replay pins admittedRun to undefined. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
What: Review of commit 45eaaf2 finds the held group member is delivered once when the last marked member ends. |
* feat(orchestration): retain native outcome purpose Pin a typed Issue or PR purpose on every admitted run, carry it through children, continuations, remote launches, schedules, watches and the mobile outbox, and retain supported native causal evidence per adapter (#377). Ports PR #388's four checkpoints onto current main. Agent auto sends now queue, as on main, when steering would cancel running Claude tools, and the repeated Claude steer test waits for its real skill discovery instead of a fixed tick budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(orchestration): inherit unscoped parents and continue legacy remote children Review round 1 on #388: - `inherit` now carries the parent run's exact scope, unscoped included, locally, through thread launch and through remote delegation. - A remote child launched without purpose intent records no launch evidence; its omitted-intent follow-up now continues as warned legacy unscoped, as a local one does, instead of being refused. - Muse and OpenCode v2 advertise unavailable usage finality, matching their unsupported evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(orchestration): keep group cancel and legacy PR watches correct Review round 2 on #388: - Group cancel keeps main's order (stop, then dispose on success). A member stopped by that cancel and ending before its own disposal no longer releases the cancelled group's wake; a member that refuses the cancel is never stopped, so its result still wakes the parent. - A PR watch started without purpose intent (mobile, older agents) is saved as warned legacy unscoped instead of being rejected; re-watching without intent keeps a purpose saved earlier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(orchestration): record group cancel before stopping members Review round 3 on #388: - A whole-group task_cancel first records its id on every member in one command. While a member carries it, its wake is suppressed whenever and in whatever order it ends. A member whose stop is refused has the mark cleared under the same id, and a result it finished meanwhile is re-planned, so its result and any later user Stop wake the parent. The order-dependent hold rule in runGroupWake is removed. - The shared client-runtime watch action saves the thread's purpose choice on a new watch, so mobile and web both send it; the web-only wrapper is gone. Agents calling watch_pull_request without intent stay warned legacy unscoped. - SelectionRestart's replay assertion checks the replayed sequence, events and admitted run instead of the exact result shape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(orchestration): release held group members when a cancelled member ends last Review round 4 on #388: a refused member released from the group cancel after it had already ended is held for the group. When the last running member then ends under the cancel's mark, it is quieted and now plans the group's one wake for those held members. The release step also re-plans a refused member that ended before the cancel and was still held. SelectionRestart's messageId replay pins admittedRun to undefined. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
What: Record immutable Issue/PR purpose before run execution and retain supported native causal evidence across clients.
Why: A thread's changing selection and delegated job identity cannot establish which outcome a run serves.
So what: All review findings are fixed at
45eaaf2b74. Fable passed through08877e706eand Luna passed the final delta; merging needs the developer, and two behaviour questions below are the user's to answer.Implements #377 under the approved policy and design review in toolboxmd/agent-observer#58. Canonical state and handoff: #377.
Ordinary messages pin the visible selection and queue separately when it differs from active work. Steer and Restart retain their resolved target purpose. Versioned intent distinguishes explicit choice from warned legacy omission. Local and remote delegation, source continuations, schedules, watches and mobile outbox records carry that choice through existing owners. Human child follow-ups retain delegated job binding and parent delivery while owning their selected purpose.
Native input witnesses and child/background inventories retain exact observed causes. The contract advertises each adapter's supported evidence and keeps unresolved resume boundaries and unreconciled usage explicit. This PR does not claim universal native finality or implement Observer accounting. No package version changed.
Port onto current main
Main was replaced by the upstream absorption (#419). The four WIP checkpoints (987f5ad, 3d24575, f54a894, 62a127b on old base 118f89e) are now one commit on main.
15d99fa1dae44f8de557d8c766ae68c472c55fdb. Head:45eaaf2b74da575514553203f8129be157830d7d, five commits: the port, then the review round 1, 2, 3 and 4 fixes. The port commit was last rebased over perf(orchestration): stop and resume wake only that thread's subtree #488, fix(web): watch descendant-linked PRs from the parent panel #474, feat(server): White moderates Spectrum free mode #509, fix(server): replay accepted sends during replacement startup #478 and feat(server): one delegation runs several Colors of a role #512, and itsOrchestrator.ts, PR panel, map and fork metadata conflicts were resolved keeping both sides.Orchestrator.ts,EffectWorker.ts,ClaudeAdapterV2.ts,ChatView.tsx,ThreadPullRequestsPanel.tsx,ScheduledTasksSettings.tsx, the mobile thread/settings screens,use-thread-composer-state.ts, pull-request MCP handlers,docs/map.md,docs/fork-features.mdandscripts/fork-upstream-edits.txt. A line-level comparison of the old and new patches differs only in indentation, React-compiler-era memo deps that main removed, comments main dropped, and main's renamed mobileAppText/Dialogimports.CommandPolicy.tsfollows main's split intoresolveDeliveryIntent.ProviderContinuationService.ts/.test.tsare now owned by main'schild-threadsfeature, soexecution-purposelists them as shared files.CI fixes (old Test Server 4 and 5 failures)
ClaudeAutomaticDelivery"agent auto"): this PR's. Agentautosends now carrydeliveryIntent: "auto"so they are classified as ordinary sends that follow the selection. The new restart-capable steer branch then steered Claude while tools ran, anddecideSteeringExecutionrejected it. It now also requiresactiveSteeringInterruptsTools !== true, so the send queues as it does on main.ClaudeAdapterV2"never answers" steer timeout): a test race this branch's timing exposed. The repeated steer reads skills from the real filesystem before it waits on the test clock, and the fixed 100-tick budget could run out first, which left the fiber hanging. The test now advances the clock until the steer settles. It failed in 3 of about 12 full-file runs before the fix, passed 6 of 6 after, and passed 7 of 7 on main.ExecutionPurposeControlusedtry/finally, which the React Compiler coverage gate rejects. It now catches a failed save and shows the save error.ScheduledTaskChecksbare-grant decorator) saved a schedule without a purpose, which Track explicit Issue and PR purpose across runs and continuations #377 rejects for new configuration. The fixture now chooses unscoped, like this PR's other schedule fixtures.Review round 1 fixes
Round 1 at
94945e31c7(Luna, Grok) found two blocking defects. Both are fixed in1eac47a278, each with a test that failed before the fix:Inheriting an unscoped parent failed.
Orchestrator.ts,ThreadLaunchService.tsandRemoteDelegation.tsrejectedinheritunless the parent scope wassingle, so a child of the default Unscoped run never started.inheritnow carries the parent run's exact scope withparent_runprovenance, every unscoped reason included. I kept no refusal formixedorunknown_cause. Copying an unscoped scope assigns no outcome: the child stays unscoped with the same reason, and Observer does not allocate unscoped work. Refusing would only block the child's start, which contradicts "children inherit unless explicitly assigned otherwise". Tests:ExecutionPurpose.integration.test.ts"a delegated child inherits a deliberately unscoped parent run exactly" (local delegated task)ThreadLaunchService.test.ts"a launch inheriting a deliberately unscoped parent run keeps that exact scope" (agent thread launch)RemoteDelegation.test.ts"...launched with inherit intent starts and continues" (remote)Before the fix these failed with
inherit_source_missinglocally and "requires the exact scoped parent run" remotely.A remote child launched without
purposeIntentcould not be continued. The launch records nopurposeLaunchwhen intent is omitted, so that old peers without v1 keep working, andPeerForwardingthen refused the follow-up. An omitted-intent follow-up of such a child now forwards with no continuation evidence and stays warned legacy unscoped there, as a local one does. Explicitinherit, or a recorded launch from another thread, still requires validated evidence. Test:RemoteDelegation.test.ts"...launched with omitted intent starts and continues", which failed before with "no validated purpose evidence".Non-blocking: Muse and OpenCode v2 now advertise
nativeUsageFinality: "unavailable", matching their unsupported evidence.Left for the developer, as the parent asked:
purposeDeliverieskept after a PR unlink, and mobile Steer rejecting and restoring the draft when the run ended before the outbox drained.Review round 2 fixes
Round 2 (Fable) confirmed the round 1 fixes and found two blocking items at the head. Both are fixed in
68b561d2f1, each with a test that fails before the fix.task_cancelon a group stops each member and only then disposes its delivery. A member stopped that way can end before its own disposal lands; the other members are terminal and disposed, so it released the group wake. My first fix disposed before stopping, but that lost the wake of a member whose stop is refused (for example a child raised above the parent's modes). Now main's order is kept inOrchestratorMcpService.ts, andRunGroups.runGroupWakeholds a member whose run ended on an explicit stop request while a sibling's delivery is disposed. Only a group cancel disposes a member's delivery, and its disposal follows. A refused member is never stopped, so its result still wakes the parent. Tests inRunGroups.integration.test.ts: the existing "cancelling the group stops every member and gives up its wake" fails without the rule (one parent offer), and the new "a member that refuses the group cancel keeps its result's wake" fails with the dispose-first order (the refused member's delivery is disposed).watch_pull_requestwithoutpurposeIntent, so starting a watch failed there. Following Track explicit Issue and PR purpose across runs and continuations #377's rule for omitted intent, a watch without intent now starts as warned legacy unscoped, and its wakes fire unscoped. A later re-watch without intent keeps a purpose saved earlier and its watch generation. The web PR panel still sends the thread's selected purpose. I chose this over adding a mobile watch choice because it is smaller and meets Track explicit Issue and PR purpose across runs and continuations #377: old clients and agents keep working, warned unscoped. The now-unusedsaved_intent_missingadmission reason is removed. Test:ExecutionPurpose.integration.test.ts"watch wakes retain saved purpose..." now starts a watch without intent, and re-watches without intent after saving A. It failed before with "Choose an Issue, PR or deliberately unscoped purpose before saving this trigger."Round 2 proof on
68b561d2f1, one file at a time:RunGroups.integration.test.ts10,ExecutionPurpose.integration.test.ts11,mcp/toolkits/pullRequests/handlers.test.ts25, all passing. Servertsc-rs --noEmitalone shows no errors.Review round 3 fixes
Round 3 (Luna, Fable) showed the round 2 group-cancel rule was order-dependent: a sibling ending before its disposal still woke the parent, a later user Stop of a refused member held its wake forever, and some loop orders left the gap open. It also found Test Server 8 red, and that mobile watches still recorded no choice. Fixed in
08877e706e, replacing round 2 items 1 and 2:Group cancel by design (touches feat(server): one delegation runs several Colors of a role #512's code).
task_cancelon a Run group first commitsdelegated_task.group-cancel, recording its command id asgroupCancelon every member before any member is stopped. While a member carries it, the group delivery planner suppresses its wake (a quiet disposed delivery), whenever and in whatever order it ends. Each member is then stopped as on main, and disposed after a successful stop. A member whose stop is refused getsdelegated_task.group-cancel.releaseunder the same id. That clears the mark and re-plans a result the member finished meanwhile, so its result, or a later user Stop, wakes the parent normally. Suppression keys only on that group-cancel id, never on a generic stop. The round 2 hold rule inrunGroupWakeis removed, andRunGroups.tsmatches main again. feat(server): one delegation runs several Colors of a role #512's single-task and Run group contracts are otherwise unchanged. Tests inRunGroups.integration.test.ts:Against the round 2 server code, the refused-then-Stop case and the recorded-cancel case fail. The finished-member case passed there in this run, because that gap depends on run timing the MCP loop does not let a test force. The recorded-cancel test is its deterministic proof.
SelectionRestart.integration.test.ts(Test Server 8). A receipt replay now also returnsadmittedRun. The assertion now checks the requirement: the same sequence and stored events as the first dispatch, and the same admitted run unless the message id changed.Mobile watches send the thread's choice. The shared
createThreadPullRequestWatchActionin client-runtime now takes the thread's purpose selection when the environment advertises purpose v1, and saves it on a new watch. Web and mobile both pass it, and the web-only wrapper is gone. An agent callingwatch_pull_requestwithout intent stays warned legacy unscoped, as in round 2. Test:pullRequestLinkInput.test.ts"saves the thread's purpose choice on a new watch" (reference and default unscoped), which fails against the old action.Left, non-blocking:
t3_thread_sendwithinheritto a thread that is not the caller's child still requires a single-scoped caller run. Round 1 aligned children, agent launches and remote launches; this send path is unchanged.Round 3 proof on
08877e706e, one file at a time, all passing:RunGroups.integration.test.ts14,SelectionRestart.integration.test.ts13,DelegatedCompletionDelivery.test.ts29, client-runtimepullRequestLinkInput.test.ts39.tsc-rs --noEmitshows no errors for server, client-runtime, web and mobile.fork-check.shis OK.Review rounds 4 and 5
Round 4 at
08877e706e(Fable PASS, Luna FAIL) found one lost-wake case in the group-cancel design. Fixed in45eaaf2b74; Luna passed that delta.task_cancelon a Run group first records its command id asgroupCancelon every member, in one command. A marked member ends quietly in any order. A member whose stop is refused is released from the mark under the same id.SelectionRestart'smessageIdreplay case now assertsadmittedRunis undefined.Test:
RunGroups.integration.test.ts"a refused member that already ended wakes the parent once the last member stops" (the mark, the release while the sibling runs, then the sibling's stop; one parent wake). It fails against08877e706ewith no wake. Proof on45eaaf2b74, one file at a time, all passing:RunGroups.integration.test.ts15,SelectionRestart.integration.test.ts13,DelegatedCompletionDelivery.test.ts29. Servertsc-rs --noEmitshows no errors.Proof on the head above
All runs are local
node_modules/.bin/vp test run <files>with isolated fixtures. No dev server, browser, device or live userdata. The first table is from94945e31c7; the round 1 reruns below it ran one file at a time on1eac47a278.Orchestrator.test.ts,EffectWorker.test.ts,issues/featureMap.test.ts(23 files)contractsfull suiteclient-runtimecommands,provider-opencodeadapter, mobile outbox, web schedule logicscripts/fork-maintenance.test.ts,issues/featureMap.test.tsreactCompilerCoverage.test.tstsc-rs --noEmitfor server, web, mobile, contracts, client-runtime, provider-core/opencode/cursor/muse/pi/acpvp fmt --checkandvp linton changed filesbash scripts/fork-check.shRound 1 reruns on
1eac47a278, one file at a time:RemoteDelegation.test.ts39,PeerForwarding.test.ts4,ExecutionPurpose.integration.test.ts11,ThreadLaunchService.test.ts94,runtimeLayer.test.ts81,ClaudeAutomaticDelivery.integration.test.ts21,DelegatedCompletionDelivery.test.ts25,OrchestratorMcpToolkit.integration.test.ts3,mcp/toolkits/core.test.ts17,OpenCode2AdapterV2.test.ts120, provider-opencode adapter 75, provider-muse adapter 28, contractsexecutionPurpose.test.ts3,fork-maintenance.test.ts19, all passing.tsc-rs --noEmitshows no errors for contracts, provider-muse, provider-opencode, client-runtime, server, web and mobile.fork-check.shis OK.After the #492 rebase, run one file at a time on
b72b01ef6a:DelegatedCompletionDelivery.test.ts(#492's own file) 29,ExecutionPurpose.integration.test.ts11,ThreadStop.test.ts49,Orchestrator.control-reads.test.ts5,RestartContinuation.test.ts51,SteeringCompletion.integration.test.ts23,childThreads/requestWake.test.ts9, all passing. Servertsc-rs --noEmitalone shows no errors, andfork-check.shis OK.CI: run 39209438398 on head
45eaaf2b74was in progress when this body was written. Earlier green heads:b72b01ef6arun 39192217825,1eac47a278run 39188747888.Visible UI changes
Yes, on web/desktop and mobile:
Purpose: <label>row above the composer when the environment advertises purpose v1. It expands to an Issue/PR URL field with Select and Clear, plus each run's purpose and provenance. When the running work has a different purpose, it shows a one-line note that Send queues and Steer keeps the running purpose.watch_pull_requestwithout intent starts warned legacy unscoped. Nothing visible changes there.Before/after images are not attached: no browser or device verification was authorized for this pass. The parent owns the integrated UI pass.
Remaining limits
08877e706e; Luna passed the45eaaf2b74delta.purposeDeliveriesstay recorded after a PR is unlinked.t3_thread_sendwithinheritto a thread that is not the caller's child still requires a caller run scoped to a single Issue or PR.task_cancelis retried with the same request, which repeats the stops and releases any refusals.Elon record
Requirements and who asked: The user accepted the multiple-Issue purpose policy in Observer #58 and authorized the dedicated #377 implementation, focused proof, commits, push and one reviewable PR. The parent asked for this port onto the replaced main, made green and review-ready.
Deleted: Opaque outcome registry, purpose repair, prose classification, PR splitting, new transport/services, price work, version bumps and production changes. The four WIP checkpoints are collapsed into one commit. No mobile watch purpose control (mobile reuses the thread's selection), and no order-dependent hold rule.
Bottleneck: The developer's merge decision and the two user questions.
Checked myself: Line-level old vs new patch comparison, typechecks, a reproduction of both CI failures on this branch with main passing the same tests, the fixes, focused suites, lint/format parity with main, and fork-check. For rounds 1 and 2: a test that fails before each fix, and #512's own Run group tests against the rebased head.
Ported and finished by Claude Opus 5.5 (claude-opus-5-5) through Claude Code in T3 Code; original implementation by gpt-6.1-sol, Codex through T3 Code.
🤖 Generated with Claude Code