Somewhere to be wrong

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.

GECKO • CHECK THE CALL BEFORE IT COUNTS their compiler · their interpreter · our fork · $0 · nothing lands