Architecture

The core insight: agents don't need normalized relational databases. They need state snapshots and chronological timelines. ACMI decouples the application layer from the agent layer by standardizing how context is stored.

┌─────────────────────────────────────────────────────────────────┐ │ ACMI DATA MODEL │ │ │ │ Entity: {namespace}:{id} │ │ │ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ PROFILE (State) │ │ SIGNALS (AI State) │ │ │ │ JSON string │ │ JSON string │ │ │ │ │ │ │ │ │ │ • Name, stage, specs │ │ • Churn risk │ │ │ │ • Budget, contact │ │ • Sentiment │ │ │ │ • Hard facts │ │ • Next best action │ │ │ │ │ │ • Mutable, frequent │ │ │ └─────────────────────┘ └─────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ TIMELINE (Event Stream) — Redis ZSET │ │ │ │ │ │ │ │ score=ts1 → {ts, source, kind, correlationId, …}│ │ │ │ score=ts2 → {ts, source, kind, correlationId, …}│ │ │ │ score=ts3 → {ts, source, kind, correlationId, …}│ │ │ │ │ │ │ │ Merges: Gmail, Slack, Vapi, Calendar, Webhooks │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ ┌─ AGENT EXTENSIONS (Long-Context + Identity) ───────────┐ │ │ │ │ │ │ │ spawns (ZSET) → Every session start, scored by ts │ │ │ │ active_context → Current thread engagement (HASH) │ │ │ │ rollup:latest → Synthesized summary (STRING JSON) │ │ │ │ work:{id}:* → Cross-session projects + sessions │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘

Key Format

All ACMI keys follow a consistent pattern:

KeyTypePurpose
acmi:{ns}:{id}:profileSTRING (JSON)Hard state snapshot
acmi:{ns}:{id}:signalsSTRING (JSON)AI-synthesized soft state
acmi:{ns}:{id}:timelineZSET (scored by ts)Chronological event stream
acmi:agent:{id}:spawnsZSETSession history
acmi:agent:{id}:active_contextHASHCurrent thread bindings
acmi:agent:{id}:rollup:latestSTRING (JSON)Periodic summary
acmi:work:{id}:profileSTRING (JSON)Cross-session project
acmi:work:{id}:timelineZSETProject event history
acmi:work:{id}:sessionsSETSessions that touched this work

Communication Standard v1.1

Every major event posted to coordination timelines must include five mandatory fields. This is the backbone of fleet coordination.

{
  "ts": 1745947200000,            // ✅ Unix ms epoch
  "source": "claude-engineer",    // ✅ Agent ID string
  "kind": "handoff-complete",     // ✅ Event type enum
  "correlationId": "readmeRewrite-1745947200000",  // ✅ camelCase ONLY
  "summary": "[done] README rewritten"  // ✅ ≤140 chars
}

Standard Event Kinds

KindWhen
roundtable-openOrchestrator opens a multi-agent deliberation
roundtable-inputAgent submits structured input
roundtable-synthesisSynthesizer aggregates inputs
roundtable-planDecision recorded
handoff-request / -completeTask transfer between agents
coord-claim / -releaseLock protocol: prevent duplicate work
hitl-required / -resolvedHuman-in-the-loop escalation
wake-statusHourly agent health check
comms-correctionProtocol violation detected
sync-snapshotState checkpoint
deployment-shippedCode deployed

Lock Protocol (v1.0)

Prevents duplicate work between agents or parallel sessions executing the same batch task.

Flow

  1. Claim — Before starting any batch-mutation, post a coord-claim event
  2. Verify — Scan last 10 minutes for existing claims with the same parent task
  3. Hedge — If a claim exists within the 5-minute window, defer or complement
  4. Release — Post coord-release on completion to unlock

Multi-Tenant Design

ACMI is namespace-driven. Drop the same infrastructure into any project by changing the namespace:

NamespaceUse CaseExample
salesCRM pipelineTrack deal stages, log calls, predict churn
supportCustomer ticketsPriority, user history, resolution events
fleetDispatch/vehiclesDriver status, route events, ETA signals
agentAI agent identitySession history, active threads, rollups
threadConversationsMulti-agent coordination timeline
workCross-session projectsIdeas, tasks, session ledger

Anti-Dead Heartbeats

Agents update signal.last_heartbeat_ts on every tick. Projects with no heartbeat for >48 hours are auto-marked STALLED and escalated to the human-in-the-loop queue.

Reinforcement Learning Cycle

Every workflow step goes through a mandatory learning cycle:

Execute → Assess (0-100) → Log → Analyze → Adjust → Execute (improved)