{
  "title": "Automation bar height",
  "beforeRevision": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
  "afterRevision": "087e91d34a9ac8ee5954e8e741774ccf7cc1713d",
  "builds": {
    "before": "e702ca2a7aca7a47",
    "after": "1379495a41a2bc43"
  },
  "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/home/featured-automations/automation-run-activity-sparkline.tsx",
    "layoutOnly": true,
    "intendedVisualRedesign": false,
    "change": "Move each duration-owned numeric height into --automation-run-bar-height and the CSS recipe. The existing duration function,1s in-flight timer,18px track,4px bar,8px link,tooltips and run navigation remain owned by the same code paths."
  },
  "scope": {
    "themes": [
      "OpenHands-Neutral",
      "OpenHands-DeepSea",
      "Neo",
      "Light+",
      "SolarizedLight"
    ],
    "viewports": [
      "1440×1000 desktop",
      "390×844 phone"
    ],
    "consumers": [
      "Dashboard grid",
      "Dashboard list",
      "Home pinned",
      "Home recent"
    ],
    "coverage": "All five themes cover shared dashboard grid at both widths; all four consumers cover Neutral at both widths.",
    "backend": "Local",
    "matchedRunningContext": "Fresh one-run Neutral histories with expanded Getting started at1440×1000.",
    "timerIntervalMs": 1000,
    "trackHeightPx": 18,
    "barWidthPx": 4,
    "linkWidthPx": 8,
    "selectedScreenshots": 48,
    "selectedRawClips": 8,
    "cleanupRuns": 5
  },
  "comparisonSummary": {
    "capturedBarObservationChecks": 182,
    "capturedBarObservationFailures": 0,
    "staticGeometryStatesPerPhase": 16,
    "independentlyCheckedCompletedDurationBarsPerPhase": 60,
    "matchedActualRunningHeightsPx": {
      "before": [
        7.0,
        8.0,
        8.0,
        8.0,
        8.0,
        8.0,
        9.0,
        9.0,
        9.0
      ],
      "after": [
        7.0,
        8.0,
        8.0,
        8.0,
        8.0,
        8.0,
        9.0,
        9.0,
        9.0
      ]
    },
    "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 Before/After run durations vary. Each observed CSS bar height is checked against its own real server timestamps and the unchanged source-owned logarithmic mapping.",
    "In-flight reads allow one existing 1-second component tick plus sampling overhead; exact callback/recording times are not equated.",
    "Five themes at desktop and phone are represented on the shared dashboard grid component; all four consumers have Neutral desktop/phone navigation and layout coverage.",
    "6px/15px clamps are unit-contract coverage. The original Pending clip genuinely observes unknown-duration11px fallback; a separate exact-base supplemental run proves visible Running growth. No synthetic run rows or timestamps were created.",
    "First plain script exited without the required SDK callback and is excluded from completion proof. Real SDK LocalWorkspace context exits supplied canonical worker callbacks; server owns completion timestamps.",
    "Initial SDK `uv run --with` installed136 cached packages for the first three Before runs. Later Before inflight and all After runs reuse the already-installed pinned AS/SDK1.58.1 interpreter through offline no-project/no-sync uv execution. No production manifest/lock changes.",
    "Interrupted pointer-clear recordings and a rejected absolute entrypoint arrangement are excluded; no product or verification-driver changes were made.",
    "Eight real keyboard Enter navigations per phase reach each bar target URL. Persisted highlight enumeration is empty; no visible selected-row highlight proof is claimed.",
    "Matched Running film uses separate fresh Neutral one-run histories and expanded Getting started at1440×1000 on both phases. Earlier After Solarized Light/four-run/collapsed-checklist motion is retained as separate context evidence and excluded from the matched film.",
    "Optional raw cssHeight probe queried unused --automation-run-activity-bar-height; no actual writer value is inferred from that empty probe. Runtime verification uses actual computed height and source mapping/compiled CSS guards.",
    "No LLM calls, model keys, external account or Cloud runtime used.",
    "Actual UI pixels are unretouched. Complete source MP4s and selected original full-viewport PNGs are downloadable. Editorial labels and explicitly labelled crops are outside the original UI.",
    "All source clips use25fps containers and their original playback timing. Video and external DOM-read elapsed times do not establish exact internal1s timer scheduling or imply a performance change.",
    "Before and After genuine fixture durations and source run identifiers differ. Whole-screen pixel identity and identical dynamic bar heights are not claimed."
  ],
  "captureProvenance": "automation-bar-height-capture-provenance.json",
  "captureProvenanceSha256": "652181b2f5a41e7b30e054bd85925fec7e4ebc1d7c9f4dac1e4752148cf62246",
  "evidenceDownload": "automation-bar-height-evidence.zip",
  "evidenceDownloadSha256": "bbd48fc092ec3b0df7f81098d82c747a851f649b055884eddc0bd989cac4c191",
  "pullRequest": "https://github.com/OpenHands/OpenHands/pull/18857",
  "film": {
    "dimensions": [
      1440,
      1120
    ],
    "fps": 25,
    "durationSeconds": 32.56,
    "scenes": [
      {
        "phase": "before",
        "kind": "screenshot",
        "publicSourcePath": "automation-bar-height-evidence/before/growth-before-visible-running.png",
        "label": "Before · Inline height",
        "subtitle": "Duration still owns height · Neutral · Full context",
        "caption": "Before: Actual full viewport of the one-run native worker fixture used in the next detail recording. Expanded checklist, 1440×1000; genuine Running status.",
        "head": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
        "servedBuildFingerprint": "e702ca2a7aca7a47",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport below a separate editorial banner.",
        "captureRun": "lint-oct23-before-growth",
        "sourceSha256": "6dc2c26471e0a8e6363deb5ece356e6b9600c4682dd30ffd6c8c4858b553c798",
        "sourceBytes": 80153,
        "sourceDurationSeconds": null,
        "sourceFps": null,
        "timelineSeconds": [
          0,
          2.0
        ],
        "presentationDurationSeconds": 2.0,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": false,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "after",
        "kind": "screenshot",
        "publicSourcePath": "automation-bar-height-evidence/after/growth-after-visible-running.png",
        "label": "After · CSS height",
        "subtitle": "Duration still owns height · Neutral · Full context",
        "caption": "After: Actual full viewport of the one-run native worker fixture used in the next detail recording. Expanded checklist, 1440×1000; genuine Running status.",
        "head": "087e91d34a9ac8ee5954e8e741774ccf7cc1713d",
        "servedBuildFingerprint": "1379495a41a2bc43",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real viewport below a separate editorial banner.",
        "captureRun": "lint-oct23-after-growth",
        "sourceSha256": "c29a8d61b81db34ac9a7db9cd20961ae56c2472c4e67bb51cd532687c9de9093",
        "sourceBytes": 80282,
        "sourceDurationSeconds": null,
        "sourceFps": null,
        "timelineSeconds": [
          2.0,
          4.0
        ],
        "presentationDurationSeconds": 2.0,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": false,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "before",
        "kind": "recording",
        "publicSourcePath": "automation-bar-height-evidence/before/growth-before-running-growth.mp4",
        "label": "Before · Inline height",
        "subtitle": "Duration still owns height · Actual crop · Running",
        "caption": "Before: Actual crop of the complete native worker recording. The real Running bar crosses 7 → 8 → 9 px while its elapsed duration increases. Original playback timing; no manufactured statuses or timestamps.",
        "head": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
        "servedBuildFingerprint": "e702ca2a7aca7a47",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "crop": [
          636,
          310,
          450,
          240
        ],
        "presentation": "Labelled actual source crop; the matching full viewport is established first.",
        "captureRun": "lint-oct23-before-growth",
        "sourceSha256": "7df8e0758552a05f2e93c3b687f443371b48d62934fca0227ac90db3c1f31a99",
        "sourceBytes": 96104,
        "sourceDurationSeconds": 10.28,
        "sourceFps": 25.0,
        "timelineSeconds": [
          4.0,
          14.28
        ],
        "presentationDurationSeconds": 10.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": "after",
        "kind": "recording",
        "publicSourcePath": "automation-bar-height-evidence/after/growth-after-running-growth.mp4",
        "label": "After · CSS height",
        "subtitle": "Duration still owns height · Actual crop · Running",
        "caption": "After: Actual crop of the complete native worker recording. The real Running bar crosses 7 → 8 → 9 px while its elapsed duration increases. Original playback timing; no manufactured statuses or timestamps.",
        "head": "087e91d34a9ac8ee5954e8e741774ccf7cc1713d",
        "servedBuildFingerprint": "1379495a41a2bc43",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "crop": [
          636,
          310,
          450,
          240
        ],
        "presentation": "Labelled actual source crop; the matching full viewport is established first.",
        "captureRun": "lint-oct23-after-growth",
        "sourceSha256": "cb8d245e43f75482f1094afb6cdc8312faab02daa8001266ac28c2b01f2ccf2f",
        "sourceBytes": 96194,
        "sourceDurationSeconds": 10.28,
        "sourceFps": 25.0,
        "timelineSeconds": [
          14.28,
          24.56
        ],
        "presentationDurationSeconds": 10.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": "screenshot",
        "publicSourcePath": "automation-bar-height-evidence/before/before-openhands-neutral-phone-home-recent-2.png",
        "label": "Before · Inline height",
        "subtitle": "Duration still owns height · Neutral phone · Home",
        "caption": "Before: Actual full-viewport phone screenshot shows pinned and recent Home consumers. Genuine run durations differ by phase.",
        "head": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
        "servedBuildFingerprint": "e702ca2a7aca7a47",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real phone viewport below a separate editorial banner.",
        "captureRun": "lint-oct23-before",
        "sourceSha256": "0020a96bcd1c5886d6ec9d37855bd10632abba3e152d47cd2f5d07ef5e6b741b",
        "sourceBytes": 38860,
        "sourceDurationSeconds": null,
        "sourceFps": null,
        "timelineSeconds": [
          24.56,
          26.56
        ],
        "presentationDurationSeconds": 2.0,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": false,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "after",
        "kind": "screenshot",
        "publicSourcePath": "automation-bar-height-evidence/after/after-openhands-neutral-phone-home-recent.png",
        "label": "After · CSS height",
        "subtitle": "Duration still owns height · Neutral phone · Home",
        "caption": "After: Actual full-viewport phone screenshot shows pinned and recent Home consumers. Genuine run durations differ by phase.",
        "head": "087e91d34a9ac8ee5954e8e741774ccf7cc1713d",
        "servedBuildFingerprint": "1379495a41a2bc43",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "presentation": "Full real phone viewport below a separate editorial banner.",
        "captureRun": "lint-oct23-sparkline-after",
        "sourceSha256": "28c0ef0f7dad5be7263b5f5e31e8f6a2558520e2867cccd930f811b6c6e52667",
        "sourceBytes": 38874,
        "sourceDurationSeconds": null,
        "sourceFps": null,
        "timelineSeconds": [
          26.56,
          28.56
        ],
        "presentationDurationSeconds": 2.0,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": false,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "before",
        "kind": "screenshot",
        "publicSourcePath": "automation-bar-height-evidence/before/before-openhands-neutral-phone-home-recent-2.png",
        "label": "Before · Inline height",
        "subtitle": "Duration still owns height · Actual crop · Phone Home",
        "caption": "Before: Labelled actual screenshot crop makes the pinned and recent 4 px bars readable. This is the same authentic full-viewport phone screenshot shown immediately before.",
        "head": "3083e1aa1660bd45769b01e5ad5ded0b6c4be302",
        "servedBuildFingerprint": "e702ca2a7aca7a47",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "crop": [
          12,
          430,
          366,
          390
        ],
        "presentation": "Labelled actual source screenshot crop; same full viewport established first.",
        "captureRun": "lint-oct23-before",
        "sourceSha256": "0020a96bcd1c5886d6ec9d37855bd10632abba3e152d47cd2f5d07ef5e6b741b",
        "sourceBytes": 38860,
        "sourceDurationSeconds": null,
        "sourceFps": null,
        "timelineSeconds": [
          28.56,
          30.56
        ],
        "presentationDurationSeconds": 2.0,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": false,
        "sourcePlaybackNote": "Source timestamps retained. Presentation repeats frames only where required by the output frame cadence; no motion interpolation."
      },
      {
        "phase": "after",
        "kind": "screenshot",
        "publicSourcePath": "automation-bar-height-evidence/after/after-openhands-neutral-phone-home-recent.png",
        "label": "After · CSS height",
        "subtitle": "Duration still owns height · Actual crop · Phone Home",
        "caption": "After: Labelled actual screenshot crop makes the pinned and recent 4 px bars readable. This is the same authentic full-viewport phone screenshot shown immediately before.",
        "head": "087e91d34a9ac8ee5954e8e741774ccf7cc1713d",
        "servedBuildFingerprint": "1379495a41a2bc43",
        "agentServer": "1.58.1",
        "sdk": "1.58.1",
        "crop": [
          12,
          430,
          366,
          390
        ],
        "presentation": "Labelled actual source screenshot crop; same full viewport established first.",
        "captureRun": "lint-oct23-sparkline-after",
        "sourceSha256": "28c0ef0f7dad5be7263b5f5e31e8f6a2558520e2867cccd930f811b6c6e52667",
        "sourceBytes": 38874,
        "sourceDurationSeconds": null,
        "sourceFps": null,
        "timelineSeconds": [
          30.56,
          32.56
        ],
        "presentationDurationSeconds": 2.0,
        "editorialSpeedChange": false,
        "sourceStartSeconds": 0,
        "fullOriginalSelected": false,
        "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.260063,
      "fadeInSeconds": 1.5,
      "fadeOutSeconds": 2,
      "meanDbfs": -52.5,
      "peakDbfs": -42.5,
      "applicationAudio": false
    },
    "recipeSha256": "4f61d09566b6ef7f1b0dd1620e9b4a82476be7659a10122a4299c451d8b8b5c3"
  },
  "preview": {
    "file": "automation-bar-height-before-after.gif",
    "dimensions": [
      864,
      672
    ],
    "fps": 8,
    "audio": false,
    "limitation": "Scaled silent preview; use the MP4 and original screenshots for small UI details.",
    "durationSeconds": 32.56,
    "timing": "Preview samples the complete film at8fps. Explicit GIF frame delays retain full elapsed playback; a60ms final still hold aligns the32.56s total. No motion interpolation."
  },
  "files": {
    "automation-bar-height-before-after.gif": {
      "sha256": "5a599018f3e99f8e5e71e109ff05cde46a229c5ab93168803f4dd81b9c166489",
      "bytes": 4921920
    },
    "automation-bar-height-evidence.zip": {
      "sha256": "bbd48fc092ec3b0df7f81098d82c747a851f649b055884eddc0bd989cac4c191",
      "bytes": 5203809
    },
    "automation-bar-height-captions.vtt": {
      "sha256": "97bf448fa61ef25f7aae752b37972eae4db5f72b82b5ec069db2855c5189635c",
      "bytes": 1597
    },
    "automation-bar-height-before-after.mp4": {
      "sha256": "ad8d16a702e8db7fefb16f5c45d8b3dd8b0f9083e2178236e6c4da2aa5c85c62",
      "bytes": 1121257
    },
    "automation-bar-height-comparison.json": {
      "sha256": "413b9ee0b1ebfbecceb7ab58d69da15f416bdd03b30be0cf72c509d5b6871d60",
      "bytes": 234800
    },
    "automation-bar-height-poster.jpg": {
      "sha256": "8630c8c3f7792aff38e510284c989ad8ae766fefe966808cfa297f31d95b2d46",
      "bytes": 63473
    },
    "automation-bar-height-capture-provenance.json": {
      "sha256": "652181b2f5a41e7b30e054bd85925fec7e4ebc1d7c9f4dac1e4752148cf62246",
      "bytes": 42569
    }
  }
}
