# Carousel replacement index: D1 v2 method This is a draft, configuration-specific dataset with 20 options, no score and no ranking. The E1 run adds paired reduced-motion emulation, emulated touch gestures and Chromium accessibility-tree inspection. The original P1 observations remain available in [the preserved index](baseline-p1-index.json), [the original method](baseline-p1-METHOD.md) and unchanged P1 run logs. A named technical reviewer has not signed off either run. ## Environments and provenance P1 keyboard, focus, explicit Stop and markup-only observations were measured in Chrome/Chromium **155.0.8059.80**, macOS **27.0.1 build 26A434**, on **24 October 2026**. Those fields retain that environment. They were not silently reassigned to the new browser. E1 used an isolated, headless **Chromium 139.0.7258.5**, **Playwright 1.62.1**, on the same macOS version and date. Each run used fresh temporary browser contexts without the user's profile, cookies, account or open tabs. The viewport was 1280 × 720 CSS pixels with device scale factor 1. The local server was bound to `127.0.0.1:8771`. The runner blocked every non-loopback request; saved request logs show the actual requests and any blocks. No target domain or former-site resource was used. Every observation has its own `environment`. Rows retain `baseline_environment`, `emulation_environment` and both `tested_on` entries. Per-row evidence identifies the fixture, package version, file hash, run timestamps and raw log. Physical touch, enabled operating-system reduced-motion settings and real screen-reader output were not measured. ## Reproduce E1 Serve the delivery directory on loopback, then run the original [measurement runner](../../harness/carousel-replacements/run-e1.cjs) with an installed Playwright 1.62.1 module and a Chromium executable. These measurement tools are separate from the pinned carousel packages: ```sh python3 -m http.server 8771 --bind 127.0.0.1 PLAYWRIGHT_MODULE=/absolute/path/to/playwright \ CHROMIUM_EXECUTABLE=/absolute/path/to/chromium \ D1_ORIGIN=http://127.0.0.1:8771 \ node harness/carousel-replacements/run-e1.cjs ``` The server command runs from the delivery directory. The runner accepts fixture IDs as additional arguments to repeat a subset. It creates fresh contexts and saves observations under `harness/carousel-replacements/e1-runs/`; save existing evidence before rerunning. The installed tooling version and actual browser version belong in every new run. No `node_modules` directory or browser binary is distributed in this package. The package files, original fixtures and configurations are unchanged from P1. All third-party files and their original notices remain under `harness/`. The published package size and dependency counts retain their original definitions; emulation tools are not counted as carousel runtime dependencies. ## Reduced motion: paired observation For each option, the runner opened one context with `reducedMotion: 'no-preference'` and another with `reducedMotion: 'reduce'`. Both readings were verified through `matchMedia('(prefers-reduced-motion: reduce)')`. This is actual Chromium media emulation, not a claim about an operating-system setting. Each context recorded a 6.4-second autoplay interval, then used the existing Stop control where available and activated the same original navigation control. Timestamped index notifications, computed motion styles and request-animation-frame geometry were captured. Frame geometry uses a stable parent reference where the slider moves its own container. Matching first and last indices alone do not establish a pause. The field values are: - **Y (emulated):** the paired run showed autoplay suppression and a shortened or immediate manual transition in the tested configuration. - **partial (emulated):** a component of motion changed while autoplay continued, or an instant-navigation CSS pattern supplied no animated transition with which to establish adaptation. - **N (emulated):** the preference was verified, but the tested configuration showed no reduction in the observed motion. - **not tested:** a required mechanism or usable comparison could not be executed. None of the final 20 runs required this fallback. The frame-change spans describe this comparison. They are not a performance benchmark, production speed estimate or accessibility-compliance result. The two CSS patterns were already instant in both modes; their partial value does not imply a moving failure. ## Touch: emulated input with a control interval Touch runs used a separate `hasTouch: true` context. Chromium `Input.dispatchTouchEvent` generated a touch start, 14 movement steps and a touch end in each direction. The logs confirm trusted touch events and corresponding `pointerType: 'touch'` events received by the fixture. These are browser-generated emulated events, not physical fingers or a device lab. Autoplay was stopped through the existing P1 API adapter, or through A11Y Slider's package-generated autoplay toggle. The options themselves were not rewritten. A 2.6-second interval before swiping verified no intervening autoplay notifications. Both directional gestures then recorded their actual index and geometry outcomes. Ordinary autoplay was never credited as a swipe. A **Y (emulated)** records isolated movement after both directional gestures. **Partial (emulated)** records a one-direction result or unresolved attribution; **N (emulated)** records delivered gestures without movement in this fixture. Every row identifies the Stop path and observed sequence. These results do not establish touch-device compatibility generally. Keen Slider received the trusted events but did not move in either direction, including a repeat with intermediate geometry capture. Tiny Slider moved after only one gesture in the corrected run, so its result is partial. These are retained as findings, not converted into unsupported positive values. ## Accessibility tree: presence, not announcement The runner called Chromium `Accessibility.getFullAXTree` before autoplay was stopped, after stopping it and after manual navigation, in both media contexts. The diagnostic state-log subtree was omitted from the saved tree so it could not become false evidence of a slide announcement. **Live region: present** requires an exposed AX `live` property of `polite` or `assertive` and accessible subtree content identifying a slide. `live: off`, an empty notification region and unrelated fixture text do not qualify. The matching property, role, text and before/after states are saved. Splide, Tiny Slider and A11Y Slider met this bounded presence test. Swiper exposed an empty assertive notification region in the inspected states; it was not credited with current-slide live content. **Control names: present** requires at least one carousel control and names on every exposed carousel control inspected. The field is absent when no such controls exist or one is unnamed; counts explain the distinction. The generic Harness Prev/Next/Start/Stop toolbar, snapshot button, fixture-navigation links and panel focus-target buttons are excluded. Original buttons wired through package APIs/classes and package-generated or shadow-DOM controls are counted separately. Names are inspected as exposed, not certified as good wording. Real screen-reader output remains **not tested** for all 20 rows. A live-region property, an accessible name or a keyboard pass does not prove that a reader announced the current slide or that a page conforms to an accessibility standard. ## Corrections, preservation and review The first Slick gesture landed in wrapper whitespace. The corrected run targeted its actual slide viewport. Tiny Slider moved the container initially used as the geometry reference; the corrected comparison used its parent and the actual viewport. Their original observations remain in `e1-runs/superseded/`. Keen's repeat added intermediate gesture geometry without changing the package or its options. A reconstructed copy of the initial runner and the explicit revision note preserve the method change; its hash is not misrepresented as logged before the initial run. The original P1 A11Y index-logger correction, failed authored Stop adapter and successful package-native toggle remain unchanged. Original P1 logs, fixture hashes, package hashes and licences are verified by the preservation ledger. The E1 record adds evidence; it does not rewrite those historical observations. The [E1 run log](../../harness/carousel-replacements/e1-run-log.json) links every final raw record. [Hashes](hashes.txt) cover the data and harness files after CSV authoring. `author` and `reviewer` remain null. Human engineer-hours remain unknown; recorded automated elapsed time must not be relabelled as human labour. No publication or compliance approval is implied. ## E2 requested runtime and data licence The requested isolated rerun on Chromium **155.0.8059.80** could not execute. That version is embedded in the installed Codex Framework, but launching its helper headlessly with a fresh temporary profile immediately returned “No packaged Electron app found; exiting without a browser window.” The installed Brave version is 151.1.93.134 and the existing Playwright Chromium cache is 139.0.7258.5. Neither matches the requested engine. No live user profile was attached or opened, and no browser version was spoofed. The timestamped runtime check is saved at [runtime evidence](../../harness/carousel-replacements/e2-runtime-check.json). There are **zero new E2 dataset executions**. Existing observations, raw logs and their actual environments remain unchanged: D1's P1 fields use 155, while the D1 emulation/AX additions and D2's E1 measurements use 139. D2 has seven behaviour fields; no absent motion or AX column is invented. A supported independently launchable 155 executable is required for a valid new run. The original observation data and compilation are now [CC BY 4.0](LICENSE-DATA.md). Package implementations keep their own licences; original fixture code remains MIT. The prior E1 index and method are preserved alongside this update. Human technical review and real screen-reader/physical-touch measurements remain uncompleted.