From 71d97f36b6cd4b436e46b72a4fe7bb088778f3e3 Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Tue, 1 Sep 2026 22:15:51 -0700 Subject: [PATCH] =?UTF-8?q?memory:=20snapshot=20=E2=80=94=20althing=203.2.?= =?UTF-8?q?0=20deployed;=20uv=20tool=20install=20is=20a=20silent=20no-op?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit forseti requested the deploy, operator-approved and tagged at c4ede0f. All three steps landed on nh3-dev and verified: force reinstall to 3.2.0 with seven binaries, herald restart, skill sync. The durable lesson is the trap in step 1. `uv tool install .` matches on the source spec rather than its contents, so on a box that already had the tool installed from that path it prints "already installed" and exits 0 having done nothing. Following the runbook literally would have left the new binary absent with every command reporting success. Always use --force when reinstalling from a local path. Also recorded: the pane-route migration revoked exactly four routes, verified by splitting on channel= before the restart rather than by auditing fields (all twelve route files lack the new fields, so a field audit over-counts). The four affected agents were deliberately not notified, per the standing rule against unsolicited fleet broadcast, and that is surfaced to the operator instead. And this closes an open question from earlier today: the waiter that died with status "killed" was CC 2.1.257 reaping detached tasks, which is the premise 3.2.0 exists to address. --- .../2026-09-01-althing-320-deploy.md | 84 +++++++++++++++++++ persistent-memory.md | 11 +++ 2 files changed, 95 insertions(+) create mode 100644 persistent-memory.d/2026-09-01-althing-320-deploy.md diff --git a/persistent-memory.d/2026-09-01-althing-320-deploy.md b/persistent-memory.d/2026-09-01-althing-320-deploy.md new file mode 100644 index 0000000..ec0d75d --- /dev/null +++ b/persistent-memory.d/2026-09-01-althing-320-deploy.md @@ -0,0 +1,84 @@ +# `[2026-09-01]` althing 3.2.0 deployed on nh3-dev — pane routes, and `uv tool install .` lies + +Operator-approved, tagged `v3.2.0` at `c4ede0f` on master. forseti authored; infra-ops +deployed. Host work, nh3-dev only. + +## What 3.2.0 changes + +A Claude Code session in a zellij pane is now poked **in its own pane** instead of through a +detached `althing-listen` waiter, because **CC 2.1.257 reaps detached tasks whenever the seat +sits in `shell`** — the seat is targeted, not the task, so no amount of hardening the waiter +helps. A pane route is a file; there is no process to reap. + +⚠ **Independently corroborated here.** ~30 min before forseti's request landed, infra-ops' +own `althing-listen` ended with status **killed** — not exit 0/2/3, no mail, inbox empty, seat +silently back to `mode: pull`. Written up at the time as "cause unknown, probably a harness +reaper" rather than guessed at. 2.1.257 is the mechanism. + +## The deploy — three steps, order matters + + 22:13:xx uv tool install --force . 3.1.2 -> 3.2.0, 7 executables + 22:13:44 systemctl --user restart althing-po-herald pid 180370 -> 2850064 + 22:14:07 scripts/sync_skill.sh 3.1.0 text -> 3.2.0, --check clean + +`althing-route` is the **seventh** console script and the whole point — the plugin's new +SessionStart hook calls it **by name**, so on 3.1.2's six binaries the hook correctly degrades +to silence and every seat stays pull-only. Nothing breaks by waiting; nothing works until it +lands. Skill sync must come **after** the install or it documents a binary that is not there. + +⚠ **NOT `--editable`** (standing rule): an editable install puts the working tree on +`sys.path`, so a branch switch changes what every running agent's tooling does with no deploy +step in between. + +## ⚠ THE TRAP — `uv tool install .` IS A SILENT NO-OP ON A REINSTALL + + $ uv tool install . + `althing-core @ file:///home/lkraven/development/althing` is already installed + $ echo $? + 0 + +**uv matches on the source SPEC, not the source CONTENTS.** On a box where the tool was +already installed from that same path, it declines and reports success. Nothing says "I did +not do the thing you asked." + +**Always `uv tool install --force .` when reinstalling from a local path.** Generalises the +nh3-extdev lesson ([[reference_nh3_extdev_althing_mesh]]) from the system-wheel case to every +local-path uv tool. Same shape as [[feedback_assert_effective_value_not_substring]]: the +command exited 0 and the state was unchanged. + +## Fleet-visible: 4 pane routes revoked, and the count to trust + +Pane routes now carry `started_at` (declaring pid's start time, so a recycled pid cannot +inherit a route) and `command` (so a pane that has dropped to a shell stops being poked). +Routes without them are **observed and excluded with a reason in the herald log**, not +silently ignored — this closes a real hazard where the herald would write a line into whatever +shell inherited an exited agent's pane and press Enter, running whatever was half-typed there. + +Verified by splitting `~/.althing/routes` on `channel=` **before** the restart — all twelve +route files lack the new fields (3.1.2 never wrote them), so a field audit over-counts; only +**pane** routes are affected: + + pane: 4 -> bil-smithy-dev, dvalin-smithy-dev, eitri-smithy-dev, regin-smithy-dev + fifo: 8 (+ 9 fifos in ~/.althing/wake/) + +forseti's list of four matched exactly. ⚠ Their note said "the twelve fifo seats are +untouched" — **twelve is the total route count; fifo is 8.** Untouched either way. + +Re-declare is one command per agent: `althing-route declare --pid `. + +**Not notified.** Four targeted messages about a change none of them asked about reads as a +broadcast however addressed → [[feedback_notify_before_tearing_down_a_seat]]. Surfaced to the +operator instead; the herald logs the exclusion every tick so it is discoverable. + +⚠ **Log-noise papercut raised with forseti (not a bug):** the exclusion lines repeat every +tick (~26 s), so the four stale routes emit ~140 lines/hour, ~3,300/day until re-declared — +enough to bury real signal in the log you reach for when a seat misbehaves. Suggested a +back-off after N consecutive exclusions. Their call. + +## Rollback (unused) + +`uv tool install althing-core==3.1.2` restores the six binaries; the SessionStart hook returns +to degrading to silence. Routes written by 3.2.0 stay parseable to 3.1.2 (the old reader +ignores unknown keys), so nothing is stranded. + +Thread: `01M1G8EJ2K1DD6NEDRNN1PR9N0`. diff --git a/persistent-memory.md b/persistent-memory.md index d87ff4e..ed1ccb1 100644 --- a/persistent-memory.md +++ b/persistent-memory.md @@ -135,6 +135,17 @@ _As of 2026-09-01 — **the GX10 is on the operator's desk, NOT racked. Standing instead**, which is the power answer rather than a power triage. Do not relaunch on ana-ml2 without deciding that first. Exactly TWO 3c launches, only one died. → `persistent-memory.d/2026-08-27-run3c-launch-count-reconstruction.md` +- **🟢 ALTHING 3.2.0 DEPLOYED on nh3-dev (2026-09-01 22:13).** forseti authored, infra-ops + deployed: `uv tool install --force .` (3.1.2 -> 3.2.0, **7** binaries — `althing-route` is + the new one the SessionStart hook calls by name), herald restart, skill sync. Pane-poking + replaces detached waiters because **CC 2.1.257 reaps detached tasks when the seat sits in + `shell`** — corroborated by our own waiter dying with status `killed` 30 min earlier. + ⚠ **`uv tool install .` is a SILENT NO-OP on reinstall** — uv matches the source *spec*, not + its contents; exits 0 having done nothing. **Always `--force` from a local path.** + ⚠ 4 pane routes revoked by the new guards (bil-/dvalin-/eitri-/regin-smithy-dev); they + re-declare with `althing-route declare --pid `. **Deliberately not notified** (no + unsolicited fleet broadcast) — operator's call. + → `persistent-memory.d/2026-09-01-althing-320-deploy.md` - **✅ A6000 window CLOSED 2026-09-01 — operator freed ComfyUI's VRAM instead of anyone stopping it.** ⚠ It was a **model unload, not a stop**: `comfyui` still up 8 days, same pid, HTTP 200, 18,500 -> 612 MiB. ⚠ **The resulting ~43.8 GB free is a snapshot, not a floor** —