The same thesis, one layer down
An HTTP API has an OpenAPI spec; a Solana program has an on-chain instruction↔account↔PDA graph. Both are surfaces an agent must understand before it can act — and both lose something the agent needs: an Anchor IDL (or anllms.txt built from one) drops the PDA
seed recipes, so the agent derives the wrong accounts and the transaction fails.
The Program Surface is Gecko’s on-chain surface: it recovers those seed recipes from
program source and derives the PDAs first-plan-correct — the accounts a naive IDL tool
omits or gets wrong.
Gecko comprehends; the builder accesses
Gecko does the comprehension, not the access. It recovers the dropped seeds and derives the accounts. Orquestra does the access — it builds and submits the transaction against the program. Gecko fills the derivation gap and hands the plan to the builder to execute. Gecko never signs and never replaces the builder.Control plane, on-chain too: Gecko derives addresses and returns a plan. It holds no keys,
signs nothing, and moves no funds — the same invariant as the HTTP path.
Proven on four mainnet programs
Every derivation is verified against real mainnet accounts on a localsurfpool fork —
$0, read-only, no signing — each program with a gap a naive IDL tool gets wrong:
Jupiter is the fifth wired surface and is not in this table, because its gap is a
different kind. Its missing accounts are not derivable from any IDL — they are the legs
of a route an HTTP surface computed a second earlier, so they arrive tagged
cross_surface rather than recovered from seeds. Same plan, different mechanism.
Serve one
Simulate before you spend
A derived account set is not yet a landed transaction. The plan goes to an external builder, Gecko assembles the unsigned preludes, simulates on a $0 mainnet fork, and returns a Receipt — pass, or a categorical revert class — before any signature exists. That loop is live-proven twice: a Pump.fun buy where the naive derive-only path reverts withAccountNotInitialized (3012) and Gecko’s bundle passes at 86,669 CU, and a Meteora
DLMM swap (wrap → swap across live bins → unwrap) at 81,964 CU. Both on a surfpool
mainnet fork — a mainnet-backed snapshot, not mainnet — simulation only, $0, nothing
signed or broadcast.