Skip to main content
This is the one-page index of the system: which module owns what, which sealed contracts join them, and how each level is proven. Every module entry links to its in-tree README — the README is the source of truth; this page is the map.

The module tree

Five core domains, a client, and the composition layer. Each domain owns its contracts + the services that honour them.
ModulePathPurpose
core/agentcore/agentThe execution domain — turns a trigger (chat turn · fired schedule · external event · live transcript beat) into a governed agent action committed to a user’s workspace.v1 git repo. Funnels every trigger through one unit.v1 envelope (the one Dispatcher).
↳ agent-apicore/agent/services/agent-apiThe one Dispatcher + the in-container agent_api.worker (claude-in-container) it spawns via the runtime.
core/meetingscore/meetingsThe capture domain — joins a meeting, captures + transcribes it, emits a speaker-attributed transcript.v1. The same modules/ bricks composed three ways.
↳ botcore/meetings/services/botTS realtime capture + browser automation — streams audio to the transcription service, relays the returned segments as transcript.v1.
↳ transcriptioncore/meetings/services/transcriptionThe STT service — faster-whisper / CTranslate2 behind an OpenAI-compatible /v1/audio/transcriptions. The GPU workload, deployed separately (not in make all); the bot calls it via TRANSCRIPTION_SERVICE_URL.
↳ meeting-apicore/meetings/services/meeting-apiPython control-plane: the REST surface + lifecycle sink; its collector ingests the bot’s segments.
↳ desktopcore/meetings/services/desktopSingle-process desktop host (same bricks, one process).
core/gatewaycore/gatewayThe world-facing edge — resolves x-api-key (fail-closed), enforces per-route scopes, proxies the CORE REST surface verbatim, runs the /ws multiplex (per-meeting redis channels → one socket).
↳ gatewaycore/gateway/services/gatewayThe shipped FastAPI edge (create_app, hexagonal).
↳ conformancecore/gateway/services/conformanceThe O-API-1 conformance suite, driven against fakes.
core/runtimecore/runtimeThe kernel — spawns + supervises isolated workloads (runtime.v1) over a pluggable Backend (process / Docker / K8s), and runs the redis-backed Scheduler for schedule.v1 jobs. Mechanism, not policy (P11).
↳ runtime_kernelcore/runtime/srcThe kernel + scheduler library; backends (process · docker · k8s).
core/identitycore/identityThe authN/authZ + accounts lane — authenticates opaque tokens to a User, decides ownership/scope (default-deny, P20), brokers scoped creds. Exists twice on purpose.
↳ admin-apicore/identity/services/admin-apiThe live DB-backed auth oracle (/internal/validate).
↳ identity_corecore/identity/srcThe pure, DB-free reference library honouring identity.v1.
clients/terminalclients/terminalThe browser-CLI workbench (Next.js) — a dockview over a registry of surfaces (chat · meeting · workspace · routines · sessions · tasks). Owns no business logic; thin /api/* proxies to agent-api.
clients/slimclients/slimvexa-slim — a minimal Python client/SDK that drives the control plane through the gateway (api.v1) only: peer slim.agent.* / slim.meetings.* sub-clients + a high-level cookbook. Holds no redis URL or domain internals, so it doubles as a meetings ⊥ agent SoC validator.
deploydeployThe composition layer (Compose) — deploy/compose brings up the whole v0.12 control plane as one ordered, health-gated stack (postgres · redis · minio + the Python services), GPU-free. deploy/transcription is the separate GPU unit for the STT service (own compose, GPU or CPU). Owns execution-targets.v1.

Contract registry

The sealed seam between modules. 16 *.v1 contracts are frozen in contracts.seal.json — a sha256 per contract; CI fails if a sealed schema drifts. Grouped by owning module, with owner → consumers.
The agent domain also defines six unsealed control-plane contracts still in flight — event.v1, unit.v1, invoke.v1 (UNSEALED), task.v1, routine.v1, tool.v1, proactive-card.v1. Only the 16 below carry a seal hash today.

core/agent

ContractOwner → ConsumersWhat it is
invoke.v1agent ← meetings transcript bridge → agent-apiThe meeting → agent trigger; an Invocation agent-api turns into a runtime.v1 worker. (seal: UNSEALED marker in README; hashed in seal)
workspace.v1agent → agent-api worker, terminalThe agent’s git-repo workspace convention — durable memory; data, not platform code.

core/meetings

ContractOwner → ConsumersWhat it is
transcript.v1bot (TS) → collector (Py), gateway, evalSpeaker-attributed segments — the product’s core output; the TS↔Py seam.
lifecycle.v1bot → meeting-api callbackThe bot’s domain status (distinct from container lifecycle).
invocation.v1meeting-api → bot (VEXA_BOT_CONFIG)The bot’s constructor, validated at boot (fail-fast).
acts.v1control-plane → bot (redis pub/sub)The bot command bus; unknown actions ignored (forward-compatible).
webhook.v1control-plane → subscriber URLsOutbound delivery envelope + signed-header scheme.
captured-signal.v1bot capture bridge → eval replayRaw capture signal teed before the pipeline — replays offline (O-TEL-2).
flagged-issue.v1user / system → evalA flagged transcript/attribution bug → reproducible offline test (O-TEL-3).

core/gateway

ContractOwner → ConsumersWhat it is
api.v1gateway → all clients (eval · terminal · SDKs)The public REST + WS + MCP surface, OpenAPI 3.1, frozen to vexa main.
ws.v1gateway → clientsThe live /ws multiplex (transcripts · bot status · chat), pinned to main’s G5 gate.
logevent.v1all control-plane services → observabilityThe structured log envelope + distributed trace_id — the observability SSOT.

core/identity

ContractOwner → ConsumersWhat it is
identity.v1admin-api → gateway, every serviceScoped token + access decision; the one auth wire shape (P20).

core/runtime

ContractOwner → ConsumersWhat it is
runtime.v1runtime kernel ← meeting-api, agent-apiThe workload lifecycle contract (mechanism, not policy — P11).
schedule.v1runtime scheduler ← agent-api, routinesHTTP-call job spec: one-shot (execute_at) or recurring (cron) + retry policy.

deploy

ContractOwner → ConsumersWhat it is
execution-targets.v1deploy → planner”Where can work run, and what does it need?” — resolved in planning, before execution (ADR-0020).

Eval levels — the validation pyramid

Every change is proven at the lowest level that can catch it. Governed by docs/ARCHITECTURE.md; the live gate lives at core/meetings/eval.
LevelNameWhat it provesWhere
L1ContractA schema is honoured — every *.v1 validates its golden fixtures (validate.mjs), and the seal catches drift.each */contracts/<name>.v1/
L2UnitA brick does its job in isolation, collaborators faked (ports/adapters).per-service tests
L3IntegrationModules compose across a real seam (e.g. gateway → meeting-api, agent-api → runtime).per-service / cross-module tests
L4Live + evalA real meeting, scored — bots join, speak a known timeline, and the captured transcript.v1 is scored (completeness · leakage · attribution) vs ground truth. 0.12 is “done” when live scores ≥ the 0.11 baseline.core/meetings/eval

Gates, harness & fixtures

The eval levels are enforced, not aspirational: an artifact “exists” only when it is gate-green (P9). Three terms separate the concern:
  • a gate is a runnable check that turns CI red when a rule is crossed;
  • the harness is the machinery that stands a real (or faked) system up so a gate can run;
  • fixtures are the inputs and lifecycle plumbing the harness runs against.

The gate

In this open-core tree the runnable bar is pnpm typecheck build test, the compose stack-readiness proof — make -C deploy/compose stack-test (it stands the whole stack up, proves it, and tears it down) — and pnpm gate:calm (Architecture as Code). The full P9 suite (readme · isolation · exports · graph · schema, plus contract/arch sealing) runs in the upstream product.
The gate runner that orchestrates the full suite (scripts/gates.mjs, invoked as pnpm gates / pnpm gate:*) ships with the upstream product, not this open-core checkout. What is runnable here: pnpm typecheck build test, the compose stack proof (make -C deploy/compose stack-test), pnpm gate:calm, and each contract’s validate.mjs / each brick’s check-isolation.js run directly.

The harness — three tiers

TierWhat it stands upWhere
Stack proofthe real v0.12 compose stack — up --build, wait every service healthy, prove health · auth · transcript dataflow · recording · control-plane invariants, then down -v in a guaranteed finallydeploy/compose/tests
Replaydrives the agent / meeting path with no real meeting — XADDs transcript.v1 segments onto the same redis stream the bot produces, so a turn replays offline and deterministicallycore/agent/eval/replay
Unitone brick in isolation, collaborators faked through its ports/adapterseach service’s tests/
Two rules run through every tier: poll with bounded timeouts, never sleep-and-hope, and green-or-skip — when Docker is absent the stack proof skips rather than fails, so the gate stays honest on a machine that cannot run it. The slow, real-bot lanes (a ~7GB browser image) are opt-in behind COMPOSE_BOT=1; the always-on subset never spawns one.

Fixtures

  • Golden vectors — committed example envelopes that are the spec (P8). Tests load them by path from the published contract (e.g. the transcript.v1 and lifecycle.v1 goldens), never by importing the producing domain’s code — which preserves the same meetings ⊥ agent boundary the production code keeps.
  • Lifecycle fixtures — the session-scoped stack fixture owns the whole compose up → healthy → down -v cycle; the unit tier uses ephemeral testcontainers (Postgres / Redis), in-process fakes (fakeredis, a fake authorizer, a fake webhook receiver), and a FakeClock so time-based logic is deterministic.
  • Replay fixtures — captured transcript material (a scripted call) plus a VTT→fixture converter, so an agent turn can be re-driven offline without a live meeting.