This release is focused entirely on internal tooling and CI infrastructure. It introduces a PR validation workflow with automated Claude code review and self-repair, stabilizes the test suite across Linux and CI environments, and improves test runner performance and reliability.
Changelog
Fresh off the board.
Fixes a concurrency bottleneck in container agents that inherited a pinned executionDirectory from before per-card directories existed. The pin caused all runs for an agent to queue behind a single slot; this release drops it during container profile normalization and adds validation and behavioral test coverage to prevent regressions.
Fixed
- Container agents no longer queue behind a single execution slotAgents created before per-card directories were introduced carried a pinned
executionDirectoryin their companion config. In a container, that pin meantdirectoryAvailable()allowed only one run at a time regardless of how many slots the machine measured. The 0.8.0 migration moved the pin instead of removing it; this fix drops it in both places that normalize a container profile while leaving deliberate pins on native installs untouched.886f57bdac1fc5
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.2754ada506d489 - Multiple companion containers on one host share a machine-wide run ceilingEvery supported Compose stack now mounts the same
overdew-machine-capacityDocker 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 LinuxMemAvailableand cgroup usage, waiting when the next run would consume the 25 percent memory headroom.fb5714ae788314
Improved
- Companion capacity is now measured from the machine, not hard-coded
agent-addreads 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 asmaxActiveRunsin the installed configuration. The value is visible and editable.OVERDEW_MAX_ACTIVE_RUNSstill overrides it. The hard cap of four runs is removed;MAX_ACTIVE_RUNS(64) is now only a ceiling on the persisted slot count.9a855c88469a791c3e770 - 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 usesmanaged-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.2754ada506d489 - 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 returnsfalseonce 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.
6c74b3c07e9f49