When agents talk — tool calls, multi-agent frameworks, orchestration pipelines — a proposal from Agent A, approved by Agent B, executed by Agent C arrives at the audit log as three undifferentiated JSON blobs. Nobody can reconstruct who proposed, who approved, whether the approval referenced that proposal, or what evidence informed it. MACI is a message envelope that carries role, authority level, and decision-chain references in every exchange — so the audit is the graph itself. The machine-facing member of the ACI family, twin to HACI.
Every MACI message is one JSON object. refs points at the messages this one responds to — that is the whole trick: every message names its antecedents, so the conversation is a directed acyclic graph you can walk.
// one message in a .maci stream { "maci": "0.1.0", "id": "m-0004", "ts": "2026-06-26T12:00:00Z", "from": "agent-beta", "role": "DECISION", "authority": "sovereign", // sovereign · delegated · advisory · observer "content": "use work-stealing as agent-alpha proposed", "refs": ["m-0003", "m-0004"], // the decision chain "status": "approved" // pending · approved · rejected · executed · superseded }
refs
DELEGATEnewtransfers authority to another agent for a scope
Six map straight onto HACI's roles; two are new because machines need them. A DECISION isn't a new order — it's a response to a specific prior message ("yes, use work-stealing as proposed in m-0003"), which is why it must reference what it decides on. A DELEGATE creates a chain of custody: a human delegates to an orchestrator who delegates to workers.
A realistic build: a human commands a scheduler, two agents propose and benchmark, the human decides and delegates, an agent writes the code under delegated authority, another verifies. Twelve messages — drawn as the DAG their refs describe.
A HACI document is a MACI stream wearing Markdown; a MACI stream is a HACI document wearing JSON. The mapping is exact for the six shared roles, and the conversion runs both ways — ! BUILD X ⇄ {role:"COMMAND"}. The one thing HACI's line-adjacency only implies, MACI's refs make explicit. See the two brothers side by side, and convert live, at eskimo‑brothers ↗.
maci-design.haci, itself written in HACI) plus a working proof-of-concept (maci.py — Message, Conversation, the eight validation rules, Kahn's-algorithm cycle detection, chain-walk, and the HACI↔MACI converter; both ship in this repo). Like HACI, it is a defensive publication under the Technical Disclosure Commons — prior art, not a patent — for a JSON message envelope that carries inline role attribution + authority levels + a decision-chain DAG for multi-agent provenance, and for the .maci stream format. The M member of the ACI family; DACI (distributed) is reserved.