A coding agent writes, runs the tests, reads the failure, fixes it. An on-chain agent gets a
tool list — and the call is the commit. This is the box nothing fills.
the loop, and who owns each step
1author
agent writes FDL from get_flow_schema
theirs
2validate
structure · refs · cycles, no RPC
theirs
3run
their engine, our fork, via rpcUrl
composed
4judge
address · deltas · provenance · gaps
ours
5score
build · simulate · honest · reachable · refuses
ours
6publish
only what scored
theirs
why step 3 needs nobody's permission
// simulate_flow, rpcUrl pointed at a host we chose
default run succeeded · real blockhash
devnet 403 Forbidden — devnet refused THEIR egress ip
unroutable 530 / 1016 — the connection was attempted
Their worker calls the RPC it is handed. A builder keeps their agent, their flow, their
engine — and gets a free sandbox by typing one parameter.
their engine, our fork — measured, nothing landed
starting surfpool fork of mainnet …
fork up at http://127.0.0.1:8899
ran ok : True | rpc_calls: 2
simulation success : True
compute units : 42494
receipts PDA : H7BjEBtan8h1HXeM…QDt5V
logs[0] : Program BUYuxRf… invoke [1]
logs[1] : Program log: Instruction: MakePurchase
MAINNET CHARGES 36,399 FOR THE SAME CALL.
A fork is a behavioural sandbox. It will tell you an
account was wrong, a seed was wrong, a signer was missing — and it is
not a compute oracle. A score that reports a fork's
compute as mainnet's is doing the exact thing we caught someone else doing.
what the fork cannot excuse
A shared fork ages — it holds the mainnet state of
whenever it started. That timestamp is a field in the score, not a footnote.