From 11b450a8bf528f71edf2ac8f9ec0af33e60ca71a Mon Sep 17 00:00:00 2001 From: Carter Francis Date: Fri, 7 Aug 2026 11:29:18 -0500 Subject: [PATCH 1/5] build: add pytest-split to the tests extra PR-tier CI legs split the suite into 2 duration-balanced shards (--splits/--group against spyde/tests/.test_durations); pytest-split falls back to count-based splitting when the durations file is absent. Lock delta is pytest-split 0.11.0 only (pure Python, depends on pytest). --- pyproject.toml | 1 + uv.lock | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 41705407..f86e2048 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -193,6 +193,7 @@ spyde = [ tests = [ "pytest-instafail", "pytest-rerunfailures", + "pytest-split", "pytest-timeout", "pytest>=3.6", "setuptools_scm", diff --git a/uv.lock b/uv.lock index c05adad6..13f864d8 100644 --- a/uv.lock +++ b/uv.lock @@ -2724,6 +2724,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/98/58a71d68d3126d7f6a6ed1944c37ec207a4ff3dc66cad3bed7b59d38df61/pytest_rerunfailures-16.3-py3-none-any.whl", hash = "sha256:6bdfb8ffb46c46072e6c16bdedee38b6c13eac620d9415ed5b63152cbf283170", size = 15396, upload-time = "2026-05-22T06:51:20.547Z" }, ] +[[package]] +name = "pytest-split" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/16/8af4c5f2ceb3640bb1f78dfdf5c184556b10dfe9369feaaad7ff1c13f329/pytest_split-0.11.0.tar.gz", hash = "sha256:8ebdb29cc72cc962e8eb1ec07db1eeb98ab25e215ed8e3216f6b9fc7ce0ec2b5", size = 13421, upload-time = "2026-02-03T09:14:31.469Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/a1/d4423657caaa8be9b31e491592b49cebdcfd434d3e74512ce71f6ec39905/pytest_split-0.11.0-py3-none-any.whl", hash = "sha256:899d7c0f5730da91e2daf283860eb73b503259cb416851a65599368849c7f382", size = 11911, upload-time = "2026-02-03T09:14:33.708Z" }, +] + [[package]] name = "pytest-timeout" version = "2.4.0" @@ -3612,6 +3624,7 @@ tests = [ { name = "pytest-cov" }, { name = "pytest-instafail" }, { name = "pytest-rerunfailures" }, + { name = "pytest-split" }, { name = "pytest-timeout" }, { name = "setuptools-scm" }, { name = "sphinx-gallery" }, @@ -3644,6 +3657,7 @@ requires-dist = [ { name = "pytest-cov", marker = "extra == 'tests'" }, { name = "pytest-instafail", marker = "extra == 'tests'" }, { name = "pytest-rerunfailures", marker = "extra == 'tests'" }, + { name = "pytest-split", marker = "extra == 'tests'" }, { name = "pytest-timeout", marker = "extra == 'tests'" }, { name = "pyxem" }, { name = "pyyaml" }, From 675a62491151f4ac1cdf9e98c149107fb9f05be8 Mon Sep 17 00:00:00 2001 From: Carter Francis Date: Fri, 7 Aug 2026 11:29:33 -0500 Subject: [PATCH 2/5] ci: PR fast tier + duration-balanced e2e groups Python matrix becomes two tiers behind one job definition: a matrix-prep job emits the matrix JSON on github.event_name. PRs run 6 legs (ubuntu 3.10-3.13, windows 3.12, macos 3.13) x 2 pytest-split shards; pushes to main keep the full 3 OS x 4 python matrix unsharded (group 0 = falsy = no --splits). Sharded legs time out at 20 min, main-tier legs keep 40. The extras job shards x2 on PRs the same way. Coverage stays on ubuntu-3.12 (both PR shards upload; Codecov merges server-side). e2e drops Playwright --shard: it balances by file count and parked one shard at 25.8 min next to an 8.0 one (two green main runs measured). SLOW_SPECS now lists every >=45s spec slowest-first and CI takes round-robin groups of each slice via SPYDE_E2E_GROUP (fast x4 + slow x5, all groups ~6-9 min of tests + ~1.5 min setup). Verified locally: the 9 groups partition the 137-file suite exactly, no overlap. Playwright retries are 0 under CI (a retry of a timed-out app boot doubles the damage); e2e job timeout drops 45 -> 25 min. --- .github/workflows/build.yml | 277 +++++++++++++++------------------- electron/playwright.config.ts | 90 +++++++---- 2 files changed, 180 insertions(+), 187 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 81f64395..669dda4c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,16 +1,13 @@ name: build -# push is main-only: a PR branch already gets the pull_request run; the bare -# `push:` trigger duplicated every matrix (2x cost, 2x flake surface). +# push is main-only: a PR branch already gets the pull_request run; a bare +# `push:` trigger would duplicate every matrix. on: push: branches: [main] pull_request: - # Long-lived INTEGRATION branches too, not just main. `feat/0.3.0` collects - # a whole release, and with `[main]` alone a PR into it ran no tests at all - # — #82 through #88 each landed a wave that way, and the matrix first saw - # them only when 0.3.0 itself went at main. A PR whose checks are green - # because nothing ran is worse than a red one. + # Long-lived integration branches too (feat/0.3.0 style): a PR into them + # must run the tests, not silently run nothing. branches: [main, "feat/[0-9]*"] concurrency: @@ -18,25 +15,65 @@ concurrency: cancel-in-progress: true env: - # The backend is Qt-free now (Electron + anyplotlib); no QT_QPA / X11 needed. + # The backend is Qt-free (Electron + anyplotlib); no QT_QPA / X11 needed. MPLBACKEND: agg PYTEST_ADDOPTS: "--timeout=600 -vv --durations=10" jobs: + # Two tiers, one job definition: PRs get a reduced 6-leg python matrix, each + # leg split into 2 duration-balanced shards (12 jobs, ~5-8 min each); pushes + # to main get the full 3 OS x 4 python matrix, unsharded. group 0 means + # "no sharding" (falsy in expressions), so `matrix.group &&` selects tier. + matrix-prep: + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + test: ${{ steps.emit.outputs.test }} + extras: ${{ steps.emit.outputs.extras }} + steps: + - id: emit + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + cat >> "$GITHUB_OUTPUT" <<'OUT' + test<> "$GITHUB_OUTPUT" <<'OUT' + test< 248s over the same 25 files) but only ~15% on a hosted Linux - # runner (12.5m with vs ~10.8m without, same commit) — so this is tidiness - # and ~1.5m a leg, NOT the reason the matrix used to time out. That was - # DaskManager.shutdown() sleeping 0.5s per Session teardown; see - # test_dask_shutdown_fast.py. + # PR shards split by recorded durations (spyde/tests/.test_durations); + # pytest-split falls back to count-based splitting when that file is + # missing or stale, so a missing file degrades balance, not the run. + # Coverage only on ubuntu-3.12 (the only leg the upload reads); on PRs + # both shards upload and Codecov merges them server-side. - name: Run tests - run: uv run pytest spyde/tests/migrated ${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12') && '--cov=spyde --cov-report=xml' || '' }} + run: > + uv run pytest spyde/tests/migrated + ${{ matrix.group && format('--splits 2 --group {0} --durations-path spyde/tests/.test_durations', matrix.group) || '' }} + ${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12') && '--cov=spyde --cov-report=xml' || '' }} - name: Upload coverage to Codecov if: ${{ github.repository_owner == 'directelectron' @@ -88,20 +124,18 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} # ── Domain extras (0.3.0) ────────────────────────────────────────────────── - # The `test` job above runs with NO optional extras, which is the important - # half of the contract: SpyDE must work for a user who only does 4D-STEM, and - # the `requires_package:` gate must hide the EELS/EBSD/atoms actions rather - # than raising ImportError. This job is the other half — with exspy, - # kikuchipy and atomap installed the gated code actually executes, so a broken - # EELS/EBSD/atom path fails here instead of silently never running. - # - # One OS / one Python: the extras are pure-Python scientific packages and the - # cross-platform surface is already covered by `test`. Not part of the main - # matrix because that would quadruple install time for every leg. + # `test` runs with NO optional extras — the `requires_package:` gate must + # hide EELS/EBSD/atoms actions rather than raise ImportError. This job is + # the other half: with exspy/kikuchipy/atomap installed the gated code + # actually executes. One OS / one python; sharded x2 on PRs like `test`. test-extras: - name: extras (ubuntu, py3.12) + name: extras (ubuntu, py3.12${{ matrix.group && format(', shard {0}/2', matrix.group) || '' }}) + needs: matrix-prep runs-on: ubuntu-latest - timeout-minutes: 40 + timeout-minutes: ${{ matrix.group && 20 || 40 }} + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.matrix-prep.outputs.extras) }} steps: - uses: actions/checkout@v4 with: @@ -110,6 +144,8 @@ jobs: - name: Set up uv uses: astral-sh/setup-uv@v6 with: + # Pinned: resolving "latest" hits the GitHub releases API, which + # took out every CI leg during the 2026-07 API outage. version: "0.10.11" enable-cache: true @@ -124,17 +160,17 @@ jobs: - name: Versions run: | uv run python -V - # importlib.metadata, not `pkg.__version__` — atomap imports fine but - # exposes no `__version__`, which failed this job before a single test - # ran. The point of the step is "the extra installed and imports", so - # ask the installed distribution, which every package answers. + # importlib.metadata, not `pkg.__version__` — atomap exposes no + # `__version__`. The point is "the extra installed and imports". uv run python -c "import importlib.metadata as m; \ import exspy, kikuchipy, atomap; \ print('\n'.join(f'{p} {m.version(p)}' \ for p in ('exspy', 'kikuchipy', 'atomap')))" - name: Run tests (extras present) - run: uv run pytest spyde/tests/migrated + run: > + uv run pytest spyde/tests/migrated + ${{ matrix.group && format('--splits 2 --group {0} --durations-path spyde/tests/.test_durations', matrix.group) || '' }} # ── Renderer/main TypeScript typecheck ───────────────────────────────────── # Pure TS compile (tsc --noEmit) of the Electron main + renderer. No Python / @@ -160,21 +196,18 @@ jobs: run: npm run typecheck # ── Main-process unit tests (cross-OS) ───────────────────────────────────── - # Pure-logic units from the Electron MAIN process (node:test, native TS type- - # stripping on Node 24). No display / Python / Electron runtime — just Node — so - # it runs fast on all three desktop OSes. Motivation: the auto-updater's - # friendlyError() must sanitise a raw releases.atom / HTML error body on EVERY - # platform (the "mac auto-update failed spectacularly" wall-of-XML regression, - # also reported on Windows). The mapper is platform-independent, but running it - # on windows/macos/ubuntu also guards against per-OS differences in node --test - # + TS type-stripping + glob expansion. + # Pure-logic units from the Electron MAIN process (node:test, native TS + # type-stripping on Node 24). No display / Python / Electron runtime. Runs + # on all desktop OSes because the auto-updater's friendlyError() must + # sanitise raw error bodies on EVERY platform, and per-OS differences in + # node --test + type-stripping + glob expansion are real. unit: name: electron-unit (${{ matrix.os }}) strategy: fail-fast: false matrix: - # windows-latest ≈ Win 11 image; windows-2022 ≈ the older Win 10-era image. - # macos-latest = Apple Silicon. Covers Win 11 / Win 10-era / macOS as asked. + # windows-latest ≈ Win 11 image; windows-2022 ≈ the older Win 10-era + # image. macos-latest = Apple Silicon. os: [ubuntu-latest, windows-latest, windows-2022, macos-latest] runs-on: ${{ matrix.os }} timeout-minutes: 10 @@ -195,36 +228,38 @@ jobs: run: npm run test:unit # ── Electron e2e (Playwright) ────────────────────────────────────────────── - # Runs the DEFAULT 'electron' project only (synthetic + bundled data, no - # network). The opt-in 'electron-real' project (real pyxem downloads + the - # screenshot generator) is NOT run here. + # DEFAULT 'electron' project only (synthetic + bundled data, no network); + # the opt-in real-data 'electron-real' project is NOT run here. ubuntu + + # xvfb; the app spawns the backend via `uv run python -m spyde`. # - # OS choice: ubuntu-latest + xvfb. Electron headless CI is cheapest/standard on - # Linux, and the default project uses only synthetic/bundled data (no Windows- - # specific reader paths exercised). In dev mode the app spawns the backend via - # `uv run python -m spyde`, so the job sets up uv + pre-syncs the env. + # Duration-balanced slicing, NOT Playwright --shard: --shard balances by + # FILE COUNT and reliably parks one shard at 2-3x the others (measured 25.8 + # vs 8.0 min on adjacent shards). SLOW_SPECS in electron/playwright.config.ts + # lists every >=45s file slowest-first; SPYDE_E2E_GROUP=k/n takes every n-th + # file of the slice round-robin, which spreads duration evenly. Measured + # per-group: fast ~7 min, slow ~6-9 min, plus ~1.5 min setup. # - # Best-effort for now (continue-on-error): the e2e launches a real Electron app - # + Dask LocalCluster and has not yet been validated green on a hosted runner. - # Drop continue-on-error once it's confirmed stable in CI. - # Sharded ×4: the suite is deliberately serial WITHIN a run (one Electron + - # Dask cluster at a time — see playwright.config.ts), so wall-clock scales - # only by splitting the spec files across independent runners. Each shard is - # still fully serial, so the cluster-contention flakiness that forced - # workers:1 cannot recur across shards (separate VMs). Playwright balances - # shards by FILE COUNT, not duration — ×2 measured 22.7m vs 10.0m, and ×3 - # still ran 8.1m / 14.5m / >30m (shard 1 was CANCELLED at the timeout on - # test 76 of 115, so it produced no report at all). ×4 plus the domain - # extras below brings the worst shard back under the budget. + # retries are 0 in CI (playwright.config.ts reads CI) — a retry of a + # timed-out app boot doubles the damage. Best-effort for now + # (continue-on-error) until confirmed stable on hosted runners. e2e: - name: electron-e2e (ubuntu, shard ${{ matrix.shard }}/4) + name: electron-e2e (${{ matrix.slice }} ${{ matrix.group }}/${{ matrix.of }}) runs-on: ubuntu-latest - timeout-minutes: 45 + timeout-minutes: 25 continue-on-error: true strategy: fail-fast: false matrix: - shard: [1, 2, 3, 4] + include: + - { slice: fast, group: 1, of: 4 } + - { slice: fast, group: 2, of: 4 } + - { slice: fast, group: 3, of: 4 } + - { slice: fast, group: 4, of: 4 } + - { slice: slow, group: 1, of: 5 } + - { slice: slow, group: 2, of: 5 } + - { slice: slow, group: 3, of: 5 } + - { slice: slow, group: 4, of: 5 } + - { slice: slow, group: 5, of: 5 } steps: - uses: actions/checkout@v4 with: @@ -235,7 +270,6 @@ jobs: with: node-version: "24" - # The e2e launches the real Python backend (`uv run python -m spyde`). - name: Set up uv uses: astral-sh/setup-uv@v6 with: @@ -244,13 +278,9 @@ jobs: version: "0.10.11" enable-cache: true - # WITH the domain extras. Without them the `requires_package:` gate hides - # every EELS/EBSD/atoms action, so the 0.3.0 specs that click those - # buttons cannot pass — 9 of them failed for that reason alone, and with - # retries:1 each one paid a second full app boot. Installing the extras - # makes them testable AND takes ~10 minutes of dead retry off shard 1. - # Not --frozen: the extras resolve per-platform, so the lock can't satisfy - # them (same reason as the `extras` job above). + # WITH the domain extras: the `requires_package:` gate hides the + # EELS/EBSD/atoms actions without them, so those specs cannot pass. + # NOT --frozen: the extras resolve per-platform (same as `test-extras`). - name: Pre-sync the Python backend env run: uv sync --extra tests --extra all @@ -262,87 +292,20 @@ jobs: working-directory: electron run: npx playwright install --with-deps chromium - # test:build = electron-vite build && playwright test. Pin --project=electron - # so ONLY the synthetic/bundled-data project runs; without it Playwright runs - # every project, including the heavy real-data 'electron-real' (pyxem - # downloads + screenshot writes) that is meant to be opt-in. - # SPYDE_E2E_SLICE=fast excludes the handful of files that dominate - # wall-clock (see SLOW_SPECS in playwright.config.ts); they run in the - # e2e-slow job below. Playwright shards by FILE COUNT, not duration, so - # without this split one shard reliably lands at 2-4x the others — 127 - # tests in 6.8 min on one against 90 in 22.6 on another, and re-sharding - # never fixed it because count-balancing keeps making the same choice. - name: Run Electron e2e working-directory: electron env: - SPYDE_E2E_SLICE: fast - run: xvfb-run --auto-servernum npm run test:build -- --project=electron --shard=${{ matrix.shard }}/4 - - - name: Upload Playwright report - if: ${{ always() }} - uses: actions/upload-artifact@v4 - with: - name: playwright-report-shard-${{ matrix.shard }} - path: electron/playwright-report/ - if-no-files-found: ignore - - # The handful of spec files that dominate wall-clock, split out of the shard - # matrix above. Playwright balances shards by FILE COUNT, not duration, so - # leaving these in the matrix reliably parked one shard at 2-4x the others - # (measured: 127 tests in 6.8 min on shard 3 against 90 in 22.6 on shard 1). - # Re-sharding does not help — count-balancing keeps making the same split, and - # the workflow history above records both x2 and x3 landing a shard over - # 20 min. Moving them here costs no extra wall-clock overall and needs no - # additional runner beyond this one. - # - # The file list lives in ONE place: SLOW_SPECS in electron/playwright.config.ts. - # `reportSlowTests` prints every file over 30 s, so CI says when it has drifted. - e2e-slow: - name: electron-e2e (ubuntu, slow specs) - runs-on: ubuntu-latest - timeout-minutes: 45 - continue-on-error: true - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: "24" - - - name: Set up uv - uses: astral-sh/setup-uv@v6 - with: - version: "0.10.11" - enable-cache: true - - - name: Pre-sync the Python backend env - run: uv sync --extra tests --extra all - - - name: Install Electron dependencies - working-directory: electron - run: npm ci - - - name: Install Playwright browsers - working-directory: electron - run: npx playwright install --with-deps chromium - - - name: Run the slow Electron e2e specs - working-directory: electron - env: - SPYDE_E2E_SLICE: slow + SPYDE_E2E_SLICE: ${{ matrix.slice }} + SPYDE_E2E_GROUP: ${{ matrix.group }}/${{ matrix.of }} run: xvfb-run --auto-servernum npm run test:build -- --project=electron - name: Upload Playwright report if: ${{ always() }} uses: actions/upload-artifact@v4 with: - name: playwright-report-slow + name: playwright-report-${{ matrix.slice }}-${{ matrix.group }} path: electron/playwright-report/ if-no-files-found: ignore -# NOTE: packaging the desktop app (electron-builder + the uv Python sidecar) is a -# separate, tag-triggered release workflow — see electron/PACKAGING.md. It is not -# wired here because it needs per-OS signing secrets / vendored uv binaries. +# NOTE: packaging the desktop app (electron-builder + the uv Python sidecar) is +# a separate, tag-triggered release workflow — see electron/PACKAGING.md. diff --git a/electron/playwright.config.ts b/electron/playwright.config.ts index e42c87f5..01a0262a 100644 --- a/electron/playwright.config.ts +++ b/electron/playwright.config.ts @@ -1,4 +1,5 @@ import { defineConfig } from '@playwright/test' +import { readdirSync } from 'fs' import { join } from 'path' // A FRESH Electron profile + settings dir for every app launch, so no spec can @@ -10,37 +11,67 @@ import { join } from 'path' require('./tests/_clean_slate.cjs').installCleanSlate() /** - * The specs that dominate wall-clock, newest measurement first. + * Every spec file that costs >= ~45 s on a hosted runner, SLOWEST FIRST — the + * order IS the CI balancing (round-robin below). Playwright's `--shard` + * balances by FILE COUNT, not duration, and reliably parks one shard at 2-3x + * the others, so CI does not use `--shard` at all. * - * Playwright's `--shard` balances by FILE COUNT, not duration, and this suite's - * files differ by ~40x. Measured on one CI run: shard 3 ran 127 tests in 6.8 - * min while shard 1 ran 90 in 22.6 — and re-sharding never fixed it, because - * count-balancing keeps making the same bad split (the workflow records ×2 and - * ×3 both landing one shard over 20 min, one of them cancelled at the timeout). - * - * Splitting THESE out and sharding the rest evens it up without another runner: - * 22.6 / 11.7 / 6.8 / 5.8 -> roughly 13 / 12 / 11 / 10. - * - * `reportSlowTests` above prints every file over 30 s, so CI itself tells you - * when this list has drifted. Keep it to files that genuinely dominate — a long - * list defeats the point by leaving the sharded half too thin. + * Durations: median of the two most recent green main runs (2026-08-03). + * `reportSlowTests` prints every file over 30 s, so CI says when this list + * has drifted. */ export const SLOW_SPECS = [ - '**/fit_quality.spec.ts', // 3.7m - '**/gpu_image_parity.spec.ts', // 1.5m - '**/ipf_perf.spec.ts', // 1.3m - '**/action_scoping.spec.ts', // 1.1m - '**/fit_handles.spec.ts', // 57s - '**/fit_from_composition.spec.ts', // 53s + '**/progressive_signal_preview.spec.ts', // 194s + '**/progressive_orientation_preview.spec.ts', // 154s + '**/ipf_perf.spec.ts', // 149s + '**/report_edit2.spec.ts', // 111s + '**/sped_ag_grid.spec.ts', // 105s + '**/insitu_playback.spec.ts', // 90s + '**/gpu_image_parity.spec.ts', // 90s + '**/ipf_two_window_vom.spec.ts', // 90s + '**/eels_edge_component.spec.ts', // 84s + '**/ipf_two_window.spec.ts', // 81s + '**/laundry_visual.spec.ts', // 80s + '**/vector_om_lazy.spec.ts', // 70s + '**/orientation_lazy.spec.ts', // 70s + '**/ebsd_workflow.spec.ts', // 66s + '**/action_scoping.spec.ts', // 65s + '**/compose_real_drag.spec.ts', // 61s + '**/om_wizard_lazy.spec.ts', // 60s + '**/nav_drag_distributed.spec.ts', // 58s + '**/actions_lifecycle.spec.ts', // 57s + '**/fit_handles.spec.ts', // 57s + '**/shutdown.spec.ts', // 56s + '**/grid_present.spec.ts', // 56s + '**/vector_overlay.spec.ts', // 54s + '**/find_vectors_result.spec.ts', // 51s + '**/vector_vi_lazy.spec.ts', // 51s + '**/fit_from_composition.spec.ts', // 50s + '**/ipf_refine_render.spec.ts', // 49s + '**/vi_lazy.spec.ts', // 47s ] -// Which half of the split to run. CI sets it per job; unset (every local run) -// means "everything", so nobody has to know this exists to run the suite. -// slow -> ONLY the files above, one job, unsharded -// fast -> everything EXCEPT them, sharded --shard=N/4 +// Which slice to run. CI sets both; unset (every local run) means +// "everything", so nobody has to know this exists to run the suite. +// SPYDE_E2E_SLICE: slow -> ONLY the files above; fast -> everything else +// SPYDE_E2E_GROUP: 'k/n' -> every n-th file of the slice, offset k (1-based) +// Round-robin over the slice's file order spreads duration evenly: SLOW_SPECS +// is sorted slowest-first, and the fast slice is all sub-45s files, so any +// contiguous alphabetical cluster of heavy files lands on different jobs. +const bare = (glob: string) => glob.slice(glob.lastIndexOf('/') + 1) +const FAST_SPECS = readdirSync(join(__dirname, 'tests')) + .filter((f) => f.endsWith('.spec.ts')) + .filter((f) => !f.endsWith('.real.spec.ts') && f !== 'guide_screenshots.spec.ts') + .filter((f) => !SLOW_SPECS.some((g) => bare(g) === f)) + .sort() const SLICE = process.env.SPYDE_E2E_SLICE -const SLICE_IGNORE = SLICE === 'fast' ? SLOW_SPECS : [] -const SLICE_MATCH = SLICE === 'slow' ? SLOW_SPECS : null +let sliceFiles = SLICE === 'slow' ? SLOW_SPECS.map(bare) : SLICE === 'fast' ? FAST_SPECS : null +const GROUP = process.env.SPYDE_E2E_GROUP +if (sliceFiles && GROUP) { + const [k, n] = GROUP.split('/').map(Number) + sliceFiles = sliceFiles.filter((_, i) => i % n === k - 1) +} +const SLICE_MATCH = sliceFiles ? sliceFiles.map((f) => '**/' + f) : null export default defineConfig({ testDir: './tests', @@ -52,7 +83,9 @@ export default defineConfig({ globalTeardown: require.resolve('./tests/global-teardown.cjs'), timeout: 120_000, expect: { timeout: 15_000 }, - retries: 1, + // CI: 0 — a retry of a timed-out app boot doubles the damage (a 10-min hang + // became 20). Locally: 1, as before. + retries: process.env.CI ? 0 : 1, // line: one timestamped row per test WITH its duration (the dot reporter made // CI stalls unattributable — 9 silent minutes with no test name). html: the CI // workflow uploads playwright-report/ as an artifact; without an html reporter @@ -83,10 +116,7 @@ export default defineConfig({ // need downloaded pyxem datasets. name: 'electron', testMatch: SLICE_MATCH ?? '**/*.spec.ts', - testIgnore: [ - '**/*.real.spec.ts', '**/guide_screenshots.spec.ts', - ...SLICE_IGNORE, - ], + testIgnore: ['**/*.real.spec.ts', '**/guide_screenshots.spec.ts'], }, { // Local / nightly tier: real pyxem datasets + per-step screenshot From ce72966630fdf6d780cd259100c2ca3b45c43f89 Mon Sep 17 00:00:00 2001 From: Carter Francis Date: Fri, 7 Aug 2026 11:35:32 -0500 Subject: [PATCH 3/5] ci: recursive spec discovery, stale SLOW_SPECS guard, slow x6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Spec discovery in playwright.config.ts is now recursive, so a spec file added in a subdirectory of electron/tests/ lands in a CI slice instead of silently never running ('**/'+name matches at any depth). A SLOW_SPECS entry with no file on disk now throws at config load naming the stale glob — a renamed slow spec previously self-healed into the fast slice without a trace. The e2e slow slice goes x5 -> x6 (worst group 8.9 -> 7.7 min of tests, ~9.3 min wall) toward the closer-to-5 wall-clock preference. Verified: the 10 groups still partition the 137-file suite exactly, no overlap. --- .github/workflows/build.yml | 13 +++++++------ electron/playwright.config.ts | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 669dda4c..597ca9c4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -237,7 +237,7 @@ jobs: # vs 8.0 min on adjacent shards). SLOW_SPECS in electron/playwright.config.ts # lists every >=45s file slowest-first; SPYDE_E2E_GROUP=k/n takes every n-th # file of the slice round-robin, which spreads duration evenly. Measured - # per-group: fast ~7 min, slow ~6-9 min, plus ~1.5 min setup. + # per-group: fast ~7 min, slow ~4.5-8 min, plus ~1.5 min setup. # # retries are 0 in CI (playwright.config.ts reads CI) — a retry of a # timed-out app boot doubles the damage. Best-effort for now @@ -255,11 +255,12 @@ jobs: - { slice: fast, group: 2, of: 4 } - { slice: fast, group: 3, of: 4 } - { slice: fast, group: 4, of: 4 } - - { slice: slow, group: 1, of: 5 } - - { slice: slow, group: 2, of: 5 } - - { slice: slow, group: 3, of: 5 } - - { slice: slow, group: 4, of: 5 } - - { slice: slow, group: 5, of: 5 } + - { slice: slow, group: 1, of: 6 } + - { slice: slow, group: 2, of: 6 } + - { slice: slow, group: 3, of: 6 } + - { slice: slow, group: 4, of: 6 } + - { slice: slow, group: 5, of: 6 } + - { slice: slow, group: 6, of: 6 } steps: - uses: actions/checkout@v4 with: diff --git a/electron/playwright.config.ts b/electron/playwright.config.ts index 01a0262a..56e6d081 100644 --- a/electron/playwright.config.ts +++ b/electron/playwright.config.ts @@ -59,11 +59,21 @@ export const SLOW_SPECS = [ // is sorted slowest-first, and the fast slice is all sub-45s files, so any // contiguous alphabetical cluster of heavy files lands on different jobs. const bare = (glob: string) => glob.slice(glob.lastIndexOf('/') + 1) -const FAST_SPECS = readdirSync(join(__dirname, 'tests')) +// Recursive: a spec added in a SUBDIRECTORY must land in a slice too, not +// silently fall out of CI. '**/'+bare matches at any depth. +const ALL_SPEC_FILES = readdirSync(join(__dirname, 'tests'), { recursive: true }) + .map((f) => bare(String(f).replace(/\\/g, '/'))) .filter((f) => f.endsWith('.spec.ts')) + .sort() +for (const g of SLOW_SPECS) { + // A renamed/deleted slow spec must fail loudly here, not silently carry a + // stale glob while the file drifts into the fast slice. + if (!ALL_SPEC_FILES.includes(bare(g))) + throw new Error(`SLOW_SPECS entry has no file under tests/: ${g} — update the list`) +} +const FAST_SPECS = ALL_SPEC_FILES .filter((f) => !f.endsWith('.real.spec.ts') && f !== 'guide_screenshots.spec.ts') .filter((f) => !SLOW_SPECS.some((g) => bare(g) === f)) - .sort() const SLICE = process.env.SPYDE_E2E_SLICE let sliceFiles = SLICE === 'slow' ? SLOW_SPECS.map(bare) : SLICE === 'fast' ? FAST_SPECS : null const GROUP = process.env.SPYDE_E2E_GROUP From 0202a5b2f762c0aa38bcc7fceb213c2ee91dbe83 Mon Sep 17 00:00:00 2001 From: Carter Francis Date: Fri, 7 Aug 2026 12:11:23 -0500 Subject: [PATCH 4/5] ci: seed the pytest-split durations file 2657 entries from a full green run of spyde/tests/migrated on a Windows dev box (811 s of measured test time). Relative durations transfer well enough across OSes for 2-way shard balance; pytest-split treats unknown/new tests as average-cost, so drift degrades balance, never correctness. --- spyde/tests/.test_durations | 2659 +++++++++++++++++++++++++++++++++++ 1 file changed, 2659 insertions(+) create mode 100644 spyde/tests/.test_durations diff --git a/spyde/tests/.test_durations b/spyde/tests/.test_durations new file mode 100644 index 00000000..c6a8788c --- /dev/null +++ b/spyde/tests/.test_durations @@ -0,0 +1,2659 @@ +{ + "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_closing_output_window_unmarks_source_action": 0.6575596999609843, + "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_deselect_hides_output_window_and_clears_artifact": 0.6505354000255466, + "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_running_region_action_tracks_artifact_and_marks_active": 1.627530200057663, + "spyde/tests/migrated/test_action_dispatch_state.py::TestActionInstanceTracked::test_generic_dispatch_stores_action_instance": 0.5767481999937445, + "spyde/tests/migrated/test_action_dispatch_state.py::TestActionInstanceTracked::test_update_vi_reaches_generic_action": 0.5545787001028657, + "spyde/tests/migrated/test_action_dispatch_state.py::TestFailedActionUnlightsButton::test_exception_emits_action_active_false": 0.2165269999532029, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_forget_unknown_window_is_noop": 0.000826600007712841, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_forget_window_evicts_view_data": 0.0008335000602528453, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_keep_alive_and_forget": 0.0008444000268355012, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_session_forget_window_evicts_figures": 0.00798869994468987, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_all_entries_are_dotted_paths": 0.0010270000202581286, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_register_staged_adds_entry": 0.0008500999538227916, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_resolve_staged_imports_handler": 0.0008693999843671918, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_resolve_unknown_returns_none": 0.0008653999539092183, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_close_window_routes_controller_backed_window": 0.007771599921397865, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_controller_close_exception_is_swallowed": 0.007662799907848239, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_forget_window_closes_and_evicts": 0.007187599898315966, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_register_and_lookup": 0.007733199861831963, + "spyde/tests/migrated/test_api_layer.py::TestApiCenterZeroBeam::test_center_zero_beam_smoke": 0.061121099977754056, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_find_vectors_headless": 2.951375999953598, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_provenance_stamped": 0.00186410010792315, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_strain_map_default_reference": 0.006717099924571812, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_strain_reference_is_zero_beam_filtered": 0.0022195999044924974, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_vector_virtual_image": 0.0017852999735623598, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_virtual_image_empty_detector_raises": 0.001297699986025691, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_virtual_image_signal2d": 0.004968399996869266, + "spyde/tests/migrated/test_api_layer.py::TestApiImportGraph::test_api_import_pulls_no_ui_stack": 0.773838400025852, + "spyde/tests/migrated/test_api_layer.py::TestApiImportGraph::test_api_source_never_imports_backend_or_drawing": 0.008179299999028444, + "spyde/tests/migrated/test_api_layer.py::TestClientSeam::test_api_surface_complete": 0.000836100080050528, + "spyde/tests/migrated/test_api_layer.py::TestClientSeam::test_batch_cores_accept_client": 0.0009039000142365694, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderDeclinesArbitraryPositions::test_positions_true_returns_none": 0.015458700014278293, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_fast_path_disabled_without_os_pread": 0.011404099990613759, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_frame_bytes": 0.01881009992212057, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_frames_are_correct_on_any_platform": 0.022468699957244098, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_pread_matches_memmap_fallback": 0.0005327999824658036, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderMultiDimNav::test_2d_nav_flat_index_matches_expected_frame": 0.016962300054728985, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestCloseAllReaders::test_closes_and_clears_plot_readers": 0.010780800017528236, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_base_array_still_resolves_binary": 0.01552259991876781, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_derived_read_through_resolve_reader_matches_compute": 0.020861199940554798, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_nav_crop_declines": 0.005829899804666638, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_signal_rebin_declines": 0.008387699956074357, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_byte_identical_to_compute": 0.033821800141595304, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_extracts_correct_kwargs_and_offset": 0.06458939984440804, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_no_memmap_source_for_non_memmap_array": 0.0010745999170467257, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestReaderCleanup::test_close_is_safe_on_any_platform": 0.01262009993661195, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestReaderCleanup::test_close_releases_fd": 0.000489800120703876, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestResolveReaderFallback::test_falls_back_to_local_transform_for_derived_view": 0.002011900069192052, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestResolveReaderFallback::test_resolves_binary_reader_for_memmap_backed": 0.021670499816536903, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_byte_accounting_survives_concurrent_readers": 0.030137399910017848, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_lru_evicts_oldest_over_budget": 0.001239500124938786, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_single_entry_over_budget_still_served": 0.0013645000290125608, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_touching_a_frame_protects_it_from_eviction": 0.001157499966211617, + "spyde/tests/migrated/test_array_cache_core.py::TestClear::test_clear_drops_everything": 0.0011146001052111387, + "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_different_indices_is_a_miss": 0.0011087999446317554, + "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_first_read_is_a_miss": 0.0013098999625071883, + "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_second_read_same_indices_is_a_hit_no_reader_call": 0.0011817999184131622, + "spyde/tests/migrated/test_array_cache_core.py::TestKeyInvalidation::test_different_key_misses_even_for_same_indices": 0.0010761999292299151, + "spyde/tests/migrated/test_array_cache_core.py::TestResidentProbe::test_is_resident_never_calls_reader": 0.0010833998676389456, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestDirectReadFrameLocalityGating::test_rebin_of_lazy_movie_uses_array_cache": 0.4511160998372361, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestDirectReadFrameLocalityGating::test_untagged_transform_falls_through_not_cached": 0.38863709999714047, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_data_swap_on_the_same_signal_drops_stale_frames": 0.007881000055931509, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_local_signal_populates_array_cache": 0.0041202998254448175, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_opaque_signal_returns_none": 0.0019305999157950282, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_matches_per_frame_sum_across_a_block_boundary": 0.012570500024594367, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_returns_frame_wise_mean": 0.00978170009329915, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_sums_from_the_block_not_frame_by_frame": 0.009809000068344176, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_residency_probe_is_chunk_granular": 0.004409699933603406, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_residency_probe_never_creates_a_reader": 0.0021873998921364546, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_frame_bytes": 0.002083399798721075, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_frame_parity_and_chunk_memo_reuse": 0.00757710007019341, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_is_chunk_resident_tracks_the_memo": 0.004323399974964559, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_returned_frame_does_not_retain_the_decoded_chunk": 0.004194999812170863, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader2D::test_2d_nav_frame_parity_and_memo": 0.009398299967870116, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestNavChunkSpan::test_1d_mapping": 0.000941299949772656, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestNavChunkSpan::test_uneven_last_chunk": 0.0008744001388549805, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_chunked_source_memoizes_the_nav_block": 0.20189899997785687, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_is_chunk_resident_tracks_the_memo": 0.19495459995232522, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_oversized_block_falls_back_to_frame_reads": 0.20257330010645092, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_single_frame_chunk_does_not_memoize": 0.2211080000270158, + "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_derived_frames_are_the_transformed_ones": 0.04294910002499819, + "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_nav_crop_declines_and_falls_back": 0.03488329995889217, + "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_signal_rebin_declines_and_falls_back": 0.20152479992248118, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_hspy_yields_h5py_dataset": 0.25800180004443973, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_in_ram_ndarray_source_declines": 0.0012198000913485885, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_memmap_source_is_accepted": 0.017000399995595217, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_zspy_yields_zarr_array": 0.611686100019142, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_1d_nav_movie_frames_match": 0.03407520009204745, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_hspy_frames_match_compute": 0.0454463999485597, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_returned_frame_owns_its_memory": 0.00820639985613525, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_zspy_frames_match_compute": 0.2531109000556171, + "spyde/tests/migrated/test_array_cache_source_array.py::TestResolveOrdering::test_hspy_resolves_source_array_reader": 0.03477440006099641, + "spyde/tests/migrated/test_array_cache_source_array.py::TestResolveOrdering::test_zspy_resolves_source_array_reader": 0.20162880013231188, + "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_find_atoms_locates_the_lattice": 0.0016598000656813383, + "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_find_then_refine_recovers_the_truth": 0.0014444998232647777, + "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_missing_extra_gives_the_install_line": 0.0011464001145213842, + "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_does_not_move_an_already_centred_atom_much": 0.001119599910452962, + "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_handles_atoms_near_the_edge": 0.0009418000699952245, + "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_pulls_a_jittered_guess_back_toward_the_atom": 0.022942100069485605, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_a_runaway_fit_keeps_its_input_position": 0.006339400075376034, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_all_atoms_pinned_is_a_no_op": 0.0010917999316006899, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_ellipticity_is_recovered_when_present": 0.03176689986139536, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_mask_length_is_checked": 0.0010711000068113208, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_pinned_atoms_keep_their_position_exactly": 0.08676079998258501, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_recovers_positions_to_sub_pixel": 0.17179190006572753, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_recovers_the_known_widths": 0.017085000057704747, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_two_step_beats_the_gaussian_alone_from_a_poor_start": 0.12601709994487464, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_displacement_finds_a_real_distortion": 0.041904799989424646, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_displacement_is_zero_on_a_perfect_lattice": 0.0011023000115528703, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_ellipticity_does_not_flip_with_orientation": 0.0016606999561190605, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_ellipticity_is_at_least_one": 0.017638000077567995, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_intensity_is_the_fitted_volume": 0.019615299999713898, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_nn_distance_matches_the_lattice_spacing": 0.0020295000867918134, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_property_maps_returns_one_value_per_atom": 0.018674199818633497, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_atoms_outside_the_shape_are_dropped_not_wrapped": 0.0008851001039147377, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_length_mismatch_is_caught": 0.001080899965018034, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_pixels_without_an_atom_are_nan": 0.000853499979712069, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_places_values_at_their_atoms": 0.001023799879476428, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_does_not_cancel_to_zero": 0.001043599913828075, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_max_separation_rejects_a_non_dumbbell_lattice": 0.0010801000753417611, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_recovers_the_known_direction": 0.0011051000328734517, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_recovers_the_known_separation": 0.04749569995328784, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_too_few_atoms_is_an_error": 0.0008937000529840589, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_works_for_a_diagonal_dumbbell": 0.001079399953596294, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_accepts_an_explicit_vector": 0.0010707000037655234, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_end_to_end_from_the_image": 0.030178399989381433, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_independent_fits_underestimate_the_separation": 0.03228630009107292, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_joint_fitting_beats_independent_fitting": 0.07737679989077151, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_joint_fitting_recovers_the_true_separation": 0.028700999915599823, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_reports_the_vector_it_used": 0.0013630000175908208, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_survives_refinement_jitter": 0.0018406999297440052, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_a_wrong_vector_leaves_atoms_unpaired": 0.0009412000654265285, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_an_odd_atom_out_is_reported_not_dropped": 0.0009024001192301512, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_no_atom_is_claimed_twice": 0.0013234999496489763, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_pairs_every_atom_on_a_clean_lattice": 0.0013795000268146396, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_partners_are_the_real_partners": 0.0015158000169321895, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_zero_vector_is_rejected": 0.00083580007776618, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_angle_is_folded_to_a_half_turn": 0.0008171000517904758, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_angle_tracks_a_real_rotation": 0.000848500058054924, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_centre_is_the_midpoint": 0.0008497000671923161, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_intensity_ratio_distinguishes_the_two_sites": 0.0009435000829398632, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_one_value_per_pair_not_per_atom": 0.001516799908131361, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_separation_matches_the_truth": 0.0015371000627055764, + "spyde/tests/migrated/test_axes.py::TestAxes::test_axes_info_emitted_on_load": 0.21224040002562106, + "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_ignores_garbage_numeric": 0.22634409985039383, + "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_name_and_units": 0.2191823999164626, + "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_scale_writes_back_and_reemits": 0.2091618999838829, + "spyde/tests/migrated/test_axes_edit.py::TestAxesEdit::test_scale_edit_preserves_origin_pixel": 0.38331329997163266, + "spyde/tests/migrated/test_axes_edit.py::TestAxesEdit::test_set_axis_writes_back_and_re_emits": 0.3712916999356821, + "spyde/tests/migrated/test_background_drag.py::TestDragCost::test_a_live_move_does_not_emit_state": 0.13887990009970963, + "spyde/tests/migrated/test_background_drag.py::TestDragCost::test_the_release_emits_state": 0.15548439999110997, + "spyde/tests/migrated/test_background_drag.py::TestScoping::test_closing_removes_the_band_and_the_curve": 0.1434115000301972, + "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_a_window_right_of_the_peak_does_not_explode": 0.7497764000436291, + "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_it_is_left_at_zero_when_the_axis_does_not_reach_it": 0.08245380013249815, + "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_the_origin_is_moved_off_a_zero_based_axis": 0.19584079994820058, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_a_dict_event_works_too": 0.18898949993308634, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_an_event_without_a_source_is_ignored": 0.08840460004284978, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_the_geometry_comes_off_event_source": 0.4170634001493454, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_the_window_is_normalised": 0.17465910012833774, + "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_only_one_background_line_exists": 0.27073890005704015, + "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_the_curve_changes_when_the_band_moves": 0.15708230005111545, + "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_the_line_is_updated_in_place_not_rebuilt": 0.3859299001051113, + "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_contains_is_side_effect_free": 0.0027354001067578793, + "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_keys_are_scoped_per_owner": 0.0017257999861612916, + "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_miss_then_hit": 0.001280000084079802, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_clear_resets_accounting": 0.001743700006045401, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_drop_owner_leaves_others": 0.0018650998827069998, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_evicts_lru_over_budget": 0.0022817000281065702, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_hit_refreshes_recency": 0.0023311999393627048, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_oversized_block_still_served": 0.0026692000683397055, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_region_span_stays_resident": 0.0809546000091359, + "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_demote_is_idempotent": 0.002396599971689284, + "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_demote_shrinks_but_keeps_working_set": 0.404282100033015, + "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_restore_returns_full_budget": 0.0015159000176936388, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_int32_region_mean_is_accurate": 0.0014082000125199556, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[float16]": 0.0008024999406188726, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[float32]": 0.0013273999793455005, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[int16]": 0.0007990999147295952, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[uint8]": 0.0008119998965412378, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_uint16_above_the_cap_falls_back": 0.0007441999623551965, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_uint16_at_the_cap_uses_float32": 0.0008182000601664186, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[float64]": 0.0007938999915495515, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[int32]": 0.0009665001416578889, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[uint32]": 0.0008223999757319689, + "spyde/tests/migrated/test_block_cache.py::TestThreadSafety::test_concurrent_put_keeps_accounting_consistent": 0.08657060016412288, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_client_none_is_honoured": 0.01611539989244193, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_explicit_client_still_returned": 0.01565350010059774, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_idempotent": 0.0007014001021161675, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_patch_applied": 0.0006877999985590577, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_synchronous_read_returns_correct_frame": 0.013798999949358404, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_activating_automatic_tab_shows_full_frame_box_immediately": 0.4785641999915242, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_auto_centers_beam": 0.6000312999822199, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_auto_region_shows_draggable_widget_and_run_uses_it": 0.5761702999006957, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_manual_center_from_crosshair": 0.6030144999967888, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_node_switch_tears_down_region_and_markers": 0.4691024998901412, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_region_drag_handler_runs_once_per_event": 0.4634034999180585, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_region_widget_torn_down_on_close": 0.475860400008969, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_tree_close_tears_down_region_widgets": 0.4769122999859974, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_batched_submit_prime_then_bulk": 0.07856290019117296, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_cancel_stops_the_dispatch": 0.029777899966575205, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_cancelled_handle_is_not_delivered": 0.0011166000040248036, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_one_cancellable_handle_registered": 0.030684899888001382, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_plot_update_worker_accepts_the_handle": 0.0011494000209495425, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_result_is_assembled_not_recomputed": 0.03382839995902032, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_submits_unpinned": 0.024816500023007393, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_worker_finds_the_handle_through_hyperspys_data_setter": 0.004901299835182726, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_no_client_submit_inside_a_loop_outside_the_dispatcher": 1.2849565000506118, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_no_second_whole_array_compute_in_the_nav_fill": 0.0011719998437911272, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_the_guard_actually_catches_the_pattern": 0.0008638999424874783, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_the_navigator_fill_calls_the_dispatcher": 0.0032561998814344406, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_a_balanced_cube_splits_the_signal": 0.00995029998011887, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_a_one_frame_per_chunk_movie_is_not_split": 0.010645700036548078, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_eager_data_has_no_chunking": 0.0067868001060560346, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_long_chunk_lists_are_truncated_but_counted": 0.010261400137096643, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_storage_aligned_chunks_are_not_split": 0.012493400019593537, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_closing_unknown_window_still_notifies_renderer": 0.00877689989283681, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_lone_signal_window_closes_its_tree": 0.16227079986128956, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_navigator_close_closes_the_whole_tree": 0.20564710022881627, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_signal_close_closes_only_that_window": 0.20502530003432184, + "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_close_flips_registered_flag_and_cancels_future": 0.21304670011159033, + "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_register_on_already_closed_tree_flips_immediately": 0.24111240007914603, + "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_unregister_drops_from_registry": 0.21560889994725585, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_attrs_and_provenance": 0.028821699903346598, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_creates_exactly_one_tree_with_views": 0.05838489986490458, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_on_tree_hook_runs_and_failure_is_swallowed": 0.05028580001089722, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_rgb_primary_autolevels_without_clim": 0.02760769973974675, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_root_signal_carries_primary_data": 0.06370519998017699, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_view_data_evicted_when_window_closes": 0.060902099939994514, + "spyde/tests/migrated/test_commit_tree.py::TestOpenResultTree::test_accepts_prepared_signal_and_signal_type": 0.033623000024817884, + "spyde/tests/migrated/test_commit_tree.py::TestOpenResultTree::test_opens_new_tree_with_title_and_provenance": 0.03234179993160069, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_live_search_silver": 2.025348300114274, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_search_emits_results": 0.0010176999494433403, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_search_handles_network_error": 0.000991899985820055, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_fetch_cod_cif_writes_file": 0.025914999889209867, + "spyde/tests/migrated/test_composition.py::TestCodTidy::test_tidy_dedupes_and_sorts_by_cell": 0.0009016002295538783, + "spyde/tests/migrated/test_composition.py::TestCodTidy::test_tidy_skips_rows_without_a_cell": 0.0008441000245511532, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_read_empty": 0.007992799975909293, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_set_composition_handler_writes_and_emits": 0.004440800053998828, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_write_read_roundtrip": 0.007501599960960448, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_write_without_percentages": 0.007354100001975894, + "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_apply_sets_env_persists_and_restarts": 0.01955580001231283, + "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_empty_payload_is_a_noop": 0.0020577999530360103, + "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_values_clamped_and_bad_gpu_defaulted": 0.002823100076057017, + "spyde/tests/migrated/test_compute_config.py::TestPersistedEnv::test_current_config_reads_env": 0.0011708000674843788, + "spyde/tests/migrated/test_compute_config.py::TestPersistedEnv::test_startup_loads_settings_env_wins": 0.020620100083760917, + "spyde/tests/migrated/test_console.py::TestCompletion::test_attribute_completion_is_side_effect_free": 0.020192199968732893, + "spyde/tests/migrated/test_console.py::TestCompletion::test_attribute_completion_one_level": 0.03154140000697225, + "spyde/tests/migrated/test_console.py::TestCompletion::test_builtin_names_complete": 0.01830390002578497, + "spyde/tests/migrated/test_console.py::TestCompletion::test_prefix_completion": 0.05482929991558194, + "spyde/tests/migrated/test_console.py::TestDispatchWiring::test_console_action_dispatch": 0.01856279990170151, + "spyde/tests/migrated/test_console.py::TestDispatchWiring::test_console_exec_via_app_command_envelope": 0.01863870001398027, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_assignment_registers_name_but_echoes_nothing": 0.0269177999580279, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_expression_echoes_value_and_registers_out": 0.05011350009590387, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_multi_statement_with_trailing_expression": 0.019497300032526255, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_none_valued_expression_registers_no_out": 0.01933049992658198, + "spyde/tests/migrated/test_console.py::TestErrors::test_name_error_surfaces": 0.019572900258935988, + "spyde/tests/migrated/test_console.py::TestErrors::test_runtime_error_reports_traceback_and_keeps_namespace": 0.041718500084243715, + "spyde/tests/migrated/test_console.py::TestErrors::test_syntax_error_reports_ok_false": 0.019534299965016544, + "spyde/tests/migrated/test_console.py::TestLazyNeverComputes::test_lazy_dask_array_expression_reports_lazy": 0.028675899957306683, + "spyde/tests/migrated/test_console.py::TestLazyNeverComputes::test_lazy_signal_comparison_stays_lazy": 0.11525570007506758, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_1d_ndarray_is_signal1d": 0.07636760000605136, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_lazy_result_stays_lazy": 0.11712330009322613, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_ndarray_creates_tree": 0.06832149997353554, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_scalar_refuses_politely": 0.030404799967072904, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_show_helper_opens_window": 0.06406510004308075, + "spyde/tests/migrated/test_console.py::TestNamespace::test_hs_and_da_available": 0.03133030002936721, + "spyde/tests/migrated/test_console.py::TestNamespace::test_numpy_array_expression_kind_ndarray": 0.018906299956142902, + "spyde/tests/migrated/test_console.py::TestNamespace::test_numpy_available": 0.0194551000604406, + "spyde/tests/migrated/test_console.py::TestNamespace::test_persistence_across_execs": 0.040350700030103326, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_assigned_var": 0.04808829992543906, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_out_chip": 0.041507799993269145, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_signal_binding_noop": 0.2534517999738455, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_via_action_dispatch": 0.03616979985963553, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_binding_removed_on_tree_close": 0.2719489000737667, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_positional_aliases_track_load_order": 0.07577980018686503, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_signal_binding_has_window_ids": 0.23462210001889616, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_signal_exposed_as_name_and_positional_alias": 0.23534899996593595, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_titled_signal_gets_sanitized_name": 0.06369789992459118, + "spyde/tests/migrated/test_console.py::TestStdout::test_stdout_captured": 0.01984630001243204, + "spyde/tests/migrated/test_console.py::TestStdout::test_stdout_with_trailing_expression": 0.019717900082468987, + "spyde/tests/migrated/test_console.py::TestVarsSchema::test_out_chip_appears_in_vars": 0.018306899932213128, + "spyde/tests/migrated/test_console.py::TestVarsSchema::test_vars_schema_exact": 0.23715260007884353, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[(a, b)-True]": 0.0023444999242201447, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[(x := 1)-False]": 0.0010133999167010188, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[-s1 + 2 * b-True]": 0.0022488998947665095, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[[i for i in s1]-False]": 0.0010187000734731555, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[[s1]-False]": 0.0010067998664453626, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[a and not b-True]": 0.0020881000673398376, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[a if b else c-False]": 0.0010028000688180327, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[f'{s1}'-False]": 0.0010227999882772565, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[lambda: 1-False]": 0.0010161000536754727, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[np.log(s1)-False]": 0.0010279000271111727, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1 > 100-True]": 0.002359699923545122, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.data-True]": 0.0022508000256493688, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum()-False]": 0.0010221998672932386, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum(axis=(0,1))-False]": 0.0010307999327778816, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum-True]": 0.0022887999657541513, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1[0:2, ::2]-True]": 0.0023317000595852733, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1[0]-True]": 0.0022392000537365675, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[x = 1-False]": 0.0009948000079020858, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[{'a': 1}-False]": 0.0010149000445380807, + "spyde/tests/migrated/test_console_preview.py::TestCoalescing::test_exec_cancels_queued_preview": 0.9200192998396233, + "spyde/tests/migrated/test_console_preview.py::TestCoalescing::test_superseded_preview_never_emits": 0.926952000008896, + "spyde/tests/migrated/test_console_preview.py::TestCostGuard::test_nav_sum_is_too_expensive": 0.25758510001469404, + "spyde/tests/migrated/test_console_preview.py::TestNavPositionResolution::test_no_selector_falls_back_to_frame_zero": 0.2508089999901131, + "spyde/tests/migrated/test_console_preview.py::TestNavPositionResolution::test_thumbnail_reflects_cursor": 0.24463600013405085, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_exec_clears_nav_refresh": 0.6304359000641853, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_explicit_preview_not_nav_tracked": 0.6219336000503972, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_hook_registered_and_removed": 0.009428700082935393, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_nav_move_reemits_at_new_cursor": 0.26635429984889925, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_run_update_fires_hook_only_on_change": 0.2495276000117883, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_stop_clears_nav_refresh": 0.6195201999507844, + "spyde/tests/migrated/test_console_preview.py::TestPreviewNeverComputesFull::test_lazy_comparison_previews_one_frame": 0.22816059994511306, + "spyde/tests/migrated/test_console_preview.py::TestPreviewSideEffectFree::test_no_chips_no_console_result": 0.019960499950684607, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_image_thumbnail_matches_pipeline": 0.2406090999720618, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_scalar": 0.02091600012499839, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_sparkline_nan_becomes_null": 0.037375699961557984, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_sparkline_strided_and_capped": 0.04270139988511801, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_explicit_autolevel_recomputes": 0.0020359999034553766, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frame_holds_on_checkerboard_placeholder": 0.00153929996304214, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frame_holds_on_zero_frame": 0.0014734001597389579, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frames_hold_contrast": 0.0017216999549418688, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_output_plot_relevels_each_recompute": 0.0019715999951586127, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_output_plot_still_paints_blank_frame": 0.0017508999444544315, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_user_clim_is_held_across_navigated_frames": 0.0014925000723451376, + "spyde/tests/migrated/test_crop_action.py::TestCropInToolbar::test_crop_available_on_a_2d_signal_plot": 0.2716844999231398, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_close_tears_down_widget_without_running": 0.2134306998923421, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_drag_clamp_handler_runs_once_per_event": 0.24825210007838905, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_full_frame_widget_is_a_noop_run": 0.21743310010060668, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_node_switch_tears_down_widget": 0.2151554999873042, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_open_shows_draggable_widget_covering_full_frame": 0.22385389998089522, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_tree_close_tears_down_widget": 0.213740200153552, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_typed_field_edit_moves_the_widget": 0.23123329994268715, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_widget_drives_a_nonsquare_crop": 0.436430900124833, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_widget_partially_out_of_bounds_is_clamped": 0.4228688000002876, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_all_zero_crop_is_a_noop": 0.010317599982954562, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_crop_preserves_values": 0.008345199865289032, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_out_of_range_end_is_clamped": 0.015844499925151467, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_spatial_and_time_crop": 0.021094299969263375, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_spatial_crop_only_lazy": 0.023930600029416382, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_start_at_zero_is_a_real_crop_not_full": 0.01970379997510463, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_zero_spatial_ranges_keep_full_frame": 0.015921499929390848, + "spyde/tests/migrated/test_crop_action.py::TestCropThroughAction::test_run_adds_a_cropped_node": 0.4377955000381917, + "spyde/tests/migrated/test_crop_action.py::TestCropThroughAction::test_run_keeps_a_lazy_movie_lazy": 0.4523397000739351, + "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_matches_numpy_bit_for_bit[cpu-numba]": 0.7994300998980179, + "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_matches_numpy_bit_for_bit[gpu]": 0.00972659990657121, + "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_torch_matches_numpy_bit_for_bit": 0.37399390002246946, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_a_frame_lands_where_the_arithmetic_says": 0.024309200001880527, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_a_partial_edge_block_is_cropped_not_wrapped": 0.025942299980670214, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_block_ordering[0]": 0.0148661999264732, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_block_ordering[1]": 0.015063200145959854, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_repeated_events_on_one_pixel_add": 0.00796369998715818, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_the_reference_decoder_agrees": 0.0074905999936163425, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad0]": 0.006472600041888654, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad1]": 0.006339799962006509, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad2]": 0.005998399923555553, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad3]": 0.00627170002553612, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-1]": 0.006595399812795222, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-2]": 0.007257799967192113, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-4]": 0.007510400144383311, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[1-3]": 0.0074393999530002475, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[3-4]": 0.0062917000614106655, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_binning_equals_box_summing_the_unbinned[2]": 0.006776700145564973, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_binning_equals_box_summing_the_unbinned[4]": 0.006590600009076297, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_plane_counts_match_the_decoded_frames": 0.005804899847134948, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_ranges_are_additive": 0.006365199922583997, + "spyde/tests/migrated/test_csb_reader.py::TestBackendSelection::test_an_explicit_cpu_backend_is_passed_through": 0.006905500078573823, + "spyde/tests/migrated/test_csb_reader.py::TestBackendSelection::test_torch_without_a_device_falls_back_and_still_integrates": 0.006043200031854212, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_a_partial_edge_block_keeps_its_stride": 0.015015300014056265, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_an_empty_payload_reads_as_zero_events": 0.006165500148199499, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_block_grid_and_padding": 0.00582570000551641, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_fields_come_back_off_the_documented_offsets": 0.005900099873542786, + "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_each_block_is_exactly_one_plane": 0.031856399960815907, + "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_reading_one_plane_does_not_compute_the_others": 0.015107600018382072, + "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_the_exposure_does_not_change_the_block_shape": 0.009057799819856882, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_matching_path_shows_the_action": 0.0009916000999510288, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_raising_lookup_is_refused_not_propagated": 0.0008209999650716782, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_signal_without_original_metadata_is_refused": 0.0007733000675216317, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_no_gate_means_always_visible": 0.0007636999944224954, + "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_apply_registers_and_is_idempotent": 0.000914999982342124, + "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_csb_is_an_openable_extension": 0.0007687999168410897, + "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_spec_matches_the_yaml": 0.0023934999480843544, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_short_file": 0.004489800077863038, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_truncated_block_table": 0.014572900137864053, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_wrong_magic": 0.013695700094103813, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw0]": 0.016075799940153956, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw1]": 0.013440200127661228, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw2]": 0.015382900019176304, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw3]": 0.01350980019196868, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw4]": 0.01366759988013655, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_it_does_not_touch_the_process_tree": 0.0011133999796584249, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_repeated_shutdown_stays_cheap": 0.0019386999774724245, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_shutdown_is_immediate_when_start_was_never_called": 0.0011511999182403088, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_a_live_cluster_still_reaps_even_without_the_thread": 0.5804970000172034, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_a_started_manager_still_reaps": 0.5824472999665886, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_either_handle_alone_is_enough_to_reap[_client]": 0.5758561999537051, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_either_handle_alone_is_enough_to_reap[_cluster]": 0.5762895001098514, + "spyde/tests/migrated/test_dask_stats.py::TestBuildStats::test_shape_and_sums": 0.006169400061480701, + "spyde/tests/migrated/test_dask_stats.py::TestBuildStats::test_tolerates_missing_fields": 0.0012458999408409, + "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_missing_nvidia_smi_disables_permanently": 0.0010160000529140234, + "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_parses_nvidia_smi": 0.0010220000986009836, + "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_transient_failure_keeps_last_reading": 0.0010824999772012234, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_cluster_mem_frac": 0.0007241999264806509, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_lane_cap_shrinks_when_hot": 0.0007226001471281052, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_worker_memory_limit": 0.0009316998766735196, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryTrim::test_auto_trim_runs_on_workers": 0.44998670008499175, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryTrim::test_trim_runs_and_reports_rss": 0.4698974002385512, + "spyde/tests/migrated/test_dask_stats.py::TestNavBlurNoCopy::test_sigma_positive_still_blurs": 0.0034203999675810337, + "spyde/tests/migrated/test_dask_stats.py::TestNavBlurNoCopy::test_sigma_zero_returns_raw_block_no_copy": 0.001879699993878603, + "spyde/tests/migrated/test_dask_stats.py::TestSampler::test_emits_from_fake_client": 0.06570720009040087, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPlan::test_budget_is_75_percent_of_cores": 0.0008277000160887837, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPlan::test_fraction_override_and_clamp": 0.0008555998792871833, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPriority::test_drops_to_below_normal": 0.0007955998880788684, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPriority::test_opt_out": 0.0008341000648215413, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_2d_signal_displays_real_data": 0.17977649997919798, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_2d_signal_opens_one_window": 0.18283499998506159, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_diffraction_pattern_fills_with_real_data": 0.2127434000140056, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_navigator_fills_with_real_data": 0.21338059997651726, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_stem_opens_navigator_and_signal": 0.2027273999992758, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_histogram_emitted": 0.228584099910222, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_metadata_emitted": 0.21760770003311336, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_holds_lock_on_mps": 0.004282899899408221, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_noop_off_mps": 0.005808800109662116, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_released_on_exception": 0.0029168998589739203, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_serialises_two_threads": 0.03161880013067275, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_syncs_before_release": 0.001039499999023974, + "spyde/tests/migrated/test_device_lock.py::TestNeuralPathsTakeLock::test_calibration_locks": 0.0031724999425932765, + "spyde/tests/migrated/test_device_lock.py::TestNeuralPathsTakeLock::test_single_frame_preview_locks": 0.0030288000125437975, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_fit_runs_under_the_lock": 0.004372200113721192, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_no_deadlock_against_concurrent_users": 0.03227169986348599, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_off_mps_is_a_passthrough": 0.0027855999069288373, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_yield_hands_the_device_back": 0.006477500079199672, + "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_find_vectors_torch_reuses_the_shared_lock": 0.0009329000022262335, + "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_lock_is_reentrant": 0.009223600034601986, + "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_mps_forward_lock_is_the_shared_lock": 0.008106700028292835, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_average_dot_product_map_locks": 0.0021677000913769007, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_dictionary_index_locks": 0.007597199990414083, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_fit_batched_locks_every_chunk": 0.2615726001095027, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_remove_background_locks": 0.032099499949254096, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_the_live_single_pattern_match_locks": 0.002956199925392866, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_a_band_that_misses_the_detector_is_dropped": 0.005261299898847938, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_a_wrong_orientation_does_not_land_on_them": 0.020949000143446028, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_every_line_sits_on_a_local_intensity_peak": 0.01824140001554042, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_max_bands_keeps_the_strongest": 0.00543589994776994, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_pixel_convention_is_centre_on_integer": 0.004131100024096668, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_segments_are_the_line_collection_shape": 0.0015833000652492046, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_segments_stay_inside_the_detector": 0.0022486000088974833, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_a_sample_rotation_does_change_the_pattern": 0.004053200129419565, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_crystal_symmetry_leaves_the_pattern_alone": 0.13678800000343472, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_euler_matrix_matches_orix": 0.0013442999916151166, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_normals_to_sample_is_the_transpose": 0.0011661999160423875, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_detector_directions_are_unit_vectors": 0.0014068001182749867, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_detector_y_is_flipped": 0.0010516000911593437, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_reflectors_dataclass_broadcasts_scalars": 0.0007984001422300935, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_wavelength_is_relativistic": 0.0007200000109151006, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_a_structureless_phase_falls_back": 0.021061399951577187, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_brightest_is_a_subset": 0.00288459996227175, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_brightest_none_is_a_no_op": 0.0015044000465422869, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_cubic_set_is_friedel_unique": 0.0027411000337451696, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_from_a_real_phase": 0.4775120000122115, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_widths_and_weights_are_per_reflector": 0.002664599916897714, + "spyde/tests/migrated/test_ebsd_bands.py::TestZoneAxes::test_axes_fall_where_bands_cross": 0.004350799950771034, + "spyde/tests/migrated/test_ebsd_bands.py::TestZoneAxes::test_points_stay_on_the_detector": 0.0031302000861614943, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestAgainstLiveKikuchipy::test_reference_still_matches_kikuchipy": 0.0017799000488594174, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_a_square_detector_is_unaffected_by_the_aspect_ratio": 0.0046079999301582575, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_band_line_pixels_satisfy_the_relation[nonsquare-60x80]": 0.006220199982635677, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_band_line_pixels_satisfy_the_relation[square-60x60]": 0.005122499889694154, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_detector_directions_satisfy_the_relation[shape0-pc0]": 0.0018925999756902456, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_detector_directions_satisfy_the_relation[shape1-pc1]": 0.0020373001461848617, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_zone_axes_satisfy_the_relation[shape0-pc0]": 0.005470800097100437, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_zone_axes_satisfy_the_relation[shape1-pc1]": 0.005719499895349145, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_band_lines_match[nonsquare-60x80]": 0.008615899947471917, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_band_lines_match[square-60x60]": 0.005496299942024052, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_line_directions_match[nonsquare-60x80]": 0.005943999974988401, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_line_directions_match[square-60x60]": 0.009656599955633283, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-both]": 0.006154899834655225, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-x]": 0.006349200033582747, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-y]": 0.006032399833202362, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-transpose]": 0.006229799939319491, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-both]": 0.006279599969275296, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-x]": 0.006078700069338083, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-y]": 0.006338700070045888, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-transpose]": 0.006338699953630567, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_dropping_the_aspect_ratio_would_be_rejected": 0.005802600062452257, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_builds_from_euler_angles": 0.033813900081440806, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_carries_scores_as_a_property": 0.004134100046940148, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_phase_symmetry_comes_from_the_space_group": 0.005968799930997193, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_step_scales_the_coordinates": 0.005322399898432195, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestEndToEnd::test_index_then_colour_recovers_the_grain_structure": 1.1217486000386998, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_is_rgb_shaped_for_the_existing_display": 0.01841820008121431, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_one_orientation_gives_one_colour": 0.022108200122602284, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_shape_and_range": 0.018509500077925622, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_the_two_grains_get_different_colours": 0.018206600099802017, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_mismatched_coverage_is_caught": 0.0009269000729545951, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_picks_the_higher_scoring_phase_per_position": 0.0014748000539839268, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_reshapes_to_the_scan": 0.0008462000405415893, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_a_boundary_shows_as_low_agreement": 0.001061100047081709, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_detects_a_confidently_wrong_position": 0.0010506999678909779, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_partial_overlap_is_between_zero_and_one": 0.0009971001418307424, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_rejects_a_mismatched_shape": 0.0010019000619649887, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_requires_a_nav_shape": 0.0008236001012846828, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_uniform_indexing_scores_one": 0.0012381999986246228, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_works_on_a_real_indexing_result": 0.6924272999167442, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_every_similarity_matches": 0.0022276999661698937, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_mps_matches_the_reference_too": 0.0005163000896573067, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_the_same_pattern_wins": 0.0015197000466287136, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_the_winning_score_matches": 0.0015521999448537827, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_tiling_does_not_move_us_off_the_reference": 0.0016465999651700258, + "spyde/tests/migrated/test_ebsd_indexing.py::TestNormalisation::test_invariant_to_gain_and_offset": 0.0342546000611037, + "spyde/tests/migrated/test_ebsd_indexing.py::TestNormalisation::test_survives_a_detector_background": 0.06469889997970313, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_a_finer_dictionary_matches_better": 14.803757399902679, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_background_removal_is_what_makes_scores_near_one": 0.03688290005084127, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_exact_dictionary_recovers_every_orientation": 0.08925499999895692, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_grain_two_indexes_consistently": 1.553974400041625, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_the_two_grains_index_differently": 1.6569661002140492, + "spyde/tests/migrated/test_ebsd_indexing.py::TestSampleOrientations::test_covers_the_cubic_fundamental_zone": 0.0009728999575600028, + "spyde/tests/migrated/test_ebsd_indexing.py::TestSampleOrientations::test_finer_step_gives_a_bigger_dictionary": 0.0009643998928368092, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_accepts_flattened_or_image_shaped_patterns": 0.03334970003925264, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_mismatched_detector_size_is_caught": 0.010776599985547364, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_orientations_reshape_to_the_scan": 0.5529569002101198, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_progress_reports_completion": 0.033861099975183606, + "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_keep_larger_than_the_dictionary_is_clamped": 0.004474599962122738, + "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_scores_are_sorted_best_first": 0.6085278001846746, + "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_tiled_equals_untiled": 0.9738501999527216, + "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_top_k_survives_tiling": 0.9002104001119733, + "spyde/tests/migrated/test_ebsd_refine.py::TestBandSimulator::test_is_differentiable_wrt_orientation": 0.005797699908725917, + "spyde/tests/migrated/test_ebsd_refine.py::TestBandSimulator::test_matches_the_numpy_generator": 0.0046159999910742044, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_chunked_matches_unchunked": 0.7798252999782562, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_each_pattern_gets_its_own_orientation": 0.5310014999704435, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_result_maps_back_to_the_scan": 0.04416329995729029, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_shape_mismatch_is_caught": 0.0016967998817563057, + "spyde/tests/migrated/test_ebsd_refine.py::TestCallbacks::test_a_failing_callback_does_not_kill_the_refine": 0.0825092998566106, + "spyde/tests/migrated/test_ebsd_refine.py::TestCallbacks::test_yield_is_called_inside_the_step_loop": 0.17299840005580336, + "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_is_differentiable": 0.01584170013666153, + "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_matches_the_numpy_reference": 0.005256499978713691, + "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_produces_proper_rotations": 0.008607299998402596, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_beats_a_coarse_dictionary": 1.4585566001478583, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_never_returns_a_worse_orientation": 0.13300739997066557, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_recovers_a_perturbed_orientation": 4.426738000009209, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_reports_the_score_it_started_from": 0.26682850008364767, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_a_different_position_gives_different_bands": 1.229621300008148, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_draws_line_segments_for_the_matched_orientation": 1.192475900053978, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_hiding_clears_both_marker_groups": 1.1645681000081822, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_streams_the_match_to_the_caret": 1.2474584998562932, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_adopts_the_projection_centre_the_data_records": 1.1881843000883237, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_announces_itself_to_the_caret": 1.1780465000774711, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_builds_a_wizard_with_a_resident_dictionary": 1.8444797999691218, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_no_background_means_no_simulated_filter": 1.193687100079842, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_rebuilding_replaces_the_previous_wizard": 1.463646600022912, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_static_only_does_not_filter_the_dictionary": 1.225205700029619, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_the_dictionary_is_filtered_like_the_data": 1.234738199855201, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_eager_data_still_gets_a_bounded_chunking": 9.37379390001297, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_indexing_is_one_lazy_graph_over_the_chunks": 0.046650299918837845, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_indexing_reads_the_scan_chunk_by_chunk": 1.6016813999740407, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_patterns_split_across_chunks_are_merged": 0.04640270001254976, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_adp_map_is_seamless_across_chunks": 0.976050799828954, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_lazy_signals_own_chunking_is_left_alone": 0.041308999876491725, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_static_reference_is_streamed_too": 1.320837400155142, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_band_count_and_zone_axes_apply_live": 1.210718399961479, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_is_a_no_op_before_the_dictionary_exists": 0.9018372000427917, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_moving_the_projection_centre_moves_the_lines": 1.1950769000686705, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_indexes_the_scan_into_an_ipf_window": 1.5067712999880314, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_refuses_before_the_dictionary_is_built": 0.9377203999320045, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_the_ipf_map_shows_the_two_grains": 1.4428976001217961, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_every_stage_resolves": 0.0006607001414522529, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_overlay_toggle_reaches_the_wizard": 1.1945803997805342, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_schema_is_registered_and_matches_the_defaults": 0.000695900060236454, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_toolbar_entry_is_gated_on_the_ebsd_signal_type": 0.0006571999983862042, + "spyde/tests/migrated/test_event_handler_bound_method.py::test_bound_method_raises_on_faithful_widget": 0.002580000087618828, + "spyde/tests/migrated/test_event_handler_bound_method.py::test_event_handler_fn_makes_bound_method_registerable": 0.0019729998894035816, + "spyde/tests/migrated/test_event_handler_bound_method.py::test_wrapper_preserves_name": 0.0016320000868290663, + "spyde/tests/migrated/test_example_catalogue.py::TestBuildingItIsCheap::test_data_dir_is_reported_even_when_nothing_is_downloaded": 0.0007761998567730188, + "spyde/tests/migrated/test_example_catalogue.py::TestBuildingItIsCheap::test_the_catalogue_never_opens_a_data_file": 0.0033318999921903014, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_downloaded_reflects_the_file_on_disk": 0.0037418000865727663, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_every_entry_has_what_the_menu_draws": 0.003299900097772479, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_lists_datasets_grouped_by_technique": 0.011254100012592971, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_resolve_round_trips_a_key": 0.003197800018824637, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_base_class_is_not_a_dataset": 0.0009065999183803797, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_camera_is_carried_through": 0.003235599957406521, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_modalities_spyde_is_built_around_come_first": 0.0051331998547539115, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_an_undownloaded_dataset_without_a_declared_shape_shows_none": 0.0008072999771684408, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_declared_shape_wins_over_reading_the_file": 0.0009165999945253134, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_record_shape_stamps_what_a_load_already_knows": 0.010452000075019896, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_shape_of_signal_is_nav_then_signal": 0.003412799909710884, + "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_cancel_raises": 0.0008950001792982221, + "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_done_clamped_to_total": 0.0008636998245492578, + "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_pooch_protocol_sequence": 0.004872200079262257, + "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_cancel_flow": 0.0009494000114500523, + "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_done_emitted_only_when_started": 0.0009169999975711107, + "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_the_monitor_is_a_pooch_progressbar": 0.0015758000081405044, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_disk_mean_handles_frame_edges": 0.001309799961745739, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_disk_mean_more_stable_than_point_sample": 0.06308759981766343, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_find_vectors_stores_disk_mean_intensity": 0.005474900011904538, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_gpu_pack_ghost_to_core_frame_index": 0.0016774999676272273, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_radius_below_one_falls_back_to_point": 0.0014491999754682183, + "spyde/tests/migrated/test_find_vectors.py::test_at_correct_row_count": 0.0011794000165537, + "spyde/tests/migrated/test_find_vectors.py::test_auto_params_valid_ranges": 0.03248389984946698, + "spyde/tests/migrated/test_find_vectors.py::test_count_map_shape_and_values": 0.001132899895310402, + "spyde/tests/migrated/test_find_vectors.py::test_detects_known_peaks": 0.004819200141355395, + "spyde/tests/migrated/test_find_vectors.py::test_disk_kernel_cached": 0.0009027000050991774, + "spyde/tests/migrated/test_find_vectors.py::test_flatten_full_buffer": 0.0010731000220403075, + "spyde/tests/migrated/test_find_vectors.py::test_from_ragged_roundtrip": 0.0014015000779181719, + "spyde/tests/migrated/test_find_vectors.py::test_kxy_at_correct_columns": 0.0011020000092685223, + "spyde/tests/migrated/test_find_vectors.py::test_map_blocks_wrong_at_chunk_boundary": 0.019354499992914498, + "spyde/tests/migrated/test_find_vectors.py::test_map_overlap_correct_at_chunk_boundary": 0.05217230005655438, + "spyde/tests/migrated/test_find_vectors.py::test_min_distance_prevents_duplicates": 0.007418300025165081, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_cold_fallback": 0.016015399945899844, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_edge_accuracy": 0.025526899960823357, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_invalidate_clears": 0.0008611001539975405, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_stale_guard": 0.006653399905189872, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_warm_hit": 0.0075795999728143215, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_warm_speed": 1.389591999934055, + "spyde/tests/migrated/test_find_vectors.py::test_nav_chunk_size_larger_than_depth": 0.0007240000413730741, + "spyde/tests/migrated/test_find_vectors.py::test_nav_chunk_size_within_memory_limit": 0.0007917000912129879, + "spyde/tests/migrated/test_find_vectors.py::test_output_shapes": 0.0023194998502731323, + "spyde/tests/migrated/test_find_vectors.py::test_sigma_tuple_4d": 0.006447399966418743, + "spyde/tests/migrated/test_find_vectors.py::test_sigma_tuple_5d": 0.006426700041629374, + "spyde/tests/migrated/test_find_vectors.py::test_single_frame_pipeline_under_20ms": 0.09987879998516291, + "spyde/tests/migrated/test_find_vectors.py::test_spots_at_returns_list": 0.00128030008636415, + "spyde/tests/migrated/test_find_vectors.py::test_subpixel_refinement_produces_fractional_coords": 0.003813600051216781, + "spyde/tests/migrated/test_find_vectors.py::test_threshold_controls_count": 0.006134500028565526, + "spyde/tests/migrated/test_find_vectors.py::test_to_dense_shape_and_cache": 0.0011765999952331185, + "spyde/tests/migrated/test_find_vectors.py::test_to_pyxem_type": 0.004579099942930043, + "spyde/tests/migrated/test_find_vectors.py::test_zero_frame_no_peaks": 0.0016149000730365515, + "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_auto_from_signal_samples_sparsely": 0.021863700007088482, + "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_detect_beamstop_lollipop": 0.002602500026114285, + "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_detect_beamstop_none_when_featureless": 0.00201370008289814, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDispatcher::test_dog_route": 0.0027298000641167164, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDispatcher::test_nxcorr_route_still_works": 0.004466200014576316, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_beamstop_auto_memory_safe": 0.14798610005527735, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_lazy_batch_memory_safe": 0.12381579994689673, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_numpy_batch": 0.1644525999436155, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_beamstop_excludes_and_no_rim_peak": 0.0021982999751344323, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_finds_all_spots": 0.0031622000969946384, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_intensity_column_is_raw": 0.0028924000216647983, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_subpixel_shifts_off_integer": 0.0021934998221695423, + "spyde/tests/migrated/test_find_vectors_memory.py::test_5d_nav_shape": 0.17451469984371215, + "spyde/tests/migrated/test_find_vectors_memory.py::test_all_positions_present_in_offsets": 0.04530750005505979, + "spyde/tests/migrated/test_find_vectors_memory.py::test_at_returns_correct_slice_lengths": 0.05090529995504767, + "spyde/tests/migrated/test_find_vectors_memory.py::test_at_row_columns_match_full_flat_buffer": 0.04889550001826137, + "spyde/tests/migrated/test_find_vectors_memory.py::test_chunk_boundary_result_equals_single_chunk": 0.11633890005759895, + "spyde/tests/migrated/test_find_vectors_memory.py::test_count_map_dtype_is_int32": 0.04794330010190606, + "spyde/tests/migrated/test_find_vectors_memory.py::test_count_map_sums_to_flat_buffer_len": 0.05066920001991093, + "spyde/tests/migrated/test_find_vectors_memory.py::test_dask_path_never_computes_full_array": 2.143751399940811, + "spyde/tests/migrated/test_find_vectors_memory.py::test_dask_path_produces_correct_nav_shape": 0.1904871000442654, + "spyde/tests/migrated/test_find_vectors_memory.py::test_flat_buffer_columns_in_calibrated_range": 0.04605280014220625, + "spyde/tests/migrated/test_find_vectors_memory.py::test_flat_buffer_dtype_is_float32": 0.03255959996022284, + "spyde/tests/migrated/test_find_vectors_memory.py::test_high_threshold_gives_fewer_vectors": 0.06573610007762909, + "spyde/tests/migrated/test_find_vectors_memory.py::test_intensity_column_is_raw_frame_intensity": 0.04656479984987527, + "spyde/tests/migrated/test_find_vectors_memory.py::test_large_nav_does_not_compute_full_array": 1.7907855999656022, + "spyde/tests/migrated/test_find_vectors_memory.py::test_live_count_chunk_writes_global_location": 0.02099580003414303, + "spyde/tests/migrated/test_find_vectors_memory.py::test_nav_coords_in_range": 0.061485399841330945, + "spyde/tests/migrated/test_find_vectors_memory.py::test_no_full_compute_via_tracemalloc": 1.4765213000355288, + "spyde/tests/migrated/test_find_vectors_memory.py::test_non_square_nav": 0.05507710005622357, + "spyde/tests/migrated/test_find_vectors_memory.py::test_numpy_path_allowed_to_hold_full_array": 0.061281500034965575, + "spyde/tests/migrated/test_find_vectors_memory.py::test_offsets_dtype_is_int64": 0.043623499921523035, + "spyde/tests/migrated/test_find_vectors_memory.py::test_offsets_monotonically_non_decreasing": 0.045493700075894594, + "spyde/tests/migrated/test_find_vectors_memory.py::test_on_chunk_done_called_covering_full_nav": 0.10952109994832426, + "spyde/tests/migrated/test_find_vectors_memory.py::test_on_chunk_done_count_subarray_matches_final": 0.08579889999236912, + "spyde/tests/migrated/test_find_vectors_memory.py::test_reproducible_with_same_params": 0.19447450013831258, + "spyde/tests/migrated/test_find_vectors_memory.py::test_result_offsets_never_exceed_buffer_length": 0.10023500001989305, + "spyde/tests/migrated/test_find_vectors_memory.py::test_single_nav_position": 0.02176149992737919, + "spyde/tests/migrated/test_find_vectors_memory.py::test_stopped_flag_returns_none": 0.01935269997920841, + "spyde/tests/migrated/test_find_vectors_memory.py::test_zero_signal_produces_no_vectors": 0.05262110009789467, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_chunk_passes_persistence": 0.0009193000150844455, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_coerce_carries_bg_sigma": 0.0007101999362930655, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_coerce_neural_no_nav_blur_and_spot_radius": 0.0007209999021142721, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_dask_spawn_method_pinned": 0.003161399974487722, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_default_device_chain": 0.0008860999951139092, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_detect_batch_runtimeerror_cpu_retry": 0.010057999868877232, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_emit_calibration_wiring": 0.005278500146232545, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_fv_refresh_models_emits": 0.000900499988347292, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_gpu_conc_one_on_mac_serializes": 0.0009508001385256648, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_gpu_policy_modes": 0.0011006999993696809, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_lane_split_default_mode": 0.0010355999693274498, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_allowed_platform_gate": 0.00102980004157871, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_cpu_escape_hatch_on_mac": 0.0010658000828698277, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_uses_mps_by_default_on_mac": 0.001016200054436922, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_fallback_env_set_on_darwin": 0.003557700081728399, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_neural_enabled_gate": 0.0010710001224651933, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_neural_lane_pins_single_worker": 0.0009144999785348773, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_block_respects_gpu_off": 0.001026200014166534, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_default_and_models_payload": 0.002931899973191321, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_gpu_demote_flag": 0.0022979999193921685, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_run_cpu": 1.8434476999100298, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_preview_dispatch_passes_bg_sigma": 0.0008625000482425094, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_spot_size_drives_model_scale": 0.0008939000545069575, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_worker_death_detected": 0.001174700097180903, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_worker_plugin_sets_mac_env": 0.0010582000249996781, + "spyde/tests/migrated/test_find_vectors_no_numba.py::TestFindVectorsNoNumba::test_package_imports_without_numba": 6.331767899915576, + "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_find_vectors_creates_attached_vectors_tree": 1.2767209999728948, + "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_rejects_non_4d_dataset": 0.655044199898839, + "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_result_window_renders_vectors_and_overlays": 1.3286564000882208, + "spyde/tests/migrated/test_find_vectors_refine_seam.py::TestRefineIsChunkInvariant::test_no_stripe_at_the_boundary_columns": 0.4258961998857558, + "spyde/tests/migrated/test_find_vectors_refine_seam.py::TestRefineIsChunkInvariant::test_the_count_map_does_not_change_with_the_nav_chunking": 1.1673612999729812, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_intensity_tracks_raw_disk_amplitude": 0.00567030010279268, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_subpixel_beats_integer": 0.007896400056779385, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_subpixel_is_applied_and_subpixel": 0.007837100070901215, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelUnbiased::test_integer_peak_matches_skimage": 0.008284600102342665, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelUnbiased::test_subpixel_unbiased_on_gaussian": 0.00872540008276701, + "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_finds_all_disks_batched": 0.036411400069482625, + "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_quadratic_fit_recovers_subpixel_centers": 0.042451699962839484, + "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_subpixel_off_returns_integer_peaks": 0.005841000005602837, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestFindVectorsWizard::test_preview_tune_run": 1.4418900999007747, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestFindVectorsWizard::test_stop_removes_preview": 0.5765091999201104, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_mask_overlay_pushed_to_plot": 0.0018587998347356915, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_nxcorr_transform_clim_ceiling_is_fixed": 0.002265600021928549, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_set_params_beamstop_auto_toggles_mask": 0.03462399996351451, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_show_transform_compute_and_render": 0.007784500019624829, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_dispatch_mark_tutorial_seen_routes": 0.007608399959281087, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_first_run_true_by_default": 0.008357600076124072, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_mark_tutorial_seen_idempotent": 0.007921800017356873, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_mark_tutorial_seen_persists": 0.019870699965395033, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_restores_persisted_flag_on_restart": 0.024519799975678325, + "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_emits_first_run_result_false_after_marking": 0.019113200018182397, + "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_emits_first_run_result_true": 0.007190800039097667, + "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_staged_handler_registered": 0.0007007000967860222, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_a_transposed_position_is_a_different_position": 0.08749590010847896, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_a_wrong_width_vector_is_refused": 0.06651429983321577, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_an_out_of_range_position_is_refused": 0.06313049991149455, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_the_key_matches_how_the_display_reads_the_data": 0.0732524999184534, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_an_unfitted_position_reads_nothing": 0.07328170002438128, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_clear_forgets_everything": 0.06983190006576478, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_coverage_counts_positions": 0.07008180010598153, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_fitted_to_zero_is_not_the_same_as_unfitted": 0.07253880007192492, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_a_spec_hyperspy_cannot_build_still_gets_a_store": 0.013365200022235513, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_it_is_a_real_hyperspy_model": 0.08301880001090467, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_the_parameter_order_is_the_engines_column_order": 0.0719856999348849, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_the_values_reach_the_parameter_maps_on_save": 0.11356890003662556, + "spyde/tests/migrated/test_fit_store.py::TestMaps::test_a_fitted_position_becomes_finite": 0.06183059990871698, + "spyde/tests/migrated/test_fit_store.py::TestMaps::test_every_map_starts_empty": 0.06270909996237606, + "spyde/tests/migrated/test_fit_store.py::TestMaps::test_the_area_map_tracks_the_amplitude": 0.06330760009586811, + "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_a_stored_model_survives_a_save_and_reload": 0.30645340017508715, + "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_an_unfitted_position_stays_unfitted_across_the_round_trip": 0.2751016999827698, + "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_the_names_are_listed": 0.07067260006442666, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_a_wrong_width_scan_is_refused": 0.07533399993553758, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_put_all_fills_every_position": 0.07990359992254525, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_put_all_lands_where_the_display_looks": 0.06616199994459748, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_values_array_round_trips": 0.08006540010683239, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_poor_position_is_remembered_and_flagged": 0.12061300000641495, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_run_records_every_converged_position": 0.12545219995081425, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_run_reports_its_coverage": 0.12423529999796301, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_navigating_after_a_run_recalls_instead_of_refitting": 0.11819750000722706, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_refitting_a_position_clears_its_poor_flag": 0.13134350010659546, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_the_store_is_indexed_like_the_display": 0.12081849994137883, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_adaptive_off_leaves_the_model_alone": 0.1196353998966515, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_adaptive_on_fits_an_unvisited_position": 0.14379470003768802, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_every_navigation_path_answers": 0.12402240000665188, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_navigating_recalls_before_it_refits": 0.1248757999856025, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_navigating_with_no_model_does_nothing": 0.0732465999899432, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_a_background_gets_widgets_on_the_plot": 0.11909169994760305, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_a_nonsense_drag_leaves_the_model_alone": 0.10781220009084791, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_anchors_follow_a_parameter_edit": 0.12341200013179332, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Exponential]": 0.11819309997372329, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Offset]": 0.11958929989486933, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Polynomial]": 0.13235689990688115, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[PowerLaw]": 0.12580240005627275, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_the_anchor_you_are_not_holding_stays_put[Exponential]": 0.11054410017095506, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_the_anchor_you_are_not_holding_stays_put[PowerLaw]": 0.11445999995339662, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_background_is_not_seeded_onto_a_peak": 0.0012023999588564038, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_peak_is_not_treated_as_a_background": 0.0008728000102564692, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_power_law_keeps_hyperspys_origin_when_it_can": 0.0011771999998018146, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Exponential]": 0.001618600101210177, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Offset]": 0.0013902001082897186, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Polynomial]": 0.001730700139887631, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[PowerLaw]": 0.001961899921298027, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_adding_a_background_puts_its_handles_on_the_curve": 0.8935482999077067, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_flat_data_cannot_fix_an_exponential": 0.0011319998884573579, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_a_bad_edit_does_not_kill_the_wizard": 0.15627260005567223, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_add_component_appears_in_the_state": 0.14566799998283386, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_components_are_seeded_onto_the_current_axis": 0.14985069981776178, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_remove_component": 0.18170670000836253, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_set_param_can_fix_a_parameter": 0.179011799977161, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_set_param_updates_the_model": 0.14644789998419583, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_two_of_a_kind_get_distinct_names": 0.2931461001280695, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_unknown_component_is_reported_not_added": 0.07567829999607056, + "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_every_offered_component_previews": 0.00397939991671592, + "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_peak_shapes_are_actually_peaks": 0.000862100045196712, + "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_previews_are_normalised_and_finite": 0.0008816999616101384, + "spyde/tests/migrated/test_fit_wizard.py::TestCommit::test_commit_makes_one_tree_with_a_view_per_component": 0.30420240003149956, + "spyde/tests/migrated/test_fit_wizard.py::TestCommit::test_commit_without_a_fit_is_refused": 0.17029339994769543, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentAreaMaps::test_area_tracks_the_amplitude": 0.2542978998972103, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentAreaMaps::test_one_map_per_component_shaped_to_the_scan": 0.14334539999254048, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_a_dead_component_reads_as_dead": 0.2833144998876378, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_share_is_relative_peak_height": 0.2630970999598503, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_the_state_carries_it": 0.1543406001292169, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_drag_event_carries_the_widget_on_event_source": 0.16737149993423373, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_gaussians_amplitude_is_an_area_not_a_height": 0.0007071000291034579, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_height_parameterised_component_is_left_alone": 0.0006806000601500273, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_reentrant_drag_is_guarded": 0.1570277001010254, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_an_unknown_component_is_ignored": 0.150358899962157, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_dragging_invalidates_a_previous_fit": 0.14508419996127486, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_every_drag_target_names_real_parameters": 0.10299249994568527, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_every_offered_component_has_handles": 0.002839800203219056, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_height_and_amplitude_round_trip": 0.0007866999367251992, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_width_drag_keeps_the_peak_height": 0.17035350005608052, + "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_a_live_move_does_not_emit_state": 0.15020550007466227, + "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_a_live_move_still_updates_the_model": 0.14710659987758845, + "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_the_release_emits_state": 0.1655559999635443, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_does_not_produce_a_scan_result": 0.13204399985261261, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_fits_only_the_displayed_spectrum": 0.26163540000561625, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_refuses_with_no_components": 0.07903999998234212, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_reports_whether_it_converged": 0.1675102998269722, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_writes_the_result_back_into_the_model": 0.1479156999848783, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_does_not_silently_use_the_navigation_mean": 0.07609509991016239, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_fit_current_matches_the_displayed_pixel": 0.24758959980681539, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_ignores_a_stale_shape": 0.07262490002904087, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_uses_the_painted_spectrum": 0.07434099982492626, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_a_live_drag_still_does_not_re_send_the_model": 0.14749160001520067, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_a_real_drag_still_discards_it": 0.14550350001081824, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_moving_the_handles_does_not_discard_the_fit": 0.14816089998930693, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_handle_being_dragged_is_not_written_back": 0.14563240006100386, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_point_tracks_a_live_width_drag": 0.15979950013570487, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_range_band_tracks_a_live_point_drag": 0.13705090014263988, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_close_tears_the_wizard_down": 0.0870150001719594, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_close_without_open_does_not_raise": 0.048432999989017844, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_double_fire_leaves_exactly_one_controller": 0.09425350010860711, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_open_creates_a_wizard_and_sends_state": 0.269784800009802, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_open_sends_the_component_palette": 0.41634049999993294, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_reopen_without_close_is_idempotent": 0.0812076999573037, + "spyde/tests/migrated/test_fit_wizard.py::TestParameterEditsMoveTheHandles::test_a_parameter_edit_does_not_rebuild_the_handles": 0.1530437001492828, + "spyde/tests/migrated/test_fit_wizard.py::TestParameterEditsMoveTheHandles::test_editing_a_parameter_moves_its_handle": 0.14301400003023446, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_a_real_session_exposes_a_position": 0.07536000001709908, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_a_wrong_length_vector_is_refused": 0.13191469991579652, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_an_unvisited_position_recalls_nothing": 0.11940839991439134, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_changing_the_model_clears_the_store": 0.21215749986004084, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_no_selector_means_no_position": 0.0812847000779584, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_reads_the_position_from_the_selector": 0.07178500003647059, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_remembers_and_recalls_per_position": 0.12087230000179261, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_the_store_survives_close_and_reopen": 0.1650439000222832, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_reopening_reports_the_restored_model": 0.18319290003273636, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_fit_survives_close_and_reopen": 0.19894499995280057, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_model_lives_on_the_tree_not_the_controller": 0.14647889998741448, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_model_survives_close_and_reopen": 0.2024009000742808, + "spyde/tests/migrated/test_fit_wizard.py::TestRun::test_run_fits_every_position": 0.23301190009806305, + "spyde/tests/migrated/test_fit_wizard.py::TestRun::test_run_without_components_is_refused": 0.10697399999480695, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_a_polynomial_keeps_its_order": 0.01861680008005351, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_each_caller_gets_its_own_spec": 0.0009059000294655561, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_background_wizard_shares_the_cache": 0.22467430005781353, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_catalogue_is_cached_per_axis": 0.0044188001193106174, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_prototype_is_shared": 0.0007667000172659755, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_a_fitted_position_fills_one_pixel": 0.16125290002673864, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_closing_the_caret_closes_the_maps_window": 0.13846950011793524, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_committed_tree_is_NOT_closed_with_the_caret": 0.1929463999113068, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_maps_exist_before_anything_is_fitted": 0.13900410011410713, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_maps_include_chi_squared": 0.14422919997014105, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_store_survives_the_caret": 0.12312280002515763, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_there_is_ONE_maps_window_refreshed_in_place": 0.14881590008735657, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_there_is_one_map_per_component": 0.24926150019746274, + "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_every_staged_handler_is_registered": 0.000703799887560308, + "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_fit_is_offered_on_1d_plots_only": 0.0007319001015275717, + "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_the_parameter_schema_resolves": 0.0006933001568540931, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_background_is_not_bounded_to_the_axis": 0.0013266999740153551, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_co_centred_pair_is_still_recovered": 0.16160579991992563, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_peak_cannot_wander_off_the_data": 0.0008921001572161913, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_separated_peaks_are_actually_recovered": 0.08611109992489219, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_the_pair_still_straddles_the_seed": 0.24126670008990914, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_two_of_a_kind_do_not_share_a_centre": 0.24044150009285659, + "spyde/tests/migrated/test_fitting_2d.py::TestBatching::test_each_row_gets_its_own_surface": 0.001886300160549581, + "spyde/tests/migrated/test_fitting_2d.py::TestBatching::test_non_square_images_are_not_transposed": 0.0010642001871019602, + "spyde/tests/migrated/test_fitting_2d.py::TestCoordinates::test_matches_a_ravelled_mgrid": 0.001209000125527382, + "spyde/tests/migrated/test_fitting_2d.py::TestCoordinates::test_shape_and_ordering": 0.0009275000775232911, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_a_fixed_parameter_stays_fixed_in_2d": 0.09084059996530414, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_bounds_apply_in_2d_too": 0.23184080002829432, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_fits_many_images_at_once": 0.28878810012247413, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_recovers_the_generating_parameters": 0.0913444000761956, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_analytic_gradient_matches_autodiff": 0.17220810009166598, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_linear_flag_matches_hyperspy": 0.06637460005003959, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_parameter_order_matches_hyperspy": 0.34480249986518174, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_values_match_hyperspy": 0.07193610002286732, + "spyde/tests/migrated/test_fitting_2d.py::TestRoundTrip::test_gaussian2d_round_trips_through_modelspec": 0.18230010010302067, + "spyde/tests/migrated/test_fitting_2d.py::TestRoundTrip::test_the_engine_reports_2d_support": 0.0007472999859601259, + "spyde/tests/migrated/test_fitting_engine.py::TestChunking::test_chunked_and_unchunked_agree": 0.2885176999261603, + "spyde/tests/migrated/test_fitting_engine.py::TestChunking::test_result_shape_follows_the_navigation_grid": 0.1037771999835968, + "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_cpu_is_always_usable": 0.09644510003272444, + "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_default_device_is_reported": 0.001701400033198297, + "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_env_var_forces_the_device": 0.0020135000813752413, + "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_all_parameters_fixed_is_a_clear_error": 0.048973599914461374, + "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_bounds_are_respected": 0.11355570005252957, + "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_fixed_parameter_is_not_moved": 0.0803858001017943, + "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_clean_data_converges_in_float32": 0.10984219994861633, + "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_float32_matches_multifit": 0.3456738000968471, + "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_float32_stops_early_instead_of_burning_the_budget": 0.12475320009980351, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_a_failing_progress_callback_does_not_kill_the_fit": 0.07964889996219426, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_axis_length_mismatch_is_caught": 0.051111600012518466, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_progress_callback_reports_completion": 0.16264459991361946, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_unsupported_component_refuses_rather_than_dropping_it": 0.005342399934306741, + "spyde/tests/migrated/test_fitting_engine.py::TestInitialValues::test_per_position_seeds_are_used": 0.0927580000134185, + "spyde/tests/migrated/test_fitting_engine.py::TestInitialValues::test_seeds_outside_bounds_are_clipped_not_rejected": 0.22595590015407652, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_float64_request_is_downcast_not_an_error": 0.00042399996891617775, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_agrees_with_cpu_float32": 0.00045789999421685934, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_converges": 0.00042890000622719526, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_matches_multifit": 0.0004295001272112131, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_every_position_converges_on_clean_data": 0.09400769986677915, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_parameters_match_hyperspy_multifit": 1.1731033000396565, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_power_law_background_matches_multifit": 0.1429950000019744, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_recovers_the_truth_it_was_built_from": 0.12380809977184981, + "spyde/tests/migrated/test_fitting_engine.py::TestSignalRange::test_mask_length_mismatch_is_caught": 0.040534600033424795, + "spyde/tests/migrated/test_fitting_engine.py::TestSignalRange::test_masked_channels_do_not_influence_the_fit": 0.2111975000007078, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_a_coarser_request_is_honoured": 0.0007542000385001302, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_float32_tolerances_are_raised_above_epsilon": 0.0007339001167565584, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_float64_tolerances_are_left_alone": 0.0007470999844372272, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_mps_downcasts_float64": 0.0007014999864622951, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_other_devices_keep_the_dtype": 0.0007036000024527311, + "spyde/tests/migrated/test_fitting_engine.py::TestWeights::test_poisson_weighting_runs_and_stays_sane": 0.10159310000017285, + "spyde/tests/migrated/test_fitting_engine.py::TestWeights::test_unknown_weighting_is_rejected": 0.0394983000587672, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_a_coarse_sample_seeds_itself": 0.002319999970495701, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_always_includes_the_last_index": 0.0023460000520572066, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_each_position_maps_to_its_nearest_coarse_sample": 0.0020717999432235956, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_samples_the_strided_grid": 0.001500600134022534, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_coarse_pass_gets_a_larger_iteration_budget": 0.15067610004916787, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_converged_coarse_fits_are_propagated": 0.11790189996827394, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_failed_coarse_fits_are_not_propagated": 0.17972990009002388, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_matches_a_cold_fit_on_easy_data": 0.2773183999815956, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_oversized_stride_falls_back_instead_of_wasting_a_pass": 0.09093180019408464, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_plain_fit_reports_no_seeding": 0.11911139998119324, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_recovers_the_truth": 0.15855910012032837, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_reports_how_many_seeds_were_usable": 0.16645949997473508, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_stride_one_degenerates_to_a_plain_fit": 0.09423309983685613, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeedingHelpsWhereColdStartsStruggle::test_improves_convergence_on_a_hard_starting_point": 0.3375388999702409, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_detail_region_upsample": 0.12671500002034009, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_geometry_matches_source": 0.021554300095885992, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_is_tile_backend": 0.011413999949581921, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_mean_matches_numpy": 0.24677900003734976, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_set_array_swaps_source": 0.024965700111351907, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_subsample_matches_numpy": 0.0747851999476552, + "spyde/tests/migrated/test_gpu_tile_backend.py::test_gpu_mean_correct_in_subprocess": 5.014744899934158, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_keeps_the_threshold_marker": 0.2133347998606041, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_reset_moves_the_handles_not_the_bins": 0.19749659998342395, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_reset_spans_the_full_range": 0.21710640017408878, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_restores_robust_levels_after_a_manual_drag": 0.22922830004245043, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_unknown_window_is_a_no_op": 0.23250729998108, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_bulk_is_resolved_across_many_bins": 0.0034058999735862017, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_clipping_never_drops_samples": 0.003041899879463017, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_flat_frame_falls_back_to_full_extent": 0.0007308999774977565, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_tail_does_not_own_the_axis": 0.0034217999782413244, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_the_handles_land_inside_the_drawn_range": 0.0027736000483855605, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_uniform_data_is_not_clipped": 0.001562400022521615, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistogramMessage::test_carries_the_full_extent": 0.20946749998256564, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_hex_net": 0.0019918999169021845, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_noisy_net_still_fits": 0.0017248999793082476, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_random_points_reject": 0.0011849998263642192, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_square_net": 0.004164100042544305, + "spyde/tests/migrated/test_index_and_calibrate.py::TestCentering::test_friedel_center_recovered": 0.1650081998668611, + "spyde/tests/migrated/test_index_and_calibrate.py::TestEndToEnd::test_manual_calibration_from_dspacing": 0.1651805000146851, + "spyde/tests/migrated/test_index_and_calibrate.py::TestEndToEnd::test_pipeline_runs_and_flags_consistency": 0.21364540001377463, + "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_anatase_first_reflection": 0.0017061999533325434, + "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_cubic_d_spacing": 0.0017084998544305563, + "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_d_list_descending_unique": 0.002839699969626963, + "spyde/tests/migrated/test_index_and_calibrate.py::TestRatioMatch::test_exact_recovery": 0.005067900056019425, + "spyde/tests/migrated/test_index_and_calibrate.py::TestRatioMatch::test_match_phase_ranks_correct": 0.01964320009574294, + "spyde/tests/migrated/test_insitu_signal_type.py::TestInSituSignalType::test_eager_round_trip": 0.00410389993339777, + "spyde/tests/migrated/test_insitu_signal_type.py::TestInSituSignalType::test_lazy_round_trip": 0.007980600115843117, + "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_4d_stem_navigator_excludes_playback_buttons": 0.2087596000637859, + "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_movie_navigator_includes_playback_buttons": 1.1351757999509573, + "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_plain_1d_nav_signal_excludes_playback_buttons": 0.560403999988921, + "spyde/tests/migrated/test_insitu_signal_type.py::TestTestHarnessMovieLoaderTypesInSitu::test_movie_root_is_insitu": 0.5634721999522299, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_continuous_pokes_are_capped_by_max_wait": 0.305138599826023, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_fill_resumes_after_scrub_settles": 0.15442629996687174, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_stop_aborts_the_wait_immediately": 0.00181639997754246, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_wait_blocks_after_a_poke": 0.20490889996290207, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_wait_returns_fast_when_idle": 0.0018713000463321805, + "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_blank_and_non_json_lines_skipped": 0.0037076001754030585, + "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_text_stdin_without_buffer_still_works": 0.003439399995841086, + "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_utf8_non_ascii_labels_decode_intact": 0.007060399861074984, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_attach_ipf_key_registers_one_key_on_the_plot": 0.10210050002206117, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_build_3d_figure_forces_gpu": 0.030922999838367105, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_build_3d_figure_html": 0.032440499984659255, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_edge_labels_align_inwards_so_they_do_not_clip": 0.08547279995400459, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_emit_3d_figure_message": 0.03144259995315224, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_ipf_key_overlay_is_an_rgba_image": 0.08137789997272193, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_key_labels_are_fractions_of_the_image": 0.0885581000475213, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_no_ipf_key_figure_is_emitted_any_more": 0.1826945999637246, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_not_capped_at_20000": 0.2022198000922799, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_on_unit_sphere": 0.031072000041604042, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_still_caps_at_absurd_size": 9.114471100037917, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_the_key_is_hover_only_by_default": 0.08804180007427931, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_attach_ipf_3d_also_emits_density": 0.19018739997409284, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_build_density_figure_has_mesh": 0.16620310000143945, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_density_raster_known_region_maps_to_sane_color": 0.12203760002739727, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_density_uses_raster_not_polygon_mesh": 0.14963450003415346, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_emit_density_message": 0.16418960003647953, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_multiphase_builds_one_axis_per_phase": 0.31821130006574094, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_build_phase_ipf_geometry": 4.13893110002391, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_build_uses_single_raster_not_polygons": 5.279734600102529, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_corr_rgba_lut_alpha_and_orientation": 0.0014420998049899936, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_corr_rgba_matches_polygon_cell_position": 4.201306699891575, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_match_correlations_full_length": 13.3985322000226, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_no_circles_returns_none": 5.552603099960834, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_rot_mask_from_circles_restricts": 4.4786344000604, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_update_panels_pushes_image_not_facecolors": 5.563005900010467, + "spyde/tests/migrated/test_ipf_refine.py::TestRefineController::test_controller_recompute_and_double_click_toggle": 5.656120300060138, + "spyde/tests/migrated/test_ipf_two_window.py::TestDirectionDispatch::test_bare_window_direction_reaches_the_controller": 1.087321599945426, + "spyde/tests/migrated/test_ipf_two_window.py::TestDirectionDispatch::test_map_window_direction_forwards_to_the_explorer": 1.1709356998326257, + "spyde/tests/migrated/test_ipf_two_window.py::TestFaceCamera::test_aims_the_camera_down_the_vector": 0.0016235002549365163, + "spyde/tests/migrated/test_ipf_two_window.py::TestFaceCamera::test_returns_degrees_in_range": 0.000977999996393919, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_close_is_idempotent_and_clears_the_tree": 0.522624499979429, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_opens_a_separate_window_with_all_four_views": 0.5626054999884218, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_reopening_reuses_the_same_window": 1.1610713999252766, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_set_direction_recolours_every_view": 1.9755826999899, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_does_not_re_emit_figures": 0.5549120000796393, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_marks_and_rotates": 0.519899099948816, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_moves_the_2d_marker": 0.5861889999359846, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_window_is_titled": 0.5387977999635041, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_figure_builds": 0.08488149999175221, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_grid_is_a_surface_not_a_point_list": 0.053233099984936416, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_grid_lies_on_the_unit_sphere": 0.05567550007253885, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_every_vertex_is_finite": 0.0547190000070259, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_painted_cells_are_coloured_by_density": 0.05540319997817278, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_points_2d_figure_has_a_marker_per_phase": 0.08457629999611527, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_points_2d_subsamples_a_huge_map": 0.19998870010022074, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_the_sector_is_masked_in_alpha": 0.053434900124557316, + "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_attach_projections_registers_three_chips": 0.18067790009081364, + "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_projection_maps_actually_differ": 0.05145210004411638, + "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_register_views_append_merges": 0.0007103998214006424, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_attach_without_a_session_keeps_the_legacy_layout": 0.17829879990313202, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_ebsd_finalize_builds_the_two_windows_and_keeps_its_chips": 1.6724783999379724, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.ebsd_action]": 0.002162400051020086, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.orientation_action]": 0.0019926000386476517, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.vector_orientation_om]": 0.008463799953460693, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_lazy_signal_flows_through_add_signal_without_client": 0.06032090005464852, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_opens_the_file_lazily": 0.016057100030593574, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_takes_the_first_of_a_multi_signal_file": 0.021063199965283275, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_wraps_an_eager_reader": 0.017167599988169968, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_to_lazy_converts_eager_signal": 0.018444799934513867, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_to_lazy_passthrough_when_already_lazy": 0.014536600094288588, + "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_add_signal_returns_without_blocking_on_nav_compute": 0.054201999912038445, + "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_client_property_reads_live_from_dask_manager": 0.07807579997461289, + "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_navigator_fills_in_background_without_client": 1.4715347000164911, + "spyde/tests/migrated/test_lifecycle.py::TestGenerationGuard::test_bump_and_is_current": 0.0008171000517904758, + "spyde/tests/migrated/test_lifecycle.py::TestLiveFillPoller::test_none_shm_is_noop": 0.0017037999350577593, + "spyde/tests/migrated/test_lifecycle.py::TestLiveFillPoller::test_polls_until_stopped": 0.385939700063318, + "spyde/tests/migrated/test_lifecycle.py::TestPaintSignalPlots::test_paints_auto_level_without_levels": 0.0018885000608861446, + "spyde/tests/migrated/test_lifecycle.py::TestPaintSignalPlots::test_paints_with_levels_locked": 0.001817299984395504, + "spyde/tests/migrated/test_lifecycle.py::TestProgressEmitter::test_throttles_and_always_emits_final": 0.0021991999819874763, + "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_factory_failure_leaves_none": 0.0017631000373512506, + "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_none_factory_just_removes": 0.0017726999940350652, + "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_removes_old_and_sets_new": 0.0020094000501558185, + "spyde/tests/migrated/test_lifecycle.py::TestResolveVectors::test_falls_back_to_any_tree": 0.0007093999302014709, + "spyde/tests/migrated/test_lifecycle.py::TestResolveVectors::test_prefers_plot_tree": 0.0007165001006796956, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_inline_error_calls_on_error": 0.0025892999256029725, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_inline_without_session": 0.000763599993661046, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_marshals_on_done_to_loop_thread": 0.005472899996675551, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_worker_error_reaches_on_error": 0.00645089999306947, + "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_fires_then_once_vectors_attach": 0.6372589999809861, + "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_no_loop_returns_false": 0.0007514999015256763, + "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_nothing_running_errors_after_grace": 0.33450180012732744, + "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_an_all_nan_buffer_is_painted_once": 0.16898459987714887, + "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_an_unchanged_buffer_is_painted_once": 0.1699042998952791, + "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_real_changes_still_paint": 0.12720789993181825, + "spyde/tests/migrated/test_live_overlay.py::test_compute_error_does_not_propagate": 0.0017723998753353953, + "spyde/tests/migrated/test_live_overlay.py::test_stop_is_idempotent_and_halts_worker": 0.05338259995914996, + "spyde/tests/migrated/test_live_overlay.py::test_sync_mode_runs_inline_on_caller": 0.0018069997895509005, + "spyde/tests/migrated/test_live_overlay.py::test_thread_mode_is_offthread_singleflight_latest_wins": 0.04450449999421835, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughActions::test_crop_resolves_local": 0.44681350013706833, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughActions::test_rebin_resolves_local": 0.4620842000003904, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_auto_flat_field_resolves_opaque": 0.6868457001401111, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_auto_per_pattern_resolves_local": 0.6002927999943495, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_manual_constant_shift_resolves_local": 0.5899760000174865, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_chain_of_local_tags_resolves_local": 0.0016295999521389604, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_explicit_opaque_ancestor_poisons_a_locally_tagged_descendant": 0.0016219000099226832, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_memoized_result_does_not_change_after_mutation": 0.0019229999743402004, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_resolving_a_descendant_also_memoizes_ancestors": 0.0018983001355081797, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_root_is_always_local": 0.001922600087709725, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_untagged_ancestor_poisons_a_locally_tagged_descendant": 0.0016368000069633126, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_untagged_node_defaults_opaque": 0.0016141000669449568, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_axes_full_length_match_full_frame": 0.2430929000256583, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_clim_passed_atomically": 0.006779700051993132, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_large_signal_frame_sent_full_res": 0.28303709998726845, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_large_signal_frame_uses_tile_auto": 0.2807064999360591, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_navigator_frame_full_res_tile_false": 0.2647602998185903, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_small_frame_sent_full_and_auto": 0.005866599967703223, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_exception_traceback_included": 0.0016978000057861209, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_handler_level_gates_records": 0.0011256999569013715, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_record_becomes_log_message": 0.0013398999581113458, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_reentrancy_guard_blocks_recursion": 0.0009137999732047319, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_ring_buffer_bounded": 0.0014044001000002027, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_spyde_info_passes": 0.0010023999493569136, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_thirdparty_info_is_filtered_but_warning_passes": 0.0011338000185787678, + "spyde/tests/migrated/test_log_stream.py::TestInstall::test_install_is_idempotent": 0.0008281999034807086, + "spyde/tests/migrated/test_log_stream.py::TestLevelControl::test_set_level_changes_handler_and_root": 0.0008111001225188375, + "spyde/tests/migrated/test_log_stream.py::TestLevelControl::test_set_log_level_staged_handler_backfills": 0.001043599913828075, + "spyde/tests/migrated/test_masks.py::TestVirtualImageNonBlackOnCalibratedData::test_vi_is_nonzero_with_calibrated_signal_axes": 0.005739000043831766, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_annular_mask_is_a_ring_on_calibrated_axes": 0.0031287999590858817, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_disk_mask_is_nonempty_on_calibrated_axes": 0.009623800055123866, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_mask_is_calibration_invariant": 0.013301300001330674, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_offcentre_disk_lands_where_the_widget_is": 0.003143099951557815, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_rectangle_mask_on_calibrated_axes": 0.0031940999906510115, + "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_256_dp_buffer_is_about_1mb": 0.002874799887649715, + "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_buffer_never_256mb": 0.002918599988333881, + "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_fallback_is_modest": 0.0007110999431461096, + "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_edit_survives_zspy_save_reload": 0.8075512000359595, + "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_emit_carries_raw_editable_map": 0.2175474000396207, + "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_metadata_reemit_reaches_captured_messages": 0.20860240003094077, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_non_finite_numbers_rejected": 0.350564900203608, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_float_writes_back_and_re_emits": 0.3716384000144899, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_invalid_number_ignored": 0.33071629982441664, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_no_plot_is_noop": 0.009448099881410599, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_readonly_derived_field_ignored": 0.3497436000034213, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_string_field": 0.3426640999969095, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_unknown_cell_ignored": 0.33906629984267056, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_units_suffixed_display_string_rejected": 0.344287300016731, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_ensure_local_bundled": 0.008170300163328648, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_ensure_local_unknown_id": 0.001922599971294403, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_is_cached_bundled": 0.001909599988721311, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_resolve_weights_checks_sha": 0.020725499955005944, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_sha256_verify": 0.038821000023745, + "spyde/tests/migrated/test_model_spec.py::TestCopy::test_copy_is_deep": 0.04272770008537918, + "spyde/tests/migrated/test_model_spec.py::TestCopy::test_lookup_errors_name_what_is_available": 0.040744900004938245, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_all_channels_active_is_stored_as_none": 0.04575970000587404, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_a_restricted_signal_range": 0.04677559994161129, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_bounds_including_absent_ones": 0.04556130000855774, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_components_and_kinds": 0.05588220001664013, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_free_flags": 0.047906799940392375, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_parameter_values": 0.04708950000349432, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_the_linear_flag": 0.043447199976071715, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_channel_mask_survives_as_ranges": 0.03819740004837513, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_dict_is_json_serialisable": 0.040657199919223785, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_dict_round_trip": 0.03847470006439835, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_two_disjoint_ranges_survive": 0.0010474000591784716, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_component_slices_isolate_each_component": 0.03686039999593049, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_inactive_components_occupy_no_columns": 0.038611800177022815, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_masks_line_up_with_values": 0.03799270000308752, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_parameter_names_follow_component_then_parameter_order": 0.041901699965819716, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_set_flat_values_is_the_inverse_of_flat_values": 0.041728299926035106, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_set_flat_values_rejects_the_wrong_width": 0.04184680001344532, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_bounds_are_set_before_values": 0.03860299987718463, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_inactive_component_survives_the_round_trip": 0.08113150007557124, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_replaces_any_prepopulated_components": 0.009619900025427341, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_bounds_and_free_flags": 0.09663219994399697, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_kinds_and_values": 0.09038139996118844, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_the_signal_range": 0.09086640004534274, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_unknown_kind_is_a_clear_error": 0.010010299971327186, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_keeps_its_subshell_identity": 0.0016612999606877565, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_onsets_survive": 0.0016553000314161181, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_round_trips": 0.0017315001459792256, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_round_trips_through_json": 0.001654599909670651, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_high_order_coefficients_are_not_silently_dropped": 0.04759620002005249, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_json": 0.039157899911515415, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[1]": 0.05528079986106604, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[2]": 0.0265474000480026, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[6]": 0.051703200209885836, + "spyde/tests/migrated/test_model_spec_init_args.py::TestUnrebuildableComponent::test_components_without_init_args_are_unaffected": 0.07913369999732822, + "spyde/tests/migrated/test_model_spec_init_args.py::TestUnrebuildableComponent::test_missing_init_args_give_an_actionable_error": 0.0016466999659314752, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_empty_movie_cell_is_placeholder": 0.22945319989230484, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_movie_cell_open_emits_edit_open": 0.2874037000583485, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_movie_cell_seeded_from_plot": 0.2561720999656245, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_set_movie_source": 0.2490185999777168, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_close_drops_session": 0.22750740009360015, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_open_emits_state_shape": 0.32250839995685965, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_scrub_clamps_to_range": 0.26827130001038313, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_scrub_drives_real_navigator": 0.288007500115782, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_clamps_time_range": 0.234498200006783, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_half_open_clim_does_not_raise": 0.23928019998129457, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_persists_onto_spec": 0.2441950999200344, + "spyde/tests/migrated/test_movie_block.py::TestExport::test_export_gif_emits_done_and_bakes_poster": 0.4047524998895824, + "spyde/tests/migrated/test_movie_block.py::TestExport::test_export_respects_crop": 0.3117954999906942, + "spyde/tests/migrated/test_movie_block.py::TestExport::test_freeze_grows_frame_count": 0.3696227999171242, + "spyde/tests/migrated/test_movie_block.py::TestMemorySafety::test_export_never_computes_full_array": 0.3225107998587191, + "spyde/tests/migrated/test_movie_block.py::TestMemorySafety::test_scrub_never_computes_full_array": 0.2867103999014944, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_remove_movie_cell_tears_down_widgets": 0.2500923000043258, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_reopen_after_close_restores_widgets_from_persisted_spec": 0.24351860012393445, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_report_close_tears_down_widgets": 0.2321316001471132, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_report_new_tears_down_widgets_but_keeps_cell_persistence": 0.23602390009909868, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_view_outside_editor_after_close_shows_no_overlays": 0.27666279999539256, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_add_text_overlay_from_1d_window": 0.2766398001695052, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_annotation_widgets_drag_persists_to_spec": 0.26470080006401986, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_offsets_annotation_coordinates_in_export": 0.35652390005998313, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_widget_on_figure_persists": 0.2867151000536978, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_zooms_the_live_figure": 0.24995840014889836, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_overlay_image_composited_in_export": 0.560057699913159, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_play_emits_frames_and_stops": 1.063471999950707, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_render_params_apply_to_live_figure": 0.24216600006911904, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_speed_segment_slows_the_export": 0.39897400001063943, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_static_2d_overlay_image_composites": 0.3791911001317203, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_text_overlay_live_value_on_figure": 0.3260229001753032, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_text_overlay_value_in_export": 0.3698057000292465, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_time_gated_annotation_shows_only_in_window": 0.2954313998343423, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_tune_persists_annotations_and_freezes": 0.2463465001201257, + "spyde/tests/migrated/test_movie_block.py::TestTileModeInEditor::test_scrub_in_editor_keeps_using_same_plot_as_outside_editor": 1.2004074999131262, + "spyde/tests/migrated/test_movie_block.py::TestTileModeInEditor::test_scrub_in_editor_routes_through_gpu_tile": 1.2233756000641733, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_2d_nav_4dstem_still_spans_signal": 0.012666599941439927, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_4dstem_whole_signal_small_nav_block_left_alone": 0.013061000034213066, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_explicit_nav_chunk_override_is_honoured": 0.011242300039157271, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_large_frame_gets_one_frame_per_chunk": 0.019692700006999075, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_large_movie_gets_one_frame_per_chunk": 0.01531970000360161, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_medium_frame_byte_target_on_4dstem": 0.02092160005122423, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_movie_whole_signal_multi_frame_block_is_recut_to_one": 0.011276500066742301, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_non_navigated_2d_image_returns_none": 0.009420400019735098, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_small_dp_packs_many_but_capped": 0.011746499920263886, + "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_no_bare_hs_load_in_the_file_session": 0.009410300059244037, + "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_open_lazily_can_take_chunks": 0.0018492999952286482, + "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_the_examples_path_aligns_too": 0.0033462001010775566, + "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_a_reader_that_rejects_chunks_still_loads": 0.06662130006588995, + "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_it_leaves_a_good_chunking_alone": 0.049226999981328845, + "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_mrc_comes_back_with_whole_signal_chunks": 0.05803339998237789, + "spyde/tests/migrated/test_movie_chunking.py::TestMovieFixture::test_movie_opens_with_1d_time_navigator": 0.21632500004488975, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_4dstem_scan_still_prompts": 0.01279080007225275, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_large_image_frames_skip_prompt_even_if_axis_unnamed": 0.010190899949520826, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_small_dp_stack_still_prompts": 0.023252900107763708, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_time_axis_movie_skips_prompt": 0.01127339992672205, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_z_stack_skips_prompt": 0.011945900041610003, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadDerivedViews::test_cropped_view_scrubs": 0.03372289997059852, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadDerivedViews::test_rebinned_view_scrubs": 0.0411796000553295, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadFallThrough::test_eager_falls_through": 0.0036340999649837613, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadMemoryBounded::test_region_block_bounded_to_block": 0.060339399962686, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadMemoryBounded::test_single_frame_on_monolithic_chunk_is_bounded": 0.032926199957728386, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_large_region_stays_bounded": 0.13251180003862828, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_region_mean_matches_get_index": 0.037168300012126565, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_region_rounds_integer_source": 0.013473699917085469, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_4dstem_diffraction_pattern": 0.011526500107720494, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_matches_get_index_movie": 0.028257399913854897, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_movie_single_frame": 0.0343174000736326, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_out_of_range_index_read_raises_to_none": 0.013211200130172074, + "spyde/tests/migrated/test_movie_export.py::TestAnnotations::test_rect_only_in_frames_3_to_6": 0.4393298999639228, + "spyde/tests/migrated/test_movie_export.py::TestCancellation::test_cancel_before_run_raises_before_probe_and_no_output": 0.024871100205928087, + "spyde/tests/migrated/test_movie_export.py::TestCancellation::test_cancel_leaves_no_partial_file": 0.09207320003770292, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_downsample_dimensions_even_cropped": 0.18983020004816353, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_gif_decodable": 0.1625340001191944, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_mp4_exists_and_frame_count": 0.2760119999293238, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_odd_downsample_even_crop": 0.24206070008222014, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_stride": 0.23585170006845146, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_time_range": 0.29122170014306903, + "spyde/tests/migrated/test_movie_export.py::TestFfmpegMissing::test_ffmpeg_ok_false_when_probe_raises": 0.0022299998672679067, + "spyde/tests/migrated/test_movie_export.py::TestLUT::test_apply_lut_non_blank_and_differs": 0.002006299910135567, + "spyde/tests/migrated/test_movie_export.py::TestLUT::test_downsample_halves": 0.0010430000256747007, + "spyde/tests/migrated/test_movie_export.py::TestLUT::test_lut_shape_and_range": 0.0013339999131858349, + "spyde/tests/migrated/test_movie_export.py::TestMemorySafety::test_never_computes_full_array": 0.32527819997631013, + "spyde/tests/migrated/test_movie_export.py::TestMemorySafety::test_read_frame_is_single_frame": 0.024459799868054688, + "spyde/tests/migrated/test_movie_export.py::TestRaggedFrames::test_fit_frame_pads_and_crops": 0.002266500028781593, + "spyde/tests/migrated/test_movie_export.py::TestRaggedFrames::test_smaller_tail_frame_is_letterbox_padded": 0.329087300109677, + "spyde/tests/migrated/test_movie_export.py::TestTraceInset::test_inset_changes_pixels_in_inset_region": 0.5338848999235779, + "spyde/tests/migrated/test_movie_export.py::TestTraceInset::test_resample_clamps": 0.0023608000483363867, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_explicit_fps_key_preferred": 0.011521499953232706, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_explicit_key_wins_over_time_axis": 0.01186810014769435, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_fps_derived_from_time_axis": 0.014145799912512302, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_group_present": 0.015199100016616285, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_microsecond_units_converted": 0.012253300053998828, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_minute_units_converted": 0.011523199966177344, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_ms_units_converted": 0.012317700078710914, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_non_time_axis_shows_placeholder": 0.011457999935373664, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_unknown_time_unit_does_not_derive": 0.01754979998804629, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_zero_scale_does_not_divide": 0.011431699967943132, + "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_empty_spec_tolerant": 0.0008697999874129891, + "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_partial_dict_tolerant": 0.0008172000525519252, + "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_to_from_yaml_roundtrips": 0.010634800069965422, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_full_roundtrip": 0.01500120002310723, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_marker_is_invisible_comment": 0.0013183000264689326, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_older_report_without_movies_still_loads": 0.0016586000565439463, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_placeholder_movie_survives_without_poster": 0.021843900089152157, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_schema_version_unchanged": 0.0008055999642238021, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_zip_layout": 0.03095199994277209, + "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_latest_center_wins": 0.02530300011858344, + "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_reads_neighbours_around_center": 0.025559800094924867, + "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_stays_in_bounds": 0.024680200032889843, + "spyde/tests/migrated/test_multiphase_orientation.py::TestMultiPhaseOrientation::test_generate_library_accepts_multiple_cifs": 5.931662100018002, + "spyde/tests/migrated/test_multiphase_orientation.py::TestMultiPhaseOrientation::test_two_phase_map_and_2d_ipf": 10.946104699978605, + "spyde/tests/migrated/test_nav_aspect.py::TestNavigatorAspect::test_navigator_reports_image_aspect": 0.20854359993245453, + "spyde/tests/migrated/test_nav_aspect.py::TestNavigatorAspect::test_signal_figure_has_no_aspect": 0.22382549999747425, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_current_data_not_set_to_future": 0.023781799944117665, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_failed_read_releases_slot": 0.02137090009637177, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_int_region_mean_is_rounded": 0.025350699899718165, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_region_mean_matches_numpy": 0.025417899945750833, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_settle_flag_requests_full_res": 0.028517500148154795, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_single_frame_paints_correct_data": 0.020346500095911324, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_supersede_cancels_prior_future": 0.02804100012872368, + "spyde/tests/migrated/test_nav_async_cancel.py::TestComputeBackendShutdownGuard::test_backend_none_after_shutdown_no_executor_recreate": 0.009297800017520785, + "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_nav_pool_is_serial": 0.0007839001482352614, + "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_sequence_advances_per_submission": 0.027105300105176866, + "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_stale_frame_does_not_paint_over_a_newer_one": 1.2120293001644313, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_float_region_mean_is_not_rounded": 0.021494299871847034, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_integer_region_mean_is_rounded_to_source_dtype": 0.034655800089240074, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_result_is_never_a_future": 0.012445700005628169, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_single_point_returns_exact_frame_as_ndarray": 0.01916810020338744, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_builds_time_and_spatial_selectors": 0.09841440001036972, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_chain_refire_forces_downstream": 0.10021950001828372, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_composed_index_includes_and_tracks_time": 0.09347909991629422, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_spatial_upstream_resolves_to_time_composite": 0.0958474000217393, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_does_not_hand_over_near_the_end": 0.0007527000270783901, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_hands_over_once_the_cluster_appears": 0.0008008000440895557, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_never_hands_over_without_a_cluster": 0.000786700053140521, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestWiring::test_the_fill_loop_actually_contains_the_handover": 0.007267700042575598, + "spyde/tests/migrated/test_nav_orientation.py::TestNavOrientation::test_crosshair_selects_data_iy_ix": 0.46479639993049204, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestEnqueuePaint::test_enqueue_sets_current_data_immediately": 0.01199110015295446, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_newest_wins_drops_stale_paint": 0.5051746000535786, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_paint_happens_off_caller_thread": 0.013711799983866513, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_slow_paint_does_not_block_submitter": 0.003927799989469349, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_crosshair_selects_frame_while_nav_still_computing": 2.3005977000575513, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_navigator_fills_progressively_without_cluster": 0.6851096998434514, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_navigator_has_no_holes_when_complete": 0.6914598000003025, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_windows_and_crosshair_ready_before_nav_image": 0.08274869993329048, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestFourDNotRegressed::test_4d_still_uses_the_single_navigator_path": 0.6381012002239004, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_both_navigators_fill_from_one_pass": 0.7691568001173437, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_child_navigator_fills_progressively": 0.004002099856734276, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_deep_array_is_what_the_fill_computes": 0.14063279994297773, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_deep_signal_is_committed_in_ram": 0.7670301998732612, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_partial_plane_never_clobbers_a_complete_frame": 0.0016424001660197973, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_reduce_deep_nav_masks_incomplete_planes": 0.0013852000702172518, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_sidecar_round_trip_skips_the_compute_entirely": 0.9107631000224501, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_time_move_reads_the_committed_array": 0.7986159999854863, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_time_navigator_never_shows_a_partial_sum": 0.7479342001024634, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_distributed_mode_does_not_use_the_client": 0.013721400056965649, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_future_is_cancellable": 0.015902600018307567, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_shutdown_is_idempotent": 0.0009469999931752682, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_threaded_mode_uses_the_existing_executor": 0.016606700024567544, + "spyde/tests/migrated/test_nav_rebin_no_block.py::TestRebinSyncCached::test_crossing_chunk_boundary_decodes_once_then_dwells": 0.4163245998788625, + "spyde/tests/migrated/test_nav_rebin_no_block.py::TestRebinSyncCached::test_dwell_in_chunk_is_fast_no_redecode": 0.6202622000128031, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[1.0-0.0]": 0.6912645000265911, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[2.5-10.0]": 0.6755746001144871, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[3.0-0.0]": 0.6859942000592127, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_scaled_navigator_selects_correct_diffraction_pattern": 1.0790787000441924, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_4d_load_emits_prompt_and_does_not_open": 0.02359119988977909, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_applies_step_size_and_opens": 0.4885391001589596, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_reshapes_flat_stack_lazily": 0.5156240998767316, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_with_wrong_frame_count_falls_back": 0.5203747999621555, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_open_file_emits_busy_then_clears": 0.1487794000422582, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_plain_2d_image_does_not_prompt": 0.030755599960684776, + "spyde/tests/migrated/test_nav_sidecar.py::TestNavFillDeferral::test_fill_waits_for_first_signal_frame": 1.0471825001295656, + "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_fill_saves_sidecar_and_reopen_skips_compute": 0.7628742000088096, + "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_no_sidecar_for_pseudo_paths": 0.07081350008957088, + "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_override_navigator_never_uses_sidecar": 0.11004960001446307, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_1d_movie_navigator": 0.021679299999959767, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_missing_or_corrupt_sidecar": 0.01827430003322661, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_modified_source_invalidates": 0.032502499991096556, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_partial_fill_never_cached": 0.004959999932907522, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_save_then_load": 0.0383697000797838, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_shape_mismatch_misses": 0.025953899952583015, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_cached_cold_huge_frame_is_expensive": 0.0025209999876096845, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_cached_small_frame_is_cheap": 0.0025313999503850937, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_derived_huge_frame_stays_cheap": 1.2702506999485195, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_huge_frame_resident_in_the_array_cache_is_cheap": 0.0025294999359175563, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_never_computes": 0.0031432999530807137, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_a_few_points_stays_cheap": 0.0024634000146761537, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_many_UNCACHED_points_is_expensive_even_when_small": 0.0024941001320257783, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_many_points_of_BIG_frames_is_expensive": 0.0036165998317301273, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_medium_region_below_async_cap_is_cheap": 0.0026039000367745757, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_region_by_bytes_is_expensive": 0.0034616999328136444, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_small_region_is_cheap": 0.0032406001118943095, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_cropped_view_single_point_is_cheap_now": 0.001512099988758564, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_raw_movie_single_point_is_cheap": 0.0010957999620586634, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_rebinned_view_single_point_is_cheap_now": 0.0017710999818518758, + "spyde/tests/migrated/test_navigator_race.py::test_latest_position_wins_under_burst": 0.06328839994966984, + "spyde/tests/migrated/test_navigator_race.py::test_newer_submission_coalesces_older_one": 0.06377749994862825, + "spyde/tests/migrated/test_navigator_race.py::test_updates_run_serially_never_concurrently": 0.0624526001047343, + "spyde/tests/migrated/test_neural_batch_memory.py::TestNeuralBatchMemory::test_peak_memory_scales_with_batch_not_stack_size": 9.579261699924245, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_batch_matches_single": 5.350641700089909, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_bundled_model_loads": 4.500292699900456, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_detect_localises_planted_spots": 5.230978699983098, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_registry_fallback": 4.445225299918093, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_registry_upgrade_merge": 4.159515600069426, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_clear_is_a_noop_without_a_crosshair": 0.37527550000231713, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_drag_release_drag_again": 0.37094009993597865, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_navigator_plot_edits_navigation_axes": 0.37717270001303405, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_node_switch_clears_the_crosshair": 0.3827047001104802, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_refused_toggle_reports_off": 0.38726210000459105, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_stable_across_repeated_moves": 0.36302509997040033, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_starts_at_current_offset_no_change_until_drag": 0.3735494000138715, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_emits_pick_state": 0.37296649999916553, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_off_removes_crosshair": 0.37660519999917597, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_on_sets_offset_so_crosshair_is_origin": 0.3767742000054568, + "spyde/tests/migrated/test_open_stack.py::TestFindVectorsPreviewOnStack::test_blurred_frame_returns_single_2d_frame_from_5d": 0.0008803998352959752, + "spyde/tests/migrated/test_open_stack.py::TestFindVectorsPreviewOnStack::test_blurred_frame_still_works_for_4d": 0.0008229999803006649, + "spyde/tests/migrated/test_open_stack.py::TestMultiNavIndexOrdering::test_only_spatial_pair_is_transposed": 0.0008555001113563776, + "spyde/tests/migrated/test_open_stack.py::TestMultiNavIndexOrdering::test_overlay_helpers_split_lead_and_spatial": 0.0007816000143066049, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_fewer_than_two_files_errors": 0.020008399966172874, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_mismatched_shapes_cropped_with_warning": 0.19843650003895164, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_per_file_scan_calibration_carried_over": 0.2340767999412492, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_signal_type_carried_over": 0.20720300008542836, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_stack_axis_is_generic_index": 0.2793877999065444, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_stacks_two_4d_into_5d_lazy": 0.20766689989250153, + "spyde/tests/migrated/test_orientation_ag.py::TestAgSilverWorkflow::test_load_cif_library_refine": 4.300532300025225, + "spyde/tests/migrated/test_orientation_ag.py::TestAgSilverWorkflow::test_template_spots_match_pyxem": 0.2854464000556618, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_chunked_equals_single_chunk": 16.981118100113235, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_live_shm_rgb_written": 9.330549599952064, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_never_computes_full_dataset": 9.495856799883768, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_stopped_flag_returns_none": 7.921564800082706, + "spyde/tests/migrated/test_orientation_compute.py::TestMultiphase::test_phase_recovered": 9.32342020003125, + "spyde/tests/migrated/test_orientation_compute.py::TestMultiphase::test_template_tables_match_get_simulation": 0.4213521999772638, + "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_correlation_sorted_and_positive": 9.109316400135867, + "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_inplane_delta": 8.319886999903247, + "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_rows_and_quats_match_pyxem": 55.99108930013608, + "spyde/tests/migrated/test_orientation_compute.py::TestResolveQuaternions::test_identity_roundtrip": 0.36254150001332164, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_color_map_directions_differ": 0.03478830005042255, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_correlation_and_phase_maps": 0.0011355000315234065, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_color_map": 0.02039860002696514, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_matches_direct_orix": 0.009044700185768306, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_roi_counts_and_subsample": 0.012411799980327487, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_roi_multiphase_partition": 0.010013900115154684, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xyz_encodes_inplane_rotation": 0.011325599974952638, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xyz_geometry": 0.009358800016343594, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_save_load_roundtrip": 0.07947450003121048, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_shapes_and_props": 0.0011103000724688172, + "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_identity_rotation_projects_z_to_origin": 0.005944600095972419, + "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_triangle_outline_nonempty": 0.0188831000123173, + "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_xy_inside_sector_bounds": 0.02308479999192059, + "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_orientation_end_to_end_on_lazy_data": 9.431987699936144, + "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_overlay_attaches_and_draws_template_spots": 9.17346040008124, + "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_overlay_hook_registered_and_updates": 8.283311300096102, + "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_entry_rejects_missing_cif": 0.5585014000535011, + "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_orientation_builds_ipf_window_and_attaches_map": 2.9140549999428913, + "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_source_overlay_attaches_before_the_batch": 0.4561360999941826, + "spyde/tests/migrated/test_orientation_port.py::test_plot_renders_rgb_image": 0.002044200082309544, + "spyde/tests/migrated/test_orientation_wizard.py::TestOrientationWizard::test_generate_refine_run": 12.181063999887556, + "spyde/tests/migrated/test_orientation_wizard.py::TestOrientationWizard::test_run_without_library_errors_gracefully": 0.6670206999406219, + "spyde/tests/migrated/test_overlay_layers.py::TestColdSourceReadWarms::test_cold_derived_read_skips_then_warms_then_paints": 0.04565099999308586, + "spyde/tests/migrated/test_overlay_layers.py::TestDeadLayerSkip::test_dead_layer_not_read_or_painted": 0.7164695000974461, + "spyde/tests/migrated/test_overlay_layers.py::TestEagerRegionParity::test_eager_region_mean_is_unrounded": 0.009970800019800663, + "spyde/tests/migrated/test_overlay_layers.py::TestLiveNavRefresh::test_async_tier_move_skips_without_error": 0.7704569001216441, + "spyde/tests/migrated/test_overlay_layers.py::TestLiveNavRefresh::test_nav_move_refreshes_layer": 1.3708660000702366, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_add_layer_same_shape": 0.5767293999670073, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_query_reemits_state": 0.5727293998934329, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_refuse_self": 0.2381992000155151, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_refuse_shape_mismatch": 0.23152819997631013, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlaySet::test_set_reflected_in_layer_state": 0.5822542000096291, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_remove_layer": 0.570539299864322, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_source_close_drops_layers_on_target": 0.5656804998870939, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_target_close_drops_layers": 0.5602927999570966, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_tile_mode_refused": 0.5562790000112727, + "spyde/tests/migrated/test_overlay_layers.py::TestPendingFramesRace::test_write_between_read_and_clear_is_not_lost": 0.3165094000287354, + "spyde/tests/migrated/test_overlay_layers.py::TestShapeChangeDropsLayers::test_shape_changing_paint_drops_layers_cleanly": 0.5658139000879601, + "spyde/tests/migrated/test_overlay_visibility.py::TestOverlayVisibility::test_found_vectors_overlay_hides_on_deselect": 2.081152700004168, + "spyde/tests/migrated/test_overlay_visibility.py::TestOverlayVisibility::test_set_overlay_unknown_is_noop": 0.38612230005674064, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_changed_nav_grid_declines": 0.011123200063593686, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_identity_rebin_declines": 0.00832799996715039, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_no_parent_declines": 0.015162299969233572, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_non_integer_rebin_factor_declines": 0.011966499965637922, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_unknown_transformation_declines": 0.015092200017534196, + "spyde/tests/migrated/test_per_frame_reader.py::TestParentBlockDoesTheWork::test_parent_reader_is_shared_not_rebuilt": 0.03443060000427067, + "spyde/tests/migrated/test_per_frame_reader.py::TestParentBlockDoesTheWork::test_residency_follows_the_parent": 0.01784280000720173, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_dtype_matches_the_derived_signal": 0.01658949989359826, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_frame_matches_the_dask_view": 0.030798699939623475, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_reader_resolves_to_per_frame": 0.030523400055244565, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_region_matches_a_plain_per_frame_mean": 0.05320900003425777, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_region_spanning_parent_chunks": 0.06165290006902069, + "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_figure_html_is_small": 0.2120910999365151, + "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_figure_imports_shared_bundle": 0.21587550011463463, + "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_shared_bundle_written_once": 0.34618230001069605, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_does_not_match_a_2d_crosshair": 0.0013581999810412526, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_does_not_match_a_2d_rectangle_selector": 0.001380000147037208, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_effective_scale_seconds_helpers": 0.0018596999580040574, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_fallback_to_default_fps_on_garbage_scale": 0.0018170999828726053, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_fast_forward_cycles_speed": 0.009364199941046536, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_fast_forward_emits_speed_in_state": 0.004721099976450205, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_frame_skipping_tracks_wall_time": 0.6056430001044646, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_garbage_scale_still_plays_at_default": 0.1257303999736905, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_loop_wraps_to_start": 0.40499790012836456, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_matches_a_1d_line_and_range_selector": 0.001372199971228838, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_no_movie_selector_is_noop": 0.0008799999486654997, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_non_insitu_tree_is_not_played": 0.0017389999702572823, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_pause_stops_advancing": 0.40530939993914217, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_play_advances_frames": 0.10665589990094304, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_play_toggle_pauses_while_fast_forwarding": 0.003907700069248676, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_realtime_pacing_from_scale": 0.605353599996306, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_restart_does_not_desync_playing_state": 0.4136902999598533, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_single_step": 0.0013711999636143446, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_speed_multiplier_advances_faster": 0.8085177002940327, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_stops_at_last_frame_without_loop": 0.06575419998262078, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_units_ms_behaves_like_seconds": 0.605586199904792, + "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_fast_forward_via_dispatch_cycles_speed": 0.25603699998464435, + "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_play_then_pause_via_dispatch": 0.42228409997187555, + "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_session_playback_property_and_dispatch": 0.4604220000328496, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_calibrated_x_axis_reaches_set_data": 0.005131699959747493, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_default_y_label_is_intensity": 0.003769699833355844, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_edit_units_repropagates_on_repaint": 0.003426700015552342, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_length_mismatch_keeps_default_x_axis": 0.008303500013425946, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_signal_quantity_overrides_default_y_label": 0.0038656999822705984, + "spyde/tests/migrated/test_plot_labels.py::TestNavAxisEdit::test_nav_axis_edit_reaches_navigator_display_axes": 0.2568593999603763, + "spyde/tests/migrated/test_plot_labels.py::TestNavAxisEdit::test_signal_plot_still_uses_signal_axes": 0.23323780007194728, + "spyde/tests/migrated/test_plot_labels.py::TestPlot2DTitle::test_apply_plot_title_pushes_dataset_name": 0.0037990000564604998, + "spyde/tests/migrated/test_plot_labels.py::TestPlot2DTitle::test_empty_title_leaves_strip_blank": 0.003589700092561543, + "spyde/tests/migrated/test_plot_labels.py::TestSetTitle::test_set_title_ignores_blank": 0.21832380001433194, + "spyde/tests/migrated/test_plot_labels.py::TestSetTitle::test_set_title_updates_root_and_emits": 0.21538920002058148, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_a_1d_scan_works": 0.0018990000244230032, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_a_corner_has_two_neighbours": 0.002182199852541089, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_an_interior_position_has_four": 0.00202369992621243, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_they_are_actual_neighbours": 0.0021762000396847725, + "spyde/tests/migrated/test_polish.py::TestPolish::test_a_clean_scan_needs_no_passes": 0.02771169994957745, + "spyde/tests/migrated/test_polish.py::TestPolish::test_a_signal_with_no_grid_is_left_alone": 0.01549589994829148, + "spyde/tests/migrated/test_polish.py::TestPolish::test_it_never_makes_a_position_worse": 0.02467940014321357, + "spyde/tests/migrated/test_polish.py::TestPolish::test_it_rescues_a_sabotaged_position": 0.1741701998980716, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_corner_is_not_judged_on_chisq_alone": 0.0026522999396547675, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_local_outlier_is_caught": 0.003468099981546402, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_position_that_did_not_converge_is_poor_whatever_its_chisq": 0.0027289999416098, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_sharp_edge_can_be_flagged": 0.002593600074760616, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_poor_is_local_not_absolute": 0.0035851000575348735, + "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_cpu_device_uses_numpy_reference": 0.02339139999821782, + "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_gpu_prep_env_gate": 0.0010841001057997346, + "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_torch_prep_path_matches_numpy_on_cpu_tensor": 0.052831499953754246, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_canonical_scale_factor_matches": 0.0016859000315889716, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_gaussian_blur_matches_scipy": 0.039038099930621684, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_normalize_input_matches_numpy": 0.044296200037933886, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_pad_to_multiple_matches_numpy": 0.002268300042487681, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_scale_matches_scipy_zoom": 0.012872299994342029, + "spyde/tests/migrated/test_preview_setparams.py::test_navigation_path_renders_via_engine": 0.012982600135728717, + "spyde/tests/migrated/test_preview_setparams.py::test_set_params_rerenders_peaks": 0.024117100052535534, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_different_blocks_sample_different_positions": 0.0015091000823304057, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_sample_is_deterministic_per_block": 0.0008979999693110585, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_sample_is_inside_the_block": 0.001814700081013143, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_single_position_block": 0.0008201999589800835, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestFindVectorsWiring::test_batch_attaches_a_preview_and_feeds_it": 1.651642500073649, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestFindVectorsWiring::test_teardown_closes_the_preview": 1.708485500072129, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_compaction_drops_the_padding": 0.0008085999870672822, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_empty_position_renders_blank_not_none": 0.0008279000176116824, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_matches_the_finalized_render": 0.0012216001050546765, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_renders_a_disk_at_the_peak": 0.0010373999830335379, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_store_is_capped": 0.0009298000950366259, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_unknown_position_renders_none": 0.000799400033429265, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestOrchestratorPlumbing::test_on_chunk_block_is_optional": 0.0018675001338124275, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_attaches_to_a_navigator_plus_signal_window": 0.06250900006853044, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_block_paints_a_sample_frame": 0.06701309990603477, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_close_does_not_clobber_the_final_display": 0.05455580004490912, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_close_restores_the_original_slice_fn": 0.05706530006136745, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_computed_position_renders_on_demand": 0.06065419991500676, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_no_navigator_window_is_a_no_op": 0.02894310001283884, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_out_of_bounds_index_is_not_ready": 0.05462690000422299, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_parked_navigator_refires_instead_of_sampling": 0.07375999994110316, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_sample_paints_are_throttled": 0.07398339989595115, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_served_and_declined_reads_are_counted": 0.052982999943196774, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_uncomputed_position_returns_none": 0.0702389997895807, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_user_drag_holds_off_the_sampler": 0.08514469990041107, + "spyde/tests/migrated/test_progressive_vi.py::TestVirtualImageDisplay::test_eager_virtual_image_is_nonzero": 0.5682677999138832, + "spyde/tests/migrated/test_progressive_vi.py::TestVirtualImageDisplay::test_lazy_virtual_image_is_nonzero": 0.5832123000873253, + "spyde/tests/migrated/test_progressive_windowed.py::TestVirtualImageMaskedSum::test_einsum_path_matches_product_reference": 0.057719900039955974, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_cancel_cancels_every_outstanding_chunk": 0.02438860002439469, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_error_propagates_via_result": 0.013939500087872148, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_primes_small_then_sends_the_rest_in_one_submit": 0.03846949990838766, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_stop_event_halts_topups": 0.5101722001563758, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_background_is_ignored": 0.001274899928830564, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_inactive_components_are_excluded": 0.0012527001090347767, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_lines_filter_selects_one_line": 0.0013127001002430916, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_negative_intensities_are_clamped": 0.001307699945755303, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_one_map_per_element": 0.0021074998658150434, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_reads_a_tabulated_edge_intensity": 0.00126369995996356, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_reshapes_to_the_scan": 0.0013327999040484428, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_sums_a_family": 0.001353600062429905, + "spyde/tests/migrated/test_quantify.py::TestEndToEnd::test_quantify_result_carries_the_raw_maps": 0.0010184000711888075, + "spyde/tests/migrated/test_quantify.py::TestEndToEnd::test_recovers_the_composition_the_data_was_built_from": 0.002016099984757602, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[C_K-want3]": 0.002654799958691001, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[Cu_Kb1-want2]": 0.0025007000658661127, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[Fe_Ka-want0]": 0.0026741999899968505, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[O_K-want1]": 0.0025147999403998256, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[Offset]": 0.0014170000795274973, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[PowerLaw]": 0.0014173000818118453, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[]": 0.0014054999919608235, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[background_order_6]": 0.002360299928113818, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[not-a-line]": 0.0014954999787732959, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_cliff_lorimer_applies_k_factors": 0.0009870000649243593, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_eels_divides_by_cross_section": 0.0010187000734731555, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_fractions_sum_to_one_across_a_map": 0.0013049999251961708, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_missing_factors_default_and_are_reported": 0.0009418000699952245, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_no_maps_is_an_error": 0.0009314999915659428, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_relative_normalises_to_one": 0.0013229000614956021, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_result_says_it_is_relative": 0.000907700159586966, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_unknown_method_is_rejected": 0.0010641999542713165, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_zero_signal_is_nan_not_a_divide_error": 0.0009413000661879778, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_a_short_movie_cannot_seed_past_the_end": 0.7855398998362944, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_a_usable_span_survives_toggling_off_and_on": 0.7899340997682884, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_first_integrate_gives_the_default_width_not_the_whole_axis": 0.7884545000270009, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_it_centres_on_the_crosshair": 0.786074300063774, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_the_drawn_span_matches_the_frames_actually_read": 0.7687024000333622, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_uncalibrated_axis_still_gets_the_default": 0.7869066001148894, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_rectangle_geometry_clamped_on_resize": 0.6853166999062523, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_rectangle_indices_bounded_per_dim": 0.7057618999388069, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_span_geometry_clamped_on_resize": 0.6730478999670595, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_span_indices_bounded": 0.6832559000467882, + "spyde/tests/migrated/test_region_extent_cap.py::TestWidgetSideCap::test_rectangle_widget_carries_the_cap": 0.6862336999038234, + "spyde/tests/migrated/test_region_extent_cap.py::TestWidgetSideCap::test_span_widget_cap_tracks_the_axis_scale": 0.6903430001111701, + "spyde/tests/migrated/test_region_integrator.py::TestConcurrentCallers::test_a_contended_read_does_not_wait": 0.003180100000463426, + "spyde/tests/migrated/test_region_integrator.py::TestConcurrentCallers::test_concurrent_reads_all_return_the_right_frame": 0.13617199996951967, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_clamped_span_reads_one_frame_not_n": 0.00138669996522367, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_duplicates_do_not_disturb_a_live_running_sum": 0.002532699960283935, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_float_source_with_duplicates_is_still_exact": 0.0015665000537410378, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs0]": 0.0018702999223023653, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs1]": 0.0017078000819310546, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs2]": 0.001780400169081986, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[float32]": 0.0015118999872356653, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[float64]": 0.0015986999496817589, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[int32]": 0.001603799988515675, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[uint16]": 0.001617399975657463, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_declines_a_float64_accumulator": 0.00098540005274117, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_declines_a_small_frame_without_importing_torch": 0.0009854999370872974, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[0-False]": 0.0012107000220566988, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[1-True]": 0.0012551001273095608, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[no-False]": 0.001217600074596703, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[true-True]": 0.0012133000418543816, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_off_by_default": 0.0009914999827742577, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_a_jump_with_no_overlap_still_matches": 0.007133399951271713, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_float_source_never_goes_incremental": 0.004933999967761338, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_resize_changes_the_divisor_correctly": 0.0093417001189664, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_slid_window_matches_a_cold_recompute": 0.02031999989412725, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_slide_touches_only_the_entering_and_leaving_frames": 0.006051999982446432, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_uint16_running_sum_is_exact_at_the_cap": 0.0039022000273689628, + "spyde/tests/migrated/test_region_integrator.py::TestInvalidation::test_a_different_signal_key_does_not_reuse_the_sum": 0.004121600068174303, + "spyde/tests/migrated/test_region_integrator.py::TestInvalidation::test_invalidate_forces_a_recompute": 0.003987399977631867, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_2d_nav_points_match": 0.002125200000591576, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_band_split_does_not_reorder_summation": 0.0021955999545753, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[16]": 0.0029448000714182854, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[17]": 0.002934899996034801, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[1]": 0.0028335998067632318, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[256]": 0.008845599950291216, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[2]": 0.002903300104662776, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[3]": 0.0028811999363824725, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[5]": 0.002850899938493967, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[float32]": 0.005123700015246868, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[float64]": 0.004945899941958487, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[int16]": 0.005691000027582049, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[int32]": 0.0062628998421132565, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[uint16]": 0.006033699959516525, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[uint8]": 0.01586800010409206, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_threading_off_gives_the_same_answer": 0.005634899949654937, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_clear_restores_the_default": 0.0008097001118585467, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_grows_to_hold_a_big_frame_roi": 0.00081619992852211, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_is_bounded_by_the_ceiling": 0.0008091001072898507, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_never_drops_below_the_default": 0.0008079000981524587, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_float64_accumulator_declines_the_gpu": 0.0007542999228462577, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_matches_the_cpu_backend_exactly": 0.0007519000209867954, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_matches_the_serial_reference_exactly": 0.000744700082577765, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_other_integer_sources_round_trip[i16-int16]": 0.0009389998158439994, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_other_integer_sources_round_trip[u8-uint8]": 0.000955199939198792, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_saturated_uint16_stays_exact_at_the_cap": 0.0006940999301150441, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_the_gpu_path_actually_engaged": 4.4400909000542015, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_a_held_parameter_makes_them_distinguishable": 0.0008474999340251088, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_a_lone_component_is_not": 0.000699399970471859, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_different_kinds_are_not_exchangeable": 0.0008324999362230301, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_two_of_a_kind_are_exchangeable": 0.0008064998546615243, + "spyde/tests/migrated/test_relabel.py::TestItDoesNotChangeTheFit::test_the_model_curve_is_unchanged": 0.003922200063243508, + "spyde/tests/migrated/test_relabel.py::TestOnTheRealScan::test_two_gaussians_becomes_consistent": 2.56848140002694, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_a_scrambled_scan_becomes_consistent": 0.0029680998995900154, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_a_single_position_is_untouched": 0.0009449000936001539, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_an_already_consistent_scan_is_left_alone": 0.0025676999939605594, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_inseparable_components_are_not_reordered": 0.002297199913300574, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_it_permutes_and_invents_nothing": 0.0033104000613093376, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_the_separation_threshold_is_what_decides": 0.0022306001046672463, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_whole_components_move_together": 0.0025693997740745544, + "spyde/tests/migrated/test_report_annotation_coords.py::TestCalibratedTextAnnotation::test_text_center_converts_to_pixel_center": 0.02481820003595203, + "spyde/tests/migrated/test_report_annotation_coords.py::TestReversedAxis::test_reversed_x_axis_offsets_and_u_sign": 0.011623799917288125, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_arrow_uv_scale_signed": 0.011549399932846427, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_circle_radius_converts_by_mean_scale": 0.011919099953956902, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_ellipse_widths_heights_convert": 0.011434699990786612, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_rect_widths_heights_convert": 0.011543400003574789, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSpecNotMutated::test_build_twice_same_result_and_spec_untouched": 0.02276930003426969, + "spyde/tests/migrated/test_report_annotation_coords.py::TestUncalibratedIdentity::test_no_axes_is_identity": 0.018474500044248998, + "spyde/tests/migrated/test_report_annotation_coords.py::TestUncalibratedIdentity::test_unusable_axes_is_identity": 0.013273200020194054, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_default_center_callout": 0.24410410004202276, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_explicit_indices_clamped": 0.2551829000003636, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_no_nav_axes_errors": 0.19100589992012829, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_rank_mismatch_errors": 0.24944040004629642, + "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_geometry_change_persists_without_rebuild": 0.22690069989766926, + "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_spec_round_trips_new_inset_keys": 0.20590159995481372, + "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_unknown_inset_id_is_silent_noop": 0.2255756000522524, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_marker_drop_clamps": 0.2982078001368791, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_marker_drop_reslices": 0.31071299978066236, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_no_marker_outside_edit_mode": 0.2605733999516815, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_unchanged_position_skips_rebuild": 0.2521514998516068, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_read_frame_at_guards": 0.008028399897739291, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_read_frame_at_lazy_4d_slices_only": 0.022713399957865477, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_time_callouts_compute_single_frames_only": 0.31536380003672093, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_zoom_callout_and_drag_never_compute_dataset": 0.27702589984983206, + "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_2d_image_nav_dims_0": 0.18358850001823157, + "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_4d_panels_carry_nav_dims_2": 0.23840840021148324, + "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_movie_panel_nav_dims_1": 0.25120779999997467, + "spyde/tests/migrated/test_report_callouts.py::TestRefreshStoredPosition::test_4d_refresh_keeps_position": 0.2814439000794664, + "spyde/tests/migrated/test_report_callouts.py::TestRefreshStoredPosition::test_movie_refresh_keeps_time_frames": 0.35636440000962466, + "spyde/tests/migrated/test_report_callouts.py::TestTimeCallouts::test_2d_nav_refused": 0.24757990008220077, + "spyde/tests/migrated/test_report_callouts.py::TestTimeCallouts::test_three_insets_start_mid_end": 0.31304569996427745, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_default_center_region_on_plain_2d_image": 0.1946987999835983, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_default_region_clamped_on_small_image": 0.023895599995739758, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_explicit_region_clamped_to_bounds": 0.20417599997017533, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_refused_on_scene3d_panel": 0.24583140015602112, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_refused_without_base_snapshot": 0.1962103999685496, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_no_rect_outside_edit_mode": 0.2052904999582097, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_rect_drop_clamps_to_bounds": 0.22855999995954335, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_rect_drop_recrops": 0.23137279995717108, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_unchanged_region_skips_rebuild": 0.21779319981578737, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_defaults_slide_break_false_when_omitted": 0.1876359002199024, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_falls_back_to_active_window": 0.19668739999178797, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_no_active_window_errors_cleanly": 0.17369270010385662, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_sets_slide_break_and_snapshot": 0.19193150009959936, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_callout_navigator_base_converts_region_to_data": 0.2743730000220239, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_crosshair_selector_gives_no_region": 0.0012608000542968512, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_index_region_to_data_calibrated": 0.0013067000545561314, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_index_region_to_data_uncalibrated_passthrough": 0.0012336999643594027, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_source_region_by_navigator_parent": 0.0013524999376386404, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_source_region_uses_selector_linked_to_source": 0.001505299936980009, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_callout_adds_inset": 0.2532308999216184, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_callout_signal_base_has_no_connector": 0.2523142999270931, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_overlay_appends_layer": 0.19419019995257258, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_overlay_forced_mismatch_refused": 0.2342998000094667, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_down_then_insert_stays_grid": 0.2815333000617102, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_left_prepends_and_shifts": 0.2445172001607716, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_right_grows_grid": 0.25757559994235635, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_annotation_crud": 0.24480969994328916, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_last_layer_removes_panel_and_collapses_cell": 0.19198530004359782, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_overlay_layer": 0.21951890003401786, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_panel_from_grid": 0.2614060001214966, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_set_layer_updates_spec": 0.22568829986266792, + "spyde/tests/migrated/test_report_compose.py::TestLayeredAddToReport::test_layered_plot_carries_layers": 0.22497129999101162, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_column_preset": 0.28658040007576346, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_grid_preset": 0.2684954998549074, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_hspace_wspace_preserved": 0.2924281000159681, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_inset_panels_untouched": 0.28885429992806166, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_row_preset": 0.28157350013498217, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_unknown_preset_errors_no_change": 0.2739206999540329, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_mismatch_multi_panel_target_excludes_overlay": 0.2495113000040874, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_mismatch_tiles_only": 0.23888479999732226, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_nav_signal_pair_offers_callout": 0.24033719999715686, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_same_shape_offers_overlay": 0.20975549996364862, + "spyde/tests/migrated/test_report_compose.py::TestRoundTrip::test_composed_spec_roundtrips": 0.27933320007286966, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_hole_fill_no_grid_growth": 0.31310059991665184, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_legacy_no_target_matches_old_semantics": 0.2712086000246927, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_occupied_neighbor_inserts_row_and_shifts": 0.31533170002512634, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_sparse_grid_survives_renormalise_and_build": 0.3263197998749092, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_targeted_tile_down_right_panel_makes_2x2": 0.25299989990890026, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_targeted_tile_left_on_interior_panel_inserts_column": 0.2981235000770539, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_closed_state_has_report_type": 0.009247199981473386, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_default_type_is_report": 0.007678000023588538, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_sets_type": 0.008304300135932863, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_unknown_type_normalizes": 0.007433900027535856, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_state_emits_type": 0.008452699985355139, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_absent_type_defaults_to_report": 0.0012917999411001801, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_front_matter_round_trip_presentation": 0.0029261999297887087, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_front_matter_round_trip_report": 0.0019543999806046486, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_movie_type_tolerated": 0.001990900025703013, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_unknown_type_normalizes_to_report": 0.0013190999161452055, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_zip_round_trip": 0.026847200002521276, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_arrow_linewidth_flows_to_live_widget": 0.22708569990936667, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_circle_linewidth_flows_to_live_widget": 0.2192701998865232, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_rect_linewidth_flows_to_live_widget": 0.22321379999630153, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_text_fontsize_flows_to_live_widget": 0.21436570002697408, + "spyde/tests/migrated/test_report_edit_mode.py::TestDragPersistNoRebuild::test_circle_drag_updates_offset_and_radius": 0.2264978998573497, + "spyde/tests/migrated/test_report_edit_mode.py::TestDragPersistNoRebuild::test_text_drag_updates_data_no_rebuild": 0.2052020999835804, + "spyde/tests/migrated/test_report_edit_mode.py::TestEditModeToggle::test_edit_on_makes_widgets_off_makes_markers": 0.21833659999538213, + "spyde/tests/migrated/test_report_edit_mode.py::TestEditModeToggle::test_toggle_same_value_is_noop": 0.22914629988372326, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigAnnotationInPlaceUpdate::test_add_and_remove_fig_annotation_no_rebuild": 0.20294659992214292, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigAnnotationInPlaceUpdate::test_update_fig_annotation_no_rebuild": 0.21818720002193004, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_interactive_sets_edit_chrome_and_markers": 0.2183534000068903, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_non_interactive_sets_markers_not_chrome": 0.22664000000804663, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_panel_map_stashed": 0.20114909997209907, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureMarkerDrag::test_marker_drag_persists_no_rebuild": 0.21682670002337545, + "spyde/tests/migrated/test_report_edit_mode.py::TestGeometryRoundTrip::test_arrow_uv_roundtrip_signed": 0.22401020012330264, + "spyde/tests/migrated/test_report_edit_mode.py::TestGeometryRoundTrip::test_rect_center_topleft_roundtrip": 0.21146380016580224, + "spyde/tests/migrated/test_report_edit_mode.py::TestGuards::test_pointer_up_after_panel_removed_no_change": 0.21351529995445162, + "spyde/tests/migrated/test_report_edit_mode.py::TestGuards::test_pointer_up_index_out_of_range_no_change": 0.21943860012106597, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_add_fig_annotation_rejects_bad_kind": 0.2044849001104012, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_add_update_remove_fig_annotation_round_trip": 0.20189870009198785, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_set_layout_applies_hspace_wspace": 0.22413710004184395, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_set_layout_clamps_to_unit_range": 0.22792809992097318, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_edit_mode_color_update_no_rebuild": 0.22159540001302958, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_edit_mode_text_update_no_rebuild": 0.21883169992361218, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_kind_change_rebuilds_even_in_edit_mode": 0.23606859997380525, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_non_edit_mode_update_rebuilds": 0.22606899996753782, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_figure_background_deselects": 0.22347909992095083, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_panel_pointer_down_selects_and_outlines": 0.24316809989977628, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_repfig_select_panel_action": 0.20996000000741333, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_select_unknown_panel_is_figure_level": 0.22454730013851076, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_selection_survives_rebuild": 0.23109070013742894, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_exchanges_grid_pos_and_rebuilds": 0.2877192000159994, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_same_panel_is_noop": 0.275848799967207, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_unknown_dispatch_id_is_noop": 0.26522400008980185, + "spyde/tests/migrated/test_report_edit_mode.py::TestRectArrowUncalibratedRoundTrip::test_rect_center_topleft_identity": 0.21793639997486025, + "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_arrow_tail_reshape_keeps_head_fixed": 0.21864279999863356, + "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_circle_radius_resize_persists_data_radius": 0.20579889987129718, + "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_rect_corner_resize_persists_center_and_size": 0.1996341998456046, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_dispatch_panel_id_resolves_to_spec_panel": 0.2036902999971062, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_event_style_target_aliases": 0.20953800005372614, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_fallback_persists_when_cell_not_live": 0.21876229997724295, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_invalid_size_errors_and_leaves_spec_untouched": 0.2109080000082031, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_invalid_target_errors_and_leaves_spec_untouched": 0.19855339999776334, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_live_push_no_rebuild": 0.2063908000709489, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_size_is_clamped": 0.19920649996493012, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_spec_round_trip_and_omitted_when_unset": 0.000982399913482368, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_spec_yaml_round_trip": 0.004776000045239925, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_verb_persists_on_spec_and_to_dict": 0.2040934000397101, + "spyde/tests/migrated/test_report_edit_mode.py::TestUncalibratedIdentity::test_drag_persists_pixel_values_identically": 0.2216214999789372, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_html_export_echoes_token_verbatim": 0.20007330004591495, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_html_export_omits_token_when_absent": 0.20043229998555034, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_markdown_export_echoes_token_verbatim": 0.20566680002957582, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_markdown_export_omits_token_when_absent": 0.1994070999789983, + "spyde/tests/migrated/test_report_export.py::TestInteractiveExport::test_interactive_has_sandboxed_iframes_no_bin": 0.27600399998482317, + "spyde/tests/migrated/test_report_export.py::TestInteractiveExport::test_interactive_offline_falls_back_to_img": 0.23374859988689423, + "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_folder_matches_zip_serialization": 0.23985210002865642, + "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_reexport_over_prior_export_ok": 0.22742759983520955, + "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_refuses_non_empty_foreign_dir": 0.20710710005369037, + "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_figure_resolvable_rebuilds_live": 0.20699440001044422, + "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_figure_unresolvable_is_offline_with_png": 0.00898879999294877, + "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_markdown_cell": 0.008465099963359535, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_html_has_title_imgs_captions": 0.21893649990670383, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_no_open_report_errors": 0.010921600041911006, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_skips_placeholder": 0.20399870013352484, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_temp_writes_unique_tempfile": 0.23819500009994954, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_one_panel_updates_only_that_panel": 0.2590346001088619, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unknown_cell_id_is_noop": 0.008297500084154308, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unknown_panel_id_is_noop": 0.18170179997105151, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unresolvable_source_keeps_old_snapshot": 0.19285920006223023, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_whole_figure_refresh_still_refreshes_every_panel": 0.2629238999215886, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_a_slides_only_cell_really_does_end_the_slide": 0.007101600058376789, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_add_cell_lazily_opens_report": 0.00790020008571446, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_add_markdown_cell": 0.00810480013024062, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_close_emits_closed_state": 0.008140300051309168, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_deleting_a_slide_head_keeps_the_slide": 0.008062500040978193, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_move_cell": 0.007978300214745104, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_clears_the_undo_stack": 0.008092300035059452, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_emits_open_state": 0.00793540000449866, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_template_flag": 0.007994699873961508, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_remove_cell": 0.007893200148828328, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_state_advertises_what_undo_would_do": 0.00803019991144538, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_the_next_slides_head_is_not_absorbed": 0.008178599993698299, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_the_slide_keeps_its_style_and_notes": 0.008525199955329299, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_does_not_split_the_slide_in_two": 0.008390499977394938, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_is_bounded": 0.008579700021073222, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_puts_the_cell_back_where_it_was": 0.007716199848800898, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_restores_a_deleted_cell": 0.008031399920582771, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_with_an_empty_stack_is_harmless": 0.008241400006227195, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_update_cell": 0.007773100049234927, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_bad_source_errors": 0.008457399904727936, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_fills_placeholder_in_place": 0.1903818000573665, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_snapshots_and_emits_report_figure": 0.1974576999200508, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_refresh_figure_reemits": 0.21033369994256645, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_set_caption": 0.19213169999420643, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_set_title": 0.008238900103606284, + "spyde/tests/migrated/test_report_handlers.py::TestReportOpenRebind::test_open_offline_when_source_gone_includes_png": 0.22561580000910908, + "spyde/tests/migrated/test_report_handlers.py::TestReportOpenRebind::test_save_then_open_rebinds_live": 0.2447784999385476, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_assemble_assets_empty_harvest_uses_baked_fallback": 0.19429440016392618, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_empty_harvested_png_still_writes_baked_asset": 0.2491698000812903, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_figure_with_no_pixels_is_recorded_as_dropped": 0.1996105998987332, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_finish_save_warns_on_dropped_figure": 0.198187000118196, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_save_remembers_path": 0.18539089988917112, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_save_with_no_renderer_reply_bakes_png": 0.2347169000422582, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_snapshots_completes_pending_save": 0.2509984999196604, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_build_figure_window_early_return_tears_down_stale": 0.19204249989707023, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_close_tears_down_controllers": 0.19293910008855164, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_close_when_never_opened": 0.008193800109438598, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_double_add_figure_two_cells": 0.20482189988251776, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_double_new_is_idempotent": 0.009267800021916628, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_remove_figure_cell_tears_down_its_window": 0.19267550006043166, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_accepts_bare_base64": 0.007829400012269616, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_at_index": 0.00754590006545186, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_creates_cell_and_emits_data_url": 0.016833300003781915, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_gif_ext_and_mime": 0.007653900072909892, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_jpeg_normalises_to_jpg": 0.008252699975855649, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_no_data_errors": 0.008579000015743077, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_unknown_ext_falls_back_to_png": 0.008140899939462543, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_size_cap_rejects_oversized_image": 0.009131000027991831, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_remove_image_cell_clears_held_bytes": 0.0074365000473335385, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_set_caption_edits_image_caption": 0.007693100138567388, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_update_cell_edits_image_caption": 0.00796519999857992, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_double_round_trip_stable": 0.0029485999839380383, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_and_figure_interleaved_distinguished": 0.0018972000107169151, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_cell_round_trips_through_md": 0.0018930000951513648, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_cell_serializes_with_ext_no_yaml": 0.0021128999069333076, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_nonpng_image_ref_parses_as_image_cell": 0.001250099972821772, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_png_ref_defaults_to_figure_in_parse": 0.0011082000564783812, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_end_to_end_add_save_reopen_via_handlers": 0.02630890009459108, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_figure_png_with_yaml_stays_figure": 0.02191419992595911, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_png_image_without_yaml_promoted_to_image_cell": 0.020158199942670763, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_save_and_reopen_restores_image_bytes": 0.027750000008381903, + "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_gif_export_uses_gif_mime": 0.030669800122268498, + "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_slides_export_inlines_image_data_url": 0.048899499932304025, + "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_static_export_inlines_image_data_url": 0.029358199913986027, + "spyde/tests/migrated/test_report_image_cell.py::TestImagePaste::test_paste_image_cell": 0.008546499884687364, + "spyde/tests/migrated/test_report_image_cell.py::TestImagePaste::test_paste_image_cell_missing_bytes_errors": 0.0076255000894889235, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_absent_leaves_unchanged": 0.37592190015129745, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_capped_at_120_chars": 0.36405850015580654, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_empty_string_clears": 0.377853799960576, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_layerspec_emits_styling_only_when_set": 0.0010640998370945454, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_linewidth_clamped": 0.3734197999583557, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_set_layer_persists_and_rebuilds": 0.3500941999955103, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_yaml_round_trip_live_cell": 0.37797789985779673, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_build_figure_window_creates_plot1d": 0.34857480006758124, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_length_mismatch_falls_back_to_index_axis": 0.36543390003498644, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_styling_reaches_live_state": 0.35605829989071935, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_text_sizes_apply_to_line_panel": 0.34481110016349703, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_axes_carries_x_axis_and_units": 0.3581094001419842, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_bad_current_data_returns_none": 0.34216570015996695, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_base_layer_styling_captured_from_live_plot1d": 0.34042309992946684, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_no_scalebar_or_colorbar_on_line_panel": 0.34492700011469424, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_map_holds_1d_array": 0.35279180004727095, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_produces_line_panel": 0.3581856999080628, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_tolerates_missing_plot1d_state": 0.3387667001225054, + "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_refresh_panel_resnapshots_curve": 0.3541992000536993, + "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_repfig_refresh_panel_handler_no_error": 0.366232099942863, + "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_report_refresh_figure_no_error": 0.3570011000847444, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_annotation_refused": 0.3543463001260534, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_callout_refused": 0.36545119993388653, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_time_callouts_refused": 0.35934810002800077, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_zoom_callout_refused": 0.34531719994265586, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_auto_clim_when_none": 0.0022850000532343984, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_downsamples_huge_frame": 0.5536231999285519, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_returns_decodable_png": 0.0035306999925523996, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_rgb_passthrough": 0.0016040998743847013, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_absent_key_yields_empty": 0.0007841999176889658, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_default_empty": 0.0007899000775068998, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_yaml_round_trip": 0.008055899990722537, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_zip_round_trip": 0.04314910003449768, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_primary_layer_helper": 0.0008223999757319689, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_yaml_has_no_python_object_tags": 0.0023064000997692347, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_yaml_round_trip": 0.005246699904091656, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_fingerprint_match_and_mismatch": 0.004828799865208566, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_fingerprint_missing_file": 0.0008234999841079116, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_signalref_dict_round_trip": 0.0007473001023754478, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_signalref_resolve_none_session": 0.0007303999736905098, + "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_bad_scalar_in_layer_records_error": 0.04663550003897399, + "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_malformed_spec_yaml_records_error_not_raises": 0.04952870006673038, + "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_spec_error_is_not_persisted": 0.004319500061683357, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_basic_markdown_and_figure": 0.0036964999744668603, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_code_fence_with_figure_lookalike_not_parsed": 0.002620199811644852, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_double_round_trip_stable": 0.002582100103609264, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_backtick_fence_round_trips_stable": 0.002959800069220364, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_backtick_fence_with_inner_triple_fence": 0.0021921000443398952, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_tilde_fence_with_inner_triple_tilde": 0.0022940998896956444, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_front_matter_fields": 0.0032001000363379717, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_inline_image_is_not_a_figure_cell": 0.002596299978904426, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_interleaved_cells_order_preserved": 0.0019858001032844186, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_non_spyde_html_comment_survives": 0.0025472999550402164, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_placeholder_parsing_with_and_without_caption": 0.0019186000572517514, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_tilde_fence_lookalike_not_parsed": 0.0025941000785678625, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_same_title_different_shape_rebinds_correct": 0.0008211000822484493, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_same_title_same_shape_is_ambiguous_offline": 0.0007607999723404646, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_shape_serialized_and_tolerant_of_absence": 0.0007496998878195882, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_title_match_no_shape_still_binds": 0.0007414000574499369, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_atomic_write_no_partial_file_on_failure": 0.008118699886836112, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_atomic_write_overwrites_existing": 0.029995599994435906, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_no_json_anywhere_in_container": 0.01954369992017746, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_write_read_round_trip": 0.029464999912306666, + "spyde/tests/migrated/test_report_move_cell.py::TestFigureCellMove::test_figure_cell_forward_drag": 0.18812129995785654, + "spyde/tests/migrated/test_report_move_cell.py::TestFigureCellMove::test_figure_cell_moves_and_keeps_snapshots": 0.19410470000002533, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_backward_drag_lands_before_target": 0.008213299792259932, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_drag_to_end_no_index": 0.007450800039805472, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_forward_drag_lands_before_target_not_after": 0.0086967998649925, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_forward_drag_onto_immediate_next_neighbor_is_noop": 0.008813399937935174, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_same_position_is_noop": 0.008765700156800449, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_unknown_cell_id_is_noop": 0.007890700013376772, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_empty": 0.0009873000672087073, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_input_list_not_mutated_in_place": 0.001102800015360117, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_first_slide_to_last": 0.0020344998920336366, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_middle_forward": 0.0015493001556023955, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_multicell_slide_block": 0.002035799901932478, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_noop_same_index": 0.001111100078560412, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_out_of_range_indices": 0.0011165998876094818, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_three_slides_move_last_to_first": 0.0021483999444171786, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_multicell_slides_via_verb": 0.00858020014129579, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_emits_state_and_marks_dirty": 0.009478099877014756, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_missing_indices_noop": 0.008318200125358999, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_out_of_range_noop": 0.008166899904608727, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_three_to_one": 0.007708700140938163, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_clear_drops_entry": 1.0827135000145063, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_no_cache_key_never_memoizes": 1.063666799920611, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_page_memoized_by_cell_and_identity": 0.528962800046429, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_swapped_result_identity_rebuilds": 1.0528596000513062, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_no_orientation_is_none": 0.0008209998486563563, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_resolves_raw_om_through_the_signal_ref": 0.0026037999195978045, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_resolves_vector_om_too": 0.0023925999412313104, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_specless_cell_is_none": 0.0009631998836994171, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_all_four_views_plus_the_map_are_built": 0.5572151000378653, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_density_images_are_png_urls_not_raw_bytes": 0.4724201001226902, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_over_cap_returns_none": 0.0025725000305101275, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_panels_are_in_axis_order": 0.5689329000888392, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_selfcontained_page": 0.5319620999507606, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExportHonoursMode::test_default_and_viewer_embed": 1.2385237000416964, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExportHonoursMode::test_image_mode_skips_the_viewer": 0.002306099981069565, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_cap_refuses_embed": 0.0025942999636754394, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_cloud_is_strided_not_truncated": 0.4719670000486076, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_payload_roundtrip": 0.6229308999609202, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_rows_are_nav_positions": 0.5163453001296148, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_image_mode_keeps_the_snapshot": 0.7235754999564961, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_orientation_cell_emits_live_explorer": 0.7214887000154704, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_vectors_win_when_a_tree_carries_both": 0.7429983000038192, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSpecMode::test_older_file_defaults_to_viewer": 0.0007200001273304224, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSpecMode::test_yaml_roundtrip": 0.0007398000452667475, + "spyde/tests/migrated/test_report_overlay_tint.py::TestBackendRender::test_tint_reaches_layer_state": 0.017936499905772507, + "spyde/tests/migrated/test_report_overlay_tint.py::TestBackendRender::test_untinted_layer_renders_as_before": 0.01789960020687431, + "spyde/tests/migrated/test_report_overlay_tint.py::TestComposeTintCycle::test_next_unused_skips_taken_color": 0.23322660010308027, + "spyde/tests/migrated/test_report_overlay_tint.py::TestComposeTintCycle::test_overlays_get_distinct_cycle_tints": 0.21027759998105466, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_blender_html_structure": 0.20104120019823313, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_blender_none_without_tint": 0.21149839996360242, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_interactive_export_swaps_in_blender": 0.2597763001685962, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_report_state_pixel_free_with_tint": 0.20858940004836768, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_untinted_cell_keeps_live_iframe": 0.27245169994421303, + "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_malformed_tint_ignored": 0.21132829994894564, + "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_set_and_clear_persist": 0.22697199997492135, + "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_tint_survives_alpha_edit": 0.2343085000757128, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_old_dict_without_tint_loads_none": 0.0008054000791162252, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_to_dict_emits_and_from_dict_reads": 0.0008789000567048788, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_to_dict_omits_absent_tint": 0.0009228000417351723, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_yaml_round_trip_carries_tint": 0.009216099977493286, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_yaml_without_tint_key_loads_none": 0.005408499971963465, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_add_cell_accepts_present_fields_inline": 0.007832799921743572, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_set_live_action_and_clear": 0.008293199934996665, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_slide_break_explicit_value": 0.008716500014998019, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_slide_break_toggles_and_emits": 0.008516100002452731, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_unknown_cell_is_noop": 0.007833999930880964, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_absent_live_action_is_none": 0.0024868998443707824, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_absent_slide_break_is_false_on_old_file": 0.001357399858534336, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_both_markers_on_one_cell": 0.002852899953722954, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_double_round_trip_stable_with_markers": 0.003577299998141825, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_live_action_round_trips": 0.003015300026163459, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_slide_break_round_trips": 0.0029486999846994877, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_slide_break_survives_zip": 0.03981270000804216, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_empty_slide_dropped": 0.054124899790622294, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_multiple_cells_per_slide": 0.04807209980208427, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_no_open_report_errors": 0.008999799960292876, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_shell_and_one_slide_per_group": 0.06299210002180189, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_with_figure": 0.2822274999925867, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_empty_doc_no_slides": 0.0008244001073762774, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_every_cell_lands_in_exactly_one_slide": 0.0009219000348821282, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_groups_by_slide_break": 0.0009188000112771988, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_leading_break_on_first_cell_is_noop": 0.0008661000756546855, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_no_breaks_single_slide": 0.0008642000611871481, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_assemble_assets_without_harvest_skips_gracefully": 0.22147419990506023, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_harvested_png_is_used_and_reused": 0.2269891999894753, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_primary_snapshot_never_returns_point_cloud": 0.22415660007391125, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_add_annotation_is_refused": 0.21975529997143894, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_compose_tile_is_refused_without_mutation": 0.21216029999777675, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_query_compose_offers_nothing": 0.22008560004178435, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_3d_creates_scene3d_cell_with_scene_and_snapshots": 0.21822220005560666, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_3d_without_orientation_result_errors": 0.1735979999648407, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_direction_follows_tree": 0.21660329995211214, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_report_state_stays_pixel_free": 0.21793209994211793, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DRefresh::test_panel_refresh_recomputes_point_cloud": 0.2637135999975726, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DRefresh::test_whole_figure_refresh_keeps_cell_live": 0.24567309999838471, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DReopen::test_reopen_without_result_goes_offline_gracefully": 0.2601747999433428, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DReopen::test_save_reopen_rebinds_live": 0.31053399993106723, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_dict_roundtrip": 0.0011716998415067792, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_scene_key_omitted_when_unset": 0.0010545998811721802, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_yaml_roundtrip": 0.009374000132083893, + "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_decode_tolerates_garbage": 0.0009354001376777887, + "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_empty_and_whitespace_encode_to_empty": 0.000927999964915216, + "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_roundtrip_multiline_markdown_unicode": 0.0010084999958053231, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_no_notes_no_attr": 0.041316699935123324, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_escaped_in_attr": 0.041336999856866896, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_not_rendered_as_visible_content": 0.06015589996241033, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_stashed_in_hidden_data_attr": 0.04436260007787496, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_absent_notes_default_on_old_file": 0.0012438000412657857, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_double_round_trip_stable": 0.0025906000519171357, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_coexist_with_all_markers": 0.00197199999820441, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_on_slide_first_cell_only": 0.0019809999503195286, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_round_trip_report_md": 0.00288909999653697, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_survive_zip": 0.03290579991880804, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_add_cell_accepts_notes_inline": 0.008475700044073164, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_clear_notes": 0.00766559992916882, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_notes_applies_to_slide_first_cell": 0.008578900014981627, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_set_notes_emits": 0.0082406000001356, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_state_emits_notes_field": 0.008413900155574083, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_unknown_cell_is_noop": 0.007808700087480247, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_meta_exposes_notes": 0.001002300065010786, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_empty": 0.0008990998612716794, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_off_first_cell": 0.0009156999876722693, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_via_grouping": 0.0009516000282019377, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_absent_markers_default_on_old_file": 0.002832300029695034, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_double_round_trip_stable": 0.003181600011885166, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_kind_and_style_and_break_on_one_cell": 0.005494800047017634, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_slide_kind_round_trips": 0.0044992000330239534, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_slide_style_round_trips": 0.004108900087885559, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_survives_zip": 0.030194399878382683, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_unknown_values_normalize_to_default": 0.00391289999242872, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_add_cell_accepts_kind_style_inline": 0.007518299971707165, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_kind_applies_to_slide_first_cell": 0.008098999853245914, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_kind_explicit": 0.008567300043068826, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_style": 0.007452500052750111, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_toggle_slide_kind": 0.008414699928835034, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_unknown_cell_is_noop": 0.009035799885168672, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_defaults_for_plain_content_slide": 0.0008666000794619322, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_empty_slide": 0.0008439001394435763, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_reads_kind_style_off_first_cell": 0.0008876000065356493, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_slides_meta_combines_with_grouping": 0.0009249999420717359, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_caption_renders_in_slides": 0.272710399935022, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_default_slide_markup_unchanged": 0.04888739995658398, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_slide_style_preset_class": 0.04902719985693693, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_title_slide_marked_and_big_title_css": 0.05972959997598082, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_add_figure_placeholder": 0.007690400001592934, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_figure_placeholder_roundtrips": 0.03134230000432581, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_photo_split_is_not_figure_like": 0.001879099989309907, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_set_split_figure_fills_figure_side": 0.22973509994335473, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_set_split_figure_non_split_is_noop": 0.21119830023963004, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_split_figure_side_is_refreshable": 0.24222639994695783, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_update_cell_edits_split_text": 0.007551600108854473, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_slides_export_renders_split_block": 0.007573499926365912, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_split_layout_orders_columns": 0.007881099940277636, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_stacked_layout_export": 0.00788199994713068, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_static_export_renders_split_block": 0.008444000035524368, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_add_split_cell": 0.007868299842812121, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_add_split_cell_default_layout": 0.008507100050337613, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout": 0.0082373998593539, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout_stacked": 0.007426499971188605, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout_unknown_normalizes": 0.007380400085821748, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitManagerZip::test_save_reopen_photo_split": 0.026284199906513095, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_cleans_up_figure_window": 0.23360009980387986, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_non_split_is_noop": 0.008446200052276254, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_on_empty_split_still_converts": 0.015659699914976954, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_roundtrips_through_zip": 0.27671970007941127, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_side_converts_to_markdown": 0.25920700014103204, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_then_edit_text_like_a_markdown_cell": 0.23762229993008077, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_photo_side_converts_to_markdown": 0.008821700001135468, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_empty_figure_side_round_trips": 0.0020001999801024795, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_empty_split_does_not_swallow_following_cell": 0.0032012000447139144, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_figure_side_round_trips": 0.002046800102107227, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_image_side_round_trips": 0.003144599962979555, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_plain_cells_not_mis_parsed_as_split": 0.001183499931357801, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_amid_plain_cells": 0.0020533999195322394, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_layout_normalizes": 0.0013401000760495663, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_text_with_image_ref_lookalike_stays_intact": 0.001973400008864701, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSlideColumns::test_non_split_cells_are_full_rows": 0.0008219998562708497, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSlideColumns::test_split_cell_is_own_cols_row": 0.0007989999139681458, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_figure_side_zip": 0.02145660005044192, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_photo_side_zip": 0.01602309988811612, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_png_photo_side_zip": 0.015836499980650842, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_absent_gives_defaults": 0.0008723000064492226, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_clamps_logo_height": 0.0008404998807236552, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_coerces_bools_and_ints": 0.0008333000587299466, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_drops_unknown_keys": 0.000839599990285933, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_fills_missing_keys": 0.0008475999347865582, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_long_text_is_capped_but_logo_is_not": 0.0008643000619485974, + "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_custom_theme_round_trips": 0.003354799933731556, + "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_pre_theme_document_loads_with_the_builtin_look": 0.0012343000853434205, + "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_untouched_deck_writes_no_theme_front_matter": 0.0013499000342562795, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_handlers_error_cleanly_with_no_open_report": 0.008032299927435815, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_reset_returns_the_builtin_look_not_the_saved_default": 0.029736600117757916, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_default_seeds_the_next_new_deck": 0.008719900040887296, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_theme_marks_dirty": 0.007773400051519275, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_theme_merges_rather_than_replaces": 0.008258800022304058, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_state_always_carries_a_full_theme": 0.0083263999549672, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_use_default_applies_the_saved_default": 0.0073908999329432845, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_clear_drops_entry": 0.017620200058445334, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_esm_text_cached_module_level": 0.001627999939955771, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_no_cache_key_never_memoizes": 0.017966700019314885, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_page_memoized_by_cell_and_identity": 0.011702500167302787, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_swapped_vectors_identity_rebuilds": 0.022590599954128265, + "spyde/tests/migrated/test_report_vectors_embed.py::TestCellResolution::test_vectors_for_cell_via_signal_ref": 0.004047500086016953, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_with_mode_stamps_spec[image]": 0.1990143998991698, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_with_mode_stamps_spec[viewer]": 0.20157880010083318, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_without_mode_asks_and_defers": 0.1626350999576971, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_plain_drop_is_unprompted": 0.2068534999853, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_spec_yaml_roundtrip": 0.0044343998888507485, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerHtml::test_over_cap_returns_none": 0.002601900021545589, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerHtml::test_selfcontained_page": 0.015396400005556643, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_4d_page_has_neither": 0.021795300068333745, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_single_slice_stack_gets_no_stack_panel": 0.007676000008359551, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_stack_gets_three_panels": 0.00897819991223514, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_stack_page_carries_a_phone_layout_too": 0.015894899959675968, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_page_wires_the_stack_panel": 0.018398899934254587, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_phone_layout_drops_the_stack_panel": 0.006690500071272254, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_slider_is_the_fallback_when_the_panel_cannot_build": 0.010250799939967692, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_stack_curve_is_vectors_per_slice": 0.003212000126950443, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExportHonorsMode::test_default_and_viewer_embed": 0.03998220001813024, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExportHonorsMode::test_image_mode_skips_viewer": 0.004161999910138547, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_4d_scan_is_unchanged": 0.0022501000203192234, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_stack_without_an_index_is_refused": 0.0015936001436784863, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_whole_slice_is_one_contiguous_range": 0.001623000018298626, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_index_covers_every_stack_position": 0.008674700045958161, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors::test_cap_refuses_embed": 0.002318799961358309, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors::test_payload_roundtrip": 0.0035481000086292624, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_default_mode_embeds_explorer": 0.19088609993923455, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_image_cell_keeps_snapshot": 0.20600780006498098, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_rebuild_reuses_memoized_page": 0.19387409987393767, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_viewer_cell_emits_live_explorer": 0.1979562999913469, + "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_action_matches_plot_allows_a_present_package": 0.001036300091072917, + "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_action_matches_plot_hides_a_missing_package": 0.001904499949887395, + "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_gate_is_wired_into_both_filters": 0.001742199994623661, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_every_declared_extra_exists_in_pyproject": 0.002115700044669211, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[atomap-atoms]": 0.0012974999845027924, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[exspy-eels]": 0.0017916999058797956, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[kikuchipy-ebsd]": 0.0013861000770702958, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_unknown_package_falls_back_to_a_plain_pip_line": 0.0010138999205082655, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_detects_a_missing_package": 0.0027799002127721906, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_detects_an_installed_package": 0.0014194999821484089, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_does_not_import_the_package": 0.0026555999647825956, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_result_is_cached": 0.001374599989503622, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_unresolvable_package_is_absent_not_an_error": 0.001447599963285029, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_list_requires_all_of_them": 0.002422400051727891, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_no_declaration_is_always_allowed": 0.0013651000335812569, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_single_name_as_a_string": 0.002511599799618125, + "spyde/tests/migrated/test_requires_package_gate.py::TestRealToolbarUnaffected::test_no_current_action_is_accidentally_gated": 0.0011844000546261668, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_2d_rectangle_axes_are_checked_independently": 0.0015703000826761127, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_clamp_rewriting_geometry_fires": 0.0018625999800860882, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_collapse_onto_one_position_fires": 0.0015431998763233423, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_moved_and_resized_in_one_event_fires": 0.001580399926751852, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_the_warning_carries_the_preceding_events": 0.001626300043426454, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_a_fast_flick_is_silent": 0.0014591999351978302, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_a_single_point_region_is_silent": 0.0014486000873148441, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_dragging_one_edge_is_silent": 0.0015677000628784299, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_dragging_the_lower_edge_is_silent": 0.001540499972179532, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_first_event_has_nothing_to_compare_against": 0.0015228998381644487, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_pure_translation_is_silent": 0.0017309999093413353, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_mismatched_axis_count_is_ignored_not_fatal": 0.0014579999260604382, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[None]": 0.0010306000476703048, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[bad2]": 0.0010204000864177942, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[bad3]": 0.001038899878039956, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[nonsense]": 0.0010905000381171703, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_trace_all_env_logs_every_event": 0.0018832999048754573, + "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_a_programmatic_over_cap_set_does_fire": 0.8824681000551209, + "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_a_span_at_the_cap_does_not_rewrite_every_event": 0.907709899940528, + "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_sliding_an_established_span_is_quiet": 0.9136155999731272, + "spyde/tests/migrated/test_scale_bar.py::TestScaleBar::test_physical_units_reach_panel_state": 0.8364225999685004, + "spyde/tests/migrated/test_scale_bar.py::TestScaleBar::test_pixel_units_give_no_scale": 0.642379799974151, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestComposite5DClose::test_closing_dp_removes_composite_and_cancels_inner_settles": 0.7089374999050051, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closed_selector_dropped_from_session_lookup_tables": 0.2306592999957502, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closing_signal_window_emits_selector_removed": 0.23828619997948408, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closing_signal_window_removes_selector_from_multiplot_manager": 0.23533329996280372, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_navigator_and_other_signal_window_survive": 0.2307359001133591, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_queued_update_for_closed_selector_does_not_raise": 0.23417400009930134, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_second_selector_survives_closing_first_signal_window": 0.5590117002138868, + "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_a_write_through_the_composite_reaches_the_active_selector": 0.683240000042133, + "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_the_1d_composite_shares_with_both_sub_selectors": 0.671289800084196, + "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_the_three_views_are_one_dict": 0.6834782999940217, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_only_crosshair_visible_initially": 0.6883971000788733, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_selector_info_emitted": 0.6773178000003099, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_toggle_emits_updated_info": 0.6850641999626532, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_toggle_to_integrate_swaps_visibility": 0.6866019999142736, + "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_azimuth_preserved_low_kv": 0.0027115000411868095, + "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_center_offset_applied": 0.002155900001525879, + "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_tem_is_near_noop_in_shape": 0.0031986000249162316, + "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_none_when_no_pairs": 0.0014352001016959548, + "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_recovers_offset_center_no_direct_beam": 0.0021630999399349093, + "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_robust_to_unpaired_spots": 0.0019767999183386564, + "spyde/tests/migrated/test_sem_geometry.py::TestPrepareSemVectors::test_end_to_end_recovers_g": 0.0015826999442651868, + "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_exact_roundtrip": 0.002258000080473721, + "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_linear_overestimates_at_high_angle": 0.0019357000710442662, + "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_small_angle_linear_limit": 0.0023882000241428614, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[10.0-0.12204]": 0.0026618000119924545, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[200.0-0.02508]": 0.0025603000540286303, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[30.0-0.06979]": 0.0025883998023346066, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[5.0-0.17328]": 0.00262529996689409, + "spyde/tests/migrated/test_shm_read_robust.py::TestReadSharedArrayRobust::test_roundtrip_after_write": 0.0010908000404015183, + "spyde/tests/migrated/test_shm_read_robust.py::TestReadSharedArrayRobust::test_unwritten_buffer_raises_clean_valueerror": 0.0011792998993769288, + "spyde/tests/migrated/test_shm_read_robust.py::test_future_from_signal_no_ambiguous_truth": 0.0010477000614628196, + "spyde/tests/migrated/test_shm_read_robust.py::test_worker_does_not_skip_cancelled_future_but_result_is_harmless": 0.0010401998879387975, + "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_load_emits_signal_type_info": 0.43345529993530363, + "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_set_empty_type_reverts_to_generic": 0.7872760000173002, + "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_set_signal_type_recasts_and_reemits": 0.7835936000337824, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_movie_navigator_is_1d": 0.24764029996003956, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_shift_click_two_1d_navigators_builds_stacked_figure": 0.3149196000304073, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_single_chip_does_not_build_stacked": 0.2548694999422878, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_stacked_cursor_starts_at_current_selector_index": 0.45036220003385097, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedDrag::test_drag_mirrors_to_the_other_row": 0.4767062000464648, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedDrag::test_drag_row2_line_moves_real_selector_index": 0.41024220013059676, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedProgrammaticSync::test_index_hook_is_installed_on_the_real_selector": 0.3214156999019906, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedProgrammaticSync::test_programmatic_step_syncs_every_row_line": 0.4246521001914516, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_closing_the_window_detaches_the_hook": 0.27171469992026687, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_rebuild_replaces_the_prior_cursor": 0.2804755000397563, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_switching_back_to_single_navigator_tears_down": 0.28794599999673665, + "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_cif_reference_gives_absolute_strain": 0.2249692998593673, + "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_families_exclude_forbidden": 0.08622350008226931, + "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_snap_corrects_magnitude_to_ideal": 0.09256400016602129, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_commit_makes_new_signal_tree": 0.09801070007961243, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_component_toggle_resolves_controller_via_dispatch_window_id": 0.02678160008508712, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_controller_cif_reference_then_region": 0.18847629998344928, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_excludes_zero_beam": 0.018360600108280778, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_selector_uses_distinct_color_and_suppresses_toolbar": 0.004491200088523328, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_window_gets_distinguishing_title": 0.000969399930909276, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_strain_run_emits_window_and_attaches_controller": 0.078223199932836, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_strict_mode_double_mount_builds_only_one_controller": 0.13080339995212853, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainDisplay::test_build_strain_figure_map_and_ref": 0.028790699900127947, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainDisplay::test_each_component_builds": 0.05578669998794794, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainField::test_linear_gradient_field": 0.018563899910077453, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainField::test_principal_strain_axes": 0.00090560014359653, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFieldVectorized::test_recovers_known_gradient": 0.013817900093272328, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFieldVectorized::test_vectorized_matches_loop": 0.0562641000142321, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_asymmetric_detection_still_fits": 0.0020289000822231174, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_center_offset_does_not_leak_into_strain": 0.002979799988679588, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_friedel_matches_minus_g": 0.006380300037562847, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_pure_rotation_is_not_strain": 0.003527700202539563, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_recovers_known_strain": 0.00247600011061877, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_too_few_matches_returns_none": 0.0009544001659378409, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_handler_listens_on_double_click": 0.0010732001392170787, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_hit_test_is_scale_independent": 0.0012276999186724424, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_toggles_selection_and_fires_callback": 0.0013900999911129475, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_off_reference_draws_displacement_arrows": 0.0013563999673351645, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_reference_pixel_starts_with_nothing_selected": 0.0011576000833883882, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_selection_carries_forward_when_reference_moves": 0.0017319000326097012, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_selection_carry_forward_drops_peak_outside_match_radius": 0.0013614000054076314, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_strain_run_without_vectors_errors": 0.0008778000483289361, + "spyde/tests/migrated/test_strain_threaded.py::TestStrainThreaded::test_recompute_applies_via_dispatch_thread": 0.036719099967740476, + "spyde/tests/migrated/test_strain_threaded.py::TestStrainThreaded::test_superseded_recompute_is_dropped": 0.5540509999264032, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_done_callback_delivers_async": 0.011226400034502149, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_future_is_cancellable": 0.007832400035113096, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_reads_a_lazy_crop_through_same_path": 0.04121359996497631, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_returns_materialised_frame": 0.010791199980303645, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_synchronous_scheduler_no_nested_pool": 0.019214899861253798, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_band_count_matches_cubic_families": 0.007135199964977801, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_different_orientation_gives_a_different_pattern": 0.14550650003366172, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_orientation_field_has_two_distinct_grains": 0.13657550001516938, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_patterns_are_not_mirror_symmetric": 0.013935300055891275, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_same_orientation_gives_the_same_pattern": 0.15442799997981638, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_shape_and_dtype": 0.014142800006084144, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_families_overlap_as_intended": 0.0009340000106021762, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_ground_truth_lines_readable": 0.007622600067406893, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_ka_kb_ratio_recoverable_for_an_isolated_family": 0.015731100109405816, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_lines_peak_at_their_real_energies": 0.008097000070847571, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_shape_and_calibration": 0.009531600051559508, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_concentration_maps_are_asymmetric_and_distinct": 0.010077700018882751, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_edge_intensity_tracks_its_concentration_map": 0.009743800037540495, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_edges_step_up_at_their_onsets": 0.009774800040759146, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_ground_truth_is_plain_python": 0.007446000003255904, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_shape_and_calibration": 0.008245099917985499, + "spyde/tests/migrated/test_synthetic_data.py::TestNoOptionalExtrasRequired::test_generators_work_without_exspy_or_kikuchipy": 0.022232400020584464, + "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_ebsd]": 0.07074369990732521, + "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_eds]": 0.05846970004495233, + "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_eels]": 0.0784908999921754, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_fft_opens_output_window": 0.7584571000188589, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_line_profile_opens_output_window": 0.7571546999970451, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_unknown_action_reports_error": 0.737085800152272, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_virtual_imaging_opens_output_window": 0.7617915000300854, + "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_imports_and_shapes": 0.010709799942560494, + "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_wizard_commit_creates_tree": 0.034076299984008074, + "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_wizard_gen_guard_and_idempotent_remove": 0.0010832998668774962, + "spyde/tests/migrated/test_test_hold.py::TestActionWiring::test_the_release_action_is_registered_and_importable": 0.0030947000486776233, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_EVERY_caller_parks_not_just_the_first": 0.4169429000467062, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_a_forgotten_release_cannot_hang_the_run": 0.3132486999966204, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_after_release_later_chunks_do_not_stutter": 0.008334699901752174, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_below_the_threshold_does_not_park": 0.0035659001441672444, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_parks_at_the_threshold_and_resumes_on_release": 0.41238049999810755, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_release_before_the_hold_is_reached": 0.005012100096791983, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_an_unnamed_point_is_not_held": 0.0037303001154214144, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_hold_point_returns_immediately": 0.003607100108638406, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_release_of_an_unconfigured_hold_is_false_not_an_error": 0.0034995999885722995, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_unset_means_not_armed": 0.004118999931961298, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_a_bare_name_holds_at_once": 0.0036643999628722668, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_absolute_count": 0.0035752998664975166, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_fraction_of_total": 0.003569600055925548, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_rubbish_is_ignored_not_raised": 0.0037910001119598746, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_several_points": 0.0034964000806212425, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_burst_coalesces_while_dispatcher_is_busy": 0.11640429985709488, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_dispatcher_is_a_single_shared_lane": 0.0028172999154776335, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_min_throttle_interval_enforced": 0.001164599903859198, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_settle_timer_armed_on_move_and_clears": 0.16279060009401292, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_update_data_uses_dispatcher_not_debounce_timer": 0.0027327999705448747, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Arctan]": 0.014218399999663234, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Erf]": 0.01753489999100566, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Exponential]": 0.006590499775484204, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[GaussianHF]": 0.01564379991032183, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Gaussian]": 0.022282599937170744, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[HeavisideStep]": 0.005144800059497356, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Logistic]": 0.022468200069852173, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Lorentzian]": 0.02173080004286021, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Offset]": 0.001396800042130053, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[PowerLaw]": 0.006338300067000091, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Arctan]": 0.06674030004069209, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Erf]": 0.022238500183448195, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Exponential]": 0.009695999906398356, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[GaussianHF]": 0.023934299941174686, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Gaussian]": 0.031250399886630476, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[HeavisideStep]": 0.012635500053875148, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Logistic]": 0.026640100055374205, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Lorentzian]": 0.023036999977193773, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Offset]": 0.0033036000095307827, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[PowerLaw]": 0.01016100007109344, + "spyde/tests/migrated/test_torch_components.py::TestBatching::test_batched_equals_looping_one_at_a_time": 0.007447600015439093, + "spyde/tests/migrated/test_torch_components.py::TestBatching::test_offset_broadcasts_over_the_signal_axis": 0.0009603998623788357, + "spyde/tests/migrated/test_torch_components.py::TestBatching::test_one_call_evaluates_every_position_independently": 0.0011297998717054725, + "spyde/tests/migrated/test_torch_components.py::TestEvaluateSpec::test_inactive_component_contributes_nothing": 0.0009982000337913632, + "spyde/tests/migrated/test_torch_components.py::TestEvaluateSpec::test_sums_active_components_and_matches_hyperspy": 0.03737020003609359, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Arctan]": 0.013883800012990832, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Erf]": 0.018252999987453222, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Exponential]": 0.008633099845610559, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[GaussianHF]": 0.020335700013674796, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Gaussian]": 0.04886869993060827, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[HeavisideStep]": 0.006905199959874153, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Logistic]": 0.03199389996007085, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Lorentzian]": 0.024742199922911823, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Offset]": 0.001781499944627285, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Polynomial]": 0.008750900044105947, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[PowerLaw]": 0.00696070003323257, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Arctan]": 0.014767200103960931, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Erf]": 0.017737000016495585, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Exponential]": 0.007026499952189624, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[GaussianHF]": 0.017419600044377148, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Gaussian]": 0.024011899949982762, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[HeavisideStep]": 0.0055986999068409204, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Logistic]": 0.026955300010740757, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Lorentzian]": 0.020417800056748092, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Offset]": 0.0013289999915286899, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Polynomial]": 0.0074495000299066305, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[PowerLaw]": 0.005131800076924264, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Arctan]": 0.013965599937364459, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Erf]": 0.031131799914874136, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Exponential]": 0.013446600059978664, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[GaussianHF]": 0.026499500148929656, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Gaussian]": 0.04320189997088164, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[HeavisideStep]": 0.00630409992299974, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Logistic]": 0.029996799887157977, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Lorentzian]": 0.02686149999499321, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Offset]": 0.001334299915470183, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Polynomial]": 0.007314300048165023, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[PowerLaw]": 0.005984200048260391, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Arctan]": 0.01770379999652505, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Erf]": 0.02158720011357218, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Exponential]": 0.009234199998900294, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[GaussianHF]": 0.022309099906124175, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Gaussian]": 0.03616749995853752, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[HeavisideStep]": 0.006898800027556717, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Logistic]": 0.030661000055260956, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Lorentzian]": 0.028059900039806962, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Offset]": 0.0019681999692693353, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[PowerLaw]": 0.010082699940539896, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Arctan]": 0.015388199943117797, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Erf]": 0.02109940000809729, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Exponential]": 0.008535000146366656, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[GaussianHF]": 0.021679500001482666, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Gaussian]": 0.030759000102989376, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[HeavisideStep]": 0.006529800011776388, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Logistic]": 0.033136900048702955, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Lorentzian]": 0.025230000028386712, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Offset]": 0.0014673999976366758, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[PowerLaw]": 0.006032399949617684, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Arctan]": 0.03465720021631569, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Erf]": 0.03214599995408207, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Exponential]": 0.011590599897317588, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[GaussianHF]": 0.022037900052964687, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Gaussian]": 0.03239980002399534, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[HeavisideStep]": 0.03412690002005547, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Logistic]": 0.14575050002895296, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Lorentzian]": 0.03312529996037483, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Offset]": 0.0014417999191209674, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[PowerLaw]": 0.006122200051322579, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Arctan]": 0.03166780003812164, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Erf]": 0.039630900137126446, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Exponential]": 0.016523400088772178, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[GaussianHF]": 0.04279810015577823, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Gaussian]": 0.062375100096687675, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[HeavisideStep]": 0.012359800050035119, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Logistic]": 0.06360490003135055, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Lorentzian]": 0.04880359978415072, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Offset]": 0.002167199971154332, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[PowerLaw]": 0.012153599876910448, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[1]": 0.006608500028960407, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[2]": 0.007530400063842535, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[3]": 0.015300500090233982, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_needs_an_explicit_order": 0.0009590999688953161, + "spyde/tests/migrated/test_torch_components.py::TestPowerLawEdgeCases::test_no_nan_gradient_from_the_dead_branch": 0.005854700109921396, + "spyde/tests/migrated/test_torch_components.py::TestPowerLawEdgeCases::test_zero_below_the_cutoff": 0.00620370008982718, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_inactive_unsupported_component_does_not_block": 0.0019513001898303628, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_supports_reports_false_rather_than_dropping_a_component": 0.0018578001763671637, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_supports_reports_true_for_a_portable_model": 0.0018482999876141548, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_unknown_component_names_what_is_available": 0.0019207998411729932, + "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_columns_follow_the_packed_order": 0.0028899998869746923, + "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_evaluate_with_grad_matches_autodiff": 0.007271999958902597, + "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_reports_analytic_availability": 0.0007911999709904194, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_close_all_tears_down_tutorial_trees": 3.1178635999094695, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_navigation_by_name": 1.8908822999801487, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_unknown_name_emits_error": 0.01044870016630739, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_works_under_simulated_packaged_env": 0.7998589999042451, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_repeat_load_is_idempotent": 3.1486349999904633, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_session_begin_is_not_test_gated": 0.0018123999470844865, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_tutorial_load_not_in_test_actions_gate": 0.0017236999701708555, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_all_loaders_present_in_map": 0.007697900058701634, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_find_vectors_shape": 0.6305983999045566, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_movie_shape_is_small_and_insitu": 0.6047433000057936, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_multiphase_shape": 0.6457667999202386, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_navigation_shape": 3.3733910999726504, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_orientation_shape": 0.6347328000701964, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_spectroscopy_shape": 0.7951079000486061, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_strain_shape_is_bounded": 1.4754274999722838, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_close_all_ends_the_session": 1.0767559999367222, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_derived_result_windows_are_closed_too": 2.9350497000850737, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_only_active_session_records": 1.0721004001097754, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_user_file_backed_tree_is_never_closed": 2.988731100107543, + "spyde/tests/migrated/test_units.py::test_no_dollar_or_braces_remain": 0.0012722000246867537, + "spyde/tests/migrated/test_units.py::test_pyxem_latex_angstrom_macro_becomes_unicode": 0.0012977001024410129, + "spyde/tests/migrated/test_units.py::test_reciprocal_angstrom_latex_becomes_unicode": 0.002137600095011294, + "spyde/tests/migrated/test_units.py::test_reciprocal_nm_and_plain_units": 0.0012828001054003835, + "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_emits_gpu_status_result": 0.008773100096732378, + "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_reports_no_gpu_without_torch": 0.008833300089463592, + "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_staged_handler_registered": 0.0016145000699907541, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_defaults_to_stable": 0.008856200147420168, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_dispatch_action_routes_to_settings": 0.013643300044350326, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_restores_persisted_channel_on_restart": 0.03740909998305142, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_set_update_channel_persists": 0.038402800098992884, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_set_update_channel_rejects_invalid": 0.013333500013686717, + "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_disk_centered_on_vector": 0.0012996000004932284, + "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_frame_changes_with_nav_position": 0.0012932000681757927, + "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_frame_disk_value_is_intensity": 0.09041540010366589, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_1x1_region_equals_render_frame": 0.0021823999704793096, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_bounds_clamped_and_ordered": 0.0032012000447139144, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_full_region_sums_all_frames": 0.0051414999179542065, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_no_full_dataset_compute": 0.0016796999843791127, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_two_position_region_equals_sum_of_frames": 0.0017432000022381544, + "spyde/tests/migrated/test_vector_disks.py::TestVectorVirtualImaging::test_intensity_weighted_matches_manual_sum": 0.00161210005171597, + "spyde/tests/migrated/test_vector_disks.py::TestVectorVirtualImaging::test_roi_radius_excludes_far_vectors": 0.0009920999873429537, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_chunked_matches_serial": 2.125437800073996, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_chunked_progress_and_stop": 1.708540500025265, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_smoothed_strain_reduces_noise_keeps_edges": 0.059435099945403636, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_strain_component_maps": 0.0008638000581413507, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_to_orientation_map_and_ipf": 0.021846800111234188, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_tv_beats_raw_at_high_noise": 0.008543699979782104, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_uniform_field_recovered": 0.6784240000415593, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_intensity_scale_invariant": 0.13255829992704093, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_recovers_clean_strain": 0.05292320006992668, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_recovers_strain_across_weightings": 0.2172118000453338, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_robust_at_raw_count_scale": 0.06547709985170513, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_robust_to_missing_and_spurious": 0.0704753000754863, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_strain_respects_cap": 0.3171733000781387, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_too_few_vectors_returns_none": 0.001190899987705052, + "spyde/tests/migrated/test_vector_orientation.py::TestFriedelQC::test_skewed_vectors_high_asymmetry": 0.0017145000165328383, + "spyde/tests/migrated/test_vector_orientation.py::TestFriedelQC::test_symmetric_strain_low_asymmetry": 0.0017164999153465033, + "spyde/tests/migrated/test_vector_orientation.py::TestIntegrationAg::test_recovers_orientation_and_strain": 15.120775800081901, + "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_identity": 0.001092500169761479, + "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_rotation": 0.0010605999268591404, + "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_translation": 0.0010395999997854233, + "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_clamps_excess_strain": 0.0010649999603629112, + "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_forbids_reflection": 0.0010142000392079353, + "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_within_bound_unchanged": 0.0011842000531032681, + "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_progress_and_shm_preview": 13.051769300014712, + "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_recovers_known_strain": 13.456247700145468, + "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_stop_flag_aborts": 9.823722200118937, + "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_fit_field_prefers_gpu_then_falls_back": 0.0028598998906090856, + "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_generate_activates_live_refine_overlay": 11.826642000232823, + "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_generate_then_run": 12.837129999883473, + "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_run_without_library_errors_gracefully": 2.7552490999223664, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_pure_rotation_in_theta": 0.001731499913148582, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_rotation_parked_in_A_is_recovered": 0.0012158999452367425, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_rotation_split_between_theta_and_A_adds_up": 0.0009112998377531767, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_strain_is_unchanged_by_the_split": 0.0012450999347493052, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_symmetric_stretch_does_not_tilt_the_angle": 0.0009161998750641942, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_full_template_beats_a_sparse_exactly_matching_decoy": 0.024065000005066395, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_picks_the_matching_geometry_over_a_different_shell": 0.002622899948619306, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_recovers_the_in_plane_angle": 0.0027289000572636724, + "spyde/tests/migrated/test_vector_overlay.py::TestVectorOverlay::test_overlay_attached_with_pixel_offsets": 2.2319323000265285, + "spyde/tests/migrated/test_vector_overlay.py::TestVectorOverlay::test_overlay_updates_when_navigator_moves": 2.047208199859597, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_crosshair_indices_render_single_frame": 0.003059700015000999, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_region_differs_from_pointer": 0.0047067999839782715, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_region_grid_indices_sum_frames": 0.006447500083595514, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_single_cell_grid_equals_render_frame": 0.003090500016696751, + "spyde/tests/migrated/test_vector_virtual_imaging.py::TestVectorVirtualImaging::test_add_vector_vi_computes_from_vectors": 2.483100299956277, + "spyde/tests/migrated/test_vector_virtual_imaging.py::TestVectorVirtualImaging::test_count_vs_intensity_and_shape_change": 2.4458425999619067, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_current_t_none_for_4d": 0.09503870003391057, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_current_t_reads_source_index": 0.17561179993208498, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_reduce_returns_2d_current_slice_for_stack": 0.183362300042063, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_count_weighting_differs_from_intensity": 0.17384179995860904, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_reduce_to_5d_pushes_and_returns_none": 0.15652579988818616, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_array_rectangle": 0.1547931000823155, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_array_returns_full_stack": 0.17408459994476289, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_slice_matches_reduce_for_each_t": 0.1587592998985201, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSpawnTree::test_add_vvi_spawns_navigable_3d_tree": 1.5032019001664594, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSpawnTree::test_roi_move_recomputes_full_stack": 1.8065188999753445, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_rect_handles_reversed_corners": 0.0852370000211522, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_rect_image": 0.08766879991162568, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_roi_image_intensity_weighted": 0.09617319994140416, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_absent_on_raw_diffraction": 0.010920499917119741, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_dense_actions_excluded_on_vectors_image": 0.015820199972949922, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_dense_actions_present_on_raw_diffraction": 0.011607599910348654, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_hidden_until_vectors_attach": 0.014615899883210659, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_other_actions_unaffected": 0.011130600003525615, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_present_on_vectors_image": 0.009674599976278841, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_a_4d_result_registers_no_hook": 0.0009966000216081738, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_a_repeat_of_the_same_slice_does_not_repaint": 0.0012889000354334712, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_moving_time_repaints_the_count_map": 0.0014248000225052238, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_reattaching_does_not_double_paint": 0.0013375998241826892, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_the_time_navigator_gets_per_slice_totals": 0.0012443000450730324, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_an_unpainted_stack_navigator_is_still_found": 0.08721360005438328, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_finalize_never_pushes_a_2d_map_onto_the_1d_navigator": 0.0860541999572888, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_render_fn_goes_to_the_dp_and_the_count_map_to_the_navigator": 0.09594439982902259, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_the_count_fn_returns_that_slices_count_map": 0.12265039992053062, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_the_intermediate_navigator_is_not_a_signal_plot": 0.09139329998288304, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_at_nav_picks_current_slice_only": 0.0011054999195039272, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_at_nav_stale_lead_falls_back": 0.0010871000122278929, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_count_map_at_t_matches_series_and_no_crash": 0.0014412999153137207, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_count_map_series_is_3d_per_slice": 0.0011811000294983387, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_kxy_at_nav_shape": 0.0013100000796839595, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_n_time_and_shapes": 0.0012512000976130366, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_virtual_image_series_disk_is_3d": 0.0013964001554995775, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_virtual_image_series_rect_is_3d": 0.0013065000530332327, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_column_names_in_metadata": 0.0042848000302910805, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_empty_vectors_roundtrip": 0.6775068000424653, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_non_vectors_signal_rejected": 0.00267880002502352, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_signal_type_tag": 0.004274599952623248, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_to_from_dense_4d": 0.005606900085695088, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_to_from_dense_5d": 0.004443099955096841, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_load_reconstructs_result_tree": 0.39896899997256696, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_result_root_is_placeholder_not_rendered": 0.4057060001650825, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_save_picks_dense_carrier": 0.2980694001307711, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_rendered_frame_after_reload": 0.3286429999861866, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_zspy_4d": 0.3714223999995738, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_zspy_5d": 0.5785805000923574, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_contrast_from_full_res_not_overview": 0.4248218998545781, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_large_frame_auto_enables_tile_mode": 0.4220467999111861, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_live_update_swaps_frame_keeps_view": 0.37079880002420396, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_small_frame_stays_untiled": 0.013694300083443522, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_figure_has_n_axes": 0.012757399934343994, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_no_data_returns_none": 0.0006761000258848071, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_preserves_window_order_not_click_order": 0.010812500026077032, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_register_views_rgb_and_scalar": 0.011653199908323586, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_tile_views_emits_one_tiled_figure": 0.012036999920383096, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_tile_views_skips_single_selection": 0.000808900105766952, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_add_virtual_image_creates_colored_vi_and_emits_chip": 0.5780010998714715, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_colors_cycle_across_adds": 1.2315910998731852, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_remove_chip_closes_window_and_drops_it": 0.5455067999428138, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_type_change_rebuilds_the_roi_shape": 0.9649029999272898, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_update_vi_applies_caret_params_live": 0.7396804000018165, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_at_returns_all_time_steps": 0.004217399982735515, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_at_t_filters_correctly": 0.002377399941906333, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_kdtree_t_param": 0.01404280005954206, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_n_time": 0.006507799960672855, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_per_frame_roi_performance": 1.6434589000418782, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_matches_per_t": 0.01024819992017001, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_performance": 2.8514205999672413, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_shape": 0.007646599900908768, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_t_param_isolates_frame": 0.006944700144231319, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_build_kdtree_empty_buffer": 0.0008101998828351498, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_build_kdtree_sets_internal_tree": 0.002652800176292658, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_direct_roi_performance": 0.12151809979695827, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_build_performance": 0.10671770002227277, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_empty_buffer": 0.0008512000786140561, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_fallback_when_not_built": 0.0016690000193193555, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_annulus": 0.002451400039717555, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_count_mode": 0.00206509989220649, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_large_roi": 0.002969799912534654, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_small_roi": 0.003916400019079447, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_no_hits_in_roi": 0.0015055000549182296, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_query_performance": 0.10708059999160469, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_large_dataset_direct_roi_under_budget": 1.3385733999311924, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_annulus_excludes_inner": 0.001362500013783574, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_count_mode": 0.0013992000604048371, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_empty_buffer_returns_zeros": 0.0008333000587299466, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_intensity_sum_matches_manual": 0.0016883999342098832, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_known_positions_exact": 0.0009200001368299127, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_large_radius_covers_all_vectors": 0.0014384998939931393, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_non_square_nav": 0.0015338999219238758, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_output_shape": 0.004095300100743771, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_single_nav_position": 0.0009500000160187483, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_sum_matches_manual_count": 0.0017972999485209584, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_zero_radius_no_hits": 0.002505999873392284, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_context_manager_emits_start_then_stop": 0.000984800048172474, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_context_manager_emits_stop_on_exception": 0.0009000999853014946, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_none_window_id_is_a_silent_noop": 0.0008608999196439981, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayErrorPath::test_failed_fill_still_emits_stop": 6.147494200034998, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayNavFill::test_start_then_stop_bracket_the_progressive_nav_fill": 0.6419111000141129, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayNavFill::test_stop_message_carries_same_window_id_as_start": 0.6427306000841781, + "spyde/tests/migrated/test_wizard_double_fire.py::TestFindVectorsPreviewDoubleFire::test_strict_mode_leaves_exactly_one_live_preview": 0.608435400063172, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_controllers_declare_parameters": 0.001139800064265728, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_czb_defaults": 0.0011850000591948628, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_fv_defaults_match_action": 0.0011833999305963516, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_om_defaults_match_action": 0.0011508000316098332, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_strain_components": 0.001244500046595931, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_vom_defaults": 0.0011738999746739864, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_vom_fit_defaults": 0.0011807999107986689, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_every_wizard_key_has_a_schema": 0.0019866001093760133, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_schema_is_a_copy": 0.0017278000013902783, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_unknown_key_raises": 0.0017772999126464128, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[czb]": 0.0014146000612527132, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[fv]": 0.002243499970063567, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[om]": 0.0019717998802661896, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[strain]": 0.001420800108462572, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[vom]": 0.0014323999639600515, + "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_skips_bare_future": 0.23379620001651347, + "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_skips_future_bearing_object_array": 0.1975493001518771, + "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_still_paints_real_array": 0.21724509994965047, + "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_open_missing_zspy_emits_error": 0.024677900015376508, + "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_open_zspy_folder_loads": 0.29422539996448904, + "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_zspy_is_self_describing": 0.0006704999832436442, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_dataset_size_walks_zspy_dir": 0.1706016001990065, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_missing_zspy_dir_is_not_supported": 0.004015999962575734, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_regular_file_still_works": 0.004163899924606085, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_zspy_dir_is_supported_dataset": 0.2959348999429494, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_zspy_in_supported_exts": 0.0011391999432817101, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_explicit_hspy_extension_kept": 0.24171709991060197, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_no_extension_defaults_to_zspy": 0.3920932998880744, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_save_resolves_active_window_when_no_plot": 0.5053908999543637, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_save_signal_writes_zspy_folder": 0.513564599910751 +} \ No newline at end of file From 7ed58517f66f03ec594f4e396f7a6b595154f75b Mon Sep 17 00:00:00 2001 From: Carter Francis Date: Fri, 7 Aug 2026 14:03:55 -0500 Subject: [PATCH 5/5] ci: weight-based slow-slice binning + npm/browser caches The validation run showed round-robin parking progressive_signal_preview's ~7-min slot (2.3x its in-file time -- slow batch finalize on CI) with four other files in one 12.3-min group. SLOW_SPECS now carries a measured slot-weight per file and the slow slice greedy-bin-packs by weight, so that spec rides alone and every bin levels near it; editing a weight rebalances. Verified: the 10 groups partition all 137 spec files, 0 dupes / 0 missing. npm + Playwright-browser caches trim the ~2-min per-job e2e setup. --- .github/workflows/build.yml | 21 ++++++- electron/playwright.config.ts | 110 ++++++++++++++++++++-------------- 2 files changed, 84 insertions(+), 47 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 597ca9c4..b71218b2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -186,6 +186,8 @@ jobs: uses: actions/setup-node@v4 with: node-version: "24" + cache: npm + cache-dependency-path: electron/package-lock.json - name: Install Electron dependencies working-directory: electron @@ -218,6 +220,8 @@ jobs: uses: actions/setup-node@v4 with: node-version: "24" + cache: npm + cache-dependency-path: electron/package-lock.json - name: Install Electron dependencies working-directory: electron @@ -235,9 +239,10 @@ jobs: # Duration-balanced slicing, NOT Playwright --shard: --shard balances by # FILE COUNT and reliably parks one shard at 2-3x the others (measured 25.8 # vs 8.0 min on adjacent shards). SLOW_SPECS in electron/playwright.config.ts - # lists every >=45s file slowest-first; SPYDE_E2E_GROUP=k/n takes every n-th - # file of the slice round-robin, which spreads duration evenly. Measured - # per-group: fast ~7 min, slow ~4.5-8 min, plus ~1.5 min setup. + # carries a measured slot-weight per file; SPYDE_E2E_GROUP=k/n bin-packs the + # slow slice by those weights (fast round-robins — its files are all small). + # Validation run 2026-08-07: fast groups 7.8-8.7 min wall; slow bins level + # out near the ~7-min progressive_signal_preview slot, worst ~9 min wall. # # retries are 0 in CI (playwright.config.ts reads CI) — a retry of a # timed-out app boot doubles the damage. Best-effort for now @@ -270,6 +275,8 @@ jobs: uses: actions/setup-node@v4 with: node-version: "24" + cache: npm + cache-dependency-path: electron/package-lock.json - name: Set up uv uses: astral-sh/setup-uv@v6 @@ -289,6 +296,14 @@ jobs: working-directory: electron run: npm ci + - name: Cache Playwright browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: pw-${{ runner.os }}-${{ hashFiles('electron/package-lock.json') }} + + # Idempotent: on a cache hit the download is skipped; --with-deps still + # apt-installs the shared libraries either way. - name: Install Playwright browsers working-directory: electron run: npx playwright install --with-deps chromium diff --git a/electron/playwright.config.ts b/electron/playwright.config.ts index 56e6d081..993df45a 100644 --- a/electron/playwright.config.ts +++ b/electron/playwright.config.ts @@ -11,53 +11,60 @@ import { join } from 'path' require('./tests/_clean_slate.cjs').installCleanSlate() /** - * Every spec file that costs >= ~45 s on a hosted runner, SLOWEST FIRST — the - * order IS the CI balancing (round-robin below). Playwright's `--shard` - * balances by FILE COUNT, not duration, and reliably parks one shard at 2-3x - * the others, so CI does not use `--shard` at all. + * Every spec file that costs >= ~45 s on a hosted runner, with its CI SLOT + * cost in seconds (in-file test time + ~35 s app boot/teardown). The weights + * are BALANCING DATA, not contracts: the slow slice is bin-packed by them + * (greedy longest-first below), so editing a weight rebalances the groups. + * Playwright's `--shard` balances by FILE COUNT, not duration, and reliably + * parks one shard at 2-3x the others, so CI does not use `--shard` at all. * - * Durations: median of the two most recent green main runs (2026-08-03). + * Weights: measured slot times from the PR-tier validation run (2026-08-07); + * progressive_signal_preview's slot ran 2.3x its in-file time (a slow batch + * finalize on CI runners), so slots, not file times, are what balance. * `reportSlowTests` prints every file over 30 s, so CI says when this list * has drifted. */ -export const SLOW_SPECS = [ - '**/progressive_signal_preview.spec.ts', // 194s - '**/progressive_orientation_preview.spec.ts', // 154s - '**/ipf_perf.spec.ts', // 149s - '**/report_edit2.spec.ts', // 111s - '**/sped_ag_grid.spec.ts', // 105s - '**/insitu_playback.spec.ts', // 90s - '**/gpu_image_parity.spec.ts', // 90s - '**/ipf_two_window_vom.spec.ts', // 90s - '**/eels_edge_component.spec.ts', // 84s - '**/ipf_two_window.spec.ts', // 81s - '**/laundry_visual.spec.ts', // 80s - '**/vector_om_lazy.spec.ts', // 70s - '**/orientation_lazy.spec.ts', // 70s - '**/ebsd_workflow.spec.ts', // 66s - '**/action_scoping.spec.ts', // 65s - '**/compose_real_drag.spec.ts', // 61s - '**/om_wizard_lazy.spec.ts', // 60s - '**/nav_drag_distributed.spec.ts', // 58s - '**/actions_lifecycle.spec.ts', // 57s - '**/fit_handles.spec.ts', // 57s - '**/shutdown.spec.ts', // 56s - '**/grid_present.spec.ts', // 56s - '**/vector_overlay.spec.ts', // 54s - '**/find_vectors_result.spec.ts', // 51s - '**/vector_vi_lazy.spec.ts', // 51s - '**/fit_from_composition.spec.ts', // 50s - '**/ipf_refine_render.spec.ts', // 49s - '**/vi_lazy.spec.ts', // 47s +export const SLOW_SPECS: Array<[string, number]> = [ + ['**/progressive_signal_preview.spec.ts', 400], + ['**/gpu_image_parity.spec.ts', 125], + ['**/progressive_orientation_preview.spec.ts', 113], + ['**/ipf_perf.spec.ts', 113], + ['**/report_edit2.spec.ts', 101], + ['**/ipf_two_window.spec.ts', 101], + ['**/action_scoping.spec.ts', 101], + ['**/fit_handles.spec.ts', 95], + ['**/shutdown.spec.ts', 93], + ['**/fit_from_composition.spec.ts', 87], + ['**/eels_edge_component.spec.ts', 81], + ['**/compose_real_drag.spec.ts', 81], + ['**/laundry_visual.spec.ts', 76], + ['**/grid_present.spec.ts', 75], + ['**/ebsd_workflow.spec.ts', 73], + ['**/ipf_two_window_vom.spec.ts', 71], + ['**/sped_ag_grid.spec.ts', 69], + ['**/orientation_lazy.spec.ts', 69], + ['**/actions_lifecycle.spec.ts', 58], + ['**/insitu_playback.spec.ts', 55], + ['**/vector_om_lazy.spec.ts', 55], + ['**/nav_drag_distributed.spec.ts', 55], + ['**/find_vectors_result.spec.ts', 55], + ['**/om_wizard_lazy.spec.ts', 55], + ['**/vector_overlay.spec.ts', 55], + ['**/vi_lazy.spec.ts', 55], + ['**/ipf_refine_render.spec.ts', 55], + ['**/vector_vi_lazy.spec.ts', 50], ] +const SLOW_GLOBS = SLOW_SPECS.map(([g]) => g) // Which slice to run. CI sets both; unset (every local run) means // "everything", so nobody has to know this exists to run the suite. // SPYDE_E2E_SLICE: slow -> ONLY the files above; fast -> everything else -// SPYDE_E2E_GROUP: 'k/n' -> every n-th file of the slice, offset k (1-based) -// Round-robin over the slice's file order spreads duration evenly: SLOW_SPECS -// is sorted slowest-first, and the fast slice is all sub-45s files, so any -// contiguous alphabetical cluster of heavy files lands on different jobs. +// SPYDE_E2E_GROUP: 'k/n' -> group k of n (1-based) +// fast: all files are sub-45s, so round-robin over the sorted list is even. +// slow: greedy longest-first bin-packing on the declared weights — round-robin +// cannot isolate the one ~7-min spec that must ride alone in its group, this +// can, and it rebalances itself whenever a weight is edited. Deterministic +// (stable sort, ties by list order), so every CI job computes the same bins. const bare = (glob: string) => glob.slice(glob.lastIndexOf('/') + 1) // Recursive: a spec added in a SUBDIRECTORY must land in a slice too, not // silently fall out of CI. '**/'+bare matches at any depth. @@ -65,7 +72,7 @@ const ALL_SPEC_FILES = readdirSync(join(__dirname, 'tests'), { recursive: true } .map((f) => bare(String(f).replace(/\\/g, '/'))) .filter((f) => f.endsWith('.spec.ts')) .sort() -for (const g of SLOW_SPECS) { +for (const g of SLOW_GLOBS) { // A renamed/deleted slow spec must fail loudly here, not silently carry a // stale glob while the file drifts into the fast slice. if (!ALL_SPEC_FILES.includes(bare(g))) @@ -73,13 +80,28 @@ for (const g of SLOW_SPECS) { } const FAST_SPECS = ALL_SPEC_FILES .filter((f) => !f.endsWith('.real.spec.ts') && f !== 'guide_screenshots.spec.ts') - .filter((f) => !SLOW_SPECS.some((g) => bare(g) === f)) + .filter((f) => !SLOW_GLOBS.some((g) => bare(g) === f)) const SLICE = process.env.SPYDE_E2E_SLICE -let sliceFiles = SLICE === 'slow' ? SLOW_SPECS.map(bare) : SLICE === 'fast' ? FAST_SPECS : null const GROUP = process.env.SPYDE_E2E_GROUP -if (sliceFiles && GROUP) { - const [k, n] = GROUP.split('/').map(Number) - sliceFiles = sliceFiles.filter((_, i) => i % n === k - 1) +let sliceFiles: string[] | null = null +if (SLICE === 'fast') { + sliceFiles = FAST_SPECS + if (GROUP) { + const [k, n] = GROUP.split('/').map(Number) + sliceFiles = sliceFiles.filter((_, i) => i % n === k - 1) + } +} else if (SLICE === 'slow') { + sliceFiles = SLOW_GLOBS.map(bare) + if (GROUP) { + const [k, n] = GROUP.split('/').map(Number) + const bins = Array.from({ length: n }, () => ({ total: 0, files: [] as string[] })) + for (const [g, w] of [...SLOW_SPECS].sort((a, b) => b[1] - a[1])) { + const lightest = bins.reduce((m, b) => (b.total < m.total ? b : m)) + lightest.total += w + lightest.files.push(bare(g)) + } + sliceFiles = bins[k - 1].files + } } const SLICE_MATCH = sliceFiles ? sliceFiles.map((f) => '**/' + f) : null