Changelog

Fresh off the board.

This release ships concurrent multi-card execution for companion agents. A device can now run several cards at once, with capacity measured from the machine's actual CPU and memory (including cgroup limits). Multiple companion containers on the same Docker host share a kernel-backed slot pool so they coordinate without a scheduler. Several correctness fixes accompany the feature: search now opens archived cards and fixes keyboard navigation in the dashboard palette, attachment authority is preserved after a rebase, capacity transitions to lower ceilings are handled correctly, and companion updates now refresh the Compose stack.

New

  • A companion device can now run more than one card at oncePreviously a device held exactly one live run. The server gate is now a configurable count (COMPANION_RUNS_PER_DEVICE, default 16, backstop only), and the companion tracks a list of active runs. Each run owns its own lease, cancellation scope, and GitHub token, so a restart resumes every run it was holding. Cards that share an attached repo are still serialized per device to avoid checkout conflicts; the extra slots are for research, writing, and board work. 2754ada 506d489
  • Multiple companion containers on one host share a machine-wide run ceilingEvery supported Compose stack now mounts the same overdew-machine-capacity Docker volume. Each companion registers its measured ceiling there and the shared pool keeps the smallest value. Each active run holds a kernel-backed slot lock; the lock is released when the run finishes or its process exits. Before taking a slot the pool also checks Linux MemAvailable and cgroup usage, waiting when the next run would consume the 25 percent memory headroom. fb5714a e788314

Improved

  • Companion capacity is now measured from the machine, not hard-codedagent-add reads effective CPU and memory — including cgroup v1 and v2 limits when running inside a container — budgets one core and 2 GiB per concurrent run with one core and 2 GiB reserved for the system, and writes the result as maxActiveRuns in the installed configuration. The value is visible and editable. OVERDEW_MAX_ACTIVE_RUNS still overrides it. The hard cap of four runs is removed; MAX_ACTIVE_RUNS (64) is now only a ceiling on the persisted slot count. 9a855c8 8469a79 1c3e770
  • Each card gets its own persistent working directoryA profile with a workspace root and no pinned execution directory now gives each card <workspaceRoot>/card-<noteId>. A profile with neither uses managed-workspaces/card-<noteId> under the companion runtime root. Later runs for the same card reuse its directory, clone, and branch. A profile that explicitly pins one execution directory keeps that shared checkout and runs using it are serialized. 2754ada 506d489
  • Docker companions now restart automatically after a host rebootThe Linux companion Compose documentation and container configuration now ensure companion services restart after a host reboot. 5335ab4

Fixed

  • Capacity transitions to a lower ceiling are now handled correctlyWhen a companion registers a smaller ceiling than the current pool value, slots already held above the new limit are allowed to finish but no new slots are issued until the active count drops below the new ceiling. The room() check on the remote broker also now correctly returns false once all slots are consumed. 3dc52bd
  • Attachment authority is preserved after a run rebaseDownloading an attachment during a rebased run now uses the authority belonging to that specific run slot rather than the engine's global authority, preventing authority mismatches when multiple runs are active. a0d5674
  • Search now opens archived cards and fixes keyboard navigationPicking an archived card from search no longer opens an empty overlay — the server now appends the archived note to __BOARD_STATE__ so the client can focus it. Keyboard navigation in the dashboard search palette also no longer skips the first result, and both palettes now scroll the selected row into view when arrowing past the fold. 481980c
  • Companion updates now refresh the Compose stackThe companion update flow now triggers a Compose refresh so the running stack picks up the new image without a manual restart. 6c74b3c 07e9f49