Skip to content

Ticket to merge with a Qodo review

The flagship ticket-to-merge flow with one more check: once CI is green it reads Qodo’s review of the final commit. A review with an open action_required finding asks a person whether to continue to the merge wait or stop, and anything else goes straight on. It only reads the review that Qodo’s pull request bot produces, and it does nothing while the Qodo integration is off.

Template ticket-to-merge-qodo
Works on A git repository, cloned into an isolated Docker sandbox
Where a person acts Merge the pull request — a person merges on GitHub, waiting up to 7d
Qodo found a blocking issue. Continue anyway? — a person chooses a path, waiting up to 24h
Waits on systems CI result, up to 4h

Drawn from the template spec at build time. Bookkeeping nodes that only record status are left out; amber nodes are where a person acts.

flowchart TD
  n_gatherTicket["Gather ticket"]
  n_validate["Validate"]
  n_checkActionable{"Check actionable?"}
  n_terminateNotActionable(["Failed<br/><small>not actionable</small>"])
  n_implement["Implement"]
  n_review["Review"]
  n_checkApproval{"Check approval?"}
  n_openPR["Open PR"]
  n_checkReviewLimit{"Check review limit?"}
  n_loadCiWaitConfig["Load CI wait config"]
  n_lessonReviewFailed["Lesson review failed"]
  n_reviewFix["Review fix"]
  n_routeCiWait{"Route CI wait?"}
  n_terminateReviewFailed(["Failed<br/><small>review failed</small>"])
  n_pollForCI["Poll for CI"]
  n_waitForCI[/"Wait for CI<br/><small>waits up to 4h: CI result</small>"/]
  n_checkCI{"Check CI?"}
  n_terminateCITimedOut(["Timed out<br/><small>ci timed out</small>"])
  n_qodoReview["Qodo review"]
  n_checkCILimit{"Check CI limit?"}
  n_qodoGate{"Qodo gate?"}
  n_lessonCIFailed["Lesson CI failed"]
  n_fetchLogs["Fetch logs"]
  n_qodoDecision>"Qodo found a blocking issue. Continue anyway?<br/><small>person: decision</small>"]
  n_waitForHumanMerge[/"Wait for human merge<br/><small>waits up to 7d: A person merges the pull request</small>"/]
  n_terminateCIFailed(["Failed<br/><small>ci failed</small>"])
  n_ciFix["CI fix"]
  n_terminateQodoTimedOut(["Timed out<br/><small>qodo timed out</small>"])
  n_terminateQodoStopped(["Failed<br/><small>qodo stopped</small>"])
  n_commitLesson["Commit lesson"]
  n_lessonMergeTimedOut["Lesson merge timed out"]
  n_done(["Done"])
  n_terminateMergeTimedOut(["Timed out<br/><small>merge timed out</small>"])
  n_gatherTicket --> n_validate
  n_validate --> n_checkActionable
  n_checkActionable -->|"yes"| n_terminateNotActionable
  n_checkActionable -->|"no"| n_implement
  n_implement --> n_review
  n_review --> n_checkApproval
  n_checkApproval -->|"yes"| n_openPR
  n_checkApproval -->|"no"| n_checkReviewLimit
  n_openPR --> n_loadCiWaitConfig
  n_checkReviewLimit -->|"yes"| n_lessonReviewFailed
  n_checkReviewLimit -->|"no"| n_reviewFix
  n_loadCiWaitConfig --> n_routeCiWait
  n_lessonReviewFailed --> n_terminateReviewFailed
  n_reviewFix --> n_review
  n_routeCiWait -->|"yes"| n_pollForCI
  n_routeCiWait -->|"no"| n_waitForCI
  n_pollForCI --> n_checkCI
  n_waitForCI -->|"received"| n_checkCI
  n_waitForCI -->|"timed out"| n_terminateCITimedOut
  n_checkCI -->|"yes"| n_qodoReview
  n_checkCI -->|"no"| n_checkCILimit
  n_qodoReview --> n_qodoGate
  n_checkCILimit -->|"yes"| n_lessonCIFailed
  n_checkCILimit -->|"no"| n_fetchLogs
  n_qodoGate -->|"yes"| n_qodoDecision
  n_qodoGate -->|"no"| n_waitForHumanMerge
  n_lessonCIFailed --> n_terminateCIFailed
  n_fetchLogs --> n_ciFix
  n_qodoDecision -->|"timed out"| n_terminateQodoTimedOut
  n_qodoDecision -->|"Continue to the merge wait"| n_waitForHumanMerge
  n_qodoDecision -->|"Stop the run"| n_terminateQodoStopped
  n_waitForHumanMerge -->|"received"| n_commitLesson
  n_waitForHumanMerge -->|"timed out"| n_lessonMergeTimedOut
  n_ciFix --> n_review
  n_commitLesson --> n_done
  n_lessonMergeTimedOut --> n_terminateMergeTimedOut
  class n_qodoDecision,n_waitForHumanMerge gate
  class n_waitForCI wait

Ships as a built-in template and reuses the engineering steps the flagship flow runs. This particular arrangement of them is not separately exercised end to end against a real repository. See product overview §8.

Every built-in template is seeded into the workflow library and can be cloned, edited on the visual canvas, and versioned — see architecture for the node types. The spec lives in packages/shared/src/workflow/templates/ticketToMergeQodo.ts.

© 2026 Jorge Barnaby

Source-available under FSL-1.1-MIT

Source on GitHub

Built with Astro and Starlight