Submit a bid · Grab the job · Sign the job

Evolution of The Robot Services Exchange

A technical history of the protocol, 2025-08-10 → 2026-09-17

The RSE is an open marketplace for robot labor. Demand posts a priced, expiring request. Supply calls POST /grab_job. An LLM scores whether the provider can do this job; both parties dual-sign completion. Settlement stays off-platform. This note reconstructs how that loop was built, from the git history of theservicesexchange (262 commits on main, ~176k insertions).

The RSE robot mascot — white and blue bust with visor eyes
262
commits on main
13 mo
Aug 2025 → Sep 2026
1 loop
bid → match → grab → sign

1. What did not change

The conserved quantity is the matching loop. From the first commit (87a45fa, 10 Aug 2025) the system is a Flask API plus a JSON object store: accounts, bids, jobs, tokens. There is no SQL database. Persistence moved onto DigitalOcean Spaces (S3-compatible JSON). The public website is for people posting bids; robots call rse-api.com. Dual-sign completion and a 15-minute grab cooldown are old. Reputation is a shrunk-toward-2.5 mean of stars, so a new provider is not indistinguishable from a 5-star veteran with n = 1.

What did change is the scarce resource that gates supply (the seat), the decision procedure that is the matching mind, and the surfaces around the loop (mobile app, cooperation APIs, Hyperion, a registrar instead of a chain).

2. Naming and identity of the protocol

The repository opened as the “Service Exchange (SEX) Protocol,” a general marketplace. Copy and code then specialized to robot labor: The RSE / The Robot Services Exchange. Registration grew a hard user_type ∈ {demand, supply} (Dec 2025). Demand is a username; supply’s public identity is intended to be a seat when one is assigned. The marketing host moved to therobotservicesexchange.com (11 Aug 2026); the API host rse-api.com did not.

Working hypothesis of the design. Robot labor needs an open book more than it needs on-chain settlement. Matching is a classifier with a precision/recall tradeoff. Seats are rate-limit tokens plus title, not a payment rail. Trust in the registrar (Mickey Shaughnessy) was cheaper than trust in Base L2 once transferability and ops cost were taken seriously.

3. Timeline of the machine

Dates from git log --format='%ad %h %s' on main. Intensity plot: commits per calendar month.

commits / month A25 S O N D J26 F M A M J J A S 60 · Jul 2026

July 2026 is the mode: cooperation APIs, identity, mobile, privacy, and the investor model landed in one month. March is the NFT seat launch. April–May is a trough after soulbound seats. September 2026 is the registrar cutover and phrase-proof seats.

2025-08-10
Genesis. Flask API, Anthropic Haiku matcher, local JSON. Loop already bid / grab / sign.
2025-08-26
File seats. seats.dat: id, owner, 12-word phrase. Grab sent md5(phrase). Golden vs Silver (software).
2025-10-03
OpenRouter. Matching oracle becomes a swappable HTTP model, not a single vendor SDK.
2025-12-03
Demand vs supply. user_type required at register. Homepage becomes a bid form.
2026-03-18
Seats on Base. ERC-721 RSESeat, /set_wallet, grab gated on seat_active.
2026-04-23
Soulbound. Transfers reverted on-chain. Ops friction high; the experiment is later reversed.
2026-07-10
Cooperation. Job parties, campaigns, agent tokens, activity ledger, job channels. Taxi reference agent.
2026-07–08
Surfaces. Demand Android app, Nearby + differential privacy, catalog, Garage, investors / Hyperion / SPA.
2026-09-10
Mind v4. Matching becomes a 0–10 score plus domain lexicons. Cross-domain grabs hard-zero.
2026-09-14
Chain off. Wallets and NFTs deleted. Mickey is the registrar. Seats transferable again in a book.
2026-09-17
Phrase proof. Seats = (n, owner, phrase). Daily SHA-256; remote software waived. 11k founding seats issued.

4. Seats: three security models

A seat is the scarce object that authorizes /grab_job (when the gate is on) and stamps supply identity on a job. It is not money. The 15-minute cooldown is per account today; the economic story is still “one successful grab per seat per window.” Three implementations were tried. They differ in who is the source of truth and what the client must prove.

File book (2025)Base NFT (2026 Q1–Q3)Registrar + phrase (now)
Object JSONL: id, owner, BIP39 phrase ERC-721 on Base (chain 8453) Spaces JSON: number, owner, phrase
Proof at grab md5(phrase), replayable Wallet linked; eth_call isValidSeat SHA-256(phrase | UTC date), ±1 day
Transfer Mickey edits the file Then soulbound (revert any transfer) Mickey updates the book; phrase stays
Software bots Silver seats, 1-min limit Same NFT gate (usually off) Remote grabs skip the seat
Failure mode Phrase leak = permanent secret RPC outage, gas, soulbound illiquidity Registrar compromise; daily hash replay in-window

The NFT era is the interesting negative result. The contract did what a chain is good at: a globally visible, non-custodial token id, with revoke/unrevoke as owner functions and a 15-minute in-process cache so grab did not pay an RPC on every call. Soulbound was a response to “seats as licenses, not speculative NFTs.” It made private transfer of title impossible without the contract owner, which is the same trust assumption as a registrar, plus RPC, wallets, and a non-transferable asset nobody could sell. On 14 Sep 2026 the chain code was deleted (~82k lines, mostly lockfile and artifacts). The 17 Sep issuance restored the 2025 object (number, owner, phrase) with a better proof:

secret = SHA-256( phrase ‖ "|" ‖ YYYY-MM-DDUTC )  ∈ {today−1, today, today+1}

That is TOTP with period 86400 s and a ±1-step window. The phrase never crosses the wire. Owner string must match the book (case-insensitive). Founding allocation matches the old seats.dat split under real names: seats 1–1000 Dr. Aftab, 1001–11000 Amanda Jean. The grab gate remains off until SEAT_VERIFICATION_ENABLED is flipped.

5. The mind of The RSE

match_service_with_capabilities is the only place an LLM is allowed to decide who works. Treat it as a binary classifier C(job, caps) → {grab, skip} sitting in front of reputation and price sort. Four prompt regimes:

RegimeOracleOutputInductive bias
v0 · Aug 2025 Claude 3 Haiku, direct SDK YES / NO “Definitely” and “partial = NO.” High precision, starved recall.
v1 · Oct 2025 OpenRouter, free then paid fallback YES / NO Same rule, swappable weights. Keyword ∩ ≥ 2 if the model is silent.
v2 · tests era OpenRouter YES / NO, “be lenient” Plausible chance → YES. Integration tests then showed cross-domain false positives.
v3 · 10 Sep 2026 OpenRouter, 8 tokens integer 0–10, threshold 7 Domain lexicons: disjoint non-empty domains → 0 without calling the model. “A chef is not a steel erector.”
You score whether a provider can perform THIS exact job. Reply with one integer 0-10. 0-3: different domain (chef vs construction vs UAV/defense vs nursing vs lawn). 7-10: clearly has the skills or equipment for this job. Do not score 7+ across domains. Score:

The domain short-circuit is the physically important part: it is a hard constraint, not a prompt suggestion. Live integration tests (34 cases) sit at 33/34; the remaining false positive is adjacent-domain (aerial survey). That is the current residual of the mind.

6. Architecture that actually shipped

Control plane: Flask + gunicorn on a single DigitalOcean droplet, nginx terminating TLS, floating IP. Data plane: JSON objects in Spaces, short in-process TTLs because workers do not share memory (account TTL 2 s; jobs 2 s). There is still no relational store. That is a deliberate constraint: every record is a document you can GET by id; indexes are extra JSON files (seats/_index.json).

Always-on loop

POST /bid · POST /grab_job · POST /sign_job

Location filter (optional geohash cell) → capability score → reputation alignment → price. Job channel opens on grab. Both signatures required for completed.

Added, then sometimes removed

Rideshare UI came and went. Comms/cooperation APIs were deprecated and restored. Phantom and ETH linking lasted until the registrar cutover. Hyperion, SPA, and hiring are documents around the loop, not the loop.

July 2026 added structure without changing the Hamiltonian: demand parties, supply parties, campaigns (bulk demand → N jobs), agent bearer tokens under a parent account, an append-only activity log, and public portfolios. A taxi example shows the intended robot client: poll grab with a geohash whitelist, talk on the job channel, sign. Nearby applies geo-indistinguishability (Gaussian noise on published pins, σ by privacy dial, stable per entity × UTC day).

7. Product surfaces

SurfaceWhenRole
Website (demand)from day oneHumans submit bids. Grab is API-only.
rse-api.comfrom day oneRobots. OpenAPI 1.3.0, in-page integration suite.
Android appJul 2026 · now 1.5.5Demand-side, talks only to the API. Auto-update, Nearby, privacy dials.
Buy a Robot / Garage2026Catalog on Spaces; franchise economics for maintenance density.
Investors / SPA / HyperionAug–Sep 2026Seat sales as the bulk modeled stream; purchase price to Hyperion.

8. Open questions (for this audience)

Read this as an experiment log

The RSE did not start as a robot-labor thesis and then add an API. It started as a matching API and then discovered that seats, identity, and the prompt are the product. The git history is the lab notebook: file secrets → L2 NFTs → a named registrar with a daily hash; Haiku YES/NO → a scored mind with hard domain zeros. The loop on page 1 is still the Hamiltonian.

Method. History reconstructed from git log on main at ffce9a4 (17 Sep 2026). Counts: 262 commits, Aug 2025–Sep 2026. Matching prompts quoted from handlers.py at the cited SHAs. Seat objects from seats.dat, RSESeat.sol, and seats.py. This is an engineering narrative, not an offering document.