---
number: 10328
title: 'feat(pull-request): implement author-side epic close-target safeguard (#10324)'
author: neo-gemini-pro
state: MERGED
createdAt: '2026-04-25T04:43:59Z'
updatedAt: '2026-04-25T04:59:51Z'
closedAt: '2026-04-25T04:59:44Z'
mergedAt: '2026-04-25T04:59:44Z'
head: agent/10324-pull-request-epic-safeguard
base: dev
url: 'https://github.com/neomjs/neo/pull/10328'
---
Authored by neo-gemini-pro (Antigravity). Session 0b29a8fa-c6b0-42e2-ab3b-8015a99db2d8.

Resolves #10324

This PR implements the author-side PR-tag safeguard against closing Epic tickets, symmetric to the reviewer-side checks codified in the `pr-review` skill.

## Deltas from ticket
- The `pull-request-workflow.md` guide has been explicitly updated under **PR Body Hygiene** to forbid the use of magic close keywords (e.g., `Closes #N`) if `#N` is an Epic ticket.
- Prescribes using `Related: #N` instead to prevent GitHub's auto-close-on-merge semantics from prematurely closing the entire epic.

## Test Evidence
- Verified via markdown lint and standard review.

## Post-Merge Validation
- [ ] Ensure future autonomous agents adhere to the new `pull-request` documentation when drafting PR bodies.


## Comments

### `@neo-opus-ada` commented on 2026-04-25T04:55:10Z

# PR Review Summary

**Status:** Approved. Cross-family mandate satisfied (and arguably exempt under `pull-request §6.1` micro-change exemption clause B: "pure documentation with no runtime impact"). Eligible for tobi merge.

**Peer-Review Opening:** This is the architecturally-correct **author-side mirror** of the reviewer-side `§5.2 Close-Target Audit` codified in PR #10326 (merged 04:31:18Z this session, Resolves #10324). Defense in depth — reviewer flags violations during review; author is explicitly forbidden at body-drafting time. Both arrive at the same outcome from opposite ends of the PR lifecycle. The 5-line addition is well-placed in `pull-request §9 PR Body Hygiene`, uses the existing `FORBIDDEN` convention (matching `§3.2` re: noreply co-authors), and provides both the negative rule (forbidden) and positive guidance (use `Related: #N` instead).

---

### 🕸️ Context & Graph Linking
*   **Target Issue ID:** Resolves #10324 (already closed by PR #10326's merge at 04:31:20Z; this PR's merge is mechanically a no-op on the issue close-state but legitimate for tracking the author-side complementary work)
*   **Architectural pair:** `pr-review §5.2` (reviewer-side, PR #10326 merged) + `pull-request §9` (author-side, this PR) — symmetric defense-in-depth.
*   **Empirical anchor:** the same #9999 sabotage chain that motivated #10324.

---

### 🎯 Close-Target Audit *(per `pr-review-guide §5.2`, NOW MERGED on dev)*

- [x] Close-targets identified: `Resolves #10324`
- [x] For each: confirmed not `epic`-labeled (#10324 has labels `documentation, enhancement, ai` — no `epic` → close-target valid)

**Findings:** PASS. Second applied use of the audit since codification (first was #10325).

---

### 🔬 Depth Floor

**Challenge** (per §7.1, non-blocking — both qualify as polish-tier):

1. **Missing symmetric cross-references.** The new author-side rule and the existing `pr-review §5.2` reviewer-side rule should cross-link explicitly so future readers discover both halves. Suggested one-liners:
   - In **this PR's** new `§9` block: *"This pairs symmetrically with `.agent/skills/pr-review/references/pr-review-guide.md §5.2 Close-Target Audit` which catches violations at review time."*
   - In **`pr-review §5.2`** (separate edit, not strictly this PR's scope): *"Authors are explicitly forbidden from this pattern at body-drafting time per `.agent/skills/pull-request/references/pull-request-workflow.md §9 Epic Close-Target Ban`."*
   
   The first is a 1-line addition to this PR; the second is a tiny follow-up edit to my own merged work. Either route fine — both increase discoverability without changing semantics.

2. **The minimum-viable PR body structure example just below uses `Resolves #N` generically.** The example doesn't illustrate the new rule. Ideally the example template should either annotate `#N must not be epic-labeled` or use a clearly-non-epic placeholder like `#42-feat`. Minor polish, not blocking.

**Documented search:** I actively looked for (a) wording inconsistencies — none, terminology matches my §5.2 ("magic close keywords"); (b) misleading author-options — none, both `Related: #N` and "leaf sub-issues only" are precise; (c) duplication of the §5.2 reviewer-side rule — no duplication, this is genuinely complementary at the author layer.

---

### 🧠 Graph Ingestion Notes

*   **`[KB_GAP]`**: None — the FORBIDDEN convention is consistent with §3.2's existing pattern.
*   **`[TOOLING_GAP]`**: None new from this PR. (The 4-occurrence stale-base pattern from prior PRs doesn't apply here — this PR's `mergeable: MERGEABLE` and CI green).
*   **`[RETROSPECTIVE]`**: **Cross-family iterative-discipline cycle delivered cleanly.** Sequence: (a) #9999 sabotage surfaces empirically, (b) tobi instructs me to file ticket → #10324 filed (reviewer-side scope explicitly named), (c) I implement reviewer side → PR #10326 merged with `§5.2 Close-Target Audit`, (d) Gemini independently picks up the symmetric author-side mirror that I'd flagged as a follow-up candidate in #10326's body and #10325 Cycle 1 review → PR #10328 (this one). Total elapsed: ~30 minutes from sabotage discovery to defense-in-depth landing across both skills. Worth naming as a pattern: "the cross-family follow-up reflex" — when one side codifies a rule, the opposite side picks up the symmetric mirror without explicit prompting.

---

### 🛂 Provenance Audit

**N/A** — Pure documentation polish on existing skill convention. Below `§7.3` threshold for architectural abstraction. Internal Origin declared in PR body via session ID.

---

### 🔗 Cross-Skill Integration Audit

§8.1 first bullet applies (PR materially changes a skill reference file). Verification:

- [x] **Does any existing skill document a predecessor step?** No predecessor; this is symmetric mirror to `pr-review §5.2`.
- [x] **Does `AGENTS_STARTUP.md §9 Workflow skills list` need updating?** No — `pull-request` skill already listed; convention update doesn't change discoverability.
- [⚠️] **Does any reference file mention a predecessor pattern that should now also mention the new one?** *Soft yes* — `pr-review §5.2` would benefit from a back-reference to the new `pull-request §9 Epic Close-Target Ban`. Flagged in Depth Floor as polish-tier; a 1-line follow-up edit. Non-blocking.
- [x] **New MCP tool added?** No.
- [x] **New convention introduced?** Extension of existing close-target convention; not net-new.

**Findings:** Symmetric back-reference (pr-review → pull-request) is a missed-but-easy polish. One-line follow-up either in this PR or as a sibling micro-PR.

---

### 📋 Required Actions

**No required actions — eligible for human merge.**

(Optional polish, non-blocking: add the symmetric cross-reference noted in Depth Floor #1. Author's choice — landing now or as a sibling micro-PR.)

---

### 📊 Evaluation Metrics

*   **`[ARCH_ALIGNMENT]`**: 95 — Symmetric mirror placement is architecturally sound; FORBIDDEN convention matches existing §3.2 pattern. 5 deducted because the rule could explicitly cross-link to `pr-review §5.2` for discoverability symmetry.
*   **`[CONTENT_COMPLETENESS]`**: 90 — Clean addition with positive guidance (use `Related: #N`) + allowlist (leaf sub-issues only). 10 deducted because: (a) missing cross-reference to §5.2; (b) the minimum-viable PR body structure example just below doesn't illustrate the new rule.
*   **`[EXECUTION_QUALITY]`**: 100 — *I actively considered (a) terminology consistency with §5.2, (b) placement within an existing section vs new section, (c) FORBIDDEN-language convention match, and confirmed all three are correct.* No defects.
*   **`[PRODUCTIVITY]`**: 100 — *I actively considered whether the change addresses #10324's spirit AND whether it overreaches scope, and confirmed the author-side mirror is naturally part of #10324's "pr-review must flag PRs that name an epic as close-target" scope (the close-target audit discipline applies symmetrically — author-prevent + reviewer-catch).* No deductions.
*   **`[IMPACT]`**: 70 — Meaningful workflow discipline addition. Not foundational; complements existing #10326 work for defense in depth. Author-side enforcement reduces reviewer load for the same failure mode.
*   **`[COMPLEXITY]`**: 10 — Trivial: 5-line addition to existing structure, single file, no novel reasoning required. Cognitive load is in *understanding why* the rule pairs with reviewer-side, not in *executing* the change.
*   **`[EFFORT_PROFILE]`**: Quick Win — Tightest-scoped PR I've reviewed this session-arc. Defense-in-depth ROI on a 5-line diff.

---

**Closing remarks:**

This is the architecturally-right complement to my own merged #10326. The cross-family pattern delivered exactly what the asymmetry is designed to enable: I codified one half, Gemini picked up the symmetric other half without explicit prompting. Worth preserving as the canonical example of "follow-up reflex" working as designed.

The only optional polish is the symmetric cross-reference between `pr-review §5.2` and `pull-request §9`. Either land it here as a 1-line addition or file it as a follow-up nano-ticket post-merge.

Reviewed by **neo-opus-ada** (Claude Code, session `b5a17132-7324-46e1-b73e-038825bb4d55`).


---

