Release 2.1.184 (2026-08-09)¶
Bug fixes¶
- resolve a bare --issue N before the report-ready epic/operational guards (#2708) report-ready's epic and operational guards called is_epic_linkage/is_operational_task with the raw --issue string. A bare number (e.g. 120) has no '#', so epics.parse_issue_ref rejects it and the guard silently returned False — letting a bare-number epic or operational issue bypass the report-time guard entirely. Only the submit-time guard, which resolves the ref first, was authoritative.
Resolve --issue to a canonical ref (bare number -> '#N') before the guards, mirroring vrg-submit-pr. The raw --issue is still what gets stored, because vrg-submit-pr's resolve_issue_ref re-normalizes it and rejects a leading '#'; only the guards see the canonical form.
- pr_body: extract normalize_issue_ref (raises ValueError) as the shared normalizer; resolve_issue_ref now delegates and converts to SystemExit so vrg-submit-pr's behavior is unchanged. report-ready wraps the ValueError as a WorkflowError, so a malformed --issue now fails loud at report time instead of being stored and deferred.
-
The guards take the canonical issue_ref and no longer double the '#' in their messages. The cross-repo guard's now-unreachable unparseable-ref branch is removed (normalization guarantees a parseable ref).
-
derive ad-hoc archive repo from epic title; skip non-repo epics (#2709) (#2712)
Documentation¶
- note once-per-quarter archive guarantee and duplicate tolerance (#2697) (#2705) Documentation-review bookend of epic #259. Extends the ad-hoc archiving 'Idempotent' note to reflect the hardening from #2698: a single drain creates at most one archive per quarter regardless of same-quarter child count, and a pre-existing duplicate archive is tolerated (oldest reused) rather than failing the run.
Features¶
-
support --blocked-by on plain tasks and classify all open children (#2707) The Blocked-by dependency machinery (blockers_of/all_blockers_closed) is already generic, but the creation flag and the audit's runnable/blocked split were gated to operational task kinds. Unlock both edges for plain tasks so an epic driver's plain-task frontier is machine-derivable from the issue graph instead of inferred from plan prose.
-
vrg-issue-create: --blocked-by now works on --kind task, appending the same portable Blocked-by: reflink (epics.render_blocked_by) the operational scaffolds use to the caller's body (--body or --body-file). Previously it was silently ignored for plain tasks. Retrospective still rejects it (an ordinary PR task takes no merge-first deps).
- epic_audit.child_status(): a sibling of operational_status that classifies EVERY open child runnable-vs-blocked via the generic all_blockers_closed. operational_status stays operational-scoped so operational_pending keeps its 'operation-pending' meaning.
- Document the plain-task reflink in the github-issues standard.
CI Evidence: All gates passed — full audit bundle available. Download →