security: clear open Dependabot alerts across all four projects - #2144
Merged
Conversation
Fixes 9 of the 10 open alerts. Lockfile refreshes cover most of them; two needed more than a range bump: - pdfjs-dist (GHSA, alert 1276) is pinned exactly at 6.1.200 by @arthur/shared-components, so no range bump can reach 6.2.108 — added a `resolutions` entry. - json-repair (GHSA-xf7x-x43h-rpqh, alert 1045) is capped <0.53.0 by beeai-framework, still true in its latest 0.1.82, so a constraint cannot lift it — used `override-dependencies`. beeai's only call site is `json_repair.loads(input, stream_stable=...)` in backend/utils.py; it never passes schema=, which is the vulnerable resolver, and that signature is unchanged in 0.63.2. npm (genai-engine/ui): nanoid 3.3.16->3.3.18, js-yaml 4.3.0->4.3.1, fast-uri 3.1.4->3.1.5, undici 7.28.0->7.29.0, pdfjs-dist 6.1.200->6.2.108. pip: cryptography 49.0.0->50.0.0 in ml-engine, model-upload and the observability SDK; json-repair 0.52.5->0.63.2 in the observability SDK. Alert 1263 (cryptography in genai-engine) cannot be fixed: presidio-anonymizer 2.2.364, the latest, requires cryptography>=48.0.1,<49.0.0. CVE-2026-69247 is a Bleichenbacher oracle in PKCS#7 EnvelopedData decryption and there is no pkcs7 reference anywhere under genai-engine/src, so the affected code never executes. Recorded as a not_affected VEX statement per security/README.md, with a review date and a note to drop it once presidio widens its pin. Also repairs genai-engine's uv.lock, which could not be re-resolved at all on dev and so blocked any security relock there. Renovate PRs #2132 and #2134 edited pyproject.toml without relocking, leaving openai==3.0.0 (forbidden by litellm 1.96.2) and arthur-common==2.4.69 (which pins litellm 1.96.0) both contradicting the lock; CI's `uv sync --frozen` skips the consistency check, so it went unnoticed. openai returns to 2.54.0 — the version the lock already had, so no release ever shipped v3 — with arthur-common 2.4.70 and langchain-openai 1.5.1. `uv lock --check` now passes in all four projects. Tests: genai-engine 1992 passed / 7 skipped; model-upload 9 passed; obs-sdk ruff + black clean with the beeai extra importing and running. ml-engine and obs-sdk test suites and the UI build need generated clients and the GitLab registry token, so CI covers those. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
✅ Meticulous spotted 0 visual differences across 365 screens tested: view results. Meticulous evaluated ~9 hours of user flows against your PR. Expected differences? Click here. Last updated for commit |
Contributor
Code reviewNo issues found. Checked for bugs and CLAUDE.md compliance. |
Contributor
kc961163
added a commit
that referenced
this pull request
Aug 18, 2026
Take dev's genai-engine/pyproject.toml and uv.lock. #2144 fixed the unresolvable pin independently by holding openai at 2.54.0 and moving arthur-common to 2.4.70, so the dependency change here is redundant. This PR now carries only the CI guard.
ntatsumi
added a commit
that referenced
this pull request
Aug 18, 2026
Renovate updates pyproject.toml and regenerates uv.lock in a separate artifact step. When that second step fails — typically because the new version violates a transitive constraint of another pinned dependency — Renovate still opens the PR with the manifest edit alone, and does not reliably flag it (#2134's body carried no artifact warning at all). Nothing in CI could see that: every Python job installs with `uv sync --frozen`, which replays the lockfile and never compares it against the manifest. So the PR went green, merged, and left the two files disagreeing. Two of the last 25 Renovate commits did this. #2134 pinned openai==3.0.0, which litellm 1.96.2 forbids, making `uv lock` impossible for everyone until PR #2144. #2124 pinned python-keycloak==7.1.1 while the lock kept 5.12.0, so the upgrade was absent from every image for weeks before an unrelated re-lock repaired it — the more dangerous shape, because it is completely silent. Renovate offers no setting that makes it fail closed here; that is upstream behaviour. So detection has to live in CI, and configuration can only stop it re-proposing updates already known to be impossible. - New `check-dependency-automation` job runs `.github/scripts/check-lockfile-drift.sh` over every uv project found in the repo, discovered rather than listed so a new project is covered the day it is added. It reports STALE (manifest resolves, lock not regenerated) separately from UNRESOLVABLE (no lockfile can satisfy the manifest), because those need opposite fixes, and writes the decision tree to the job summary. It lives in arthur-engine-workflow.yml deliberately: renovate-autofix.yml listens for "Arthur Engine CI" failing, so a gate in a separate workflow would never reach the auto-fixer. - The same job validates renovate.json when it changes. An invalid config does not fail loudly — Renovate just stops — and the new failure message actively tells people to go add allowedVersions rules there. - version-workflow.yml now re-locks after bumping the three pyproject versions. Each uv.lock records its own project's version, so the bump left every lockfile disagreeing with its manifest on every release; that drift is harmless but indistinguishable from the real thing, and would have left the new gate permanently red. Verified that `uv lock` without --upgrade moves no dependency: the only edits are the project's own version and the exclude-newer soak boundary. - renovate.json caps openai < 3.0.0, naming litellm as the ceiling and the condition for lifting it, matching the existing transformers and importlib-metadata rules. litellm joins the langchain + openai group so the family moves together instead of half at a time. A top-level description records why CI has to be the backstop. - renovate-autofix.yml learns this failure class: how to tell STALE from UNRESOLVABLE, and that a transitive ceiling with no upstream fix is a hand-off, since invariant 6 forbids it editing renovate.json. It should name the cap a human needs to add. Verified by reintroducing both regressions against the finished gate: openai==3.0.0 reports UNRESOLVABLE with the litellm conflict, a stale pin reports STALE and names the package that did not move, both exit 1, and the working tree is left clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Clears the open Dependabot alerts — 9 of 10 fixed, the tenth justified via VEX.
Fixed
ui/yarn.lockui/yarn.lockui/yarn.lockui/yarn.lockui/package.jsonresolutionsMost were plain lockfile refreshes. Two needed more:
6.1.200by@arthur/shared-components, so no range bump reaches 6.2.108 — added aresolutionsentry.<0.53.0bybeeai-framework(still true in its latest, 0.1.82), so a constraint cannot lift it — usedoverride-dependencies. Safe to force: beeai's only call site isjson_repair.loads(input, stream_stable=...)inbackend/utils.py, it never passesschema=(the vulnerable resolver), and that signature is unchanged in 0.63.2.Not fixable: alert 1263, cryptography in genai-engine
presidio-anonymizer2.2.364 — the latest — requirescryptography>=48.0.1,<49.0.0, so 50.0.0 is unreachable here. CVE-2026-69247 is a Bleichenbacher oracle in PKCS#7EnvelopedDatadecryption (pkcs7_decrypt_der/_pem/_smime). There is nopkcs7reference anywhere undergenai-engine/srcand no endpoint decrypts attacker-suppliedEnvelopedData, so the affected code never executes.Recorded as a
not_affectedVEX statement forgenai-engine-cpu/gpupersecurity/README.md(document version 7 → 8), with a review date and a note to drop it once presidio widens its pin. ml-engine and the models-* images are already on 50.0.0 and aren't listed.Also: genai-engine's uv.lock could not be re-resolved at all
uv lockfails outright ondev, which blocks any security relock in genai-engine — that's how this surfaced.Renovate PRs #2132 and #2134 edited
pyproject.tomlwithout relocking, leaving two contradictions:openai==3.0.0, forbidden bylitellm 1.96.2(openai>=2.20.0,<3.0.0)arthur-common==2.4.69, which itself pinslitellm==1.96.0against pyproject's1.96.2CI runs
uv sync --frozen, which skips the lock/pyproject consistency check, so this went unnoticed.Fix:
openaiback to 2.54.0 — the version the lock already had, so no release ever shipped v3 — plusarthur-common→ 2.4.70 (requires litellm 1.96.2) andlangchain-openai→ 1.5.1 (allowsopenai<4). Left a comment on the openai pin so the next Renovate bump has context.uv lock --checknow passes in all four projects.Worth a follow-up: Renovate isn't relocking genai-engine, and
--frozenhides the drift.Testing
beeaiextra installs, imports, andparse_broken_jsonworks against json-repair 0.63.2Not runnable locally, all pre-existing setup reasons: ml-engine and obs-sdk test suites need generated client modules (
genai_client,arthur_genai_client), and the UI needsGITLAB_UNIFY_FRONTEND_TOKENfor@arthur/*. The UI lockfile resolves cleanly under--immutable(only the fetch step fails on auth).Note
Please confirm the UI build in CI. pdfjs-dist 6.1 → 6.2 is a minor bump that overrides a dependency's exact pin, and it's the one change not exercised locally.
🤖 Generated with Claude Code