Skip to content

Pull-request feedback

Started when a pull request gets review feedback a pull-request feedback trigger selects — a changes-requested review or an explicit /auto-swe fix comment. The round is re-read from the host and the member threads screened, fixed by the review fixer or by the agent that opened the pull request, pushed onto the pull request’s branch as a fast-forward, reported back on the pull request, and followed up once when the pushed commit fails CI. Never changes workflow files and never merges.

Template address-pr-feedback
Works on A git repository, cloned into an isolated Docker sandbox
Where a person acts Nobody inside the run. The pull request it opens is merged by a person, outside it.

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_gather["Gather"]
  n_routeDecision{"Route decision?"}
  n_routeFixer{"Route fixer?"}
  n_respondSkipped["Respond skipped"]
  n_agentFix["Agent fix"]
  n_fix["Fix"]
  n_skipped(["Skipped"])
  n_checkAgentFix{"Check agent fix?"}
  n_checkFix{"Check fix?"}
  n_respondFixFailed["Respond fix failed"]
  n_checkChanged{"Check changed?"}
  n_runLint["Run lint"]
  n_cleanupFixFailed["Cleanup fix failed"]
  n_respondNoChange["Respond no change"]
  n_pushFix["Push fix"]
  n_runTypecheck["Run typecheck"]
  n_failedFix(["Failed<br/><small>failed fix</small>"])
  n_cleanupNoChange["Cleanup no change"]
  n_checkPushed{"Check pushed?"}
  n_runTests["Run tests"]
  n_doneNoChange(["Done<br/><small>done no change</small>"])
  n_checkPushThrew{"Check push threw?"}
  n_respondPushRefused["Respond push refused"]
  n_respondPushThrew["Respond push threw"]
  n_respondPushed["Respond pushed"]
  n_cleanupRefused["Cleanup refused"]
  n_watchCi["Watch CI"]
  n_failedPush(["Failed<br/><small>failed push</small>"])
  n_checkWatchCi{"Check watch CI?"}
  n_respondCiUnknown["Respond CI unknown"]
  n_checkCi{"Check CI?"}
  n_finishPush["Finish push"]
  n_checkRetry{"Check retry?"}
  n_respondCiOk["Respond CI ok"]
  n_done(["Done"])
  n_respondCiFailed["Respond CI failed"]
  n_fetchLogs["Fetch logs"]
  n_finishPushFailed["Finish push failed"]
  n_routeRetry{"Route retry?"}
  n_failed(["Failed"])
  n_retryAgentFix["Retry agent fix"]
  n_retryFix["Retry fix"]
  n_checkRetryAgent{"Check retry agent?"}
  n_checkRetryFix{"Check retry fix?"}
  n_pushAgain["Push again"]
  n_checkPushedAgain{"Check pushed again?"}
  n_watchCiAgain["Watch CI again"]
  n_checkWatchCiAgain{"Check watch CI again?"}
  n_checkCiAgain{"Check CI again?"}
  n_gather --> n_routeDecision
  n_routeDecision -->|"yes"| n_routeFixer
  n_routeDecision -->|"no"| n_respondSkipped
  n_routeFixer -->|"yes"| n_agentFix
  n_routeFixer -->|"no"| n_fix
  n_respondSkipped --> n_skipped
  n_agentFix --> n_checkAgentFix
  n_fix --> n_checkFix
  n_checkAgentFix -->|"yes"| n_respondFixFailed
  n_checkAgentFix -->|"no"| n_checkChanged
  n_checkFix -->|"yes"| n_respondFixFailed
  n_checkFix -->|"no"| n_runLint
  n_respondFixFailed --> n_cleanupFixFailed
  n_checkChanged -->|"yes"| n_respondNoChange
  n_checkChanged -->|"no"| n_pushFix
  n_runLint --> n_runTypecheck
  n_cleanupFixFailed --> n_failedFix
  n_respondNoChange --> n_cleanupNoChange
  n_pushFix --> n_checkPushed
  n_runTypecheck --> n_runTests
  n_cleanupNoChange --> n_doneNoChange
  n_checkPushed -->|"yes"| n_checkPushThrew
  n_checkPushed -->|"no"| n_respondPushRefused
  n_runTests --> n_checkChanged
  n_checkPushThrew -->|"yes"| n_respondPushThrew
  n_checkPushThrew -->|"no"| n_respondPushed
  n_respondPushRefused --> n_cleanupRefused
  n_respondPushThrew --> n_cleanupRefused
  n_respondPushed --> n_watchCi
  n_cleanupRefused --> n_failedPush
  n_watchCi --> n_checkWatchCi
  n_checkWatchCi -->|"yes"| n_respondCiUnknown
  n_checkWatchCi -->|"no"| n_checkCi
  n_respondCiUnknown --> n_finishPush
  n_checkCi -->|"yes"| n_checkRetry
  n_checkCi -->|"no"| n_respondCiOk
  n_finishPush --> n_done
  n_checkRetry -->|"yes"| n_respondCiFailed
  n_checkRetry -->|"no"| n_fetchLogs
  n_respondCiOk --> n_finishPush
  n_respondCiFailed --> n_finishPushFailed
  n_fetchLogs --> n_routeRetry
  n_finishPushFailed --> n_failed
  n_routeRetry -->|"yes"| n_retryAgentFix
  n_routeRetry -->|"no"| n_retryFix
  n_retryAgentFix --> n_checkRetryAgent
  n_retryFix --> n_checkRetryFix
  n_checkRetryAgent -->|"yes"| n_respondCiFailed
  n_checkRetryAgent -->|"no"| n_pushAgain
  n_checkRetryFix -->|"yes"| n_respondCiFailed
  n_checkRetryFix -->|"no"| n_pushAgain
  n_pushAgain --> n_checkPushedAgain
  n_checkPushedAgain -->|"yes"| n_watchCiAgain
  n_checkPushedAgain -->|"no"| n_respondCiFailed
  n_watchCiAgain --> n_checkWatchCiAgain
  n_checkWatchCiAgain -->|"yes"| n_respondCiUnknown
  n_checkWatchCiAgain -->|"no"| n_checkCiAgain
  n_checkCiAgain -->|"yes"| n_respondCiFailed
  n_checkCiAgain -->|"no"| n_respondCiOk

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/addressPrFeedback.ts.

© 2026 Jorge Barnaby

Source-available under FSL-1.1-MIT

Source on GitHub

Built with Astro and Starlight