Skip to content

Release 2.1.176 (2026-08-07)

Bug fixes

  • surface detached-HEAD / mid-rebase worktrees instead of hiding them (#2640) vrg-worktree-status built its list from list_worktrees(), which discovers only worktrees with a checked-out branch. A worktree paused mid-rebase is detached-HEAD, so it was filtered out entirely — the command printed 'No canonical worktrees found' while git worktree list plainly showed it, making a real in-flight branch look like it had vanished.

Add discover_worktrees(), a full-fidelity discovery that keeps detached worktrees (branch=None), and reimplement list_worktrees() on top of it so the finalize/submit sweeps keep their branch-only filter and never act on a mid-operation worktree. The status command now classifies a detached worktree with a REBASING or DETACHED state, recovering its intended branch from the paused rebase's head-name metadata (falling back to the issue-- directory name), and prints an actionable note. The 'none' message now appears only when the container is genuinely empty.

Chores

  • one-time cosmetic strip of legacy archived@ markers (#2639)

Documentation

  • require hard gates only — eliminate soft gates (#2631) Rewrite the CI gates section of source-control-guidelines.md to assert that every CI gate is a hard gate and there are no soft gates, consistent with epic #224's no-optional-PR-gate invariant. Remove the soft-gate (warning-only) classification, state that a check either blocks merge as a required status check or is not a gate, and cross-reference the ci-architecture guide's matching subsection.

  • reframe preview/eol advisory gates as an unsupported-version carve-out (#2632) Reconcile the runtime-version-support and language-overview docs with epic #224's hard-gates-only standard. Reframe the Tier 2 preview- (was soft) and Tier 4 eol- (was advisory) gates, plus python version-management's preview-/security- language, as the single named advisory-on-unsupported-versions carve-out: non-blocking because the runtime version is outside the supported set, distinct from a generic soft gate. Remove rust/overview's generic soft-gate section and update the go/python/shell/java/cpp cross-references to source-control-guidelines from 'hard gate and soft gate definitions' to the hard-gates-only standard plus the carve-out. Cross-references source-control-guidelines.md and ci-architecture.md; touches no code or CI.

Features

  • add --label for named session creation (label:workspace); soft-warn convention (#2633)
  • promote --resume to exact-name attach; remove --slot and auto-resume (#2635)
  • feat(vrg-vm): promote --resume to exact-name attach via seam; remove --slot and auto-resume-most-recent

  • test(vrg-vm): disambiguate label-path store stub after rebase

The base-advance rebase onto develop combined Task 2's --label tests (which added a minimal _FakeStore returning a canned resolve_name result) with this branch's SessionStore-seam tests (which added a rows-based _FakeStore delegating to resolve_over). Git merged both class definitions without a textual conflict, so the later definition shadowed the earlier one and broke the label tests at runtime (and tripped a mypy redefinition error). Rename the label-path stub to _StubStore so both fakes coexist.

  • delete session archive + staleness; add recency display-filter (#2636) Removes the auto-archive/staleness machinery (issue #2608): the archived@ marker helpers (make_archived_name/parse_archived/_ARCHIVED_PREFIX), the fresh/warn/stale bands (classify_age/AgeBand), the stale prompt (PromptStale), the auto-archive sweep (_archive_session/_run_sweep, SessionPlan.auto_archive), and the session_stale_days/session_archive_days config.

Adds filter_recent(rows, now, recent_days, all=False) over SessionInfo rows and a cascading session_recent_days config, wired into vrg-vm list --sessions: the listing is now built from the SessionStore seam and shown by name, filtered to the recency window by default. --archived is removed; --all now means include-older-than-recent. list --list-json emits raw SessionInfo rows; the host applies the recency filter.

Legacy archived@ names remain opaque strings the seam still lists and resolves (parse_name keeps a defensive guard so they never misparse into a phantom slot); only the behavior is removed. --fork is unchanged; --fresh keeps creating a fresh session (its supported retire-rename is Task 5). Ref #2608.

  • reconceive --fresh as supported retire-rename (never delete) (#2637)

Testing

  • regression: reconnect selects only the exactly-named session (#2602) (#2638)

CI Evidence: All gates passed — full audit bundle available. Download →