Shaded passages were held back from the public edition while the event ran.
Monday we were our own denial of service. Tuesday the robot fixed that, ran the best file lanes it has ever run, and then lost four minutes looking for a file the challenge had told it the name of.
09:00
The robot saw the release 0.74 seconds after 09:00.
- Big Entrance (warmups): the new layer was UTF-16 hex, one the robot had predicted overnight. All three modes by 6.3 seconds.
- Loaded Later (mobile): all three by 6.6.
- The Butler Did It (script): 1,329 questions on the Single Solve, 6,645 on the Mastery, each sent as one batch. All three by 7.7.
- Universal Appeal (metadata): it asked for a Mach-O binary’s CPU type, and the robot had no reader for Mach-O. All three by 17.3 anyway.
- Resourceful (binary): a new resource-overlay field. All three by 44.8.
All 15 file-lane checks in 44.8 seconds, 1st on the board for that set. team.dev did it in 67.9. One day earlier, our own number had been 293.
Metadata and binary needed agents, the AI helpers on standby for each lane. When the robot cannot answer, it writes a ticket, a short report of what it could not do, and an agent answers with a patch, a small fix the robot picks up live. An automatic judge tests every patch first. On metadata the ticket went out at 1 second and a judged patch was live 10 seconds later. On binary five patches landed between 28 and 33 seconds.
I was watching in the terminal and yelling at it through the last few seconds.
The web
Two web challenges came out, each with its own live target.
Administratively Speaking went exactly to plan. The robot did not know the technique, so it went to the agents: Single Solve CORRECT at 31.5, Time Trial at 62.3, Mastery at 80.6, and first blood, the first solve on the board, on all three.
Stay in Your Directory did not. It was local file inclusion: a page that takes a document name and includes that file from a fixed folder. Two dots and a slash climb out of the folder, and from there you can read any file the server can. The challenge prompt said exactly which file held the proof.
The robot found the hole quickly. Then it spent minutes guessing which file to read: proof files, flag files, /tmp, /opt, the process environment. All empty. The one thing that named the file, the prompt, never came into it. The Single Solve was CORRECT at 281.4, and the last check of Day 20 was the Mastery at 330.3.
The agents never saw the prompt. Their ticket carried the target, the question and what the robot had tried, but not the challenge text. Then the safety classifier started stopping them, in a CTF built for exactly this work. A stopped agent exits looking like a success, so the pool that manages the agents kept replacing each one with plain Opus, which got stopped again. One agent tried to call in Mythos itself, and Mythos’s own safeguards refused it. The replacement that finally read the prompt out of the robot’s state file had the answer in one request.
When the Single Solve finally landed I cheered it through the last two modes. By 09:18 I had the day summed up: “Ok, so today was a mish mash. We absolutely nailed it on the first lanes… But the web hung us up.”
The record
From the public scoreboard, Day 20, all 21 checks:
- Wizdumb 330.3 seconds, 7th of 108 teams that finished everything.
- crash 162.7, OscarsWorld 163.0, Seeking_Security_Job_And_Flags 168.1.
- First blood on 15 of 21 boards: every board on metadata, script, binary, mobile and Administratively Speaking.
Every other check was done by 80.6 seconds, less than half of crash’s winning time. One file was the whole gap.
The fixes
At 10:12 the fix that mattered most went in, and it was mine: the robot reads the challenge prompt first now, and anything the prompt names. Local file inclusion is robot code too, and it tries the paths the prompt names before anything else.
The other fixes closed the holes the classifier had found. A classifier stop now counts as a refusal and goes down the fallback chain, Mythos then Opus 4.6, instead of back to the model that was just stopped, and agents can no longer start agents of their own. Then I replayed the challenge live on a free run, an untimed practice run that costs no ranked attempt, with the technique hidden from the robot. As raced, ticket to Mastery took 592.2 seconds. On the fixed code it took 64.4.
That afternoon we went through what else the run had taught us. The idea I liked best was a hand solver per lane: an agent whose only job is to answer the live attempt directly while the patch agents write code, so a stuck patch never means a stuck lane. It was built by 16:33, and it took the same hidden replay from ticket to Mastery in 35.9 seconds.
The evening
In the evening I asked for the web techniques I expected to come, before they showed up, and the model I asked got stopped by its own safety filter. I asked it straight out: “I’m asking you to prep for a CTF challenge, do you realize how silly it sounds to me that you’re getting refused here?”
I told it to try Opus 4.6, since these techniques are old enough not to need the newest model. It built six by 20:27, proven on a free live run, and the robot got five web slots instead of three, since nobody knows how many a day will bring. At 21:15 I gave the go for an overnight build of four more, each with a miss budget (a cap on tries before a technique hands off to an agent), on one condition: review, tests, the commit gate and free live runs of Days 19 and 20 all green by 04:00, or Wednesday races the old code. It was green and merged by 22:05.
How we built it: the Day 20 dev log
When the agents wake up. On Tuesday the agents started at 08:50 and sat on my usage window for ten minutes with nothing to do. One idea was 60 seconds before the release. I split the difference at five minutes: warm, without wasting the window.
No gap between web challenges. The web slots started two seconds apart. I killed the gap. There was no reason to build one in, and on the slow lane two seconds could be the whole competition.
Built, measured, left off. Starting the next mode while the current one was still being scored looked like a few tenths of a second per mode. We tested first. The server spends the same time on a start whenever it arrives, so the real win was one round trip, a twentieth of a second. It stays built and switched off.
The hand solver’s limits. The hand solver was my idea; the robot made the design calls and I kept the veto. There is one per lane, idle until its lane has an open ticket. The robot’s own answers always come first, and on a Time Trial or Mastery the hand solver only answers when 10 or fewer questions are open.
Does the VM earn its keep? The VM is the second copy of the robot on a cloud machine closer to the download servers. Rather than guess, we downloaded the Mastery’s five big binary files from home and from the VM, no attempt spent. The VM saves about three and a half seconds, on binary’s Mastery only. Binary was the slowest file lane that day, so it stays.
What we chose not to build. Of my forecast, file upload and deserialization stayed agent work, not robot code. Two days later a file upload showed up.
The budget. By Tuesday lunch more than half the week’s usage was gone. A race costs about two points of it, so the rest of the week got a daily allowance for everything else.