From 7d828bded06865eb567aaa4c267f93ec90d776a5 Mon Sep 17 00:00:00 2001 From: cliffhall Date: Sat, 29 Aug 2026 03:44:19 -0400 Subject: [PATCH] chore: address Copilot review round 12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The board audit checked Done from one side only — a card parked there for work that never shipped — and so could not see an issue still OPEN under a Done card. That is the normal way this breaks here: closing keywords do not fire on `v2/main`, so every v2 issue is closed by hand after its PR merges, and forgetting that step leaves exactly this state. No other check could catch it; they either gate on `isopen` or skip `Done`. Predicate verified against a fixture holding one open and one closed Done card. Signed-off-by: cliffhall --- .claude/skills/issue-triage/SKILL.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.claude/skills/issue-triage/SKILL.md b/.claude/skills/issue-triage/SKILL.md index f1d73916..e2137b8d 100644 --- a/.claude/skills/issue-triage/SKILL.md +++ b/.claude/skills/issue-triage/SKILL.md @@ -209,6 +209,7 @@ count means the board contradicts a rule, not that the rule needs revisiting. | Not exactly one type label | Every issue carries **exactly one** of the five types | Classify it, or remove the extra | | No Priority (#28) | Every board item is prioritized | Score it with the rubric | | Closed, not shipped, still carded | **Done means the work shipped** | Delete the card | +| Open, but carded `Done` | A card in Done ⇒ its issue is closed | Close the issue, or move the card back | ```sh D=$(mktemp -d); R=modelcontextprotocol/inspector @@ -254,7 +255,8 @@ jq -nr --slurpfile o "$D/i.json" --slurpfile a "$D/b28.json" --slurpfile b "$D/b "#28 open, no Priority": [$B28[] | select(.p==null and isopen(.n)) | .n], "closed unshipped, still carded": [($B28[], $B11[]) | select(I(.n)!=null and (isopen(.n)|not) - and (shipped(.n)|not)) | .n] + and (shipped(.n)|not)) | .n], + "open, but carded Done": [($B28[], $B11[]) | select(.s=="Done" and isopen(.n)) | .n] } | to_entries[] | "\(.value|length)\t\(.key)\t\(.value[0:10])"' ``` @@ -265,6 +267,12 @@ Two things the queries must account for, both learned the hard way: `modelcontextprotocol/servers` issue. Without the `.content.repository` filter it reads as a statusless-card defect, and "fixing" it would mean editing another repo's tracking. +- **`Done` is checked from both sides.** One direction catches a card parked in + Done for work that never shipped; the other catches an issue still **open** + under a Done card. The second is not hypothetical here — closing keywords do + not fire on `v2/main`, so every v2 issue is closed **by hand** after its PR + merges, and forgetting that step is the normal way this breaks (Copilot). The + other checks cannot see it: they either gate on `isopen` or skip `Done`. - **The two milestone checks are #28-only.** Every milestone in this repo is a v2 release bucket, so a `v1` issue has none it could take — running the Incoming⇔milestone invariant over board #11 would flag every card on it for a