Architecture

How the 5-deliberator council works.


The 2-round protocol

   ┌──────────┐
   │ artifact │ ───► tier-1?  No  ───► skip
   └────┬─────┘        │
        │ Yes
        ▼
   ┌────────────────────────────────────────────────────────┐
   │  ROUND 1 — 4 deliberators run in parallel              │
   │                                                        │
   │   Skeptic        Voice &      Evidence &     Strategy  │
   │   (adversarial)  Identity     Calibration    & Stakes  │
   │                                                        │
   │   each → {verdict, scores, would_block, irreducible,   │
   │           revision_brief}                              │
   └─────────────────────────────┬──────────────────────────┘
                                 │
                                 ▼
   ┌────────────────────────────────────────────────────────┐
   │  ROUND 2 — same 4 deliberators, with cross-read        │
   │                                                        │
   │   Each sees the other 3 R1 verdicts; may update.       │
   │   Single-deliberator misfires get corrected; indep-    │
   │   endent first reads preserved.                        │
   └─────────────────────────────┬──────────────────────────┘
                                 │
                                 ▼
   ┌────────────────────────────────────────────────────────┐
   │  ADJUDICATOR (single call)                             │
   │                                                        │
   │   Merges 4 R2 verdicts + reads prior verdicts on same  │
   │   artifact_type from council_log.jsonl (D6 loop).      │
   │                                                        │
   │   Verdict policy:                                      │
   │     3+ block on irreducible       → HOLD               │
   │     3+ block on reducible +                            │
   │       Adjudicator reasons downgrade → REVISE           │
   │     otherwise                       → SHIP             │
   │                                  + revision_brief      │
   └─────────────────────────────┬──────────────────────────┘
                                 │
                                 ▼
                      SHIP / REVISE / HOLD
                      + revision_brief
                      + audit row → council_log.jsonl

Tier classification

The Council is designed for tier-1 artifacts:

Tier Definition Council?
Tier 1 External-facing OR irreversible OR identity-shaping OR memory writes YES — every artifact
Tier 2 Internal drafts, dashboards, infrastructure, dispatch updates Skip
Tier 3 Daily briefings, internal analyses, planning artifacts Sample 1-in-5

Tier classification is rule-based in v0.1 (glob patterns in council.yaml#tier_rules). Model-based and hybrid classifiers are on the v0.3 roadmap.


The compounding loop (D6)

The Adjudicator reads prior verdicts on the same artifact_type from council_log.jsonl before merging the current round’s verdicts. This means:

  • Two consecutive HOLDs on the same artifact_type sharpen the Adjudicator’s reasoning on the third pass.
  • Voice patterns flagged across multiple artifacts (“V1 + V3 keep appearing in linkedin_post”) compound into stronger pattern recognition.
  • The producing agent’s drift gets surfaced — not just the artifact’s flaws.

This is what makes the Council a system rather than a stateless judge.


Modularity invariant

Emitting agents have zero hard dependency on Council. CI-tested in tests/test_modularity_invariant.py:

PYTHONPATH=src python -m unittest tests.test_modularity_invariant -v

The test scans any host operator system’s agents/*/prompt.md files and asserts zero references to Council. If a producing agent’s prompt starts to know about the gate that reviews it, the build fails.

This means:

  • An orchestrator can route any artifact to Council without touching the producing agent.
  • Removing the Council leaves every producing agent functional.
  • The Council ships as a standalone runtime that wires into Emissary, MCP, slash commands, CI pipelines, or any custom agent system without coupling.

Verdict log schema

Every Council invocation appends one line to council_log.jsonl following Rule 35 v2 format:

{
  "v": 2,
  "ts": "2026-05-18T...Z",
  "artifact": "path/to/artifact.md",
  "artifact_type": "linkedin_post",
  "round1": [{"deliberator": "skeptic", "verdict": "revise", "scores": {...}, ...}, ...],
  "round2": [...],
  "adjudicator": {
    "final_verdict": "REVISE",
    "reasoning": "...",
    "revision_brief": "...",
    "applied_compounding": true,
    "prior_verdicts_consulted": 3
  }
}

Append-only. The Adjudicator reads prior entries on the same artifact_type to apply the D6 compounding loop.


Agent Council — MIT licensed. See LICENSE.

This site uses Just the Docs, a documentation theme for Jekyll.