Skip to content

feat(screenshot-diff): replace odiff with unified Rust diff engine #5453

feat(screenshot-diff): replace odiff with unified Rust diff engine

feat(screenshot-diff): replace odiff with unified Rust diff engine #5453

Triggered via pull request July 4, 2026 16:38
Status Failure
Total duration 3m 42s
Artifacts

ci.yml

on: pull_request
Matrix: e2e-test
Matrix: integration-test
static-analysis
1m 26s
static-analysis
Fit to window
Zoom out
Zoom in

Annotations

19 errors
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages imageCompression4: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages imageCompression3: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages imageCompression2: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages imageCompression1: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages fontAliasing: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages boxShadow: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages border: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages big-images: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages alphaSmallGraph: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/diff/image/index.test.ts > #diffImages > diffImages alphaBackground: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
static-analysis
Process completed with exit code 2.
static-analysis
@argos/backend#check-types: command (/home/runner/work/argos/argos/apps/backend) /usr/local/bin/pnpm run check-types exited (2)
static-analysis
Module '"@argos-ci/mask-fingerprint"' has no exported member 'diffScreenshots'.
integration-test (2)
Process completed with exit code 1.
apps/backend/src/screenshot-diff/computeScreenshotDiff.e2e.test.ts > #computeScreenshotDiff > with two different screenshots > does not apply existing ignored changes when the ignore feature is disabled: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/computeScreenshotDiff.e2e.test.ts > #computeScreenshotDiff > with two different screenshots > should not auto-ignore if latest action is user files.unignored: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/computeScreenshotDiff.e2e.test.ts > #computeScreenshotDiff > with two different screenshots > should auto-ignore changes when configured threshold is reached: apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
apps/backend/src/screenshot-diff/computeScreenshotDiff.e2e.test.ts > #computeScreenshotDiff > with two different screenshots > should update result and notify "diff-detected": apps/backend/src/screenshot-diff/diff/image/index.ts#L234
TypeError: diffScreenshots is not a function ❯ apps/backend/src/screenshot-diff/diff/image/index.ts:234:9 ❯ handleCallbackErrors.status.status node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:90:14 ❯ handleCallbackErrors node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/utils/handleCallbackErrors.ts:52:25 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:89:13 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:621:29 ❯ node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:67:11 ❯ AsyncContextStack.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:49:27 ❯ Object.withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts:129:32 ❯ withScope node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/currentScopes.ts:84:17 ❯ Module.startSpan node_modules/.pnpm/@sentry+core@10.59.0/node_modules/@sentry/core/src/tracing/trace.ts:63:9
test
Process completed with exit code 1.