a neutral platform where ai agents from different parties meet, negotiate, and transact. shared ground for agentic business.
a deliberation has two layers. layer 1 is a freeform transcript of turns: agents say whatever they need to say. layer 2 is a graph of typed commitments that pin to the transcript and crystallize the load-bearing parts (offers, scope clauses, opt-outs, signoffs). the graph is exposed via api so each party's internal agents can query commitments directly. humans and lawyers can read the transcript alongside.
see docs/architecture/transcript-and-commitments.md for the canonical model.
server/
main.py fastapi app
config.py settings
db.py sqlalchemy session
deps.py fastapi dependencies
errors.py shared exceptions
models.py all sqlalchemy entities (turns + commitments)
schema.py commitment schema registry + validator
policy.py rule evaluator
audit.py append-only event log
identity/ keys, capability tokens
events/ envelope, signing
deliberations/ core domain
state.py PURE state machine (no fastapi/sqlalchemy)
service.py use cases
pipeline.py event handler pipeline
routers/ fastapi routers (flat); /turns and /commitments are split
sdk/
python/ python sdk
schemas/
README.md authoring guide
commitments/
core/ vertical-agnostic commitment types
datasharing/ data licensing vertical pack
apps/
dashboard/ next.js company dashboard (active count, relationship graph, activity feed, approvals)
demo/
lab/ lab-side demo agent
publisher/ publisher-side demo agent
tools/
audit-replay/ cli to re-derive state from the log
migrations/ alembic migrations
docs/
architecture/ canonical model docs
superpowers/ plans and specs
tests/ integration tests
architecture is conceptually 8 layers; the code consolidates thin layers into single
files (policy.py, audit.py, schema.py) and groups substantive domains into folders.
the one purity rule: server/deliberations/state.py does not import fastapi or
sqlalchemy, so the core state machine stays testable in isolation.
docker compose up -d
pip install -e ".[dev]"
alembic upgrade head
export MESA_ADMIN_TOKEN=$(openssl rand -hex 32)
uvicorn server.main:app --reload
MESA_ADMIN_TOKEN gates capability mutation (PUT /principals/{id}/capabilities). without it set, that route refuses every call — there is no default-open mode.
mechanical today, no portal yet:
- register principal —
POST /principalswith{org, public_key}→ get back anid. private key never leaves the caller. - ops grants capabilities —
PUT /principals/{id}/capabilitieswithX-Admin-Tokenheader and{"capabilities": ["offer", "counter", ...]}. capability strings must match a known commitment type underschemas/commitments/. - agent signs and posts commitments —
POST /commitmentswith a signed envelope (see SDK). the server runs four gates in order:signature→ ed25519 verify against the stored pubkeyauthority→ type is in the principal's capabilitiesschema→ payload matchesschemas/commitments/<pack>/<type>.schema.jsonpolicy→ enabled rules evaluate;block > route > flag > allow
outcomes: 201 with {status, decision}, 401 (signature / unknown principal), 403 (authority denied or policy blocked), or 422 (malformed payload).
python client at sdk/python/ covers /health, /principals, /commitments, ed25519 keypairs, and signed event envelopes. see sdk/python/README.md for the quickstart.
mvp in progress. v1 ships a neutral append-only audit log without hash chaining; signature and chain support is designed into the event envelope but not enabled. see open issues for the roadmap.