Agent Native Builders Hackathon · Cloudflare SF

Surf, Bike or Skate

rock, paper, scissors — and the weather throws too

Enter

The decision

Three hours before a 3 PM meeting. Surf, bike, or skate?

Illustrated infographic titled "Surf, Bike or Skate? Eight agents. Three hours. One fleet decides." Three cards sit over a map of San Francisco: the Surf Agent, scoring 87 for Ocean Beach, with 3.8 feet at 14 seconds, light offshore wind, a 27 minute drive, 108 minutes in the water, and 93 percent odds of getting back by 3 PM; the Bike Agent, scoring 81 for Mount Tamalpais, with a 34 minute drive, a 1,420 foot climb, a 94 minute ride, and a scenic route; and the Skate Agent, scoring 74 for Potrero del Sol, with a 12 minute drive, dry pavement at 66 degrees, a 138 minute skate, and 97 percent odds of getting back. A coordinator panel reads: today's call is surf at Ocean Beach, leave at 12:30 PM, meeting at 3:00 PM, confidence 93 percent. A van carrying a surfboard drives the winding route from Ocean Beach past Mount Tamalpais to Potrero del Sol.
The whole decision in one picture: what each agent found, and the call the coordinator made from it. These are the same numbers as the recorded 26 August 2026 run below — the illustration re-draws that run, it does not invent a second one.

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.

This is the same 288-frame run replaying live from the committed choreography file, not a video — the fleet above ran it once, and this is that run. Open the interactive version for the scrubber and full controls.
The answer the eight agents settled on: surf at Ocean Beach, score 87, leaving at 19:30Z, 27 minutes of driving, 108 usable minutes, 0.93 return confidence, with bike at 81 as the runner-up. the answer, at +1004 ms surf SCORE 87 destination Ocean Beach leaveAt 2026-08-26T19:30:00Z travelMinutes 27 usableMinutes 108 returnConfidence 0.93 runner-up bike, score 81
As published. leaveAt is 19:30 UTC — 12:30 PM in San Francisco. returnConfidence is the odds of making the 3 PM.

Before the fleet

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

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.

Ink-and-wash illustration of a rider on a mountain bike on a fire road above the Pacific, with San Francisco visible across the water.
Old Railroad Grade above Mount Tamalpais, 34 minutes from the door. Scored 81, lost to the water by six.

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.

The coordinator at the centre with seven agents around it, each labelled with how long it took to answer: calendar 5 milliseconds, conditions and mobility 7, skate 94, surf 390, stay 705, bike 1000. calendar +5ms conditions +7ms mobility +7ms skate +94ms surf +390ms stay +705ms bike +1000ms #coord coordinator asks, then picks
One question out, seven answers back, all on the same shared channel rather than private calls. Times are how long each agent took.
Surf
Skate
Bike
The map

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

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.

A timeline of all twelve messages over 1006 milliseconds. Ticks sit at their true times, so the four opening messages bunch at the top and the two moments the coordinator changed its answer, at 96 and 391 milliseconds, sit 295 milliseconds apart. +0ms +5ms +7ms +7ms +94ms +96ms +390ms +391ms +705ms +1000ms +1004ms +1006ms coordinator asks all seven agents calendar: free window 12:30 to 3 PM mobility: 12 / 27 / 34 min driving conditions: swell 3.8 ft at 14 s skate scores 74 surf scores 87 stay scores 55 bike scores 81, answer holds coordinator: final answer is surf coordinator tells everyone, done coordinator: answer is now skate coordinator: answer is now surf skate leads for 295 ms
Ticks sit at their true times, which is why messages pile up top and bottom. The gold stretch is the 295 ms during which skate was the answer.

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.

3.8-foot faces, 14-second period, light offshore, 108 minutes to use them.

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:

The tabletop map before anything happens, agents standing at their home positions. 01 · waiting
The agents turning toward one another as they find each other on the map. 02 · discovery
Work being handed out from the coordinator to the specialists. 03 · delegation
Agents placing their evidence on the map at the spots they are arguing for. 04 · evidence
The surf and skate agents apart on the map, arguing for different destinations. 05 · disagreement
The fleet settled on one destination at the end of the run. 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.

Illustrated poster titled the fleet: eight numbered agent cards across the top, above a painted Bay Area map where the surf, bike, and skate agents stand pinned at Ocean Beach, Mount Tamalpais, and Potrero del Sol with scores 87, 81, and 74, a van's route linking the three pins, and the day's call in the bottom-left corner.
Every score, drive time and clock reading on this poster is a figure the agents actually published in the run above; several of them reappear verbatim in the message log in Receipts, just below. The calendar, weather and traffic inputs behind those figures are checked-in test data, not a live feed.

For agents

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

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

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

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

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.