Skip to content

Commit aa2208d

Browse files
cliffhallclaude
andcommitted
fix: keep advisory draft-card titles opaque until publication
The prescribed `[GHSA-...] - <summary>` title put the private advisory's summary on board #43, whose audience is wider than the advisory's, which contradicted the skill's own "link and triage metadata only" rule. The title is now the bare `[GHSA-...]` id until the advisory is published; the summary is added just before the card is converted to an issue. Refs #4870 Signed-off-by: cliffhall <[email protected]> Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
1 parent e1b4391 commit aa2208d

3 files changed

Lines changed: 22 additions & 14 deletions

File tree

‎.claude/skills/board-ops/SKILL.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,9 @@ duplicate-of link).
247247

248248
### Advisory draft cards
249249

250-
A private security advisory is tracked by a **draft card** titled
251-
`[GHSA-xxxx-yyyy-zzzz] - <summary>`, because a real issue would disclose it
252-
before a fix exists. What goes on the card, and when it moves, is the
250+
A private security advisory is tracked by a **draft card** titled with the bare
251+
id, `[GHSA-xxxx-yyyy-zzzz]`, because a real issue would disclose it before a fix
252+
exists. No summary goes in the title until the advisory is published. What goes on the card, and when it moves, is the
253253
`/security-advisory` flow; these are only the mechanics.
254254

255255
⚠️ **A draft card has no repository and no issue number**, so the issue-side
@@ -280,7 +280,7 @@ PRIORITY_OPT=$(opt Priority "<provisional level>")
280280
ITEM_ID=
281281
if [ -n "$STATUS_OPT" ] && [ -n "$PRIORITY_OPT" ]; then
282282
ITEM_ID=$(gh project item-create 43 --owner modelcontextprotocol \
283-
--title "[$GHSA] - <summary>" --body "<link and triage lines only>" \
283+
--title "[$GHSA]" --body "<link and triage lines only>" \
284284
--format json --jq '.id') || ITEM_ID=
285285
fi
286286
# Then the two chained item-edit calls from "Add a card and set its fields".

‎.claude/skills/security-advisory/SKILL.md‎

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,13 @@ An advisory gets a **draft card**, the one exception to
5656
[`AGENTS.md`](../../../AGENTS.md#issue-driven-work-style)'s "every board item is
5757
a real GitHub issue".
5858

59-
- **Title:** `[GHSA-xxxx-yyyy-zzzz] - <advisory summary>`. The `[GHSA-` prefix
60-
is not cosmetic: it is the only thing that tells an advisory draft apart from
61-
a stray draft card, which is still a defect to delete, so any audit of the
62-
board's drafts keys on it. Look a draft up by that bracketed id, never by words from the summary.
59+
- **Title:** the bare id, `[GHSA-xxxx-yyyy-zzzz]`, and **no summary until the
60+
advisory is published**. A summary can name the server or the attack class,
61+
and the card is read by a wider audience than the advisory (see the body's
62+
warning below). The `[GHSA-` prefix is not cosmetic: it is the only thing
63+
that tells an advisory draft apart from a stray draft card, which is still a
64+
defect to delete, so any audit of the board's drafts keys on it, and it is
65+
the exact lookup key.
6366
- **Body:** `**Advisory:** <html_url>` on the first line, then the severity the
6467
reporter claimed, the reported date, and the provisional Priority line below.
6568
The link comes first because a maintainer reading the card has no other route
@@ -271,16 +274,19 @@ describes a vulnerability the advisory has not disclosed yet.
271274
at an issue filed separately, so filing by hand and then converting produces two
272275
issues and two cards.
273276

274-
1. **Convert the draft card to an issue** in `modelcontextprotocol/servers`
277+
1. **Give the card its public title first**, `[GHSA-xxxx-yyyy-zzzz] - <published
278+
summary>` (edit the draft's title on the card), since the issue takes the
279+
card's title. Only now, with the advisory public, may the summary appear.
280+
2. **Convert the draft card to an issue** in `modelcontextprotocol/servers`
275281
(the card keeps its place and its field values). The recipe is in
276282
`/board-ops`.
277-
2. Apply the labels and milestone from `/issue-create` (steps 1 and 2): `v2`,
283+
3. Apply the labels and milestone from `/issue-create` (steps 1 and 2): `v2`,
278284
one type label (normally `bug`), the server's scope label, and the milestone
279285
of the release the fix shipped in. **Skip its board step**: the converted
280286
card is already on #43.
281-
3. Replace the body's triage lines with a link to the now-public advisory, and
287+
4. Replace the body's triage lines with a link to the now-public advisory, and
282288
**close** the issue: the work shipped before the issue existed.
283-
4. Move the card to **`Done`**, which is right here because the fix shipped.
289+
5. Move the card to **`Done`**, which is right here because the fix shipped.
284290

285291
## API facts worth not re-deriving
286292

‎AGENTS.md‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,10 @@ here.
238238
- **Every board item is a real GitHub issue.** No draft cards. Before creating an
239239
issue, search for a matching one in every state; **never create a duplicate**.
240240
- **The one exception is a private security advisory**, tracked by a **draft
241-
card** titled `[GHSA-xxxx-yyyy-zzzz] - <summary>`, because a real issue
242-
would disclose the vulnerability before a fix exists. It becomes a public
241+
card** titled with the bare id, `[GHSA-xxxx-yyyy-zzzz]`, because a real
242+
issue would disclose the vulnerability before a fix exists. The title stays
243+
that opaque until publication: board access is wider than advisory access,
244+
and a summary can name the server or the attack. It becomes a public
243245
issue by conversion **once the advisory is published**, never merely once
244246
the fix ships. The `[GHSA-` prefix is load-bearing: **any other draft card
245247
is still a defect to delete**. The flow is the `security-advisory` skill.

0 commit comments

Comments
 (0)