Read the histo workstream indexes and the dashboard histo tile-serving SOP.
Inspected current mono main without editing it, focusing on dashboard frontend HistoViewerCard, shared TileViewer/TileClient/TileScheduler, the direct HTTP GeoTIFF source, the dashboard-api histo router, and Vite URL proxies.
Identified a deterministic overlay scheduling fault: overlay tile requests are scheduled during rendering, then immediately excluded from the base-image scheduler keep-set and cancelled. Their overlay-cache loading flags are not cleared.
Identified the direct-S3 browser constraint: HistoViewerCard passes the raw presigned URL to the fetch-based GeoTIFF reader even though the existing s3ObjectUrl helper documents that the endpoint lacks CORS and provides a dev proxy for byte-reading callers.
Recorded other likely mechanisms: silent overlay metadata/tile errors, one mutable source type shared by base and overlays, GeoTIFF top-level-IFD pyramid assumptions, ignored overlay PNG query, range-response requirements, and presigned URL expiry.
No source files were edited and no tests were run because this was a read-only investigation.
Lessons Learned: Pitfalls
The dashboard tile-serving SOP describes the original on-disk TIFF and OME-Zarr paths but does not yet cover the later direct-S3 GeoTIFF path or its CORS and range constraints.
Shared viewer logging methods currently contain no output, despite comments suggesting they can be enabled, so browser source breakpoints and Network inspection are more useful.
Lessons Learned: Improvements
Extend the dashboard histo tile-serving SOP with the direct-S3 flow and the required browser contract: successful CORS preflight for Range, 206, readable Content-Range, and the dev/prod proxy distinction.
Document that the viewer scheduler is shared by base and overlays, so cancellation keep-sets and loading-state cleanup must cover both cache families.
Add an integration check that zooming changes requested pyramid levels and that a visible overlay completes at least one tile request.