feature: Allow model and harness selection before submitting implementation in a new thread#1877
Conversation
…of direct thread creation
|
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 Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit ef214d1. Configure here.
| await navigate({ | ||
| to: "/draft/$draftId", | ||
| params: buildDraftThreadRouteParams(nextDraftId), | ||
| }); |
There was a problem hiding this comment.
Implementation thread loses plan source linkage
High Severity
The old onImplementPlanInNewThread explicitly sent sourceProposedPlan: { threadId, planId } in the thread.turn.start command, linking the implementation thread to its originating plan. The new flow navigates to a draft thread, where upon submission the regular onSend path runs — but that path's thread.turn.start (around the bootstrap flow) never includes sourceProposedPlan. The onSubmitPlanFollowUp path does include it, but only fires on same-thread plan follow-ups where activeProposedPlan is non-null. On the draft thread, activeProposedPlan is always null since the draft has no proposed plans. This breaks server-side plan-to-implementation tracking and client-side features like the plan sidebar step display.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit ef214d1. Configure here.
There was a problem hiding this comment.
This is a good point but will increase PR scope, let me know if must be done in this scope.
| interactionMode: DEFAULT_INTERACTION_MODE, | ||
| }); | ||
| applyComposerDraftStickyState(nextDraftId); | ||
| setComposerDraftPrompt(nextDraftId, implementationPrompt); |
There was a problem hiding this comment.
Existing project draft silently discarded on implement
Medium Severity
onImplementPlanInNewThread always creates a fresh nextDraftId and calls setLogicalProjectDraftThreadId without first checking whether a draft already exists for the logical project. setLogicalProjectDraftThreadId replaces the logical-project-to-draft mapping and deletes the previous draft's thread state and composer content if it's no longer referenced. If the user had an in-progress draft with unsaved content for the same project, that content is silently destroyed. The existing openOrReuseProjectDraftThread and useHandleNewThread both check for and reuse existing drafts to avoid this.
Reviewed by Cursor Bugbot for commit ef214d1. Configure here.
ApprovabilityVerdict: Needs human review This PR introduces a feature change to implementation thread creation workflow with significant runtime behavior modifications. Two unresolved review comments identify substantive bugs: loss of plan source linkage (high severity) and silent draft data loss (medium severity). These issues need to be addressed before merging. You can customize Macroscope's approvability policy. Learn more. |


What Changed
onImplementPlanInNewThread in ChatView.tsx now navigates to a new draft thread with the implementation prompt pre-filled in the composer, instead of immediately creating a server thread and auto-submitting.
A single new store hook extraction (applyStickyState) was added alongside the existing composer draft hooks.
Why
Previously, "Implement in a new thread" locked the user into whatever model and harness were active on the plan thread — there was no opportunity to change them before the implementation run started.
Plan generation and implementation often benefit from different models or access modes (e.g. plan with a reasoning model under Supervised, implement with a faster model under Full access).
Using the existing draft-thread flow solves this cleanly: the draft composer already exposes the model picker and harness selector, so no new UI is needed. The implementation prompt is pre-filled so the user can review it, adjust settings, and submit when ready.
UI Changes
Before: Clicking "Implement in a new thread" immediately starts the implementation run in a new thread — the user arrives mid-execution with no chance to change the model or harness.
After: Clicking "Implement in a new thread" opens a new draft thread with the implementation prompt pre-filled in the composer. The user can change the model, harness
(Supervised / Auto-accept / Full access), or edit the prompt before manually submitting.
Monosnap.screencast.2026-04-10.11-25-14.mp4
Checklist
Note
Medium Risk
Changes the “Implement in a new thread” flow from immediate server thread creation/dispatch to creating a local draft and navigating, which may affect users’ expectations and any downstream logic that assumed an implementation turn starts automatically.
Overview
Updates
ChatViewso “Implement in a new thread” now creates a new draft thread, pre-fills the implementation prompt, applies sticky composer settings (e.g. model/provider), and navigates to/draft/$draftIdinstead of creating a server thread and auto-submitting the first turn.This removes the orchestration
thread.create/thread.turn.startdispatch (and related error/cleanup handling) from that action, letting users adjust model/runtime/interaction settings before manually sending.Reviewed by Cursor Bugbot for commit ef214d1. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Navigate to a draft thread on 'implement plan in new thread' to allow model and harness selection
onImplementPlanInNewThreadin ChatView.tsx immediately created a server thread and started a turn via orchestration APIs.Macroscope summarized ef214d1.