## What Problem This Solves
Subagent archive deadlines were armed when a run was registered, allowing a long-running, paused, restored, or still-delivering child to expire before its execution and completion delivery actually finished.
## Why This Change Was Made
One canonical retention owner now computes archive eligibility from completed execution or finalized collector results, clears stale deadlines during paused lifecycles, and keeps the sweeper from reclaiming active or still-owned delivery records.
## User Impact
Long-running and yielded subagents remain available until their work and completion messages finish, while completed runs and collector groups are archived after the intended retention window.
## Context
Final exact-source trusted remote validation passed 220 focused tests, including actual archive end-to-end coverage, and a production/private-QA build spanning 11 bundler phases and 35 plugin closures. All six production files passed core type-aware lint, and targeted formatting passed. Production code decreases by three lines. This affects persisted subagent lifecycle and retention behavior, so explicit maintainer review is required before any merge.
## What Problem This Solves
Explicit blank or whitespace-only configure --section values were silently discarded by generic normalization, causing a scoped configuration request to unexpectedly launch the full setup wizard.
## Why This Change Was Made
The configuration-section parser now retains explicitly supplied blank values long enough to classify and report them as invalid, while preserving existing trimming and accepted-section behavior. The invalid-section message displays empty values clearly.
## User Impact
Operators who accidentally provide an empty section receive an actionable validation error instead of silently entering unrelated setup flows or changing the wrong configuration area.
## Context
Owner and independent reviewer exercised actual Commander-backed production paths with 13 and 12 passing assertions respectively. Regression coverage spans parser, command, and registered CLI boundaries. Existing oxfmt formatting and scoped whitespace checks passed; production code decreases by one line.
* fix(gateway): close task terminals at run end
* refactor(agents): keep terminal task ownership internal
* test(gateway): type task-owned terminal fixtures
* test(infra): split agent run task ownership coverage
* fix(ui): confirm disruptive Control UI updates before dispatch
Every Control UI update affordance dispatched `update.run` (or the macOS
bridge `start-update` message) on the first click, so a misclick could
install new code, restart the Gateway, and interrupt active work.
Add one canonical confirmation gate in the Control UI owner boundary and
route the sidebar/settings-sidebar/floating update card and the
Settings -> Updates row through it. The gate owns the copy, the versions,
the restart consequence, the action-specific confirm label, and the
choice between the macOS bridge and `update.run`, so the bridge fork no
longer lives in the card and no surface can drift.
CLI, API, automation, agent-driven paths, automatic update campaigns, and
the `update.run` contract are unchanged.
Addresses the Control UI portion of #117178.
* style(ui): apply oxfmt to update confirmation sources
* perf(ui): load the update confirmation lazily and share its impact copy
Keeps the Control UI startup bundle under its 317 KiB gzip ceiling: the
confirmation dialog only loads when an operator opens it.
* test(ui): drive the update confirmation in sidebar and shell wiring tests
- Uses a four-column grid with inline top-row actions to keep the compact control pinned to the card corner.
- Fixes both split halves at 26px, eliminating the chevron overhang.
Release-note context: the suggested-task card's action button is now a compact split control in the top-right corner, matching the intended design.
Store resolved Telegram media references on observed messages so repeated quoted-photo turns reuse retained bytes instead of downloading them again. Preserve uncached external-reply media for the active turn and keep cache metadata out of model context.
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: Ayaan Gazali <ayaangazali.work@gmail.com>
* feat(memory): support globbed extra paths
Allow root-relative glob patterns on existing memory.search.extraPaths entries across discovery, watching, reindex identity, and QMD migration.
* fix(memory): drop stale lease type import
* fix(memory): enforce extra path glob scope
* fix(cli): route parent model status aliases
* refactor(cli): trim model status route plumbing
* refactor(cli): break parent path descriptor cycle
* fix(cli): align model status startup checks
* chore(cli): refresh plugin SDK API baseline