Repository navigation
chore(ci): revisit the braces audit exception before it expires on 2026-11-14 (GHSA-vfj7-8cjw-p6xm) #17890
Description
Activity
This became urgent before the expiry date: the exception is not holding, and the frontend queue is red
#17887 is RED on
Security Scanright now, and every frontend-touching PR will be. The exception recorded today is being withdrawn by the gate, so this needs a ruling well before 2026-11-14.The exception's stated reasoning does not support its conclusion
It reads: "
first_patched_versionnull — every lockfile here is already at 3.0.3, so no bump exists."Both clauses are true and the conclusion does not follow. No bump of
bracesexists. A fix path via the parent does, and that is the question the gate actually asks:braces: fixAvailable = {"name": "stylelint", "version": "7.7.0", "isSemVerMajor": true} isDirect=false, effects=["micromatch"], nodes=["node_modules/braces"]gh api /advisories/GHSA-vfj7-8cjw-p6xmconfirmsfirst_patched_version: nullandvulnerable_version_range: <= 3.0.3;autobot-frontend/package-lock.jsonpins 3.0.3. Both sources are accurate and answer different questions — the advisory DB answers "is there a patchedbraces?", npm answers "is there a fix path?", and for a transitive package npm's answer is a parent bump. The record is correct aboutbracesand wrong about the question the gate asks.What the only offered fix actually is
All six high advisories are one dependency chain:
bump clears stylelint@7.7.0(isSemVerMajor)5 — braces, fast-glob, globby, micromatch, stylelint @vue/eslint-config-typescript@14.0.1(isSemVerMajor)1 fast-urimoderate — below the failing threshold stylelintis a devDependency at^17.15.0and npm proposes7.7.0— a downgrade across ten major versions. npm does this when the only non-vulnerable version is older. This is not an upgrade that was overlooked; it is the same trade already weighed when the exception was recorded, now surfacing as the gate's only offered remedy.Do not run
npm audit fix --forcehere. It would rollstylelintback ten majors to clear a devDependency-only DoS that nothing in a shipped bundle imports.Options
- Re-state the exception and keep
stylelintwhere it is. "No bump ofbracesexists, and the only fix npm offers is a major downgrade of a devDependency, which the owner declines." Requires the gate to distinguish a patched version of the package from a parent-bump fix path, and to let the exception cover the latter. - Take the downgrade. Clears five highs immediately; costs ten major versions of a linter and whatever its config migration entails.
- Scope the gate by dependency type — devDependencies that never enter a shipped bundle judged separately from runtime dependencies. The largest change, and the only one that stops this recurring for the next dev-only advisory.
Recommendation: 1, with 3 filed as the durable follow-up. The owner has already ruled on this trade once; the gate not honouring that ruling is the defect, not the ruling. 2 pays a real maintenance cost to silence a dev-only finding.
Separately — a latent gate defect found while diagnosing this, which is NOT what is firing
_entry_problem(advisory, exception, ids, fixable, today)takes a single globalfixablemeaning "any failing package anywhere in the report has a fix", with no link to the advisory being judged. So an unrelated fixable advisory would withdraw a valid exception, and #17889's "and only to that" is untrue of its implementation.It is not the cause of today's red —
braces' own entry is fixable, so a per-advisory flag returns the same verdict. Recording it here so the two are not conflated: fixing it is correct and will not turnSecurity Scangreen. A fix is in progress and has been reclassified from base-unblock to correctness fix for exactly that reason.- Re-state the exception and keep
- addedneeds-decisionBlocked on an owner decision; options and a recommendation are on the issueBlocked on an owner decision; options and a recommendation are on the issue
on Oct 3, 2026
The exception expires 2026-11-14 and someone has to look again before then
pipeline-scripts/npm_audit_gate.pynow carries one recorded exception, added in PR #17889 under an owner decision on 2026-10-03. This issue exists so the expiry has a home that is open, rather than a date inside a closed issue's comment thread.The advisory, from the GitHub advisory API rather than from the audit summary:
Every lockfile here already carries braces 3.0.3 —
.mcp,autobot-frontend,autobot-slm-frontend,libs/autobot-sdk-ts, and the structured-thinking MCP tool — so there is no version to bump to. The six packagesnpm auditreports are one root cause: micromatch, fast-glob, globby, stylelint and@vue/eslint-config-typescriptare transitive dependents, and the chain isdev: truethroughout, so nothing in a shipped bundle imports it.What to check when this comes up, in the order that settles it fastest:
fixAvailable, and the right action is the bump, then deleting the entry.stylelintand@vue/eslint-config-typescriptare the two roots; if either is replaceable the advisory stops applying to this repo at all, which is better than renewing.The gate fails loudly either way, which is the backstop rather than the plan: an expired entry fails naming its date, and an entry whose advisory is no longer reported fails as dead policy. So the worst case is a blocked PR with an accurate message, not a silent yield.
Refs #13400 (where the gate's "if an advisory has no published fix, change it deliberately and record why" instruction lives) · PR #17889