{
  "beforeRevision": "70b8f9069dec3d1c39a04d755521ebe6bd252aab",
  "afterRevision": "546e76f1e1809899fdbef98412c5da633435c329",
  "builds": {
    "before": "c73929d5131944fc",
    "after": "dfdde6888d0dedfd"
  },
  "agentServer": "1.56.0",
  "sdk": "1.56.0",
  "agentCanvas": "1.30.0",
  "automation": "1.22.0",
  "cliNodeVersion": "v24.22.1",
  "implementation": {
    "layoutOnly": true,
    "intendedVisualRedesign": false,
    "sourcePath": "src/components/features/sidebar/sidebar.tsx",
    "change": "Move drawer and backdrop transition duration from inline declarations to the CSS recipe. The configured 250 ms duration and closing cleanup behavior are retained."
  },
  "scope": {
    "themes": [
      "OpenHands-Neutral",
      "Light+",
      "OpenHands-DeepSea"
    ],
    "viewports": [
      "1440\u00d71000 desktop",
      "390\u00d7844 phone"
    ],
    "selectedScreenshots": 18,
    "selectedRawClips": 2,
    "layoutOnly": true
  },
  "comparisonSummary": {
    "computedStyleAndLayoutPairs": 6,
    "changedComputedStyleAndLayoutPairs": 0,
    "controlAndRoutePairs": 15,
    "changedControlAndRoutePairs": 0,
    "closeOutcomesPerPhase": 12,
    "configuredCssDurationMs": 250,
    "observerVisibleClosingSegmentsMs": {
      "before": [
        236,
        238
      ],
      "after": [
        237,
        246
      ]
    }
  },
  "limits": [
    "The source recordings retain original control-openhands playback timing, with no editorial speed change. CLI summary duration is rounded; exact container duration, frame count and capture counters are recorded for every original. Video is evidence of the control sequence, not a finer-grained timing instrument.",
    "Coverage is standalone Local Canvas in Neutral, Light+ and DeepSea at 1440\u00d71000 desktop and 390\u00d7844 phone. No Cloud, ACP, all-five-theme or arbitrary embedded-host pass is claimed.",
    "Editorial labels and title cards are distinct from real app viewports. Actual UI pixels, including normal displayed temporary paths, are unretouched; public JSON omits local machine paths.",
    "Initial After captures with the expanded Getting started checklist are superseded. Final selected sources use the real UI to collapse the checklist before replay.",
    "The configured drawer and backdrop CSS duration is 0.25 s. Observer-visible hidden-but-mounted segments are sampled DOM presence after the actual timer has started; they are not exact elapsed mount intervals or measurements of every animation frame.",
    "Forced reduced-motion emulation is unavailable through the normal CLI. The captures record the actual reduced-motion preference as false. Source clips use the supported 25 fps maximum; early aborted attempts are excluded."
  ],
  "captureProvenance": "mobile-sidebar-duration-capture-provenance.json",
  "captureProvenanceSha256": "38cf1bf9a5127520b3096e61e0af7df1614742fc03d2a937980c802e564bbc55",
  "evidenceDownload": "mobile-sidebar-duration-evidence.zip",
  "evidenceDownloadSha256": "700bac90a5c5d4ae8bf107828bdb444fdd11c6d96136397c19e6e5588db7b359",
  "pullRequest": "https://github.com/OpenHands/OpenHands/pull/18805",
  "page": "https://enyst.github.io/arch/agentic-linting-refactoring.html#mobile-sidebar-duration-film",
  "directDownload": "https://enyst.github.io/experiments/agentic-linting-refactoring/mobile-sidebar-duration-before-after.mp4",
  "title": "Mobile sidebar duration",
  "recipeSha256": "7511d09fbafc53cb5992160cadc8328bcf37d91614c933c9ec02663f3c1cde2f",
  "film": {
    "file": "mobile-sidebar-duration-before-after.mp4",
    "dimensions": [
      1440,
      1120
    ],
    "durationSeconds": 26.2,
    "framesPerSecond": 25,
    "source": "Authentic control-openhands browser receipts. Complete app viewports are established before any explicitly labeled actual screenshot Detail crops. Title cards and banners are editorial labels, not execution proof.",
    "scenes": [
      {
        "phase": "before",
        "kind": "recording",
        "publicSourcePath": "mobile-sidebar-duration-before-sidebar-phone-raw.mp4",
        "label": "Before \u00b7 Inline duration",
        "subtitle": "Neutral \u00b7 Same 250 ms CSS duration",
        "caption": "Before: actual phone open/close controls and navigation. Configured CSS duration is 250 ms; observer-visible closing samples are not exact elapsed mount intervals. Complete original clip; no editorial speed change.",
        "head": "70b8f9069dec3d1c39a04d755521ebe6bd252aab",
        "servedBuildFingerprint": "c73929d5131944fc",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "sampling": "Original 25 fps motion samples retained.",
        "source": "mobile-sidebar-duration-before-sidebar-phone-raw.mp4",
        "sourceSha256": "60265df195b42c63a6c6f9aa31c8dcd0431810caa6575c9f4dee5b50c0716cdd",
        "sourceBytes": 190162,
        "sourceDimensions": [
          390,
          844
        ],
        "timelineSeconds": [
          1.4,
          7.72
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": 6.32,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 0.0
      },
      {
        "phase": "after",
        "kind": "recording",
        "publicSourcePath": "mobile-sidebar-duration-after-sidebar-phone-raw.mp4",
        "label": "After \u00b7 CSS duration",
        "subtitle": "Neutral \u00b7 Same 250 ms CSS duration",
        "caption": "After: actual phone open/close controls and navigation. Configured CSS duration is 250 ms; observer-visible closing samples are not exact elapsed mount intervals. Complete original clip; no editorial speed change.",
        "head": "546e76f1e1809899fdbef98412c5da633435c329",
        "servedBuildFingerprint": "dfdde6888d0dedfd",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "sampling": "Original 25 fps motion samples retained.",
        "source": "mobile-sidebar-duration-after-sidebar-phone-raw.mp4",
        "sourceSha256": "4dbac2d2e2a6c5b275e259566aa8bd784bc3c3f1197bd3bc625efca332f8ca31",
        "sourceBytes": 203254,
        "sourceDimensions": [
          390,
          844
        ],
        "timelineSeconds": [
          7.72,
          14.2
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": 6.48,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 0.0
      },
      {
        "phase": "before",
        "kind": "screenshot",
        "publicSourcePath": "mobile-sidebar-duration-evidence/sidebar/before-light-plus-phone-open.png",
        "label": "Before \u00b7 Inline duration",
        "subtitle": "Light+ \u00b7 Same 250 ms CSS duration",
        "caption": "Before: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained.",
        "head": "70b8f9069dec3d1c39a04d755521ebe6bd252aab",
        "servedBuildFingerprint": "c73929d5131944fc",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "source": "mobile-sidebar-duration-evidence/sidebar/before-light-plus-phone-open.png",
        "sourceSha256": "f24cd4ba382c6271884ec540e2d554f155835e50b8b7587dfcf6fa5a8e492ae6",
        "sourceBytes": 23827,
        "sourceDimensions": [
          390,
          844
        ],
        "timelineSeconds": [
          14.2,
          16.2
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": null,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 2.0
      },
      {
        "phase": "after",
        "kind": "screenshot",
        "publicSourcePath": "mobile-sidebar-duration-evidence/sidebar/after-light-plus-phone-open.png",
        "label": "After \u00b7 CSS duration",
        "subtitle": "Light+ \u00b7 Same 250 ms CSS duration",
        "caption": "After: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained.",
        "head": "546e76f1e1809899fdbef98412c5da633435c329",
        "servedBuildFingerprint": "dfdde6888d0dedfd",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "source": "mobile-sidebar-duration-evidence/sidebar/after-light-plus-phone-open.png",
        "sourceSha256": "c231fc3f27a2899f8edf024af27adffe2740e8af3605e671aaf959539c28d773",
        "sourceBytes": 23908,
        "sourceDimensions": [
          390,
          844
        ],
        "timelineSeconds": [
          16.2,
          18.2
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": null,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 2.0
      },
      {
        "phase": "before",
        "kind": "screenshot",
        "publicSourcePath": "mobile-sidebar-duration-evidence/sidebar/before-neutral-desktop-rail-3.png",
        "label": "Before \u00b7 Inline duration",
        "subtitle": "Desktop \u00b7 Rail behavior retained",
        "caption": "Before: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained.",
        "head": "70b8f9069dec3d1c39a04d755521ebe6bd252aab",
        "servedBuildFingerprint": "c73929d5131944fc",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "source": "mobile-sidebar-duration-evidence/sidebar/before-neutral-desktop-rail-3.png",
        "sourceSha256": "c879bb5651f046f180135697b75aff84e748066529b093c51e939897a736a28c",
        "sourceBytes": 85050,
        "sourceDimensions": [
          1440,
          1000
        ],
        "timelineSeconds": [
          18.2,
          20.2
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": null,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 2.0
      },
      {
        "phase": "after",
        "kind": "screenshot",
        "publicSourcePath": "mobile-sidebar-duration-evidence/sidebar/after-neutral-desktop-rail.png",
        "label": "After \u00b7 CSS duration",
        "subtitle": "Desktop \u00b7 Rail behavior retained",
        "caption": "After: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained.",
        "head": "546e76f1e1809899fdbef98412c5da633435c329",
        "servedBuildFingerprint": "dfdde6888d0dedfd",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "source": "mobile-sidebar-duration-evidence/sidebar/after-neutral-desktop-rail.png",
        "sourceSha256": "95a32de7047c7e75917aa50ea6a2ab4091aa7b234eb70980bed6f440fbfb4b60",
        "sourceBytes": 85193,
        "sourceDimensions": [
          1440,
          1000
        ],
        "timelineSeconds": [
          20.2,
          22.2
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": null,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 2.0
      },
      {
        "phase": "before",
        "kind": "screenshot",
        "publicSourcePath": "mobile-sidebar-duration-evidence/sidebar/before-deepsea-phone-closed-after-navigation.png",
        "label": "Before \u00b7 Inline duration",
        "subtitle": "DeepSea \u00b7 Closed after navigation",
        "caption": "Before: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained.",
        "head": "70b8f9069dec3d1c39a04d755521ebe6bd252aab",
        "servedBuildFingerprint": "c73929d5131944fc",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "source": "mobile-sidebar-duration-evidence/sidebar/before-deepsea-phone-closed-after-navigation.png",
        "sourceSha256": "a659ca617bcccd9f6fbe9eca2d5bc57e7c2595f84ccfadce6d9be68f589076e1",
        "sourceBytes": 59725,
        "sourceDimensions": [
          390,
          844
        ],
        "timelineSeconds": [
          22.2,
          24.2
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": null,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 2.0
      },
      {
        "phase": "after",
        "kind": "screenshot",
        "publicSourcePath": "mobile-sidebar-duration-evidence/sidebar/after-deepsea-phone-closed-after-navigation.png",
        "label": "After \u00b7 CSS duration",
        "subtitle": "DeepSea \u00b7 Closed after navigation",
        "caption": "After: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained.",
        "head": "546e76f1e1809899fdbef98412c5da633435c329",
        "servedBuildFingerprint": "dfdde6888d0dedfd",
        "agentServer": "1.56.0",
        "sdk": "1.56.0",
        "source": "mobile-sidebar-duration-evidence/sidebar/after-deepsea-phone-closed-after-navigation.png",
        "sourceSha256": "7687d868d02c03d61f72446e51e139dad56f8dbf47d3b087b43a1a23dad0fc1a",
        "sourceBytes": 60319,
        "sourceDimensions": [
          390,
          844
        ],
        "timelineSeconds": [
          24.2,
          26.2
        ],
        "selectedSourceStartSeconds": 0.0,
        "sourceDurationSeconds": null,
        "presentation": "Full real viewport, proportionally fitted below a separate editorial banner.",
        "stillOrHeldSeconds": 2.0
      }
    ],
    "chapters": [
      {
        "from": 0,
        "to": 1.4,
        "kind": "presentation-title",
        "caption": "Mobile sidebar duration"
      },
      {
        "from": 1.4,
        "to": 7.720000000000001,
        "kind": "recording",
        "caption": "Before: actual phone open/close controls and navigation. Configured CSS duration is 250 ms; observer-visible closing samples are not exact elapsed mount intervals. Complete original clip; no editorial speed change."
      },
      {
        "from": 7.720000000000001,
        "to": 14.200000000000001,
        "kind": "recording",
        "caption": "After: actual phone open/close controls and navigation. Configured CSS duration is 250 ms; observer-visible closing samples are not exact elapsed mount intervals. Complete original clip; no editorial speed change."
      },
      {
        "from": 14.200000000000001,
        "to": 16.200000000000003,
        "kind": "screenshot",
        "caption": "Before: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained."
      },
      {
        "from": 16.200000000000003,
        "to": 18.200000000000003,
        "kind": "screenshot",
        "caption": "After: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained."
      },
      {
        "from": 18.200000000000003,
        "to": 20.200000000000003,
        "kind": "screenshot",
        "caption": "Before: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained."
      },
      {
        "from": 20.200000000000003,
        "to": 22.200000000000003,
        "kind": "screenshot",
        "caption": "After: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained."
      },
      {
        "from": 22.200000000000003,
        "to": 24.200000000000003,
        "kind": "screenshot",
        "caption": "Before: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained."
      },
      {
        "from": 24.200000000000003,
        "to": 26.200000000000003,
        "kind": "screenshot",
        "caption": "After: actual full-viewport screenshot. The CSS ownership changes; the configured sidebar behavior is retained."
      }
    ],
    "ambience": {
      "origin": "Original synthesized ambient pad; no external samples or provider.",
      "frequenciesHz": [
        174.61,
        220,
        261.63
      ],
      "amplitude": 0.004,
      "fadeInSeconds": 1.5,
      "fadeOutSeconds": 2,
      "meanDbfs": -52.9,
      "peakDbfs": -42.9,
      "applicationAudio": false
    }
  },
  "preview": {
    "file": "mobile-sidebar-duration-before-after.gif",
    "durationSeconds": 24.75,
    "dimensions": [
      864,
      672
    ],
    "audio": false,
    "limitation": "Scaled silent preview; use the MP4 or original screenshots for small UI details."
  },
  "files": {
    "mobile-sidebar-duration-before-after.mp4": {
      "sha256": "b15579730a1cb2ec01cfa218e508dcc6fce797b4369111fc1141720100fe1d1d",
      "bytes": 1210391
    },
    "mobile-sidebar-duration-poster.jpg": {
      "sha256": "f7b99b4f4d6978501ebc88f553ced5af5c616700d92e6dcff4b13adf74381dc6",
      "bytes": 48913
    },
    "mobile-sidebar-duration-captions.vtt": {
      "sha256": "70114d775d7fc524874ee4dd591c45a05fef7dacf388b541713597169465d32c",
      "bytes": 1414
    },
    "mobile-sidebar-duration-before-after.gif": {
      "sha256": "09340843bcd8b447b4010d40ba1cef6c6da8172bb509e2f8346a25a5223267cc",
      "bytes": 1424336
    }
  }
}
