Skip to content

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: ' query returned cross-repo false positives — unrelated issues that merely contained the words. Scope the search to the epic's org with --owner and verify each candidate's body actually carries a matching 'Parent: ' line (new _body_declares_parent helper) before accepting it, keeping child_states and any reflink-based detection sound on GitHub and forges alike. Fix D of issue #2259.

  • 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.