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 builds
Gecko does the comprehension, not the build. It recovers the dropped seeds and derives the accounts. Orquestra builds the transaction against the program. Gecko fills the derivation gap, hands the plan to the builder, simulates the bytes that come back, and returns them unsigned with a receipt. 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.
Orca Whirlpool and let_me_buy have since landed on mainnet through the same path; see
A real transaction.
Serve one
find_start, the program graphs, and the
money paths:
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, and returns a Receipt, pass, or a categorical revert class, before any signature exists. That loop is live-proven twice on a fork: 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.
Before the signer
Two checks sit between Gecko and a key holder, and neither one is Gecko’s opinion. The anti-poisoning verdict gates a downstream custody or signing layer: it refuses to sign for a tool Gecko quarantined, so the key holder only ever signs what Gecko cleared. The binding proves the bytes. A passing receipt on a money path returnsbinding, a hash
over the exact message bytes that were simulated, at exact strength, which covers the
blockhash. verify_signed_transaction checks a signed transaction against it, and
submit_transaction refuses to relay bytes that do not verify. A signer that was handed a
substituted transaction is caught while it is still free.
Gecko comprehends the call; the builder builds it; the vault signs it; the binding says
they are all talking about the same bytes.