Create state
create_initial_state()The developer experience is designed around one metric: time to first verified run. For an already deterministic game, the adapter should expose only the game semantics LedgerLayer cannot know for you.
LedgerLayer core understands universal concepts — competition, participant, session, action, transcript, result, receipt, evidence. The adapter owns engine-specific state and action semantics.
export interface GameAdapter {
validateManifest()
createInitialState()
validateAction()
admitAction()
step()
isTerminal()
deriveResult()
serializeTranscript()
replay()
observation()
}For a straightforward deterministic title, the practical integration target is close to four game-specific operations plus manifests.
create_initial_state()apply_action()step()derive_result()$ arena init $ arena validate-adapter $ arena certify-adapter ./my-game $ arena register-game $ arena create-competition $ arena verify-run ./run.json $ arena verify-evidence ./evidence_bundle $ arena test-agent
The harness attacks the adapter rather than merely running a happy path: repeated inputs, modified transcripts, reordered actions, truncation, unknown rules, unknown engines, invalid state, extreme values, historical fixtures, and cross-runtime parity where relevant.
A bundle can contain the manifest, transcript, derived result, receipt, engine/rules/course manifests, and—where redistribution permits—the exact engine artifact. The target command stays simple:
$ arena verify evidence_bundle/ manifest ............ VALID transcript digest ... MATCH replay .............. CONFIRMED result .............. CONFIRMED receipt signature ... VALID