Skip to content

fix: bootstrap image security remediation with retained evidence - #2409

Open
groupthinking wants to merge 7 commits into
mainfrom
fix/image-security-2396
Open

groupthinking wants to merge 7 commits into
mainfrom
fix/image-security-2396

Conversation

@groupthinking

@groupthinking groupthinking commented Oct 12, 2026 •

Copy link
Copy Markdown
Owner

Canonical issue

Closes #2425

Refs #2396

Linear: GRV-807

Outcome

Ship the verified image dependency repairs separately from final strict Trivy enforcement, using the split bootstrap path requested by #2425. This is partial remediation. Parent #2396 remains open until every remaining finding is accounted for; this PR does not establish a clean image, accepted risk, full license-inventory compliance, production remediation, or deployment.

Implementation head: a729d875ae94e0e0b4af0e6f3143bad79123a989.

Scope

  • Preserve all application dependency repairs and image-build behavior from the inspected head 64d2562dce7f2d870b32e3982ffe8888bbdcd808.
  • Keep lowercase trivy required for image build, scanner execution and exact source/image/SARIF evidence. Use findings exit-code: '0' during this explicit bootstrap split; operational failures still fail. No scanner/job continue-on-error, approved baseline or vulnerability exception is added.
  • Add limit-severities-for-sarif: true so SARIF honors HIGH/CRITICAL, including unfixed findings. Strict exit-code: '1' enforcement is a separate reviewed Triage image findings despite successful Trivy job #2396 change after finding accounting, or a separately reviewed delta policy.
  • Align both MERGE_POLICY passages and regression tests with the split. New findings remain visible and must be reviewed; this split is not a delta gate.
  • Pin the same Dependency Review implementation observed in prior runs, name exact base/head SHAs, and retain all four raw action outputs and review outcome after failure or success. License policy, package exemptions and blocking behavior are unchanged.

NumPy license diagnosis

The historical NumPy 2.5.4 expression BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0 was correctly rejected because Zlib is absent from the allowlist. It is not a composite-parser defect. The action's locked SPDX evaluator reproduces that rejection. No Zlib approval or NumPy bypass is introduced.

Dependency Review run 38707004697 / job 116329188139 executed and passed for inspected head 64d2562dce7f2d870b32e3982ffe8888bbdcd808 with the same policy, because its graph comparison contained no NumPy delta. This resolves that historical check blocker only for that head; full snapshots are unavailable, so the precise snapshot change is unknown. New-head hosted verification remains separate. See the complete diagnosis.

Image evidence preserved

The original retained 259 HIGH/CRITICAL occurrences remain intact. The later inspected head 64d2562… has 252 (244 OS, 4 npm, 4 Python; 251 HIGH and 1 CRITICAL), across 63 unique advisories. Seven advisory/package/path occurrences disappeared between independent image builds/scans; this is not adjudicated remediation. Both raw artifacts, image identities, original SARIF and count/path reconciliation are preserved, with image IDs, artifact ZIP and SARIF hashes in the bootstrap evidence record.

Latest inspected pre-change image: sha256:58c3934b3b50d5e9086a822bfd87f185839ff61f8302b0d165f1960acf839201, linux/amd64; run 38706968204 / job 116328658621, artifact 11958184738, ZIP sha256:1ff1b9ca9a058b14f536a585bbe9e29e8dc0dbd3d079940878b0bd6422275217. This image is not the new implementation-head image. No published registry digest is inferred from a Docker image ID.

Risk

  • Main risk: findings do not block during the explicit split; reviewers must inspect exact-image results. Parent Triage image findings despite successful Trivy job #2396 and final enforcement remain open.
  • License risk: a green dependency delta is not a full license inventory approval. Newly introduced NumPy with the same expression remains blocked.
  • Rollback: revert this bootstrap commit through review; the strict gate returns and may block the repairs again. Existing dependency repairs remain independently reviewable.

Verification

Local focused checks on the committed implementation:

  • python -m pytest -q tests/unit/test_merge_policy_security_scan_wording.py tests/unit/test_dependency_review_workflow.py tests/unit/test_workflow_pr_gate_coverage.py tests/unit/test_security_dependency_pr_evidence.py --override-ini addopts=: 51 passed.
  • Ruff check and format check for both changed test files: passed.
  • actionlint 1.7.12 on both changed workflows: passed; external ShellCheck/Pyflakes disabled.
  • Actual pinned Trivy action environment setter and entrypoint with a synthetic scanner: severity preserved; findings report with exit 0; injected scanner process exit 7 propagates as failure. No real local Docker image or Trivy scan was run.
  • Actual locked SPDX evaluator: incompatible composite rejected; approved-only composite accepted; Zlib alone rejected.
  • git diff --check: passed. Independent complete diff review: no actionable defects.

Hosted workflows have started for a729d875ae94e0e0b4af0e6f3143bad79123a989. Their prior-head results do not validate this commit. Do not merge before the exact-head CI, security, Dependency Review, E2E, coverage, CodeQL, secret scan and applicable review/protection gates are satisfied. No merge or deployment was performed by this follow-up.

Security dependency evidence

  • Advisory: Next.js upstream advisory GHSA-vcvr-r3jv-pc5j, official affected range >=16.2.0 <16.3.6, patched 16.3.6; scanner-observed version 16.3.5, retained PR uses 16.3.8. The exact prior image's advisory/package/path evidence and all remaining findings are preserved below and in Triage image findings despite successful Trivy job #2396; upstream/applicability claims retain their stated dates and limits.
  • Package and versions: preserved scoped transitive repairs proxy-addr 2.0.7 -> 2.0.8, source-map-js 1.2.1 -> 1.2.2, @workflow/core -> devalue 5.9.2 -> 5.9.3, plus existing Python packaging/urllib3 and runtime npm floors detailed below. This follow-up changes no dependency manifest, lockfile, Dockerfile or constraint.
  • Validation: 51 focused tests, Ruff/format, actionlint, actual pinned action harness and locked SPDX checks passed as above. Exact-head hosted checks pending at description preparation; no clean-image or full-license-inventory claim.
  • Rollback: revert the bootstrap commit through review; reassess the resulting strict-gate deadlock. Dependency repair rollback requires separate security assessment.

Historical evidence retained

The following is the prior PR record centered on head 1d9f72d7c40bff34aa43b8107cb817ad01e8efd5, preserved to retain all 259 findings, identities, package paths, tests and prior governance observations. Its phrases “current head,” draft status, failing license check and strict-gate configuration describe that earlier record. The implementation, later graph delta and current gates are stated above; this historical record is not current-head verification.

Original scan, dependency repairs, remaining findings and historical validation

Historical retained scan evidence

Security Scan run 38258616455 / job 114843053097 scanned source 1d9f72d7c40bff34aa43b8107cb817ad01e8efd5 and image ID sha256:3e479db974698dc0bf11eec7fbce12acee901a33fe8179570fe4418a6b2ec34e, created 2026-10-12T13:53:16Z for linux/amd64.

Retained artifact trivy-image-evidence:

  • artifact ID: 11751896119
  • ZIP digest: sha256:545f1565a67c41fe5a9d641854e74f28bbb7050aa3247e537ca27d4fcb976459
  • contents: image-source-commit.txt, image-identity.json, trivy-results.sarif

The SARIF contains 259 HIGH/CRITICAL occurrences across 68 unique advisories:

  • OS: 251 (250 HIGH, 1 CRITICAL), all without a fixed version in this Trivy record
  • global npm: 4 HIGH
  • Python/pip vendor bundle: 4 HIGH

This is 15 fewer HIGH/CRITICAL occurrences than the exact prior-head image (274). The enforcing lowercase trivy job failed as designed. The uppercase Trivy SARIF-ingestion check succeeded because it found no new code-scanning alert in the PR diff; it does not override the findings gate.

Verified corrections

These no longer appear in the exact current-head image report:

  • Next.js 16.3.8 and sharp 0.35.5 (already absent from the prior exact image)
  • proxy-addr 2.0.7 -> 2.0.8, production path Workflow -> @workflow/web -> Express
  • source-map-js 1.2.1 -> 1.2.2, production path Next -> PostCSS
  • devalue 5.9.2 -> 5.9.3 under @workflow/core
  • the prior ip-address, pacote, picomatch, sigstore, jaraco.context, and wheel findings

The reconciliation commit has PR #2353 and PR #2358 as parents, incorporating their exact dependency changes without merging their stale branch trees.

Implementation:

  • scoped npm overrides and regenerated package-lock.json
  • urllib3>=2.8.0 application constraint
  • setuptools>=80.10.2 and wheel>=0.46.2; 78.1.1 still carried flagged vendor metadata, so that lower floor was rejected
  • runtime npm 12.2.0
  • clear inherited builder site-packages metadata before copying the constrained environment
  • strict Trivy exit-code: 1, ignore-unfixed: false, retained identity/source/SARIF evidence, and a regular comment-only .github/trivy-no-exceptions.txt

Every remaining non-OS finding

Source path Finding Upstream status Runtime/exploit classification
/usr/lib/node_modules/npm/node_modules/brace-expansion/package.json CVE-2026-102276, 5.0.9 fixed in 5.0.10+ process-terminating DoS requires attacker-controlled brace patterns
same CVE-2026-102278, 5.0.9 fixed in 5.0.11+ process-terminating DoS requires deeply nested attacker-controlled brace patterns
/usr/lib/node_modules/npm/node_modules/http-cache-semantics/package.json CVE-2026-93748, 4.2.0 no fixed version published/reported cross-user shared-cache disclosure requires the vulnerable cache/max-stale flow; npm is a client-side CLI here
/usr/lib/node_modules/npm/node_modules/undici/package.json CVE-2026-19534, 6.28.0 fixed in 6.28.1 process DoS requires npm to open a WebSocket to a malicious/compromised server returning an unrequested subprotocol
/usr/local/lib/python3.11/site-packages/pip/_vendor/msgpack GHSA-6v7p-g79w-8964, 1.1.2 fixed in 1.2.1 requires reuse of an Unpacker after a caught error with untrusted input; pip's CacheControl uses the vendored copy
/usr/local/lib/python3.11/site-packages/pip/_vendor/setuptools CVE-2025-47273, 70.3.0 fixed in 78.1.1 arbitrary file write requires invoking the affected PackageIndex download behavior
/usr/local/lib/python3.11/site-packages/pip/_vendor/urllib3 CVE-2026-97687, 2.7.0 fixed in 2.8.0 requires an HTTPS proxy plus affected TLS-separation configuration
same CVE-2026-97689, 2.7.0 fixed in 2.8.0 memory DoS requires a malicious HTTP server and chunked streaming parser path

The Python filesystem paths are established by the exact version match to the latest pip 26.2.1 wheel's pip/_vendor/vendor.txt and source tree; Trivy labels these four only as Python. Normal requirements constraints cannot replace pip's private vendor bundle.

npm 12.2.0 and pip 26.2.1 are the current published releases inspected on 2026-10-12. npm has an open Priority 1 bug (#10062) confirming its current brace-expansion and undici copies are bundled, downstream overrides/audit fixes cannot replace them, and a refreshed npm release is required. pip 26.2.1 itself vendors msgpack 1.1.2, setuptools 70.3.0, and urllib3 2.7.0.

npm/npx remain runtime-reachable through optional build-validation and NotebookLM paths. pip remains reachable through the repository's CLI installation command and copied utility scripts. Removing either tool would change runtime behavior and is not treated as an incidental security update.

Remaining OS findings

The exact report has 251 OS occurrences across 61 unique advisories, with no fixed version populated. Representative authoritative Debian tracking confirms:

  • libxml2 CVE-2026-6653: trixie vulnerable/no-DSA
  • util-linux CVE-2026-76642: trixie vulnerable/no-DSA
  • ffmpeg CVE-2026-64830: trixie vulnerable/postponed

ffmpeg/ffprobe are part of readiness and yt-dlp runtime behavior. curl is the container healthcheck. gnupg/dirmngr support NodeSource installation but remain in the runtime layer today. Removing packages or changing the base image needs an isolated compatibility/build investigation; no OS finding is dismissed.

Verification

Local:

  • npm ci --legacy-peer-deps: passed (1,010 packages)
  • npm run test --workspace=apps/web: 169 files / 1,495 tests passed; 28 skipped
  • npm run type-check --workspace=apps/web: passed
  • python -m unittest tests.unit.test_merge_policy_security_scan_wording: 4 passed
  • git diff --check: passed
  • production build on the preceding runtime dependency set passed only with Sentry telemetry, source-map, and release uploads disabled; temporary configuration restored

Current-head hosted:

  • CI build, frontend/Python tests and lint, guards: passed
  • E2E, coverage, CodeQL, secret scan, closing-keyword check: passed
  • exact image build and artifact retention: passed
  • lowercase trivy: failed on 259 unresolved occurrences, as policy requires
  • Dependency Review: failed on NumPy 2.5.4's composite license including Zlib; no license policy relaxation
  • no reviews or review threads

Merge gates

  • Current-head CI and hosted build completed
  • Current-head exact image artifact retrieved and independently inspected
  • Trivy HIGH/CRITICAL findings fixed or separately accepted under documented policy
  • Dependency Review license failure resolved without weakening policy
  • Required reviews complete
  • Full branch-protection/ruleset requirements verified

No Trivy exceptions are applied. Future exceptions require separately reviewed package/version/image scope, applicability evidence, compensating controls, owner, linked issue, expiry, and enforced expiry validation.

Ruleset 24057160 requires a Closing keyword to an open issue; this body closes bounded child #2425 and references parent backlog #2396 without closing it. The classic branch-protection endpoint returns 403 to the GitHub App, so complete protection verification remains blocked. PR remains draft and unmerged.

dependabot Bot and others added 3 commits October 7, 2026 02:48
Bumps [source-map-js](https://github.com/7rulnik/source-map-js) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/7rulnik/source-map-js/releases)
- [Changelog](https://github.com/7rulnik/source-map-js/blob/main/CHANGELOG.md)
- [Commits](7rulnik/source-map-js@v1.2.1...v1.2.2)

---
updated-dependencies:
- dependency-name: source-map-js
  dependency-version: 1.2.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [proxy-addr](https://github.com/jshttp/proxy-addr) from 2.0.7 to 2.0.8.
- [Release notes](https://github.com/jshttp/proxy-addr/releases)
- [Changelog](https://github.com/jshttp/proxy-addr/blob/master/HISTORY.md)
- [Commits](jshttp/proxy-addr@v2.0.7...v2.0.8)

---
updated-dependencies:
- dependency-name: proxy-addr
  dependency-version: 2.0.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
@vercel

vercel Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
v0-uvai Ready Ready Preview, v0 Oct 16, 2026 7:18am UTC

@coderabbitai

coderabbitai Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Repository: groupthinking/EventRelay/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: efd053b8-25f0-4c51-b6f9-9e76cc30159b
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@github-actions github-actions Bot added ci/cd documentation Improvements or additions to documentation python labels Oct 12, 2026
@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-i5ednka2f-garv1.vercel.app
Test Output
 on every request without persisting it�[32m 1�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mhomepage returns 200 with HTML�[32m 109�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 134�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 110�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 2042�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 640�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 85�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 84�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 63�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 138�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 104�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[32m 245�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 58�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 98�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 103�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 12:59:58
�[2m   Duration �[22m 5.75s�[2m (transform 73ms, setup 0ms, import 88ms, tests 5.52s, environment 0ms)�[22m


Incorporates #2353 and #2358 onto the current security branch without their stale branch trees.
@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

🔍 PR Validation

⚠️ Large PR detected (890 lines changed)

@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-1dpvn2vd1-garv1.vercel.app
Test Output
n every request without persisting it�[32m 1�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mhomepage returns 200 with HTML�[32m 170�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 135�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 221�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 2053�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 715�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 102�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 104�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 96�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 172�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 110�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[32m 265�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 60�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 96�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 128�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 13:52:30
�[2m   Duration �[22m 6.33s�[2m (transform 52ms, setup 0ms, import 66ms, tests 6.13s, environment 0ms)�[22m


@groupthinking
groupthinking marked this pull request as ready for review October 15, 2026 08:37
Copilot AI balanced review requested due to automatic review settings October 15, 2026 08:37
@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-insn8yvry-garv1.vercel.app
Test Output
late Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 255�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 201�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 2390�[2mms�[22m�[39m
�[90mstdout�[2m | tests/e2e/pipeline.test.ts�[2m > �[22m�[2mEventRelay E2E — Live Deployment�[2m > �[22m�[2mVideo Pack Pipeline�[2m > �[22m�[2mGET /api/video/pack resolves to a ready pack with evidence lineage
�[22m�[39m[E2E] Pack still processing after 150s — extraction latency, not a contract break. Skipping shape assertions.

 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 154406�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 149�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 158�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 98�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 241�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 153�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[33m 307�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 81�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 133�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 138�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 08:38:24
�[2m   Duration �[22m 160.54s�[2m (transform 35ms, setup 0ms, import 43ms, tests 160.41s, environment 0ms)�[22m


Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The bootstrap merge path remains unresolved, and SARIF enforcement does not honor the intended severity threshold.

2 open findings
What changed in this PR

Patches dependencies in UVAI’s application image and introduces blocking Trivy checks. This is partial remediation; the parent security backlog remains open.

Changes:

  • Updates npm dependencies and Python packaging constraints.
  • Enforces image vulnerability checks and retains scan evidence.
  • Aligns merge policy and regression tests with enforcement.
File Description
tests/​unit/​test_merge_policy_security_scan_wording.py Tests enforcement, evidence retention, and dependency floors.
package.json Updates dependency pins and overrides.
package-lock.json Records patched dependency versions.
MERGE_POLICY.md Documents blocking image checks and exception requirements.
Dockerfile Updates packaging tools and replaces inherited Python packages.
constraints.txt Adds the urllib3 security floor.
apps/​web/​package.json Pins the patched Next.js version.
.github/​workflows/​security.yml Enforces scanning and retains source/image evidence.
.github/​trivy-no-exceptions.txt Provides an explicit empty exception list.

🧠 Review effort: Balanced


💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread .github/workflows/security.yml Outdated
Comment on lines +119 to +120
exit-code: '1'
ignore-unfixed: false
Comment thread .github/workflows/security.yml Outdated
output: 'trivy-results.sarif'
exit-code: '0'
ignore-unfixed: true
exit-code: '1'
@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-p16z206l5-garv1.vercel.app
Test Output
request without persisting it�[32m 1�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mhomepage returns 200 with HTML�[32m 124�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 202�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 177�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 2090�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 123886�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 106�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 175�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 75�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 231�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 179�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[32m 256�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 62�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 113�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 166�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 07:19:00
�[2m   Duration �[22m 129.51s�[2m (transform 37ms, setup 0ms, import 47ms, tests 129.38s, environment 0ms)�[22m


@groupthinking groupthinking changed the title fix: patch image dependencies and enforce Trivy severity fix: bootstrap image security remediation with retained evidence Oct 16, 2026

This branch was successfully deployed

1 active deployment
Preview — a729d875 Deployed Oct 16, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd documentation Improvements or additions to documentation python

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bootstrap image remediation without closing the parent backlog

2 participants