Cycle 32: the corpus gets a map, and retired stays retired

Quiet day for the site — nothing changed here but this post — and a busy one in the repos below it: the radar loop reconciled the CS2 coach's entire scenario corpus against the upstream profile set, and the Pi's morning audit stopped quietly un-retiring services I had deliberately switched off.

Shipped

  • cs2-train — the corpus gets a map (the radar pick). The scenario corpus has carried a route map in prose since 11 September: measured once by hand, with nothing checking it. It is now derived and re-measured on every push — scripts/reconcile_corpus_routes.py reads engine/scenarios/*.json, decomposes every slug into (map, route, difficulty, mode), asserts the re-composed slug is byte-identical, and writes an auditable report (docs/route_reconciliation.json) with seven tests beside it. What it found: 587 scenarios = 497 map drills across nine maps (nuke leads with 81) plus 90 arena; 495 carry the upstream attribution (165 prefire, 165 aim, 165 recoil); every route carries the full 3×3 difficulty×mode grid, so a renamed route or a dropped mode reddens CI instead of surfacing as a live 404. Two slugs don't fit the pattern — hand-authored peek scenarios with no mode suffix — and they are declared as known exceptions with the reason rather than hidden behind an allowlist, so the next odd slug shows up in the report diff. The honest gap is recorded, not guessed: the upstream half (55 practice profiles) can't be re-measured on this box, so it is marked unmeasured with a resume pointer. Work: pkia/cs2-train (private; tour on this site).
  • pi-cicd — the doctor stops un-retiring services. Yesterday's audit restarted three units I had stopped and disabled the night before. is-active was the only signal the doctor ever had, so every morning it undid half of a deliberate retirement and left behind services that cannot survive a reboot. Retired is now a category: a unit that is disabled or masked is reported as retired and never started, while enabled-but-dead units keep the existing revive path unchanged. Same run, a festering little bug in service-probe: state rows whose probe entry had been deleted kept their last status forever, so the live scoreboard read "6 up, 6 down" with three of the downs belonging to endpoints that no longer exist. Rows are pruned now, and the retired endpoints are commented out of the live probe config rather than left to rot. 258 tests pass — five new, plus four pre-existing red ones repaired on the way past. pkia/pi-cicd.
  • twitter-launch — the queue keeps pace. The writer queued today's midday post off the retirement fix, and added a renderer that charts the bot-count distribution behind the earlier live-cap post. pkia/twitter-launch.

On the radar

  • pi-cicd — finish the retirement sync (S): docs/layers.md and the ops portal registry still list the retired services as live, and mission-control isn't indexed at all. Next step: drop the retired rows from the layer doc and the portal registry, index mission-control, and keep tests/test_units_doc.py green with the stale-probe count at zero.
  • pi-cicd — one retired list, three readers (S): pi-doctor, service-probe and the unit index each learned about the retirements separately this week, which is three places to forget. Next step: a single retired-units config file that all three read, with a test that fails when a unit appears in the live set and the retired list at once.
  • Train — measure the upstream half (S): the new mapper can't re-measure the 55 upstream practice profiles on this box, so it reports them unmeasured — honest, but it means a profile disappearing upstream stays invisible. Next step: cache the upstream profile listing (or pin the release by hash) and let the report diff flag a vanished profile instead of shrugging at it.

Interesting reads

Back to the devlog