Repository navigation
build(deps): update Python, frontend, docs, base image and Actions pins - #6
Conversation
Python: bump the pyproject pins the way Dependabot's python-minor-and-patch group does (anthropic 1.17.0, openai 3.37.0, pydantic 2.14.1, sqlalchemy 2.0.55, starlette 1.10.0, cryptography 50.0.2, sentry-sdk 2.73.0, spacy 3.8.16, lxml 6.1.3, protobuf 7.36.2, validators 0.36.0, setuptools 84.2.1) and regenerate requirements-lock.txt with --upgrade inside the CI base image, which moves 87 packages, among them aiohttp 3.14.5, urllib3 2.8.0, pyjwt 2.15.1, oauthlib 4.0.0, certifi 2026.10.23 and multidict 7.2.1. fastapi, thinc and sqlalchemy 2.1 are deliberately left where they are: the first two are on Dependabot's ignore list, the third is a separate migration. Frontend: take every minor and patch update (vuetify 4.3.0, vue 3.5.44, vue-router 5.4.0, tiptap 3.32.0, axios 1.20.0, dompurify 3.4.17, vite 8.3.5, eslint 10.13.0, ...). Three edits beyond the bumps: - pin @openid/appauth to 1.3.2 in package.json. The hold from Netflix#320 lived only in the lockfile, so a regenerated lock resolved ^1.3.1 to 1.4.0 and the build failed on the deep import in pkceAuthProvider.js; - move the monaco-editor dompurify override to 3.4.17, otherwise monaco keeps a nested vulnerable copy; - override two optional peers (htmlnano -> cssnano ^7.1.9, @vuetify/v0 -> @vue/devtools-api ^6.6.4) so npm does not nest copies that check-lock-dev-flags.mjs counts as unreachable production packages. components.d.ts is regenerated by unplugin-vue-components 0.28. docs: react 19.3.1, @mdx-js/react 3.1.1 and the transitive tree. docker: python 3.14.7 -> 3.14.9-slim-trixie. Actions: setup-node 7.1.0, codecov-action 7.1.1, deploy-pages 5.0.1, SHA pins as in Dependabot's PRs. Verified locally: ruff, app import, pytest (2085 passed, 104 skipped on postgres:18), python-lock-sync byte-for-byte, eslint, tsc, vitest 318/318, vite build, both lockfile gates, docusaurus build. Dependabot alerts go from 34 to 3 for Python (python-jose and ecdsa have no fixed release) and from 48 to 4 for the frontend (markdown-it/linkify-it have no fix, happy-dom needs a major and is test-only); the 34 left in docs are inside Docusaurus 3.10.2 itself. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
It is a sweeping multi-ecosystem dependency bump with fully regenerated lockfiles and a regenerated generated type file that cannot be fully verified by static review and warrants human review plus CI/image-smoke validation.
1 open issue
What changed in this PR
This PR is a broad, mostly-mechanical dependency maintenance pass across every manifest in the repository, consolidating ~42 Dependabot updates plus security fixes that required regenerated lockfiles. It bumps Python runtime pins, frontend npm dependencies, docs (Docusaurus) dependencies, the Docker Python base image, and the SHA pins for GitHub Actions. A handful of non-version edits are included (an exact @openid/appauth pin, a monaco-editor → dompurify override, and two optional-peer overrides) to keep the regenerated lockfiles buildable and free of flagged vulnerabilities.
Changes:
- Bump Python (
pyproject.toml,constraints.txt) and frontend/docs npm dependency pins, regeneratingcomponents.d.tsvia a newerunplugin-vue-components. - Bump the Docker base image
python:3.14.7-slim-trixie→3.14.9-slim-trixie(both stages; rootDockerfileis a symlink). - Update pinned GitHub Actions to
setup-nodev7.1.0,codecov-actionv7.1.1, anddeploy-pagesv5.0.1 (SHAs verified against their tags).
| File | Description |
|---|---|
pyproject.toml |
Raises several Python pins; atlassian-python-api floor moved to >=5.0.5, which now contradicts its adjacent comment. |
constraints.txt |
Bumps setuptools to 84.2.1. |
src/dispatch/static/dispatch/package.json |
Updates frontend deps/devDeps, pins @openid/appauth exactly, adds htmlnano/@vuetify/v0 overrides. |
src/dispatch/static/dispatch/components.d.ts |
Regenerated by newer unplugin; module target @vue/runtime-core→vue; stale V*/unused entries pruned (vite config uses no Vuetify resolver). |
docs/package.json, docs/package-lock.json |
Bumps react/@mdx-js/react and refreshes the transitive Docusaurus tree. |
docker/Dockerfile |
Bumps Python base image to 3.14.9 in both build stages. |
.github/workflows/*.yml |
Updates pinned Action SHAs (setup-node, codecov-action, deploy-pages) consistently across all workflows. |
Review effort: Balanced
Review feedback on #6: the comment above the pin explains why the floor is 5.0.3, and nothing justifies 5.0.5 as a floor. Restore the range; the lock resolves to 5.0.5 either way. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
It is a wide-reaching dependency and base-image update across many manifests and hand-regenerated lockfiles whose published-version existence and runtime behavior cannot be fully verified here, so final human review is warranted despite passing all internal-consistency checks.
No open issues 🎉
1 resolved since last review
Review effort: Balanced

What
One pass over every dependency manifest in the repo, equivalent to merging Jamyn's 42 open Dependabot PRs plus the security fixes that need a regenerated lockfile.
pyproject.toml,constraints.txt,requirements-lock.txt)--upgradeinsidepython:3.14.9-slim-trixiewith uv 0.5.9: 87 packages move, among them aiohttp 3.14.5, urllib3 2.8.0, pyjwt 2.15.1, oauthlib 4.0.0, certifi 2026.10.23, multidict 7.2.1.components.d.tsregenerated by unplugin-vue-components 0.28.python:3.14.7-slim-trixie→3.14.9-slim-trixie(both stages).Deliberately not touched:
fastapi(minor/major on the Dependabot ignore list),thinc(ignored),sqlalchemy2.1 (a separate migration),apexcharts(MIT pin), majors in the frontend (@formkit/vue2,typescript7,unplugin-vue-components32,dotenv17,happy-dom21).Three edits beyond version bumps
@openid/appauthis pinned to1.3.2inpackage.json. The hold from Jamyn/dispatch#320 lived only in the lockfile, so a regenerated lock resolved^1.3.1to 1.4.0 andvite buildfailed on@openid/appauth/built/authorization_request_handlerinpkceAuthProvider.js.monaco-editor → dompurifyoverride moves to 3.4.17; without it monaco keeps a nested vulnerable copy and the critical alert stays open.htmlnano → cssnano ^7.1.9and@vuetify/v0 → @vue/devtools-api ^6.6.4. npm otherwise nests a second copy thatscripts/check-lock-dev-flags.mjscounts as an unflagged package production cannot reach. Both peers are optional and dev-time only.Verification
Local, same commands as CI:
ruff check,ruff format --check,python -c "import dispatch.main, dispatch.cli"from the lock alone;pytest -n autoagainstpostgres:18: 2085 passed, 104 skipped;python-lock-syncreproduced byte-for-byte (uv pip compilewithout--upgradeinside the base image);npm run lint,npm run typecheck,vitest run --dom318/318,npm run buildwith the monaco worker present,check-lock-dev-flags.mjs,npm ci --dry-runfor all three lockfiles;docs:npm ci && npm run build.The image build is left to
image-smoke.Vulnerabilities
requirements-lock.txtpython-jose,ecdsa: no fixed release existspackage-lock.jsonmarkdown-it/linkify-it: no fix;happy-domneeds a major, test-onlydocs/package-lock.jsonNotes
Cannot read properties of null (reading 'edgesOut')in#loadPeerSetonvitest, even on the untouchedpackage.json. npm 10 accepts the result andnpm install --package-lock-onlyleaves it unchanged.tests/auth/(test_oidc_entra.py,test_auth_providers.py,test_entra_end_to_end.py) fail on any machine whose local timezone is not UTC: tokens are minted withdatetime.utcnow().timestamp(). Pre-existing, unrelated to this change, green underTZ=UTC; worth its own fix.🤖 Generated with Claude Code