KOM CLOUDSERVICE
All entries

Back to Back

Thursday: Day 22 in 89.8 seconds, 1st on the day by 26.9 seconds and still 1st overall out of 1,476. Four file lanes done in under 13 seconds, two new web techniques in about a minute, and one binary challenge that asked old questions in new words.

Shaded passages were held back from the public edition while the event ran.

Wednesday we won the day by 5.3 seconds. Thursday we won it by 26.9, and stayed on top of the whole event.

The night before

Wednesday afternoon’s fixes started with a new reset operation I spotted in the Game Master’s API, a fresh web target on the same attempt, and ended with the agents’ tickets carrying everything the robot had already seen. One last rehearsal against a local copy of the server came back clean.

09:00

  • Root of Trust (mobile): all three modes by 7.9 seconds, 1st on all three boards.
  • Deflated Ego (warmups): the new layer was Base64 over zlib, one the robot had predicted the night before. All three by 9.0.
  • Next, Next, Finish (script): all three by 11.9.
  • Main Character Energy (metadata): it asked for a Java archive’s main class, a field we had never been asked for. Right on the first try anyway, all three by 12.7.

Twelve checks of twelve, right on the robot’s first try with the code it had the night before, all in under 13 seconds. On Monday the file lanes took 293.

The agents, the AI helpers on standby for each lane, came up five minutes early and then had nothing to do. None of those four lanes needed one.

The web

Two web challenges, both techniques this event had not shown us before. Forged With Care was cross-site request forgery, and Uploading Expectations was a file upload. Uploading Expectations’ Single Solve was CORRECT at 22.1 and Forged With Care’s at 33.1, and they were done with all three modes by 56.3 and 62.7. We took first blood on five of the six web boards; OscarsWorld beat us to the upload Mastery by 2.2 seconds.

Neither technique was in the robot, so both went to agents. When the robot cannot answer it writes a ticket, a short report of the question, the target and what it tried, and Wednesday’s richer tickets paid off: ticket to answer took 12 and 18 seconds, where it had been half a minute or more. Each agent’s fix then carried its Mastery onto a fresh target on its own.

The binary

Bridge Troll set the pace, for a reason that still makes me laugh. Of its 27 open questions, 26 asked about things we had already solved on Days 15, 16 and 21. The wording had changed, so none of them looked familiar to the robot. The one truly new question asked for the file’s format from a fixed list of choices, and the right choice was spelled differently from the answer an earlier day had accepted for the same fact. The Single Solve was CORRECT at 52.8, the Time Trial at 78.6, and the last check of Day 22 was the Mastery at 89.8.

Behind the scenes it was messier than it looks. The robot sent the old spelling as a sure thing, and since one wrong answer sinks a whole batch, 238 answers bounced and had to be sorted out one round at a time. On the Time Trial, the judge, the automatic test every agent fix must pass before it goes live, refused six fixes that would have made Day 22 right by breaking Day 3. And a helper agent had every answer ready by 76 seconds, held back by a safety cap that never said it was holding them.

team.dev did Bridge Troll in 25.3, and we were 3rd on all three of its boards. It did not matter. Three minutes after the release I was telling the robot we were in 1st again.

The record

From the public scoreboard, Day 22, all 21 checks:

  • Wizdumb 89.8 seconds, 1st of 91 teams that finished everything.
  • OscarsWorld 116.7, NyaSEC 212.5, im1ssher 252.6, ampinfosys 273.0.
  • First blood on 10 of 21 boards.

Overall, 1st of 1,476. 88 teams have all 1,220 points, so it comes down to whoever banked their last flag first: ours at 09:01:29.8, OscarsWorld’s at 09:01:56.7. Wednesday night our lead over crash was 5.3 seconds. Tonight it is 26.9 over OscarsWorld. Nine days to go.

The afternoon

The fixes were in by lunch. The binary engine, the shared code for that lane, reads the new wording and only answers from the list, the two web techniques are robot code now, and a fresh agent fix gets used the moment it lands instead of after the robot has tried everything else. The binary replay, a rerun of the solvers over every recorded attempt, went from 88.1 seconds to 54.2.

With the race in hand, the afternoon had room for something else. In my words: “Make no mistake, we are laser focused on the same primary goal, that hasn’t changed. I’m just looking to try to get near the top on some of the leaderboards again.”

So in the evening I went after the speed boards, the ones that rank each team’s best time per mode, with ranked reruns that count for the board. The first ten were all CORRECT, from 0.66 seconds on our clock for Deflated Ego’s Time Trial to 5.6 for Stored for Later’s Mastery, whose board time was still 65.6 from race day. More of that tonight.

How we built it: the Day 22 dev log

How the web lane grew. Four days, four answers to the same question. Day 19, we solved web by hand. Day 20, agents did it, blind, and one challenge cost nearly five minutes. Day 21, agents carried all three challenges and their fixes carried the later modes. Day 22, agents answered in 12 and 18 seconds, and by lunch both techniques were robot code. Same pattern every day: an agent solves it live, its fix gets judged, and the general version goes into the engine for tomorrow. Each lane is a thing that learns, not a pile of one-off solves.

Why reset is only a fallback. The API spec says a reset “ends a running ranked run”, and we have never tested what that means on the clock. So on a ranked run the robot only resets when the target is dead and nothing has been answered yet, when there is nothing left to lose. On a free run, an untimed practice run, it resets any broken target before it bothers an agent.

Why an API change is a notice, not a failure. The morning check compares the live API against a pinned copy. A new field or operation should never stop a race at 08:30, so a change only prints a notice. The one thing that fails the check is an operation we depend on disappearing, because then the race would fail anyway.

What we left alone. I brought a checklist of six networking tricks, and the traces had already answered it: not one connection stall in the first minute of the last two races. We built nothing. Same with the slow binary downloads: my first guess was the house network, the robot’s was a per-connection limit, and it was the server, on both machines. I froze the VM and the download path rather than tune something we could not measure. Not building is a decision too, and most days it is the right one.

Why the guard went where it did. Bridge Troll’s bad answer came from the binary engine, but any lane could send a sure answer that is not on its question’s list. So the guard sits where every answer passes through, the submitter. We checked it against every enum answer the grader has ever accepted, over half a million, and not one was off its list. On good data it costs nothing.

Why the patch races instead of replacing. A patch fitted to one target can miss on the next, the way Stored for Later’s did on Wednesday. The robot’s own techniques are the backstop, so throwing them away would trade a few seconds for a stall. Now both run and the first to finish wins. That touches the clock path, the code that runs while a timed attempt’s clock is ticking, so it got two Opus reviews before it landed.

Why the speed runs use a separate copy. The evening runs chase board times, and the morning race chases Day 31. They must never share half-changed code, so the speed runs go from their own copy with the agents off, and nothing done at night can touch the race at 09:00.