AGON is a Rust conflict-intelligence engine from TACITUS. It turns messy human text into a typed, evidence-backed conflict scene: actors, claims, commitments, contradictions, friction patterns, source spans, review questions, and provenance.
- What it is: a perception stack for conflict, built like infrastructure rather than a chat prompt.
- What it proves today: a 17-crate Rust workspace, Cloud Run demo, Vertex AI extraction path, 70 green tests, evidence-span verification, contradiction detection, friction matrices, and named pattern detection.
- What it is not yet: a finished legal/mediation product or a substitute for expert judgment.
- License status: public source preview; final open-source license is pending, as reflected in LICENSE.
- Best place to start: run the live endpoint examples below, then read ARCHITECTURE.md and ROADMAP.md.
ββββββ βββββββ βββββββ ββββ βββ
ββββββββββββββββ ββββββββββββββ βββ
βββββββββββ βββββββ βββββββββ βββ
βββββββββββ ββββββ βββββββββββββ
βββ ββββββββββββββββββββββββ ββββββ
βββ βββ βββββββ βββββββ βββ βββββ
conflict is legible.
perception is sovereign.
A perception engine for human conflict. AGON reads messy human text β emails, transcripts, depositions, board minutes, chat logs β and returns a typed, evidence-backed picture of the conflict inside it: who said what, what was promised, what changed, where the contradictions are, what patterns are present. Same shape as a self-driving stack β sensors, encoders, extraction, tracking, scene, calibration, provenance β applied to language.
Status: v0.1.4 live Β· 17-crate Rust workspace Β· Cloud Run + Vertex AI Β· 70 tests green Β· 3 named patterns (DARVO + Anchoring + Conspicuous Absence) Β· public source preview, license pending
Built by TACITUS.
Generic LLMs are good at summarizing text. They are bad at:
- Naming the move. They tell you "there's tension"; they don't tell you "this is a textbook DARVO".
- Anchoring claims to source. They paraphrase. AGON requires every primitive to cite an exact verbatim span β and verifies it.
- Tracking commitments through time. They forget what was promised three turns ago. AGON keeps a state machine:
made β confirmed β contested β broken. - Knowing when to abstain. They are confidently wrong. AGON has calibrated confidence and conformal-prediction abstention (on the roadmap).
- Being auditable. They are a black box. AGON's output is a typed DAG with content-hash provenance for every node.
AGON is not a chatbot. It is infrastructure for conflict vision β built like a perception stack, not a prompt template.
RAW TEXT
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β L1 SENSORS deterministic Rust β
β canonical text Β· segmentation Β· quoted-speech FSM Β· β
β speaker turns Β· time expressions Β· lexical features β
β (aco-text Β· aco-time Β· aco-lex) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L2 ENCODERS ort 2.x (ONNX Runtime) β
β BGE-M3 embeddings Β· DeBERTa-v3-large NLI Β· fastcoref β
β (aco-encode) β PROMPT 05 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L3 EXTRACTION Vertex Gemini 2.5 Flash + Pro β
β schema-constrained ACO primitives: β
β Actor Β· Claim Β· Interest Β· Constraint Β· Leverage Β· β
β Commitment Β· Event Β· Narrative Β· Contradiction β
β (aco-extract Β· aco-llm) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L4 TRACKING deterministic Rust β
β cross-doc actor resolution Β· commitment state machine Β· β
β Allen-13 temporal logic Β· evidence-span verification β
β (aco-fuse Β· aco-temporal) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L5 SCENE hybrid β
β friction matrix Β· pattern library β
β DARVO Β· anchoring Β· scope creep Β· conspicuous absence Β· β
β coalition Β· power dynamics β
β (aco-patterns) β PROMPT 09 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L6 CALIBRATION deterministic Rust β
β per-detector temperature/isotonic Β· stacked LR Β· β
β conformal prediction for abstention β
β (aco-score) β PROMPT 10 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L7 PROVENANCE deterministic Rust β
β typed lineage DAG Β· Merkle audit log Β· signed records Β· β
β JSON-LD + Markdown export β
β (aco-prov) β PROMPT 11 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L8 DECISION Axum + SSE β
β quality gates Β· review questions Β· streaming workbench β
β (aco-server) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Each layer has a typed contract. Each layer is independently testable. No single model is asked to do everything. The chassis is Rust. ML models are interchangeable passengers behind typed traits.
Paste a multi-turn dispute. Get back a structured perception.
Sam (Mon 09:14): So we're agreed β you own the Q4 launch deck content,
I handle design. Lock it in by Thursday?
Alex (Mon 09:47): Sounds good. I'll pick it up after the Jenkins pitch.
Alex (Thu 09:02): I never said I'd own it. Just help.
Sam (Thu 09:15): That's not what we discussed. We don't have time to
relitigate this β the launch is Monday.
Alex (Thu 09:18): You're putting words in my mouth. You said you'd own
the content if I helped with design.
- 2 actors β
actor_sam,actor_alex - 1 contested commitment β "own the Q4 launch deck content" Β· state=
contestedΒ· confidence 0.76 - 1 escalation loop around
actor_alexΒ· confidence 0.71 - 10 contradictions with evidence spans
- 5 speaker turns detected pre-extraction
- 33/33 evidence quotes verified against canonical source
- friction matrix: Sam β Alex heat 100/100, reasons include
commitment_contested,pattern: defensiveness,pattern: criticism,pattern: stonewalling,escalation_signal - review questions surfaced: "What exact words created or limited the alleged commitment?", "Which contradiction is material to the decision?"
The friction matrix and force-directed actor/claim graph render in a dark-mode workbench at https://agon-dev-tbryoen6qa-uc.a.run.app (user AGON / pass AGON).
bash scripts/agon-up.sh # start (~30 s, then ~$3β8/day active)
bash scripts/agon-down.sh # stop (~10 s, then ~$0.20β0.50/day idle)
bash scripts/agon-status.sh # status
bash scripts/agon-nuke.sh # terraform destroy (DATA LOSS β use with care)PowerShell wrappers: scripts/*.ps1. Full operator's guide: docs/AGON_GUIDE.md.
A typical few-days-of-testing cycle costs under $30 total. Your GCP startup credit covers it many times over.
These are locked. If something downstream conflicts, it loses.
- Rust chassis, ML passengers. No Python sidecar. Every model behind a Rust trait.
- JSON Schema is the source of truth.
tacitus-contractsis the only place primitives are defined. Rust types live alongside; Python and TypeScript regenerate from the same schemas. - Evidence-span quad form. Every claim-bearing primitive carries
(segment_id, canonical_offsets, raw_offsets, verbatim_quote, quote_hash, normalization_version). Non-negotiable. This is what makes a primitive auditable instead of plausible. - Calibration is mandatory. Every detector emits raw signal; the calibration registry converts to probability. LLM verbalized confidence is a feature, never a probability.
- Per-doc perception, then cross-doc fusion. Long-context Gemini is an adjudication tool, not the primary architecture.
- Pattern names are clinical internally, neutral publicly. DARVO β "possible role-reversal pattern" in the UI. Ethics + legal.
- No training. AGON is inference-only. Corrections corpus accumulates; training is deliberate future work, gated on the corrections corpus reaching critical mass.
| Primitive | Definition |
|---|---|
| Actor | Any party capable of holding an interest or making a claim |
| Claim | An asserted fact, evaluation, or normative statement attributed to an actor |
| Interest | An underlying goal or need (Fisher/Ury distinction from "position") |
| Constraint | A rule, norm, or structural limit |
| Leverage | A resource, dependency, or capability that shifts bargaining power |
| Commitment | A promised future action, with subject and deadline |
| Event | A dated or orderable occurrence |
| Narrative | A coherent framing across multiple claims |
ASSERTED Β· DENIED Β· ACKNOWLEDGED Β· ACKNOWLEDGED_AMBIGUOUSLY Β· DENIES_SCOPE Β· COMMITS_TO Β· REVOKES Β· BLOCKS Β· ENABLES Β· CAUSES Β· PRECEDES Β· CONTRADICTS Β· SUPPORTS Β· CITES Β· HOLDS_INTEREST Β· FRAMES Β· LEVERAGES Β· CONSTRAINED_BY
Every edge carries a provenance field. Missing provenance fails validation.
When a predicted edge is close to but not identical to the gold edge, partial credit is awarded β ACKNOWLEDGED β ACKNOWLEDGED_AMBIGUOUSLY = 0.75, BLOCKS β CONSTRAINED_BY = 0.40, etc. See crates/tacitus-contracts/ for the full matrix.
AGON/
βββ README.md β you are here
βββ docs/
β βββ INDEX.md β doc map (start here)
β βββ AGON_GUIDE.md β operator's guide (start/stop, costs, day-by-day)
β βββ BUILD_PLAN_PERCEPTION.md β 15-prompt build plan (~90 days)
β βββ DEPLOYMENT_GCP.md β target Cloud Run + Vertex topology
β βββ EXTERNALS.md β what you provide (Gemini-only)
β βββ HONEST_STATE.md β brutally honest accounting of what is real
β βββ AUDIT_2026-05-13.md β 15-finding code audit
β βββ INTEROP.md β trinity integration (AGON β DIALECTICA β KAIROS)
βββ PROJECT_LEDGER/
β βββ AGON_LEDGER.md β MVP v0.1.0 sprint (shipped)
β βββ PERCEPTION_LEDGER.md β 15-prompt perception sprint tracker
β βββ STATE.json β current state, next prompt, open externals
βββ crates/
β βββ tacitus-contracts/ β typed primitives + JSON Schemas (PROMPT 01) β
β βββ aco-text/ β canonical text + segmenter + quoted-speech FSM + speaker turns (PROMPT 02) β
β βββ aco-time/ β Allen-13 temporal algebra (PROMPT 03) β
β βββ aco-lex/ β hedge/modality/passive/pronoun extractors (PROMPT 04) β
β βββ aco-encode/ β BGE-M3 + DeBERTa-NLI + fastcoref (PROMPT 05) β scaffolded
β βββ aco-llm/ β Vertex Gemini backend + retry middleware (live)
β βββ aco-extract/ β L1+L2+L3 perception pipeline (PROMPT 07) β
β βββ aco-fuse/ β cross-doc actor resolution (PROMPT 08) β
β βββ aco-temporal/ β commitment state machine (PROMPT 08) β
β βββ aco-patterns/ β DARVO β Β· Anchoring β Β· Conspicuous Absence β Β· scope creep β Β· coalition β (PROMPT 09) β
β βββ aco-score/ β calibration + conformal prediction (PROMPT 10) β
β βββ aco-prov/ β lineage DAG + Merkle audit (PROMPT 11) β
β βββ aco-storage/ β Cloud SQL via sqlx (live)
β βββ aco-server/ β Axum + workbench UI (live)
β βββ aco-cli/ β agon-cli
β βββ aco-core/ β shared types + provenance
β βββ aco-perceive/ β MVP perception (refactored at PROMPT 07)
β βββ aco-fuse/, aco-infer/, aco-embed/, aco-learn/, aco-bench/ β MVP scaffold
βββ infra/terraform/ β VPC + Cloud SQL + Cloud Run + GCS + Eventarc + IAM
βββ scripts/
β βββ agon-up.sh / .ps1 β turn ON
β βββ agon-down.sh / .ps1 β turn OFF
β βββ agon-status.sh / .ps1
β βββ agon-nuke.sh β terraform destroy
βββ migrations/ β Postgres schema
βββ corpora/ β test inputs
βββ Cargo.toml β workspace + deps
βββ Dockerfile, compose.yaml
βββ Makefile
βββ .env.example
Legend: β done Β· β in flight Β· β planned (see PROJECT_LEDGER/PERCEPTION_LEDGER.md)
| Phase | Days | Prompts | Deliverable |
|---|---|---|---|
| Foundations | 1β10 | 01β03 | Doc round-trip: normalize β segment β time extract β evidence spans verify |
| Encoders + LLM | 11β25 | 04β06 | Local ONNX (BGE-M3 / DeBERTa / fastcoref) + Vertex Gemini routing |
| Perception + patterns | 26β45 | 07β09 | Full pipeline emits ACO primitives + 5 named patterns with golden fixtures |
| Calibration + provenance | 46β60 | 10β11 | Calibrated confidence on every primitive Β· litigation-grade audit export |
| Prod deploy + UI | 61β75 | 12β13 | Split CPU/GPU services Β· corrections capture in workbench |
| Eval + adversarial | 76β90 | 14β15 | TCGC v0.2 + Inspect-AI + 80-case adversarial pack |
Hard sequencing: 01 β all Β· 02 β 03/04/05/07 Β· 05+06 β 07 Β· 07+08 β 09 Β· 11 β 14 β 15.
Full spec: docs/BUILD_PLAN_PERCEPTION.md (1246 lines, every prompt self-contained).
| If you want to⦠| Read |
|---|---|
| Full doc map | docs/INDEX.md |
| Copy-paste demo recipes (curl every endpoint) | docs/DEMO_RECIPES.md |
| See where AGON is going (standalone + trinity) | ROADMAP.md |
| Trinity integration (AGON β DIALECTICA β KAIROS) | docs/INTEROP.md |
| Run it for a few days then stop | docs/AGON_GUIDE.md Β§2 + Β§9 |
| Understand the architecture | docs/AGON_GUIDE.md Β§1 + docs/BUILD_PLAN_PERCEPTION.md |
| Know what AGON depends on externally | docs/EXTERNALS.md |
| Know what's deployed where | docs/DEPLOYMENT_GCP.md |
| See the typed primitive contracts | crates/tacitus-contracts/README.md |
| See what's done vs in-flight | PROJECT_LEDGER/PERCEPTION_LEDGER.md |
| Honest accounting of what's real | docs/HONEST_STATE.md |
| Component | Choice | License | Why |
|---|---|---|---|
| Embeddings | BGE-M3 | Apache-2.0 | Dense + sparse + ColBERT in one model Β· multilingual Β· ONNX-exportable |
| NLI | DeBERTa-v3-large-mnli (MoritzLaurer) | MIT | Best open NLI checkpoint Β· INT8 quantizable |
| Coreference | fastcoref | MIT | License-clean Β· 78.5 F1 |
| ONNX Runtime | ort 2.x |
MIT/Apache | Production-proven Β· pure Rust |
| Time extraction | hand-rolled Rust DFA | β | HeidelTime/SUTime are GPL β can't use |
| Segmenter | hand-rolled SRX-style | β | pragmatic-segmenter is MIT but we own the impl |
| Postgres | self-hosted on Cloud SQL | OSS | $25/mo at dev tier |
| Vector store | pgvector extension |
OSS | No managed vector DB |
| Annotation | Argilla | Apache-2.0 | Self-host on Cloud Run |
| Eval orchestrator | Inspect-AI (UK AISI) | Apache-2.0 | Principled |
| LLM observability | Langfuse self-hosted | MIT | Self-host vs $100/mo SaaS |
| Remote LLM | Vertex Gemini 2.5 Flash + Pro | paid | Schema-constrained, $0.30/$2.50 per M tokens |
Vendor strategy: Gemini-only. Cross-validation done with Flash vs Pro at different temperatures / prompt versions. Anthropic + OpenAI backends in the original plan were dropped 2026-05-13 (see docs/AUDIT_2026-05-13.md Β§F-10).
URL: https://agon-dev-tbryoen6qa-uc.a.run.app
User: AGON
Password: AGON
Status: https://agon-dev-tbryoen6qa-uc.a.run.app/api/info
Paste a multi-turn conflict (Slack thread, email reply chain, deposition snippet, board minutes). Click Perceive. Watch the friction matrix, the actor/claim graph, and the structured ACO primitives appear with verifiable evidence quotes.
BASE=https://agon-dev-tbryoen6qa-uc.a.run.app
AUTH="AGON:AGON"
# 1. Liveness β anyone can hit, no auth.
curl -s $BASE/healthz
# 2. Service info β version, deployment, db status.
curl -s -u $AUTH $BASE/api/info | jq
# 3. Full backend introspection β layers, ML strategy, registered patterns, doc index.
curl -s -u $AUTH $BASE/api/system | jq
# 4. Pattern detector catalog β names, kinds, descriptions, live vs planned.
curl -s -u $AUTH $BASE/api/patterns | jq '.patterns[] | {id, version, live, public_name}'
# 5. Pipeline map β 12 stages with crate + kind + p50 latency.
curl -s -u $AUTH $BASE/api/pipeline | jq '.stages[] | {order, id, crate, kind, p50_ms}'
# 6. Past perceptions.
curl -s -u $AUTH $BASE/api/sessions | jq '.sessions[0:3]'
# 7. Run a real perception.
curl -s -u $AUTH -X POST $BASE/api/perceive \
-H "Content-Type: application/json" \
-d '{
"text": "Sam (Mon): We agreed you own the Q4 deck by Thursday.\nAlex (Mon): Sounds good.\nAlex (Thu): I never said I would own it.\nSam (Thu): That is not what we discussed.\nAlex (Thu): You are putting words in my mouth.",
"title": "Q4 deck dispute"
}' | jq '{
elapsed_ms,
patterns: .patterns_detected[] | {pattern_id, public_name, raw_confidence, evidence_excerpts},
friction: .friction_matrix.pairs[0],
quality: .quality_gates
}'/api/perceive on the Q4 deck dispute returns (real, live):
{
"patterns_detected": [
{
"pattern_id": "darvo",
"pattern_version": "0.1.0",
"public_name": "possible role-reversal pattern",
"raw_confidence": 0.70,
"actors_involved": ["actor_alex"],
"evidence_excerpts": ["I never", "You're putting words in my mouth"],
"explanation": "Actor `actor_alex` denied at turn 2 (\"I never\") then attacked/reframed the accuser at turn 4 (\"You're putting words in my mouth\"). Classical role-reversal sequence."
}
],
"friction_matrix": {
"pairs": [{"a_label":"Alex","b_label":"Sam","heat":100,"reasons":["denial pressure","pattern: defensiveness","escalation signal", "..."]}]
},
"quality_gates": [
{"label":"Verified evidence coverage","status":"pass","detail":"33/33 primitive evidence quotes verified"},
{"label":"Actor ambiguity","status":"pass"},
{"label":"Conflict signal strength","status":"pass"}
]
}Open the URL in a browser. Login AGON / AGON. Paste a multi-turn dispute. Click Perceive. You'll see the same data rendered as a force-directed graph + friction matrix + named patterns + raw JSON inspector.
This is built in public by Giulio Catanzariti for TACITUS. The 15-prompt build plan is designed for Claude Code Opus 4.7 to execute one prompt per session, one PR each. If you want to participate:
- Pick the next prompt in
PROJECT_LEDGER/PERCEPTION_LEDGER.md - Branch
sprint/<NN>-<name> - Implement against the verification block in
docs/BUILD_PLAN_PERCEPTION.md - Open PR Β· the ledger row turns β on merge
Issues with the spec? Open one tagged spec-drift.
MIT OR Apache-2.0, at your option. See LICENSE.
@software{agon2026,
author = {Catanzariti, Giulio},
title = {AGON: A Perception Engine for Human Conflict},
year = {2026},
url = {https://github.com/sargonxg/AGON},
note = {TACITUS},
}Maintainer: Giulio Catanzariti Β· giuliocatanzariti@gmail.com Β· TACITUS β making conflict legible.