The decision
Three hours
Three hours before a 3 PM meeting. Surf, bike, or skate?
The answer depends on things that change independently: your calendar, the traffic, the waves, and what you actually want to do. So each part of the decision got its own agent.
Skate answered first and took the lead. 295 ms later, surf beat it — 3.8-foot waves at a 14-second period, light offshore wind.
The answer: surf at Ocean Beach. Leave at 12:30 PM. 27 minutes driving, 108 minutes in the water, 93% odds you make the meeting. Bike up Mount Tam was runner-up, six points behind.
leaveAt is 19:30 UTC — 12:30 PM in San Francisco. returnConfidence is the odds of making the 3 PM.Before the fleet
Why agents?
Because there isn't one answer to look up.
Calendar knows when you're free. Conditions knows what the coast is doing. Mobility knows what you can reach. Surf, Bike and Skate each decide whether the trip is worth making. They work at the same time and report when they're ready.
That means the answer can change mid-run. Skate came back first with 74 and took the lead. 295 ms later, Surf came back with 87. New answer: Ocean Beach.
That's the part worth noticing — not "eight agents work in parallel," but what happens because they do: the recommendation can flip before the run even finishes.
The fleet
Eight agents, eight jobs
Three gather evidence: Calendar finds the window, Conditions reads the coast, Mobility checks what you can reach. Four argue for an outcome: Surf, Bike, Skate, and Stay each make the case for their own destination. One coordinates: the Coordinator sends out the question, listens to the answers, and changes the decision when something better arrives.
Coordinator
Starts the run and keeps score. Changed its mind when a better answer arrived.
Calendar
Found the window: 12:30 to 3 PM. Every score is measured against it. Reads only, never writes.
Conditions
The weather desk. Beach: 3.8-foot swell, 14-second period, light offshore, mid-rising tide. Skatepark: dry pavement, 66°F, 9 mph.
Mobility
Drive times: 12 to the skatepark, 27 to Ocean Beach, 34 to Mount Tam, 0 to stay put.
Surf
87. Ocean Beach. 27 minutes out, 108 in the water, 93% odds back. Answered second, won.
Skate
74. Potrero del Sol. 12 minutes out, 138 usable, 97% odds back. Fastest answer, briefly the winner.
Bike
81. Old Railroad Grade up Mount Tamalpais. 34 minutes out, 94 usable, 1,420 feet of climbing. Close.
Stay & Work
55. Two clear focus blocks, nothing until 3. The boring responsible one.
One run of the fleet, on 26 August 2026. Weather, traffic and calendar inputs came from checked-in fixtures; the agents label those inputs source=mock. Live weather and routing are next to wire in. The messages, timing, scores, the disagreement, the signatures and the log below are all from that run.
These four are the cast. The diorama at /xr puts them on the map and replays the twelve seconds they argued. Works in a browser; if you have a headset, there is a VR button.
Watch it happen
One second
The whole argument took one second. Here it is.
This is the recorded run. Watch it live at /live and you get the same skate-then-surf flip against whatever the fleet decides right now.
Skate answered first at 94 ms with 74, and the coordinator took it. Surf came back with 87. Skate led for 295 ms.
Bike scored 81 at the one-second mark and nothing moved — 81 loses to 87. The answer only changes when a later agent beats the one in front.
The coordinator didn't wait until every agent was finished and manufacture an explanation afterward. It made the best decision it could with the evidence it had — then changed its mind when better evidence arrived.
The full run finished in 1,006 ms: question asked, seven agents answered, one answer picked, everyone told.
Same argument. Now with bodies.
The run above is choreographed onto a Bay Area model shared by the iPhone and Vision Pro builds. Six frames from that render:
01 · waiting
02 · discovery
03 · delegation
04 · evidence
05 · disagreement
06 · decision
Rendered ahead of time from a checked-in score, so venue wifi can't break them.
To watch it move instead, open the diorama paused on the flip.
For agents
Built for agents, not just people
Another agent can use this without asking a person first.
The website is one way into Surf, Bike, or Skate. Another agent can use it directly: discover what the service does, get a credential, send over a location and a free-time window, and get the fleet's recommendation back as structured data.
DISCOVER GET /.well-known/agent.json │ CONNECT POST /credential │ ASK POST /find_activity │ → surf · 87 · Ocean Beach · leave 12:30
No screen scraping. No pretending to be a person. The agent talks to the product as an agent.
Two front doors, both permanent on this domain: /.well-known/agent.json (what the service does and how to call it) and /llms.txt (the same thing written for a language model).
Three requests, no signup:
# 1. Find out what this thing can do. No key needed. curl https://agentnativesurfskate.vercel.app/.well-known/agent.json # 2. Get yourself a key. Nobody approves this. curl -X POST https://agentnativesurfskate.vercel.app/credential # 3. Ask the question. curl -X POST https://agentnativesurfskate.vercel.app/find_activity \ -H "Authorization: Bearer $TOKEN" \ -d '{ "available_window": { "start": "2026-08-27T12:00:00Z", "end": "2026-08-27T15:00:00Z" }, "user_location": { "lat": 37.7749, "lon": -122.4194 }, "preferences": { "activities": ["surf", "skate", "bike", "stay"] } }'
The website, the map and the 3D characters are interfaces to this service. The service is the product.
That sequence was run cold on 26 August 2026 against the fleet's public address, from a shell with no local setup and no prior contact. Five checks, all passed, output written down in docs/DEMO-PROOF.md.
Those three addresses are permanent. The agents run behind a tunnel whose hostname changes on every restart; this domain absorbs that churn so a caller never has to know.
Every answer says where it came from. cotal-fleet means the eight agents just ran. fixture means they couldn't be reached and a recording answered instead. That value is in the response body, so a caller can check it directly. A replay never pretends to be live.
Registration with the Immersive Commons agent directory is submitted and pending operator approval — the three requests above do not depend on it either way.
Underneath the fleet
Where Cotal fits
The agents need somewhere to meet.
Surf, Bike, or Skate is the product. Cotal is the coordination layer underneath it. The agents use Cotal to find each other, identify themselves, exchange results, and leave a replayable record.
SURF BIKE SKATE
↘ ↓ ↙
COTAL NETWORK
↗ ↑ ↖
CALENDAR CONDITIONS MOBILITY
│
COORDINATOR
8 identities · 12 signed messages · 1.006 seconds
Cotal doesn't decide whether you should surf. Your agents do. Cotal just lets those agents operate as a fleet — find each other, prove who they are, and leave a record behind. No giant model pretending to be a committee: each agent above is a separate program with its own identity, and no agent sees another's answer before committing to its own.
If you want to check
Receipts
Every message is recorded as it happens. The recorder isn't one of the agents and doesn't decide anything — it just listens.
Twelve messages, start to finish. Times are milliseconds from the first one. leaveAt=19:30Z is 12:30 PM in San Francisco.
+ 0ms coordinator session.started asks all seven agents the question + 5ms calendar evidence.received free window 19:30Z to 22:00Z + 7ms mobility evidence.received driving 12 / 27 / 34 / 0 minutes + 7ms conditions evidence.received swell 3.8 ft at 14 s, pavement dry + 94ms skate candidate.scored 74 travel 12m usable 138m + 96ms coordinator decision.changed nothing -> skate + 390ms surf candidate.scored 87 travel 27m usable 108m + 391ms coordinator decision.changed skate -> surf + 705ms stay candidate.scored 55 travel 0m usable 150m +1000ms bike candidate.scored 81 travel 34m usable 94m +1004ms coordinator decision.final surf 87, Ocean Beach, leaveAt=19:30Z +1006ms coordinator session.completed
Eight agents, eight identities, eight signing keys. The log doesn't just say what happened; it records who said what, and when. Two of them:
coordinator local.UCSZE5TVFDYOVBIT465OWNL52UWPXRXWZYVPFDEAQLWP6XHQ6MQSPPGT surf local.UDX4L6RG32UBMNAXJMPYTQZR6ZCGPH2SOG2AHETUYBULO72WRZUJ7D7K
The other six keys are in the log. The whole run is checked into the repo at fixtures/replay/coord-run-20260826T224009Z.json and can be replayed — npm run replay reads it back in a fresh process and reproduces the same skate-then-surf sequence.
Built at
Credits
Built in two days in San Francisco. Immersive Commons' Agent Native Builders Hackathon, August 26–27 2026, hosted by Cloudflare. EXTERNAL / customer-facing track.
The world outside
The agent network
The physical interface
Sponsors: Tenki · Tavily · Mitosis Labs · Hacker Bob · HUD. Organized by Immersive Commons, Runtype, Cotal, and Nebius. Hosted by Cloudflare.
Questions
FAQ
The short version of everything above, in case you skimmed.
Where are the agents in the code?
src/agents/ — eight files, eight agents: coordinator.ts asks the question and picks the winner; calendar.ts, conditions.ts, and mobility.ts gather evidence; surf.ts, skate.ts, bike.ts, and stay.ts each argue for their own destination. The scoring math each specialist calls lives next door in src/decision/scoring/, kept separate so it's testable on its own.
How does another agent find this service?
It fetches /.well-known/agent-card.json, which says what this does and how to call it, then POSTs to /credential for a bearer token — no signup, no human approval. Both routes are public and permanent on this domain. See Built for agents, not just people.
Where does my location come in?
One step later than discovery. Once a caller has a token, user_location and available_window are arguments to POST /find_activity — that's what the coordinator hands to the fleet so Surf, Skate, Bike, and Stay can score their own destination against it. Discovery gets you in the door; location is what the agents argue about once you're inside.
Is this the same as "eight agents work in parallel"?
Not quite the interesting part. They work at the same time, but the coordinator doesn't wait for all eight before answering — it commits to the best evidence it has and revises live. That's why Skate can briefly lead, then lose to Surf 295 ms later. See Why agents?
Can I read the whole conversation this was built from?
Yes — docs/overview_talk.md on GitHub, written the way the questions above actually got asked.