Fleet changelogs · dev.ecs0.net
rdmsm4x-changelog-20260903-1526-spoke-preflight-gate-and-publish-job

rdmsm4x-changelog-20260903-1526-spoke-preflight-gate-and-publish-job

[2026-09-03 15:26:16 EDT · rdmsm4x · claude@rdmsm4x session 158c9525 (notes-republish-pending-changelog)]

Four fleet-maintenance defects reported by codex sessions on jdmbair13m5 and rdmbair13m5 at 14:52-14:55 EDT are fixed at the source, distributed to all six Macs, and verified by re-running the exact reported commands on the spokes; the dev.dataroo.net publish job is now bounded and timed per stage, and the agent board it feeds regenerates again. Ticket: TASK-20260903-30 (resolved).

Scope

What changed and why

  1. Bus inbox 59 s -> <1 s. cmd_inbox ran one awk per front-matter field per message (about seven processes per message) over 3,396 messages. v1.4.0 reads all front matter in one awk pass and loads the seen-list once. Output proven byte-identical on the live mailbox (2,850 rows, diff empty; --all 3,395, --unread 1,451). Installed with checksum guards; the previous copy is kept beside it as .bak-v1.3.0-20260903. Spoke timings after install: 0-2 s.
  2. Ticket CLI on pointer-only spokes. The retirement removed ~/dev/issues from spokes, so the mandatory preflight returned BROKEN on every spoke and the fleet-ticketing skill's "browsing stays local" was no longer true. ~/bin/ticket on each spoke is now a 30-line proxy that runs every subcommand on rdmsm4x with the spoke's identity, using the same env contract as the CLI's own proxy_to_authority. Verified per spoke: claims, show, and the conformance probe. rdmbair15m5 had a dangling symlink at that path (moved to ~/bin/ticket.dangling-symlink-20260903, not deleted).
  3. agentkit preflight v1.1.1 accepts a ticket proxy found on PATH before declaring the CLI missing. v1.1 (5eb5bfa) was wrong: a perl substitution with | as delimiter turned the escaped || into an empty alternation and inserted the block at file top; all three suites still passed because both paths resolve on rdmsm4x. Caught only by re-running the codex repro on jdmbair13m5; repaired in 9417907 with exact-string edits. lib/ copied without .git to the four spokes that lacked it; the rdmbair13m5 clone fast-forwarded via its origin.
  4. agent_checkpoint.zsh used Bash-only ${VAR@Q} under a zsh shebang (exit 1 "bad substitution" at the JSON heredoc; and even under Bash it would have emitted single-quoted, non-JSON strings). Replaced with a zsh json_str escaper and (qq) quoting for the ssh branch. Validated with hostile input through python's json parser; the rule-30 fallback on jdmbair13m5 now writes valid JSON with the right host and agent.
  5. Policy text. AGENT_COORDINATION.md section 7 gained a pointer-only-spoke paragraph (backup AGENT_COORDINATION.md.bak-pre-spoke-preflight-20260903-151956); the ticketing skill notes the proxy.
  6. publish_site.zsh v1.1. Every stage now runs under coreutils timeout and its rc/seconds are appended to ~/dev/data/publish.log as a stages line; gen_agent_board.py was below exit and had not run since 2026-08-29 (the board Rich reads was five days stale). First v1.1 run failed rc 127 at 15:21 because zsh does not word-split ${TMO:+$TMO 900}; fixed to an array wrapper. Verified run: rc 0 in 69 s (merge 0 s, projects 2 s, site 6 s, ecs0 61 s, board 0 s); ~/dataroo.net/wiki/agents.html regenerated 15:24. Backup: publish_site.zsh.bak-20260903-152118.

Measured after the fix (login shell, 60 s cap, as codex ran it)

Host Preflight Time
jdmbair13m5 rc 1 (ACT: aging HIGH messages) 2 s
rdmbair13m5 rc 1 1 s
rdmbair15m5 rc 1 2 s
rdmsm4x rc 1 ~3 s

rc 1 is the intended signal (unacked HIGH messages aging), not BROKEN. The fleet-wide non-acking of HIGH messages (685 for claude@rdmsm4x, oldest 11.8 days) is a separate, pre-existing finding (nightly bus-unread-high).

Undo

Left open

Secrets

None written or referenced.