This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow-steward.git


The following commit(s) were added to refs/heads/main by this push:
     new e3ac5d2  feat(security-issue-sync): auto-propose backtick-wrap for 
Affected versions field (#367)
e3ac5d2 is described below

commit e3ac5d22f0eff64b5f498481a635fc796856d8ad
Author: Jarek Potiuk <[email protected]>
AuthorDate: Fri May 29 00:43:25 2026 +0200

    feat(security-issue-sync): auto-propose backtick-wrap for Affected versions 
field (#367)
    
    The ``Affected versions`` body field on tracker issues holds version
    expressions like ``>= 3.0.0, < 3.2.2``. Without backticks the leading
    ``>`` is interpreted by GitHub as a markdown blockquote, so the
    rendered field shows as a quoted single line. Maintainers editing via
    the issue-form UI then see the visible (un-quoted) text and "fix" it
    by removing the ``>=`` prefix, silently turning a bounded range into a
    misleading single-version entry like ``3.2.1`` — and the CVE record
    that follows publishes with the wrong affected range.
    
    Surface the un-wrapped state as a Step 1d signal so the sync proposes
    the wrap on every run that encounters one, and reinforce on the
    auto-derived ``Affected versions`` value (Step 2b) that the emitter
    must wrap. The generate-cve-json parser already strips backticks at
    parse time (``cleaned = value.strip().strip("\`").strip()``), so this
    is a pure-cosmetic + edit-resilience fix with no semantic change.
    
    Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
---
 .claude/skills/security-issue-sync/SKILL.md | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/.claude/skills/security-issue-sync/SKILL.md 
b/.claude/skills/security-issue-sync/SKILL.md
index 31746c2..5691083 100644
--- a/.claude/skills/security-issue-sync/SKILL.md
+++ b/.claude/skills/security-issue-sync/SKILL.md
@@ -758,7 +758,8 @@ update, label change, or next-step recommendation in Step 2:
 | The referenced `<upstream>` PR has been opened but is still in `open` state 
| Propose `pr created` label; update the *"PR with the fix"* body field with 
the PR URL. |
 | The referenced `<upstream>` PR moved to `merged` | Propose swapping `pr 
created` → `pr merged`; update milestone to the shipping release if now known. 
**Also**: check whether all six mandatory CVE body fields are populated (*CWE*, 
*Affected versions*, *Severity*, *Reporter credited as*, *Short public summary 
for publish*, *PR with the fix*). If any is empty / `_No response_`, propose 
posting (or PATCH-updating) the *Remediation-developer fill-fields comment* per 
[the dedicated bullet i [...]
 | The *"PR with the fix"* body field has at least one PR URL **and** the 
*"Remediation developer"* body field is missing the PR author's name (or is 
`_No response_`) | Propose appending the PR author's display name (`gh pr view 
<N> --repo <upstream> --json author --jq '.author.name // .author.login'`) to 
the *"Remediation developer"* body field. **Append, never overwrite** — manual 
edits (co-authors added by the triager, name spelling corrections, "Anonymous" 
overrides) must survive subs [...]
-| The *"Affected versions"* body field is missing, holds a pre-convention 
shape, or carries the project's pre-release sentinel, and the tracker is 
**not** at `fix released` yet | Propose populating / refining *"Affected 
versions"* per the project's convention. The per-scope shape, the pre-release 
sentinel (if any), and the lifecycle live in 
[`<project-config>/scope-labels.md` — *Affected versions convention by 
scope*](../../../<project-config>/scope-labels.md#affected-versions-convention 
[...]
+| The *"Affected versions"* body field is missing, holds a pre-convention 
shape, or carries the project's pre-release sentinel, and the tracker is 
**not** at `fix released` yet | Propose populating / refining *"Affected 
versions"* per the project's convention. The per-scope shape, the pre-release 
sentinel (if any), and the lifecycle live in 
[`<project-config>/scope-labels.md` — *Affected versions convention by 
scope*](../../../<project-config>/scope-labels.md#affected-versions-convention 
[...]
+| The *"Affected versions"* body field has a value but it is **not 
backtick-wrapped** (the raw value, as returned by `gh issue view --json body`, 
starts with a `>` character or contains a bare `>=` / `<=` / `<` / `>` token 
outside a `` ` `` … `` ` `` span) | Propose wrapping the value in backticks 
(e.g. `` `>= 3.0.0, < 3.2.2` ``, `` `< 3.2.2` ``, `` `<= 3.2.1` ``). **Why:** 
the leading `>` is the markdown blockquote marker — without backticks, GitHub 
renders the rendered field as a quote [...]
 | A tracker is transitioning to `fix released` (per the row below) and 
*"Affected versions"* still carries the project's pre-release sentinel | 
Propose replacing the sentinel with the concrete released version per the 
project's convention; see [`<project-config>/scope-labels.md` — *Affected 
versions convention by 
scope*](../../../<project-config>/scope-labels.md#affected-versions-convention-by-scope)
 for the recipe. After the body update, regenerate the CVE JSON attachment so 
`versions[] [...]
 | A release carrying the fix has shipped. Detection is **scope-dependent** — 
different scope labels on a project can ride different release trains, each 
with its own *"is it released?"* signal (which artifact registry to consult, 
what to query, how to map a tracker's milestone to that registry, 
partial-release edge cases). The per-scope detection recipe lives in 
[`<project-config>/scope-labels.md` — *Detecting that a fix release has 
shipped*](../../../<project-config>/scope-labels.md#det [...]
 | GHSA state transition (opened, accepted, published, rejected) in a 
GHSA-forwarded email | If the GHSA is closed as "not accepted" but the security 
team accepted the report on `security@`, flag the divergence in the status 
comment so it is not lost. |
@@ -1413,7 +1414,12 @@ will change and *why*. Group them by category:
     convention by 
scope*](../../../<project-config>/scope-labels.md#affected-versions-convention-by-scope)).
     Propose only when the milestone uniquely determines the affected
     range; flag ambiguity (e.g. multiple backport milestones with
-    partial coverage) rather than guessing.
+    partial coverage) rather than guessing. **Always emit the proposed
+    value wrapped in backticks** (e.g. `` `>= X.Y.Z, < A.B.C` ``,
+    `` `< A.B.C` ``); see the *"`Affected versions` body field has a
+    value but it is not backtick-wrapped"* row in the Step 1d signal
+    table for why this matters (raw `>=` renders as a markdown
+    blockquote and form-UI edits silently lose the prefix).
 
   All other mandatory fields stay on the *external-signal* path:
   propose values only when the discussion, mail thread, PR, or GHSA

Reply via email to