Dual and Triple Workflows
Structured disagreement, not task-splitting. Two or three agents compete on the same problem. A Sage picks the winner.
What it is
For high-stakes work, Bonfire dispatches 2 or 3 Scouts in parallel, each with a different lens or prompt prefix. Their reports land in disjoint file paths. A Sage agent reads all reports and produces a synthesis — not a merge, a decision.
The Sage picks one answer per axis, documents the tradeoff, and hands the synthesis to the next stage.
Where it lives
| File | Lines | Purpose |
|---|---|---|
workflow/research.py | 89 | dual_scout / triple_scout factories |
agents/sage/ | — | Sage structural prompt |
Why this is not task-splitting
Task-splitting asks "which worker gets which sub-problem?" Structured disagreement asks "which of these competing solutions survives synthesis?"
The distinction is load-bearing:
- Task-splitting gives you a 2x throughput gain on independent work. Nothing more.
- Structured disagreement gives you quality — two scouts produce genuinely different approaches, the Sage picks the one that survives critique. One of them is always worse; the Sage says so explicitly and documents the tradeoff.
Real example
From the bonfire-website build (BON-278):
- Scout A flagged "motion budget 3/5, 3-particle cap"
- Scout B recommended "two-branch render for reduced-motion under SMIL"
- Scout C found "CSS
offset-path, baseline since 2022, retires SMIL entirely"
The synthesis reconciled them: pure CSS (Scout C) makes the two-branch SMIL pattern (Scout B) unnecessary. One scout's work was partially superseded; the synthesis said so explicitly.
Workflow availability
Dual and triple workflows ship on every tier, including free. Tier differentiation happens through model class and vault access, never through workflow access. A free-tier user gets the same dual_scout and triple_scout factories as a paid user.