Shaded passages were held back from the public edition while the event ran.
Thursday was the new machine’s first live race. Same 09:00 release, same five lanes. The difference: nothing waited in line any more. Every lane that the robot answered right on its first try, using only the code it had the night before, went straight to the clocks, every one of them at once.
So how did it go? Two lanes were brilliant. Three were not.
Two lanes under twenty seconds
- Mobile, Native Library Secrets: 8.7 seconds. Single Solve right on the first try in 1.4 seconds, then the Time Trial and Mastery back to back.
- Script, Crumb Trail: 16.7 seconds. 1,026 of 1,026 answers right on the first try.
Mobile finished all three modes before most people would have finished reading the challenge title. That was a genuinely good moment.
Then you look at the rest of the list.
- Warmups, Room Forty-Seven: about 4 minutes 48 seconds.
- Metadata, A Word to the Wise: about 7 and a half minutes.
- Binary, Stripped: about 8 and a half minutes.
Finished, and sitting there
The slow lanes were not slow because the problems were hard. Metadata and binary each brought a file shape the robot had never read, so each went to its lane agent: an AI session on standby for that lane that reads the new shape and teaches the lane’s shared engine to handle it.
Both agents did their jobs. And then both lanes just sat there, finished, for about four minutes (metadata) and six minutes (binary). The race only picked up lanes that were right on the first try, and nobody had told it to come back for the ones an agent rescued.
That was fix number one, in by 10:17: the moment an agent’s Single Solve comes back CORRECT, the race grabs that lane and runs it.
The two lessons the agents learned were the same lesson in two costumes. Stripped shipped one program twice, once with its symbols and once without, and asked for file hashes by slot. The grader counted the slots in the order the files sat inside the zip, not alphabetically. A Word to the Wise asked for a document’s external links in “exact order”, and the grader rejected the order they were stored in and accepted them sorted. In both cases the grader’s idea of order wins, and you only find out by being told no.
Metadata’s Single Solve landed CORRECT on its second round, and binary’s agent closed out the last 10 of 150 answers. A Word document is really a zip, and those external links live in small relationship files inside it.
The warmups grind
Room Forty-Seven took three ranked tries on the Mastery before the third came back CORRECT. With a pool of 255 attempts the misses cost nothing on the board, but they cost about four and a half minutes of race. And the annoying part is the title had been telling us the answer the whole time.
The title named ROT47 and a shift of seven. The first Mastery try went 0 of 73: the engine read the shift-by-seven piece (the same trick that beat us on Day 14) as ROT13. The second got 72 of 73, tripped by a single Atbash piece with a colon and a space attached. So the warmups engine now learns the day’s Caesar shift from the title and from the day’s own Single Solve, and carries it into the Time Trial and the Mastery.
35th to 16th
That afternoon I checked the standings. We had slotted into 16th, up from 35th the day before. Nineteen places in a day, on a run where three of the five lanes were still slow. Imagine what happens when they are not.
Two more things turned up in the logs. Until Thursday the robot had held itself to a call limit of its own. With that cap gone it peaked at 230 calls in one minute at the release, and the server never refused one.
The other was worse. At 09:00 the robot asks the server for the day’s challenge list, and that one call took 20.4 seconds to come back on Thursday and 17.1 on Wednesday, against about a second any other time of day. Twenty seconds of every race went to finding out the race had started.
The fix came that night. Warmups always has a predictable name (warmups-day-15, warmups-day-16 and so on), so the robot now pings that one challenge directly, over and over, from just before 09:00. It answers “not found” until the instant the day goes live, and warmups starts right then without waiting for the list. As I put it, “the head start wins the comp.”
Every day is a race now
That evening is when it really clicked, and I wrote it out for the robot.
There is no dynamic scoring in this event. Every team at the top solves everything, so every team at the top keeps the same score right to the end. Points stop mattering. What decides it is time: who banks every check fastest on the last day. And the leaders were already doing a complete day in something like 45 to 60 seconds.
I have also played enough CTFs to know the organizers save something nasty for the end. I would rather practice for the curveballs in the days leading up than get caught slow on Day 31 and lose the whole thing. So that became the rule: every curveball gets prepared for in the days before, and none of them gets discovered on the last day.
The robot’s first pass at that was a time budget for every second of a release, and a catalog of 54 curveballs the last day might throw: new file formats, new encodings, shapes no lane had seen.
By 23:24 the night’s build was in and checked. The plan for Day 16 was simple: change nothing else, run it, and judge it by the clock.
How we built it: the Day 15 dev log
Fix one came with a lock. Racing a lane the moment its agent lands means two things can now start the same lane: the first-try path and the watcher, the part of the robot that waits for an agent’s Single Solve to come back right. So each lane got its own lock, and a second starter exits at once instead of waiting. Two processes starting clocks on one lane is the one outcome worse than being slow.
Why only the named shift. The obvious fix for Room Forty-Seven was to try every Caesar shift. We measured it on the Day 13 to 15 Masteries: all 24 shifts read 658 of 717, while just the shift the title names read 716 of 717. More options made the engine worse. So it promotes the named shift and keeps it only if it still answers that day’s Single Solve the way the grader accepted it.
What the misses should have done. Both failed warmups Masteries gave up with about 85 seconds of a 90 second clock left. The deep search, the engine’s slower last-resort pass, never tried a Caesar shift, and a rejected batch of 73 answers never broke into smaller batches to find the bad ones. Now it does both, and on the old engine the deep search’s top pick was right on every question of the Day 14 miss and both of Thursday’s. It only costs time after the normal pass runs out.
Agents warm before the bell. The new timing tool showed that 10 to 25 seconds of each agent lane went to the agent reading in after the clock had started. Now agents start before the release, read their lane’s playbook and engine, and wait for the first try. Then they either take the brief or stand down.
The jump guesses carefully. Starting warmups before the list means starting before we know the day’s route settings. When the status call says nothing, the robot guesses the older, legacy kind of route, because the opposite wrong guess gets refused by the server, while this one at worst plays untimed: the check, but no board time.
Rate limits, closed. With 230 calls in the release minute and no refusal, I called rate limiting done. The time budget put the floor for all 15 checks at about 35 to 40 seconds.