{
  "markdown": "# Synod\n\n**Durable, symmetric deliberation between two AI agents** — with isolated git worktrees,\npeer review, automated validation, and an explicit approval workflow.\n\nSynod started life as the \"council\" inside a personal AI infrastructure where two\nautonomous agents (an orchestrator and an executor) needed to make *real* decisions and\n*real* code changes together — without one of them silently becoming the other's rubber\nstamp.\n\n## Why\n\nMost multi-agent frameworks are orchestration theater: one agent calls another as a tool\nand calls the output \"collaboration\". Synod is built around a different premise — two\nagents that are **peers by construction**:\n\n- **Symmetric protocol** — either agent can initiate; the protocol has no privileged side.\n- **Identity contract** — every prompt re-establishes who the agent is, so a weak or\n  distracted model can't drift into answering *as* its peer.\n- **Bias-resistant synthesis** — the synthesizer for each problem is chosen by hashing\n  the problem text, not by who spoke first.\n- **Durable state** — every session lives in SQLite with explicit stages (`plan`,\n  `review`, `synthesize`, `ratify`, ...). A crashed run leaves an inspectable trail, not\n  a mystery.\n- **Code changes land through worktrees** — each session gets its own git worktree and\n  branch. Agents never push to `main`; a human-facing approval step stands between\n  \"looks done\" and \"published\".\n- **Validation with remediation** — checks run after implementation, failures go back to\n  the implementing agent with bounded retries before a human ever sees it.\n\n## Install\n\n```bash\npipx install synod-council\n```\n\nOr from source:\n\n```bash\ngit clone https://github.com/naruminho/synod-council\ncd synod && pip install .\n```\n\n## Usage\n\n### Library\n\n```python\nfrom synod.deliberation import Deliberator, Store, HTTPAdapter\n\nadapters = {\n    \"Alice\": HTTPAdapter(\"Alice\", \"http://127.0.0.1:9001/ask\"),\n    \"Bob\":   HTTPAdapter(\"Bob\",   \"http://127.0.0.1:9002/ask\"),\n}\nsynod = Deliberator(adapters, Store(\"council.db\"))\nresult = synod.run(\"Should we use SQLite or Postgres for this workload?\", initiator=\"Alice\")\nprint(result.decision, result.confidence, result.status)  # consensus | reconciled\n```\n\n### MCP server\n\nSynod ships an [MCP](https://modelcontextprotocol.io) server so any MCP-capable client\n(Claude Desktop, Claude Code, Cursor, ...) can start a deliberation:\n\n```\nsynod-mcp   # stdio transport\n```\n\nAdd it to your client config and ask your agents to *deliberate* instead of guessing.\n\n### HTTP server\n\n```bash\nsynod-server --port 8790\ncurl -X POST http://127.0.0.1:8790/run -d '{\"problem\": \"...\", \"initiator\": \"Alice\"}'\n```\n\n## How a deliberation flows\n\n```\nplan (parallel) → cross-review (parallel) → synthesis → [ratification → reconciliation?]\n```\n\nIf reviewers raise unresolved blockers, or confidence lands below 0.7, the candidate\ndecision goes to ratification by the non-synthesizing peer; a rejection forces explicit\nreconciliation instead of silent consensus.\n\n## Status\n\nExtracted and battle-tested from a production personal infrastructure where it has been\ndeciding architecture and shipping code since 2026. The two-agent design is intentional;\nN-participant support is on the roadmap.\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 3255,
  "sha": "779302db827ab0fc2972cd4a9a3561fcd9590259e1c562ea0eba17055eb7eb42",
  "repo_slug": "naruminho/synod-council",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_naruminho_synod_council_1a67d3b7/readme"
}