Skip to main content

Canonical architecture

What you deploy is a governed swarm. It may be one agent or many; what does not change is the government: registered identity, a boundary that is not crossed, provenance of every deliverable, and judgement on the result.

The client domain is any institution — ministry, bank, hospital, law firm, university, operations team. The architecture does not privilege a sector: it privileges that the deployed unit has a boundary and an accountable owner.

Each agents-host represents a sovereign organisational unit: its own identity, memory, Task Queue, governance, agents and federation capability. The set of federated hosts is the full organisation.

agents-host is the scaling and delivery unit. You do not scale by adding virtual desktops to a central host: you scale by deploying new agents-host units. The Task Queue is local per host; coordination across units does not go through a global queue but through federation.

Simulation is not operation. There is an academic neighbourhood that simulates agent societies at scale to study behaviour. This architecture deploys to work: agents take a real commission and return a deliverable with a seal, sources and an author.

Harness and exoharness

The agent harness (interchangeable runtime) is the scaffolding of the individual agent: model loop, tools/MCP, procedural memory, sessions, identity document as anchor and local Task Queue.

Self-Improving Society is the exoharness — the institutional layer around all agents: registered identity, social memory, judgement, governance, reproduction and observability.

An agent without the exoharness is a process. With it, a citizen of an institution.

In external material the sense is declared: exoharness, in the exoskeleton sense — the institutional layer that wraps the agent harness. When the reader comes from the meta-harness tradition, the term is equivalent.

flowchart TB
    subgraph HARNESS["Agent harness (per agent — interchangeable)"]
        LOOP["Model loop + tools/MCP"]
        SOUL["Identity document — anchor (B)"]
        PMEM["Procedural memory + local skills (A)"]
        KLOC[("Local Task Queue sovereign per host")]
    end
    subgraph EXO["Exoharness (the institution)"]
        REG[("Identity registry: hosts, specs, trust, approvals")]
        MEM["Memory: private/episodic retrieval + social facts"]
        JUD["Judgement: evaluator, draft seal, fitness ladder F0–F5"]
        GOV["Governed volition: approvals, budgets (L1–L8)"]
        REPRO["Reproduction: lifecycle, presets, gated arm"]
        PERC["Perception: telemetry, social graph"]
        VOICE["Conversation Gateway"]
    end
    subgraph SUB["Shared substrate"]
        LLMR["LLM Router"]
        VDB[("VectorDB")]
        PG[("Metadata relational store")]
        OBJ[("Object store")]
    end
    HARNESS --> PERC
    HARNESS --> MEM
    LOOP --> LLMR
    JUD --> KLOC
    REPRO --> HARNESS
    VOICE --> HARNESS
    MEM --> VDB
    REG --> PG

High-level view

flowchart TB
    Operator[Human operator] --> CLI[society CLI / Society Builder]
    Operator --> UI[Console]
    Operator --> WebUI[Conversation UI]

    subgraph HostA["agents-host A (sovereign unit)"]
        KA[("Task Queue")]
        PA["profiles"]
        HostApiA["Agent API\nchat · tasks · host snapshot"]
        KA --- PA --> HostApiA
    end

    subgraph HostB["agents-host B (other jurisdiction)"]
        KB[("Task Queue")]
        PB["profiles"]
        HostApiB["Agent API"]
        KB --- PB --> HostApiB
    end

    subgraph Control["Control plane"]
        Chat[Conversation Gateway]
        Fleet[fleet-manager]
        Gov[governance]
        Eval[evaluator]
        Tel["Console backend"]
        Exec["Gated arm\nno published port"]
    end

    subgraph Shared["Shared substrate"]
        LLM[LLM Router]
        Vec[(VectorDB)]
        DB[(Metadata relational store)]
        Obj[(Object store)]
        Onto["Ontology catalog\ninternal network"]
    end

    WebUI --> Chat
    CLI --> Fleet
    Fleet --> HostApiA
    Fleet --> HostApiB
    Chat --> HostApiA
    Chat --> HostApiB
    Tel --> HostApiA
    Tel --> HostApiB
    Tel --> Exec
    Exec -. "approved specs only" .-> HostA
    UI --> Tel
    Tel --> Onto

    HostA <-. "A2A — directed, token per caller" .-> HostB

    HostA --> Shared
    HostB --> Shared
    Eval --> DB
    Gov --> DB

Cross-host traffic is audited, not cryptographically signed in the current transport: cross-host trust rests on policy, bearer tokens per caller and network boundaries.

Inside an agents-host

Responsibilities: maintain the runtime data directory; run the local Task Queue; manage agent profiles; expose the Agent API (per-profile chat, task list/run, host snapshot).

A profile comprises: identity document (anchor B), configuration (model, provider, MCPs), isolated credentials, private declarative corpus (A), local skills (A), runtime memory (A) and sessions (B).

flowchart TB
    subgraph Host["agents-host"]
        TaskQueue[("Task Queue")]
        Snapshot["Host Snapshot API\nchat · tasks · internals"]
        subgraph Agents["agents — private docs volume"]
            A1["Agent A\nidentity + config + private docs (A/B)"]
            A2["Agent B\nidentity + config + private docs (A/B)"]
        end
        MCPs["Shared MCP tools\nRAG · Skills · Artifacts · Facts · Telemetry · Vision"]
    end
    Snapshot --> TaskQueue
    Snapshot --> Agents
    A1 --> LLMRouter[LLM Router]
    A2 --> LLMRouter
    A1 --> MCPs
    A2 --> MCPs
    MCPs --> VectorDB[(VectorDB)]
    MCPs --> ObjStorage[(Object store)]
    Host -. "on demand" .-> Runtime["agents-runtime\nvirtual desktop"]

Shared vs. dedicated substrate

Shared substrate (default pilot): one physical LLM Router, VectorDB, object store and relational store; logical isolation by namespaces, collections, buckets and tenant/host/profile metadata.

Dedicated substrate: per-host or per-tenant instances when regulation or risk require it.

Canonical pieceRole
Metadata relational storePersistent source: agents, goals, approvals, audit
VectorDBSemantic retrieval, isolated per collection
Object storeDeliverables and evidence
LLM RouterOne interface to many providers, with budget
Conversation GatewayChat-completions-compatible surface
ConsoleOperate + Explore (live operational graph)
Gated armCreates and destroys institutions; no published port
Ontology catalogRDF/SHACL/SPARQL workbench; not the live graph

Boundaries

Host boundary. Each agents-host has its disk, Task Queue, credentials and profiles. The local queue is not shared. A host's private vector library does not cross to another without explicit export and human approval.

Brain → gate → arm boundary. The gated arm applies the physical deployment of institutions and rejects a spec that is not approved. Components that propose do not execute: the real gate requires approved state.

Identity boundary. An agent is not a name: it is the (host, name) pair, as an X-Road-style member identifier (INSTANCE/CLASS/member/subsystem). Ambiguity is resolved with different policies per service: governance and evaluation paths reject; decorative links warn and leave null.

Sovereignty layers

Sovereign — per host, not shared without federation. Local Task Queue · profiles (identity, configuration, credentials) · private retrieval per host and profile · memory and sessions · container network perimeter.

Platform — shared or dedicated per policy. Relational store · VectorDB · object store · LLM Router · ontology catalog. Today isolation is per installation: one dedicated stack per client.

Federated — circulates between hosts with provenance intact. Published skills · shareable social facts · exportable public library (rag_public) · federated tasks and handoffs · trust policy between hosts.

Library metaphor: society metadata = civil registry and public library of the polis; agent private corpus = the individual's private library; shared skills = public shelf of reusable skills; auditable facts = shareable findings with provenance.

Four knowledge layers (do not collapse them)

LayerQuestion it answersWhat it is not
Live operational graphWhat is happening in this institution now?Not a store: recomputed on each request
Ontology catalogWhat does this mean, and is it valid against the catalog?The semantic contract (PROV-O, ORG, OWL-Time, SHACL)
Compiled code graphHow is the software made?Not runtime truth
Episodic contextWhat happened in this session, this stretch?Does not replace the operational graph

Replacing the operations panel with the catalog explorer would swap a running system for a viewer of a graph that already exists. They integrate; they do not merge.

Catalog vocabulary is closed: node or edge types emitted by code that the ontology does not declare fail validation in the quality pipeline.

Interoperability

A2A v1.0 — the exposed unit is the container, not the individual agent. It is directed (the map comes from trust policies), not open discovery. Exposure requires two deliberate gestures: a token and a host declaration.

MCP. The platform is strong as a client and limited as a server: its own MCP servers are stdio-only, without HTTP/SSE — only the agent process can reach them.

Non-negotiable constraints

  • The local Task Queue is accessed only from its agents-host.
  • Each profile has its own retrieval collection. Not shared between profiles.
  • A host's private library does not cross to another without explicit export and human approval.
  • Skills and facts circulate between hosts with provenance intact.
  • The architect proposes; does not provision. Deployment requires an approved spec.
  • No self-improvement on model weights.