Manifests
An adversarial test case version lives under
test-cases/<type>/<difficulty>/<slug>/<version>/ and declares its contents in a
test-case.toml manifest, the same versioned, immutable
catalog layout every test type
uses. On top of the fields an
end-to-end manifest declares, an adversarial
manifest describes the game, the controller contract the model must implement,
the sandbox limits, the simulation loop, and how matches are structured and
replayed.
# test-cases/<type>/<difficulty>/<folder>/<version>/test-case.tomlslug = "capture" # stable identity (required); the store keyname = "Capture" # display name (site-facing)type = "adversarial" # selects the required and forbidden tablesdifficulty = "hard" # easy | medium | hard (required)experimental = false # optional; hides the case unless the deployment # enables experimental cases (default false)tags = ["ctf", "wasm"] # classification tags (site-facing, required)summary = "..." # optional site-card abstract (inline; NOT seeded)description = "description.md" # optional site-facing prose (NOT seeded)changelog = "changelog.md" # REQUIRED per-version changelog (NOT seeded)prompt = "prompt.hbs" # prompt template handed to the harness (required)max_runtime_hours = 2 # cap on the session and each setup step (default 1)workspace = "workspaces/base" # starter project seeded at the run rootinit = "cargo fetch" # optional command run after seeding
# Variants: an ORDERED list of standalone variant files (first = default). A root# key, so it must precede the first table header.variants = ["variants/base.toml"]
# How the harness builds the submission into a wasm controller module.[build]install = "cargo fetch"build = "cargo build --release --target wasm32-unknown-unknown -p controller"module = "target/wasm32-unknown-unknown/release/controller.wasm"
# The contract the controller must implement.[contract]entry = "tick" # exported function invoked once per tickworld = "schemas/world.json" # the per-tick observation passed inaction = "schemas/action.json" # the actions the controller may return
# Sandbox limits applied to every controller invocation.[sandbox]fuel_per_tick = 50_000_000 # wasmtime fuel ceiling per invocationmax_memory_bytes = 67_108_864 # 64 MiB linear-memory cap
# The simulation loop.[simulation]timestep_ms = 16 # fixed, faked delta handed to the game logicmax_ticks = 37_500 # hard cap on match length
# How implementations are paired against each other.[match]participants = 2 # controllers per matchstructure = "round-robin" # how the field is pairedrounds = 1 # matches played per pairing
# How a recorded match is rendered for browser playback.[replay]renderer = "replay/index.html"
# Common specs, seeded for EVERY variant. `dest` defaults to `source` with a# trailing `.hbs` removed.[[spec]]source = "specs/rules.md"
# Scoring domains for the human review that accompanies a published run. At# least one is required, exactly as on an end-to-end case.[[domain]]id = "play"name = "Play"description = "How the controller actually played the match."Each variants entry names a standalone variant file whose top-level keys are
the variant’s fields, exactly as for an
end-to-end case. An adversarial variant
typically varies the seeded specs, for example a different map, ruleset, or
starting condition:
# test-cases/<type>/<difficulty>/<slug>/<version>/variants/base.tomlslug = "base" # stable slug, recorded in the run recordname = "Base" # display name (optional; humanizes the slug)spec = [] # ADDITIVE specs on top of the common specsField requirements
Section titled “Field requirements”- The site-facing metadata, the required
changelog,prompt,max_runtime_hours,workspace,init, and the[[spec]],[[domain]],[[review_item]], andvariantsrules behave exactly as they do for an end-to-end case. typemust beadversarial. It selects the tables required here and forbids the asset-generation tables[canvas],[tool], and[output], and[[check]].- The
[build]table is required, and it emits a wasm module rather than a static site.installandbuildproduce it, andmodulenames the run-root-relative artifact the validator loads into the sandbox. The build must emit an import-freewasm32-unknown-unknowncore module. - The
[contract]table defines the controller interface.entryis the exported function invoked once per tick, andworldandactionare JSON Schemas for the observation passed in and the actions returned. Both schemas are seeded into the run at these exact paths. - The
[sandbox]table sets the per-invocation limits.fuel_per_tickis the wasmtime fuel ceiling for a single tick, andmax_memory_bytescaps the controller’s linear memory. Exceeding either forfeits the match. - The
[simulation]table configures the loop.timestep_msis the fixed, faked delta handed to the game logic each tick, so a match advances by the same amount of game time however long the hardware takes.max_ticksbounds a match’s length so it always terminates. - The
[match]table records how the field is paired into matches:participantsper match, thestructureused to pair them, and theroundseach pairing plays. - The
[replay]table names the browserrendererthat reconstructs a recorded match from its replay data for playback on the site.