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 |
The workflow
Section titled “The workflow”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
Maturity: built from the flagship steps
Section titled “Maturity: built from the flagship steps”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.
Use it
Section titled “Use it”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