Skip to main content

Refinement

The default format. Each panelist builds on the previous models' arguments in rotated order, refining toward a single best answer. The chairman synthesizes the final verdict.

Models: 1 to 8 · Tone: collaborative · Best for: drafts, essays, recommendations, decisions with a single best answer.

When to use

Reach for Refinement when the question has a "right answer" or a clear best position and you want the panel to converge on it.

  • Drafting or revising a document
  • A recommendation you need to defend
  • A decision that needs a clear rationale
  • Research synthesis with a single coherent thesis
  • Code review where there's a "best" implementation

If the question is genuinely contested, use Oxford Union instead. If you're trying to break your own idea, use Devil's Advocate.

How it works

  1. Round 1. Every model speaks in the order you specified in the assembly. Each sees the prompt and the empty history.
  2. Round 2..N. Each model speaks in rotated order. Rotation prevents the first-listed model from anchoring the conversation. The model that spoke first in round 1 speaks second in round 2, and so on.
  3. Consensus check. After each round, an independent evaluator scores pairwise agreement between every model's response. The mean agreement is the round's panelScore.
  4. Convergence. When panelScore >= agreementLimit, 75% by default, the debate ends early. Otherwise, it runs to maxRounds.
  5. Chairman synthesis. A separate chairman model reads the entire transcript and writes the verdict. The default is deepseek/deepseek-v4-pro.

Each model's response must be JSON of the form:

{
 "disagreements": ["…specific points where I disagree with prior models…"],
 "improvements": ["…what I'm adding, fixing, or strengthening…"],
 "refinedAnswer": "…the full conversational response…"
}

The disagreements and improvements arrays power the persuasion graph. They let the system track which models actually moved between rounds.

Request body

format: "REFINEMENT" is equivalent to mode: "REFINEMENT" for this format. No formatMeta required.

curl -X POST https://rigordesk.com/api/v1/assemblies \
 -H "Authorization: Bearer $DBT_KEY" \
 -H "Content-Type: application/json" \
 -d '{
 "name": "Essay Refinement Panel",
 "format": "REFINEMENT",
 "maxRounds": 3,
 "agreementLimit": 80,
 "models": [
 { "id": "openai/gpt-5.5", "role": "DRAFTER" },
 { "id": "anthropic/claude-opus-4.8", "role": "REVIEWER" },
 { "id": "google/gemini-3.1-pro-preview", "role": "SYNTHESIZER" }
 ]
 }'

Then run a debate against it:

curl -X POST https://rigordesk.com/api/v1/debates \
 -H "Authorization: Bearer $DBT_KEY" \
 -H "Content-Type: application/json" \
 -H "Idempotency-Key: $(uuidgen)" \
 -d '{
 "prompt": "Write a 200-word executive summary of our Q3 results, focused on the 22% revenue beat and the 3% churn uptick.",
 "assemblyId": "PUT_ASSEMBLY_ID_HERE"
 }'

Example prompt

"Refactor this 200-line React component for readability. Preserve the public API and the existing tests. Highlight any trade-offs in the recommendation."

What the verdict looks like

{
 "status": "COMPLETED",
 "finalAnswer": "## Recommendation

The most defensible refactor splits the 200-line component into three pieces along the existing render lifecycle:

1. **`<UserTable>`** (lines 1 to 80), pure presentation, no state.
2. **`useUserFilters()`** (lines 81 to 130), all the filter state, derived selectors.
3. **`<UserTableContainer>`** (lines 131 to 200), orchestrates data fetching, calls the hook, renders the presentational component.

This is a clean extraction with no behavior change. Tests pass without modification because the public API is unchanged.

## Trade-offs

- **Slightly more files** for a 200-line input. Worth it for testability and onboarding.
- **Hook indirection** for non-React experts. Add a one-line comment explaining the split.
- **Slight perf cost** from an extra render boundary. Negligible at this size.

## Alternative considered

A single `<UserTable>` with custom hooks for state and a thin sub-component for the toolbar. Rejected because it keeps more state inside the parent and is harder to test in isolation.

### Per-claim confidence

- Refactor preserves public API: 95
- Three-file split is the cleanest: 82
- Perf cost is negligible: 88

### Dissent preserved

- **Grok 4.3 (78% agreement)**: \"Two-file split is enough at this size. Three is over-engineering for 200 lines.\"
",
 "totalCost": 0.42,
 "totalTokens": 12100,
 "rounds": [ /* full transcript */ ]
}

Tuning notes

  • agreementLimit. Start at 75 for general use. Bump to 85+ for high-stakes recommendations where you want the panel to genuinely agree, not just nod. Drop to 60 for exploratory questions where you want to see the disagreement.
  • maxRounds. 3 is the right default for most prompts. Use 5 for deep research synthesis. Use 2 for fast/cheap iterations.
  • Number of models. 3 is the sweet spot. 2 starts to feel thin. 5+ adds cost without much quality lift for most questions.