Repository navigation
Conversation
Bring paper.md in line with the code at v0.6.3: the backend hierarchy (BackendBase, DataSink, DataSource), an explicit registry in the examples, the keywords the Zarr and viewer backends require, portalocker on every platform, and what is and is not atomic. Unsupported comparisons and the bug-prevention claim are removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brings
paper.mdin line with the code at v0.6.3 (5fdb617).main(2a80372) is one commit ahead of the tag and that commit only changes.github/badges/coverage.svg, so the branch is based onmainand every claim was checked against the tag. No library code changes. The repository has noCHANGELOG.md, so the ledger comes frompaper.mdread against the source. Paths below are undersrc/polystore/.Nothing was executed: no environment was created and the library was not imported. Every name and call in the code examples was checked by reading the source:
DiskBackend,MemoryBackend,FileManagerare root exports (__init__.py:39, 54, 83; aliases atdisk.py:868,memory.py:630);FileManager(registry)copies a mapping (filemanager.py:38-65);save(data, output_path, backend, **kwargs):338,load(file_path, backend, **kwargs):261,load_batch:387,save_batch:416; disk.npygoes tonp.save/np.load(disk.py:131, 357-431); a memory save with no parent directory in the path is accepted (memory.py:92-104); Zarr batch keywords (zarr.py:429-442);ZarrBatchLayout(zarr_batch.py:77);stream_request/ViewerStreamRequest(streaming/viewer_transport.py:479, 533-550). The examples were not run. The second example is a fragment:paths,out_paths,pipeline,layoutandrequestare placeholders, andfmmust holdzarrandnapari_streambackends.Claim ledger
disk.py:92,memory.py:27,zarr.py:119,napari_stream.py:38,fiji_stream.py:60from polystore import FileManager, BackendRegistry;FileManager(BackendRegistry())BackendRegistrydoes not exist. Example builds an explicit mapping ofDiskBackendandMemoryBackend__init__.py:14-85;filemanager.py:38-65fm.save(image, "result.npy", backend="napari_stream") # Appears in Naparistream_request, aViewerStreamRequest. Removed from the first example, shown with the keyword in the secondstreaming/viewer_transport.py:539-550;streaming/_streaming_backend.py:735FileManagerFileManageronly; see 5 and 22filemanager.py:116-154.json,.csv,.txt,.roi.zip,.zippaths to the disk backend. Rows replaced by "Destination chosen by"zarr.py:41, 307-313, 409-420_backend_typeis namedbase.py:162-182;backend_registry.py:20formats.py:12-32;disk.py:165-255;__init__.py:90-99atomic.py:118-186;disk.py:131zarr.py:429-442;viewer_transport.py:539-550streaming/_streaming_backend.py:547disk.py:165-207atomic.py:118-141DataSink.saveis described insteadbase.py:281-295BackendBase;DataSinkandDataSourceare siblingsbase.py:162, 239, 317DataSink(write-only) is the root interface, notStorageBackend"BackendBaseis the rootbase.py:162-236class StorageBackend(DataSink)withload_batchdefined on itStorageBackend(DataSource, DataSink); listing rewritten with the six classes and their registered namesbase.py:639class StreamingBackend(DataSink), noload()streaming/_streaming_backend.py:547-887FileManagerroutes to anyDataSink"BackendBase, including read-only sourcesfilemanager.py:101-154save_batch()_streaming_backend.py:292-300, 330-353, 721-804;array_payload.py:8-15;napari_stream.py:43-63;fiji_stream.py:112-134_streaming_backend.py:597-629, 806-816fcntlon Unix,portalockeron Windows)"portalockeron every platform;fcntlis not imported anywhereatomic.py:19, 86-91atomic_update_json()for concurrent metadata writesos.replace)atomic.py:167-186base.py:691-779;backend_registry.py:63-96napariwhen first used"streaming/receivers/napari/*does. Sentence removednapari_stream.py:15-30;streaming/receivers/napari/image_presentation.py:5zarr.py:397-598NapariBatchProcessorstates that OpenHCS owns the debounce and itsflushis a no-op. Replaced by "A streaming backend sends one message per batch"streaming/receivers/napari/napari_batch_processor.py:37-85;_streaming_backend.py:783disk.py:433-468;memory.py:131-172disk.py:220-239;virtual_workspace.py:202-325config.py:264-279;zarr.py:122-127fm.save_batch(processed, paths, backend="zarr")ValueError("chunk_name must be provided"); example now passeschunk_name,batch_layout,row,colzarr.py:429-442fm.save_batch(processed, paths, backend="napari_stream")ValueError; example passesstream_requestviewer_transport.py:544-546contextual_save_kwargs()sentencebase.py:261-269;filemanager.py:372-385os.path.exists()"would fail silently"np.save,zarr.save,msgpack)False or misleading: 18 (rows 2, 3, 5, 9, 13, 16, 17, 19, 22, 23, 26, 27, 28, 29, 32, 34, 35, 37). Removed as unverifiable: 8 (rows 10, 12 for xarray, 21, 25, 30, 31, 36, 38); row 14 was reworded to what can be read from the code.
New statements
FileManagerholds a name-to-instance mapping, has no default backend, does not infer a backend from the path:filemanager.py:38-65, 116-154.StorageResolutionError:filemanager.py:146-154, 281-292, 356-370.base.py:162, 239, 317, 610, 639;streaming/_streaming_backend.py:547;virtual_workspace.py:202;ome_zarr_storage.py:77;bioformats_storage.py:78.grep "_backend_type ="undersrc/): disk, memory, zarr, ome_zarr, bioformats, virtual_workspace, napari_stream, fiji_stream, omero_local (omero_local.py:147, aVirtualBackend,base.py:519)._streaming_backend.py:292-300, 330-353, 763-804.portalockeron every platform; lock on a sidecar.lockfile; temp file thenos.replace:atomic.py:19, 36-39, 86-91, 118-166.AtomicMetadataWriteris built onatomic_update_json:metadata_writer.py:88-93. Zarr plate metadata underfile_lock:zarr.py:582-598.import polystoreloads no backend module:__init__.py:10-99.storage_registrybuilt on first read:base.py:713-779.load_batch:zarr.py:345-395, 500-568.FileManagerpickles as backend names plus connection parameters and rebuilds backends on unpickle:filemanager.py:68-99;base.py:98-159.contextual_save_kwargs(openhcs/core/steps/function_artifact_materialization.py:278) andAtomicMetadataWriter(openhcs/core/virtual_workspace_metadata.py,openhcs/core/source_binding_workspace.py), read in the OpenHCS checkout.For the owner
.json,.csv,.txt,.roi.zipand.zippaths through the disk backend (zarr.py:41, 307-313), and streaming backends skip text and non-streamable items without raising (_streaming_backend.py:597-629, 806-816). The paper now states the second; the first is covered by removing the "Zero implicit fallback" table row. Whether the code should do either is a separate question.dict(storage_registry)before the registry is initialised is empty._LazyStorageRegistry(base.py:713-749) triggers initialisation from__getitem__,keys,itemsand so on, butdict(a_dict_subclass)copies the underlying table without calling any of them. I confirmed that behaviour on a five-line stand-in class with the system Python 3.14 only, not with PolyStore itself and not on 3.11 or 3.12.FileManager.__init__doesdict(registry)(filemanager.py:64). The README callsensure_storage_registry()first, which is correct;openhcs/processing/backends/analysis/consolidate_special_outputs.py:201passesstorage_registrydirectly and depends on something having read the registry earlier. This is why the paper's example uses an explicit mapping.FileManagerdoes not carry memory-backend contents: backends without connection parameters are rebuilt with a no-argument constructor (filemanager.py:96-97). The paper says "rebuilt in the worker" and does not claim more.create_storage_registryleaves out a backend whose constructor raises, with a warning in the log (backend_registry.py:89-93). Not stated in the paper.v0.6.3tag contains no such code (no match forcontent_hashorsha256-based identity beyondread_verified_source_bytes,base.py:366-396), so the paper does not mention it.date:in the front matter (15 January 2026) was left unchanged.paper.bib: no change.napari,fiji,zeromq,ome_zarrandomerowere already in the file and are now cited. Thenumpy,pytorch,jax,tensorflow,cupyentries are still not cited (as before). ThemetaclassregistryURL (github.com/trissim/metaclass-registry) resolves;github.com/OpenHCSDev/metaclass-registryalso exists, and you may prefer it.wc -w(front matter and code included) against 876 before, 15% over.🤖 Generated with Claude Code