Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
5310aaf
CI: use info.cloudDatasetName (roundtrip's real field name)
claude Sep 26, 2026
ba67878
Wire the pyramid loader integration test to the cloud fixture
claude Sep 26, 2026
b320cf1
CI: run Test Cloud API on pyramid-loader PRs
claude Sep 27, 2026
94f01a6
CI: install dask[array] for the pyramid loader integration test
claude Sep 27, 2026
d0b35c6
Promote dask[array] to a runtime dependency
claude Sep 27, 2026
3496778
tests: skip pyramid loader integration when fixture is not accessible
claude Sep 27, 2026
87d0d31
batch_signed_url: retry the batch call before falling back per-member
claude Sep 27, 2026
ad618f0
cloud: log per-page walk and per-attempt retry so silent hangs surface
claude Sep 27, 2026
5ab9c04
filehandler: skip batch signed-URL lookup for single-manifest fetch
claude Sep 27, 2026
d4e31be
cloud: port async signed-URL-set-job family and route default signer …
claude Sep 27, 2026
6e4ca96
batch_signed_url: raise BatchScopeUnreachable instead of silent per-u…
claude Sep 27, 2026
20df586
lightsheetZarr CLI: configure INFO logging so cloud progress is visible
claude Sep 27, 2026
121d998
batch_signed_url: include scope + cause in retry log line
claude Sep 27, 2026
3fdee2c
batch_signed_url: cache scope-unreachable and re-raise on subsequent …
claude Sep 27, 2026
5454223
pyramid.multiscale: propagate BatchScopeUnreachable past _resolve's p…
claude Sep 27, 2026
ce93ada
pyramid.multiscale: surface systemic BatchScopeUnreachable through as…
claude Sep 27, 2026
4b605e1
batch_signed_url: log the async job's happy path so long waits are le…
claude Sep 27, 2026
d7b14b7
cloud.client: reauthenticate on 401/403 mid-request so long jobs surv…
claude Sep 27, 2026
18ec747
signed_url_disk_cache: persistent signed-URL disk cache for reopen
claude Sep 28, 2026
3ffd33c
chore: apply black formatting to disk-cache commit's untouched files
claude Sep 28, 2026
8eb7927
Fix three CI regressions on the disk-cache commit
claude Sep 28, 2026
d7231cc
bridge: bump three drifted matlab_last_sync_hash values
claude Sep 28, 2026
4dff8bf
batch_signed_url: exponential backoff for partial-map retry
claude Sep 28, 2026
e67e17c
bridge: bump batchSignedUrlLookup hash to the exponential-backoff commit
claude Sep 28, 2026
39be040
filehandler: single-file DID fetches bypass batch signed-URL scope
claude Sep 28, 2026
87176eb
lightsheet: eager signed-URL prefetch across pyramid levels
claude Sep 28, 2026
bdd2d6f
lightsheet viewer: timestamp key log lines + upsample fallback on by …
claude Sep 28, 2026
dc91fd3
batch_signed_url: prefetch_scope consults the disk cache
claude Sep 30, 2026
40ec43d
batch_signed_url: carry filesExpireAt/expiresAt from job status into …
claude Sep 30, 2026
b8d49fd
signed_url_disk_cache: warn loudly when refusing to persist un-cachea…
claude Sep 30, 2026
298fabd
bridge: note lightsheet tileBudgetBytes default moved 8 MB -> 32 MB
claude Oct 4, 2026
eb2387a
bridge: bump lightsheet sync hashes to NDI-matlab@5c9e8a8
claude Oct 4, 2026
9f1f33c
bridge: name 5c9e8a8 in lightsheet decision_logs for hash-justify guard
claude Oct 4, 2026
a814f7c
lightsheet viewer: set viewer.dims.units/axis_labels from the pyramid
claude Oct 4, 2026
c129852
lightsheet viewer: default to native multiscale + add loading overlay
claude Oct 4, 2026
e65ed93
tests: loader integration tolerates multiscale default
claude Oct 4, 2026
18f7042
lightsheet viewer: use pint.Unit for viewer.dims.units
claude Oct 4, 2026
c626496
lightsheet viewer: revert multiscale default; keep knob and dims.units
claude Oct 4, 2026
4f6ee46
lightsheet viewer: multiscale default + thread-safe status reporter
claude Oct 4, 2026
2892e18
lightsheet viewer: camera-nudge workaround for the slicer wedge
claude Oct 4, 2026
3733ac6
lightsheet viewer: add Refresh View button
claude Oct 4, 2026
f9ac7bb
lightsheet viewer: NDI Cloud sign-in panel + BETA badge
claude Oct 4, 2026
17a398a
napari slicer-wedge bisect: baseline (v1) + background threads (v2)
claude Oct 4, 2026
6d07226
lightsheet viewer: real zoom nudge in Refresh View; always show NDI C…
claude Oct 4, 2026
7488367
napari slicer-wedge bisect v3: cross-thread Qt bridge + leaner pyramid
claude Oct 4, 2026
f5ec39b
napari slicer-wedge bisect v4: v2 threads + v3 smaller pyramid, no br…
claude Oct 4, 2026
5bb095a
napari slicer-wedge bisect v5: add QApplication pre-create on top of v4
claude Oct 4, 2026
b89e9ad
napari slicer-wedge bisect v6: v5 + cross-thread Qt bridge (predicted…
claude Oct 4, 2026
cd28e6d
lightsheet: surface silent fine-decode failures in the upsample fallback
claude Oct 4, 2026
ca19fd5
lightsheet: stop the misleading "no tiles" heartbeat; count refresh h…
claude Oct 4, 2026
d332e87
lightsheet: trace the refresh-hint chain to find where it breaks
claude Oct 4, 2026
4c51e2d
lightsheet: fix RefreshHint cross-thread marshalling (make it a QObject)
claude Oct 4, 2026
9e2dffc
lightsheet: real debounce + synthetic QWheelEvent in refresh hint
claude Oct 4, 2026
9c5134f
lightsheet: default upsample fallback OFF (it was hiding arrived fine…
claude Oct 5, 2026
0e5f8d3
tests: upsample fallback default is OFF now, update the gate tests
claude Oct 5, 2026
6453126
lightsheet: report tiles needed for the current view; keep launch win…
claude Oct 11, 2026
a580ac0
lightsheet: say why the view tile tally is off instead of falling bac…
claude Oct 11, 2026
19bbc4a
lightsheet: fetch the newest view first; release reads the user zoome…
claude Oct 11, 2026
1054fff
Merge origin/main into claude/clever-dijkstra-gybqx6
claude Oct 12, 2026
e89db4d
lightsheet: "Report a problem..." button in the NDI Cloud panel
claude Oct 12, 2026
1bb5cca
genepyramid: "Report a problem..." button, shared with the lightsheet…
claude Oct 12, 2026
710c09d
bridge: record NDI-matlab 2f9b0eaf (viewer launched with debug log)
claude Oct 12, 2026
83608aa
bridge: record NDI-matlab 04ce18f9 (fromSPIM, reduceBlocks, makePyram…
claude Oct 12, 2026
19a5575
bridge: mark signedUrlDiskCache and fetchManifest as branch-pending
claude Oct 12, 2026
eb6eb52
bridge: fromSPIM examined against NDI-matlab 668beb13
claude Oct 12, 2026
a12f14f
Point lightsheet cloud fixture at the rebuilt dataset
claude Oct 12, 2026
4b40fdd
Merge remote-tracking branch 'origin/main' into claude/clever-dijkstr…
claude Oct 13, 2026
fee001d
Bridge: LightsheetZarrManager examined against NDI-matlab fb10169b
claude Oct 13, 2026
4c941d4
Lightsheet fetcher: resolve chunks without a session, 32 workers, wid…
claude Oct 13, 2026
81be028
Lightsheet viewer: "Tiles in flight" drop-down, live; default 16
claude Oct 13, 2026
4c7637e
Merge pull request #324 from Waltham-Data-Science/claude/clever-dijks…
stevevanhooser Oct 13, 2026
a249546
Bridge: record NDI-matlab waitForFileUpload as not yet ported
claude Oct 13, 2026
d169502
Bridge: examine uploadSingleFile / uploadFilesForDatasetDocuments aga…
claude Oct 13, 2026
ae69437
Bridge: waitForFileUpload is porting_deferred, not the retired not_ye…
claude Oct 13, 2026
7171218
Bridge: uploadFilesForDatasetDocuments examined against NDI-matlab d9…
claude Oct 14, 2026
c3cc811
Remove napari slicer repro scripts from the repository root
claude Oct 14, 2026
0385291
Bridge: drop matlab_branch markers now that NDI-matlab#979 has merged
claude Oct 14, 2026
0167249
Drop the remaining references to the merged NDI-matlab lightsheet branch
claude Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 7 additions & 9 deletions .github/workflows/build-lightsheet-fixture.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ on:
ndi_matlab_ref:
description: 'NDI-matlab branch/tag/SHA that carries lightsheet_blob_cloud_roundtrip'
required: true
default: 'claude/lightsheet-zarr-ndi-viewer-djp5vk'
default: 'main'

concurrency:
group: build-lightsheet-fixture
Expand All @@ -45,12 +45,10 @@ jobs:
path: NDI-python

# The blob-fixture routine (ndi.test.cloud.lightsheet_blob_cloud_roundtrip)
# is not on NDI-matlab main yet -- it lives on the sibling
# claude/lightsheet-zarr-ndi-viewer-djp5vk branch. `ndi_matlab_ref`
# picks which ref to check out (default: that branch). Fall back
# to main only when the requested ref no longer exists on the
# remote, and fail loudly rather than silently use a main that
# cannot resolve the routine.
# is on NDI-matlab main since VH-Lab/NDI-matlab#979. `ndi_matlab_ref`
# picks which ref to check out (default: main), so a fixture can still
# be built from a branch that changes the routine. Fall back to main
# only when the requested ref no longer exists on the remote.
- name: Check out NDI-matlab (from ndi_matlab_ref)
uses: actions/checkout@v4
with:
Expand Down Expand Up @@ -139,11 +137,11 @@ jobs:
% them up: on stdout for the log, and via
% GITHUB_OUTPUT so a follow-up job can consume them.
fprintf('CLOUD_DATASET_ID=%s\n', info.cloudDatasetId);
fprintf('DATASET_NAME=%s\n', info.remoteDatasetName);
fprintf('DATASET_NAME=%s\n', info.cloudDatasetName);

fid = fopen(getenv("GITHUB_OUTPUT"), "a");
fprintf(fid, "cloud_dataset_id=%s\n", info.cloudDatasetId);
fprintf(fid, "dataset_name=%s\n", info.remoteDatasetName);
fprintf(fid, "dataset_name=%s\n", info.cloudDatasetName);
fclose(fid);

- name: Write summary
Expand Down
19 changes: 18 additions & 1 deletion .github/workflows/test-cloud-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ on:
# Allow manual runs from the Actions tab
workflow_dispatch:

# Run on pull requests that touch the pyramid loader, its cloud
# fixture, or the workflow itself. Kept path-filtered so a PR that
# only edits, say, gene-pyramid code does not burn cloud API calls
# and bill the two shared test accounts on every push.
pull_request:
paths:
- 'src/ndi/pyramid/**'
- 'tests/test_pyramid_loader_integration.py'
- 'tests/fixtures/lightsheet_cloud_fixture.json'
- 'tests/test_cloud_*.py'
- '.github/workflows/test-cloud-api.yml'

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
Expand Down Expand Up @@ -49,4 +61,9 @@ jobs:
# All live cloud test files, not just test_cloud_live.py -- the
# others were previously exercised only by ci.yml, so they had no
# coverage on days when nobody opened a PR.
pytest tests/test_cloud_*.py -v --tb=short
#
# test_pyramid_loader_integration.py points at the permanent
# lightsheet blob fixture (see tests/fixtures/lightsheet_cloud_fixture.json,
# built by build-lightsheet-fixture.yml). It runs under the
# same account-and-env matrix as the rest of the cloud tests.
pytest tests/test_cloud_*.py tests/test_pyramid_loader_integration.py -v --tb=short
17 changes: 15 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,16 @@ dependencies = [
# default. keyring is preferred when present but stays optional,
# since it is the OS-keychain path rather than the portable one.
"cryptography>=41.0",
# dask[array] powers ndi.pyramid.ImagePyramidLoader -- the
# napari-independent multiscale loader. It used to live under
# the napari extra because only napari-driven viewers touched
# it, but the loader is now a first-class ndi API that
# matplotlib, Jupyter and (eventually) a MATLAB comparison
# harness consume without napari. That makes dask a runtime
# dependency of the pyramid subpackage. It stays pinned in the
# napari extra as well (as a redundant floor), so an old lock
# file that pinned dask through napari does not break.
"dask[array]>=2023.1",
]

[project.optional-dependencies]
Expand All @@ -82,10 +92,12 @@ dependencies = [
gui = [
"PySide6>=6.5",
]
# napari, and the dask it drives the tile ladder through. An EXTRA for the
# napari is the tile viewer over the pyramid loader. An EXTRA for the
# same reason gui is: a headless install should not pull in Qt and OpenGL.
# ndi.gui.app.genepyramid.viewer imports through require_napari(), so the
# failure mode for a missing toolkit is a sentence naming this extra.
# failure mode for a missing toolkit is a sentence naming this extra. The
# loader's own dask requirement moved to project.dependencies once the
# loader graduated out of the viewer namespace into ndi.pyramid.
napari = [
"napari[all]>=0.4.19",
"dask[array]>=2023.1",
Expand Down Expand Up @@ -161,6 +173,7 @@ addopts = "-v --tb=short --ignore=tests/symmetry"
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"symmetry: marks cross-language symmetry tests (run with 'pytest tests/symmetry/')",
"cloud: marks live-cloud tests (skipped when NDI_CLOUD_USERNAME / NDI_CLOUD_PASSWORD are missing)",
]

[tool.black]
Expand Down
Loading
Loading