deps: unblock CI (dependency advisories, Playwright image) #167

Merged
claude-bot merged 5 commits from deps/unblock-ci-2026-11 into main 2026-11-03 02:16:02 +00:00
Collaborator

Why the Renovate PRs were deadlocked

All three gating jobs are red on main itself (last push run 8586, and every PR run since), for three independent reasons. A Renovate PR changes one package, so it can never turn all three green, and nothing merges:

  1. frontend / Dependency audit — npm run audit:ci fails on HIGH/CRITICAL advisories in existing deps: tinypool (2x critical, prototype pollution to RCE), undici, js-yaml (GHSA-2883-xcg3-v3hh), source-map-js, brace-expansion, vite (launch-editor).
  2. backend / Dependency audit — pip-audit -r requirements.txt found 52 advisories in authlib 1.7.2, certifi 2026.7.22, joserfc 1.7.4 and pillow 12.3.0. Once those were fixed, requirements-dev.txt also showed urllib3 2.7.0, msgpack 1.2.1 and filelock 3.32.2.
  3. e2e — not a dependency advisory. e2e/package-lock.json is on @playwright/test 1.62.1, but the CI container (and e2e/Dockerfile) still pin mcr.microsoft.com/playwright:v1.56.1-noble. 12 of 13 journeys fail with browserType.launch: Executable doesn't exist ... chromium_headless_shell-1234. Renovate bumps the npm package but not the image pin, so this breaks again on every Playwright update.

Changes

Frontend (frontend/package-lock.json, package.json)

  • npm audit fix, lockfile only, within existing ranges: undici 8.9.0 → 8.12.3, vite 7.3.6 → 7.3.7, source-map-js 1.2.1 → 1.2.2, js-yaml 4.3.0 → 4.3.2, @redocly/openapi-core 1.34.18 → 1.34.23 (brace-expansion 2.1.4 → 2.1.7 under it).
  • Major bump: vitest and @vitest/coverage-v8 ^3.2.7 → ^4.1.12. Why: the two CRITICAL tinypool advisories (GHSA-5gmw-xhrv-c9v3, GHSA-85c8-ppgw-ccpr) affect tinypool <=2.1.1, and vitest 3.x requires tinypool ^1.1.1. vitest 4.1.12 is the lowest release that no longer depends on tinypool, and it still supports vite 7. npm's own --force suggestion was vitest 5.1.0. It also removes glob/test-exclude and fixes the @vitest/mocker moderates. vite.config.ts and the test files needed no changes: all 250 tests pass.
  • Renovate's lockfile-only updates folded in, at the same versions (all within range): @tanstack/react-query 5.105.3 (#165), @tanstack/react-virtual 3.14.25 (#163), jsdom 30.1.3 (#166).
  • npm install on the stock npm 10.9 crashed with Cannot read properties of null (reading 'edgesOut'), so the vitest change was made with npx npm@11.6.2. The lockfile was then checked with the stock npm 10.9.9 (rm -rf node_modules && npm ci).

Allowlist (frontend/audit-allowlist.json)

  • Removed GHSA-5p4m-2wfm-xmqj (js-yaml !!omap). js-yaml 4.3.2 is no longer flagged for it, so the entry matched nothing, and the gate fails on stale entries. No entries were added. The allowlist is now empty. (That entry's reviewBy was 2026-11-07, so it would have expired this week anyway.)

Backend (backend/requirements*.txt, via pip-compile -P <pkg> for the flagged packages only)

  • Both locks: authlib 1.7.2 → 1.9.2, joserfc 1.7.4 → 1.7.7, certifi 2026.7.22 → 2026.10.23, pillow 12.3.0 → 13.0.0 (major).
  • Dev lock only (pip-audit's own cachecontrol stack): urllib3 2.7.0 → 2.8.0, msgpack 1.2.1 → 1.2.4, filelock 3.32.2 → 4.2.7 (major).
  • Why the two majors: every fix version listed for pillow is 13.0.0, and for filelock it is 4.0.9/4.2.1. No 12.x or 3.x fix exists. pyproject's pillow>=11.0 already admits 13. filelock is only pulled in by pip-audit → cachecontrol and is not in the deployed set. Renovate marks authlib and pillow security-sensitive, so these deserve a human look.

e2e / CI

  • @playwright/test 1.62.1 → 1.64.1 (Renovate #164), and mcr.microsoft.com/playwright v1.56.1-noble → v1.64.1-noble in both .forgejo/workflows/ci.yml and e2e/Dockerfile. I checked that the tag exists on MCR.

CHANGELOG

  • Unreleased: one Security entry and one Fixed entry.

Verified locally (claude-dev, outside containers)

  • Frontend (node 22.23.3, npm 10.9.9): npm ci, then npm run audit:ci → gate passed (1 advisory, none blocking: moderate minimatch via @redocly). npm run types:check → types match. npx tsc --noEmit → OK. npm test → 250/250 passed on vitest 4.1.12. npm run build → OK.
  • Backend (Python 3.11.17 venv to match CI's bookworm 3.11; ci.yml install commands): ruff check . → passed. pip-audit -r requirements.txt and -r requirements-dev.txt → No known vulnerabilities found for both. pip check → OK. alembic upgrade head / downgrade base (python -I) → OK. I also checked that a cp311 manylinux wheel exists for pillow 13.0.0. The full pytest suite (~1558 tests) was still running when this PR was opened: local disk I/O made it very slow. CI's backend job runs it.
  • e2e: npm ci in e2e → 0 vulnerabilities. The suite ran with Playwright 1.64.1's chromium-headless-shell, against this branch's backend (pillow 13 etc.) and frontend → 13/13 passed. The Playwright container image itself was not run locally, because there is no Docker on this host.

Not included / unresolved

  • #133 lock file maintenance is not folded in. It rewrites the whole frontend lockfile and would conflict with this one. Renovate should rebase it once this lands.
  • One moderate stays below the gate: minimatch <11.0.1 under @redocly/openapi-core 1.x (openapi-typescript 7.13.0 is the latest). It is dev-only and parses only our own committed schema. The only fix npm offers is a breaking --force.
  • Recommendation: add a Renovate customManagers regex so the mcr.microsoft.com/playwright:vX-noble pins in ci.yml and e2e/Dockerfile move in the same PR as @playwright/test. Otherwise the e2e job breaks again on the next Playwright bump.

Merging this deploys nothing: images are published only on v* tags.

🤖 Generated with Claude Code

## Why the Renovate PRs were deadlocked All three gating jobs are red on `main` itself (last push run 8586, and every PR run since), for three independent reasons. A Renovate PR changes one package, so it can never turn all three green, and nothing merges: 1. **frontend / Dependency audit** — `npm run audit:ci` fails on HIGH/CRITICAL advisories in existing deps: tinypool (2x critical, prototype pollution to RCE), undici, js-yaml (GHSA-2883-xcg3-v3hh), source-map-js, brace-expansion, vite (launch-editor). 2. **backend / Dependency audit** — `pip-audit -r requirements.txt` found 52 advisories in authlib 1.7.2, certifi 2026.7.22, joserfc 1.7.4 and pillow 12.3.0. Once those were fixed, `requirements-dev.txt` also showed urllib3 2.7.0, msgpack 1.2.1 and filelock 3.32.2. 3. **e2e** — not a dependency advisory. `e2e/package-lock.json` is on `@playwright/test` 1.62.1, but the CI container (and `e2e/Dockerfile`) still pin `mcr.microsoft.com/playwright:v1.56.1-noble`. 12 of 13 journeys fail with `browserType.launch: Executable doesn't exist ... chromium_headless_shell-1234`. Renovate bumps the npm package but not the image pin, so this breaks again on every Playwright update. ## Changes ### Frontend (`frontend/package-lock.json`, `package.json`) - `npm audit fix`, lockfile only, within existing ranges: undici 8.9.0 → 8.12.3, vite 7.3.6 → 7.3.7, source-map-js 1.2.1 → 1.2.2, js-yaml 4.3.0 → 4.3.2, @redocly/openapi-core 1.34.18 → 1.34.23 (brace-expansion 2.1.4 → 2.1.7 under it). - **Major bump: vitest and @vitest/coverage-v8 ^3.2.7 → ^4.1.12.** Why: the two CRITICAL tinypool advisories (GHSA-5gmw-xhrv-c9v3, GHSA-85c8-ppgw-ccpr) affect tinypool <=2.1.1, and vitest 3.x requires tinypool ^1.1.1. vitest 4.1.12 is the lowest release that no longer depends on tinypool, and it still supports vite 7. npm's own `--force` suggestion was vitest 5.1.0. It also removes glob/test-exclude and fixes the @vitest/mocker moderates. vite.config.ts and the test files needed no changes: all 250 tests pass. - Renovate's lockfile-only updates folded in, at the same versions (all within range): @tanstack/react-query 5.105.3 (#165), @tanstack/react-virtual 3.14.25 (#163), jsdom 30.1.3 (#166). - `npm install` on the stock npm 10.9 crashed with `Cannot read properties of null (reading 'edgesOut')`, so the vitest change was made with `npx npm@11.6.2`. The lockfile was then checked with the stock npm 10.9.9 (`rm -rf node_modules && npm ci`). ### Allowlist (`frontend/audit-allowlist.json`) - **Removed** GHSA-5p4m-2wfm-xmqj (js-yaml !!omap). js-yaml 4.3.2 is no longer flagged for it, so the entry matched nothing, and the gate fails on stale entries. **No entries were added.** The allowlist is now empty. (That entry's reviewBy was 2026-11-07, so it would have expired this week anyway.) ### Backend (`backend/requirements*.txt`, via `pip-compile -P <pkg>` for the flagged packages only) - Both locks: authlib 1.7.2 → 1.9.2, joserfc 1.7.4 → 1.7.7, certifi 2026.7.22 → 2026.10.23, **pillow 12.3.0 → 13.0.0 (major)**. - Dev lock only (pip-audit's own cachecontrol stack): urllib3 2.7.0 → 2.8.0, msgpack 1.2.1 → 1.2.4, **filelock 3.32.2 → 4.2.7 (major)**. - Why the two majors: every fix version listed for pillow is 13.0.0, and for filelock it is 4.0.9/4.2.1. No 12.x or 3.x fix exists. pyproject's `pillow>=11.0` already admits 13. filelock is only pulled in by pip-audit → cachecontrol and is not in the deployed set. Renovate marks authlib and pillow security-sensitive, so these deserve a human look. ### e2e / CI - `@playwright/test` 1.62.1 → 1.64.1 (Renovate #164), and `mcr.microsoft.com/playwright` v1.56.1-noble → **v1.64.1-noble** in both `.forgejo/workflows/ci.yml` and `e2e/Dockerfile`. I checked that the tag exists on MCR. ### CHANGELOG - Unreleased: one Security entry and one Fixed entry. ## Verified locally (claude-dev, outside containers) - **Frontend** (node 22.23.3, npm 10.9.9): `npm ci`, then `npm run audit:ci` → *gate passed (1 advisory, none blocking: moderate minimatch via @redocly)*. `npm run types:check` → types match. `npx tsc --noEmit` → OK. `npm test` → **250/250 passed** on vitest 4.1.12. `npm run build` → OK. - **Backend** (Python 3.11.17 venv to match CI's bookworm 3.11; ci.yml install commands): `ruff check .` → passed. `pip-audit -r requirements.txt` and `-r requirements-dev.txt` → **No known vulnerabilities found** for both. `pip check` → OK. `alembic upgrade head` / `downgrade base` (`python -I`) → OK. I also checked that a cp311 manylinux wheel exists for pillow 13.0.0. **The full pytest suite (~1558 tests) was still running when this PR was opened**: local disk I/O made it very slow. CI's backend job runs it. - **e2e**: `npm ci` in e2e → 0 vulnerabilities. The suite ran with Playwright 1.64.1's chromium-headless-shell, against this branch's backend (pillow 13 etc.) and frontend → **13/13 passed**. The Playwright container image itself was not run locally, because there is no Docker on this host. ## Not included / unresolved - **#133 lock file maintenance** is not folded in. It rewrites the whole frontend lockfile and would conflict with this one. Renovate should rebase it once this lands. - One moderate stays below the gate: minimatch <11.0.1 under `@redocly/openapi-core` 1.x (openapi-typescript 7.13.0 is the latest). It is dev-only and parses only our own committed schema. The only fix npm offers is a breaking `--force`. - Recommendation: add a Renovate `customManagers` regex so the `mcr.microsoft.com/playwright:vX-noble` pins in ci.yml and e2e/Dockerfile move in the same PR as `@playwright/test`. Otherwise the e2e job breaks again on the next Playwright bump. Merging this deploys nothing: images are published only on `v*` tags. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
npm audit fix within existing ranges: undici 8.9.0 -> 8.12.3, vite
7.3.6 -> 7.3.7, source-map-js 1.2.1 -> 1.2.2, js-yaml 4.3.0 -> 4.3.2,
@redocly/openapi-core 1.34.18 -> 1.34.23 (and its brace-expansion).

vitest and @vitest/coverage-v8 ^3.2.7 -> ^4.1.12: the two CRITICAL
tinypool advisories (GHSA-5gmw-xhrv-c9v3, GHSA-85c8-ppgw-ccpr) are fixed
only by leaving tinypool, which vitest 4 no longer depends on. It also
drops glob/test-exclude and the @vitest/mocker moderates.

js-yaml 4.3.2 carries the GHSA-5p4m-2wfm-xmqj fix, so its allowlist
entry now matches nothing and the gate requires its removal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lockfile only, within the existing ranges (the same versions Renovate
proposed in #163, #165 and #166, which could not pass CI on their own):
@tanstack/react-query 5.105.3, @tanstack/react-virtual 3.14.25,
jsdom 30.1.3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Recompiled with pip-compile -P for the flagged packages only.

requirements.txt and requirements-dev.txt:
  authlib 1.7.2 -> 1.9.2, joserfc 1.7.4 -> 1.7.7,
  certifi 2026.7.22 -> 2026.10.23, pillow 12.3.0 -> 13.0.0
requirements-dev.txt only (pip-audit's own cache stack):
  urllib3 2.7.0 -> 2.8.0, msgpack 1.2.1 -> 1.2.4, filelock 3.32.2 -> 4.2.7

Pillow and filelock are major bumps because every listed fix version is
in the new major (pillow 13.0.0; filelock 4.0.9/4.2.1). pyproject's
pillow>=11.0 already admits 13.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The suite was on @playwright/test 1.62.1 while the CI container and
e2e/Dockerfile stayed on mcr.microsoft.com/playwright:v1.56.1-noble, so
every journey failed with "Executable doesn't exist" (chromium build
1234 not in the image). Takes Renovate's @playwright/test 1.64.1 (#164)
and moves both image pins to v1.64.1-noble with it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Changelog: CI unblock (dependency advisories, Playwright image)
All checks were successful
CI / frontend (pull_request) Successful in 2m34s
CI / e2e (pull_request) Successful in 3m29s
CI / backend (pull_request) Successful in 12m55s
CI / publish (pull_request) Successful in 11s
dee87ed9e8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-bot deleted branch deps/unblock-ci-2026-11 2026-11-03 02:16:03 +00:00
Sign in to join this conversation.
No description provided.