Problem
A workspace keeps the image its container was created from. KINISI_IMAGE_PULL=daily (or any pull) fetches a newer image, but only the next container create uses it, and nothing tells the running workspaces. Long-lived agent workspaces therefore drift days behind.
On ags-beast on 2026-10-07, 13 of 16 running kinisi_ros containers ran an image from 3 Oct or earlier. kinisi_ros keys its remote Bazel cache on a partition stamped into the image, so those containers read a partition that CI no longer fills. One full build got 11 remote cache hit ... 1437 local, while CI built the same branch, with the same 10,758 actions, at 6420 remote cache hit ... 2 local. Every stale container compiled the tree locally, at 0.7–0.9G per cc1plus, which drove docker.slice to its memory cap for two hours (208 systemd-oomd kills).
Today the fix is dl <ws> recreate, and the user avoids it because it ends the agent session in the container.
What a recreate keeps already
- The checkout and its worktrees (host bind mount under
~/.cache/devlaunch/repos/...).
~/.claude, so every transcript, and ~/.cache (Bazel output bases).
- The container volumes (
recreate keeps them; only reset drops them).
It loses only the running processes: the Claude process with its background tasks and subagents, and any build or sim. dl starts agents with --session-id <uuid> --remote-control=<ws>, so claude --resume <uuid> brings the conversation back.
Proposal
- Detect. A workspace is stale when its container's image ID differs from the current ID of the image reference it was created from. Show it in
dl --ls (and --json).
- Recreate without losing the agent.
dl <ws> recreate records the session id and remote-control name of each Claude process in the container, recreates it, and starts each session again with claude --resume <id> --remote-control=<name> in the pane it held.
- Refresh when safe.
dl --refresh-stale applies 2 to each stale workspace whose Claude sessions are all idle (waiting for the user, no background tasks) and that runs no build; it skips busy ones and reports them. It can run after the daily pull.
Agents inside a container cannot do this themselves (a recreate kills them), so this belongs on the host side.
Done when
dl --ls marks stale workspaces.
dl <ws> recreate on a workspace with an idle agent leaves the same session resumed, with its transcript, on the new image.
dl --refresh-stale refreshes idle stale workspaces and leaves busy ones alone.
🤖 Generated with Claude Code
Problem
A workspace keeps the image its container was created from.
KINISI_IMAGE_PULL=daily(or any pull) fetches a newer image, but only the next container create uses it, and nothing tells the running workspaces. Long-lived agent workspaces therefore drift days behind.On ags-beast on 2026-10-07, 13 of 16 running kinisi_ros containers ran an image from 3 Oct or earlier. kinisi_ros keys its remote Bazel cache on a partition stamped into the image, so those containers read a partition that CI no longer fills. One full build got
11 remote cache hit ... 1437 local, while CI built the same branch, with the same 10,758 actions, at6420 remote cache hit ... 2 local. Every stale container compiled the tree locally, at 0.7–0.9G percc1plus, which drove docker.slice to its memory cap for two hours (208 systemd-oomd kills).Today the fix is
dl <ws> recreate, and the user avoids it because it ends the agent session in the container.What a recreate keeps already
~/.cache/devlaunch/repos/...).~/.claude, so every transcript, and~/.cache(Bazel output bases).recreatekeeps them; onlyresetdrops them).It loses only the running processes: the Claude process with its background tasks and subagents, and any build or sim. dl starts agents with
--session-id <uuid> --remote-control=<ws>, soclaude --resume <uuid>brings the conversation back.Proposal
dl --ls(and--json).dl <ws> recreaterecords the session id and remote-control name of each Claude process in the container, recreates it, and starts each session again withclaude --resume <id> --remote-control=<name>in the pane it held.dl --refresh-staleapplies 2 to each stale workspace whose Claude sessions are all idle (waiting for the user, no background tasks) and that runs no build; it skips busy ones and reports them. It can run after the daily pull.Agents inside a container cannot do this themselves (a recreate kills them), so this belongs on the host side.
Done when
dl --lsmarks stale workspaces.dl <ws> recreateon a workspace with an idle agent leaves the same session resumed, with its transcript, on the new image.dl --refresh-stalerefreshes idle stale workspaces and leaves busy ones alone.🤖 Generated with Claude Code