Problem
The dev-lead caller-stub .github/workflows/dev-lead.yml, once channel-pinned to a ring tag (@dev-lead/ring0|ring1|next, per the canary-rings rollout #495/#500), trips SonarCloud rule githubactions:S7637 ("External GitHub Actions and workflows should be pinned to a commit hash") at HIGH severity. That drives new_security_rating → C, failing the SonarCloud Quality Gate ≥ A condition, so the required SonarCloud check goes red and the PR cannot merge.
This is a known false-positive class: the ref is a first-party @<agent>/<channel> tag we own and intentionally keep mutable (the basis of the ring model) — exactly the case the org already exempts for the agent (#871), for check_action_pinning, and in standards/ci-standards.md §SonarCloud Exemption: First-Party Reusable-Ref S7637. "Fixing" it the way S7637 wants (SHA-pin) would defeat the moving-channel design.
Live blocker (confirmation case)
petry-projects/bmad-bgreat-suite#334 (bmad → @dev-lead/ring1) is stuck on exactly this:
- Alert:
githubactions:S7637 HIGH on .github/workflows/dev-lead.yml:51 — "Use full commit SHA hash for this dependency."
- Quality Gate:
new_security_rating actual 3 (C) vs required 1 (A) → ERROR.
Root cause
The S7637 standard already exists (ci-standards.md §SonarCloud Exemption), and other stubs are exempted (e.g. google-app-scripts: pr-auto-review.yml, agent-shield.yml, auto-rebase.yml). But dev-lead.yml was never added to consumers' sonar-project.properties when it got channel-pinned, and the dev-lead caller-stub adoption guidance doesn't require the exemption — so every ring-pinned consumer (bmad/TalkTerm ring1, .github ring0, .github-private next, future adopters) hits this.
Fix
Per the existing standard — suppress only githubactions:S7637 only on the dev-lead.yml stub file (per-file sonar.issue.ignore.multicriteria keyed to **/dev-lead.yml; no blanket resourceKey — third-party actions must stay SHA-pinned):
- Adoption guidance — make the dev-lead caller-stub adoption docs + ci-standards.md dev-lead section require the
s7637_devlead exemption whenever dev-lead.yml is channel-pinned (mirror how the other stubs are handled), so future adoptions include it.
- Confirm on the live PR — add the
s7637_devlead exemption to bmad's sonar-project.properties (on the #334 branch — keep the @dev-lead/ring1 pin, the do-NOT-SHA-pin guard comment, and the dev-lead:hands-off label intact), and verify SonarCloud re-runs green (new_security_rating back to A, Quality Gate pass, required SonarCloud check ✅).
- Propagate — apply the same
s7637_devlead exemption to every other dev-lead + SonarCloud consumer that channel-pinned dev-lead.yml.
Acceptance criteria
Refs: #495 #500 #871 · ci-standards.md §"SonarCloud Exemption: First-Party Reusable-Ref S7637" · blocks bmad-bgreat-suite#334
Problem
The dev-lead caller-stub
.github/workflows/dev-lead.yml, once channel-pinned to a ring tag (@dev-lead/ring0|ring1|next, per the canary-rings rollout #495/#500), trips SonarCloud rulegithubactions:S7637("External GitHub Actions and workflows should be pinned to a commit hash") at HIGH severity. That drivesnew_security_rating→ C, failing the SonarCloud Quality Gate≥ Acondition, so the requiredSonarCloudcheck goes red and the PR cannot merge.This is a known false-positive class: the ref is a first-party
@<agent>/<channel>tag we own and intentionally keep mutable (the basis of the ring model) — exactly the case the org already exempts for the agent (#871), forcheck_action_pinning, and instandards/ci-standards.md§SonarCloud Exemption: First-Party Reusable-Ref S7637. "Fixing" it the way S7637 wants (SHA-pin) would defeat the moving-channel design.Live blocker (confirmation case)
petry-projects/bmad-bgreat-suite#334(bmad →@dev-lead/ring1) is stuck on exactly this:githubactions:S7637HIGH on.github/workflows/dev-lead.yml:51— "Use full commit SHA hash for this dependency."new_security_ratingactual3(C) vs required1(A) → ERROR.Root cause
The S7637 standard already exists (ci-standards.md §SonarCloud Exemption), and other stubs are exempted (e.g. google-app-scripts:
pr-auto-review.yml,agent-shield.yml,auto-rebase.yml). Butdev-lead.ymlwas never added to consumers'sonar-project.propertieswhen it got channel-pinned, and the dev-lead caller-stub adoption guidance doesn't require the exemption — so every ring-pinned consumer (bmad/TalkTermring1,.githubring0,.github-privatenext, future adopters) hits this.Fix
Per the existing standard — suppress only
githubactions:S7637only on thedev-lead.ymlstub file (per-filesonar.issue.ignore.multicriteriakeyed to**/dev-lead.yml; no blanketresourceKey— third-party actions must stay SHA-pinned):s7637_devleadexemption wheneverdev-lead.ymlis channel-pinned (mirror how the other stubs are handled), so future adoptions include it.s7637_devleadexemption to bmad'ssonar-project.properties(on the#334branch — keep the@dev-lead/ring1pin, the do-NOT-SHA-pin guard comment, and thedev-lead:hands-offlabel intact), and verify SonarCloud re-runs green (new_security_ratingback to A, Quality Gate pass, requiredSonarCloudcheck ✅).s7637_devleadexemption to every other dev-lead + SonarCloud consumer that channel-pinneddev-lead.yml.Acceptance criteria
dev-lead.ymlsonar-project.propertiesexempts S7637 on**/dev-lead.yml(only); SonarCloud Quality Gate on [Fleet Monitor] petry-projects/.github — daily-org-status.yml #334 passes and#334becomes mergeableresourceKey; third-party actions remain SHA-pinned (S7637 still enforced elsewhere)Refs: #495 #500 #871 · ci-standards.md §"SonarCloud Exemption: First-Party Reusable-Ref S7637" · blocks bmad-bgreat-suite#334