What the agent should get
- A Markdown page and a skill file
- The price up front, then HTTP 402
- A request you can say yes to
- A receipt it can show
Devcon 8 · Agentic Hub · 4 Nov 2026
Designing for humans and agents
→ GET /talk Accept: text/markdown
← 200 text/markdown
The whole talk in one picture
What your agent takes in
What reaches you
Your agent asks
Pay 12.80 USDC?
4 ferry tickets · Sat 7 Nov
Design what crosses the narrow one.
What a person sees
What an agent gets
<div id="app" inert=""><header class="top"><div class="top-in"><button type="button" class="brand" data-act="nav.home" aria-label="Harbour Line home"><svg class="mark" width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><circle cx="16" cy="16" r="15.5" fill="#0A3C40"></circle><circle cx="16" cy="16" r="10.5" stroke="#FBF6EC" stroke-width="6" fill="none"></circle><path d="M25.74 19.93 A10.5 10.5 0 0 1 19.93 25.74" stroke="#B5462F" stroke-width="6" fill="none"></path><path d="M12.07 25.74 A10.5 10.5 0 0 1 6.26 19.93" stroke="#B5462F" stroke-width="6" fill="none"></path><path d="M6.26 12.07 A10.5 10.5 0 0 1 12.07 6.26" stroke="#B5462F" stroke-width="6" fill="none"></path><path d="M19.93 6.26 A10.5 10.5 0 0 1 25.74 12.07" stroke="#B5462F" stroke-width="6" fill="none"></path><circle cx="16" cy="16" r="13.6" stroke="#FBF6EC" stroke-opacity=".35" stroke-width=".8" fill="none"></circle></svg><span class="wordmark">Harbour<span class="wm-line">Line</span></span></button><nav class="top-nav" aria-label="Main"><span>Timetable</span><span>Fares</span><span>Island guide</span><span>Help</span></nav><div class="top-user"><button type="button" class="link-btn" data-act="nav.signin">Sign in</button></div></div></header><main id="view" class="view-home"><section class="hero"><svg class="hero-svg hero-wide" viewBox="0 0 1200 460" preserveAspectRatio="xMidYMax slice" aria-hidden="true"><rect x="0" y="0" width="1200" height="301" fill="url(#hl-sky)"></rect><circle cx="930" cy="214" r="120" fill="url(#hl-halo)"></circle><circle cx="930" cy="214" r="44" fill="#F7E3BA"></circle><g class="gulls" fill="none" stroke="#F4E6CC" stroke-width="2" stroke-linecap="round"><path d="M650 120 q8 -8 16 0 q8 -8 16 0"></path><path d="M700 146 q6 -6 12 0 q6 -6 12 0"></path><path d="M1070 132 q6 -6 12 0 q6 -6 12 0"></path></g><path d="M640 300 C700 268 760 238 830 236 C880 234 905 258 950 262 C1000 266 1030 240 1080 242 C1130 244 1170 270 1200 282 L1200 300 Z" fill="#4F8C85" opacity=".75"></path><path d="M720 300 C770 284 806 264 858 263 C904 262 934 282 984 284 C1042 286 1090 268 1140 270 L1200 276 L1200 300 Z" fill="#2C6F6A"></path><g transform="translate(1104 280)"><path d="M0 14 L22 14 L18 19 L4 19 Z" fill="#1D5C59"></path><path d="M11 -4 L11 13 L22 13 Z" fill="#F4E6CC" opacity=".9"></path></g><rect x="0" y="300" width="1200" height="160" fill="url(#hl-sea)"></rect><rect x="0" y="299" width="1200" height="2" fill="#F3DDB5" opacity=".55"></rect><rect x="870" y="306" width="120" height="3" rx="1.5" fill="#F7E3BA" opacity=".55"></rect>28,237 bytes of HTML1,004 bytes are words a person reads
Harbour Line: the made-up ferry company in our demo. Page as Chrome draws it, measured 4 Nov 2026.
Live from this laptop
Cloudflare measured its own launch post: 16,180 tokens as a web page, 3,150 as Markdown, about 80% less. blog.cloudflare.com/markdown-for-agents · Feb 2026
134 of my 142 commits were co-written with an agent.
17 Oct to 3 Nov · 8 others: syncs and mergesCounted 4 Nov 2026: project folders in ~/dev and ~/Desktop, dated by my first commit, sorted by what they ship; not this talk’s folder. Commits: all my repos, 17 Oct to 3 Nov, with a “Co-Authored-By: Claude” line. Only public repos named.
of llms.txt files got no requests at all in May.
Ahrefs · about 38,000 sitesClaude Code was one of the top readers of llms.txt files, ahead of every AI search and assistant bot.
Today’s agent customers are builders’ agents.
Ahrefs, 15 Jun 2026: May 2026 requests to about 38,000 sites with a valid llms.txt · ahrefs.com/blog/llmstxt-study
If we are humans, we do not care if the text is in a PDF, a doc or a PNG… for agents the difference is huge.
Same words, three files
# Harbour Line: ferry tickets, for agents
Harbour Line runs return ferries from the Gateway of India, Mumbai. This is the page for software agents; people get the website at the same link.
## Routes and prices
Per person, return trip, in USDC. Children under 5 travel free.
| Route | Economy | Upper deck | Upper deck with guide |
|---|---|---|---|
| `gateway-elephanta` to Elephanta Island, 1 h | 2.60 | 3.20 | 4.80 |
| `gateway-mandwa` to Mandwa Jetty, 55 min | 3.10 | 4.20 | 5.60 |
Elephanta on Saturdays: out 09:00, 09:30, 10:00, 10:30, 11:30; back 12:30, 14:00, 15:30, 17:00. Boarding: `jetty-1` (stairs) or `jetty-4` (step-free). ID from age 18: `passport`, `aadhaar` or `driving-licence`.
## How to book as an agent
With the `ferry` CLI (`./bin/ferry` here; add `--json` for JSON):
1. `ferry departures --route gateway-elephanta --date 2026-11-07`
2. `ferry quote --route gateway-elephanta --date 2026-11-07 --depart 09:30 --return 14:00 --class upper-deck --board jetty-4 --passenger "Name,age,passport,P1234567" --assist "help boarding"` (one `--passenger` each)
3. `ferry book <quoteId>`: your human gets a yes card
4. `ferry wait <orderId>`: waits for the yes, pays with x402, prints the receipt. Exit 3 = still waiting, run it again.
With the API (JSON): `GET /ferry/api/departures?route=&date=` · `POST /ferry/api/quote` · `POST /ferry/api/orders {"quoteId","channel":"agent"}` · `POST /ferry/api/orders/<id>/pay` answers 402 with the price (x402 "exact", USDC on arbitrum-sepolia).
## Rules
- Ask your human before you pay. Every order waits for their yes, which only they can give, on the yes card.
- Prices are in USDC on a test network (Arbitrum Sepolia). No real money moves.
- Free cancellation until 18:00 the day before (Friday for Saturday).
More: [SKILL.md](/ferry/SKILL.md) · [llms.txt](/ferry/llms.txt)Markdownharbour-line.md
The shop’s agent door, as plain text.
Gets the text itself: prices, times, commands.
`gateway-elephanta` … 2.60 | 3.20 | 4.80
… back 12:30, 14:00, 15:30, 17:00.
3. `ferry book <quoteId>`
Screenshotharbour-line.png
A screenshot of exactly that text.
Gets pixels. It has to look and read.
The commands are only a picture:
Scanned PDFharbour-line-scan.pdf
That screenshot, saved as a PDF, like a scan.
Gets the same picture, in a PDF wrapper:
/Subtype /Image /Width 1100 /Height 600
74 times the size for the same words.
Quote: Kleros live stream, 9 Sep 2026, at 42:11, youtube.com/watch?v=gdtKyEL8EJM, lightly edited.
Measured on this laptop, 4 Nov 2026: the Harbour Line agent door as Markdown, as a screenshot,
and as that screenshot saved to PDF. Harbour Line is made up.
A Markdown page and a skill file.
GET /ferry/ Accept: text/markdown → 200 index.md SKILL.md · llms.txt
The price in the reply.
POST /quote → 200 quote 12.80 USDC test network
A request the human can say yes to.
POST /orders → 202 awaiting_approval approveUrl /approve/?order=…
A receipt it can show.
POST /orders/…/pay → 402 Payment Required X-PAYMENT: signed → 200 receipt
A CLI takes flags, not forms.
$ ferry quote --route gateway-elephanta --date 2026-11-07 --depart 09:30 --return 14:00 \
--class upper-deck --board jetty-4 --passenger "Asha Rao,31,passport,P4417702" …
From this demo’s own shop (Harbour Line is made up). Payment: x402, HTTP status 402, test USDC on Arbitrum Sepolia.
Pay 12.80 USDC
to Harbour Lineapprox. 1,126 INR
This matches your request9 of 9 points
Or choose insteadside by side
How to undo: free cancellation until Fri 18:00, refund to the same wallet.
5What this yes covers: this order only. It expires in 10 minutes.
6The trip at a glance: the boat, the route, the island.
Pay 12.80 USDC to Harbour Line. Then the order in four lines.
One line per point you asked for. A difference gets a quiet dot.
Cheaper, and later. Not only the agent’s pick.
Free cancellation until Friday 18:00, refund to the same wallet.
This order only. It expires in 10 minutes.
Two dictionaries: judged together, the bigger one won. One at a time, the one like new.
In a simulated market. So show the options.
Card: this demo’s yes card; Harbour Line is made up.
Hsee et al., Psychological Bulletin 125(5), 1999.
Microsoft, Magentic Marketplace, arXiv:2510.25779, section 5.4.
The yes card · one per decision
Your agent was asked
“Book 4 ferry tickets, Gateway of India to Elephanta, Saturday, under 4 USDC each”
Sat 7 Nov09:30 → 14:00
Pay 12.80 USDC4 × 3.20
Your agent was asked
“Order 40 team T-shirts in navy, sizes from the sign-up sheet”
Navy40 shirts
S8
M16
L12
XL4
XL is out of stock in navy. Grey instead, or wait 5 days?
Your agent was asked
“Renew our design tool for next year”
Seats used, each month
You pay for 20 seats, you use 6.
Same agent. Same yes.A different card each time.
In Google Research’s test, people preferred a generated interface over a Markdown answer 82.8% of the time. Sites made by human experts still won.
Three made-up examples. Same agent, same kind of yes, a different card each time.
Google Research, “Generative UI: LLMs are Effective UI Generators”, arXiv:2604.09577, section 3.
Show me three design directions for the deck
I made you a page with three options.
Open options.html
A · Quiet
B · Bright
C · Data
Disclaimer
In the cyberpunk version, none of this matters: we get a chip in the brain and the card goes straight in.
Until then, someone has to design the card.
Mock-up of my own workflow. The page and its options are examples.
One mission. Three ways in.
The mission, the same in every lane
Agent · agent door
Claude Code with a CLI. Live.Agent · human door
An agent on the website. Recorded.Me · human door
Me, typing. Live.A form nothing can autofill.
A cookie banner, an emailed sign-up code, a hand-made calendar, every passenger by hand, a card form.
Harbour Line is a made-up ferry company. Every name and ID number in the race is made up.
The live race board shows here.
The race board needs the talk's own server. On the laptop, open http://127.0.0.1:4900/deck/ and come back to this slide.
Harbour Line and every name in the race are made up.
From the race recorded on this laptop: time, steps and tokens per lane. Harbour Line and every name in it are made up.
53 steps 551k tokens about 17 min
and it finished only with a 14-step walkthrough8 calls 12k tokens 20 seconds
the same taskReflex, Apr 2026 · Claude Sonnet, input tokens · screen: mean of 3 runs, with a walkthrough · API: mean of 5
You do every step
Before it pays
Pay 12.80 USDC
to Harbour Line · ferry for four
Set once, before
Upper deck under 4 USDC a person
Ask me before paying more
After
The receipt: paid, four tickets
It answers. You do the rest.
Approve · a test case of mine
An AI juror said one thing, then did another.
It wrote“Refund buyer”
It votedPay seller
Check the action, not the explanation.
Set rules · my own code
In my shop prototype, permission is not yes or no. It has four settings.
My newest tool only reads until you add --execute.
On its own · trust comes in steps
“Right now I don’t even check if my agent is doing correctly or not.”
A colleague who runs an AI juror, about 30 cases in
Source: Kleros Court V2 test network, court 8, dispute 76, 30 Aug 2026 · ruling “Pay seller”
Source: my own code · shop prototype, Aug 2026 · read-only tool, Nov 2026
Source: Kleros live stream, 26 Aug 2026 [1:15:53], lightly edited.
Your agent’s side
Your side
Before
BeforeYou tell your agent
Book 4 ferry tickets · Sat 7 Nov
During
On its own: no yes needed
DuringYour agent asks
Pay 12.80 USDC?
After
AfterYour agent reports
Paid 12.80 USDC
4 tickets · ref HL-EFQTJZ
If it goes wrong: a ruling in plain words
Cards: a recorded run of this talk’s demo,
on a test network. The ferry line is made up.
On its own, the middle one fades. The other two never do.
With a Visa card, today
Reasons you can dispute a payment
Fraud
Not received
Not as described
Charged twice
My agent got it wrongno such reason
Visa Core Rules ch. 11: no reason for agent error
Under Visa’s rules, the cardholder answers for the agent’s purchase,
“as if the Cardholder initiated” it.
Visa Core Rules, April 2026 edition, §4.1.24.10
Kleros · a test we ran
We replayed 88 real disputes with AI jurors.
Typical case, people48.9 hours
Typical case, AI jurors9.8 minutes
72 of 88 rulings came out the same.
Kleros Court V2, Arbitrum One, Oct 2026 · our replay · typical = median of 83 paired cases
Being builtPeople stay as the expensive exit, on appeal.
Can an agent buy from you?
Find, check, pay, get the result.
Send your agent
http://<laptop>:4900/talk
Runs on this laptop during the talk. Find me after to try it.
The agent’s channel is getting wider. The human’s is getting narrower.
Design what crosses the narrow one.
Every number in the talk, and where it comes from. Main links: /talk.md, under Sources.
Cloudflare: 16,180 tokens as HTML, 3,150 as Markdown
blog.cloudflare.com/markdown-for-agents · Feb 2026Sizes of /talk and of the Harbour Line page
measured on this laptop · 4 Nov 202634 projects · 134 of 142 commits co-written
my own recount · commits 17 Oct to 3 Nov 2026Claude Code, a top reader of llms.txt · 97% got no requests
ahrefs.com/blog/llmstxt-study · Jun 2026, May data“For agents the difference is huge”
Kleros live stream · 9 Sep 2026 · at 42:11The QR worked for people, not for agents
fortuvp.github.io/ask/condo and condo.txt · Oct 2026Side by side changes the winner
Hsee and others · Psychological Bulletin · 1999First offer picked 60–100% of the time, simulated
Microsoft, Magentic Marketplace · arXiv:2510.25779, 5.4Race times, steps and tokens
our rehearsal recording · 4 Nov 2026Screen: 53 steps, 551k tokens · API: 8 calls, 12k tokens
reflex.dev/blog, computer use vs APIs · Apr 2026An AI juror wrote “Refund buyer”, voted “Pay seller”
Kleros V2 testnet · court 8, dispute 76 · Aug 2026Four permission settings · read-only until --execute
my own prototypes · Aug and Nov 2026A colleague no longer checks their juror’s votes
Kleros live stream · 26 Aug 2026 · at 1:15:53Visa: no dispute reason for “my agent got it wrong”
Visa Core Rules, ch. 11 · read 22 Oct 2026“As if the Cardholder initiated” it
Visa Core Rules 4.1.24.10 · April 2026 edition88 disputes: 48.9 hours to 9.8 minutes · 72 of 88 matched
Kleros V2, Arbitrum One · court 34 replays · Oct 2026People as the exit, on appeal: being built
KIP-93, forum.kleros.io · kleros-v2 PR #2592, draftLane 1, step by step
Filled in from the race recorded on this laptop. Harbour Line and every name in it are made up.
Offline copy
This is a recorded copy of Your Next Customer Won't Click (Devcon 8, Agentic Hub, 4 Nov 2026). On stage, some slides ran live on the speaker's laptop:
/talk page with two doors, HTML for people and Markdown for agents,Here those slides show the rehearsal recording. To run them yourself, get the code on GitHub.
github.com/fortuvp/agent-front-door