Release 2.1.122 (2026-07-09)¶
Bug fixes¶
- refuse a cross-repo closing issue in submit-pr / report-ready (#2246)
A PR can only
Closesan issue in its own repository: GitHub scopes the close keyword to same-repo linkage, and issue numbers are not unique across repos, so a cross-repo close would shut an unrelated same-numbered issue — a genuine mis-close hazard, not a cosmetic slip. The existing guards covered is-epic, is-operational, and cross-org (single owner), but not cross-repo within an org.
Add a fourth guard mirroring the epic/operational rejects: if the resolved --issue names a repo different from the PR's own repo, refuse and direct the caller to file the task in this repo and reference the other issue via a comment or a Ref line. It runs before the epic/operational guards because it is a cheap, local structural check with no authenticated gh call, and short-circuiting a cross-repo ref avoids an epic-ness lookup against a repo the token may not cover. A bare issue number resolves to the current repo and always passes; the compare is case-insensitive to avoid a false refusal on a differently cased spelling. report-ready is best-effort: an unresolvable current repo defers to submit-pr's authoritative check.
Documentation¶
- generalize the validation-task doc to operational tasks (#2240) Generalize the GitHub Issue Standards 'Validation tasks' section (and definition) to 'Operational tasks' covering both kinds: validation (verify) and deployment (make usable), the merged-vs-deployed / implement->deploy->validate model, the shared not-PR-workable/closes-on-SUCCESS/gates-rollup rules, --kind {validation|deployment} creation, and the deployment autonomy boundary (release is a human-gated precondition). Doc-review bookend for epic vergil-project/.github#124. Ref vergil-project/.github#127.
Features¶
-
add visibility-based epic-home resolver (#2239) Add resolve_epic_home(org, target_repo) in lib/epics.py and a memoized, fail-loud repo_visibility/is_public in lib/github.py. A public target homes centrally in
/.github (unchanged); a private target with a public .github homes its epics in itself; a private .github routes everything to .github. INTERNAL counts as private. Foundational for epic #130. -
explicit --repo target, resolver-derived home (#2241) vrg-epic-create takes an explicit --repo owner/repo target (default: current repo) and derives the epic home via epics.resolve_epic_home, echoing the resolved home and its visibility before creating. A public target still homes in
/.github; a private target homes in itself. Replaces the detect_org/.github hard-coding. Task of epic #130. -
home ad-hoc epics via the resolver (self for private repos) (#2242) ensure_adhoc_epic now derives its home from resolve_epic_home: a public repo's ad-hoc epic stays in
/.github; a private repo's homes in itself (the returned IssueRef carries the resolved home repo). vrg-adhoc-epic echoes the resolved home + visibility and guards a malformed --repo. Task of epic #130. -
flag epics outside .github only for public repos (#2245) Generalize invariant 1 (epic_outside_dotgithub) for visibility-based homes: an epic outside
/.github is a violation only when its repo is public; a private repo legitimately self-homes its epics. Visibility is probed per repo (memoized) and fail-loud on a probe error, so a genuinely leaked-out public epic is never masked. Render text notes '(public repos)'. Task of epic #130.