chore(deps): clear dev-scoped npm alerts in the E2E harnesses and close the gaps that let them accumulate - #5523
Conversation
Refreshes the e2e-js and e2e-studio lockfiles to clear six Dependabot alerts, all development-scope transitive dependencies: brace-expansion 2.0.2 -> 2.1.3, nested 1.1.14 -> 1.1.16 (CVE-2026-13149) js-yaml 3.14.2 -> 3.15.0 (CVE-2026-59869, CVE-2026-53550) @babel/core 7.29.0 -> 7.29.7 (CVE-2026-49356) Every bump fits an existing semver range, so no package.json changes and no major upgrades. Runtime-scope dependencies were already clean and stay clean. brace-expansion CVE-2026-14257 remains reported by npm audit. It is vulnerable at <= 5.0.7 and patched only in 5.0.8, with no 2.x backport, while minimatch 5/9 pin ^2.x. It is not fixable without downgrading testcontainers and jest by several majors, and GitHub auto-dismissed it.
/e2e-js and /e2e-studio were the only npm ecosystems without a groups block, so every transitive patch bump consumed one of ten PR slots. Group minor/patch into a single weekly PR per directory, matching the /e2e-go and /studio conventions, and leave majors opening individually. Also documents why ReDoS-class advisories against test-only packages keep surfacing: the auto-triage rule covers CWE-400/770/835/674 for development scope but not CWE-407. That rule lives in the GitHub UI, not in this file.
Both E2E jobs ran npm install, which re-resolves and may drift from the committed lockfile. Dependabot scans the lockfile, so pinning a patched transitive there proved nothing about what CI actually installed. npm ci installs the lockfile exactly and fails loudly when it disagrees with package.json. Both jobs already set cache-dependency-path to the lockfile, so this is the pattern they were written for.
Adds a weekly and path-triggered audit for e2e-js and e2e-studio that splits the gate by dependency scope. Runtime-scope findings fail the job and are currently zero in both projects, so the gate is meaningful. Development-scope findings are written to the job summary and never fail. A blocking gate over the full tree would be permanently red: the brace-expansion advisory CVE-2026-14257 is patched only in 5.0.8, has no 2.x backport, and minimatch pins ^2.x. npm audit proposes escaping it by downgrading jest and testcontainers by several majors, which the workflow header explicitly warns against. The job also runs npm ci, so a lockfile that drifts out of sync with package.json fails here rather than inside a full E2E run.
|
Tick the box to add this pull request to the merge queue (same as
|
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 0 |
🟢 Coverage ∅ diff coverage · -5.60% coverage variation
Metric Results Coverage variation ✅ -5.60% coverage variation Diff coverage ✅ ∅ diff coverage Coverage variation details
Coverable lines Covered lines Coverage Common ancestor commit (5b4fd07) 146712 108862 74.20% Head commit (8e234c7) 178704 (+31992) 122591 (+13729) 68.60% (-5.60%) Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch:
<coverage of head commit> - <coverage of common ancestor commit>Diff coverage details
Coverable lines Covered lines Diff coverage Pull request (#5523) 0 0 ∅ (not applicable) Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified:
<covered lines added or modified>/<coverable lines added or modified> * 100%
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
|
Code review Reviewed the full diff. This is a careful, well-documented, low-risk PR: the lockfile bumps all stay inside existing semver ranges (so npm ci stays in sync), the Actions are SHA-pinned with version comments, job permissions are scoped to contents: read, fail-fast: false is set, and the audit-node matrix (e2e-js/24, e2e-studio/22) matches mvn-test.yml. The scope-split gate plus non-blocking summary is a sound design, and committing the plan under docs/superpowers/plans/ follows established repo convention. A few observations, none blocking:
Minor:
Nothing here needs to hold the merge. Points 1 and 2 are the two I would consider addressing (a wording tweak and a defensive guard around json.load). |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #5523 +/- ##
============================================
+ Coverage 65.34% 66.50% +1.16%
============================================
Files 1748 1748
Lines 146712 146712
Branches 31356 31356
============================================
+ Hits 95868 97573 +1705
+ Misses 37893 36034 -1859
- Partials 12951 13105 +154 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
What does this PR do?
Clears all 6 open Dependabot alerts and closes the process gaps that let them accumulate.
Every open alert was a development-scope npm transitive inside the E2E test harnesses. The Maven ecosystem (the shipped Java product), Studio frontend, Docker, Go and Python ecosystems all had zero open alerts, so nothing here touches a shipped artifact.
Four commits, each independently reviewable:
chore(deps)— lockfile refresh in both E2E projects. Every bump fits an existing semver range, so nopackage.jsonchanges and no major upgrades.ci— group the/e2e-jsand/e2e-studionpm ecosystems independabot.yml. They were the only npm entries without agroups:block, so each transitive patch bump consumed one of ten PR slots. Matches the existing/e2e-goand/studioconventions.ci— install E2E dependencies withnpm ciinstead ofnpm install.ci— new.github/workflows/e2e-dependency-audit.yml, a scope-split audit.Motivation
Two findings drove the scope beyond a plain lockfile bump.
The lockfile was not authoritative in CI. Both E2E jobs ran
npm install, which is free to re-resolve. Dependabot scans the lockfile, so pinning a patched transitive there proved nothing about what CI actually installed — Tier 1 alone would have been cosmetic. Both jobs already declaredcache-dependency-pathpointing at the lockfile, sonpm ciis the pattern they were written for.The audit gate has to be scope-split to stay meaningful.
brace-expansionGHSA-mh99-v99m-4gvg / CVE-2026-14257 is vulnerable at<= 5.0.7and patched only in 5.0.8. There is no 2.x backport andminimatch5/9 pin^2.x, so it is not fixable without downgradingtestcontainersandjestby several majors — which is literally whatnpm audit fix --forceproposes (jest@25,testcontainers@7). GitHub already auto-dismissed it (alerts #156, #158).So the new workflow blocks on runtime scope only (
npm audit --omit=dev, currently zero findings in both projects, so the gate is real) and reports development-scope findings to the job summary without failing. A full-tree gate would be permanently red, and a permanently-red gate teaches people to ignore it.Related issues
No issue filed; this is direct remediation of the open alerts at https://github.com/ArcadeData/arcadedb/security/dependabot.
Deliberately out of scope: the stale Maven Dependabot PRs #3235 (ANTLR 4.9.1 → 4.13.2, open since January, 13 failing checks, cross-cutting across
gremlin/graphql/postgresw/engine) and #4969 (Groovy 4.0.32 → 5.0.7, 6 failing checks). Both are breaking-change majors needing their own branch and investigation; folding them in here would make this unreviewable. They are the larger real risk and worth separate attention.Additional Notes
One manual step this PR cannot perform. The repository's Dependabot auto-triage rule dismisses development-scope alerts for CWE-400/770/835/674 but not CWE-407 (inefficient algorithmic complexity) or CWE-22. That gap is the actual reason these ReDoS-class advisories against test-only packages kept surfacing. Widening the rule to include CWE-407 for development scope is a Security → Dependabot → auto-triage rules setting in the GitHub UI with no config-file equivalent. The explanation is recorded as a comment at the top of
.github/dependabot.ymlso the next person finds it.Verification actually run locally:
js-yamland@babel/coredisappear from the audit entirely. Residual findings are only the CVE-2026-14257 family described above.--omit=dev) is zero in both projects, before and after.npm ciexits 0 in both and installs exactly the patched versions. This gated the CI change rather than following it.--coverage, the path that actually loads@babel/coreandjs-yamlviaload-nyc-config); Playwright enumerates 84 tests in 13 files. All three bumped packages exercised functionally.Not run locally: the full E2E suites, which need a built ArcadeDB Docker image. CI covers those, and this PR's
npm install→npm cichange makes those runs the real test of the lockfile.The implementation plan is committed at
docs/superpowers/plans/2026-07-29-dependabot-e2e-npm-hygiene.md.Checklist
I have run the build using— not applicable and not run. This PR touches no Java, nomvn clean packagepom.xml, and nostudio/code; the diff is two npm lockfiles,dependabot.yml, and two workflow files.My unit tests cover both failure and success scenarios— no unit tests added. This is dependency and CI configuration. The equivalent evidence is the verification list above, including the confirmed-failing baseline before the fix.