Redundant
The Redundant pattern sends the same problem to multiple specialists with different perspectives; an evaluator at the end picks the best answer or synthesises across them.
Classic (non-beta) primitives: DefaultPattern with parallel dispatch, evaluator at the end, ContextVariables collecting per-specialist results.
Key Characteristics#
- Fan-out via sequence.
TransitionGraph.sequenceruns each proposer in turn. Proposers are prompted to differentiate (e.g. "suggest something different from prior proposals — clever pun"). - Evaluator at the end. The evaluator sees all three proposals in its projected history and picks the best one.
sequence_completeterminates after the evaluator's reply.
Routing Mechanics#
There is no routing tool in this pattern — every step is a plain FromSpeaker(a) → AgentTarget(b) rule wired by TransitionGraph.sequence([...]). Each proposer's reply is visible to subsequent proposers via the windowed view, so the prompt "suggest something DIFFERENT from any prior proposal" works without any explicit state tracking.
Agent Flow#
sequenceDiagram
participant Intake as intake
participant Safe as proposer_safe
participant Clever as proposer_clever
participant Nerdy as proposer_nerdy
participant Evaluator as evaluator
Intake->>Safe: kickoff (FromSpeaker → AgentTarget)
Safe->>Clever: [safe]: <name> — <rationale>
Clever->>Nerdy: [clever]: <name> — <rationale>
Nerdy->>Evaluator: [nerdy]: <name> — <rationale>
Evaluator->>Intake: WINNER / NAME / REASON
Note over Intake,Evaluator: TerminateTarget("sequence_complete") fires after evaluator's reply Migration Notes#
| Classic | Beta |
|---|---|
| Parallel dispatch to N specialists | Sequential TransitionGraph.sequence([...]) (no parallel today) |
ContextVariables collecting per-specialist results | Each proposer reads prior proposals from the windowed view; evaluator reads all three from its context |
Evaluator picks via ReplyResult and signals completion | Evaluator writes a plain text reply; sequence_complete terminates the run automatically |
Gaps & Workarounds#
- No parallel dispatch. Classic Redundant could fan out to three specialists simultaneously and the evaluator would receive all three responses. Beta workflow is strictly sequential. Workaround: the sequential version above is functionally equivalent for synthesis, just slower (3× LLM latency instead of 1×). For genuine parallelism, run the specialists in separate
consultingsessions opened by the asker's tool, gather replies viawait_for_session_event, then write the results back into the main workflow'scontext_varsviaset_context. Heavier but parallel. - No
NestedChatTarget. Same as Hierarchical — child sessions are the workaround when you genuinely want isolated specialist runs.
Code#
Tip
All four agents use real Sonnet so the proposals and the evaluator's pick are genuinely LLM-driven.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | |
Output#
session: 7e91...
intake: Suggest a name for our new code-review SaaS. It runs as a GitHub bot and gives senior-engineer-style feedback on PRs.
safe: [safe]: ReviewPro — a clear, professional name signalling thorough code review with senior-level expertise.
clever: [clever]: PullSenior — a pun on "pull request" + "senior" that hints at the bot's seniority while staying memorable.
nerdy: [nerdy]: Linus's Reviewer — a nod to Linus Torvalds's famously direct kernel reviews, signalling the bot delivers no-nonsense senior-engineer feedback.
evaluator: WINNER: clever
NAME: PullSenior
REASON: PullSenior is memorable, on-brand for GitHub workflows, and immediately conveys the product's value (senior-level pull-request review) without sacrificing clarity.
closed: reason='sequence_complete'