aspace://superfriends/start

What this example shows

Superfriends is a financial research hall built on AgentSpaces: an analyst asks about a ticker, a chair sends the question to a dozen specialist services, their findings land in one knowledge space, three analysts of three model vendors vote, exactly one paper trade fills, and a dossier is written from what the space holds. It runs as six processes on one machine, three of them different application frameworks with different model vendors, one of them Clojure, one of them started late on purpose. Without an API key it runs offline on fixtures and its six-process fleet test runs in CI; with a key, that vendor goes live and nothing else changes.

This guide walks the example as a reader of the developer guide, the workflow guide and the architecture guide would: each chapter names the mechanism, shows how the hall uses it, and points at the chapter that defines it. The point of the example is a single one, repeated: because the fabric carries discovery, replication, the auction, the vote, the ordered log and the running total, every service is a few dozen lines that take a request, make one call and write what they found. The power is in the spaces, so the services can be simple.

Where the example livesagentspaces-example-apps/superfriends: README.md is the overview, CONTRACT.md the build contract every peer follows (ports, spaces, records, each service's exact output), PLAN.md the design and its phases. Chapter 11 maps the modules.
aspace://superfriends/fleet · chapter 1

The fleet

ONE GROUP: superfriends (founding literal superfriends-v1, dev-local, 250 ms tick)plannerSpring Boot · the chair · console :7890seed 127.0.0.1:7801grokplain Java · LangChain4j · xAIgptSpring Boot · Spring AI · OpenAIclaudeMicronaut · LangChain4j, MCP · AnthropicgraphClojure · DataScript assetsearchplain Java · the newcomerstarted laterevery other peer seeds from the planner, then gossips with everyonesix processes, three frameworks, three model vendors, one Clojure peer with no agent at all;all twelve spaces registered on every peer; a port per peer (7801 to 7806) so a demo and the test coexist
The fleet. Six JVM processes join one group by the same founding literal and gossip with one another; the planner is only the seed everyone dials first. The frameworks differ, the wire does not: every peer holds a full replica of the twelve spaces and the same catalogue of cards.

Six processes join one group. The group is founded from a literal, superfriends-v1, so every member derives the same group id locally and any member could seed; the planner is the seed only because the demo starts it first. Each peer binds its own port (7801 to 7806) and honours SUPERFRIENDS_BIND and SUPERFRIENDS_SEEDS, which is how the fleet test and a demo run side by side. Security is the dev-local profile: signed frames, session-keyed channels, no TLS, which is what lets a Clojure process and a plain-Java one join the same room as the Spring Boot and Micronaut peers.

PeerFramework and libraryVendor (served model)Carries
plannerSpring Boot, the starter, Spring AI, the consolenone: it calls the fleetthe chair: the join, the proposal, the estimate, the decision, the position book, the ledger, the console
grokplain Java, agentspaces-runtime and agentspaces-langchain4jxAI, grok-4x-search, social-sentiment, buzz; an analyst
gptSpring Boot, the starter and agentspaces-springaiOpenAI, gpt-5filings, fundamentals, options-chain, chart; an analyst; the vectors asset; a desk executor
claudeMicronaut, its LangChain4j and MCP bridgesAnthropic, claude-opus-4-6entity-lookup, document-digest, report, deck; an analyst; a desk executor; MCP import and export
searchplain Javanoneweb-search; started late
graphClojure, agentspaces-clj and DataScriptnonethe graph asset and the analyst UI; no agent at all

The frameworks are a seating choice. The same annotations bind through the plain-Java runtime, the Spring starter and the Micronaut processor, and the Clojure peer joins with no agent, subscribes to spaces and serves an asset. Nothing in the flow names a framework, and a service could move from one peer to another by moving its class.

Where it is describedThe architecture guide's sizing chapter for why six peers and what each holds; mixing peers for the rules a mixed fleet follows; the developer guide's chapters on the Spring Boot starter, Spring AI, Micronaut, LangChain4j and Clojure.
aspace://superfriends/spaces · chapter 2

Twelve spaces, three rooms

THE COMMON ROOM (model wire)model-requestsrequests, responses, chunksconversationschat memory snapshotsusageModelUsage, the usage panelTHE HALLinquiriesInquiry, EvidenceJoinedtasksAUCTION, 1000 ms: service requestsknowledgefindings, entities, theses, 30 dsignalsSentimentScore, 1 hvotesproposal, ballots, decisionordersORDERED: TradeOrder, Fill, PositionBookreportsDossier, Deck, Chart, InquiryClosedTHE ASSETS AND THE OUTSIDEdataDataQuery and DataResult for vectors and graphmcp-callsMcpToolCall, when MCP import is onLEASE_RACE with a 200 ms settle window unless named; every hall write is tagged inquiry, ticker, service
Twelve spaces, three rooms. Each space is a lane with one strategy, one retention and one reason to exist. The hall's tasks space is an auction, since every peer prices a task by its vendor's token cost; orders rides the ordered log, since a paper trade must fill exactly once; everything else is the lease race with a two-tick settle window.

Every peer registers all twelve spaces, in one order, from Hall.SPACES. A space is a lane: it has one conflict strategy, one settle window, one retention policy through its leases, and one reason for existing, and every stage inherits those by naming the space. Two spaces step off the default lease race for a reason the workload proved. tasks is an AUCTION with a one-second settle window: every taker bids its vendor's token price, and the window has to outlast gossip so every bidder's claim arrives before the incumbent's take returns; at 200 ms two peers ran the same task. orders stands on the ordered log: a paper trade fills once or the position book lies.

Every hall write carries three tags, inquiry, ticker and service, inside the signed record, so templates select on them before decoding, the chair's join keys on the inquiry id, and the console's data map reads like a case file. Leases are the retention: knowledge and reports keep thirty days, signals and orders an hour, a task request an hour. A finding always has at least one source and an about list that names the ticker.

Where it is describedThe Space API, conflict strategies and leases in the developer guide; spaces as lanes and the consistency ladder in the architecture guide; the shape of data and exactly once in the workflow guide. The records are Space entries; the hall's are in the example's wire module.
aspace://superfriends/cards · chapter 3

Cards and the catalogue

AGENT CARDS: one per bound service, declared by its annotationsx-searchgroksocial-sentimentgrokbuzzgrokfilingsgptfundamentalsgptoptions-chaingptchartgptentity-lookupclaudedocument-digestclaudereportclaudedeckclaudeweb-searchsearchconsumes <Request>#v1, produces ServiceDone and findings; the chair lists services by what their cards consumeASSET CARDS: one per served assetvectorsgpt · SimpleVectorStore · 5 mgraphClojure · DataScript · 5 sanswered through the data space: DataQuery in, DataResult outROLE CARDS: who may do whatanalyst-*one @Ballot per vendordesk-*volunteers for the logexecutor-*@OrderedTake racersthe desk's member set is read from the desk-* cards at startup
The catalogue. Nothing is configured by name. A service is a card the binder derives from a class's annotations; an asset is a card the connector runtime publishes; a role is a card too. The chair plans from the catalogue, the desk forms its quorum from it, and a peer that starts late is in the next plan the moment its card replicates.

Agent cards

A service is a class with an @AgentSpec and one cue annotation, and the binder derives its card: the name, what it consumes (the request record, as a schema name with its version) and what it produces. The chair never holds a list of services. It asks discovery for every card whose consumes names a request type it knows how to write, and that is the plan's input. The twelve services each do one thing: take a request, ask the graph what is already known, make one model call, write findings with sources and tags, return a ServiceDone.

// agentspaces-example-apps/superfriends/grok -- XSearch: the whole service
@AgentSpec(name = "x-search", description = "Finds recent posts on X about a ticker, cashtag or account")
public final class XSearch {
    @BidFunction(space = Hall.TASKS)
    public double bid(Object request) { return Bids.bid("grok", request); }

    @SpaceTake(space = Hall.TASKS, lease = "5m", resultSpace = Hall.KNOWLEDGE, resultLease = "30d")
    public ServiceDone search(XSearchRequest request) {
        // one model call (or Grok's live search with a key), one finding per post, each with its source
        ...
        return new ServiceDone(inquiryId, ticker, "x-search", count, now);
    }
}

The bid function is the only other method, and it is one line: the peer's token price for the request. That is what makes the auction route a task that two peers offer, social sentiment on both grok and gpt, to the cheaper one while it is up and to the other when it is not, with no failover code anywhere.

Asset cards

An asset is a card too, published by the connector runtime for a provider that answers queries: the vector store on gpt and the graph on the Clojure peer. A client on any peer writes a DataQuery into the data space naming the asset and the query; the one peer serving that asset takes it, answers, and writes a DataResult leased for the card's freshness. Identical queries across the fleet cost one execution, and every peer reads the result from its replica. The graph's freshness is five seconds, since its queries are in memory and a longer result lease would hand a repeat inquiry the empty coverage answer of its predecessor.

Role cards

The analysts and the desk are cards as well. Each vendor peer binds one analyst whose only method is a @Ballot, so the electorate of a vote is whoever holds an analyst card. Each desk peer binds a volunteer card first, and the ordered log's member set is read from those cards at startup rather than configured (chapter 7). A peer that starts late is in the catalogue within a card cadence of about two seconds, which chapter 8 turns into the demo's set piece.

Where it is describedDiscovery and cards in the developer guide; cards and advertisements in the architecture guide; AgentCard, AssetCard, DiscoveryService, ConnectorRuntime, AssetProvider and DataQueryClient in the javadocs; the @BidFunction and route by cost.
aspace://superfriends/inquiry · chapter 4

One inquiry, end to end

Inquiryinquirieschair planscoverage, cardsrequeststasks (auction)servicesfindings + ServiceDonejoinknowledge, once per id@Proposeposition:<id>, quorum 3three ballotseach vendor's thesis@OnDecisionTradeOrder or hold@OrderedTakeone Fill, fleet-wide@SpaceReducePositionBookreport phasechart, dossier, deckInquiryClosedthe ledger lineevery record carries the inquiry id and the ticker as tags;every stage is a take, or a reaction that is safe to repeat;the once-only steps are the join (leased ticket), the proposal (once per id), the fill (ordered log)
One inquiry, end to end. An Inquiry entry sets off a chain of takes and reactions across the hall's spaces; no stage calls the next, each writes the record the next reacts to. The chapters of the workflow guide name every link in this chain.

An Inquiry entry starts it, from the analyst UI, the console, the inquirer program or the test. No stage calls the next: each writes the record the next one reacts to, and the inquiry id on every record is the thread.

StageMechanismChapter
The chair reacts to the Inquiry, asks the graph's coverage what the hall already knows about the ticker, skips the durable services whose knowledge is newer than the inquiry's maxAgeMinutes (never the perishable ones: posts, sentiment, buzz), writes one request per remaining service to tasks and an EvidenceExpected naming them to knowledgea reaction that maps one record into several; the catalogue as the plan's inputfan-out
Each service takes its request under the auction, asks the graph first, makes one model call, writes its findings, entities and relations with sources and tags, and completes with a ServiceDone; sentiment also contributes its score to a push-sum epocha take; a tagged result; a contributionsequence, aggregate
A @SpaceJoin on knowledge fires once per inquiry when every expected ServiceDone is in, the count read from the chair's own EvidenceExpected; the settled sentiment estimate is an optional part; the join is LEASED, once fleet-wide under a ticketgather by a declared countjoin
A @Propose opens position:<inquiryId> with buy, sell and hold at a quorum of three; each vendor's @Ballot reads the inquiry's findings and the graph's timeline and contradictions, asks its own model for a thesis, writes the Thesis and casts oncedecidedecide
@OnDecision returns the approval, or opens a leased window for a person's; the approval's reaction returns the TradeOrder; three executors race under @OrderedTake; exactly one Fill commits; a @SpaceReduce folds it into the PositionBookdecide; a deadline as a leased entry; exactly once; a running totalexactly once, time
The fill, or the window's lapse, commissions the chart and the dossier; the dossier's evidence, theses, decision, position, sentiment and sources sections are generated from the space; the dossier's reaction commissions the deck and writes the InquiryClosed linecompose from the record of the flowcompose

The chair's three annotations are the whole orchestration. There is no engine and no state machine; the state is the spaces, which is why a second inquiry about the same ticker runs only the perishable services, and why a crashed peer's half-done task simply reappears for a sibling when its lease lapses.

// CONTRACT.md section 7 -- the chair's join and proposal, as the planner binds them
@SpaceJoin(space = "knowledge", key = "inquiryId", mode = LEASED, settle = "5s", resultSpace = "inquiries",
    parts = {@Part(EvidenceExpected.class),
             @Part(value = ServiceDone.class, countedBy = "EvidenceExpected.services"),
             @Part(value = SentimentEstimate.class, optional = true)})
public EvidenceJoined joined(Joined j) { ... }

@Propose(space = "inquiries", vote = "votes", prefix = "position:", key = "inquiryId",
    options = {"buy", "sell", "hold"}, quorum = 3, lease = "30m")
public String open(EvidenceJoined e) { return "ticker=" + e.ticker() + ";inquiry=" + e.inquiryId() + ...; }
Where it is describedThe workflow guide is the reference for every row above, and its chapter 14 is this flow in that guide's terms; the annotations are in the developer guide's part I (@SpaceJoin, @Propose, @OrderedTake, @SpaceReduce in the javadocs).
aspace://superfriends/room · chapter 5

The common room

MODEL REQUESTS AS ENTRIES: the model-requests spaceplannerclient onlygrokserves grok-4gptserves gpt-5claudeserves claude-opus-4-6ModelRequesta request names a model; the peer serving it takes the entry, answers, and writes a ModelResponse and a ModelUsageLEVELS0: no keyevery peer scripted; fixtures; CI1: one keythat peer live, others scripted2: all keysthree live vendors3: and dataMCP servers configuredthe scripted models answer by request shape (a marker line), so the split vote and the join happen at level 0 too
The common room. Model access is a fleet service: one model client and one model server on every vendor peer, speaking the model wire over an ordinary space. A key turns one peer live; the others keep calling it through the same entries. Chat memory and usage ride the same room, so the console's usage panel shows three vendors in one table.

Model access is a fleet service. Each vendor peer runs a model server that takes ModelRequest entries naming its model and a model client that writes them, so the planner, which has no vendor of its own, calls Grok, GPT and Claude through the fleet, and a service on grok whose own model is scripted still gets a live answer from a neighbour that has a key. Chat memory rides the conversations space as snapshots, which is how a conversation survives a peer being killed and resumes on another framework; usage rides the usage space, which is why the console's usage panel shows three vendors in one table.

Without a key a peer serves a scripted model of its own framework. The scripted models answer by request shape rather than by prompt text: every prompt a service sends starts with a marker line naming the task and the ticker, a real model ignores it, and the scripted one answers from the fixture for that ticker. That is what lets the quorum split, the join fire and the trade fill at level 0, deterministically, in CI.

Where it is describedThe model wire in the developer guide's capabilities chapter and LangChain4j chapter; the records are agentspaces-model-wire; the Spring AI chapter's model access; the workflow guide's models and planners.
aspace://superfriends/knowledge · chapter 6

Knowledge and its two assets

KNOWLEDGE: one space, two assets over itknowledgefindings, entities, relations, theses@SpaceNotifysubscription + replayvectors (gpt)SimpleVectorStore · embeddingsgraph (Clojure)DataScript · provenance per factfreshness 5 mfreshness 5 s · facts, neighbors, path, timeline, coverage, contradictionsDataQuerydata space · asset, q, paramsDataResultleased for the card's freshnessserved once fleet-wideRecall.context before a model call; Recall.freshServices before the chair plans; identical queries across the fleet cost one execution
Knowledge and its two assets. Every finding lands in one replicated space. Two asset peers index it differently, a vector store for similarity and a graph for facts and provenance, and both answer the same DataQuery entries, so a service on any peer, in any language, asks the graph first and quotes what a rival vendor wrote.

Everything a service finds goes into one replicated space, tagged and sourced, and two asset peers index it differently. On gpt, a @SpaceNotify on knowledge adds each finding and entity to a vector store, served as the vectors asset for similarity. On the Clojure peer, a subscription with a replay of what the space holds turns every entry into DataScript facts with provenance (the entry id, the issuer, the as-of time), an expired entry retracts its facts, and the graph asset answers six named queries: facts, neighbors, path, timeline, coverage and contradictions.

Both are reached the same way, a DataQuery in the data space, through one small client in common. Its two uses are the whole of RAG in this example: Recall.context gathers what the hall knows before a model call, on every vendor, and Recall.freshServices reads the graph's coverage before the chair plans. claude's report quotes a finding grok wrote because both read the same space, not because anyone passed a document around.

A peer with no agentThe graph peer binds nothing and holds no card of its own beyond the asset's. It subscribes, transacts and answers, and it serves the analyst UI from the same database. It is the example's proof that a member of the fleet can be pure state and still be first-class.
Where it is describedAssets and connectors in the developer guide's Micronaut chapter and the data gateway; the Clojure bindings in part V; the example's graph/README.md for the schema, the queries and the UI's routes; DataQueryClient in the javadocs.
aspace://superfriends/decide · chapter 7

Decide, then trade exactly once

THE DESK FORMS ITSELF: an ordered log whose members are read from cardsdesk-plannera volunteer's carddesk-gpta volunteer's carddesk-claudea volunteer's cardRendezvous.formDeskmember set = the desk-* cardsno configured member list; the log's holder is the space's registered writerONE FILLTradeOrderfrom @OnDecisionexecutor-planner@OrderedTakeexecutor-gpt@OrderedTakeexecutor-claude@OrderedTakeFillcommit index nPositionBook@SpaceReducethree race; the log commits one claim; a crashed executor repeats nothing
Exactly one paper trade. The orders space stands on the ordered log. Its member set is not configured: three peers volunteer with a card and the desk forms from the cards it sees. Three executors race for every order and the log commits exactly one fill, which a running reduce folds into the position book any peer can read.

The vote is three methods on three peers. The chair's @Propose opens one proposal per inquiry; each analyst's @Ballot casts once, counted at the authorizer's granularity, one vendor one vote; the chair's @OnDecision acts once when the tally reaches the quorum. The personas decide the split: Grok reads the street, GPT reads the numbers, Claude reads the risk factors, so one fixture ticker splits buy, buy, hold and the other hold, sell, sell. A quorum proves that three analysts agreed, and nothing more, which the README says plainly.

The trade is the ordered log, and the log's member set forms from cards. Each desk peer binds a volunteer first, then calls the rendezvous, which waits for the desk cards and forms the log's quorum from the peers they name; only then does the peer bind its executor. Three executors race every TradeOrder under @OrderedTake, the log commits exactly one claim, and the fill records the commit index that paid it. A crashed executor repeats nothing, and a @SpaceReduce folds every fill into the PositionBook any peer reads. The operator's gate sits between the decision and the order, and it is a reaction, not a wait: the decision returns the approval itself when the operator is simulated, or writes a leased DeskWindow and returns nothing when a person must approve; an Approval entry, from the console's command or the analyst UI's button, is what the order reacts to, once per decision; the fill, or the lapse of the window, is what commissions the dossier, so it carries the position when there is one and is written without it rather than never.

Sensing sits beside deciding. Every sentiment score contributes to a push-sum epoch per inquiry; the planner's @OnEstimate writes the settled estimate into knowledge, where the chair's join takes it as an optional part. Sense, then decide.

Where it is describedThe developer guide's vote, ordered log and aggregate capabilities, and the decide and sense annotations; the architecture guide's deciding chapter and the ladder; VoteCapability, PushSumAggregate, VoteClient and AggregateClient in the javadocs.
aspace://superfriends/newcomer · chapter 8

The newcomer

A SERVICE ADDED TO A RUNNING FLEETsearch starts--join-search, port 7805dials the seedcard replicatesweb-search, within a cadencenext inquirythe chair lists itweb findingin the dossierthe chair plans from live cards, not from a list; the running inquiry's dossier cites a finding that did not exist when it begana stopped peer's card lingers for its TTL; a peer that lost its seed retries, backing off to thirty seconds
The newcomer. The demo's set piece: a peer with a new service joins mid-session and is in the next plan within seconds, with nothing redeployed and nothing reconfigured. Discovery is the catalogue, and the catalogue is what the chair reads.

Start the fleet, open an inquiry, and while it runs start the search peer with --join-search. It dials the seed, its web-search card replicates within a card cadence, and the next inquiry's plan lists it: the dossier cites a web finding that did not exist when the session began. Nothing was redeployed and nothing was reconfigured, because the chair plans from live cards. The same mechanism covers the reverse: a stopped peer's card lingers for its TTL, and a peer that lost its seed retries its last endpoints, backing off to thirty seconds, so the launch order does not decide whether the fleet forms.

Where it is describedDiscovery and bootstrap and building up reliability in the architecture guide; the robustness rules a peer follows on a lost link are in ROBUSTNESS.md and the developer guide's peering chapter.
aspace://superfriends/frontends · chapter 9

Two front ends

THE ANALYST UI (graph peer, :7893)THE FLEET CONSOLE (planner, :7890)askopen inquiries, watch progressdossiersthe reports, renderedtimeline · entitieswhat the hall knowsgraph · querythe picture, Dataloga DataScript mirror in the browser, kept current over SSEopen-inquiry · approvethe commands, auditedask-halla graph query, as rowstake ledger · data mapwho holds what, what flows whereusage · wire trafficthree vendors; frames by kindthe library's console, read-only, with three commands added
Two front ends, two people. The analyst opens inquiries and reads the hall from the graph peer's own page; the operator watches the fleet and gates approvals from the console. Both are reads of replicated state, so neither needed a line of instrumentation in any service.

The analyst UI is a single-page ClojureScript app the graph peer serves itself (port 7893). It mirrors the peer's DataScript database into the browser, one full fetch and then every transaction over Server-Sent Events, and lets an analyst open inquiries like a chat, watch each one's progress service by service, read the dossiers, walk the timeline, the entities and the graph, and query the store in Datalog. Opening an inquiry or approving a decision is a plain space write from the page; the peer stays an asset peer with no agent and no console.

The fleet console on the planner (port 7890) is the library's read-only console with the demo's three commands added: open an inquiry, ask the hall (a graph query shown as rows), and approve, which is the human gate. Its standard panels are the take ledger, the data map, the cards, the usage panel with all three vendors, and the wire-traffic panel. Neither front end needed a line of instrumentation in any service: both are reads of replicated state.

Where it is describedThe developer guide's console chapter (FleetConsoleServer, TrafficPanel); the analyst UI's routes and build in graph/README.md.
aspace://superfriends/run · chapter 10

Levels, keys, and the test

LevelWhat is liveHow
0nothingscripted models on every peer, fixtures about two fictional tickers; the six-process fleet test runs here
1one vendorset one of XAI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY; that peer serves its real model, the others stay scripted and call it through the common room; with the xAI key, x-search asks X itself through Grok's live search and cites the posts
2all vendorsall three keys
3all vendors and dataplus the MCP servers' keys; the candidate servers are listed in PLAN.md section 7.3 and are verified before adoption
// agentspaces-example-apps/superfriends -- running it
./run-demo.sh                      # build, start six peers, run one inquiry, print the dossier, stop
./run-demo.sh --watch              # the same, then keep the fleet up: console at http://localhost:7890/
./run-demo.sh --join-search        # also start the late-joining web-search peer before the inquiry
./run-demo.sh --ticker NIMBUS --question "Is the CFO departure a reason to sell?"
XAI_API_KEY=... OPENAI_API_KEY=... ANTHROPIC_API_KEY=... ./run-demo.sh   # live, one key at a time is fine
mvn verify -pl fleet-test -Dsuperfriends.fleet=true                     # the six-process scenario test

The fleet test launches the six processes, waits for every card and both assets to be visible on every peer, runs an inquiry, and asserts each stage from the spaces: the expected count of findings with sources, the split tally, one fill for two executors, the position book, the dossier's sections, the ledger line; then a second inquiry that runs only the perishable services, and a search peer joined mid-session that the next plan includes. The dossier and the peer logs land under out/.

Where it is describedThe developer guide's testing chapter; the workflow guide's running, observing and testing; the Maven and Clojure build notes in the example's README and graph/README.md.
aspace://superfriends/code · chapter 11

The code, module by module

ModuleWhat it holdsRead it for
wire/the hall's records and the Hall constants; no dependenciesthe data every peer agrees on: spaces, tags, prefixes, service names
common/fixtures, the scripted model, tags, bids, the desk rendezvous, the asset client, the recall helpers, the cards helperthe shared pieces every peer reuses instead of rewriting
grok/the plain-Java peer: the fleet runtime, LangChain4j, three services, an analyst, Grok's live searcha peer built from the core API with no framework
gpt/the Spring Boot peer: four services, an analyst, the vector-store asset, a desk executorthe starter and Spring AI in use, including an asset served by configuration
claude/the Micronaut peer: four services, an analyst, a desk executor, MCP import and exportthe Micronaut processor and bridges; the outside door
planner/the chair, the decision desk, the position book, the ledger, the console commands; an Embabel variant under -Pembabelthe orchestration that is three annotations
search/the newcomer peer: one servicethe smallest possible peer
graph/the Clojure peer: the DataScript store, the asset, the analyst UIa member that is pure state; a front end over a replica
fleet-test/the six-process scenario test, the inquirer, the traffic auditshow a cross-framework fleet is tested, and measured

The contract is the thing to read before changing a peer: it fixes the ports, the twelve spaces and their strategies, the tags and leases, each service's exact output at level 0, the assets' queries, the chair's annotations and the desk's formation, so that six modules written against three frameworks produce one coherent hall.

aspace://superfriends/next · chapter 12

What to read next

What this example is notA trading system. The fixtures are fictional, the quorum proves agreement and nothing more, the paper trade is a record, and the vendors' answers at level 0 are scripted by request shape. It is a demonstration that a fleet of simple services on three frameworks and three vendors coordinates through shared, signed, leased memory with no broker, no orchestrator and no database in the middle. Some of PLAN.md is still only a plan: the inquiry budget and its budget-exhausted finding, an electorate narrowed to analyst cards, a reader for the usage space beyond the console's panel, the mcp-calls space (registered, used only when MCP import is on), and the MCP servers of section 7.3, which are candidates until verified.