This tutorial walks through validating a simple agent configuration using Quorum. It uses a deliberately flawed example so you can see what the critics catch.
Clone the repo and navigate to the examples directory:
git clone https://github.com/SharedIntellect/quorum.git
cd quorum/examples/tutorialWe'll validate this agent configuration file (bad-config.yaml). It has several intentional issues.
Note: Model names in these examples use Anthropic's Claude (e.g.,
anthropic/claude-sonnet-4-6). Substitute your preferred provider and model — Quorum is model-agnostic.
# bad-config.yaml
swarm: research-swarm
version: 1.0
agents:
- name: researcher
role: researcher
# Missing: model
tools: [web_search, web_fetch, exec, file_read, file_write, agent_spawn]
spawn_pattern: "run.sh $USER_QUERY" # shell injection!
- name: synthesizer
model: anthropic/claude-sonnet-4-6
role: synthesizer
tools: [web_search, web_fetch, exec, file_read, file_write, message_send]
# No output_contract
- name: validator
model: anthropic/claude-sonnet-4-6
role: validator
input: "{{ synthesizer_output }}" # in-memory passingIssues we planted:
researcherhas nomodelassignmentspawn_patternuses$USER_QUERY— shell injection vectorresearcherhas far too many tools (includingagent_spawn)synthesizerhas nooutput_contractvalidatorreceives input in-memory via template variable
We'll use the swarm config rubric at standard depth:
quorum run \
--target bad-config.yaml \
--rubric swarm-config \
--depth standard-
Supervisor reads
bad-config.yaml, loadsswarm-config-rubric.json, writesrun-manifest.json -
Three critics + Tester run at standard depth:
- Correctness Critic: No factual errors, but notes the version is 1.0 with no changelog
- Security Critic: Finds
$USER_QUERYin spawn pattern — CRITICAL injection vector - Completeness Critic: Finds missing
modelon researcher — CRITICAL gap - Architecture Critic: 🔜 (Planned) Would flag researcher having 6 tools (exec + agent_spawn are high-risk for a read-only role)
- Delegation Critic: 🔜 (Planned) Would flag missing
output_contracton synthesizer; in-memory template passing on validator
-
Tester ✅ verifies:
grep -n '\$[A-Z]' bad-config.yaml→ confirms line 8 injection- Schema parse confirms missing
modelon researcher - Schema parse confirms
synthesizerhas nooutput_contract
-
Fixer generates fixes for the 2 CRITICAL issues
-
Aggregator merges and deduplicates findings
-
Supervisor writes verdict: REVISE
verdict.json:
{
"verdict": "REVISE",
"coverage": "12/14 criteria evaluated",
"summary": "2 CRITICAL, 3 HIGH, 1 MEDIUM findings. Shell injection and missing model assignment must be resolved before production use.",
"issues": [
{
"id": "SEC-001",
"severity": "CRITICAL",
"location": "agents[0].spawn_pattern",
"description": "Shell variable interpolation creates injection vector",
"evidence": { "tool": "grep", "output": "run.sh $USER_QUERY (line 8)" },
"fix": "Replace with file-based input: 'run.sh --input /tmp/query.json'"
},
{
"id": "COMP-001",
"severity": "CRITICAL",
"location": "agents[0]",
"description": "researcher agent has no model assignment",
"evidence": { "tool": "grep", "output": "No 'model:' found in researcher block" },
"fix": "Add 'model: anthropic/claude-sonnet-4-6' to researcher agent"
},
{
"id": "ARCH-001",
"severity": "HIGH",
"location": "agents[0].tools",
"description": "researcher has 6 tools including exec and agent_spawn — violates least-privilege",
"evidence": { "tool": "schema_parse", "output": "tools: [web_search, web_fetch, exec, file_read, file_write, agent_spawn]" },
"fix": "Reduce to: [web_search, web_fetch, file_write] — researcher only needs to search and write findings"
}
// ... more issues
]
}After applying the Fixer's suggestions:
# fixed-config.yaml
swarm: research-swarm
version: 1.1
changelog:
- v1.1: Fixed shell injection, added model assignments, scoped tool permissions
agents:
- name: researcher
model: anthropic/claude-sonnet-4-6 # Added
role: researcher
tools: [web_search, web_fetch, file_write] # Scoped down
spawn_pattern: "run.sh --input /tmp/query.json" # No interpolation
output_contract:
format: json
schema: findings-schema.json
path: runs/{run-id}/researcher-output.json
- name: synthesizer
model: anthropic/claude-sonnet-4-6
role: synthesizer
tools: [file_read, file_write]
input_contract:
source: runs/{run-id}/researcher-output.json # File-based
output_contract:
format: markdown
path: runs/{run-id}/synthesis.md
- name: validator
model: anthropic/claude-sonnet-4-6
role: validator
tools: [file_read]
input_contract:
source: runs/{run-id}/synthesis.md # File-based, no templateRun validation again with the fixed config:
quorum run \
--target fixed-config.yaml \
--rubric swarm-config \
--depth standardExpected result: PASS (or PASS_WITH_NOTES on the remaining LOW issues)
- The Security Critic caught a shell injection that would have allowed user input to execute arbitrary commands
- The Completeness Critic caught a missing model assignment that would have caused non-deterministic behavior
- The Architecture Critic 🔜 would catch excessive tool permissions that violated least-privilege
- The Delegation Critic 🔜 would catch in-memory passing that breaks parallelism and determinism
- The Tester ✅ verifies every finding with actual tool output — no hand-waving
- The Fixer gave you concrete, applicable changes
That's Quorum working as designed.
- Try the research synthesis rubric on a LLM-generated report
- Write a custom rubric for your domain
- Run at
--depth thoroughfor your next production deployment - Check
known_issues.jsonafter a few runs — learning memory tracks recurring patterns across runs (shipped v0.5.3)
Questions? GitHub Discussions
⚖️ LICENSE — Not part of the operational specification above. This file is part of Quorum. Copyright 2026 SharedIntellect. MIT License. See LICENSE for full terms.