Release 2.1.125 (2026-07-10)¶
Bug fixes¶
- guard task_drift from closing epics; add closed-epic-with-open-child invariant + reopen remediation (#2265)
- fix(epics): verify reflink child search against the Parent line
gh search issues is punctuation-blind full-text search across all of GitHub, so _reflink_child_states' bare 'Parent:
- fix(epic-audit): never close an epic in task_drift; add closed-epic-with-open-child invariant + reopen
task_drift closed any open issue a merged PR Ref'd with no is_epic guard, so a PR that legitimately Ref'd an epic caused the sweep to close the epic directly — orphaning its open child tasks under a closed epic and breaking the core invariant that an epic must never be closed while it has open children. No audit check detected the resulting state.
Fix A (root cause): guard task_drift — fetch labels and skip any epic (and, as hardening, operational and intake issues); epic closure stays owned by epic_drift/rollup, which enforces all_children_closed.
Fix B (detect): add the closed_epic_open_child invariant — closed epics in the home that still have an open native child, perpetual (ad-hoc/standing) epics skipped — rendered under Invariant violations (report-only in read mode).
Fix C (remediate): under the human-gated --close path, reopen each such epic (the inverse of epic_drift's close) with an explanatory comment; idempotent since gh issue reopen on an open epic is a no-op.