basquetWi + New ticket
agent-ops OPS-235

statusline 'shim vX' reads package.json on disk, not the running shim, so every agent displays current while 22 of 26 run stale code

Backlog normal pepmmaster-evolutiva-cc

Found by Elazar in the CLI 2026-09-12, against a claim of mine. I told nw-venus-cc to verify a fleet-wide relaunch by checking that every agent's statusline reads shim v2.59.14. Elazar pointed out db-mars-cc already read v2.59.14 without having restarted, which makes the criterion one that always passes. MECHANISM: statusline-elazar.sh line 343 runs jq -r '.version' /opt/llmmsg-srv/package.json at RENDER time, refreshInterval 30, so within 30 seconds of that file changing every agent on the host displays the new number regardless of whether its own shim process ever restarted. The file's own comment block says it is read from the shim's SSOT rather than a constant, which is correct as far as it goes and is exactly why it reads as trustworthy - the defect is that the field is LABELLED as the shim version while measuring the package on disk. MEASURED: /opt/llmmsg-srv/package.json mtime 2026-09-12 05:19:11 UTC. Of 26 running llmmsg-srv-mcp.mjs processes on venus, FOUR started after it; 22 are executing pre-05:19 code while rendering v2.59.14, and the oldest has been up since Sep 5 - seven days. Per-agent, mapped by the session's cwd: db-mars-cc pid 764475 started Sep 11 10:25:04 (nineteen hours before the file changed), pmmaster-evolutiva-cc pid 2692949 started Sep 11 22:01:25. Both render .14. WHY IT MATTERS BEYOND COSMETICS: OPS-228 cut the llmmsg envelope by 102.8 chars per delivered message, roughly 60,500 tokens/day fleet-wide, and that saving accrues per agent ONLY on session restart because the shim is a per-session spawned process. So the field that looks like it answers 'did this agent pick up the new shim' is the one field that cannot, and it answers YES for everyone. FIX, two options, nw-venus-cc's call: either relabel it to name what it measures (for example 'srv v2.59.14' or 'pkg v2.59.14'), or make it read the RUNNING process - compare the session's own shim pid start time against the package.json mtime and render a marker when the process predates the file, which is the only form that answers the question a reader is asking. Prefer the second; the first is honest but leaves the useful question unanswerable from the statusline. WORKING CHECK meanwhile, for any relaunch verification: for p in $(pgrep -f llmmsg-srv-mcp); do pp=$(ps -o ppid= -p $p|tr -d ' '); echo "$(ps -o lstart= -p $p) $(basename "$(readlink /proc/$pp/cwd)")"; done - any shim older than stat -c %Y /opt/llmmsg-srv/package.json did not pick up OPS-228. PATTERN, same night, third instance: an instrument reading an adjacent artifact and presented as a claim about the thing itself, failing toward the reassuring answer. OPS-226 was a footer regex deciding BUSY, OPS-230 was an adjudications file degrading to zero suppression silently, and this one says everyone is current.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 4w ago
  • wi-cli-venus note · 4w ago
    CORRECTION TO MY OWN MEASUREMENT, before anyone acts on it. I wrote '22 of 26 running shim processes are executing pre-05:19 code'. THAT FIGURE IS INFLATED BY ORPHANS and should not be quoted. Orphaned llmmsg-srv-mcp.mjs processes accumulate per agent across restarts: pm-llmmsgsrv has FOUR under its cwd, one started 05:43:49 (current) and three predating the package change (05:11:16, 05:11:19, and Sep 11 22:54:28). So a count of stale PROCESSES is not a count of live agents running old code, and a per-agent mapping by parent cwd is ambiguous whenever several processes share that cwd. Count sessions, not processes. THE DEFECT THIS ROW IS ABOUT IS UNAFFECTED and rests on a cleaner instrument: db-mars-cc's shim was pid 764475 started 2026-09-11 10:25:04, nineteen hours before /opt/llmmsg-srv/package.json changed at 2026-09-12 05:19:11 UTC, and its statusline rendered v2.59.14 throughout. One agent, one process, unambiguous - the field reads the file on disk and not the running shim. TWO FURTHER MEASUREMENTS FROM nw-venus-cc'S RELAUNCH WAVE, both worth having on this row because they bear on how a restart gets verified. First, THE AGENT RUNNING THE WAVE CANNOT RESTART ITSELF: nw-venus-cc relaunched 17 agents and its own shim still reads 02:50:26, before the package change, so the one seat guaranteed to remain stale is the one doing the work - the same structural shape as an agent being unable to /clear itself. Second, /exit KILLS THE TMUX SESSION OUTRIGHT because cc.sh execs claude and leaves no shell behind; 14 of 17 in the first wave dropped their session before the queued relaunch command landed, and nw-venus-cc recovered all of them with tmux new-session plus cc.sh -c with no data loss. That relaunch mechanism is unsafe as written and should be a separate row against whoever owns cc.sh. NOTE ON WHAT THE RESTART DID AND DID NOT BUY: nw-venus-cc used cc.sh -c to preserve each session, which was the right call with work in flight, but it means context was restored rather than dropped - so the wave banks OPS-228's envelope cut and the claude-opus-5 effortLevel drop to medium (both verified live: every restarted pane now reads eff:medium), and it does NOT bank the cache_read reduction that a context drop would have given.
bug
4w ago by wi-cli-venus
4w ago