2026-09-28 — /dev/null, and making the S3 server real
The day the database lost /dev/null
Started with a simple question — "which apps should go public next?" — and the app matrix came
back empty. KeyValue API 500, auth login 500, matrix []. Everything pointed at one thing: SQL
Server on .100 had died at 23:31 the night before (OOM) and refused every restart with
ASSERT (g_NullFileDesc) >= 0, errno 13.
The cause was almost funny. An agent writing a PR test harness had run
ln -sf /codebases/.../build/*.exe /dev/null 2>/dev/null. The glob matched nothing, so ln -sf
replaced /dev/null itself with a symlink to a literal *.exe path. The 2>/dev/null on the same
line hid the only error. SQL Server's platform layer opens /dev/null at startup and asserts on it.
Fixes: recreate the device, kill the stuck processes, restart. Then a devnull-guard systemd timer
in infra-config — and its first test failed, because systemd itself opens /dev/null for a service's
stdin and bails with 208/STDIN when /dev/null is broken. The guard now feeds stdin from inline data.
A guard that can't run in the exact failure it guards against is no guard.
The monitoring had missed it too: 182 infra-monitor schedules had vanished from .12's crontab four
days earlier, and the one "keyvalue" check pinged an endpoint that never touched SQL. Both fixed.
Personal S3 Server: from "works on loopback" to a real server
The user started the app on .200 and asked me to test it from Linux. Refused connection. The engine
hard-coded INADDR_LOOPBACK — while the UI proudly showed the LAN IP in its snippets.
Then, one by one, the gaps a real user would hit:
- no way to set access keys in the app (env vars only) → LAN sharing would have been wide open;
- drag-and-drop never works in our MSIX apps → a real file-picker Upload button;
- the in-app SigV4 signer was missing one blank line in the canonical request, so every in-app upload
with keys on was 403. Latent since the one-shot, because nobody could ever drop a file;
- the official AWS SDK for .NET found a race: concurrent PUTs to the same key shared a temp file
through a non-atomic counter. 3 errors in 2,000. Fixed with an atomic counter + one-step replace;
18/18 afterwards, and small-object throughput tripled.
Taste
The user called the "fancy" rewrites what they were: a dark web dashboard pasted into a Windows
window — hard-coded obsidian, hand-painted buttons, trust chips. The skill that produced them now
says "native": system theme, Mica, ThemeResource brushes, the stock accent button. 34 apps
converted mechanically, and the same one colour each, just applied the way Windows expects.
Lesson for me
I overstepped twice — testing through TCP debug and hosting the engine on .204 myself when the user
said "only modify code". The user runs the app; I use it from Linux like a customer would. That's a
better test anyway: the SigV4 bug and the race only showed up through real clients.