EXPcaliburINSIDE THE MACHINE

12 / RESULTS

Reference bots: CLASSIC and ABYSS compared

This chapter examines the reference bots in the release. The repository includes their builds, seven-run scores, timing checks, replays, and pilot tests. We use those records to explain how each bot works and what its measured score shows.

Starts with: Saved bots and recorded comparisons.

Ends with: Their construction, behavior, and measured results.

Question: What does each record show?

Assemble the bot from the components we have studied

The strongest reference bots do two jobs within one VM time budget. Their power work earns or maintains boosts. Their pilot observes the arena, requests aim and movement, and routes toward gems. The game adds EXP only when the knight collects a gem, which is where the machine behavior finally meets the score.

How to read a saved bot without mixing its jobs

Build onceSource or a generator creates the uploaded program.
Run every tickPower work and pilot decisions share VM time.
Check resultsSeven complete runs reveal what the combination earned.

A score tells us what happened. Source, traces, and controlled comparisons help explain why.

Power work and pilot work affect the arenaPower work and pilot work affect the arenaCLASSIC APEX · RECOVERED COMPETITOR BINARYMachine behaviorRecognized chains sharethe VM slice.Sustained powerMeters and caps resolveeffects.Pilot decisionsScan, aim, move androute.Action requestsThe world bounds eachrequest.Arena → collected EXPEffects and actions meetin combat, drops andpickup.ABYSS APEX · GENERATED AUTHOR REFERENCEInner workGate execution producescandidates.Host proofAccepted work limits aboost that expires.Pilot decisionsRead the same ordinaryarena.Action requestsAim and move towardenemies or gems.Arena → collected EXPThe effect and live pilotstill need real pickups.Both jobs use limited VM time. The game combines their results.The saved CLASSIC and ABYSS bots can use different pilots.
Build the bot once; run it during the match. Source or a generator creates the uploaded file. During the match, power work and pilot work share VM time. The game uses their effects. View diagram at full size

The two reference bots have different surviving files. CLASSIC has a saved compiled file but not its complete original source. ABYSS has both its generator and the source it generated. We can trace the ABYSS pilot line by line. We cannot claim to know the CLASSIC pilot's exact movement code.

CLASSIC apex: what the saved bot does

The saved CLASSIC apex is 53,264 bytes, while its earlier version is 21,066 bytes. The apex keeps eight chains active across all four families, and that spread matters.

In the cap formula, K counts active chains, Fam counts their families, and Keff is the count the cap actually uses. Eight chains across four families give Keff=8. Put all eight in one family and Keff drops to 2, even though K stays 8.

What changed from the seven-chain predecessor?

The two saved files allow a comparison. The repository says the earlier bot has seven recognized chains. The apex keeps those seven and adds LOCKSMITH. Thus, the cap count changes from Keff=7 to Keff=8. LOCKSMITH does not write EXP directly.

CLASSIC apex: what changed in the saved binaryCLASSIC apex: what changed in the saved binaryWHAT THE CLASSIC APEX README DESCRIBESOne apex region, several readingsChanged code later runs (PHOENIX).An operand byte also runs (JANUS).A computed value chooses a jump (VECTOR).Apex response inside the botThe VM computes an economy reply.The host still checks whether each chaincounts.THE PRESERVED BEFORE / AFTER COMPARISONPredecessorSeven accepted chains.Its exact construction is not saved.Keff = 7.CLASSIC apexThe same seven, plus LOCKSMITH.Image and stack roles overlap in guestmemory.Keff = 8.one additional chainThe extra chain affects limited power after its host check passes and its meter fills.A pilot still needs hits, drops and pickups; the exact original pilot source is not saved.We know the chain counts. We do not know if both bots use the same bytes.
What the two saved CLASSIC binaries show. The apex README describes one code region with several uses and a program that calculates economy replies. The earlier bot earns seven chains. Its exact byte method is unknown. The larger apex adds LOCKSMITH. View diagram at full size

The comparison is shown as cards below →

Preserved clue What a reader can connect it to What the comparison shows
The apex uses a small region of bytes for several jobs PHOENIX observes changed code that later runs; JANUS observes an instruction byte read in two roles; VECTOR observes a computed jump The apex README names this multi-use region. The predecessor earns these chains too, but the repo does not show whether it uses the same bytes or method
The apex has an economy response inside its uploaded instructions The VM computes the reply; the host still decides whether to accept its named chains The response is part of the submitted apex, not a score written straight into the game. We cannot infer the predecessor's response method
The larger file changes which guest-memory roles overlap LOCKSMITH concerns host-call arguments sharing bytes with another guest-memory role The predecessor lacks this eighth chain; the apex adds it without replacing the earlier seven
Earlier saved bot7 chainsKeff = 7
CLASSIC apex8 chainsKeff = 8
Several jobs in one apex code regionIts README ties the region to PHOENIX, JANUS, and VECTOR. The predecessor earns those chains too. Its byte-level method is unknown.
The apex computes an economy replyThe response runs inside its VM program. The host still checks what counts. The predecessor's response method is not documented.
What the extra chain addsThe larger apex file makes guest-memory roles overlap for LOCKSMITH. The earlier seven chains stay present; the host can count one more.

Why the bigger file earns LOCKSMITH

The VM uses the uploaded file's length as the end of its code region. It counts padding in that length. The apex extends the code region over its host-call arguments. The host call then reads bytes that the VM also counts as code.

The repository keeps both uploads, so we can check the byte sizes ourselves. The earlier file ends at 0x524A, while the apex ends at 0xD010. Its last nonzero byte is at 0x6F3C, and the remaining 24,787 bytes are zero. Those zeros still count toward the uploaded length, so the VM does not set code_end to the last useful instruction:

RUST crates/vm/src/lib.rs · source lines 418–422
    pub fn new_with_mode(code: &[u8], mode: EconomyMode) -> Self {
        let mut mem = Mem::new();
        mem.load_image(code);
        let image = mem.bytes.clone();
        let code_end = code.len().min(VM_MEM_SIZE) as u32;
Same 64 KiB room; the apex moves the code-region boundary
Earlier file
code_end = 0x524A
Apex file
code_end = 0xD010
Full address range
0x0000–0xFFFF
Blue marker · stack starts
0x8000
Purple marker · apex parks stack
0xD000

Gold = bytes the VM counts as the uploaded image. The apex boundary is only 16 bytes past 0xD000; the close-up below shows that tiny gap.

How does the stack reach that address? PUSH_ZERO is byte 03; it pushes one four-byte word. The apex contains 5,120 consecutive 03 bytes from 0x26E2 through 0x3AE1. These are actual instructions.

Starting at sp=0x8000, 5,120 net pushes move the stack by 0x5000 bytes to 0xD000. The README calls this the stack parking step. The zero padding extends code_end to 0xD010, just past the parked stack.

RUST crates/common/src/consts.rs · source lines 5–9
pub const VM_MEM_SIZE: usize = 0x10000;
pub const ADDR_MASK: u32 = 0xFFFF;
pub const IP_INIT: u32 = 0x0000;
pub const SP_INIT: u32 = 0x8000;
pub const PER_TICK_INSTR_BUDGET: u32 = 10_000;
RUST crates/vm/src/lib.rs · source lines 53–56
pub mod op {
    pub const PUSH: u8 = 0x01;
    pub const PUSH_SHORT: u8 = 0x02;
    pub const PUSH_ZERO: u8 = 0x03;
RUST crates/vm/src/lib.rs · source lines 535–539
        self.mem.store_u32(self.sp, v);
        if self.sp > self.sp_hi {
            self.sp_hi = self.sp;
        }
        self.sp = self.sp.wrapping_add(4);

Consider a call made with sp=0xD000. Before the VM removes stack values, it saves this address as base. First, it reads the argument count at base−4 = 0xCFFC. Lower addresses hold arguments and the call number.

All these addresses are less than 0xD010. Thus, a < code_end reports that the call frame overlaps the code region. The detector sets marshal_alias. It does not check for harmful argument values.

This code tests each call-frame word address. It checks for an overlap with the reserved challenge page or the image. The apex overlaps the image:

RUST crates/vm/src/lib.rs · source lines 964–969
    fn note_syscall_frame(&mut self, base: u32, argc: u32) {
        for k in 1..=(argc + 2) {
            let a = base.wrapping_sub(4 * k) & ADDR_MASK;
            if (RESERVED_ALIAS_LO..RESERVED_ALIAS_HI).contains(&a) || a < self.code_end {
                self.marshal_alias = true;
            }

That VM observation is only one part of LOCKSMITH. In the same tick, the host also checks for the LOCK word at 0xFF2C and a nonzero reply at 0xFF28. The host wrote the challenge at 0xFF24, and the required reply is econ_hash(challenge XOR LOCK_ECHO).

The apex README says its bytecode includes econ_hash. The host code gives the required formula. The saved binary does not identify which instructions calculate each reply.

RUST crates/engine/src/vulns.rs · source lines 406–411
pub(crate) fn lock_challenge(tick: u32) -> u32 {
    splitmix64((KEY_SEED as u64) ^ K_LOCKSMITH ^ ((tick as u64) << 32)) as u32
}
pub(crate) fn lock_response(c: u32) -> u32 {
    econ_hash(c ^ LOCK_ECHO)
}
RUST crates/engine/src/vulns.rs · source lines 938–944
    fn locksmith_armed(&self, mem: &Mem, l: PwnLatches) -> bool {
        if !l.marshal_alias || mem.load_u32(LOCK_MAGIC_ADDR) != LOCK_MAGIC {
            return false;
        }
        let r = mem.load_u32(LOCK_RESP_ADDR);
        r != 0 && r == lock_response(lock_challenge(self.tick))
    }

To reproduce the chain, extend the image with padding and park the stack inside its extent. Make a real SYSCALL each tick to set marshal_alias. Read that tick's challenge, write the reply and magic word, and keep the pilot running.

Padding alone changes only the address comparison. It does not answer the challenge, fight enemies, or collect EXP. The earlier file has code_end=0x524A, which never reaches the normal operand stack. That is why the repository uses these two uploads as a before-and-after check for this eighth chain.

What the surviving files cannot tell us

The saved files show the chain difference, but they do not contain the original source. So we cannot identify the apex pilot's exact movement code, or assign its full score to LOCKSMITH alone.

The CLASSIC payout example starts after a chain passes the host check. Its meter changes limited knight fields. The game must still create a gem, and the knight must collect it.

Earlier chapters show example pilots. They do not reconstruct the missing CLASSIC apex source.

During a match, the bot must repeat the chain behaviors or their meters fall. Active meters give limited attack, survival, and collection bonuses, but more active power also raises HEAT, which makes survival harder.

A useful pilot stays where its attacks can hit several targets, survives contact, and collects the gems from those kills. The diver chapter gives one complete example. It does not claim that the saved apex uses the same pilot.

The same saved file scored a median 224,384 with older rewards and 22,704 after the A1 balance change. It still had eight recognized chains. Smaller bonuses slowed kills, which meant fewer gems, fewer level-ups, and fewer chances to stay alive. One multiplier cannot explain the full score change.

ABYSS apex: generator, compiled program, inner work, and pilot

For ABYSS, the repository has both the generator and the source it produced. A generator writes another program. It runs before the match. The normal compiler then turns the generated source into the uploaded program.

ABYSS reference: build once, share time, earn EXPABYSS reference: build once, share time, earn EXPBUILD · ONE ARTIFACTAuthor generatorWrites source andstructured material.Public compilerEmits the outer VM image.Fixed artifactIdentity and ABYSS mode arefixed.RUN · SHARED BUDGET, DIFFERENT JOBSOne uploaded image runs both jobsOuter pilotReads copied world state.Chooses aim, movement andpickups.Device-facing workSends requests; maycontinue over ticks.The host admits andverifies.Host authoritySaved proof and a shortDrive boost.WORLD · ONLY COLLECTED GEMS ADD EXPActions and bounded effectLocal geometry, combat and survival.Drops and collectionActual pickup changes score; level canheal.Both jobs use VM time. The game still handles pickups.
Build and run the ABYSS reference bot. The top row shows work done once during the build. During a match, Gate work and pilot work share VM time. The host keeps proof and short boosts. The game handles kills and pickups. View diagram at full size

Follow how the ABYSS apex was built

The apex build reuses earlier programs. Its driver loads the Chasm generator, which loads Rift, which in turn pulls in the earlier Entry pilot and a saved test fixture.

The apex then asks Chasm's builder for source, a raw image, a compiled file, and build notes. This is the build order, not the order of actions during a match.

The ABYSS apex build reuses earlier generator layersThe ABYSS apex build reuses earlier generator layersEntry source + fixtureSaved pilot sourceand test input.Rift generatorExtracts the pilotand reads saved testdata.Chasm generatorOffers the compactbuilder used by theapex.Apex driverCalls the inheritedbuilder and recordsoutputs..bot sourceGenerated outerprogram: pilot plusdevice-facing logic..bin uploadThe runner extractsthe VM program..trace.jsonBuild notes andsaved gradingevidence.Arrows show build order, not match actions.During a match, the outer VM runs the image. The host checks Gate work.
The apex uses earlier generators and writes three files. The top row shows modules used during the build. The lower row shows source, the uploaded program, and the trace. The runner extracts VM instructions before the match. View diagram at full size

The two driver modules show these imports:

PYTHON bots/exploit/abyss_apex/generate.py · source lines 15–23
ROOT = HERE.parents[2]
CHASM_PATH = ROOT / "bots/exploit/abyss_chasm/generate.py"

_spec = importlib.util.spec_from_file_location("abyss_chasm_generate", CHASM_PATH)
if _spec is None or _spec.loader is None:
    raise RuntimeError("cannot load Chasm generator")
CHASM = importlib.util.module_from_spec(_spec)
sys.modules[_spec.name] = CHASM
_spec.loader.exec_module(CHASM)
PYTHON bots/exploit/abyss_chasm/generate.py · source lines 22–31
HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[2]
RIFT_PATH = ROOT / "bots/exploit/abyss_rift/generate.py"

_spec = importlib.util.spec_from_file_location("abyss_rift_generate", RIFT_PATH)
if _spec is None or _spec.loader is None:
    raise RuntimeError("cannot load Rift generator")
RIFT = importlib.util.module_from_spec(_spec)
sys.modules[_spec.name] = RIFT
_spec.loader.exec_module(RIFT)
Build layer Responsibility visible in the repository What the next layer reuses
Entry source and saved fixture Earlier pilot text and fixed test input A starting pilot and input helpers
Rift generator Extracts and adjusts that pilot; reads the fixture Pilot and helper data
Chasm generator Offers a compact build path using earlier helpers Source, raw image, compiled file, and build notes
Apex driver Selects the full apex build and records its outputs The final source, image, and trace for review

The apex writes three files. The .bot file contains readable outer source. The runner receives the .bin file and extracts VM instructions from it. The .trace.json file records build and grading details. It does not run in the arena:

PYTHON bots/exploit/abyss_apex/generate.py · source lines 146–148
    check_or_write(BOT, source.encode(), args.check)
    check_or_write(BIN, artifact, args.check)
    check_or_write(TRACE, canonical_json(trace), args.check)
Role Lives where Why it cannot be omitted from the explanation
Generator and generated source Build time Explain how the submitted outer program and embedded material were assembled
Compiler and image Build time, then fixed for a run Explain how source decisions become VM bytes and how mode is selected
Device-facing work Guest requests into host-owned ABYSS state Establishes accepted history under the Gate contracts
Pilot Ordinary outer-VM execution each world tick Converts current arena information into movement, aim and pickup routes
Proof store and Drive setting Host-owned state Saved proof can remain after a boost expires
World Shared game simulation Turns limited bonuses and pilot actions into actual EXP

In one game tick, the pilot reads nearby enemies and aims. Gate work can run or pause. If the host accepts the result, it saves more proof. A Drive boost can then make a hit stronger.

The knight must still move to collect a dropped gem. Pilot work and Gate work share the outer VM's time limit. Too much work on either job can prevent the other from finishing.

The reference notes say the builder uses the public compiler without patching the compiled binary. Thus, the recorded build can come from source accepted by that compiler. A raw-binary method would be a different claim.

Accepted proof permits strong attack, survival, movement, and collection settings. The pilot uses these settings in the arena. Later, we compare the score with real gem pickups. We also examine tests that block pilot actions.

The saved Entry, Rift, and Chasm bots stop at earlier proof steps. They show how the system changes as the host accepts more proof. Their Gate work, time use, and match paths also differ. They are not the apex with only a smaller damage value.

The gameplay pilot inside the ABYSS apex

The generated apex source calls its pilot the Rift pilot, the gameplay code in the highest-scoring ABYSS reference. It does not orbit a group like diver. Instead, it aims at valuable nearby enemies and checks walls, using fewer calculations and waiting longer before it flees.

The ABYSS apex pilot: aim, movement, and gemsThe ABYSS apex pilot: aim, movement, and gemsObserveRefresh knight status; scannearby enemies.Any enemies?The scan count chooses thefirst branch.No enemiesIf a gem is visible, takea wall-aware step towardit. Return.noAimChoose between at most thefirst two enemycandidates.yesLow HP?HP < 45%, or HP < 70%with at least 8scanned enemies.Escape and returnCompare 8 wall-awareheadings using the nearestenemy as the threat.yesChoose routePrefer a close gem;otherwise approach or backaway around weapon reach.noMoveTake a limited wall-awarestep.Aim and movement remain separate decisions.This is the ordinary pilot, not the proof-acquisition path.
How the apex pilot chooses actions each tick. The pilot chooses movement and aim. Gate proof work is separate. The diagram shows how the pilot uses the arena when power is available. View diagram at full size

Use the interactive example before reading the functions. Start with 80% HP, three scanned enemies, and a gem closer than the nearest enemy. Then add enemies and reduce HP. When the escape condition passes, the pilot flees before it checks the gem. The example uses the pilot's strict < comparisons at the health and gem limits.

Try the ABYSS apex pilot’s decision order

Change one observation at a time. These are the branch rules in the saved pilot. The scene shows requests, not a simulated match: walls, attacks, and the host’s movement limit are handled later.

Swipe the scene sideways on a narrow screen →

Construction choice 1: keep aim selection cheap

The target helper considers at most the first two scanned enemies. Its weights are thief 100, gnome 60, shaman 40, panda 35, bear 30, and default 10. For each candidate, it divides the weight by squared distance:

BOT bots/exploit/abyss_apex/abyss_apex.bot · source lines 1204–1214
fn best_target(n, mx, my) {
    if (n > 2) { n = 2; }
    let best = 0; let score = 0 - 1; let i = 0;
    while (i < n) {
        let dx = enemy_x(i) - mx; let dy = enemy_y(i) - my;
        let candidate = value_of(enemy_type(i)) * 100000 / (dx*dx + dy*dy + 1);
        if (candidate > score) { score = candidate; best = i; }
        i = i + 1;
    }
    return best;
}

The bot can miss a better third enemy. It scores only two targets instead of up to sixteen. This leaves more VM time for other work.

Gate work and pilot work share VM time. A faster decision can let both jobs run during the tick.

Construction choice 2: shorten wall look-ahead

The ordinary gapkiter checks one, two, and three tile-scale steps ahead. The apex helper checks only the first step:

BOT bots/exploit/abyss_apex/abyss_apex.bot · source lines 1185–1193
fn path_clear(hx, hy, dx, dy) {
    let ax = dx; if (ax < 0) { ax = 0 - ax; }
    let ay = dy; if (ay < 0) { ay = 0 - ay; }
    let mx = ax; let mn = ay; if (ay > ax) { mx = ay; mn = ax; }
    let m = mx + (mn * 7 / 16); if (m < 1) { m = 1; }
    let ux = (dx * 64) / m; let uy = (dy * 64) / m;
    if (is_solid(hx + ux, hy + uy)) { return 0; }
    return 1;
}

The apex still tests several directions and adjusts their lengths, but it does not look as far ahead. A clear first sample can lead to a wall farther away, so the pilot checks again on later ticks and can change direction. Each choice uses fewer scans and calculations.

Construction choice 3: escape on health pressure

The complete main pilot routine shows its priority order:

BOT bots/exploit/abyss_apex/abyss_apex.bot · source lines 1284–1325
fn pilot() {
    sense();
    let n = enemy_count();
    if (n <= 0) {
        let mx = my_x(); let my = my_y();
        if (gem_count() > 0) {
            step_heading(mx, my, gem_x(0) - mx, gem_y(0) - my);
        }
        return;
    }

    let mx = my_x(); let my = my_y();
    let reach = my_reach();
    let target = best_target(n, mx, my);
    aim_at(enemy_x(target), enemy_y(target));

    let ndx = enemy_x(0) - mx; let ndy = enemy_y(0) - my;
    let nd2 = ndx*ndx + ndy*ndy;
    let hp_pct = my_hp() * 100 / (100 + 18 * (my_level() - 1));

    if (hp_pct < 45 || (hp_pct < 70 && n >= 8)) {
        step_escape(n, mx, my);
        return;
    }

    let dx = 0; let dy = 0;
    let gems = gem_count();
    let gx = 0; let gy = 0; let gd2 = 1 << 30;
    if (gems > 0) {
        gx = gem_x(0) - mx; gy = gem_y(0) - my; gd2 = gx*gx + gy*gy;
    }
    if (gems > 0 && gd2 < nd2 && gd2 < 340*340) {
        dx = gx; dy = gy;
    } else if (nd2 > reach*reach) {
        dx = ndx; dy = ndy;
    } else {
        dx = 0 - ndx; dy = 0 - ndy;
    }
    if (dx != 0 || dy != 0) { step_heading(mx, my, dx, dy); }
}

First, the routine refreshes status and enemies. If it sees no enemy, it moves toward the first gem and returns. Otherwise, it reads knight position and weapon reach. It then selects an aim target and reads the nearest enemy's position relative to the knight.

The health estimate is HP * 100 / (100 + 18*(level-1)). The denominator is the knight's normal maximum HP, so the result is an integer percentage. The pilot flees below 45% HP, or below 70% if it scans at least eight enemies.

Unlike ordinary gapkiter, this pilot does not flee only because it sees many enemies. It waits until HP is low. Its stronger survival lets it stay near enemies for longer.

At 80% HP with ten enemies, the bot does not flee. At 60% HP with ten enemies, the second rule makes it flee. At 40% HP with one enemy, the first rule makes it flee.

The code uses <, not <=. At exactly 45% HP with few enemies, the first rule does not apply. At exactly 70% HP, the second rule does not apply. Check these limits when you read a replay.

Construction choice 4: simplify directional threat

Escape compares eight compass directions and gives a large penalty to a blocked one. It calculates enemy pressure from only the nearest enemy: for direction (dx,dy) and enemy displacement (ex,ey), it starts with max(0, ex*dx + ey*dy). It then selects the lowest pressure, and the strict comparison keeps the first candidate when pressures are equal.

Unlike gapkiter, it does not add pressure from every enemy. If the nearest enemy is east, eastward choices get a penalty. Westward choices start at zero before wall penalties.

Other enemies can still make west dangerous. The pilot ignores them to save time. This is a fast choice, not a complete safety check.

Construction choice 5: keep the collection loop alive

If the pilot does not flee, it calls gem_count(). It reads only gem_x(0) and gem_y(0). The host sorts scanned gems by distance. Thus, index 0 is the nearest listed gem inside the scan box.

If that gem is closer than the nearest enemy and within 340 pixels, the pilot moves toward it. Otherwise, it approaches an enemy beyond weapon reach, or backs away from one already in reach. It sends a move request only when the direction is not zero. Reading one gem saves work, but the pilot does not compare all gem values or routes.

The host sorts gems before the pilot reads them. It uses squared distance, then slot number for equal distances. It returns only the requested number of entries:

RUST crates/engine/src/syscall.rs · source lines 286–297
            let dx = (g.x - hx) as i64;
            let dy = (g.y - hy) as i64;
            cand.push((dx * dx + dy * dy, slot));
        }
        cand.sort_by(|a, c| a.0.cmp(&c.0).then(a.1.cmp(&c.1)));
        let cap = n_req.min(SCAN_GEMS_MAX) as usize;
        let n = cap.min(cand.len());
        for (i, &(_, slot)) in cand.iter().take(n).enumerate() {
            let g = &self.gems[slot];
            let base = result_addr.wrapping_add((i as u32) * 12);
            mem.store_i16(base, to_int(g.x) as i16);
            mem.store_i16(base.wrapping_add(2), to_int(g.y) as i16);

A large pickup radius alone is not enough. The pilot moves toward drops while it stays near enemies it can hit. The game checks the actual distances and pickups. Later, a test blocks gem-directed moves, and its scores show the effect of this rule in the complete bot.

Decision Ordinary diver Ordinary gapkiter Pilot embedded in ABYSS apex
Aim candidates All scanned enemies All scanned enemies At most first two
Default movement Centroid approach / orbit / outward Reach management and opportunistic gems Reach management and opportunistic gems
Wall look-ahead No internal-wall test Three samples per heading One sample per heading
Escape trigger Very near pack centroid Local crowd, especially while hurt HP below 45%, or below 70% with scan count at least eight
Escape pressure Outward centroid / nearest fallback Sum of forward weighted threats Nearest enemy's forward dot product
Empty enemy scan Return Route toward a gem Route toward a gem

The pilot still aims and collects gems, but each choice uses less VM time. Stronger survival lets the knight stay near enemies longer. The score measures the whole bot, so it does not show that one shortcut helps every bot.

The current release ladder

The Stage 7 report records these scores from the packaged runner. The run numbers label the columns but do not reveal the seed values. These measurements come from the repository, and this guide did not rerun the exploit artifacts.

Swipe the score table sideways to see all seven runs →

Artifact Run 1 Run 2 Run 3 Run 4 Run 5 Run 6 Run 7 Median
Honest 160 66 169 26 161 30 160 160
Entry 14,134 7,637 17,030 9,888 15,531 9,812 10,102 10,102
CLASSIC engine 18,946 20,141 26,931 18,475 26,528 22,704 24,450 22,704
Rift 69,071 104,487 65,434 155,460 42,513 22,148 104,284 69,071
Chasm 51,715 141,683 109,658 60,694 90,367 115,096 161,277 109,658
ABYSS 321,637 414,290 298,344 478,518 199,323 336,338 367,461 336,338

What changed between those ABYSS rows?

Each request has three levels: SERRATE / BASTION / TRAWL. They control attack; survival and movement; and gem supply and collection. A proof step sets the highest allowed level. The bot must request an allowed level for each track and keep the short boost active. The saved reference notes give these requests:

The four stages are shown as cards below →

Bot Accepted proof step and requested levels What the power table adds at that step Other changes in the saved artifact
Entry EntryProof; [4,4,4] 250 extra attack damage, 39 armor, 180-pixel vacuum radius First Gate work plus a stock pilot
Rift CalibratedProof; [8,8,8] Attack damage and vacuum stay at their level-4 values; armor rises to 119, ward and movement also improve More inner work; the Entry-derived pilot changes its HP retreat rule
Chasm StaleDispatchProof; [12,12,12] Attack jumps to 4,500 extra damage and four passes; vacuum grows to 780 pixels New saved-work machinery and a continuing Rift-style pilot
ABYSS apex ModuleProof; [16,16,16] Attack reaches 7,200 extra damage and five passes; armor reaches 165; vacuum grows to 890 pixels A larger generated program performs the remaining checks and keeps its bounded pilot running

Entry 10,102 median EXP

Proof and request: EntryProof; [4,4,4].

Power: 250 extra attack damage, 39 armor, 180-pixel gem vacuum.

Bot: First Gate work plus a stock pilot.

Rift 69,071 median EXP

Proof and request: CalibratedProof; [8,8,8].

Power: Attack damage and vacuum stay at level 4; armor rises to 119, with better ward and movement.

Bot: More inner work; the pilot changes when it retreats.

Chasm 109,658 median EXP

Proof and request: StaleDispatchProof; [12,12,12].

Power: 4,500 extra attack damage, four passes, 780-pixel gem vacuum.

Bot: Adds saved-work handling and keeps a Rift-style pilot.

ABYSS apex 336,338 median EXP

Proof and request: ModuleProof; [16,16,16].

Power: 7,200 extra attack damage, five passes, 165 armor, 890-pixel gem vacuum.

Bot: Larger generated program finishes the checks and keeps piloting.

At every proof step, the game still decides whether hits land and gems are collected. The change from [8,8,8] to [12,12,12] gives much more attack and collection power.

Why one proof step cannot explain the score gap

The scores measure complete bots. The bots differ in build, Gate work, pilot timing, and match behavior. We cannot assign the gap between two rows to one proof step. Other code also changed.

Why the apex kept full TRAWL

The apex builder also tried a [16,16,2] request. Its lower TRAWL level reduced HEAT, but it also gave up gem supply and pickup help. The saved build notes report worse scores on hidden seeds. The builder kept [16,16,16] because the extra collected gems outweighed the extra danger in those runs.

Saved scores from the release

Repository measurements · hidden bundle · seven scores per artifact.

The median scores rise from row to row. Individual run scores do not always rise. For example, Chasm scores below Rift in runs one and four. The milestone compares medians from seven runs, not every run.

Here, the ABYSS median is about 14.81 times the CLASSIC median. This ratio describes these bots and this test set. It does not apply to all ABYSS and CLASSIC bots.

A median selects a run

The grader sorts seven complete results and selects the fourth. It does not average values. It does not find separate medians for EXP, kills, time, and level. The selected result stays with its replay.

The median is a real run

Choose a saved bot. The fourth sorted run gives the displayed EXP and all its other results.

When you watch a replay, its EXP, kills, time, and level all come from the same run. The grader does not combine values from different seeds.

Within one grade, the runner sorts by EXP from high to low. It then sorts equal scores by shorter time and smaller seed. The leaderboard also sorts by EXP, but uses earlier creation time for equal scores. Kills do not affect leaderboard rank.

What the frozen artifacts establish

The repository keeps the submitted CLASSIC apex binary, its predecessor, and their hashes. These records are frozen, meaning saved at release and never changed, so their value as evidence is a stable identity and measured behavior. The current frozen median is 22,704. The older score of 224,384 used different rewards, so do not mix it into the current release comparison.

The ABYSS apex has source and a generator, and its README says the unmodified public compiler produces the artifact without patching the compiled binary. This shows that the submitted image can come from the public source language. Even so, the bot still has specialized code and packaging, so it is not a simple beginner example.

The apex has accepted proof on all three Drive tracks and a working pilot. The proof permits strong but limited bonuses, and the pilot turns them into kills and collected gems. Both parts are needed to explain the measured score.

Supply and score are distinct measurements

The ABYSS reference reports median real-gem supply of 362,435 and median EXP of 336,338. These are separate statistics for the seven-run set. Their ratio describes the set. It is not necessarily the pickup rate in the selected median-score run.

The more direct check compares values within each run. The picked-up gem value matches the score, and no pickup counts twice. The value of gems on the ground shows whether the bot needs more kills or better collection.

After the build was saved, practice scores were 349,198; 179,835; 92; 346,924; 316,000; 154,367; and 351,006. Their median was 316,000. The third run scored only 92, although the median remained high.

The report says Stage 6 used the official hidden seeds during tuning. These later practice runs show what happened after that work. They are not an independent test on unseen inputs.

What happens when we block one pilot input?

These tests use the same apex program and proof work. They do not remove code. The host blocks one request type at a time: movement, aim, or movement toward a live gem.

When the host blocks movement, the knight stays in place. When it blocks aim, the old aim stays. In the gem-route test, other moves still work. Gem routing is a move, not a separate host command. The bot can calculate a route even when the host rejects the move.

The gem-route check sits in the normal sys_move code. It runs before the host refreshes the short-lived records of recent movement and gem routing, so a blocked gem-route move renews neither record:

RUST crates/engine/src/syscall.rs · source lines 447–466
        if self.abyss_on() {
            let pickup_route = self.gems.iter().any(|gem| {
                if !gem.alive {
                    return false;
                }
                let gx = to_int(gem.x) - to_int(hx) - i32::from(dx);
                let gy = to_int(gem.y) - to_int(hy) - i32::from(dy);
                gx.saturating_mul(gx) + gy.saturating_mul(gy) <= 12 * 12
            });
            if self.pilot_pickup_routing_ablated() && pickup_route {
                return packed(hx, hy);
            }
            self.device_move_lease = crate::world::DEVICE_PILOT_LEASE_TICKS;
            if pickup_route {
                self.device_pickup_route_lease = crate::world::DEVICE_PILOT_LEASE_TICKS;

The host keeps short-lived records of recent movement, aim, and gem routing. The code calls them leases. A blocked request does not renew its lease.

The attack boost needs recent movement and aim. The larger pickup radius and magnet need a recent gem route. Thus, each test changes both the knight's actions and which boosts stay active.

Follow one blocked request
Bot decidesThe unchanged program still calculates a move or aim.
Host blocks itThe matching recent-input record is not refreshed.
Boost may switch offAttack or pickup code checks for that live record.
Match changesDifferent movement, hits, and collected gems change the score.

Combat checks for both recent aim and movement. Pickup code checks the recent gem route separately:

RUST crates/engine/src/combat.rs · source lines 101–104
        let device_piloted =
            !self.abyss_on() || (self.device_aim_lease > 0 && self.device_move_lease > 0);
        let attack_effects = bugs && device_piloted;
        let disc_mode = attack_effects && self.hero.disc_committed;
RUST crates/engine/src/combat.rs · source lines 481–487
        let pickup_route_live = !self.abyss_on() || self.device_pickup_route_lease > 0;
        let mut pr = self.hero.pickup_radius;
        if self.lever_effects_on() && pickup_route_live && self.hero.vacuum_radius > 0 {
            pr = pr.max(from_int(self.hero.vacuum_radius.min(self.eff_vacuum_cap())));

What the recorded runs say

What if the host blocks one pilot input?

The program and proof work stay the same. Choose a test where the host blocks movement, aim, or gem-directed moves. These bars show recorded middle scores from the repo; they do not predict a new bot.

Blocking movement or aim separately reduces the frozen median to 91. Blocking gem routing leaves 2,322, and blocking both movement and aim leaves 14,677. All are far below the complete pilot's 336,338.

Blocking both movement and aim scored better than blocking either one alone in these runs. The changed actions also change positions, enemy contacts, spawns, and pickups. The effects of two blocked requests do not equal the sum of their separate score losses.

These tests show that this reference bot needs its pilot. The numbers measure this bot on these runs. They do not give universal values for movement or aim.

Incomplete understanding can look successful

The release also tests six bots with deliberately incomplete proof work. They often beat a basic bot but score below the complete bot at their proof step. A failed proof step does not always crash the bot.

A failed upgrade can leave earlier accepted proof in place. The tests check the public result, saved old proof, and whether the bot can try again. They also check that failure does not grant higher power.

What the timing studies establish

The timing test tried to distinguish two private cases by run time. Random guesses would be correct about 50% of the time. The authors set 55% as the level of concern. Every recorded result stayed below it.

The Stage 7 report cites test version 14. Its highest accuracy on unseen pairs was 52.63671875%. The repository also has a completed version 15 test. It lists thirteen runs, each with 256 warm-up pairs and 2,048 measured pairs. Its highest listed accuracy is about 53.0273%.

These results apply to the tested builds, inputs, machines, and methods. They do not rule out every possible timing test. Saved hashes identify the measured program and test producer.

The Stage 7 report is useful, but the repository has newer timing data than its version-14 result.

The difficulty ratio was not measured

The original requirement sought an ABYSS-to-CLASSIC modeling-time ratio of 10–20×. It called for separate groups that had not seen the challenge. The report says the ratio was not measured and no longer blocks release.

The two-agent playtest lasted 205 and more than 240 minutes, and together the agents generated 2,877 binaries. Their best scores were 21,672 and 3,458, both on CLASSIC, and neither agent entered the ABYSS path. So the playtest shows a discovery barrier, but it cannot measure the requested ratio, which needs one new group per engine.

What the release checks actually show

Release tests check that repeated runs and replays match byte for byte. Other tests check score from pickups, limits on invalid input and full tables, local effects, the pilot, and spectator viewing. Each test supports a specific claim.

The results apply to the tested build and inputs. Rust's forbid(unsafe_code) helps prevent some memory errors. It does not prove that every protocol rule is correct. Matching replays show that those runs were recorded consistently. They do not cover every possible bot.

This distinction makes the evidence more useful: each result states what was tested, what stayed fixed, and which conclusion follows. It lets a later maintainer identify exactly which evidence needs renewal after a code change.