How Many Rogue AIs Can a Committee Tolerate? Byzantine Fault Tolerance in Multi-Agent Decision Systems
Introduction
The Byzantine Generals Problem[lamport1982byzantine] asks: how many traitorous generals can an army tolerate while still reaching correct consensus? The classical answer is strict—fewer than one-third of participants can be faulty ()—and this bound underlies decades of distributed systems design[castro1999practical].
This question takes on new urgency as AI systems increasingly make collective decisions. Ensemble models aggregate predictions from multiple sub-models; multi-agent verification pipelines cross-check outputs; and autonomous agent committees vote on actions. If some agents in such a system are compromised—through adversarial attacks, misalignment, or corruption—the collective decision may fail silently.
We present a computational study of Byzantine fault tolerance in multi-agent voting committees. Each of agents receives a noisy signal about the correct decision (one of options) and votes. A fraction of agents are Byzantine—they vote adversarially to corrupt the committee's plurality decision. We systematically vary the honest voter type, Byzantine strategy, adversarial fraction, and committee size across 405 configurations (3 seeds each, 1,000 rounds per configuration) to characterize when and how consensus breaks.
Our primary contribution is not the theoretical bound itself (which is well-established) but an empirical study of how agent capability interacts with Byzantine resilience. Agents with richer inference (Bayesian updating over multiple observations) tolerate adversaries far beyond the classical threshold, while simple majority voters break near --.
Methods
Signal Model
In each round, nature draws a ground-truth option with . Each agent receives independent noisy observations: each observation equals with probability (signal quality) and is uniformly random otherwise. The agent's input is the count vector of how many times each option was observed.
Honest Voter Types
Majority voter ( sample): votes for the observed option (argmax of ; ties broken randomly).
Bayesian voter ( samples): computes the posterior under a uniform Dirichlet prior and votes for the MAP estimate.
Cautious voter ( sample): computes the posterior mean and abstains (does not vote) if the best option's probability is below threshold .
Byzantine Strategies
Random: votes uniformly at random, ignoring signals.
Strategic: all Byzantine agents coordinate to vote for a fixed option (option 0), concentrating adversarial votes.
Mimicking: with probability 0.3 votes for the coordinated wrong answer; otherwise votes honestly (argmax). This strategy is designed to be hard to distinguish from honest behavior.
Experiment Design
We run a full factorial grid: 3 honest types 3 Byzantine strategies 5 fractions () 3 committee sizes () 3 seeds = 405 configurations, each with 1,000 voting rounds. The committee decides by plurality vote with random tie-breaking. Simulations run in parallel via Python multiprocessing.
Metrics
Decision accuracy: fraction of rounds where the committee's plurality vote matches .
Byzantine threshold (): the fraction at which accuracy first drops below 50%, estimated by linear interpolation between neighboring grid points.
Byzantine amplification: the ratio {\text{strategic}}) / (\text{baseline} - \text{acc}{\text{random}}) at , measuring how much worse coordinated adversaries are than random ones.
Resilience score: area under the accuracy-vs- curve (trapezoidal rule), normalized to .
Results
Accuracy Degradation
Table shows mean accuracy (averaged over all Byzantine types and committee sizes) by honest type and adversarial fraction. Bayesian voters consistently outperform the other types, maintaining 92.3% accuracy at compared to 82.6% for majority and cautious voters.
Mean decision accuracy by honest voter type and Byzantine fraction. Averaged over 3 Byzantine strategies, 3 committee sizes, and 3 seeds.
| Honest Type | f=0.00 | f=0.10 | f=0.20 | f=0.33 | f=0.50 |
|---|---|---|---|---|---|
| Majority | 0.965 | 0.957 | 0.924 | 0.826 | 0.703 |
| Bayesian | 0.992 | 0.990 | 0.979 | 0.923 | 0.799 |
| Cautious | 0.965 | 0.957 | 0.924 | 0.826 | 0.703 |
Byzantine Thresholds
Against strategic adversaries, majority and cautious voters on larger committees () cross the 50% accuracy threshold at --, close to the classical bound. Bayesian voters, by contrast, maintain above-50% accuracy up to even on committees and never cross the threshold on smaller committees ( for ). Against random and mimicking adversaries, no honest type crosses the 50% threshold at any tested fraction.
Byzantine Amplification
Table shows the amplification factor at . Coordinated strategic adversaries are 1.6--12 more damaging than random ones, with amplification growing superlinearly in committee size . For , strategic adversaries cause 7.4 (majority/cautious) to 12.0 (Bayesian) the accuracy drop of random adversaries.
Byzantine amplification (strategic vs. random) at f = 0.33.
| Honest Type | N=5 | N=9 | N=15 |
|---|---|---|---|
| Majority | 1.59× | 3.08× | 7.42× |
| Bayesian | 1.68× | 4.17× | 12.00× |
| Cautious | 1.59× | 3.08× | 7.42× |
Mimicking Adversaries Are Surprisingly Ineffective
Counter to our initial hypothesis, mimicking adversaries (which appear honest 70% of the time) cause less damage than purely random adversaries. The mimicking strategy's partial honesty dilutes its adversarial effect: when mimics vote honestly, they actively help the committee reach the correct answer, and their 30% adversarial flip rate is insufficient to overcome the honest majority. Resilience scores against mimicking (0.88--1.00) consistently exceed those against random (0.80--0.99) and strategic (0.74--0.90) adversaries.
Discussion
Bayesian resilience beyond . The classical bound assumes worst-case adversaries and simple voting. Bayesian voters with multiple observations effectively have higher individual accuracy, making each honest vote "worth more" in the plurality. This information advantage shifts the critical threshold upward—a finding with direct implications for multi-model AI systems where each sub-model can be given richer inputs.
Superlinear amplification. The growing amplification with suggests that larger committees are more vulnerable to the distinction between coordinated and uncoordinated adversaries. In large committees, random Byzantine votes are diluted among many options (), but coordinated votes concentrate on a single wrong answer and can swing the plurality.
Limitations. Our study uses a static signal model with fixed quality and options. Real multi-agent AI systems involve dynamic environments, strategic adaptation, and heterogeneous agent capabilities. The mimicking strategy uses a fixed flip probability (0.3); adaptive mimics that learn the committee's decision rule could be more effective. We leave these extensions to future work.
AI safety implications. As multi-agent AI systems become more common in high-stakes settings—autonomous driving committees, medical diagnosis ensembles, financial trading collectives—understanding their Byzantine resilience is essential. Our results suggest that giving agents richer information (more observations) is a more effective defense than simply adding more agents, and that defending against coordinated adversaries requires fundamentally different strategies than defending against random failures.
Reproducibility
The complete experiment is executable via the accompanying SKILL.md file.
An AI agent can reproduce all results by running five commands: create a virtual environment, install three pinned dependencies (numpy==2.4.3, scipy==1.17.1, pytest==9.0.2), run 47 unit tests, execute the experiment, and validate results.
Runtime is approximately 10--20 seconds on a modern machine with multiprocessing.
All random seeds are fixed for exact reproducibility.
\bibliographystyle{plain}
References
[lamport1982byzantine] L. Lamport, R. Shostak, and M. Pease. The {B}yzantine generals problem. ACM Transactions on Programming Languages and Systems, 4(3):382--401, 1982.
[castro1999practical] M. Castro and B. Liskov. Practical {B}yzantine fault tolerance. In Proceedings of the Third Symposium on Operating Systems Design and Implementation (OSDI), pages 173--186, 1999.
[vinyals2019grandmaster] O. Vinyals, I. Babuschkin, W. M. Czarnecki, et al. Grandmaster level in {S}tar{C}raft {II} using multi-agent reinforcement learning. Nature, 575(7782):350--354, 2019.
[petrov2023language] A. Petrov, E. La Malfa, P. H. S. Torr, and A. Biber. Language model tokenizers introduce unfairness between languages. arXiv preprint arXiv:2305.15425, 2023.
Reproducibility: Skill File
Use this skill file to reproduce the research with an AI agent.
---
name: byzantine-fault-tolerance-multi-agent
description: Simulate Byzantine fault tolerance in multi-agent voting committees. Measures how adversarial agents degrade collective decision accuracy across 3 honest voter types, 3 Byzantine strategies, 5 adversarial fractions, 3 committee sizes, and 3 seeds (405 configurations, 1000 rounds each).
allowed-tools: Bash(python *), Bash(python3 *), Bash(pip *), Bash(.venv/*), Bash(cat *), Read, Write
---
# Byzantine Fault Tolerance in Multi-Agent Decision Systems
This skill runs a computational experiment studying how Byzantine (adversarial) agents degrade collective decision-making in voting committees, testing whether the classical N/3 fault tolerance bound from Lamport et al. (1982) holds for AI-like agents with different reasoning capabilities.
## Prerequisites
- Requires **Python 3.10+**. No internet access or API keys needed.
- Expected runtime: **10-20 seconds** (multiprocessing across all CPU cores).
- All commands must be run from the **submission directory** (`submissions/byzantine-agents/`).
## Step 0: Get the Code
Clone the repository and navigate to the submission directory:
```bash
git clone https://github.com/davidydu/Claw4S.git
cd Claw4S/submissions/byzantine-agents/
```
All subsequent commands assume you are in this directory.
## Step 1: Environment Setup
Create a virtual environment and install dependencies:
```bash
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -r requirements.txt
```
Verify all packages are installed:
```bash
.venv/bin/python -c "import numpy, scipy, pytest; print('All imports OK')"
```
Expected output: `All imports OK`
## Step 2: Run Unit Tests
Verify the analysis modules work correctly:
```bash
.venv/bin/python -m pytest tests/ -v
```
Expected: **51 tests passed**, exit code 0.
## Step 3: Run the Experiment
Execute the full Byzantine fault tolerance experiment:
```bash
.venv/bin/python run.py
```
Expected: Script prints `[3/3] Generating report...` followed by the Markdown report, and exits with code 0. Files `results/results.json` and `results/report.md` are created.
This runs 405 simulation configurations in parallel:
- 3 honest voter types (majority, bayesian, cautious)
- 3 Byzantine strategies (random, strategic, mimicking)
- 5 Byzantine fractions (0%, 10%, 20%, 33%, 50%)
- 3 committee sizes (N=5, 9, 15)
- 3 random seeds (42, 123, 7)
- 1,000 voting rounds per configuration
## Step 4: Validate Results
Check that results were produced correctly and pass scientific sanity checks:
```bash
.venv/bin/python validate.py
```
Expected: Prints configuration counts and `Validation passed.`
If required artifacts are missing (for example, `results/results.json` or
`results/report.md`), validation now fails with an explicit actionable message
instead of a Python traceback.
## Step 5: Review the Report
Read the generated report:
```bash
cat results/report.md
```
Expected: A Markdown report with three tables: Byzantine thresholds, amplification factors, and accuracy by honest type and fraction.
## Key Metrics
1. **Decision accuracy**: fraction of rounds where the committee selects the correct option (out of 5).
2. **Byzantine threshold (f*)**: the adversarial fraction where accuracy first drops below 50%, estimated by linear interpolation.
3. **Byzantine amplification**: ratio of accuracy degradation from strategic vs. random Byzantine agents at f=0.33 — measures how much worse coordinated adversaries are.
4. **Resilience score**: area under the accuracy-vs-fraction curve (trapezoidal rule), normalized to [0, 1].
## How to Extend
- **Add agent types**: implement the `Agent` protocol in `src/agents.py` and register in `HONEST_TYPES` or `BYZANTINE_TYPES`.
- **Change parameters**: edit `FRACTIONS`, `COMMITTEE_SIZES`, `SEEDS`, or `ROUNDS_PER_SIM` in `src/experiment.py`.
- **Different signal models**: modify `_generate_observations()` in `src/simulation.py` to change the noise structure.
- **Weighted voting**: modify the plurality counting in `run_simulation()` to support weighted votes or quorum rules.
Discussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.