Skip to content

Promote the Part-of/closing-keyword contradiction (H7) into a PR-scoped blocking check — and settle the fenced-code reading first #8476

Description

@hotlong

Filed by the skills seat (session session_018WuTtyckQa1VcXwgd52JpN) under this shift's maintainer card-filing grant, from the Part-of/auto-close investigation's ACCEPT. Left without a domain:* label deliberately — routing is triage's call: the check guards the PM partial-delivery protocol (skills-adjacent) but would live in the general gate farm (scripts/check-*.mjs + a pr-automation/lint wiring), which is the devx floor. Dedup: the report-only detector H7 already exists in scripts/pm/check-half-states.mjs (landing via its own PR); no open card proposes the blocking promotion.

Why blocking, not just patrol (the implementing dev's argument, endorsed at review)

  • Measured pull: one half-delivered card was silently closed on merge — by the PR body sentence written to prevent that close (GitHub's keyword parser ignores negations/modals). That round alone had two Part of cards exposed; the surface is every partial delivery.
  • Habit is what failed: the author wrote the warning correctly and still lost the card. Only a mechanical comparison at PR time prevents a mistake that reads as natural English.
  • Structurally invisible failure: a closed card reads as finished; the incident was caught only by a post-merge inventory re-pull.
  • Boundary honored: unlike the sweep's H1–H6 (shared board state — correctly report-only, must not fail an unrelated PR), H7 is a fact about the PR being checked, so a PR-scoped blocking check does not contradict the sweep's own report-only argument. It must be a separate PR-scoped check, ⛔ not a mode flip of the report-only sweep. Also measured: the sweep cannot run live in most agent containers (transport class 3), so patrol-only guards nothing where it matters.

Scope

  1. Settle the fenced-code question with one live reading FIRST (cheap, decisive, and it fixes the predicate's one stated unknown): a throwaway PR whose body carries a fenced closing keyword + reference to a throwaway issue; read closed_by_pull_requests on the target after merge-or-close. Inline spans are already measured (do not fire); if fences DO fire, the strip rule is a false negative and must be revised before the check can block.
  2. New PR-scoped check reusing the shipped predicate (h7PartOfWithClosingKeyword and friends are exported): fails a PR whose body declares Part of #N while carrying a closing keyword bound to the same #N. Wire it where PR-body checks run (the pr-automation family); the error message should carry the approved rewordings ("card N is not addressed here" / backticks).
  3. ⛔ No weakening of anything existing; the report-only sweep keeps H7 for patrol coverage of the same fact.

Constraints

  • Serial: after the H7 PR merges (predicate is its export), and after the dispatch-gates self-test wiring card establishes where pm-tooling checks hang in CI (convention to follow, not re-invent).
  • ⚠️ Maintainer veto window: a new blocking gate touches every contributor — this card was filed pm:queue on the seat's three-axis analysis, and the round report flags it; veto or re-scope by comment before dispatch.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions