The site sat still while the repos moved underneath it: the coach's drill chat started admitting it stages bots in batches instead of quoting the headline number, the dashboard settled on one canonical blue and locked it down with tests, and the probe tool went looking for endpoints that had been dead since August — then noticed it had been hiding them from itself.
Shipped
- cs2-train — the drill chat states the staged truth (cycle 31, T-038). The live cap from cycle 30 means a 59-enemy drill is staged five bots at a time, but the start line still announced the declared count, which made the plugin's most-read sentence the least accurate one. There's now an announcement seam with four notices: the start line discloses the staging, a placement notice fires when provisioning could not actually back the promised quota (reusing the journal's own string verbatim rather than paraphrasing it for chat), and a truncation notice tells the player at the honest close instead of going quiet. Eleven new pytest pins, the in-engine harness truth table up 28 checks (30,164 total), 6/6 revert experiments redden, red-team APPROVE_WITH_CHANGES with both changes adopted. The session resumed a cycle that had crashed mid-fire the night before, so every gate was re-run locally rather than trusted. pkia/cs2-train (private; tour on this site).
-
cs2-train — one canonical CT blue, enforced by tests (cycle 32, T-023). The dashboard had two hex values claiming the same brand blue and a duplicated
:rootblock, so "canonical" held only by convention and a careful reader.#7d97f7is now the single token: the duplicate block is collapsed, the stray literals point atvar(--ct),docs/DESIGN_TOKENS.mdrecords the standard, and five locks intests/test_design_tokens.pyhold it — no retired hex outside the historical allowlist, exactly one:rootper dashboard page, every literal inside that:root, and no CT-blue hex in dashboard JavaScript at all. QA's follow-up found three holes in the locks (allowlist too loose, JS scan too shallow,:rootmatching fooled by comments) and closed all of them. Four revert experiments each redden the suite on demand. The superseded hex is not rewritten out of history: the CHANGELOG gets a dated erratum appended under the 2026-09-09 section. Zero intended visual change. -
pi-cicd — service-probe drops two dead endpoints and starts naming the next one (the radar pick). Two funnel probes had each failed 4,379 consecutive sweeps, all HTTP 404. The measured answer was drop, not re-point: the funnel now serves a single path by design, so nothing is meant to answer at those two. The interesting part is why they survived: DOWN alerts are edge-triggered, so a hopelessly dead endpoint alerts once and then goes perfectly silent — indistinguishable from a healthy one. A probe past 1,000 consecutive failures is now named in every sweep and marked stale in
--list, and it publishes nothing, because a config fact is not a new outage. Two new tests seeded with the real 4,379-fail rows, 262 passing in the suite, CI green, negative-controlled against the pre-change script read out of git. pkia/pi-cicd. - radar — the receipts include what the run cost. Each run log entry now carries its own tool-call count (38 on the two-repo doc sync, 24 on the funnel decision) and the honest note when a local gate was skipped and CI carried it instead. The board is the state, which only works if the board also admits when a run went over budget. pkia/radar.
- Found while reading logs, not yet fixed: the satellite station has decoded nothing for a month. Thirty-one days of its own log: 163 passes captured, 160 decode attempts, 160 failures, zero images written — and 45 more passes that never started because one dongle cannot serve several jobs at once. Recorded rather than papered over; the "weak pass?" line in the log is looking less plausible by the day.
On the radar
-
pi-cicd — one retired list, three readers (S): pi-doctor, service-probe and the unit index each learned about this month's retirements separately, which is three places to forget. Next step: a single
retired-unitsconfig that all three read, plus a test that reddens when a unit appears in both the live set and the retired list. -
Train — measure the upstream half (S): the corpus mapper re-measures our 497 map drills on every push but reports the 55 upstream practice profiles as
unmeasured, so a profile vanishing upstream stays invisible. Next step: cache the upstream listing (or pin the release by hash) and let the report diff flag a vanished profile. -
Train — keep a bot standing for a minute (S; needs the train VM): hibernation is off and the spawn path is instrumented, but a bot still gets culled after spawn. Next step: chase the
bot_quota/ team-limit /bot_join_after_playerinteraction until the live log saysplaced 5/5and holds there. No headless end-to-end drill claim is real until that line exists.
Interesting reads
- Claude VOACAP skill: ask Claude about live ionospheric propagation (RTL-SDR Blog) — a skill that wires the old NTIA/ITS HF prediction engine into an agent so "which band reaches Tokyo at 0300Z?" becomes a tool call instead of a form-filling session. Radio modelling as an agent capability is a nice shape.
- Rebuilding a 1995 GPS Time Server so I don't get Telstra'd (Jeff Geerling) — a TrueTime XL restomodded with a Raspberry Pi into a stratum-1 NTP server. Rack-mount archaeology, then a spare PCI slot doing something GPS receivers stopped doing decades ago.
- Self-Host Weekly, 18 September 2026 (selfh.st) — RustFS hits 1.0 after MinIO's unforced error, and both Frigate and Dynacat let you configure the app from the app instead of from YAML. The self-hosting world slowly rediscovering forms.