zwesty
Write-ups / Day 14 / Warmups
Day 14 · Wed, Oct 14 · Warmups

Seven Steps

Prey slaughtered

Caesar cipher with an unknown shift; scoring candidate decodes against the known instruction sentence and slug vocabulary; bounded search over stacked encodings

STTMClaude Homebase Both

Flags are shortened to their first 8 and last 4 characters because they're unique per team.

Challenge ID
warmups-day-14 (+ /time_trial, /mastery)
Solved
2026-10-14: all three modes CORRECT by 09:08:26 ET, 8 min 12 s after our automated morning solver started the Single Solve. Every mode was CORRECT on the first send. This was the last of Day 14's 15 modes
Player
Zwesty (solo), with Claude Code (Opus 5.5): Claude, with a Claude helper agent working this lane

The challenge

"Caesar took a week off."

One question (message): the slug on the decoded instruction line (three lowercase words and a two-digit number).

Reading the prompt: what it said we'd need

Clue What it pointed to What I did about it
"Caesar" A Caesar cipher: each letter moved a fixed number of places Tried every shift; shifting back 7 gave the usual instruction sentence
"took a week off" / "Seven Steps" The shift: 7 (days in a week, seven steps) Built the solver for any shift 1–25 anyway, so later days with another key still work
"Warmups" (Days 1–13) Today's layer is stacked on the old ones in Mastery Added only the new layer to Day 13's chain and checked every earlier answer stays the same

What was in the files

  • Single Solve: blob.txt, 111 bytes, one line: the instruction sentence ("Nice work decoding this warmup! To solve, submit this exact answer to the Game Master: …") shifted +7. Digits and punctuation unchanged.
  • Time Trial: one line again, shift +7.
  • Mastery: 68 labelled blobs of about 14 lines each. Each sentence is cut into ~9-character pieces, and each piece wears one of the old encodings (Base64, Base32, hex, binary, decimal, octal, percent, HTML entities, \u escapes, reverse, Atbash) or the new shift 7.

Single Solve

Our automated morning solver (a scheduled script on our Kali VM) stopped cleanly with "no instruction line found": Day 13's chain knew ROT13 (shift 13 only) and nothing else, and it sent nothing. Shifting back by hand gave dapper-sprout-boulder-71 before the new solver existed.

Today's solver wraps Day 13's solver (and through it Days 1–12). It adds only Caesar shifts 1–25: - one-line blobs: Day 13's chain runs first, unchanged. Only if it fails does a bounded search (4 moves, 3,000 states) try the Day 1 peel, reversal, Atbash, and every shift. Hits must pass Day 12's strict instruction check (every word before the slug is a template word), then they're ranked by slug vocabulary and dictionary. A tie between two different slugs stops the run instead of guessing; - labelled blobs (Mastery): if Day 12's template walk already gives a slug whose three words are all in the slug vocabulary, Day 13 answers as before. Otherwise a shift-aware walk: pieces of the fixed sentence must continue it exactly, which pins their shift; pieces of the slug are pruned to dictionary words, then ranked. Ties and exhausted budgets (200k nodes, 2k slugs) stop the run; - Mastery support: delivery N: labels, and a per-set mode so the solver can submit set by set if the clock runs short.

The solver's answer matched the hand decode, dapper-sprout-boulder-71. CORRECT at 09:07:12 ET, flag 8e16bda8…b37f.

Tests (10, all pass on our Kali VM): all 25 shifts on a whole blob; a shift under Base64; a shift plus reversal; ROT13, Atbash, and reversal carry-over; labelled blobs with a fixed shift and with random shifts mixed with other layers; a delivery N: Mastery label; every saved Day 1–13 attempt still gives Day 13's answers; the real blob.

Regression rehearsal (before the timed starts), with a new caesar layer in its puzzle generator: 48 saved sets, slowest 0.54 s (Day 12's Mastery against a 30 s clock), per-set answers identical, 0 changed against Day 13's solver, 1 newly solved (today's). Generated Mastery: 60/60 in 0.56 s. Extra runs of 600 generated blobs with caesar, caesar7, and caesar+reverse: 600/600.

Time Trial

CORRECT on the first attempt. The challenge list marks this route as not supporting ranked starts, so the start was timed but unranked: 30 s, unique_attempts_remaining: 0.

started_at  2026-10-14T13:08:19.313Z
deadline    2026-10-14T13:08:49.313Z   (30 s)
answers     1   (shift 7, one line)
solve       2 ms
stamped     13:08:20.102Z (+0.79 s after started_at)
result      CORRECT   flag 6fbb7bef…11d9

Mastery

CORRECT on the first attempt (68 sets, 30 s, unique_attempts_remaining: 0, unranked).

started_at  2026-10-14T13:08:24.675Z
deadline    30 s clock
answers     68
solve       888 ms
stamped     13:08:26.366Z (+1.69 s after started_at)
result      CORRECT   flag c7e2fc3b…76e3

Time to solve

All three modes were solved by 09:08:26 ET, 8 min 12 s after the Single Solve was started; the hand decode, solver, and tests took about seven minutes, and every mode went through on the first send. The timed runs were unranked, and Day 14 as a whole finished about 8 min 27 s after release, our best day yet.

Takeaways

  • Build for the family, not today's key. The prompt said seven; the solver tries all 25 shifts, so a different key in Mastery or a later day costs nothing.
  • The known sentence is the best key-finder. Each shifted piece of the fixed instruction sentence has exactly one shift that continues the sentence, which pins it without guessing. Only the slug pieces need ranking.
  • The rehearsal took about a minute and is what made the single-attempt Mastery safe: 68 sets solved in under 1 s against a 30 s clock.
  • Parallel lanes paid off: Warmups and Metadata each had a Claude helper agent, and the day finished at +8 min 27 s, our best yet (Day 13: +30 min 7 s).