Skip to content

feat(merge): make merge asynchronous via runway#247

Draft
behinddwalls wants to merge 1 commit into
preetam/mergeconflict-asyncfrom
preetam/merge-async
Draft

feat(merge): make merge asynchronous via runway#247
behinddwalls wants to merge 1 commit into
preetam/mergeconflict-asyncfrom
preetam/merge-async

Conversation

@behinddwalls

@behinddwalls behinddwalls commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator

Summary

Rework the merge stage from a synchronous in-process pusher call into a
runway round-trip, mirroring the merge-conflict check. The merge
controller now builds a full runway MergeRequest from the batch's member
requests (one MergeStep per request, in Contains order) and publishes it
to the runway-owned merger queue, keyed by the batch id as the
correlation id. A new mergesignal controller consumes the MergeResult off
merger-signal, transitions the batch to Succeeded/Failed, and fans out to
conclude and speculate; a mergesignal DLQ reconciler fails the batch on
an unprocessable result.

The in-process pusher extension is retired from the orchestrator wiring
(left in-tree but unused, like mergechecker); removal is a follow-up.
workflow.md and extension-contract.md updated to reflect both the check
and the merge crossing into runway over the shared MergeRequest/
MergeResult contract.

Co-authored-by: Cursor cursoragent@cursor.com

Test Plan

Issues

Stack

  1. feat(mergeconflict): make merge-conflict check asynchronous via runway #245
  2. @ feat(merge): make merge asynchronous via runway #247

Rework the merge stage from a synchronous in-process pusher call into a
runway round-trip, mirroring the merge-conflict check. The merge
controller now builds a full runway MergeRequest from the batch's member
requests (one MergeStep per request, in Contains order) and publishes it
to the runway-owned merger queue, keyed by the batch id as the
correlation id. A new mergesignal controller consumes the MergeResult off
merger-signal, transitions the batch to Succeeded/Failed, and fans out to
conclude and speculate; a mergesignal DLQ reconciler fails the batch on
an unprocessable result.

The in-process pusher extension is retired from the orchestrator wiring
(left in-tree but unused, like mergechecker); removal is a follow-up.
workflow.md and extension-contract.md updated to reflect both the check
and the merge crossing into runway over the shared MergeRequest/
MergeResult contract.

Co-authored-by: Cursor <cursoragent@cursor.com>
@behinddwalls behinddwalls force-pushed the preetam/mergeconflict-async branch from 7ab64d3 to b6042a6 Compare June 17, 2026 18:00
@behinddwalls behinddwalls force-pushed the preetam/merge-async branch from 4a525e5 to 288e995 Compare June 17, 2026 18:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant