Skip to content

fix(deps): patch browserslist to 4.28.8 to clear the HIGH advisory blocking every PR - #501

Merged
lidge-jun merged 1 commit into
devfrom
fix/browserslist-advisory-260902
Sep 2, 2026
Merged

fix(deps): patch browserslist to 4.28.8 to clear the HIGH advisory blocking every PR#501
lidge-jun merged 1 commit into
devfrom
fix/browserslist-advisory-260902

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

The dependency advisory gate has been failing on every open pull request on this repository — including #498, which changes only two submodule gitlinks, and pre-existing #473. Two HIGH advisories against browserslist had no allowlist entry:

Advisory Vector
GHSA-c83g-rgw3-j3cx Unbounded memory growth (no cache eviction) via distinct query results, leading to eventual OOM
GHSA-73wf-gq98-2v4g Uncaught crash / prototype write via untrusted browserslist-stats.json custom stats (normalizeStats)

This was not caused by any open PR

Three independent lines of evidence, because "CI went red" invites the assumption that someone's change did it:

  1. chore: update skills_ref and devlog refs for the 260902 ecosystem back-port #498 fails identically, and it changes only two submodule SHAs. A pointer commit cannot introduce a dependency advisory.
  2. Every affected branch has a package-lock.json byte-identical to dev's (git diff --quiet origin/dev HEAD -- package-lock.json).
  3. dev's last green run is 2026-08-22; these runs are 2026-09-02. Same dependency tree, opposite result, eleven days apart. The gate queries a live advisory database, so the advisories were published in that window.

Why upgrade rather than an allowlist entry

The gate offers both remedies: "Either upgrade the package, or add an entry to scripts/audit-allowlist.json stating why the vulnerable path is unreachable."

Upgrade is the right one. The vulnerable range is <=4.28.6 and 4.28.8 is published, so this is a patch bump inside the same minor — not a tolerated exposure.

The reachability argument would have been easy to write: browserslist resolves through exactly one path, @vitejs/plugin-react@babel/core@babel/helper-compilation-targets, which npm explain marks dev, and neither advisory is reachable without attacker-controlled input to a build tool. That is precisely why an entry would have been the wrong callaudit-allowlist.json says an entry "is a decision, not a mute," and it is for advisories we choose to carry. There is no reason to carry one that has a published patch.

package.json is untouched; only the lockfile resolution moved. The footprint is browserslist plus its own data packages:

browserslist            4.28.2       -> 4.28.8
caniuse-lite            1.0.30001790 -> 1.0.30001810
electron-to-chromium    1.5.344      -> 1.5.420
node-releases           2.0.38       -> 2.0.54
update-browserslist-db  1.2.3        -> 1.3.2

Verification

Check Result
npx tsx scripts/check-deps-audit.ts PASS — "11 advisory package(s); 11 allowlisted, 0 unexpected"
npm run build pass
npm run build:frontend pass — this is the build that actually consumes browserslist (autoprefixer targets), so the data-package bumps are exercised rather than merely installed
npm test 8410 tests, 8384 pass, 0 fail, 26 skipped

Attribution note for anyone reproducing the test run. A first pass showed 10 failures, all of them skill-file tests reading skills_ref (WAIS-001..004, EMP-008, P37-CU-010, and others). The submodule was checked out on a stale local branch predating the jaw- rename, so those tests were looking for jaw-* paths absent from that tree. Aligning skills_ref to the SHA dev records turns the same two files from 0/6 to 6/6, and the full suite to 0 fail. Unrelated to this change, but worth recording so the number is not mistaken for a regression later.

Security review requested

AGENTS.md reserves dependency changes for explicit security review, so this is deliberately a separate PR rather than folded into the skill or model-catalog stacks. It touches no credential, auth, or quota path — lockfile only.

Checklist

  • Targets dev
  • npm run build run
  • npm run build:frontend run
  • Full npm test run (a lockfile change is repo-wide, so the scoped default does not apply): 0 failures
  • Advisory gate verified green locally on this exact head
  • package.json unchanged — no new or removed dependency declaration
  • No credential, auth, or quota-logic change
  • Security review pending per AGENTS.md (dependency change)
  • No screenshot — no UI surface

Made with Cursor

…ocking every PR

The dependency advisory gate has been failing on every open pull request, including
#498, which changes only two submodule gitlinks. Two HIGH advisories against
browserslist had no allowlist entry:

  GHSA-c83g-rgw3-j3cx  unbounded memory growth (no cache eviction) via distinct
                       query results, leading to eventual OOM
  GHSA-73wf-gq98-2v4g  uncaught crash / prototype write via untrusted
                       browserslist-stats.json custom stats (normalizeStats)

## Not caused by any open PR

Three independent lines of evidence:

- #498 fails identically and changes only two submodule SHAs. A pointer commit cannot
  introduce a dependency advisory.
- Every affected branch has a package-lock.json byte-identical to dev's.
- dev's last green run is 2026-08-22; these runs are 2026-09-02. Same dependency tree,
  opposite result, eleven days apart. The gate queries a live advisory database, so the
  advisories were published in that window.

## Upgrade, not an allowlist entry

The gate offers both remedies. Upgrade is the right one here: the vulnerable range is
<=4.28.6 and 4.28.8 is published, so this is a PATCH bump inside the same minor, not a
tolerated exposure. An allowlist entry would have documented around a fix that exists.

The reachability argument would have been easy to write -- browserslist resolves through
exactly one path, @vitejs/plugin-react -> @babel/core -> @babel/helper-compilation-targets,
which npm marks dev, and neither advisory is reachable without attacker-controlled input
to a build tool. That is precisely why an entry would have been the wrong call: the
allowlist is for advisories we choose to CARRY, and there is no reason to carry this one.

package.json is untouched; only the lockfile resolution moved. Footprint is browserslist
and its own data packages:

  browserslist            4.28.2      -> 4.28.8
  caniuse-lite            1.0.30001790 -> 1.0.30001810
  electron-to-chromium    1.5.344     -> 1.5.420
  node-releases           2.0.38      -> 2.0.54
  update-browserslist-db  1.2.3       -> 1.3.2

## Verification

  check-deps-audit.ts   PASS -- 11 advisory packages, 11 allowlisted, 0 unexpected
  npm run build         pass
  npm run build:frontend pass (this is the build that actually consumes browserslist,
                         via autoprefixer targets, so the data-package bumps are
                         exercised rather than merely installed)
  npm test              8410 tests, 8384 pass, 0 fail, 26 skipped

One attribution note for anyone reproducing the test run: a first pass showed 10 failures,
all of them skill-file tests reading skills_ref (WAIS-001..004, EMP-008, P37-CU-010, and
others). The submodule was checked out on a stale local branch predating the jaw- rename,
so those tests were looking for jaw-* paths that did not exist in that tree. Aligning
skills_ref to the SHA dev records turns the same two files from 0/6 to 6/6, and the full
suite to 0 fail. Nothing to do with this change.

Co-authored-by: Cursor <cursoragent@cursor.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 2, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-02T08:16:43.758236Z b4dcbfa PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Sep 2, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 4ffa157c-c139-4450-90f3-14b72f912792

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b4dcbfa67a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread package-lock.json
"version": "4.28.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
"integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
"version": "4.28.8",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update the Electron lockfile too

When desktop dependencies are installed, this upgrade has no effect on that tree: .github/workflows/desktop-release.yml runs npm ci --prefix electron, while electron/package-lock.json still pins browserslist 4.28.2, which is within the commit's cited vulnerable range (<=4.28.6). The root advisory gate becomes green, but the desktop build continues installing the vulnerable copy, so regenerate or update the Electron lockfile as part of this remediation.

Useful? React with 👍 / 👎.

lidge-jun added a commit that referenced this pull request Sep 2, 2026
020 was rewritten: the advisory blocker is fixed by upgrade in #501 rather than carried,
and the doc now records why the allowlist entry was the wrong instrument despite being the
easier one to write.

  devlog  382c004 -> 79e6f4e

Co-authored-by: Cursor <cursoragent@cursor.com>
@lidge-jun
lidge-jun merged commit 6872a68 into dev Sep 2, 2026
10 checks passed
@lidge-jun
lidge-jun deleted the fix/browserslist-advisory-260902 branch September 2, 2026 09:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant