The writing job, done. 89 new philes takes the store to 200, and every one
of them is now reachable in play — which turned out to be the harder half.
Where they live follows from the voice rule. Each phile is written by
somebody, in the year it happened, who did not know they were in a game —
so the board is 1991 and the board cannot carry a file about WannaCry.
the board seven read-online areas: g-philes, the law, the scene,
v i r u s, the iron, telephony, unix. Reading online is free
and downloading costs MTU, which is how a board actually
worked, and is the only way ~60 files fit inside an economy
built to make you choose.
the climb everything after 1992, because the climb is the only level
that travels forwards in time. Thirty-six years bolted to the
shaft wall going past at speed. You get the file for having
been there whether or not you turned your head.
the shell man(1) and cat(1) on kruuna, for the unix and network ones.
ctx.phile(id, ..., quiet) collects without a toast — thirty-six
notifications in fifty seconds is a wall, not a level. The count lands once
at the top of the climb.
Two real bugs found on the way:
handshake exit() guarded .tone instead of .b, and there is a window
between S.i++ and enter() where a boss is current but its
state does not exist. Leave via the traceroute map during a
title card and unmount throws. Async continuations now bail
on a dead level too.
the climb the camera does not travel, the shaft does. The new signs
were nailed to the origin and never came into view. They also
needed dark ink for the one zone whose walls are white.
tools/philecheck.mjs: duplicate ids in an object literal overwrite
silently, and that cost an hour. It also reports anything written but not
placed. 200/200 written, 200/200 findable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The last structural promise in the design doc. No level gets a chord any
more. Every bed in the game is derived from a real number belonging to the
era it plays under, and src/score.js says which one and why in a comment
above each line.
coldboot/stack 1000 Hz, the reference tone every piece of telecoms test
gear on earth agrees on. The fortress is tuned to a
calibration signal.
timewait 50 Hz mains and its harmonics. The room's own hum was
always the entire score; now the bed agrees with it.
war the 1800 Hz V.32 carrier folded down, with dial-up hiss
under it, because everybody on EFnet was on a modem.
smash 0x90 is the NOP. Read as a number it is 144, so the sled
has a pitch and the level is tuned to the byte you slide
down.
worm seven partials, and the seventh one is detuned. One in
seven, as a chord.
cuckoo 45.45 baud — the Model 33 rate, 22 ms a bit. Fifty of
them in a basement is what he actually heard all night.
board the 1200 Hz V.22bis carrier folded four times, which is
the doc's exact phrase: a modem carrier detuned into a
pad.
shell the 750 Hz terminal bell over Helsinki's 50 Hz mains.
handshake silence. The fight is the score; anything underneath is
noise competing with the only thing in this game that
has to be listened to.
copper 20 Hz ringing current, 50 Hz mains, and Strowger stepping
at ten pulses a second. Three real clocks, and the
cathedral is the beat they make against each other.
bluebox the six MF tones at once. That is literally what is
inside a blue box.
climb all of it, layered.
root 2600 Hz folded six times until it is a low room tone.
The number the whole game turns on, finally at rest.
ESTABLISHED gets its own cue rather than a bed: 350 and 440, which is the
dial tone the handshake arena opened on and called the sound a line makes
when nothing is happening — with something finally on it.
Fixed while building: the pulse gate was driven by a bare square
oscillator swinging -1..+1, so its off half was not silence, it was the
same tone phase-inverted. Tremolo where a clock was wanted. DC offset now.
All 14 hops swept clean, and no voices leak between them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The uname escalation. rms does not get angrier, he gets tireder — each
interjection shorter and flatter and typed faster than the last, down to
"GNU/linux.", then "...", then "no. i am not doing this again." And then
he stops trying to change your mind and goes and rebuilds uname so that it
says GNU/Linux, and installs it, and does not ask anybody.
Which is, in fairness, the entire strategy. He never won the argument
about naming and was never going to. What he did instead was write a
compiler, a linker, a shell, a libc and a debugger, put all of them under
a licence that forces everyone downstream to keep them free, and wait.
That part worked completely.
THE RETRAIN — the last cross-cutting system in the design doc that was
not in. Real modems renegotiated mid-call: the copper got wet, somebody
picked up an extension, the exchange rerouted you through a worse pair,
and the two ends stopped and did the whole handshake again in the middle
of your download. So now, once per run, somewhere after hop 51, wherever
you happen to be standing, the line goes and takes a baud rate off you.
The way back is the beat you were taught at hop 47: SPACE on the ANSam
phase reversal, 450 ms, four clean ones. Spamming it fails, correctly.
Terminal levels opt out with noRetrain, because taking SPACE off somebody
mid-sentence is not a mechanic, it is a bug with a story attached.
Fixed while testing: the reversal flash was decaying on a setTimeout while
the beat it was cueing ran on dt. Two clocks for one event. Frame-based
now, which is both more correct and the reason the win path is reachable.
75 philes. All 14 hops swept clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Day three of THE BOARD already names what kills it: about a third of you
have got shell accounts now and are not calling any more, and i do not
blame you, because it is better, it is genuinely better. The player never
got to see it. Now they do, immediately afterwards, while the board's
ghost is still warm.
kruuna.helsinki.fi, 1991. It connects instantly, with no dial tone, no
ring and no busy signal, and that silence after eight minutes of the board
is the whole opening beat. who(1) shows the people who are on the machine
at this second, against a board that had forty-four users in nine years
and could hold one at a time. talk(1) puts every character on screen as it
is typed, because that is what talk did. And make compiles a kernel in the
top four lines while you carry on using the shell underneath it — two
things at once, demonstrated rather than stated, which the board could
never do.
Then the interjection. rms has been on ttyp7 since six in the morning. He
waited until the level printed a whole operating system over a build log
in which every single line is gcc, and then he opened a talk request, and
he is right. If you never answer it he leaves mail instead, because of
course he does.
The closing speech now credits the compiler, the linker, the shell, make
and libc, which were all finished and free years before the kernel was.
74 philes. All 14 hops swept clean. README and STAGES.md brought current.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three holes closed:
philes — 40 written, all in src/philes.js so the next 160 is a writing
job and not a code job. P opens a reader: list on the left,
the text on the right, attributed to whoever wrote it in
whatever year they wrote it. Every level now drops at least
one; previously you collected files you could never open.
save — ESTABLISHED. Every hop writes level/ttl/hop/baud/philes/
cargo/flags to localStorage, and the boot screen offers
R — RESUME. A 64-hop game with no save is not a 64-hop game.
MTU — the HUD has been showing your MTU drop as you take files off
the board while nothing happened. Now two files are free and
after that you arrive in pieces, one TTL per extra fragment,
every hop. You can put things down again from the traceroute
map. Lore costs distance, which is the economy the whole
design is built on.
All 13 hops re-swept: clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
You are SYN. You want ACK. Root is the only one who can give it to you.
Three load-bearing ideas, all working:
- TTL is the health bar and it only goes down. 64 hops, no healing.
- Bandwidth is resolution. One render target, one shader; at 1200 baud
and below the 3D scene renders as ASCII glyphs.
- Every header you drop is a piece of clothing. Seven wireframe shells,
one per OSI layer, shed on the way down.
Every frequency is the real frequency, synthesised, nothing sampled:
350+440 dial tone, the DTMF matrix, R1 MF pairs at real KP/digit timing,
2600 Hz, ANSam at 2100 reversing phase every 450 ms, Bell 103 FSK.
Thirteen hops, each a different genre over one renderer — FP tutorial,
OSI descent platformer, walking sim, EFnet twin-stick, 2D buffer overflow,
Morris worm RTS, LBL terminal stealth, a whole BBS with a playable LORD,
the five-boss handshake arena, the copper, a playable blue box, the climb,
and an empty room with an ACK in it.
No engine, no build step, one vendored three.js.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>