Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
- name: Install build dependencies
run: |
python -m pip install --upgrade pip
python -m pip install build "twine>=7,<8" ".[dev]"
python -m pip install build "twine>=7,<8" -e ".[dev]"

- name: Test release candidate
run: python -m pytest -q
Expand Down
38 changes: 38 additions & 0 deletions docs/validation/publisher-admission-031-20261002/COMMANDS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
Focused qualification command
=============================

Run from the isolated PolyStore worktree::

systemd-run --user --scope --quiet \
-p MemoryMax=512M -p MemorySwapMax=0 -p CPUQuota=100% \
timeout 60s taskset -c 0 env \
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 PYTHONDONTWRITEBYTECODE=1 \
OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 \
PYTHONPATH=/home/ts/wt/polystore-publisher-admission-031-20261002/src \
/home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python -B \
/home/ts/wt/openhcs-prior-measurement-role-projection-20261001/docs/validation/selected_plane_stream_materialization_20261001/run_bounded_source.py \
/home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python -B -m pytest \
-o addopts= \
--basetemp=docs/validation/publisher-admission-031-20261002/qualified-test-temp \
--junitxml=docs/validation/publisher-admission-031-20261002/qualified.xml \
tests/test_publisher_admission.py tests/test_basic.py \
tests/test_imagej_cache_environment.py tests/test_metadata_namespace.py \
tests/test_roi_region_properties.py tests/test_roi.py \
tests/test_lazy_package_exports.py -q

The default coverage/report addopts are disabled for this focused resource-bound
source run, not for the publisher. All selected tests/assertions are unchanged.
Source fixtures prohibit actual Fiji downloads/JVM execution.

Offline lock attempt (terminal failure)::

systemd-run --user --scope --quiet \
-p MemoryMax=512M -p MemorySwapMax=0 -p CPUQuota=100% \
timeout 60s taskset -c 0 uv lock --offline --no-python-downloads

No solution for python_full_version >=3.14 / win32: imglyb not found in cache;
polystore[all] requires imglyb==2.1.0. No lock file was changed.

Owned disposable output is confined to the three source-test-temp,
admission-test-temp and qualified-test-temp directories below this receipt root.
Original log, test XML and qualification notes are durable evidence, not caches.
73 changes: 73 additions & 0 deletions docs/validation/publisher-admission-031-20261002/RECEIPT.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
PolyStore 0.3.1 publisher admission
================================

Source base: 84f322e46871de5ed47e7fd20976ad03e533c1c4 (remote main).
Owner: Dewey, isolated polystore-publisher-admission-031-20261002 worktree.
Parent owns integration, the sole new 0.3.1 tag, and hosted release acceptance.
The immutable failed v0.3.0 tag is untouched.

Original failure
----------------

Run https://github.com/OpenHCSDev/PolyStore/actions/runs/36959840684,
job 110690882405: 9 failed, 545 passed, 19 skipped in 15.91s.
Three failures require child processes to import checkout source; the publisher
installed a regular distribution. Six ROI topology/archive cases fail because
the existing dev extra omitted roifile. No original test or skip is changed.

The full job log was fetched through the GitHub SDK job-log tool and archived
as original-job-110690882405.log.gz (lossless gzip), preserving UTF-8 text including
its original BOM and final newline: 142020 bytes, SHA256
542d75ef00bcd8677526131a1afe195cea6fa63edca7eca5aa8e0b1b4e4b703c.

Ownership and repair
--------------------

Replace the existing publisher install with editable .[dev] admission, matching
the existing ordinary test workflow. The later package build and immutable
declaration/publish steps are unchanged. Declare roifile in the original dev
extra, not a workflow-only dependency roster or mandatory runtime requirement.
Advance the sole project version declaration to 0.3.1; the existing package
version and release scripts derive it from distribution/project metadata.

Current NRA/refactor-audit skills and packaged pattern catalog were read.
MEMB-1/MEMB-2: dependency membership remains in the original extras declaration.
TIME-8: no duplicated version or metadata authority. No Python runtime mechanism
is introduced, so inheritance/MI would be ornamental here. Independent future
dev dependencies need only their own extra entry, not publisher consumer edits.
The real editable-build test reads emitted metadata and the actual source .pth
from the existing setuptools backend rather than mirroring its implementation.

Open-PR check found only Dependabot PR10, whose publisher-file changes are action
pins; this patch leaves those pins unchanged. Parent's release worktree is not
edited. No environment installation, external download, Fiji/native launch,
science job, tag or release operation was performed.

Focused source qualification
----------------------------

68 PASS, zero skips: publisher admission/editable metadata, basic package,
ImageJ cache policy and fresh-process source, namespace handoff, ROI geometry
and archive roundtrip, and lazy package exports. These include all nine original
failed cases. The initial original-only run was 63 PASS; new admission controls
were 2 PASS. Final combined run: 8.43s pytest, 9.089s monitored wall,
322700 KiB aggregate RSS (315.14 MiB), one CPU, 512 MiB / 60s limits.
See qualified.xml and qualified-source.txt. The command is in COMMANDS.rst.

Source is explicitly this worktree's src; dependencies/interpreter are readonly
openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python.
The two publisher controls exercise the real offline editable build without
installing its artifact. They verify checkout binding, unfiltered publisher
pytest invocation, derived version, and dev-only ROI dependency metadata.
No installed editable-candidate or hosted 0.3.1 acceptance is claimed.

Lock limitation
---------------

uv lock --offline --no-python-downloads failed because imglyb==2.1.0 is absent
from the cache for the all/bioformats extras. Original uv.lock already records
PolyStore 0.2.18 and ZMQRuntime 0.2.21, inconsistent with base declarations.
The lock is unchanged: no fabricated entries, constrained platforms, dependency
weakening or downloads. Publisher pip does not consume uv.lock. The existing
separate distribution CI lock-check remains unqualified until authorized lock
regeneration; this is not represented as publisher or runtime acceptance.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="2" time="1.721" timestamp="2026-10-01T23:43:39.638980-04:00" hostname="desktop"><testcase classname="tests.test_publisher_admission" name="test_publisher_installs_the_dev_candidate_editably" time="0.002" /><testcase classname="tests.test_publisher_admission" name="test_editable_artifact_owns_checkout_path_and_roi_dev_requirement" time="1.594" /></testsuite></testsuites>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="63" time="6.262" timestamp="2026-10-01T23:42:07.085949-04:00" hostname="desktop"><testcase classname="tests.test_imagej_cache_environment" name="test_declaration_import_defers_process_configuration" time="0.144" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_process_permission_leaves_environment_unchanged" time="0.001" /><testcase classname="tests.test_imagej_cache_environment" name="test_download_policy_decodes_permission_without_copying_retry_defaults[None-True]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_download_policy_decodes_permission_without_copying_retry_defaults[true-True]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_download_policy_decodes_permission_without_copying_retry_defaults[ FALSE -False]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_download_permission_fails[]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_download_permission_fails[yes]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_download_permission_fails[0]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_download_permission_fails[relative/cache]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_forbidden_download_has_no_archive_or_cache_side_effects" time="0.001" /><testcase classname="tests.test_imagej_cache_environment" name="test_unset_bundle_root_retains_distribution_default" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_explicit_bundle_root_fails_without_a_fallback[]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_explicit_bundle_root_fails_without_a_fallback[ ]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_invalid_explicit_bundle_root_fails_without_a_fallback[relative/cache]" time="0.000" /><testcase classname="tests.test_imagej_cache_environment" name="test_bundle_root_decode_is_independent_of_xdg_cache" time="0.001" /><testcase classname="tests.test_imagej_cache_environment" name="test_fresh_processes_share_one_verified_bundle_not_their_xdg_caches" time="0.369" /><testcase classname="tests.test_metadata_namespace" name="test_namespace_reopen_connection_restore_and_native_handoff[polystore_metadata.json]" time="2.781" /><testcase classname="tests.test_metadata_namespace" name="test_namespace_reopen_connection_restore_and_native_handoff[custom-metadata.json]" time="1.712" /><testcase classname="tests.test_metadata_namespace" name="test_new_namespace_declaration_needs_no_workspace_consumer_edits" time="0.002" /><testcase classname="tests.test_metadata_namespace" name="test_explicit_config_decodes_once_without_mutating_generic_snapshot" time="0.001" /><testcase classname="tests.test_metadata_namespace" name="test_namespace_isolation_has_no_alternate_filename_reader" time="0.001" /><testcase classname="tests.test_metadata_namespace" name="test_connection_retarget_invalidates_mapping_and_namespace" time="0.004" /><testcase classname="tests.test_metadata_namespace" name="test_native_parameter_boundary_uses_constructor_binding" time="0.001" /><testcase classname="tests.test_roi_region_properties" name="test_region_crop_contours_equal_full_canvas_and_archive_reopen[holes-origin0]" time="0.060" /><testcase classname="tests.test_roi_region_properties" name="test_region_crop_contours_equal_full_canvas_and_archive_reopen[holes-origin1]" time="0.006" /><testcase classname="tests.test_roi_region_properties" name="test_region_crop_contours_equal_full_canvas_and_archive_reopen[borders-origin0]" time="0.006" /><testcase classname="tests.test_roi_region_properties" name="test_region_crop_contours_equal_full_canvas_and_archive_reopen[borders-origin1]" time="0.006" /><testcase classname="tests.test_roi_region_properties" name="test_region_crop_contours_equal_full_canvas_and_archive_reopen[topology-origin0]" time="0.007" /><testcase classname="tests.test_roi_region_properties" name="test_region_crop_contours_equal_full_canvas_and_archive_reopen[topology-origin1]" time="0.008" /><testcase classname="tests.test_roi_region_properties" name="test_hole_rings_keep_opposite_orientation" time="0.002" /><testcase classname="tests.test_roi_region_properties" name="test_existing_mask_representation_preserves_exact_topology[holes]" time="0.001" /><testcase classname="tests.test_roi_region_properties" name="test_existing_mask_representation_preserves_exact_topology[borders]" time="0.001" /><testcase classname="tests.test_roi_region_properties" name="test_existing_mask_representation_preserves_exact_topology[topology]" time="0.001" /><testcase classname="tests.test_roi_region_properties" name="test_region_properties_scan_labels_once_and_honor_min_area[holes-True]" time="0.002" /><testcase classname="tests.test_roi_region_properties" name="test_region_properties_scan_labels_once_and_honor_min_area[holes-False]" time="0.001" /><testcase classname="tests.test_roi_region_properties" name="test_region_properties_scan_labels_once_and_honor_min_area[borders-True]" time="0.002" /><testcase classname="tests.test_roi_region_properties" name="test_region_properties_scan_labels_once_and_honor_min_area[borders-False]" time="0.001" /><testcase classname="tests.test_roi_region_properties" name="test_region_properties_scan_labels_once_and_honor_min_area[topology-True]" time="0.001" /><testcase classname="tests.test_roi_region_properties" name="test_region_properties_scan_labels_once_and_honor_min_area[topology-False]" time="0.001" /><testcase classname="tests.test_roi" name="test_napari_roi_converter_projects_ellipse_as_native_bounding_box" time="0.000" /><testcase classname="tests.test_roi" name="test_napari_roi_converter_removes_only_redundant_polygon_vertices" time="0.000" /><testcase classname="tests.test_roi" name="test_napari_polygon_projection_retains_collinear_backtracking_vertex" time="0.000" /><testcase classname="tests.test_roi" name="test_extract_rois_from_labeled_mask_applies_spatial_origin_to_polygons" time="0.001" /><testcase classname="tests.test_roi" name="test_extract_rois_from_labeled_mask_applies_spatial_origin_to_mask_bbox" time="0.001" /><testcase classname="tests.test_roi" name="test_extract_rois_from_labeled_mask_records_source_canvas_shape" time="0.001" /><testcase classname="tests.test_roi" name="test_roi_zip_roundtrip_preserves_source_canvas_shape_metadata" time="0.002" /><testcase classname="tests.test_roi" name="test_load_rois_from_json_decodes_shapes_through_nominal_registry" time="0.001" /><testcase classname="tests.test_roi" name="test_imagej_point_archive_roundtrip" time="0.002" /><testcase classname="tests.test_roi" name="test_external_imagej_point_archive_preserves_every_point" time="0.002" /><testcase classname="tests.test_roi" name="test_imagej_geometry_archive_roundtrip_preserves_native_shape[shape0-FREEHAND]" time="0.002" /><testcase classname="tests.test_roi" name="test_imagej_geometry_archive_roundtrip_preserves_native_shape[shape1-POLYLINE]" time="0.002" /><testcase classname="tests.test_roi" name="test_imagej_geometry_archive_roundtrip_preserves_native_shape[shape2-OVAL]" time="0.002" /><testcase classname="tests.test_roi" name="test_external_integer_imagej_oval_preserves_geometry" time="0.001" /><testcase classname="tests.test_roi" name="test_imagej_archive_rejects_unsupported_native_geometry[NOROI]" time="0.001" /><testcase classname="tests.test_roi" name="test_imagej_archive_rejects_unsupported_native_geometry[RECT]" time="0.001" /><testcase classname="tests.test_roi" name="test_imagej_archive_rejects_unsupported_native_geometry[LINE]" time="0.001" /><testcase classname="tests.test_roi" name="test_imagej_archive_rejects_unsupported_native_geometry[FREELINE]" time="0.001" /><testcase classname="tests.test_roi" name="test_imagej_archive_rejects_unsupported_native_geometry[ANGLE]" time="0.001" /><testcase classname="tests.test_roi" name="test_imagej_archive_rejects_malformed_geometry_and_missing_metadata" time="0.002" /><testcase classname="tests.test_roi" name="test_imagej_archive_rejects_specialized_subtypes_and_masks" time="0.001" /><testcase classname="tests.test_lazy_package_exports" name="test_constants_import_does_not_load_disk_or_array_frameworks" time="0.093" /><testcase classname="tests.test_lazy_package_exports" name="test_root_disk_exports_load_and_cache_the_declared_classes" time="0.262" /><testcase classname="tests.test_lazy_package_exports" name="test_disk_backend_initialization_does_not_load_optional_array_runtimes" time="0.232" /></testsuite></testsuites>
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.................................................................... [100%]
- generated xml file: /home/ts/wt/polystore-publisher-admission-031-20261002/docs/validation/publisher-admission-031-20261002/qualified.xml -
68 passed in 8.43s
BOUNDED_SOURCE peak_aggregate_rss_kib=322700 elapsed_seconds=9.089 returncode=0 reason=None
Loading
Loading