Skip to content

feat(cypress): upload failure screenshots to the v2 media endpoint#8981

Draft
xinyeji wants to merge 6 commits into
masterfrom
xinye.ji/cypress-failure-media-v2
Draft

feat(cypress): upload failure screenshots to the v2 media endpoint#8981
xinyeji wants to merge 6 commits into
masterfrom
xinye.ji/cypress-failure-media-v2

Conversation

@xinyeji

@xinyeji xinyeji commented Jun 18, 2026

Copy link
Copy Markdown

What does this PR do?

Brings the Cypress failure-screenshot upload (innovation-day PoC #8574, authored by @juan-fernandez) up to the production v2 Test Optimization media contract so it works against the real bucket-backed backend (DataDog/dd-source#443668).

The first 3 commits are #8574 cherry-picked onto master (Juan's authorship preserved); the last commit is the v2 update. Picking up the library work scoped to @sebas in the innovation-week thread.

Changes (v2 delta)

  • Two now-required headers on the upload (packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js):
    • X-Dd-Idempotency-Key = {trace_id}:{filename} — stable per artifact, reused on retry, so a retried upload overwrites the same stored object instead of duplicating (the Cypress filename encodes test + attempt).
    • X-Dd-Media-Captured-At = capture time in epoch ms, from the screenshot's takenAt (mtime / now fallback), stamped once and resent unchanged on retry (it's part of the stored object key).
  • Dropped the temporary PoC bits: the test-drive-test-failure-media-bucket header and the DD_POC_SITE host override (+ its config entry).
  • Agentless uploads to the normal api.<site> host with DD-API-KEY (the exporter's existing _apiUrl).
  • Plugin (cypress-plugin.js) computes the key + capture time per screenshot and threads them through the exporter.

Motivation

Cypress already captures screenshots for failed runs. The v2 backend requires a stable idempotency key + a real capture timestamp from the tracer; without them the upload is rejected (400 MALFORMED). This wires those in and removes the PoC-only host/header so it targets the real endpoint.

Additional notes / follow-ups

  • Agent (evp_proxy) mode is intentionally disabled here (canUploadTestScreenshots() is false in agent mode): the Datadog Agent's evp_proxy must allow-list POST /api/unstable/ci/test-runs/<trace_id>/media before screenshots can be forwarded through it. Agentless works today. Tracking as a follow-up.
  • The PoC's integration spec test was dropped during the rebase onto current master (the spec diverged heavily); a mock-intake header-assertion test is a follow-up.
  • End-to-end test plan: see test-run-media-e2e-test-plan.md (build the tracer from this branch → run a failing Cypress test → assert the 201 + both headers → backend GET → web-ui Media tab). Frontend: DataDog/web-ui#320875.

🤖 Generated with Claude Code

juan-fernandez and others added 4 commits June 18, 2026 20:01
Updates the Cypress failure-screenshot upload (from #8574) to the production v2
Test Optimization media contract:

- Send the two now-required headers:
  - X-Dd-Idempotency-Key = `{trace_id}:{filename}` — stable per artifact and
    reused on retry, so a retried upload overwrites the same stored object
    instead of creating a duplicate (the Cypress filename encodes test + attempt).
  - X-Dd-Media-Captured-At = capture time in epoch ms, taken from the screenshot's
    `takenAt` (mtime / now fallback), stamped once and resent unchanged on retry
    (it is part of the stored object key).
- Drop the temporary PoC bits: the `test-drive-test-failure-media-bucket` header
  and the `DD_POC_SITE` host override.
- Agentless uploads go to the normal api.<site> host with DD-API-KEY.

Agent (evp_proxy) mode upload stays disabled until the Datadog Agent allow-lists
POST /api/unstable/ci/test-runs/<trace_id>/media (follow-up).

Backend: DataDog/dd-source#443668. Builds on Juan's PoC #8574.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@dd-octo-sts

dd-octo-sts Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Overall package size

Self size: 6.27 MB
Deduped: 7.33 MB
No deduping: 7.33 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | import-in-the-middle | 3.1.0 | 101.28 kB | 840.46 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | dc-polyfill | 0.1.11 | 25.74 kB | 25.74 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@datadog-prod-us1-3

datadog-prod-us1-3 Bot commented Jun 18, 2026

Copy link
Copy Markdown

Pipelines  Tests

Fix all issues with BitsAI

⚠️ Warnings

🚦 2 Pipeline jobs failed

Project | lint   View in Datadog   GitHub Actions

All Green | all-green   View in Datadog   GitHub Actions

ℹ️ Info

No other issues found (see more)

🧪 All tests passed
❄️ No new flaky tests detected

Useful? React with 👍 / 👎

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: cf7e1c9 | Docs | Datadog PR Page | Give us feedback!

@pr-commenter

pr-commenter Bot commented Jun 18, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-06-18 21:13:54

Comparing candidate commit cf7e1c9 in PR branch xinye.ji/cypress-failure-media-v2 with baseline commit 655a49f in branch master.

📊 Benchmarking dashboard

Found 0 performance improvements and 0 performance regressions! Performance is the same for 1950 metrics, 15 unstable metrics.

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

Unstable benchmarks

These benchmarks have a confidence interval too wide to call a change; treat them as noise rather than signal.

scenario:appsec-appsec-enabled-24

  • unstable execution_time [-155.767ms; +149.096ms] or [-5.974%; +5.719%]

scenario:appsec-appsec-enabled-26

  • unstable execution_time [-177.059ms; +164.670ms] or [-7.110%; +6.613%]

scenario:appsec-control-20

  • unstable execution_time [-141.910ms; +96.812ms] or [-8.334%; +5.686%]

scenario:appsec-control-24

  • unstable execution_time [-95.685ms; +76.119ms] or [-8.063%; +6.415%]

scenario:appsec-control-26

  • unstable execution_time [-96367.281µs; +95312.448µs] or [-8.174%; +8.084%]

scenario:debugger-line-probe-with-snapshot-default-20

  • unstable max_rss_usage [-8.996MB; +21.472MB] or [-4.952%; +11.820%]

scenario:dogstatsd-with-tags-20

  • unstable cpu_user_time [-283.131ms; +375.422ms] or [-5.650%; +7.492%]
  • unstable execution_time [-286.831ms; +370.330ms] or [-5.637%; +7.279%]

scenario:log-with-debug-20

  • unstable max_rss_usage [-8.516MB; +5.267MB] or [-7.406%; +4.581%]

scenario:plugin-graphql-long-with-depth-and-collapse-off-24

  • unstable cpu_user_time [-323.895ms; +308.015ms] or [-7.242%; +6.887%]
  • unstable execution_time [-341.673ms; +329.913ms] or [-7.171%; +6.924%]
  • unstable max_rss_usage [-39.075MB; +41.975MB] or [-7.211%; +7.747%]

scenario:plugin-graphql-long-with-depth-off-20

  • unstable max_rss_usage [-6568.895KB; +8474.609KB] or [-4.713%; +6.080%]

scenario:spans-finish-later-26

  • unstable max_rss_usage [-15522.220KB; +16080.970KB] or [-8.885%; +9.205%]

scenario:test-optimization-large-suite-20

  • unstable max_rss_usage [-3.480MB; +6.534MB] or [-4.431%; +8.318%]

@codecov

codecov Bot commented Jun 18, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 28.96175% with 130 lines in your changes missing coverage. Please review.
✅ Project coverage is 92.59%. Comparing base (655a49f) to head (cf7e1c9).
⚠️ Report is 5 commits behind head on master.

Files with missing lines Patch % Lines
...kages/datadog-plugin-cypress/src/cypress-plugin.js 31.35% 81 Missing ⚠️
...c/ci-visibility/requests/upload-test-screenshot.js 19.23% 42 Missing ⚠️
.../ci-visibility/exporters/ci-visibility-exporter.js 14.28% 6 Missing ⚠️
...ace/src/ci-visibility/exporters/agentless/index.js 50.00% 1 Missing ⚠️

❌ Your patch check has failed because the patch coverage (28.96%) is below the target coverage (95.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #8981      +/-   ##
==========================================
- Coverage   93.37%   92.59%   -0.79%     
==========================================
  Files         878      879       +1     
  Lines       50282    50464     +182     
  Branches     9873     9921      +48     
==========================================
- Hits        46951    46726     -225     
- Misses       3331     3738     +407     
Flag Coverage Δ
aiguard-integration-active 41.47% <ø> (ø)
aiguard-integration-latest 41.48% <ø> (-0.01%) ⬇️
aiguard-integration-maintenance 41.57% <ø> (ø)
aiguard-macos 34.57% <ø> (-0.08%) ⬇️
aiguard-ubuntu 34.72% <ø> (-0.08%) ⬇️
aiguard-windows 34.39% <ø> (-0.08%) ⬇️
apm-capabilities-tracing-macos 47.82% <22.22%> (-0.05%) ⬇️
apm-capabilities-tracing-ubuntu-active 47.82% <22.22%> (-0.05%) ⬇️
apm-capabilities-tracing-ubuntu-latest 47.82% <22.22%> (-0.05%) ⬇️
apm-capabilities-tracing-ubuntu-maintenance 48.04% <22.22%> (+0.13%) ⬆️
apm-capabilities-tracing-ubuntu-oldest 47.87% <22.22%> (-0.05%) ⬇️
apm-capabilities-tracing-windows 47.82% <22.22%> (-0.05%) ⬇️
apm-integrations-aerospike-18-gte.5.2.0 32.99% <ø> (-0.08%) ⬇️
apm-integrations-aerospike-20-gte.5.5.0 33.02% <ø> (-0.08%) ⬇️
apm-integrations-aerospike-22-gte.5.12.1 33.02% <ø> (-0.08%) ⬇️
apm-integrations-aerospike-22-gte.6.0.0 33.02% <ø> (-0.08%) ⬇️
apm-integrations-aerospike-eol- 32.92% <ø> (-0.08%) ⬇️
apm-integrations-child-process 33.94% <ø> (-0.08%) ⬇️
apm-integrations-confluentinc-kafka-javascript-18 40.01% <ø> (-0.08%) ⬇️
apm-integrations-confluentinc-kafka-javascript-20 40.02% <ø> (-0.08%) ⬇️
apm-integrations-confluentinc-kafka-javascript-22 40.03% <ø> (-0.08%) ⬇️
apm-integrations-confluentinc-kafka-javascript-24 39.92% <ø> (-0.08%) ⬇️
apm-integrations-couchbase-18 33.18% <ø> (+0.08%) ⬆️
apm-integrations-couchbase-eol 33.06% <ø> (-0.08%) ⬇️
apm-integrations-dns 32.94% <ø> (-0.08%) ⬇️
apm-integrations-elasticsearch 33.96% <ø> (-0.08%) ⬇️
apm-integrations-http-latest 41.14% <ø> (-0.07%) ⬇️
apm-integrations-http-maintenance 41.23% <ø> (-0.07%) ⬇️
apm-integrations-http-oldest 41.16% <ø> (-0.07%) ⬇️
apm-integrations-http2 38.46% <ø> (+0.08%) ⬆️
apm-integrations-kafkajs-latest 40.01% <ø> (-0.17%) ⬇️
apm-integrations-kafkajs-oldest 40.10% <ø> (-0.12%) ⬇️
apm-integrations-net 33.64% <ø> (-0.08%) ⬇️
apm-integrations-next-11.1.4 36.52% <ø> (ø)
apm-integrations-next-12.3.7 36.52% <ø> (ø)
apm-integrations-next-13.0.0 28.97% <ø> (-0.08%) ⬇️
apm-integrations-next-13.2.0 28.97% <ø> (-0.08%) ⬇️
apm-integrations-next-13.5.11 29.11% <ø> (-0.12%) ⬇️
apm-integrations-next-14.0.0 29.04% <ø> (-0.08%) ⬇️
apm-integrations-next-14.2.35 29.04% <ø> (-0.08%) ⬇️
apm-integrations-next-14.2.6 29.04% <ø> (-0.08%) ⬇️
apm-integrations-next-14.2.7 29.05% <ø> (-0.06%) ⬇️
apm-integrations-next-15.0.0 29.04% <ø> (-0.08%) ⬇️
apm-integrations-next-15.4.0 29.11% <ø> (-0.12%) ⬇️
apm-integrations-next-latest 29.15% <ø> (-0.08%) ⬇️
apm-integrations-oracledb 33.85% <ø> (-0.08%) ⬇️
apm-integrations-prisma-18-gte.6.16.0.and.lt.7.0.0 34.72% <ø> (-0.08%) ⬇️
apm-integrations-prisma-latest-all 34.14% <ø> (-0.08%) ⬇️
apm-integrations-restify 35.09% <ø> (-0.08%) ⬇️
apm-integrations-sharedb 32.35% <ø> (-0.08%) ⬇️
apm-integrations-tedious 33.26% <ø> (-0.08%) ⬇️
appsec-express 50.95% <ø> (-0.04%) ⬇️
appsec-fastify 47.68% <ø> (-0.08%) ⬇️
appsec-graphql 47.75% <ø> (-0.05%) ⬇️
appsec-integration-active 36.08% <0.00%> (-0.01%) ⬇️
appsec-integration-latest 36.08% <0.00%> (-0.01%) ⬇️
appsec-integration-maintenance 36.14% <0.00%> (-0.01%) ⬇️
appsec-integration-oldest 36.14% <0.00%> (-0.01%) ⬇️
appsec-kafka 40.33% <ø> (+0.05%) ⬆️
appsec-ldapjs 39.75% <ø> (-0.07%) ⬇️
appsec-lodash 39.67% <ø> (-0.07%) ⬇️
appsec-macos 57.10% <ø> (-0.07%) ⬇️
appsec-mongodb-core 43.76% <ø> (-0.17%) ⬇️
appsec-mongoose 44.71% <ø> (-0.06%) ⬇️
appsec-mysql 47.00% <ø> (-0.02%) ⬇️
appsec-next-latest-11.1.4 27.27% <ø> (-0.07%) ⬇️
appsec-next-latest-12.3.7 27.66% <ø> (ø)
appsec-next-latest-13.0.0 29.07% <ø> (-0.08%) ⬇️
appsec-next-latest-13.2.0 29.09% <ø> (-0.08%) ⬇️
appsec-next-latest-13.5.11 29.19% <ø> (-0.08%) ⬇️
appsec-next-latest-14.0.0 29.11% <ø> (-0.08%) ⬇️
appsec-next-latest-14.2.35 29.11% <ø> (-0.08%) ⬇️
appsec-next-latest-14.2.6 29.11% <ø> (-0.08%) ⬇️
appsec-next-latest-14.2.7 29.11% <ø> (-0.08%) ⬇️
appsec-next-latest-15.0.0 29.11% <ø> (-0.08%) ⬇️
appsec-next-latest-latest 29.15% <ø> (-0.08%) ⬇️
appsec-next-oldest-11.1.4 27.33% <ø> (-0.07%) ⬇️
appsec-next-oldest-12.3.7 29.13% <ø> (-0.08%) ⬇️
appsec-next-oldest-13.0.0 29.13% <ø> (-0.08%) ⬇️
appsec-next-oldest-13.2.0 29.39% <ø> (-0.08%) ⬇️
appsec-next-oldest-13.5.11 29.49% <ø> (-0.08%) ⬇️
appsec-next-oldest-14.0.0 29.42% <ø> (?)
appsec-next-oldest-14.2.35 ?
appsec-next-oldest-14.2.6 ?
appsec-next-oldest-14.2.7 29.42% <ø> (-0.08%) ⬇️
appsec-next-oldest-15.0.0 ?
appsec-next-oldest-latest 27.86% <ø> (ø)
appsec-node-serialize 38.98% <ø> (-0.07%) ⬇️
appsec-passport 42.61% <ø> (-0.07%) ⬇️
appsec-postgres 46.68% <ø> (-0.06%) ⬇️
appsec-sourcing 38.39% <ø> (-0.07%) ⬇️
appsec-stripe 40.46% <ø> (-0.06%) ⬇️
appsec-template 39.22% <ø> (-0.07%) ⬇️
appsec-ubuntu 57.22% <ø> (-0.06%) ⬇️
appsec-windows 57.03% <ø> (-0.07%) ⬇️
debugger-ubuntu-active 43.52% <ø> (ø)
debugger-ubuntu-latest 43.52% <ø> (ø)
debugger-ubuntu-maintenance 43.93% <ø> (ø)
debugger-ubuntu-oldest 43.95% <ø> (-0.05%) ⬇️
instrumentations-instrumentation-ai 45.15% <ø> (ø)
instrumentations-instrumentation-aws-sdk 44.75% <ø> (ø)
instrumentations-instrumentation-bluebird 27.41% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-body-parser 35.56% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-child_process 33.31% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-connect 48.04% <ø> (ø)
instrumentations-instrumentation-cookie-parser 29.32% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-couchbase-18 45.83% <ø> (ø)
instrumentations-instrumentation-couchbase-eol 45.83% <ø> (ø)
instrumentations-instrumentation-crypto 27.46% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-express 29.53% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-express-mongo-sanitize 29.43% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-express-multi-version 41.47% <ø> (ø)
instrumentations-instrumentation-express-session 35.34% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-fastify 48.04% <ø> (ø)
instrumentations-instrumentation-fetch 44.76% <ø> (ø)
instrumentations-instrumentation-fs 27.18% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-generic-pool 27.04% <ø> (ø)
instrumentations-instrumentation-hono 28.62% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-http 37.89% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-http-client-options 37.49% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-kafkajs 48.75% <ø> (ø)
instrumentations-instrumentation-knex 27.40% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-koa 45.71% <ø> (ø)
instrumentations-instrumentation-light-my-request 35.20% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-mongoose 28.51% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-multer 35.23% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-mysql2 33.35% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-openai-lifecycle 45.82% <ø> (ø)
instrumentations-instrumentation-otel-sdk-trace 25.25% <ø> (ø)
instrumentations-instrumentation-passport 39.15% <ø> (-0.07%) ⬇️
instrumentations-instrumentation-passport-http 38.84% <ø> (-0.07%) ⬇️
instrumentations-instrumentation-passport-local 39.30% <ø> (-0.07%) ⬇️
instrumentations-instrumentation-pg 33.07% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-promise 27.36% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-promise-js 27.36% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-q 27.39% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-restify 47.30% <ø> (ø)
instrumentations-instrumentation-router 43.37% <ø> (ø)
instrumentations-instrumentation-stripe 27.89% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-url 27.29% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-when 27.37% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-zlib 27.34% <ø> (-0.08%) ⬇️
instrumentations-integration-esbuild-0.16.12-active 24.64% <0.00%> (-0.01%) ⬇️
instrumentations-integration-esbuild-0.16.12-latest ?
instrumentations-integration-esbuild-0.16.12-maintenance 18.64% <0.00%> (-0.01%) ⬇️
instrumentations-integration-esbuild-0.16.12-oldest 18.63% <0.00%> (-0.01%) ⬇️
instrumentations-integration-esbuild-latest-active 24.64% <0.00%> (-0.01%) ⬇️
instrumentations-integration-esbuild-latest-latest 24.64% <0.00%> (-0.01%) ⬇️
instrumentations-integration-esbuild-latest-maintenance 18.64% <0.00%> (-0.01%) ⬇️
instrumentations-integration-esbuild-latest-oldest 18.63% <0.00%> (-0.01%) ⬇️
llmobs-ai 35.07% <ø> (-0.07%) ⬇️
llmobs-anthropic 36.45% <ø> (-0.08%) ⬇️
llmobs-bedrock 35.97% <ø> (-0.07%) ⬇️
llmobs-google-genai 35.73% <ø> (-0.07%) ⬇️
llmobs-langchain ?
llmobs-openai-latest 39.38% <ø> (-0.07%) ⬇️
llmobs-openai-oldest 39.46% <ø> (-0.07%) ⬇️
llmobs-sdk-active 43.41% <ø> (-0.08%) ⬇️
llmobs-sdk-latest 43.41% <ø> (-0.08%) ⬇️
llmobs-sdk-maintenance 43.51% <ø> (-0.08%) ⬇️
llmobs-sdk-oldest 43.50% <ø> (-0.08%) ⬇️
llmobs-vertex-ai 35.50% <ø> (-0.08%) ⬇️
master-coverage 92.59% <28.96%> (?)
openfeature-macos 37.39% <ø> (ø)
openfeature-ubuntu 37.53% <ø> (ø)
openfeature-unit-active 49.95% <ø> (ø)
openfeature-unit-latest 49.95% <ø> (ø)
openfeature-unit-maintenance 50.32% <ø> (ø)
openfeature-unit-oldest 50.32% <ø> (ø)
openfeature-windows ?
platform-core 45.98% <ø> (ø)
platform-esbuild 47.00% <ø> (ø)
platform-instrumentations-misc 29.36% <ø> (ø)
platform-integration-active 46.65% <ø> (+0.04%) ⬆️
platform-integration-latest ?
platform-integration-maintenance 46.75% <ø> (ø)
platform-integration-oldest 46.90% <ø> (-0.02%) ⬇️
platform-shimmer 47.05% <ø> (ø)
platform-unit-guardrails 44.04% <ø> (ø)
platform-webpack 18.11% <0.00%> (-0.01%) ⬇️
plugins-aws-durable-execution-sdk-js 32.73% <ø> (-0.07%) ⬇️
plugins-axios 35.31% <ø> (ø)
plugins-azure-cosmos 35.78% <ø> (-0.08%) ⬇️
plugins-azure-event-hubs 34.64% <ø> (ø)
plugins-azure-service-bus 35.12% <ø> (ø)
plugins-body-parser 36.33% <ø> (ø)
plugins-bullmq 39.40% <ø> (-0.08%) ⬇️
plugins-cassandra 33.47% <ø> (-0.08%) ⬇️
plugins-cookie 40.47% <ø> (ø)
plugins-cookie-parser 40.30% <ø> (ø)
plugins-crypto 42.36% <ø> (ø)
plugins-dd-trace-api 33.18% <ø> (-0.08%) ⬇️
plugins-express-mongo-sanitize 40.35% <ø> (ø)
plugins-express-session 40.22% <ø> (ø)
plugins-fastify 37.66% <ø> (-0.08%) ⬇️
plugins-fetch 33.89% <ø> (-0.08%) ⬇️
plugins-fs 33.60% <ø> (-0.08%) ⬇️
plugins-generic-pool 39.79% <ø> (ø)
plugins-google-cloud-pubsub 41.28% <ø> (-0.07%) ⬇️
plugins-grpc 36.38% <ø> (-0.08%) ⬇️
plugins-handlebars 40.35% <ø> (ø)
plugins-hapi 35.45% <ø> (-0.08%) ⬇️
plugins-hono 35.78% <ø> (-0.08%) ⬇️
plugins-ioredis 34.15% <ø> (-0.08%) ⬇️
plugins-jest 27.10% <ø> (ø)
plugins-knex 39.83% <ø> (ø)
plugins-langgraph 32.20% <ø> (-0.08%) ⬇️
plugins-ldapjs 38.81% <ø> (ø)
plugins-light-my-request 39.93% <ø> (ø)
plugins-limitd-client 27.72% <ø> (-0.08%) ⬇️
plugins-lodash 39.97% <ø> (ø)
plugins-mariadb 34.98% <ø> (-0.08%) ⬇️
plugins-memcached 33.54% <ø> (-0.08%) ⬇️
plugins-microgateway-core 34.55% <ø> (-0.08%) ⬇️
plugins-modelcontextprotocol-sdk 32.16% <ø> (-0.08%) ⬇️
plugins-moleculer 36.43% <ø> (-0.08%) ⬇️
plugins-mongodb 35.69% <ø> (-0.07%) ⬇️
plugins-mongodb-core 35.28% <ø> (-0.08%) ⬇️
plugins-mongoose 34.17% <ø> (-0.08%) ⬇️
plugins-multer 40.27% <ø> (ø)
plugins-mysql 34.47% <ø> (-0.08%) ⬇️
plugins-mysql2 34.80% <ø> (-0.08%) ⬇️
plugins-nats 36.18% <ø> (-0.08%) ⬇️
plugins-node-serialize 40.49% <ø> (ø)
plugins-opensearch 33.41% <ø> (-0.08%) ⬇️
plugins-passport-http 40.09% <ø> (ø)
plugins-pino 29.65% <ø> (-0.08%) ⬇️
plugins-postgres 34.51% <ø> (-0.08%) ⬇️
plugins-process 42.36% <ø> (ø)
plugins-pug 40.47% <ø> (ø)
plugins-redis 34.07% <ø> (-0.14%) ⬇️
plugins-router 37.88% <ø> (-0.08%) ⬇️
plugins-sequelize 39.75% <ø> (ø)
plugins-test-and-upstream-amqp10 33.68% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-amqplib 38.87% <ø> (-0.24%) ⬇️
plugins-test-and-upstream-apollo 34.65% <ø> (-0.07%) ⬇️
plugins-test-and-upstream-avsc 33.57% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-bunyan 28.87% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-connect 36.17% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-graphql 35.87% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-koa 35.68% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-protobufjs 33.80% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-rhea 39.00% <ø> (-0.08%) ⬇️
plugins-undici 34.52% <ø> (+0.05%) ⬆️
plugins-url 42.36% <ø> (ø)
plugins-valkey 33.64% <ø> (-0.08%) ⬇️
plugins-vm 42.36% <ø> (ø)
plugins-winston 29.51% <ø> (-0.08%) ⬇️
plugins-ws 36.92% <ø> (-0.08%) ⬇️
profiling-macos ?
profiling-ubuntu 43.46% <ø> (-0.07%) ⬇️
profiling-windows ?
serverless-aws-sdk-latest-aws-sdk 32.91% <ø> (-0.08%) ⬇️
serverless-aws-sdk-latest-bedrockruntime 31.81% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-client 36.20% <ø> (ø)
serverless-aws-sdk-latest-dynamodb 33.74% <ø> (-0.12%) ⬇️
serverless-aws-sdk-latest-eventbridge 26.83% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-kinesis 37.00% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-lambda 34.25% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-s3 32.16% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-serverless-peer-service 39.12% <ø> (-0.08%) ⬇️
serverless-aws-sdk-latest-sns 38.01% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-sqs 37.63% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-stepfunctions 32.82% <ø> (-0.07%) ⬇️
serverless-aws-sdk-latest-util 46.39% <ø> (ø)
serverless-aws-sdk-oldest-aws-sdk 33.03% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-bedrockruntime 31.91% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-client 36.76% <ø> (ø)
serverless-aws-sdk-oldest-dynamodb 33.83% <ø> (-0.12%) ⬇️
serverless-aws-sdk-oldest-eventbridge 26.91% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-kinesis 37.17% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-lambda 34.35% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-s3 32.29% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-serverless-peer-service 39.21% <ø> (-0.08%) ⬇️
serverless-aws-sdk-oldest-sns 38.23% <ø> (+0.05%) ⬆️
serverless-aws-sdk-oldest-sqs 37.71% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-stepfunctions 32.93% <ø> (-0.07%) ⬇️
serverless-aws-sdk-oldest-util 47.13% <ø> (ø)
serverless-azure-durable-functions 36.74% <ø> (ø)
serverless-azure-functions-eventhubs 38.22% <ø> (ø)
serverless-azure-functions-servicebus ?
serverless-lambda 34.22% <ø> (-0.10%) ⬇️
test-optimization-cucumber-latest-7.0.0 49.81% <22.22%> (+0.01%) ⬆️
test-optimization-cucumber-latest-latest 52.53% <22.22%> (+<0.01%) ⬆️
test-optimization-cucumber-oldest-7.0.0 ?
test-optimization-cypress-latest-12.0.0-commonJS 48.52% <28.96%> (-0.63%) ⬇️
test-optimization-cypress-latest-12.0.0-esm 45.67% <28.96%> (-3.54%) ⬇️
test-optimization-cypress-latest-14.5.4-commonJS 48.87% <28.96%> (-0.15%) ⬇️
test-optimization-cypress-latest-14.5.4-esm 48.90% <28.96%> (+1.58%) ⬆️
test-optimization-cypress-latest-latest-commonJS 49.35% <28.96%> (-0.02%) ⬇️
test-optimization-cypress-latest-latest-esm 47.66% <28.96%> (-1.88%) ⬇️
test-optimization-cypress-oldest-12.0.0-commonJS 47.39% <28.96%> (-0.45%) ⬇️
test-optimization-cypress-oldest-12.0.0-esm 48.32% <28.96%> (-0.97%) ⬇️
test-optimization-cypress-oldest-14.5.4-commonJS 47.47% <28.96%> (-1.58%) ⬇️
test-optimization-cypress-oldest-14.5.4-esm 48.68% <28.96%> (+1.58%) ⬆️
test-optimization-jest-latest-latest 55.23% <22.22%> (+2.46%) ⬆️
test-optimization-jest-latest-oldest 51.88% <22.22%> (-2.31%) ⬇️
test-optimization-jest-oldest-latest 55.28% <22.22%> (-0.04%) ⬇️
test-optimization-jest-oldest-oldest 51.96% <22.22%> (-2.24%) ⬇️
test-optimization-mocha-latest-latest 53.48% <22.22%> (-0.03%) ⬇️
test-optimization-mocha-latest-oldest 51.04% <22.22%> (-0.02%) ⬇️
test-optimization-mocha-oldest-latest 53.59% <22.22%> (-0.05%) ⬇️
test-optimization-mocha-oldest-oldest 51.03% <22.22%> (?)
test-optimization-playwright-latest-latest-playwright-active-test-span 44.14% <22.22%> (+0.19%) ⬆️
test-optimization-playwright-latest-latest-playwright-atr 42.77% <22.22%> (+0.03%) ⬆️
test-optimization-playwright-latest-latest-playwright-efd 43.20% <19.67%> (+<0.01%) ⬆️
test-optimization-playwright-latest-latest-playwright-final-status 43.27% <19.67%> (+0.02%) ⬆️
test-optimization-playwright-latest-latest-playwright-impacted-tests ?
test-optimization-playwright-latest-latest-playwright-reporting ?
test-optimization-playwright-latest-latest-playwright-test-management 44.40% <19.67%> (+0.01%) ⬆️
test-optimization-playwright-latest-oldest-playwright-active-test-span 43.95% <22.22%> (+0.19%) ⬆️
test-optimization-playwright-latest-oldest-playwright-atr 42.84% <22.22%> (+0.03%) ⬆️
test-optimization-playwright-latest-oldest-playwright-efd 43.13% <19.67%> (+<0.01%) ⬆️
test-optimization-playwright-latest-oldest-playwright-final-status 43.17% <19.67%> (-0.01%) ⬇️
test-optimization-playwright-latest-oldest-playwright-impacted-tests 42.65% <19.67%> (-0.09%) ⬇️
test-optimization-playwright-latest-oldest-playwright-reporting 42.62% <22.22%> (+0.01%) ⬆️
test-optimization-playwright-latest-oldest-playwright-test-management 44.34% <19.67%> (+0.01%) ⬆️
test-optimization-playwright-oldest-latest-playwright-active-test-span 44.22% <22.22%> (+0.02%) ⬆️
test-optimization-playwright-oldest-latest-playwright-atr 42.84% <22.22%> (+0.01%) ⬆️
test-optimization-playwright-oldest-latest-playwright-efd 43.26% <19.67%> (+<0.01%) ⬆️
test-optimization-playwright-oldest-latest-playwright-final-status 43.32% <19.67%> (-0.03%) ⬇️
test-optimization-playwright-oldest-latest-playwright-impacted-tests 42.81% <19.67%> (-0.09%) ⬇️
test-optimization-playwright-oldest-latest-playwright-reporting ?
test-optimization-playwright-oldest-latest-playwright-test-management 44.48% <19.67%> (-0.01%) ⬇️
test-optimization-playwright-oldest-oldest-playwright-active-test-span 44.04% <22.22%> (+0.18%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-atr 42.93% <22.22%> (+0.02%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-efd 43.19% <19.67%> (+<0.01%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-final-status 43.26% <19.67%> (-0.01%) ⬇️
test-optimization-playwright-oldest-oldest-playwright-impacted-tests 42.74% <19.67%> (-0.09%) ⬇️
test-optimization-playwright-oldest-oldest-playwright-reporting ?
test-optimization-playwright-oldest-oldest-playwright-test-management 44.43% <19.67%> (+0.01%) ⬆️
test-optimization-selenium-latest 45.11% <22.22%> (-0.01%) ⬇️
test-optimization-selenium-oldest 44.69% <22.22%> (-0.01%) ⬇️
test-optimization-testopt-active 48.19% <22.22%> (+0.05%) ⬆️
test-optimization-testopt-latest 48.19% <22.22%> (+0.05%) ⬆️
test-optimization-testopt-maintenance 48.18% <22.22%> (+0.05%) ⬆️
test-optimization-testopt-oldest 49.28% <22.22%> (+0.01%) ⬆️
test-optimization-vitest-latest 50.70% <22.22%> (+<0.01%) ⬆️
test-optimization-vitest-oldest 47.93% <22.22%> (+0.22%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

xinyeji and others added 2 commits June 18, 2026 20:30
Extends the media upload to Cypress's per-spec video:
- getContentType maps .mp4 -> video/mp4 and .webm -> video/webm.
- afterSpec uploads results.video to each failed test run's trace_id (Cypress
  records one video per spec, so it is attached to every failed test in the
  spec). Capture time falls back to the video file mtime (no per-test takenAt).
- New uploadTestVideo() reuses the same media request + idempotency key
  (`{trace_id}:{filename}`), so an upload retry overwrites instead of duplicating.

Backend + UI already support video (mp4/webm); this closes the tracer side for
Cypress. Image (screenshot) and video now both flow end-to-end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The debug line concatenated url.toString() (trailing '/') with the leading-slash
path, logging https://api.<site>//api/unstable/... The actual request was always
correct (request helper uses url.hostname + options.path separately); this just
makes the log resolve to a single, clean URL.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants