agentworkforce/review-fix-signoff-loop
Use when writing Agent Relay or Ricky workflows that must loop review, fix, and validation with fresh agent context until independent signoff agents, typically Claude and Codex, both agree the work is comprehensively complete. Covers fresh-context iterations, repairable gates, dual reviewer verdict contracts, iteration-count reporting, PR signoff comments, and blocked-state handling.
npx skills add https://github.com/AgentWorkforce/relay --skill review-fix-signoff-loop
Use this pattern for high-stakes implementation workflows where a normal "implement, test, review once" flow is not enough. The workflow must keep repairing and re-reviewing until independent signoff agents agree the spec is fully wired end to end.
Pair this with writing-agent-relay-workflows for SDK syntax and relay-80-100-workflow for deterministic validation gates.
codex login status is not enough; run a tiny codex exec --ephemeral --json --sandbox read-only -m <supported-model> prompt and fail early with a clear re-login instruction if it cannot return the expected token..workflow-artifacts/<workflow>/iteration-N/preflight.md.implementation-reconcile gate that checks required files, expected API/UI/runtime surfaces, migrations, generated artifacts, and untracked files with git status --short -- <paths>.implemented, dependency-only, intentionally-deferred, or not-applicable, with proof. Do not let "we only bumped the package I remembered" pass this gate.npm view <pkg> version, package manifests, lockfile resolved tarballs/integrities, and npm ls <pkg> from every consuming workspace.failOnError: false, then route the captured output to a repair owner.BLOCKED_NO_COMMIT.md only for true external blockers.preset: 'worker') with a file_exists verification for its durable report. Do not rely on interactive PTY idle detection or /exit for loop progress.SIGNOFF.md that includes iteration count, validation evidence, Claude rationale, Codex rationale, remaining risks, and artifact paths.gh pr view.VERDICT: COMPREHENSIVELY_SATISFIED | FINDINGS | BLOCKED
why_passed: required when VERDICT is COMPREHENSIVELY_SATISFIED
end_to_end_wiring_verified: required when VERDICT is COMPREHENSIVELY_SATISFIED
deterministic_evidence: required when VERDICT is COMPREHENSIVELY_SATISFIED
scope_matrix_verified: required when VERDICT is COMPREHENSIVELY_SATISFIED for cross-repo/provider/package work
remaining_risks: required when VERDICT is COMPREHENSIVELY_SATISFIED
finding_id: stable-id when VERDICT is FINDINGS
severity: blocker | high | medium | low
file: path
issue: concrete gap
fix_required: exact change needed
test_required: deterministic proof needed
evidence: commands, files, or spec clause
repo | branch | PR | package/provider/surface | expected change | producer version | consumer version | files expected | gates required | status | evidence | owner
for (let iteration = 1; ; iteration += 1) {
await runIteration(iteration, runStamp); // new workflow name, channel, and agent names
clearStartFromAfterResumedIteration();
if (hasDualSignoff(iteration)) {
writeAndPostSignoffReport(iteration);
break;
}
}
.agent(`codex-review-fixer-${suffix}`, {
cli: 'codex',
model: CodexModels.GPT_5_4,
preset: 'worker',
role: 'Review-finding fixer. Repairs valid findings and hardens tests/proofs.',
retries: 2,
})
.step('fix-review-findings', {
agent: `codex-review-fixer-${suffix}`,
dependsOn: ['dual-signoff-gate'],
task: `Read iteration artifacts. Fix every valid finding, rerun relevant checks, and write ${dir}/review-fix-report.md.`,
verification: { type: 'file_exists', value: `${ROOT}/${dir}/review-fix-report.md` },
})
gh pr comment "$PR_NUMBER" --body-file .workflow-artifacts/my-workflow/pr-comment.md
.workflow-artifacts/<workflow>/iteration-N/BLOCKED_NO_COMMIT.md
NO_ISSUES_FOUND without pass rationale. Require the full verdict contract.Take agentworkforce/review-fix-signoff-loop from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.