Factor 1.0 · the autonomous coder

Models debate.
Tests decide.

A terminal-native coding agent that puts frontier models in a room, has them debate the approach, generates candidate implementations, runs them against your tests, and ships the one that actually passes — then records why.

Install

One command.

curl -fsSL https://factor.ac/install.sh | sh

Then, inside any git repo with a provider key set (OPENROUTER_API_KEY covers every model):

factor "add input validation to the signup handler"
The loop

Fused by debate. Judged by reality.

task
  → PLAN       one strong model drafts the approach
  → DEBATE     models cross-examine the plan — no model "winner"
  → FAN-OUT    N frontier models write candidate diffs in parallel
  → EXECUTE    run each candidate: tests · typecheck · lint · build (sandboxed)
  → SELECT     keep what passes; tie-break on coverage + smallest diff
  → REPAIR     feed failures back to the closest candidate, until green
  → COMMIT     apply the winning diff + write the decision record

Each candidate runs in its own throwaway git worktree — your working tree is never touched until you approve. Factor commits locally; pushing stays your call.

Fused

Debate, not a blind panel

Models cross-examine each other and refine — so the work gets better, not just selected by one biased arbiter.

Verified

Your tests are the judge

No model plays jury. Candidates run against tests, typecheck, lint and build; the one that passes wins.

Self-repairing

Failures loop back

When nothing's green, Factor hands the closest candidate its own diff and the exact gate output, and tries again.

Remembered

The why, committed

Every change lands with an ADR in DECISIONS.md — the reasoning, the candidates considered, the cost.

Why not just…

One model? Routing? Blind fusion?

A single frontier model is one shot — generating several candidates and selecting by tests beats pass@1. Routing only picks a model; Factor verifies the output. Blind "fusion" runs models alone and lets one judge — Factor makes them improve each other and lets execution decide. The promise isn't a leaderboard number; it's never merge a hallucinated diff.