{
  "title": "Onboarding slide offset",
  "beforeRevision": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
  "afterRevision": "edf5f19e877b33130e9f42d94ed793e05f7deb0d",
  "builds": {
    "before": "e702ca2a7aca7a47",
    "after": "fa7f57783f9a371d"
  },
  "versions": {
    "before": {
      "agentCanvas": "1.32.0",
      "agentServer": "1.58.1",
      "sdk": "1.58.1",
      "automation": "1.25.1",
      "extensions": "0.35.0",
      "node": "24.22.1",
      "npm": "11.12.1"
    },
    "after": {
      "agentCanvas": "1.32.0",
      "agentServer": "1.58.1",
      "sdk": "1.58.1",
      "automation": "1.25.1",
      "extensions": "0.35.0",
      "node": "24.22.1",
      "npm": "11.12.1"
    }
  },
  "implementation": {
    "sourcePath": "src/components/features/onboarding/onboarding-modal.tsx",
    "layoutOnly": true,
    "intendedVisualRedesign": false,
    "change": "Move the computed slide offset from inline translateX transform to a CSS recipe using native translate. Phase offset arithmetic and configured 300 ms duration are retained."
  },
  "scope": {
    "themes": [
      "OpenHands-Neutral",
      "OpenHands-DeepSea",
      "Neo",
      "Light+",
      "SolarizedLight"
    ],
    "viewports": [
      "1440×1000 desktop",
      "390×844 phone"
    ],
    "selectedScreenshots": 64,
    "selectedRawClips": 10,
    "backend": "Local",
    "reducedMotion": false,
    "configuredCssDurationMs": 300,
    "gettingStartedPreviewState": "expanded"
  },
  "comparisonSummary": {
    "pairedGeometryStates": 43,
    "maximumVisualGeometryDeltaPx": 0,
    "stableGeometryAndBehaviorDifferences": 0,
    "configuredCssDurationMs": 300,
    "healthyLocalFirstRunPhases": 3,
    "errors": {
      "before": {
        "ok": true,
        "since": "last clear",
        "summary": {},
        "pageErrors": 0,
        "appErrors": 0,
        "warnings": 0,
        "events": []
      },
      "after": {
        "ok": true,
        "since": "last clear",
        "summary": {},
        "pageErrors": 0,
        "appErrors": 0,
        "warnings": 0,
        "events": []
      }
    }
  },
  "limits": [
    "Actual healthy Local first-run has three phases. Genuine Next/Back plus documented preview Hello/Back cover the changed shared slide. Four-phase backend addition/4-to-3 collapse is covered by existing functional unit and compiled CSS guards, not claimed as live backend-down/public authentication proof.",
    "Before transform matrices and After individual CSS translate are normalized through actual element rectangles; transform text identity is not expected.",
    "0.3s is configured computed CSS duration; asynchronous saves, capture sampling and wall-clock video timing are not claimed exact or identical.",
    "No model configured, no model calls or credentials entered.",
    "The standalone Local captures cover all five current themes at desktop 1440×1000 and phone 390×844. No Cloud, ACP or arbitrary embedded-host UI pass is claimed.",
    "Getting started remains expanded behind every preview capture in both phases. Fresh first-run captures are separately labelled and establish only their genuine Agent/Setup sequence.",
    "Actual UI pixels are unretouched. Separate editorial banners identify ownership and capture mode; all complete original clips and selected full-viewport PNGs are downloadable.",
    "This change moves style ownership without claiming a performance improvement or literal whole-screen pixel identity. All source clips are 25 fps; output retains original playback timing without motion interpolation."
  ],
  "captureProvenance": "onboarding-slide-offset-capture-provenance.json",
  "captureProvenanceSha256": "12ab3b807a8e7454b881f3f52e70eb7e2ae8e8e67d1ca0b234a49b0af1774f8a",
  "evidenceDownload": "onboarding-slide-offset-evidence.zip",
  "evidenceDownloadSha256": "c22060b98d7f8f15be649d4de1559abad03e172e18043fc208970f48234daccd",
  "pullRequest": "https://github.com/OpenHands/OpenHands/pull/18856",
  "film": {
    "dimensions": [
      1440,
      1120
    ],
    "fps": 25,
    "durationSeconds": 25.92,
    "scenes": [
      {
        "phase": "before",
        "kind": "recording",
        "publicSourcePath": "onboarding-slide-offset-evidence/before/before-first-run-next-back.mp4",
        "label": "Before · Inline offset",
        "subtitle": "Same 300 ms slide · Fresh first run",
        "caption": "Before: Fresh first-run Agent → Next to Setup → Back to Agent. Complete original clip with its original playback timing; configured CSS slide duration is 300 ms.",
        "head": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
        "servedBuildFingerprint": "e702ca2a7aca7a47",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "sourceSha256": "c2c0a31836f04a47ae990e727c15e118d84e74e3a6b17c990b971a0dbabe8e1f",
        "sourceBytes": 100470,
        "sourceDurationSeconds": 3.48,
        "sourceFps": 25.0,
        "timelineSeconds": [
          0,
          3.48
        ],
        "presentationDurationSeconds": 3.48,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": true,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "after",
        "kind": "recording",
        "publicSourcePath": "onboarding-slide-offset-evidence/after/after-first-run-next-back.mp4",
        "label": "After · CSS offset",
        "subtitle": "Same 300 ms slide · Fresh first run",
        "caption": "After: Fresh first-run Agent → Next to Setup → Back to Agent. Complete original clip with its original playback timing; configured CSS slide duration is 300 ms.",
        "head": "edf5f19e877b33130e9f42d94ed793e05f7deb0d",
        "servedBuildFingerprint": "fa7f57783f9a371d",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "sourceSha256": "f9c13615d97f6362f009ba3e4644425321dec77e8ecf8c443e4f355d48b60388",
        "sourceBytes": 115099,
        "sourceDurationSeconds": 2.84,
        "sourceFps": 25.0,
        "timelineSeconds": [
          3.48,
          6.32
        ],
        "presentationDurationSeconds": 2.84,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": true,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "before",
        "kind": "recording",
        "publicSourcePath": "onboarding-slide-offset-evidence/before/before-openhands-neutral-phone-preview-back-next.mp4",
        "label": "Before · Inline offset",
        "subtitle": "Same 300 ms slide · Preview · Neutral phone",
        "caption": "Before: Documented preview route: Hello → Back to Setup → Back to Agent → Next to Setup. Complete original clip with its original playback timing; configured CSS slide duration is 300 ms.",
        "head": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
        "servedBuildFingerprint": "e702ca2a7aca7a47",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "sourceSha256": "4410678c80924173aedb37d5f364176b7382b15a0422349841169e020499df94",
        "sourceBytes": 169023,
        "sourceDurationSeconds": 5.08,
        "sourceFps": 25.0,
        "timelineSeconds": [
          6.32,
          11.4
        ],
        "presentationDurationSeconds": 5.08,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": true,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "after",
        "kind": "recording",
        "publicSourcePath": "onboarding-slide-offset-evidence/after/after-openhands-neutral-phone-preview-back-next.mp4",
        "label": "After · CSS offset",
        "subtitle": "Same 300 ms slide · Preview · Neutral phone",
        "caption": "After: Documented preview route: Hello → Back to Setup → Back to Agent → Next to Setup. Complete original clip with its original playback timing; configured CSS slide duration is 300 ms.",
        "head": "edf5f19e877b33130e9f42d94ed793e05f7deb0d",
        "servedBuildFingerprint": "fa7f57783f9a371d",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "sourceSha256": "0ad717af4fe73df894d174b5b881bf429901db8b7b9fa47fc253de2492ec6a8c",
        "sourceBytes": 167213,
        "sourceDurationSeconds": 4.28,
        "sourceFps": 25.0,
        "timelineSeconds": [
          11.4,
          15.68
        ],
        "presentationDurationSeconds": 4.28,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": true,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "before",
        "kind": "recording",
        "publicSourcePath": "onboarding-slide-offset-evidence/before/before-light-plus-desktop-preview-back-next.mp4",
        "label": "Before · Inline offset",
        "subtitle": "Same 300 ms slide · Preview · Light+ desktop",
        "caption": "Before: Documented preview route: Hello → Back to Setup → Back to Agent → Next to Setup. Complete original clip with its original playback timing; configured CSS slide duration is 300 ms.",
        "head": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
        "servedBuildFingerprint": "e702ca2a7aca7a47",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "sourceSha256": "b77504b9875f54bec376f16e37ba0beb4ec8d90a3bbf0724f307b980973fac6f",
        "sourceBytes": 206068,
        "sourceDurationSeconds": 6.04,
        "sourceFps": 25.0,
        "timelineSeconds": [
          15.68,
          21.72
        ],
        "presentationDurationSeconds": 6.04,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": true,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "after",
        "kind": "recording",
        "publicSourcePath": "onboarding-slide-offset-evidence/after/after-light-plus-desktop-preview-back-next.mp4",
        "label": "After · CSS offset",
        "subtitle": "Same 300 ms slide · Preview · Light+ desktop",
        "caption": "After: Documented preview route: Hello → Back to Setup → Back to Agent → Next to Setup. Complete original clip with its original playback timing; configured CSS slide duration is 300 ms.",
        "head": "edf5f19e877b33130e9f42d94ed793e05f7deb0d",
        "servedBuildFingerprint": "fa7f57783f9a371d",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "sourceSha256": "e3d2bbf0a11e6031df4722cbc55d206e0f33f3eb42119e5e59c799317e296be5",
        "sourceBytes": 225233,
        "sourceDurationSeconds": 4.2,
        "sourceFps": 25.0,
        "timelineSeconds": [
          21.72,
          25.92
        ],
        "presentationDurationSeconds": 4.2,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": true,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      }
    ],
    "ambience": {
      "origin": "Original synthesized ambient pad; no external samples or provider.",
      "frequenciesHz": [
        174.61,
        220,
        261.63
      ],
      "amplitude": 0.004,
      "normalizationGain": 1.264055,
      "fadeInSeconds": 1.5,
      "fadeOutSeconds": 2,
      "meanDbfs": -52.5,
      "peakDbfs": -42.4,
      "applicationAudio": false
    },
    "recipeSha256": "7ec34bf3e856e8fe65c636417b53a6e2dc2e46d734f9c657c001267e318666c2"
  },
  "preview": {
    "file": "onboarding-slide-offset-before-after.gif",
    "dimensions": [
      864,
      672
    ],
    "fps": 8,
    "audio": false,
    "limitation": "Scaled silent preview; use the MP4 and original screenshots for small UI details."
  },
  "files": {
    "onboarding-slide-offset-comparison.json": {
      "sha256": "22d24b230950e1ccffeb144ed5114eb804494641c0c949986fdc91df8183fcf0",
      "bytes": 61682
    },
    "onboarding-slide-offset-evidence.zip": {
      "sha256": "c22060b98d7f8f15be649d4de1559abad03e172e18043fc208970f48234daccd",
      "bytes": 6420291
    },
    "onboarding-slide-offset-captions.vtt": {
      "sha256": "47ca9b148c65ba535c2a9b1efcd8321635348c87cc33f15cd39b52e0eea6a5cf",
      "bytes": 1310
    },
    "onboarding-slide-offset-poster.jpg": {
      "sha256": "db3d365ed038731af99cb9972392ff8f55475ff41a6655622ed1992332782655",
      "bytes": 68473
    },
    "onboarding-slide-offset-before-after.gif": {
      "sha256": "6ddc467ca0c549290ff999e867d01d802ce85664cfb61b5a6b706d561d6e9b1d",
      "bytes": 2296486
    },
    "onboarding-slide-offset-capture-provenance.json": {
      "sha256": "12ab3b807a8e7454b881f3f52e70eb7e2ae8e8e67d1ca0b234a49b0af1774f8a",
      "bytes": 38890
    },
    "onboarding-slide-offset-before-after.mp4": {
      "sha256": "c5ff711e39f8cf7ec8779aeb4880a41f9127a33af3fb9b550de8f56bf2dbcfd2",
      "bytes": 1901375
    }
  }
}
