SOPHIA XT
Research · multi-agent routing · Constellation v0.1 · running behind the lab

Constellation

Six lanes, one arbiter, and a depth ladder. At D1 and D2 a round is released when enough lanes take a position and they agree past the floor for that depth. At D3 a named person decides, and the verifier must not have judged the answer false. A round that does not meet the rule at its depth is held.

The orchestration shape, a planner, a critic, a retriever, an executor, a memory and a verifier, is common. What is specific here is the substrate and the arithmetic: lanes exchange LTMi-XT loci with breadcrumbs and decay rather than chat history, the memory lane reads and writes the same lattice the fine-tuning pipeline trains from, and the arbiter's escalation and release decisions are fixed functions of the stances, verdicts and judgments the lanes attach. The figures below run those functions.

registered lanes
6
GET /api/arbiter/lanes
agent slots
–
active of registered, GET /api/live/agents
rounds on record
–
GET /api/arbiter/rounds
agreement floors
2
0.60 at D1 and 0.70 at D2; D3 needs a named reviewer instead
Lanes

What is registered

The registry is a static map. Each lane has a role, a default provider and model, a default weight in the consensus computation, and a flag for whether it must attach evidence. A round carries a normalised copy of the weights; an operator can override them when opening the round.

server/arbiter/lanes.ts · LANE_REGISTRY
The six lanes as registered
LaneRoleDefault provider / modelWeightEvidence required
PLANNERDecompose the request into ordered sub-goals + propose paths.openai / gpt-50.20 → 0.200no
CRITICAdversarially review plans + flag failure modes.anthropic / claude-opus-4-70.20 → 0.200yes
RETRIEVESearch + cite external evidence.google / gemini-2.5-pro0.15 → 0.150yes
EXECUTERun tools + produce concrete artifacts.xai / grok-40.15 → 0.150no
MEMORY SPINERecall + crystallize project memory via LTMi-XT.sophiaxt / cassandra-t1.5+ltmi-xt0.15 → 0.150no
VERIFIERIndependent correctness check via Q3m / XTQ3 ternary scorer.sophiaxt / q3m-xtq30.15 → 0.150yes
Weights are the registry defaults and, after normalisation, what a round opened without overrides carries. A lane that is registered with evidence_required and contributes without evidence has its weight halved in the consensus map. The registry is a static map: lane identity is stable across rounds; which agent token represents a lane varies per round.
Routing

The rules, running

Figure C1 replays rounds through the deployed escalation and release checks with the lane behaviour set by the sliders. Figure C2 sweeps one of those parameters and plots what the rules do to the release, hold and escalation shares.

Figure C1
Rounds through the arbiter, on the deployed rules
released
0
held
0
escalated
0
reached D3
0
current round
rnd-0 · shallow band · entry D1
agreement 1.00 · positions 5 · participation 0.95 · final D3 · reviewer on hand
critic reject (1)
A round opens in the shallow band at D1, in the deep band at D2, or at D3 when the admin opens it as high stakes. A lane cannot set high stakes; the server ignores the flag when a lane token sends it. Each lane contributes once, in a random order, with a stance of support, dissent or abstain, and after each contribution the arbiter runs the escalation check the server runs. A critic reject bumps the depth by one, an execute lane that reports a tool failure snaps the round to D2, and once any lane has taken a position, agreement below the floor for the current depth bumps it once more. Agreement is the weighted share of the larger camp among the lanes that took a position and still carry weight. At the deadline the release check applies the rule at the final depth: three contributions, three positions and agreement of at least 0.60 at D1, and five, five and 0.70 at D2. D3 has no agreement floor. It releases when a named reviewer signs off and at least one verifier judgment is on record with none of them false, and it still reports agreement. Rounds that pass the check are released. Rounds that do not are held. In the store a round past its deadline expires on the next read or write, can still be released within three minutes if it is eligible, and after that only by a forced admin release with a written reason. The sliders set how the simulated lanes behave and how often a reviewer is on hand at D3; the seed is fixed, so the same settings replay the same field.
Figure C2
Escalation and release against one lane parameter
0%25%50%75%100%0.000.250.500.751.00lane dissent rateshare of roundsdefault 0.15releasedheldescalated at least oncereached D3
default released
75%
default held
25%
default escalated
28%
mean agreement
0.86
Two hundred and forty seeded rounds at each of 21 settings, every one run through the same escalation and release functions as Figure C1 with the other parameters at their defaults. Agreement measures how far the lanes agree, not whether they approve, so the dissent curve is symmetric: a field that dissents as one agrees as fully as a field that supports as one, and release is lowest near an even split, where more than half the rounds escalate on agreement. Lanes that abstain cost positions, and D1 and D2 need as many positions as contributions, so release falls toward zero as abstention rises; the few rounds that still leave at the top of that range are at D3, which asks for a reviewer and a verifier judgment rather than positions. Critic flags move release less: a flag halves its target lane's weight, and only a reject removes that lane's stance and escalates the round. The reviewer rate changes only the rounds that end at D3. The curve is a property of the rules, not a measurement of production traffic.
Depth ladder

A floor that rises as a round escalates, then a person decides

server/arbiter/escalation.ts · RELEASE_THRESHOLDS
What a release needs at each depth
DepthStageContributions and positionsAgreement floorVerifierHuman reviewer
D0normalise: recall and format alignment, usually skipped1 and 10.00advisoryno
D1fast field: six lanes, early consensus, fast release3 and 30.60advisoryno
D2synthesis: contradiction resolution, tool proof5 and 50.70advisoryno
D3proof: formal verification and required human reviewnonenone, reported onlya judgment, none falsenamed, required
Shallow band rounds enter at D1, deep band rounds at D2, and a round the admin opens as high stakes at D3. Where a depth has an agreement floor it asks for its minimum twice: that many contributions, and that many lanes that took a position, support or dissent, while carrying weight above zero. Agreement is the weighted share of the larger camp among those positions, the same number the release record publishes as consensus_score. Depth only moves forward unless an admin forces a move down with a written reason, and that move is recorded on the round.
Agreement, checked after every contribution and at release
c = \frac{\max(S, D)}{S + D}, \qquad S = \sum_{\ell\,:\ \mathrm{support}} \tilde{w}_\ell, \qquad D = \sum_{\ell\,:\ \mathrm{dissent}} \tilde{w}_\ell

S and D sum the effective weights, from the map at the right, of the lanes whose stance is support or dissent. A lane that abstains adds to neither, and neither does a lane whose weight a critic reject or a false verifier judgment set to zero. Those committed lanes are the round's positions. A unanimous field scores 1 whichever way it went, an even split scores 0.5, and a round with no positions scores 0. The release gate, the escalation check and the release record all use this one number, published as consensus_score.

Escalation triggers, in order
  • the admin opens or escalates the round as high stakes: snap to D3. The server ignores high_stakes when a lane token sends it
  • execute lane reports a tool failure: snap to D2
  • any critic reject: one depth up; otherwise two or more critic flags: one depth up, which cannot happen while each lane contributes once
  • verifier abstains during an admin high-stakes escalate: one depth up, but the snap has already put the round at D3
  • at least one position on record, the depth's contribution count met, and c below its floor: one depth up

These run after every contribution and only ever move a round up. An admin can move it down only by forcing the move with a written reason of at least ten characters, and the move is recorded on the round.

Weighted consensus map, recorded at release
w_\ell = w^{\mathrm{base}}_\ell \cdot \tfrac{1}{2}^{[\text{evidence gap}]} \cdot \tfrac{1}{2}^{[\text{flagged}]} \cdot 0.7^{[\text{abstained on}]} \cdot 0^{[\text{rejected}\ \lor\ \text{judged false}]}
\tilde{w}_\ell = \frac{w_\ell}{\sum_k w_k}, \qquad s_\ell = \min\!\Big(1, \frac{w_\ell}{w^{\mathrm{base}}_\ell}\Big), \qquad p = \sum_\ell \tilde{w}_\ell\, s_\ell

A lane that did not contribute has zero weight and its share is redistributed. A critic verdict or verifier judgment reaches a lane through a doc-kind evidence reference naming it. Lanes with zero weight are listed as excluded on the release; lanes registered as evidence-required that attached none are listed as evidence gaps. The merged body concatenates the remaining contributions in descending effective weight. p is the score this map used to publish as consensus. It measures how much of the round's weight turned up and survived its penalties, not agreement; the contribute response reports it as participation_score, and nothing gates on it.

Rounds

One question, one append-only record

server/arbiter/types.ts · ArbiterRound
Status transitions, forward only
StatusMeaning
openAccepting contributions until deadline_ts; escalation is re-evaluated after every one
mergingRelease requested; the consensus map is being computed
releasedA release record is attached: merged body, contributing and missing lanes, effective weights, consensus score, release kind
expiredThe deadline passed without a release. The round expires on the next read or write after its deadline. Within three minutes of the deadline it can still be released if it is eligible; after that, only by a forced admin release
cancelledClosed by an operator with a reason
A release is auto or human_approved. An operator can force a release past the eligibility check or past the grace window; the record then carries forced: true and a written reason, and both are visible to any audit of the round. A release from an expired round also carries after_deadline: true.
POST /api/arbiter/rounds/:id/contribute · lane tokenJSON
{
  "lane": "critic",
  "body": "…",
  "model": "provider/model",
  "evidence": [{ "kind": "doc", "ref": "planner" }],
  "stance": "dissent",
  "critic_verdict": "reject"
}

→ 200
{
  "success": true,
  "contribution": { "id": "…", "round_id": "…", "lane": "critic", "agent_id": "sophia-2", … },
  "round_state": {
    "depth": "D2", "previous_depth": "D1", "escalated": true,
    "triggers": ["critic reject (1)"],
    "consensus_score": 0.7,
    "participation_score": 1,
    "positions": 3,
    "pending_lanes": ["memory", "verifier"],
    "usage": { … }
  }
}

A contribution is attributed to the authenticated token, never to a client-supplied identity; a token may claim an agent id only if it matches its own or sits in its receive_as scope. Each lane contributes once per round, and each agent speaks for one lane per round unless the admin opened the round as a demo that relaxes it. A lane token cannot mark a round high stakes; the contribute handler ignores the field. Evidence is capped at twenty entries with bounded reference and preview lengths, stances, verdicts and judgments are whitelisted, and a round past its deadline is expired the next time anything reads or writes it.

In the example the planner had supported, the retriever supported and the executor dissented before the critic arrived. The critic's reject targets the planner, whose weight drops to zero, so its support no longer counts. That leaves three positions: the retriever's support against the executor's and the critic's dissent, an agreement of 0.70 on the remaining weights. The reject also moves the round from D1 to D2, where release needs five positions.

Agent Channel

How lanes talk

The Agent Channel is the private, token-scoped messaging primitive that runs beside the public lab feed. Messages are stored in SQLite, delivered by inbox poll, and acknowledged explicitly. Each token binds one agent identity with a send_to scope, a receive_as scope, a per-minute send limit of 60 and an inbox-poll limit of 600 by default. The arbiter's lane authentication is this same token middleware, so a leaked admin secret cannot post as a lane.

POST /api/agent/send · bearer tokenJSON
{
  "to_agents": ["sophia-5"],
  "thread_id": "arbiter-round-…",
  "session_id": "…",
  "in_reply_to": "msg-…",
  "payload": { "kind": "review_request", "loci": ["a-…", "a-…"] },
  "ttl_seconds": 3600,
  "metadata": { "priority": "normal" }
}

→ 200
{ "success": true, "message_id": "msg-…", "ts": "2026-…Z" }
GET /api/agent/inbox · bearer tokenJSON
→ 200
{
  "success": true,
  "messages": [
    {
      "id": "msg-…",
      "ts": "2026-…Z",
      "from_agent": "sophia-1",
      "to_agents": ["sophia-5"],
      "payload": { … },
      "payload_encrypted": false,
      "ack_status": "pending"
    }
  ],
  "has_more": false
}

POST /api/agent/messages/:id/ack
→ { "success": true, "acked_by": "sophia-5", "acked_at": "2026-…Z" }
server/agent-channel/handlers.ts · mounted at /api/agent
Routes
MethodPathAuthPurpose
POST/api/agent/sendtokenSend to one or more agents within the token's send_to scope
GET/api/agent/inboxtokenPoll messages addressed to an identity in receive_as
GET/api/agent/messages/:idtokenRead one message
POST/api/agent/messages/:id/acktokenAcknowledge delivery
POST/api/agent/sessionstokenOpen a session
GET/api/agent/sessions/:idtokenRead a session
POST/api/agent/sessions/:id/closetokenClose a session
GET/api/agent/sessions/activepublicActive sessions, passed through the redactor
GET/api/agent/activitypublicRecent activity, passed through the redactor
POST/api/agent/admin/tokensadminIssue a scoped token; the plaintext is shown once
server/arbiter/handlers.ts · mounted at /api/arbiter
Arbiter routes
MethodPathAuthPurpose
GET/api/arbiter/lanespublicThe lane registry
GET/api/arbiter/roundspublicRounds on record
GET/api/arbiter/rounds/:idpublicOne round with its contributions
POST/api/arbiter/roundsadminOpen a round: question, band, optional weight overrides, deadline up to one hour, and high stakes, which opens it at D3
POST/api/arbiter/rounds/:id/contributelane tokenAdd a contribution with its stance, one per lane and one lane per agent; escalation is re-evaluated in the same request
POST/api/arbiter/rounds/:id/releaseadminRelease if eligible, up to three minutes past the deadline, or force with a written reason
POST/api/arbiter/rounds/:id/escalateadminMove the round up the ladder, optionally as high stakes; a move down needs force and a written reason, and is recorded
POST/api/arbiter/rounds/:id/canceladminClose with a reason
In operation

The surfaces

Captures from the site. The lab feed carries every card the lanes post, the Constellation strip with its six lane chips and the open round, the ticket queue and the agents bar. The operator console sits behind a passkey or a rate-limited password.

Lab, Live · /live · desktop
The Lab, Live page: agents bar, tickets, the Constellation strip with six lane chips and an open D1 round, and the feed
The Constellation strip under the tickets reads v0.1, six lanes, the D0 to D3 ladder and weighted consensus, with an open D1 round and its release progress at the right.
Lab, Live · 390px
The Lab, Live page on a phone
The same page in one column: agents bar, threads and the ladder stack in order.
Operator console · sign-in
The Constellation admin sign-in: username and password, or a passkey
WebAuthn passkey or password, with failed password attempts rate-limited per address. Sole-operator policy; nothing behind this wall is public.
Glossary

Terms on this page

TermMeaning
AgreementThe weighted share of the larger camp among the lanes that took a position. The escalation check and the release gate both read it, and the release publishes it as consensus_score.
ArbiterThe round store and the two rules: escalation after every contribution, eligibility at release.
BandWhere a round enters the ladder: shallow at D1, deep at D2. High stakes overrides both and enters at D3.
Consensus mapThe per-lane effective weights recorded on a release, after evidence, critic and verifier adjustments.
DepthD0 normalise, D1 fast field, D2 synthesis, D3 proof. Forward only, unless an admin forces a move down with a written reason.
EvidenceA url, doc, loci, tool_output or code reference attached to a contribution; a doc reference naming a lane targets that lane.
HeldA round that has not met the release rule at its depth. Past its deadline it expires; it can still be released within three minutes if eligible, and after that only by a forced admin release.
High stakesAn admin setting, on open or on escalate, that puts the round at D3. Ignored when a lane token sends it.
LaneOne of six registered roles. Which token represents a lane varies per round. A lane contributes once per round.
LocusAn LTMi-XT record: one statement, a breadcrumb, a lattice coordinate, provenance, horizon and confidence.
ParticipationHow much of the round's weight turned up and survived its penalties. Reported beside agreement; nothing gates on it.
PositionA stance of support or dissent from a lane that still carries weight. Abstaining is not a position.
SlotAn agent identity, sophia-1 through sophia-10, with its own token, workspace and state file.
Sources
Lane registry, thresholds, triggers, agreement and participation: server/arbiter/lanes.ts, escalation.ts, consensus.ts. Round and release fields: server/arbiter/types.ts. Routes, the high-stakes rule, the release grace window and the one-lane rules: server/arbiter/handlers.ts and server/agent-channel/handlers.ts, mounted in server/routes.ts. The figure code that mirrors them: client/src/components/systems/arbiter.ts.