forza
Configurable workflow orchestrator for agent driven software development.
How it works
GitHub Issue → Triage → Workflow → Stages → Pull Request
Point it at a GitHub issue, it decides if the issue is ready, picks a workflow template, executes stages (plan, implement, test, review), and opens a PR. Each stage runs a bounded agent session in an isolated git worktree.
Quick start
# Process a single issue
# Preview without executing
# Example output:
# Would run workflow 'bug' for issue #123: Fix login crash
# Stages: plan → implement → test → review → open_pr
# Estimated cost: $0.80 - $1.50 (avg $1.05, based on 3 previous bug runs)
# (cost line shown only when historical run data exists)
# Poll for eligible issues
# Watch mode (continuous polling)
Configuration
Forza uses a forza.toml (or runner.toml) config with named routes:
[]
= "owner/name"
= "claude-sonnet-4-6"
= "runner:ready"
[]
= "issue"
= "bug"
= "bug"
= 1
= 60
[]
= "issue"
= "enhancement"
= "feature"
= 2
= 300
Concepts
Route
A named lane that maps a type (issue/pr) + label to a workflow. Each route has its own concurrency and polling frequency.
Workflow Template
The stage chain for a type of work. Built-in templates:
| Template | Stages |
|---|---|
| bug | plan → implement → test → review → open_pr |
| feature | plan → implement → test → review → open_pr |
| chore | implement → test → open_pr |
| research | research → comment |
Stage
A bounded unit of work. Each stage has a kind, a prompt, tool scoping, and retry policy.
Lease
GitHub labels that prevent duplicate work: runner:ready → runner:in-progress → runner:complete.
Architecture
Three separated layers:
┌─────────────────────────────────────────────────────┐
│ Platform (github.rs) │
│ Issues, PRs, comments, labels via gh CLI │
├─────────────────────────────────────────────────────┤
│ Domain (config, triage, planner, workflow) │
│ Orchestration — what to do and when │
├─────────────────────────────────────────────────────┤
│ Execution (executor, isolation) │
│ Agent invocation and work isolation │
└─────────────────────────────────────────────────────┘
Agent-agnostic via the AgentAdapter trait. Claude is the default, pluggable for other agents.
Status
MVP working. 12+ runs, 100% success rate. Processing its own issues to build itself.