From 6f636c2afe6d98cc018d4997d66ad5c79e929ee3 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Wed, 30 Sep 2026 18:34:43 -0400 Subject: [PATCH 1/6] Fix paired-field image identity in source binding policy (#314) --- .../checkpoint.rst | 47 ++++++ .../ownership-receipt.rst | 132 ++++++++++++++++ .../paired_field_csv_314_20260930/pr-body.md | 16 ++ openhcs/core/source_matching.py | 21 ++- .../test_cellprofiler_spreadsheet_export.py | 107 +++++++++++++ .../test_source_image_set_identity_policy.py | 147 ++++++++++++++++++ 6 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 docs/validation/paired_field_csv_314_20260930/checkpoint.rst create mode 100644 docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst create mode 100644 docs/validation/paired_field_csv_314_20260930/pr-body.md create mode 100644 tests/unit/test_source_image_set_identity_policy.py diff --git a/docs/validation/paired_field_csv_314_20260930/checkpoint.rst b/docs/validation/paired_field_csv_314_20260930/checkpoint.rst new file mode 100644 index 0000000000..8f63689d1b --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/checkpoint.rst @@ -0,0 +1,47 @@ +Tested source checkpoint +======================== + +Base702b2c2c9563da2636db251f8b734cff215596b8. Source repair only; +parent owns final integration and actual installed/MCP acceptance. + +Production change is confined to SourceImageSetIdentityPolicy.from_source_bindings. +Shared singleton coordinates across paired primary declarations stay field +identity. Explicit stacks/grouping keep precedence. Existing component_values() +owns biological assignment versus physical selector precedence. No exporter, +shape/secondary module, provenance schema, scope, registry or global package edit. + +Original built-source synthetic exporter failed:8 partial rows instead of4 +complete rows for2 fields x2 cells. Corrected source passes100 tests in15.52s +(wall17.07s, maximumRSS455620KiB) under512MiB cgroup/oneCPU/threads1. +Includes the real CSV exporter/counts, source binding/provenance contracts, +measurement source-group alignment, two-versus-three channels, site/well/z/time +negative controls, explicit stacked/grouped constant axes, physical-selector +versus biological-coordinate precedence and path fallback without metadata. +No scientific image read, segmentation, JVM, MCP/server/viewer startup, +installed-entrypoint or external CellProfiler oracle was performed. + +Original failures retained: fresh checkout missing compiled tabular extension +(reproducer-original.log); real baseline split (reproducer-original-built.log); +initial production patch had a misplaced generator comma and failed collection +(owner-fixed.log). Corrected that syntax, not assertions or behavior, before the +passing owner-fixed-corrected.log. Existing extension declarations were built +locally without installation or package/source dependency changes (source-build.log). +The failed complete-context NRA attempt (exit124, maximumRSS524536KiB, empty +JSON) remains nra-original.json/nra-original-resources.log; it is not a complete +R1/semantic proof. Do not repeat with greater global limits. Core syntax census +and source-witness review are evidence at their actual scope, not global health. + +Ruff's initial all-rule check exposes13 inherited findings (import order and +quoted annotations). Keep unrelated source debt out of this repair; compare +changed-owner metrics against exact base rather than claiming a clean repository. +The new test module itself has no Ruff findings. git diff --check passes. + +Coordination: all7 then-open PR file lists checked. Shared source_bindings.py +(#206), runtime_image_values.py/runtime_plane_projection.py (#217) remain +read-only. Direct message addressed to Avicenna on their PR: +https://github.com/OpenHCSDev/openhcs/pull/217#issuecomment-5920836946. +No response or coordinated shared edit is claimed; no waiting or new agent call. + +H003e immutable REJECT remains untouched. Issue314 is not closed by source tests. +Source/wheel/MCP continuity and external semantics acceptance remain separate +parent gates. Pending follow-up checks will be added to this same coherent PR. diff --git a/docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst b/docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst new file mode 100644 index 0000000000..3d2fa1e66f --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst @@ -0,0 +1,132 @@ +Issue314: paired-field measurement identity +========================================= + +Head audited: OpenHCSDev/openhcs main702b2c2c9563da2636db251f8b734cff215596b8. +Fresh isolated branch fix/paired-field-csv-314-20260930 in +/home/ts/wt/openhcs-paired-field-csv-314-20260930. Parent integration owns final +source/MCP acceptance; Russell owns this source reproduction and repair. +H003e remains an immutable REJECT: no reads of its scientific inputs/outputs, +no rerun, tuning, CSV repair or freeze mutation for this task. + +Instruction review before production implementation +-------------------------------------------------- + +Read complete nra-refactoring SKILL.md (SHA256 +9f2f8b28bc82256eefa3e9d63248c50722dc3ffe7d77adba5793296df196b47e), complete latest +refactor-audit.skill ZIP entrypoint, pattern README, full identity/boundaries/ +membership/implementation references and surface-receipt template. Archive SHA +100fbe8ef89664b866777e87b2c8640a3432e8a10e9188dff81c97942d551bf6. +The following IDs are actual catalog IDs, not guessed NRA detector findings: + +* IDEN-1: source_matching.py:475..488 uses presence of a declared component + both as a biological plane address and as image-set plane membership. +* IDEN-6: image_set_numbering.py:45..55 keys the source identity produced by + that policy. Fully addressed DNA/Actin bindings make every source component + a plane member; SourceImageSetIdentity.from_metadata (:550..566) then falls + back to two different filenames. This is the earliest broken identity rung. +* BOUND-2 prevention: NamedSourceBinding.component_values() at + source_bindings.py:1015..1040 already owns assignment-versus-selector value + precedence. Use it instead of creating another coordinate/value reader. +* IMPL-1/2, MEMB-1/2/5 prevention: no axis-name/module-name strings, consumer + switch, parallel registry, policy mirror or duplicated row schema. Existing + AllComponents, ComponentSet, binding/policy/provenance/row owners suffice. + +Current-head census and proof scope +---------------------------------- + +Archive debt_census.py scanned all179 tracked core Python files at this head: +91295 code lines; no parse-failure warning. Core totals: string_dispatch7, +type_switch29, string_key_subscript274. These are syntax screens, not diagnoses +or a whole-repository architecture verdict. source_matching.py:824 code lines, +zero string dispatch/type switches/string-key subscripts, one four-term chain, +four foreign absence probes. Source witnesses, not these counts, establish314. +core-census.json/log and core-overlay.json/log retain unfiltered observations; +unrelated overlay leads are not assigned to this issue. + +Full NRA scan attempted with complete openhcs context, requested policy/numbering +files, --json --raw-findings --json-payload full, parse/analysis workers1, +--no-cache and an enforced512MiB/one-CPU/60s scope. It terminated exit124 with +maximum RSS524536KiB and no JSON result. Original stderr/resource receipt retained. +Do not call this complete, zero omissions, R1 evidence, DSL preflight, native +proof, or formal equivalence. A completed full-context scan needs resources +beyond this observed boundary; no global limit was raised. There are no R1 +mapping_read/unmodeled_record_shape/redundant_type_check findings to certify. +This repair is an explicitly authored semantic patch, not an NRA-generated plan. + +Original failing reproducer +--------------------------- + +New tiny synthetic fixture in test_cellprofiler_spreadsheet_export.py uses +two fields, two cells per field, full well/site/channel/z/timepoint addresses, +typed SourceImageProvenancePlanes, ordinary RuntimeExecutionAxisScope and +RuntimeArtifactBatch. It calls the real export_to_spreadsheet function. Literal +small feature rows stand for known synthetic measurements; this is not a +segmentation or installed/native-process test and reads no image files. + +Policy from fully addressed paired bindings loses four shared fixed axes as +well as the varying channel. Both primary/secondary features have the same +axis_id, local slice/object IDs; separate DNA/Actin paths cause duplicate rows. +Original built-source test fails with8 partial rows instead of4 complete rows +(reproducer-original-built.log), maxRSS311488KiB,3.96s. Initial collection failed +because the fresh checkout lacked _tabular_native; retained reproducer-original.log. +Built existing unchanged setup.py extension declarations locally (no installation, +JVM/server/viewer or dependency changes), maxRSS144720KiB,4.02s; source-build.log. +Owner-policy import was40MiB and resolved this worktree, policy-import.log. + +Required relation and owners +---------------------------- + +CellProfiler ImageNumber identifies a source IMAGE SET, not the currently +selected channel, measurement module, local slice position or provenance path +when semantic coordinates identify the set. A full plane address does not +declare every address axis to be a stack member. Across a paired primary-plane +declaration set, equal singleton component_values are fixed field coordinates; +different/unresolved coordinates remain plane selection dimensions under the +existing binding rule. Explicit source_stack_components and group_component +remain authoritative, even when their current coordinate happens to be equal. +One-plane binding contexts retain their existing selection semantics (there is +no cross-binding equality witness); no compatibility facade/reader is added. + +SourceImageSetIdentityPolicy.from_source_bindings owns the repair. It compiles +plate-wide via from_pipeline_config at compiler.py:207..209 and travels as the +same typed value through ProcessingContext and RuntimeArtifactBatch. Provenance +continues to retain original plane paths and coordinates. RuntimeExecutionAxisScope +keeps independent execution axes. CellProfilerImageSetNumbering consumes the +policy unchanged. MeasureObjectSizeShapeModule retains declared object identity +and feature semantics; spreadsheet_export.py:296..300/:398..413 continues its +ordinary typed row projection/union. No stored-format change or frozen migration. + +Ownership crossings and destination +----------------------------------- + +Open PRs309,217,207,206,160,125,110 checked with exact changed-file lists. PR206 +touches source_bindings.py; PR217 (Avicenna) touches runtime_image_values.py and +runtime_plane_projection.py. Those files stay read-only in this repair. +Existing binding/provenance owners are consumed, not edited or duplicated. +Notify Avicenna directly if any of those shared owner implementations become +necessary; do not compete with their worktree. No new coordinator or worker. + +Replace only from_source_bindings' unqualified component-collection expression +with a derivation that excludes shared fixed cross-binding coordinates from +binding-selected membership. Keep explicit stack/group membership. No new +carrier/store/registry. Destination new-case experiment: add another plane +binding or different semantic field coordinates through existing declarations; +the consumer/exporter changes0 times. Tests cover independent site/z/time/well +and execution identities, explicit stacked equal-coordinate axes, column/label +semantics and existing applicable source-level CellProfiler contracts. + +Done when the original behavioral failure passes, controls preserve separate +fields and declared stacks, applicable provider-free source tests pass, changed +owner census adds no dispatch/raw-record/schema mirrors, and one coherent draft +PR is visible with original failures and exact proof limits. Live/native/JVM, +installed-entrypoint, external-oracle and biological acceptance remain parent +owned and unclaimed. Local focused tests are not full acceptance. + +Resources and disposal +---------------------- + +Preflight: warning-only20GiB policy; home12.5GiB free, availableRAM15.6GiB, +historical swap8.7GiB. Worker512MiB and CPUQuota100percent/threads1 enforced; +owned scratch ceiling256MiB at /home/ts/.cache/agent-scratch/issue314-russell. +Source, failures and handoff stay in this persistent worktree. Archive/preserve +failure logs and remove only owned disposable caches/builds after workers exit. diff --git a/docs/validation/paired_field_csv_314_20260930/pr-body.md b/docs/validation/paired_field_csv_314_20260930/pr-body.md new file mode 100644 index 0000000000..c40f9c5a76 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/pr-body.md @@ -0,0 +1,16 @@ +## Summary + +Refs #314. Source-only checkpoint based on current main `702b2c2c9`; parent owns integration and final installed/MCP acceptance. + +- Fix the earliest original owner, `SourceImageSetIdentityPolicy.from_source_bindings`: shared singleton binding coordinates constrain the paired field rather than becoming plane-member axes. Explicit source-stack and group declarations retain precedence. +- Consume existing `NamedSourceBinding.component_values()` authority; no CSV joining, axis/module switches, parallel registries, mirrors, compatibility reader, measurement-module workaround, or shared-file edit. +- Reproduce through the real spreadsheet exporter using tiny synthetic typed paired fields. Original source produces eight partial rows instead of four complete rows; repaired source combines lineage/location and shape while keeping fields distinct. +- Preserve H003e as immutable REJECT; no frozen data/output access, rerun, retune or mutation. + +## Evidence and limits + +100 focused source tests pass in 15.52s, maximum RSS 455620KiB under an enforced 512MiB / one CPU / one numeric-thread scope. Covers source identity, exporter/counts, provenance and measurement group scope, independent well/site/z/time, explicit stack/group overrides, third-channel extension, assignment precedence and missing-metadata path identity. `git diff --check` passes. + +Original collection/build, behavioral split and initial patch-syntax failures are retained. Full-context NRA stopped (exit124, peak RSS524536KiB, no result); no complete NRA/R1/DSL/native-equivalence proof claimed and no global limit raised. Current-head census, actual pattern IDs and source witnesses are in `docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst`; exact source results/commands and proof limits are in `checkpoint.rst` and retained logs. + +Shared owners remain read-only; [direct Avicenna coordination](https://github.com/OpenHCSDev/openhcs/pull/217#issuecomment-5920836946) identifies the boundary. No new agent/model/provider or installation. Local unchanged extension build only; no MCP/GUI/native-process/JVM/external-oracle or biological acceptance. Parent owns those final gates. This draft does not close #314 or claim live readiness. diff --git a/openhcs/core/source_matching.py b/openhcs/core/source_matching.py index b6f3f5b1ce..8b973cff4c 100644 --- a/openhcs/core/source_matching.py +++ b/openhcs/core/source_matching.py @@ -464,24 +464,41 @@ def from_source_bindings( *, group_component: AllComponents | None = None, ) -> "SourceImageSetIdentityPolicy": - """Return image-plane membership declared by source and group semantics.""" + """Return image-plane membership declared by source and group semantics. + + Equal singleton coordinates across primary bindings constrain the field; + they do not declare another plane-member axis. Explicit stack/group axes + still declare membership, even when the current coordinates are equal. + A single binding has no cross-binding fixed-coordinate witness. + """ if not isinstance(source_bindings, SourceBindingDeclarationsMixin): raise TypeError( "SourceImageSetIdentityPolicy.from_source_bindings requires " "SourceBindingDeclarationsMixin." ) + bindings = source_bindings.primary_plane_bindings + shared_components = frozenset( + component + for component in AllComponents + if len(bindings) > 1 + for values in ( + tuple(binding.component_values(component) for binding in bindings), + ) + if len(values[0]) == 1 and all(value == values[0] for value in values[1:]) + ) return cls( frozenset( ComponentSet.collect( source_bindings.source_stack_components, ( selector.component - for binding in source_bindings.primary_plane_bindings + for binding in bindings for selector in ( *binding.selector.components, *binding.component_identity, ) + if selector.component not in shared_components ), (group_component,), ) diff --git a/tests/unit/test_cellprofiler_spreadsheet_export.py b/tests/unit/test_cellprofiler_spreadsheet_export.py index 61f6b691f5..4778256337 100644 --- a/tests/unit/test_cellprofiler_spreadsheet_export.py +++ b/tests/unit/test_cellprofiler_spreadsheet_export.py @@ -56,6 +56,11 @@ ) from openhcs.core.source_image_provenance import SourceImageProvenancePlanes from openhcs.core.source_matching import SourceImageSetIdentityPolicy +from openhcs.core.source_bindings import ( + ComponentSelector, + NamedSourceBinding, + SourceBindingsConfig, +) from openhcs.core.source_metadata import ORIGINAL_SOURCE_METADATA_FIELD from openhcs.interop.cellprofiler.module_declarations import ( CellProfilerModule, @@ -563,6 +568,108 @@ def test_export_to_spreadsheet_uses_declared_image_set_identity_across_channels( ) +def test_export_to_spreadsheet_pairs_fully_addressed_field_measurements() -> None: + """A biological address is not a declaration to stack every addressed axis.""" + bindings = SourceBindingsConfig( + bindings=tuple( + NamedSourceBinding( + alias=alias, + component_identity=tuple( + ComponentSelector(component, value) + for component, value in ( + (AllComponents.WELL, "A01"), + (AllComponents.SITE, "1"), + (AllComponents.CHANNEL, channel), + (AllComponents.Z_INDEX, "1"), + (AllComponents.TIMEPOINT, "1"), + ) + ), + ) + for alias, channel in (("DNA", "1"), ("Actin", "2")) + ) + ) + policy = SourceImageSetIdentityPolicy.from_source_bindings( + bindings, + group_component=AllComponents.CHANNEL, + ) + records = [] + # Two independent fields, each with two cells. Local slice/object IDs repeat + # intentionally: provenance, not runtime row position, owns field identity. + for site in ("1", "2"): + for channel, features in ( + ("1", {"Parent_Nuclei": 1, "Location_Center_X": 1.5}), + ("2", {"AreaShape_Area": 4.0}), + ): + provenance = SourceImageProvenancePlanes.from_components( + paths=(f"/synthetic/A01-field{site}-plane{channel}.tif",), + component_metadata=( + { + "well": "A01", + "site": site, + "channel": channel, + "z_index": "1", + "timepoint": "1", + }, + ), + ) + records.append( + _measurement_record( + f"field{site}_plane{channel}", + axis_id="A01", + subject=MeasurementSubject( + MeasurementScope.OBJECT, "Cells", "object_number" + ), + rows=tuple( + {"slice_index": 0, "object_number": number, **features} + for number in (1, 2) + ), + source_image_provenance_planes=provenance, + group_component=AllComponents.CHANNEL, + group_key=channel, + variable_components=(AllComponents.SITE,), + ) + ) + records.append( + _measurement_record( + f"field{site}_counts", + axis_id="A01", + subject=MeasurementSubject(MeasurementScope.IMAGE, "Image"), + rows=({"slice_index": 0, "Count_Cells": 2},), + source_image_provenance_planes=provenance, + group_component=AllComponents.CHANNEL, + group_key="2", + variable_components=(AllComponents.SITE,), + ) + ) + batch = RuntimeArtifactBatch( + input_specs=tuple( + ArtifactSpec.input(record.key.name, MeasurementsArtifactType) + for record in records + ), + records_by_axis={"A01": tuple(records)}, + source_image_set_identity_policy=policy, + ) + + bundle = export_to_spreadsheet(add_filename_prefix=False, artifact_batch=batch) + + cells = tuple(csv.DictReader(io.StringIO(bundle["Cells.csv"]))) + assert cells == tuple( + { + "image_number": image_number, + "object_label": object_number, + "Parent_Nuclei": "1", + "Location_Center_X": "1.5", + "AreaShape_Area": "4.0", + } + for image_number in ("1", "2") + for object_number in ("1", "2") + ) + assert tuple(csv.DictReader(io.StringIO(bundle["Image.csv"]))) == ( + {"image_number": "1", "Count_Cells": "2"}, + {"image_number": "2", "Count_Cells": "2"}, + ) + + def test_export_to_spreadsheet_nulls_metadata_that_differs_between_image_planes() -> ( None ): diff --git a/tests/unit/test_source_image_set_identity_policy.py b/tests/unit/test_source_image_set_identity_policy.py new file mode 100644 index 0000000000..cc0a32eab9 --- /dev/null +++ b/tests/unit/test_source_image_set_identity_policy.py @@ -0,0 +1,147 @@ +"""Field identity derives from binding coordinates, not selected plane paths.""" + +import pytest + +from openhcs.constants.constants import AllComponents +from openhcs.core.component_group_scope import RuntimeExecutionAxisScope +from openhcs.core.source_bindings import ( + ComponentSelector, + NamedSourceBinding, + SourceBindingsConfig, + SourceSelector, +) +from openhcs.core.source_image_provenance import SourceImageProvenance +from openhcs.core.source_matching import ( + SourceImageSetIdentity, + SourceImageSetIdentityPolicy, +) +from openhcs.interop.cellprofiler.image_set_numbering import ( + CellProfilerImageSetNumbering, +) + + +def _bindings(*, stack=(), selectors=False): + return SourceBindingsConfig( + source_stack_components=stack, + bindings=tuple( + NamedSourceBinding( + alias=f"Plane{channel}", + selector=SourceSelector(components=coordinates) + if selectors + else SourceSelector(), + component_identity=() if selectors else coordinates, + ) + for channel in ("1", "2", "3") + for coordinates in ( + tuple( + ComponentSelector(component, value) + for component, value in ( + (AllComponents.WELL, "A01"), + (AllComponents.SITE, "1"), + (AllComponents.CHANNEL, channel), + (AllComponents.Z_INDEX, "1"), + (AllComponents.TIMEPOINT, "1"), + ) + ), + ) + ), + ) + + +@pytest.mark.parametrize("selectors", (False, True)) +def test_shared_binding_coordinates_remain_field_axes(selectors): + policy = SourceImageSetIdentityPolicy.from_source_bindings( + _bindings(selectors=selectors) + ) + + assert policy.plane_member_components == frozenset((AllComponents.CHANNEL,)) + + +@pytest.mark.parametrize( + "component", (AllComponents.SITE, AllComponents.Z_INDEX, AllComponents.TIMEPOINT) +) +def test_explicit_stack_and_group_axes_override_shared_coordinates(component): + for policy in ( + SourceImageSetIdentityPolicy.from_source_bindings( + _bindings(stack=(component,)) + ), + SourceImageSetIdentityPolicy.from_source_bindings( + _bindings(), group_component=component + ), + ): + assert policy.plane_member_components == frozenset( + (AllComponents.CHANNEL, component) + ) + + +@pytest.mark.parametrize( + "component", + ( + AllComponents.WELL, + AllComponents.SITE, + AllComponents.Z_INDEX, + AllComponents.TIMEPOINT, + ), +) +def test_numbering_combines_channels_but_preserves_independent_fields(component): + policy = SourceImageSetIdentityPolicy.from_source_bindings(_bindings()) + numbering = CellProfilerImageSetNumbering(policy) + scope = RuntimeExecutionAxisScope.from_raw( + "A01", component=AllComponents.CHANNEL, value="1" + ) + metadata = { + "well": "A01", + "site": "1", + "channel": "1", + "z_index": "1", + "timepoint": "1", + } + numbers = [] + for field_value in ("1", "2"): + for channel in ("1", "2", "3"): + provenance = SourceImageProvenance( + source_path=f"/synthetic/field-{field_value}-plane-{channel}.tif", + source_component_metadata={ + **metadata, + component.value: field_value, + "channel": channel, + }, + ) + numbers.append( + numbering.for_source_slice( + scope=scope, provenance=provenance, slice_index=0, owner="Cells" + ) + ) + + assert numbers == [1, 1, 1, 2, 2, 2] + + +def test_component_assignment_owns_identity_over_physical_selector(): + declarations = SourceBindingsConfig( + bindings=tuple( + NamedSourceBinding( + alias=f"Plane{channel}", + selector=SourceSelector( + components=(ComponentSelector(AllComponents.SITE, physical_site),) + ), + component_identity=( + ComponentSelector(AllComponents.SITE, "1"), + ComponentSelector(AllComponents.CHANNEL, channel), + ), + ) + for channel, physical_site in (("1", "7"), ("2", "8")) + ) + ) + policy = SourceImageSetIdentityPolicy.from_source_bindings(declarations) + + assert policy.plane_member_components == frozenset((AllComponents.CHANNEL,)) + + +def test_path_identity_stays_distinct_without_semantic_field_coordinates(): + policy = SourceImageSetIdentityPolicy.from_source_bindings(_bindings()) + + assert SourceImageSetIdentity.from_metadata( + {}, fallback_source_path="/synthetic/one.tif", policy=policy + ) != SourceImageSetIdentity.from_metadata( + {}, fallback_source_path="/synthetic/two.tif", policy=policy + ) From eb392da9895b7c033495280505ba63d4c5ca84ca Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Wed, 30 Sep 2026 18:47:05 -0400 Subject: [PATCH 2/6] Retain bounded source proofs and original failure controls for #314 --- .../PREFLIGHT.json | 11 + .../checkpoint.rst | 36 +- .../core-census.json.gz | Bin 0 -> 5753 bytes .../core-census.log | 41 ++ .../core-overlay.json.gz | Bin 0 -> 13323 bytes .../core-overlay.log | 116 +++ .../effective-imports-error.log | 0 .../effective-imports.json | 24 + .../final-policy-exporter.log | 37 + .../nra-original-resources.log | 24 + .../nra-original.json | 14 + .../nra-owner-loop-resources.log | 23 + .../nra-owner-loop.json | 35 + .../owner-census-delta.json | 59 ++ .../owner-census-delta.log | 31 + .../owner-fixed-corrected.log | 38 + .../owner-fixed.log | 175 +++++ .../ownership-receipt.rst | 13 + .../policy-import.log | 24 + .../related-owner-contracts.log | 659 ++++++++++++++++++ .../reproducer-original-built.log | 125 ++++ .../reproducer-original.log | 66 ++ .../ruff-focused.log | 21 + .../source-anchors-base-empty-snapshot.log | 77 ++ .../source-anchors-base-verified.log | 659 ++++++++++++++++++ .../source-anchors-base.log | 77 ++ .../source-build.log | 32 + .../test_source_image_set_identity_policy.py | 19 +- 28 files changed, 2434 insertions(+), 2 deletions(-) create mode 100644 docs/validation/paired_field_csv_314_20260930/PREFLIGHT.json create mode 100644 docs/validation/paired_field_csv_314_20260930/core-census.json.gz create mode 100644 docs/validation/paired_field_csv_314_20260930/core-census.log create mode 100644 docs/validation/paired_field_csv_314_20260930/core-overlay.json.gz create mode 100644 docs/validation/paired_field_csv_314_20260930/core-overlay.log create mode 100644 docs/validation/paired_field_csv_314_20260930/effective-imports-error.log create mode 100644 docs/validation/paired_field_csv_314_20260930/effective-imports.json create mode 100644 docs/validation/paired_field_csv_314_20260930/final-policy-exporter.log create mode 100644 docs/validation/paired_field_csv_314_20260930/nra-original-resources.log create mode 100644 docs/validation/paired_field_csv_314_20260930/nra-original.json create mode 100644 docs/validation/paired_field_csv_314_20260930/nra-owner-loop-resources.log create mode 100644 docs/validation/paired_field_csv_314_20260930/nra-owner-loop.json create mode 100644 docs/validation/paired_field_csv_314_20260930/owner-census-delta.json create mode 100644 docs/validation/paired_field_csv_314_20260930/owner-census-delta.log create mode 100644 docs/validation/paired_field_csv_314_20260930/owner-fixed-corrected.log create mode 100644 docs/validation/paired_field_csv_314_20260930/owner-fixed.log create mode 100644 docs/validation/paired_field_csv_314_20260930/policy-import.log create mode 100644 docs/validation/paired_field_csv_314_20260930/related-owner-contracts.log create mode 100644 docs/validation/paired_field_csv_314_20260930/reproducer-original-built.log create mode 100644 docs/validation/paired_field_csv_314_20260930/reproducer-original.log create mode 100644 docs/validation/paired_field_csv_314_20260930/ruff-focused.log create mode 100644 docs/validation/paired_field_csv_314_20260930/source-anchors-base-empty-snapshot.log create mode 100644 docs/validation/paired_field_csv_314_20260930/source-anchors-base-verified.log create mode 100644 docs/validation/paired_field_csv_314_20260930/source-anchors-base.log create mode 100644 docs/validation/paired_field_csv_314_20260930/source-build.log diff --git a/docs/validation/paired_field_csv_314_20260930/PREFLIGHT.json b/docs/validation/paired_field_csv_314_20260930/PREFLIGHT.json new file mode 100644 index 0000000000..aff2179909 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/PREFLIGHT.json @@ -0,0 +1,11 @@ +{ + "command": "/home/ts/bin/agent-resource-check --assert-headroom", + "exit_code": 2, + "actual_result": {"free_gib": {"/": 8.2, "/dev/shm": 15.5, "/home": 12.5, "/tmp": 11.3}, "level": "warning", "ram_available_gib": 15.6, "reasons": ["/home free 12.5 GiB", "swap used 8.7 GiB"], "swap_used_gib": 8.7}, + "admission": "20GiB warning only; bounded source worker/scratch", + "worker_memory_limit_bytes": 536870912, + "cpu_quota_percent": 100, + "numeric_threads": 1, + "owned_scratch_limit_bytes": 268435456, + "owned_scratch": "/home/ts/.cache/agent-scratch/issue314-russell" +} diff --git a/docs/validation/paired_field_csv_314_20260930/checkpoint.rst b/docs/validation/paired_field_csv_314_20260930/checkpoint.rst index 8f63689d1b..13353a453d 100644 --- a/docs/validation/paired_field_csv_314_20260930/checkpoint.rst +++ b/docs/validation/paired_field_csv_314_20260930/checkpoint.rst @@ -44,4 +44,38 @@ No response or coordinated shared edit is claimed; no waiting or new agent call. H003e immutable REJECT remains untouched. Issue314 is not closed by source tests. Source/wheel/MCP continuity and external semantics acceptance remain separate -parent gates. Pending follow-up checks will be added to this same coherent PR. +parent gates. + +Additional source checkpoint before main integration +--------------------------------------------------- + +131 distinct source tests pass across the focused owner/exporter and related +CellProfiler shape, secondary-distance and module-scope shards. The final +policy/exporter shard is41 passed,4.91s, maximumRSS378400KiB and includes the +normal from_pipeline_config path. The related shard is30 passed/8 failed, +maximumRSS518188KiB (below512MiB). Its eight matched-anchor fixture failures +all reach MeasurementsArtifactType.require_output_subject before this policy: +legacy synthetic fixtures lack MeasurementSubjectRelation. All eight also fail +on unmodified main702b2c2c9 (source-anchors-base-verified.log:8 failed/3 passed). +Parent integration owns disposition of that inherited fixture mismatch; acceptance +requires properly typed subjects, not weakening the guard. No fixture/assertion +was relaxed. Earlier baseline snapshot assembly attempts (empty snapshot and +missing pytest_integration_options) are retained separately as harness failures. + +The lightweight one-file NRA loop completed in2.97s/77176KiB, zero findings; +its actual scan_status is exact_compact_global,79 analyzed detectors,0 omitted, +complete=true. This is complete ONLY for the selected source_matching.py input, +not a complete OpenHCS context scan or formal equivalence proof. Full-context +failure remains retained. Changed-core census at source commit6f636c2afe6d98cc +adds16 code lines and zero in every other measured syntax category. + +Effective OpenHCS imports resolve this worktree (source version0.8.7), not the +installed distribution metadata0.8.6. Existing editable PolyStore resolves +/home/ts/wt/openhcs-custom-function-admission-20260929/external/PolyStore, +clean at1209068f5fc9e4f7025a24ada8a73ef30dd1ddd7. This dependency is unmodified; +these checks do not prove a frozen gitlink dependency closure or installed parity. +Exact other effective imports/versions are retained in effective-imports.json. + +New main2b7969f700c33eb7f73f891d975afd1efc0628bb is being integrated normally +at the owner's request. It changes viewer owners, not the repaired policy. +No parent viewer/MCP acceptance is attributed to this source-only repair. diff --git a/docs/validation/paired_field_csv_314_20260930/core-census.json.gz b/docs/validation/paired_field_csv_314_20260930/core-census.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f12ab38fdcfc4ee5e79cf377a8324c772dce884 GIT binary patch literal 5753 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 literal 0 HcmV?d00001 diff --git a/docs/validation/paired_field_csv_314_20260930/core-census.log b/docs/validation/paired_field_csv_314_20260930/core-census.log new file mode 100644 index 0000000000..54631c41b6 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/core-census.log @@ -0,0 +1,41 @@ +snapshot at 702b2c2c9563da2636db251f8b734cff215596b8 + +per 1,000 code lines snapshot +type_identity_check 0.25 +long_boolean_chain 0.45 +boolean_chain_terms 2.09 +codec_subclass 0.00 +foreign_absence_probe 5.49 +string_dispatch 0.08 +type_switch 0.32 +string_dispatch_arms 0.26 +type_switch_arms 1.38 +string_key_subscript 3.00 +literal_key_get 1.22 +string_equality 0.67 +none_identity 27.62 +isinstance_call 9.00 +attribute_by_name 0.14 +getattr_default 0.08 +broad_except 0.56 +json_loads 0.02 +long_function 0.50 +class_definition 15.03 +abstract_base 1.45 +enum_class 0.94 +HEADLINE 3.7 (type_identity_check + long_boolean_chain + string_key_subscript) +code lines 91295 + +Top 12 files by weighted debt (type_identity_check x3, long_boolean_chain x5, boolean_chain_terms x1, codec_subclass x3, foreign_absence_probe x1, string_dispatch x5, type_switch x5, string_dispatch_arms x1, type_switch_arms x1, string_key_subscript x1, literal_key_get x1, string_equality x1, none_identity x1, isinstance_call x1, attribute_by_name x3, getattr_default x3, broad_except x2): + 267 openhcs/core/debug.py (code lines +2663) + 202 openhcs/core/artifacts.py (code lines +2665) + 181 openhcs/core/steps/function_runtime.py (code lines +3182) + 161 openhcs/core/runtime_image_values.py (code lines +1816) + 153 openhcs/core/pipeline/path_planner.py (code lines +2711) + 148 openhcs/core/measurement_row_materialization.py (code lines +2156) + 144 openhcs/core/source_bindings.py (code lines +2346) + 129 openhcs/core/source_image_provenance.py (code lines +1732) + 128 openhcs/core/callable_contract.py (code lines +2019) + 122 openhcs/core/equivalence/measurement_rows.py (code lines +2341) + 105 openhcs/core/debug_view_models.py (code lines +394) + 85 openhcs/core/runtime_equivalence.py (code lines +2846) diff --git a/docs/validation/paired_field_csv_314_20260930/core-overlay.json.gz b/docs/validation/paired_field_csv_314_20260930/core-overlay.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c01643a81743a9e656b6cbc676d4ab29973b0ac7 GIT binary patch literal 13323 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 VP?}!^zkTuX{{w36iIApZ0RZ>@30MFC literal 0 HcmV?d00001 diff --git a/docs/validation/paired_field_csv_314_20260930/core-overlay.log b/docs/validation/paired_field_csv_314_20260930/core-overlay.log new file mode 100644 index 0000000000..75a58cb2db --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/core-overlay.log @@ -0,0 +1,116 @@ +SUMMARY + string_dispatch 6 + isinstance_switch 33 + raw_shape 33 (bypassing an existing class: 28; hand-mapped into one: 1) + exact_key_set 0 + named_attribute 13 (most probed: __key_extractor__ x2, _identity x2, variable_component_stack_requirement x1, all x1, __name__ x1, __doc__ x1) + long_condition 4 (leads by dominant term: IDEN-1 1, IDEN-3 1, IMPL-1 1, IMPL-10 1) + god_class 14 + god_function 46 + legacy_marker 367 + positional_insert 0 + column_insert 0 + embedded_script 0 + child_process_site 0 + literal_roster 1 + dead_module 160 + +STRING DISPATCH: one subject compared against several string literals + 6 openhcs/core/runtime_array_values.py::runtime_array_ufunc_result on method ['__call__', 'accumulate', 'at', 'outer', 'reduce', 'reduceat'] + 3 openhcs/core/equivalence/keys.py::semantic_core_parts on self.parts[1] ['x', 'y', 'z'] + 3 openhcs/core/pipeline/funcstep_contract_validator.py::_add_module_if_external on module_name ['__builtins__', 'builtins', 'openhcs'] + 3 openhcs/core/runtime_profile.py::enabled on os.environ.get(PROFILE_RUNTIME_ENV, ''). ['1', 'true', 'yes'] + 3 openhcs/core/steps/function_execution.py::from_environment on raw_enabled.lower() ['1', 'true', 'yes'] + 3 openhcs/core/steps/function_runtime.py::enabled on raw_value.lower() ['1', 'true', 'yes'] + +ISINSTANCE SWITCHES: several type checks on one subject + 11 openhcs/core/debug.py::from_value on value + 8 openhcs/core/equivalence/cells.py::update_measurement_table_cell_hash on value + 7 openhcs/core/equivalence/cells.py::measurement_table_cell_payload on value + 6 openhcs/core/debug_view_models.py::debug_view_jsonable on value + 6 openhcs/core/debug_views.py::_debug_table_jsonable on value + 5 openhcs/core/debug_view_models.py::debug_view_cell_text on value + 5 openhcs/core/debug_views.py::_debug_table_cell_text on value + 5 openhcs/core/function_patterns.py::get_core_callable on func_pattern + 5 openhcs/core/function_step_transport.py::normalize_function_spec on func_spec + 4 openhcs/core/aligned_image_payload.py::payload_slices_for_alignment on payload + +RAW SHAPES: one subject read by several string keys + 18 openhcs/core/progress/types.py::from_dict data ['completed', 'component', 'context', 'error', 'message', 'owned_wells'] -> MATCHES openhcs/core/progress/types.py::ProgressEvent: a bypass, unless the data is copied into it elsewhere + 14 openhcs/core/debug.py::from_json_dict data ['axis_id', 'callable_name', 'cursor', 'exception', 'input_artifact_refs', 'invocation_parameters'] -> MATCHES openhcs/core/debug.py::DebugBoundaryState: a bypass, unless the data is copied into it elsewhere + 12 openhcs/core/runtime_spatial_grid.py::from_mapping data ['columns', 'ordering', 'origin', 'rows', 'slice_index', 'spot_table'] -> MATCHES openhcs/core/runtime_spatial_grid.py::SpatialGrid: a bypass, unless the data is copied into it elsewhere + 11 openhcs/core/progress/types.py::to_dict result ['component', 'context', 'error', 'message', 'owned_wells', 'pattern'] -> MATCHES openhcs/core/progress/types.py::ProgressEvent: a bypass, unless the data is copied into it elsewhere + 10 openhcs/core/debug.py::from_json_dict data ['content_digest', 'cursor', 'dtype', 'identity', 'kind', 'name'] -> MATCHES openhcs/core/debug.py::DebugArtifactRef: a bypass, unless the data is copied into it elsewhere + 9 openhcs/core/debug.py::from_payload payload ['command_type', 'debug_session_id', 'pause_step_indices', 'replay_mode', 'selected_source_group', 'snapshot_store_backend'] -> MATCHES openhcs/core/debug.py::DebugExecutionConfig: a bypass, unless the data is copied into it elsewhere + 9 openhcs/core/progress/live_measurements.py::from_dict data ['address', 'columns', 'materialized_locations', 'object_name', 'row_count', 'rows'] -> MATCHES openhcs/core/progress/live_measurements.py::LiveMeasurementTablePreview: a bypass, unless the data is copied into it elsewhere + 7 openhcs/core/debug.py::from_json_dict data ['group_keys', 'kind', 'name', 'producer_step_index', 'producer_step_name', 'producer_step_scope_id'] -> MATCHES openhcs/core/debug.py::DebugArtifactIdentity: a bypass, unless the data is copied into it elsewhere + 7 openhcs/core/utils.py::analyze_thread_activity activity ['action', 'active_threads', 'duration', 'function', 'thread_name', 'time'] -> unmodeled + 7 openhcs/core/utils.py::print_thread_activity_report overlap ['duration', 'function1', 'function2', 'thread1', 'thread2', 'well1'] -> unmodeled + +LONG CONDITIONS: syntactic ownership leads, verify before choosing a target + 14 terms openhcs/core/debug_view_models.py:463 [literal 13, predicate 1] -> lead: IMPL-1 + 9 terms openhcs/core/source_bindings.py:1973 [flag 8, absence 1] -> lead: IMPL-10 + 7 terms openhcs/core/debug.py:590 [same_value 7] -> lead: IDEN-1 + 6 terms openhcs/core/debug_session_projection.py:275 [absence 6] -> lead: IDEN-3 + +GOD CLASSES (over 500 lines) + 1806 openhcs/core/pipeline/compiler.py::PipelineCompiler + 1430 openhcs/core/pipeline/path_planner.py::PathPlannerArtifactStage + 1053 openhcs/core/runtime_image_values.py::ImagePayloadMetadata + 990 openhcs/core/steps/function_runtime.py::PatternGroupRuntime + 965 openhcs/core/orchestrator/orchestrator.py::PipelineOrchestrator + 914 openhcs/core/pipeline/funcstep_contract_validator.py::FuncStepContractValidator + 760 openhcs/core/equivalence/policy.py::RuntimeMeasurementDialect + 717 openhcs/core/equivalence/measurement_rows.py::RuntimeRowProjectionContext + 694 openhcs/core/callable_contract.py::CallableContract + 691 openhcs/core/steps/function_output_identity.py::FunctionOutputIdentityAuthority + +GOD FUNCTIONS (over 100 lines) + 324 openhcs/core/measurement_row_materialization.py::add + 246 openhcs/core/equivalence/policy.py::__post_init__ + 224 openhcs/core/pipeline/path_planner.py::process_artifact_outputs + 196 openhcs/core/aligned_image_payload.py::compose_aligned_image_payload + 190 openhcs/core/viewer_streaming_service.py::stream_rois + 176 openhcs/core/pipeline/compiler.py::compile_pipelines + 164 openhcs/core/steps/function_runtime.py::_save_outputs + 152 openhcs/core/steps/function_runtime.py::_load_input_stack + 150 openhcs/core/equivalence/relationships.py::object_measurement_values_by_label + 149 openhcs/core/source_binding_workspace.py::_matched_source_sets + +LITERAL ROSTERS: one set of string literals written in several places + 3x ['1', 'true', 'yes'] + +DEAD MODULES: imported by nothing in the package + 44 openhcs/core/alias_property.py + 1566 openhcs/core/aligned_image_payload.py + 218 openhcs/core/artifact_inspection.py + 120 openhcs/core/artifact_key_selection.py + 3172 openhcs/core/artifacts.py + 121 openhcs/core/autoregister_preparation.py + 88 openhcs/core/axis_filter.py + 2313 openhcs/core/callable_contract.py + 226 openhcs/core/compiled_execution.py + 480 openhcs/core/compiled_step_plan.py + Command being timed: "env PYTHONDONTWRITEBYTECODE=1 /home/ts/code/projects/openhcs/.venv/bin/python -B .issue314/refactor-audit/scripts/overlay.py --repo . --root openhcs/core --rev 702b2c2c9563da2636db251f8b734cff215596b8 --json docs/validation/paired_field_csv_314_20260930/core-overlay.json" + User time (seconds): 19.87 + System time (seconds): 0.52 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:20.50 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 164228 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 110887 + Voluntary context switches: 758 + Involuntary context switches: 182 + Swaps: 0 + File system inputs: 0 + File system outputs: 200 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/paired_field_csv_314_20260930/effective-imports-error.log b/docs/validation/paired_field_csv_314_20260930/effective-imports-error.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/validation/paired_field_csv_314_20260930/effective-imports.json b/docs/validation/paired_field_csv_314_20260930/effective-imports.json new file mode 100644 index 0000000000..00903619fd --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/effective-imports.json @@ -0,0 +1,24 @@ +{ + "python": "3.12.3 (main, May 22 2025, 14:39:13) [GCC 14.2.1 20250207]", + "imports": { + "openhcs": "/home/ts/wt/openhcs-paired-field-csv-314-20260930/openhcs/__init__.py", + "polystore": "/home/ts/wt/openhcs-custom-function-admission-20260929/external/PolyStore/src/polystore/__init__.py", + "metaclass_registry": "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/metaclass_registry/__init__.py", + "python_introspect": "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/python_introspect/__init__.py", + "objectstate": "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/objectstate/__init__.py", + "arraybridge": "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/arraybridge/__init__.py", + "pycodify": "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pycodify/__init__.py" + }, + "versions": { + "openhcs": "0.8.6", + "polystore": "0.2.19", + "metaclass-registry": "0.2.1", + "python-introspect": "0.1.14", + "objectstate": "1.1.8", + "arraybridge": "0.3.4", + "pycodify": "0.1.3", + "numpy": "2.1.3", + "scipy": "1.18.1", + "scikit-image": "0.25.2" + } +} diff --git a/docs/validation/paired_field_csv_314_20260930/final-policy-exporter.log b/docs/validation/paired_field_csv_314_20260930/final-policy-exporter.log new file mode 100644 index 0000000000..3f3e8b5fa5 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/final-policy-exporter.log @@ -0,0 +1,37 @@ +......................................... [100%] +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +41 passed, 2 warnings in 4.91s + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_source_image_set_identity_policy.py tests/unit/test_cellprofiler_spreadsheet_export.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-final" + User time (seconds): 5.73 + System time (seconds): 0.35 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:06.14 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 378400 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 69876 + Voluntary context switches: 30 + Involuntary context switches: 39 + Swaps: 0 + File system inputs: 32 + File system outputs: 56 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/paired_field_csv_314_20260930/nra-original-resources.log b/docs/validation/paired_field_csv_314_20260930/nra-original-resources.log new file mode 100644 index 0000000000..f0cc5becc6 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/nra-original-resources.log @@ -0,0 +1,24 @@ +Command exited with non-zero status 124 + Command being timed: "timeout 60s env OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=/home/ts/code/projects/nominal-refactor-advisor XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m nominal_refactor_advisor openhcs/core/source_matching.py openhcs/interop/cellprofiler/image_set_numbering.py --context-root openhcs --json --raw-findings --json-payload full --parse-workers 1 --analysis-workers 1 --no-cache" + User time (seconds): 22.78 + System time (seconds): 0.52 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:23.46 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 524536 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 184195 + Voluntary context switches: 92 + Involuntary context switches: 222 + Swaps: 0 + File system inputs: 2752 + File system outputs: 8 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 124 diff --git a/docs/validation/paired_field_csv_314_20260930/nra-original.json b/docs/validation/paired_field_csv_314_20260930/nra-original.json new file mode 100644 index 0000000000..7a16c89d4e --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/nra-original.json @@ -0,0 +1,14 @@ +{ + "findings": [], + "plans": [], + "finding_payload_mode": "deadline_incomplete", + "finding_count": null, + "finding_counts": null, + "scan_status": { + "complete": false, + "deadline_exceeded": true, + "stage": "parse_python_module", + "budget_seconds": 20.0, + "elapsed_seconds": 22.054 + } +} diff --git a/docs/validation/paired_field_csv_314_20260930/nra-owner-loop-resources.log b/docs/validation/paired_field_csv_314_20260930/nra-owner-loop-resources.log new file mode 100644 index 0000000000..6f6f8d83e8 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/nra-owner-loop-resources.log @@ -0,0 +1,23 @@ + Command being timed: "timeout 60s env OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=/home/ts/code/projects/nominal-refactor-advisor XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m nominal_refactor_advisor openhcs/core/source_matching.py --json --raw-findings --json-payload loop --no-auto-context-root --parse-workers 1 --analysis-workers 1 --no-cache" + User time (seconds): 2.81 + System time (seconds): 0.14 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.97 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 77176 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 12 + Minor (reclaiming a frame) page faults: 29232 + Voluntary context switches: 42 + Involuntary context switches: 21 + Swaps: 0 + File system inputs: 1496 + File system outputs: 8 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/paired_field_csv_314_20260930/nra-owner-loop.json b/docs/validation/paired_field_csv_314_20260930/nra-owner-loop.json new file mode 100644 index 0000000000..f3042364c8 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/nra-owner-loop.json @@ -0,0 +1,35 @@ +{ + "findings": [], + "plans": [], + "finding_payload_mode": "counts_only", + "finding_count": 0, + "finding_counts": { + "by_pattern": [], + "by_detector": [] + }, + "scan_status": { + "mode": "exact_compact_global", + "analyzed_detector_count": 79, + "omitted_detector_count": 0, + "complete": true, + "reason": "all_context_detectors_use_compact_global_projections" + }, + "timing": { + "parse_seconds": 1.231, + "analysis_seconds": 0.229, + "planning_seconds": 0.0, + "source_index_seconds": 0.0, + "analysis_cache_status": "disabled", + "total_seconds": 1.46 + }, + "active_finding_surface": "raw_findings", + "payload_timing": { + "observation_graph_seconds": 0.0, + "semantic_descent_graph_seconds": 0.0, + "source_snapshot_seconds": 0.0, + "source_index_payload_seconds": 0.0, + "semantic_refactor_gate_seconds": 0.0, + "finding_recipe_plan_seconds": 0.0, + "total_seconds": 0.003 + } +} diff --git a/docs/validation/paired_field_csv_314_20260930/owner-census-delta.json b/docs/validation/paired_field_csv_314_20260930/owner-census-delta.json new file mode 100644 index 0000000000..5a074405bb --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/owner-census-delta.json @@ -0,0 +1,59 @@ +{ + "base": "702b2c2c9563da2636db251f8b734cff215596b8", + "rev": "HEAD", + "change": { + "tally": { + "type_identity_check": 0, + "long_boolean_chain": 0, + "boolean_chain_terms": 0, + "codec_subclass": 0, + "foreign_absence_probe": 0, + "string_dispatch": 0, + "type_switch": 0, + "string_dispatch_arms": 0, + "type_switch_arms": 0, + "string_key_subscript": 0, + "literal_key_get": 0, + "string_equality": 0, + "none_identity": 0, + "isinstance_call": 0, + "attribute_by_name": 0, + "getattr_default": 0, + "broad_except": 0, + "json_loads": 0, + "long_function": 0, + "class_definition": 0, + "abstract_base": 0, + "enum_class": 0, + "code_lines": 16 + }, + "files": { + "openhcs/core/source_matching.py": { + "type_identity_check": 0, + "long_boolean_chain": 0, + "boolean_chain_terms": 0, + "codec_subclass": 0, + "foreign_absence_probe": 0, + "string_dispatch": 0, + "type_switch": 0, + "string_dispatch_arms": 0, + "type_switch_arms": 0, + "string_key_subscript": 0, + "literal_key_get": 0, + "string_equality": 0, + "none_identity": 0, + "isinstance_call": 0, + "attribute_by_name": 0, + "getattr_default": 0, + "broad_except": 0, + "json_loads": 0, + "long_function": 0, + "class_definition": 0, + "abstract_base": 0, + "enum_class": 0, + "code_lines": 16 + } + }, + "unparsed": [] + } +} \ No newline at end of file diff --git a/docs/validation/paired_field_csv_314_20260930/owner-census-delta.log b/docs/validation/paired_field_csv_314_20260930/owner-census-delta.log new file mode 100644 index 0000000000..eaac50f198 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/owner-census-delta.log @@ -0,0 +1,31 @@ +changed between 702b2c2c9563da2636db251f8b734cff215596b8..HEAD (touched files, after minus before) + +change in counts (702b2c2c9563da2636db251f8b734cff215596b8..HEAD): read these first when code was deleted as well as added + type_identity_check +0 + long_boolean_chain +0 + boolean_chain_terms +0 + codec_subclass +0 + foreign_absence_probe +0 + string_dispatch +0 + type_switch +0 + string_dispatch_arms +0 + type_switch_arms +0 + string_key_subscript +0 + literal_key_get +0 + string_equality +0 + none_identity +0 + isinstance_call +0 + attribute_by_name +0 + getattr_default +0 + broad_except +0 + json_loads +0 + long_function +0 + class_definition +0 + abstract_base +0 + enum_class +0 + code lines +16 + +(densities omitted: under 500 net code lines, a ratio of changes to net lines is meaningless) + +Top 12 files by weighted debt (type_identity_check x3, long_boolean_chain x5, boolean_chain_terms x1, codec_subclass x3, foreign_absence_probe x1, string_dispatch x5, type_switch x5, string_dispatch_arms x1, type_switch_arms x1, string_key_subscript x1, literal_key_get x1, string_equality x1, none_identity x1, isinstance_call x1, attribute_by_name x3, getattr_default x3, broad_except x2): + 0 openhcs/core/source_matching.py (code lines +16) diff --git a/docs/validation/paired_field_csv_314_20260930/owner-fixed-corrected.log b/docs/validation/paired_field_csv_314_20260930/owner-fixed-corrected.log new file mode 100644 index 0000000000..3a2515575f --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/owner-fixed-corrected.log @@ -0,0 +1,38 @@ +........................................................................ [ 72%] +............................ [100%] +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +100 passed, 2 warnings in 15.52s + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_cellprofiler_spreadsheet_export.py tests/unit/test_source_bindings.py tests/unit/test_source_image_provenance.py tests/unit/test_cellprofiler_measurement_source_group_scope.py tests/unit/test_source_image_set_identity_policy.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-fixed-corrected" + User time (seconds): 16.18 + System time (seconds): 0.64 + Percent of CPU this job got: 98% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:17.07 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 455620 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 110741 + Voluntary context switches: 264 + Involuntary context switches: 70 + Swaps: 0 + File system inputs: 11840 + File system outputs: 136 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/paired_field_csv_314_20260930/owner-fixed.log b/docs/validation/paired_field_csv_314_20260930/owner-fixed.log new file mode 100644 index 0000000000..db16ae6112 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/owner-fixed.log @@ -0,0 +1,175 @@ + +==================================== ERRORS ==================================== +_____ ERROR collecting tests/unit/test_cellprofiler_spreadsheet_export.py ______ +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/python.py:493: in importtestmodule + mod = import_path( +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/pathlib.py:587: in import_path + importlib.import_module(module_name) +../../.pyenv/versions/3.12.3/lib/python3.12/importlib/__init__.py:90: in import_module + return _bootstrap._gcd_import(name[level:], package, level) +:1387: in _gcd_import + ??? +:1360: in _find_and_load + ??? +:1331: in _find_and_load_unlocked + ??? +:935: in _load_unlocked + ??? +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:185: in exec_module + exec(co, module.__dict__) +tests/unit/test_cellprofiler_spreadsheet_export.py:29: in + from openhcs.core.pipeline.artifact_planning import artifact_producers_for_outputs +openhcs/core/pipeline/__init__.py:20: in + from openhcs.core.pipeline.funcstep_contract_validator import ( +openhcs/core/pipeline/funcstep_contract_validator.py:44: in + from openhcs.core.steps.function_step import FunctionStep +openhcs/core/steps/__init__.py:7: in + from openhcs.core.steps.abstract import AbstractStep +openhcs/core/steps/abstract.py:33: in + from openhcs.core.runtime_stores import ( +openhcs/core/runtime_stores.py:34: in + from openhcs.core.runtime_image_values import ( +openhcs/core/runtime_image_values.py:38: in + from openhcs.core.source_image_provenance import ( +openhcs/core/source_image_provenance.py:27: in + from openhcs.core.source_matching import ( +E File "/home/ts/wt/openhcs-paired-field-csv-314-20260930/openhcs/core/source_matching.py", line 494 +E if selector.component not in shared_components +E ^^ +E SyntaxError: invalid syntax +_____________ ERROR collecting tests/unit/test_source_bindings.py ______________ +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/python.py:493: in importtestmodule + mod = import_path( +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/pathlib.py:587: in import_path + importlib.import_module(module_name) +../../.pyenv/versions/3.12.3/lib/python3.12/importlib/__init__.py:90: in import_module + return _bootstrap._gcd_import(name[level:], package, level) +:1387: in _gcd_import + ??? +:1360: in _find_and_load + ??? +:1331: in _find_and_load_unlocked + ??? +:935: in _load_unlocked + ??? +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:185: in exec_module + exec(co, module.__dict__) +tests/unit/test_source_bindings.py:35: in + from openhcs.core.pipeline.step_snapshot import StepSnapshot +openhcs/core/pipeline/__init__.py:20: in + from openhcs.core.pipeline.funcstep_contract_validator import ( +openhcs/core/pipeline/funcstep_contract_validator.py:44: in + from openhcs.core.steps.function_step import FunctionStep +openhcs/core/steps/__init__.py:7: in + from openhcs.core.steps.abstract import AbstractStep +openhcs/core/steps/abstract.py:33: in + from openhcs.core.runtime_stores import ( +openhcs/core/runtime_stores.py:34: in + from openhcs.core.runtime_image_values import ( +openhcs/core/runtime_image_values.py:38: in + from openhcs.core.source_image_provenance import ( +openhcs/core/source_image_provenance.py:27: in + from openhcs.core.source_matching import ( +E File "/home/ts/wt/openhcs-paired-field-csv-314-20260930/openhcs/core/source_matching.py", line 494 +E if selector.component not in shared_components +E ^^ +E SyntaxError: invalid syntax +_________ ERROR collecting tests/unit/test_source_image_provenance.py __________ +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/python.py:493: in importtestmodule + mod = import_path( +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/pathlib.py:587: in import_path + importlib.import_module(module_name) +../../.pyenv/versions/3.12.3/lib/python3.12/importlib/__init__.py:90: in import_module + return _bootstrap._gcd_import(name[level:], package, level) +:1387: in _gcd_import + ??? +:1360: in _find_and_load + ??? +:1331: in _find_and_load_unlocked + ??? +:935: in _load_unlocked + ??? +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:185: in exec_module + exec(co, module.__dict__) +tests/unit/test_source_image_provenance.py:7: in + from openhcs.core.runtime_image_values import ( +openhcs/core/runtime_image_values.py:38: in + from openhcs.core.source_image_provenance import ( +openhcs/core/source_image_provenance.py:27: in + from openhcs.core.source_matching import ( +E File "/home/ts/wt/openhcs-paired-field-csv-314-20260930/openhcs/core/source_matching.py", line 494 +E if selector.component not in shared_components +E ^^ +E SyntaxError: invalid syntax +_ ERROR collecting tests/unit/test_cellprofiler_measurement_source_group_scope.py _ +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/python.py:493: in importtestmodule + mod = import_path( +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/pathlib.py:587: in import_path + importlib.import_module(module_name) +../../.pyenv/versions/3.12.3/lib/python3.12/importlib/__init__.py:90: in import_module + return _bootstrap._gcd_import(name[level:], package, level) +:1387: in _gcd_import + ??? +:1360: in _find_and_load + ??? +:1331: in _find_and_load_unlocked + ??? +:935: in _load_unlocked + ??? +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:185: in exec_module + exec(co, module.__dict__) +tests/unit/test_cellprofiler_measurement_source_group_scope.py:26: in + from openhcs.core.measurement_row_materialization import ( +openhcs/core/measurement_row_materialization.py:31: in + from openhcs.core.runtime_measurements import ( +openhcs/core/runtime_measurements.py:17: in + from openhcs.core.source_image_provenance import ( +openhcs/core/source_image_provenance.py:27: in + from openhcs.core.source_matching import ( +E File "/home/ts/wt/openhcs-paired-field-csv-314-20260930/openhcs/core/source_matching.py", line 494 +E if selector.component not in shared_components +E ^^ +E SyntaxError: invalid syntax +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +ERROR tests/unit/test_cellprofiler_spreadsheet_export.py +ERROR tests/unit/test_source_bindings.py +ERROR tests/unit/test_source_image_provenance.py +ERROR tests/unit/test_cellprofiler_measurement_source_group_scope.py +!!!!!!!!!!!!!!!!!!! Interrupted: 4 errors during collection !!!!!!!!!!!!!!!!!!!! +2 warnings, 4 errors in 2.07s +Command exited with non-zero status 2 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_cellprofiler_spreadsheet_export.py tests/unit/test_source_bindings.py tests/unit/test_source_image_provenance.py tests/unit/test_cellprofiler_measurement_source_group_scope.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-fixed" + User time (seconds): 2.30 + System time (seconds): 0.11 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.42 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 90572 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 23855 + Voluntary context switches: 40 + Involuntary context switches: 17 + Swaps: 0 + File system inputs: 448 + File system outputs: 48 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 2 diff --git a/docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst b/docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst index 3d2fa1e66f..0263da177a 100644 --- a/docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst +++ b/docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst @@ -53,6 +53,12 @@ beyond this observed boundary; no global limit was raised. There are no R1 mapping_read/unmodeled_record_shape/redundant_type_check findings to certify. This repair is an explicitly authored semantic patch, not an NRA-generated plan. +Follow-up one-module compact loop reports79 detectors,0 omissions, complete=true +and zero findings for source_matching.py alone (nra-owner-loop.json). Do not +extend that completeness to the failed full-package context. Source commit +6f636c2afe6d98cc has +16 core code lines and zero debt-screen delta in every +other measured category; owner-census-delta.json retains exact observations. + Original failing reproducer --------------------------- @@ -130,3 +136,10 @@ historical swap8.7GiB. Worker512MiB and CPUQuota100percent/threads1 enforced; owned scratch ceiling256MiB at /home/ts/.cache/agent-scratch/issue314-russell. Source, failures and handoff stay in this persistent worktree. Archive/preserve failure logs and remove only owned disposable caches/builds after workers exit. + +Durable .issue314/ (41MiB) holds the extracted current instruction archive and +original702b2c2c9 source snapshot for the inherited-failure control. It is local, +not a published source change. Disposable scratch measured652KiB; local build +objects400KiB. No task process remains running at this checkpoint. Existing +locally built extensions are not installed globally. Full test/dependency proof +limits and inherited fixture ownership are recorded in checkpoint.rst. diff --git a/docs/validation/paired_field_csv_314_20260930/policy-import.log b/docs/validation/paired_field_csv_314_20260930/policy-import.log new file mode 100644 index 0000000000..90b2be6324 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/policy-import.log @@ -0,0 +1,24 @@ +/home/ts/wt/openhcs-paired-field-csv-314-20260930/openhcs/__init__.py openhcs.core.source_matching + Command being timed: "env OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 OPENHCS_CPU_ONLY=true /home/ts/code/projects/openhcs/.venv/bin/python -B -c from openhcs.core.source_matching import SourceImageSetIdentityPolicy; import openhcs; print(openhcs.__file__, SourceImageSetIdentityPolicy.__module__)" + User time (seconds): 0.35 + System time (seconds): 0.05 + Percent of CPU this job got: 104% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.39 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 40452 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 9470 + Voluntary context switches: 24 + Involuntary context switches: 2 + Swaps: 0 + File system inputs: 16 + File system outputs: 8 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/paired_field_csv_314_20260930/related-owner-contracts.log b/docs/validation/paired_field_csv_314_20260930/related-owner-contracts.log new file mode 100644 index 0000000000..f1bdfead08 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/related-owner-contracts.log @@ -0,0 +1,659 @@ +.................FFFFFF..FF........... [100%] +=================================== FAILURES =================================== +_____ test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata ______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a670d040> + + def test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:270: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +___________ test_natural_callable_keeps_each_source_component_anchor ___________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a70d13a0> + + def test_natural_callable_keeps_each_source_component_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + composed_image_set=False, + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:287: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +_______ test_selected_source_contract_keeps_only_its_exact_alias_anchor ________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a670fce0> + + def test_selected_source_contract_keeps_only_its_exact_alias_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=("OrigHoechst",), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:302: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n... name='OrigHoechst')),), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +_______ test_distinct_metadata_sets_each_keep_one_source_representative ________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a70d1a90> + + def test_distinct_metadata_sets_each_keep_one_source_representative( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + sites=(1, 2), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:315: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +______ test_independent_source_aligned_outputs_keep_each_execution_group _______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a670c650> + + def test_independent_source_aligned_outputs_keep_each_execution_group( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=("OrigER", "OrigHoechst"), + shared_output=False, + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:336: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='OrigERMeasurements', artifact_type=, param...pe'>, name='OrigER')),), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='OrigERMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +______ test_missing_alias_in_match_dimension_keeps_existing_strict_error _______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a62abbc0> + + def test_missing_alias_in_match_dimension_keeps_existing_strict_error( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + with pytest.raises( + ValueError, + match="METADATA source binding dimension is missing alias 'OrigER'", + ): +> _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + dimension_aliases=tuple( + alias for alias, _channel in SOURCE_ALIASES if alias != "OrigER" + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:355: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError + +During handling of the above exception, another exception occurred: + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a62abbc0> + + def test_missing_alias_in_match_dimension_keeps_existing_strict_error( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> with pytest.raises( + ValueError, + match="METADATA source binding dimension is missing alias 'OrigER'", + ): +E AssertionError: Regex pattern did not match. +E Regex: "METADATA source binding dimension is missing alias 'OrigER'" +E Input: "Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + +tests/unit/test_source_bound_matched_image_set_anchors.py:351: AssertionError +___ test_complete_source_set_templates_preserve_each_execution_group_anchor ____ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a62ab9e0> + + def test_complete_source_set_templates_preserve_each_execution_group_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + bindings = tuple( + NamedSourceBinding( + alias=alias, + selector=SourceSelector( + components=(ComponentSelector(AllComponents.CHANNEL, channel),), + ), + origin=SourceBindingOrigin.PIPELINE_START, + component_identity=(ComponentSelector(AllComponents.CHANNEL, channel),), + ) + for alias, channel in (("OrigStain1", "1"), ("OrigStain2", "2")) + ) + input_specs = tuple(binding.input_spec() for binding in bindings) + measurements = ArtifactSpec.output( + "SourceSetMeasurements", + MeasurementsArtifactType, + relations=tuple( + GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + ), + ) + + @artifact_inputs(*input_specs) + @artifact_outputs(measurements) + @composed_image_payload + def align_source_set(image): + return image + + output_plan = ArtifactOutputPlan( + name=measurements.name, + path="/memory/SourceSetMeasurements.pkl", + artifact_type=measurements.artifact_type, + group_keys=("1", "2"), + group_component=AllComponents.SITE, + relations=measurements.relations, + ) + plan = SimpleNamespace( + axis_id="A01", + step_index=0, + step_name="Align", + main_input_dependency=StepInputDependency.pipeline_start(), + source_binding_plan=CompiledSourceBindingPlan( + bindings=bindings, + match_plan=SourceBindingMatchPlan( + method=SourceBindingMatchMethod.ORDER, + ), + ), + execution_group_scope=ComponentGroupScope.from_raw( + ("1", "2"), + component=AllComponents.SITE, + ), +> compiled_function_pattern=compile_function_pattern( + align_source_set, + {}, + {output_plan.ref(): output_plan}, + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:582: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='SourceSetMeasurements', artifact_type=, pa...>, name='OrigStain2'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='SourceSetMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +__ test_static_site_groups_do_not_cross_project_natural_source_set_templates ___ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ff9a670e990> + + def test_static_site_groups_do_not_cross_project_natural_source_set_templates( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + bindings = tuple( + NamedSourceBinding( + alias=alias, + selector=SourceSelector( + filters=(), + ), + origin=SourceBindingOrigin.PIPELINE_START, + component_identity=(ComponentSelector(AllComponents.CHANNEL, channel),), + ) + for alias, channel in (("OrigStain1", "1"), ("OrigStain2", "2")) + ) + input_specs = tuple(binding.input_spec() for binding in bindings) + output_specs = ( + ArtifactSpec.output( + "Stain1", + ImageArtifactType, + relations=(GroupLineageSourceRelation(source=input_specs[0].ref()),), + ), + ArtifactSpec.output( + "Stain2", + ImageArtifactType, + relations=(GroupLineageSourceRelation(source=input_specs[1].ref()),), + ), + ArtifactSpec.output( + "AlignMeasurements", + MeasurementsArtifactType, + relations=tuple( + GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + ), + ), + ) + + @artifact_inputs(*input_specs) + @artifact_outputs(*output_specs) + def align_source_set(image): + return image + + output_plans = { + spec.ref(): ArtifactOutputPlan( + name=spec.name, + path=f"/memory/{spec.name}.pkl", + artifact_type=spec.artifact_type, + group_keys=("1", "2"), + group_component=AllComponents.SITE, + relations=spec.relations, + ) + for spec in output_specs + } + plan = SimpleNamespace( + axis_id="A01", + step_index=0, + step_name="Align", + main_input_dependency=StepInputDependency.pipeline_start(), + source_binding_plan=CompiledSourceBindingPlan( + bindings=bindings, + match_plan=SourceBindingMatchPlan( + method=SourceBindingMatchMethod.ORDER, + ), + ), + execution_group_scope=ComponentGroupScope.from_raw( + ("1", "2"), + component=AllComponents.SITE, + ), +> compiled_function_pattern=compile_function_pattern( + align_source_set, + {}, + output_plans, + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:711: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='AlignMeasurements', artifact_type=, parame...>, name='OrigStain2'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='AlignMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_natural_callable_keeps_each_source_component_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_selected_source_contract_keeps_only_its_exact_alias_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_distinct_metadata_sets_each_keep_one_source_representative +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_independent_source_aligned_outputs_keep_each_execution_group +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_missing_alias_in_match_dimension_keeps_existing_strict_error +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_complete_source_set_templates_preserve_each_execution_group_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_static_site_groups_do_not_cross_project_natural_source_set_templates +8 failed, 30 passed, 2 warnings in 25.59s +Command exited with non-zero status 1 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_cellprofiler_shape_hotpath.py tests/unit/test_cellprofiler_module_measurement_scopes.py tests/unit/test_cellprofiler_identify_secondary_replacement_primary.py tests/unit/test_cellprofiler_secondary_distance_backend.py tests/unit/test_source_bound_matched_image_set_anchors.py tests/unit/test_source_image_provenance_hotpath.py tests/unit/test_function_output_manifest_input_scope.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-parity" + User time (seconds): 24.36 + System time (seconds): 2.18 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:26.70 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 518188 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 390812 + Voluntary context switches: 41 + Involuntary context switches: 146 + Swaps: 0 + File system inputs: 184 + File system outputs: 5600 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 1 diff --git a/docs/validation/paired_field_csv_314_20260930/reproducer-original-built.log b/docs/validation/paired_field_csv_314_20260930/reproducer-original-built.log new file mode 100644 index 0000000000..a1ca749ad0 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/reproducer-original-built.log @@ -0,0 +1,125 @@ +F [100%] +=================================== FAILURES =================================== +_____ test_export_to_spreadsheet_pairs_fully_addressed_field_measurements ______ + + def test_export_to_spreadsheet_pairs_fully_addressed_field_measurements() -> None: + """A biological address is not a declaration to stack every addressed axis.""" + bindings = SourceBindingsConfig( + bindings=tuple( + NamedSourceBinding( + alias=alias, + component_identity=tuple( + ComponentSelector(component, value) + for component, value in ( + (AllComponents.WELL, "A01"), + (AllComponents.SITE, "1"), + (AllComponents.CHANNEL, channel), + (AllComponents.Z_INDEX, "1"), + (AllComponents.TIMEPOINT, "1"), + ) + ), + ) + for alias, channel in (("DNA", "1"), ("Actin", "2")) + ) + ) + policy = SourceImageSetIdentityPolicy.from_source_bindings( + bindings, + group_component=AllComponents.CHANNEL, + ) + records = [] + # Two independent fields, each with two cells. Local slice/object IDs repeat + # intentionally: provenance, not runtime row position, owns field identity. + for site in ("1", "2"): + for channel, features in ( + ("1", {"Parent_Nuclei": 1, "Location_Center_X": 1.5}), + ("2", {"AreaShape_Area": 4.0}), + ): + provenance = SourceImageProvenancePlanes.from_components( + paths=(f"/synthetic/A01-field{site}-plane{channel}.tif",), + component_metadata=({ + "well": "A01", "site": site, "channel": channel, + "z_index": "1", "timepoint": "1", + },), + ) + records.append(_measurement_record( + f"field{site}_plane{channel}", + axis_id="A01", + subject=MeasurementSubject(MeasurementScope.OBJECT, "Cells", "object_number"), + rows=tuple({"slice_index": 0, "object_number": number, **features} + for number in (1, 2)), + source_image_provenance_planes=provenance, + group_component=AllComponents.CHANNEL, + group_key=channel, + variable_components=(AllComponents.SITE,), + )) + records.append(_measurement_record( + f"field{site}_counts", + axis_id="A01", + subject=MeasurementSubject(MeasurementScope.IMAGE, "Image"), + rows=({"slice_index": 0, "Count_Cells": 2},), + source_image_provenance_planes=provenance, + group_component=AllComponents.CHANNEL, + group_key="2", + variable_components=(AllComponents.SITE,), + )) + batch = RuntimeArtifactBatch( + input_specs=tuple(ArtifactSpec.input(record.key.name, MeasurementsArtifactType) + for record in records), + records_by_axis={"A01": tuple(records)}, + source_image_set_identity_policy=policy, + ) + + bundle = export_to_spreadsheet(add_filename_prefix=False, artifact_batch=batch) + + cells = tuple(csv.DictReader(io.StringIO(bundle["Cells.csv"]))) +> assert cells == tuple( + {"image_number": image_number, "object_label": object_number, + "Parent_Nuclei": "1", "Location_Center_X": "1.5", "AreaShape_Area": "4.0"} + for image_number in ("1", "2") for object_number in ("1", "2") + ) +E AssertionError: assert ({'AreaShape_...3', ...}, ...) == ({'AreaShape_...r': '2', ...}) +E +E At index 0 diff: {'image_number': '1', 'object_label': '1', 'Parent_Nuclei': '1', 'Location_Center_X': '1.5', 'AreaShape_Area': ''} != {'image_number': '1', 'object_label': '1', 'Parent_Nuclei': '1', 'Location_Center_X': '1.5', 'AreaShape_Area': '4.0'} +E Left contains 4 more items, first extra item: {'AreaShape_Area': '', 'Location_Center_X': '1.5', 'Parent_Nuclei': '1', 'image_number': '3', ...} +E Use -v to get more diff + +tests/unit/test_cellprofiler_spreadsheet_export.py:641: AssertionError +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED tests/unit/test_cellprofiler_spreadsheet_export.py::test_export_to_spreadsheet_pairs_fully_addressed_field_measurements +1 failed, 2 warnings in 3.28s +Command exited with non-zero status 1 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_cellprofiler_spreadsheet_export.py::test_export_to_spreadsheet_pairs_fully_addressed_field_measurements -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-original" + User time (seconds): 3.57 + System time (seconds): 0.27 + Percent of CPU this job got: 96% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.96 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 311488 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 12 + Minor (reclaiming a frame) page faults: 49055 + Voluntary context switches: 251 + Involuntary context switches: 21 + Swaps: 0 + File system inputs: 11520 + File system outputs: 40 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 1 diff --git a/docs/validation/paired_field_csv_314_20260930/reproducer-original.log b/docs/validation/paired_field_csv_314_20260930/reproducer-original.log new file mode 100644 index 0000000000..3ae63c2bd5 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/reproducer-original.log @@ -0,0 +1,66 @@ +ERROR: found no collectors for /home/ts/wt/openhcs-paired-field-csv-314-20260930/tests/unit/test_cellprofiler_spreadsheet_export.py::test_export_to_spreadsheet_pairs_fully_addressed_field_measurements + + +==================================== ERRORS ==================================== +_____ ERROR collecting tests/unit/test_cellprofiler_spreadsheet_export.py ______ +ImportError while importing test module '/home/ts/wt/openhcs-paired-field-csv-314-20260930/tests/unit/test_cellprofiler_spreadsheet_export.py'. +Hint: make sure your test modules/packages have valid Python names. +Traceback: +../../.pyenv/versions/3.12.3/lib/python3.12/importlib/__init__.py:90: in import_module + return _bootstrap._gcd_import(name[level:], package, level) +tests/unit/test_cellprofiler_spreadsheet_export.py:29: in + from openhcs.core.pipeline.artifact_planning import artifact_producers_for_outputs +openhcs/core/pipeline/__init__.py:20: in + from openhcs.core.pipeline.funcstep_contract_validator import ( +openhcs/core/pipeline/funcstep_contract_validator.py:44: in + from openhcs.core.steps.function_step import FunctionStep +openhcs/core/steps/__init__.py:7: in + from openhcs.core.steps.abstract import AbstractStep +openhcs/core/steps/abstract.py:33: in + from openhcs.core.runtime_stores import ( +openhcs/core/runtime_stores.py:41: in + from openhcs.core.runtime_slice_projection import RuntimeSliceProjection +openhcs/core/runtime_slice_projection.py:18: in + from openhcs.core.measurement_row_materialization import MeasurementRowsAxisProjection +openhcs/core/measurement_row_materialization.py:23: in + from openhcs.core._tabular_native import ( +E ModuleNotFoundError: No module named 'openhcs.core._tabular_native' +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +ERROR tests/unit/test_cellprofiler_spreadsheet_export.py +2 warnings, 1 error in 1.05s +Command exited with non-zero status 4 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_cellprofiler_spreadsheet_export.py::test_export_to_spreadsheet_pairs_fully_addressed_field_measurements -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-first" + User time (seconds): 1.32 + System time (seconds): 0.10 + Percent of CPU this job got: 100% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.41 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 87464 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 21322 + Voluntary context switches: 26 + Involuntary context switches: 6 + Swaps: 0 + File system inputs: 0 + File system outputs: 56 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 4 diff --git a/docs/validation/paired_field_csv_314_20260930/ruff-focused.log b/docs/validation/paired_field_csv_314_20260930/ruff-focused.log new file mode 100644 index 0000000000..79cdd68585 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/ruff-focused.log @@ -0,0 +1,21 @@ +E501 Line too long (89 > 88) + --> tests/unit/test_cellprofiler_spreadsheet_export.py:119:89 + | +119 | def test_export_to_spreadsheet_contract_selects_ordered_tables_and_declares_bundle() -> ( + | ^ +120 | None +121 | ): + | + +E501 Line too long (93 > 88) + --> tests/unit/test_cellprofiler_spreadsheet_export.py:188:89 + | +186 | ), +187 | ( +188 | "Calculate the per-image standard deviation values for object measurements?", + | ^^^^^ +189 | "No", +190 | ), + | + +Found 2 errors. diff --git a/docs/validation/paired_field_csv_314_20260930/source-anchors-base-empty-snapshot.log b/docs/validation/paired_field_csv_314_20260930/source-anchors-base-empty-snapshot.log new file mode 100644 index 0000000000..4a8efd8056 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/source-anchors-base-empty-snapshot.log @@ -0,0 +1,77 @@ +Traceback (most recent call last): + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 858, in import_plugin + __import__(importspec) +ModuleNotFoundError: No module named 'tests' + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pytest/__main__.py", line 9, in + raise SystemExit(pytest.console_main()) + ^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 201, in console_main + code = main() + ^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 156, in main + config = _prepareconfig(args, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 341, in _prepareconfig + config = pluginmanager.hook.pytest_cmdline_parse( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + raise exception + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + teardown.throw(exception) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/helpconfig.py", line 105, in pytest_cmdline_parse + config = yield + ^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + res = hook_impl.function(*args) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 1140, in pytest_cmdline_parse + self.parse(args) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 1494, in parse + self._preparse(args, addopts=addopts) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 1377, in _preparse + self.pluginmanager.consider_preparse(args, exclude_only=False) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 787, in consider_preparse + self.consider_pluginarg(parg) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 810, in consider_pluginarg + self.import_plugin(arg, consider_entry_points=True) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 860, in import_plugin + raise ImportError( + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 858, in import_plugin + __import__(importspec) +ImportError: Error importing plugin "tests.pytest_integration_options": No module named 'tests' +Command exited with non-zero status 1 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_source_bound_matched_image_set_anchors.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-base-controls" + User time (seconds): 0.18 + System time (seconds): 0.03 + Percent of CPU this job got: 110% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.19 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 26860 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 7128 + Voluntary context switches: 28 + Involuntary context switches: 1 + Swaps: 0 + File system inputs: 48 + File system outputs: 8 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 1 diff --git a/docs/validation/paired_field_csv_314_20260930/source-anchors-base-verified.log b/docs/validation/paired_field_csv_314_20260930/source-anchors-base-verified.log new file mode 100644 index 0000000000..379ff18faf --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/source-anchors-base-verified.log @@ -0,0 +1,659 @@ +.FFFFFF..FF [100%] +=================================== FAILURES =================================== +_____ test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata ______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda9758b0> + + def test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:270: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +___________ test_natural_callable_keeps_each_source_component_anchor ___________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda8e6630> + + def test_natural_callable_keeps_each_source_component_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + composed_image_set=False, + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:287: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +_______ test_selected_source_contract_keeps_only_its_exact_alias_anchor ________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda8e4fb0> + + def test_selected_source_contract_keeps_only_its_exact_alias_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=("OrigHoechst",), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:302: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n... name='OrigHoechst')),), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +_______ test_distinct_metadata_sets_each_keep_one_source_representative ________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda8dd460> + + def test_distinct_metadata_sets_each_keep_one_source_representative( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + sites=(1, 2), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:315: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +______ test_independent_source_aligned_outputs_keep_each_execution_group _______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda8d9880> + + def test_independent_source_aligned_outputs_keep_each_execution_group( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=("OrigER", "OrigHoechst"), + shared_output=False, + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:336: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='OrigERMeasurements', artifact_type=, param...pe'>, name='OrigER')),), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='OrigERMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +______ test_missing_alias_in_match_dimension_keeps_existing_strict_error _______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda8e5100> + + def test_missing_alias_in_match_dimension_keeps_existing_strict_error( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + with pytest.raises( + ValueError, + match="METADATA source binding dimension is missing alias 'OrigER'", + ): +> _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + dimension_aliases=tuple( + alias for alias, _channel in SOURCE_ALIASES if alias != "OrigER" + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:355: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError + +During handling of the above exception, another exception occurred: + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda8e5100> + + def test_missing_alias_in_match_dimension_keeps_existing_strict_error( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> with pytest.raises( + ValueError, + match="METADATA source binding dimension is missing alias 'OrigER'", + ): +E AssertionError: Regex pattern did not match. +E Regex: "METADATA source binding dimension is missing alias 'OrigER'" +E Input: "Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + +tests/unit/test_source_bound_matched_image_set_anchors.py:351: AssertionError +___ test_complete_source_set_templates_preserve_each_execution_group_anchor ____ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda8dddc0> + + def test_complete_source_set_templates_preserve_each_execution_group_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + bindings = tuple( + NamedSourceBinding( + alias=alias, + selector=SourceSelector( + components=(ComponentSelector(AllComponents.CHANNEL, channel),), + ), + origin=SourceBindingOrigin.PIPELINE_START, + component_identity=(ComponentSelector(AllComponents.CHANNEL, channel),), + ) + for alias, channel in (("OrigStain1", "1"), ("OrigStain2", "2")) + ) + input_specs = tuple(binding.input_spec() for binding in bindings) + measurements = ArtifactSpec.output( + "SourceSetMeasurements", + MeasurementsArtifactType, + relations=tuple( + GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + ), + ) + + @artifact_inputs(*input_specs) + @artifact_outputs(measurements) + @composed_image_payload + def align_source_set(image): + return image + + output_plan = ArtifactOutputPlan( + name=measurements.name, + path="/memory/SourceSetMeasurements.pkl", + artifact_type=measurements.artifact_type, + group_keys=("1", "2"), + group_component=AllComponents.SITE, + relations=measurements.relations, + ) + plan = SimpleNamespace( + axis_id="A01", + step_index=0, + step_name="Align", + main_input_dependency=StepInputDependency.pipeline_start(), + source_binding_plan=CompiledSourceBindingPlan( + bindings=bindings, + match_plan=SourceBindingMatchPlan( + method=SourceBindingMatchMethod.ORDER, + ), + ), + execution_group_scope=ComponentGroupScope.from_raw( + ("1", "2"), + component=AllComponents.SITE, + ), +> compiled_function_pattern=compile_function_pattern( + align_source_set, + {}, + {output_plan.ref(): output_plan}, + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:582: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='SourceSetMeasurements', artifact_type=, pa...>, name='OrigStain2'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='SourceSetMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +__ test_static_site_groups_do_not_cross_project_natural_source_set_templates ___ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddda80c770> + + def test_static_site_groups_do_not_cross_project_natural_source_set_templates( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + bindings = tuple( + NamedSourceBinding( + alias=alias, + selector=SourceSelector( + filters=(), + ), + origin=SourceBindingOrigin.PIPELINE_START, + component_identity=(ComponentSelector(AllComponents.CHANNEL, channel),), + ) + for alias, channel in (("OrigStain1", "1"), ("OrigStain2", "2")) + ) + input_specs = tuple(binding.input_spec() for binding in bindings) + output_specs = ( + ArtifactSpec.output( + "Stain1", + ImageArtifactType, + relations=(GroupLineageSourceRelation(source=input_specs[0].ref()),), + ), + ArtifactSpec.output( + "Stain2", + ImageArtifactType, + relations=(GroupLineageSourceRelation(source=input_specs[1].ref()),), + ), + ArtifactSpec.output( + "AlignMeasurements", + MeasurementsArtifactType, + relations=tuple( + GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + ), + ), + ) + + @artifact_inputs(*input_specs) + @artifact_outputs(*output_specs) + def align_source_set(image): + return image + + output_plans = { + spec.ref(): ArtifactOutputPlan( + name=spec.name, + path=f"/memory/{spec.name}.pkl", + artifact_type=spec.artifact_type, + group_keys=("1", "2"), + group_component=AllComponents.SITE, + relations=spec.relations, + ) + for spec in output_specs + } + plan = SimpleNamespace( + axis_id="A01", + step_index=0, + step_name="Align", + main_input_dependency=StepInputDependency.pipeline_start(), + source_binding_plan=CompiledSourceBindingPlan( + bindings=bindings, + match_plan=SourceBindingMatchPlan( + method=SourceBindingMatchMethod.ORDER, + ), + ), + execution_group_scope=ComponentGroupScope.from_raw( + ("1", "2"), + component=AllComponents.SITE, + ), +> compiled_function_pattern=compile_function_pattern( + align_source_set, + {}, + output_plans, + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:711: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='AlignMeasurements', artifact_type=, parame...>, name='OrigStain2'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='AlignMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +=============================== warnings summary =============================== +../../../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_natural_callable_keeps_each_source_component_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_selected_source_contract_keeps_only_its_exact_alias_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_distinct_metadata_sets_each_keep_one_source_representative +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_independent_source_aligned_outputs_keep_each_execution_group +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_missing_alias_in_match_dimension_keeps_existing_strict_error +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_complete_source_set_templates_preserve_each_execution_group_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_static_site_groups_do_not_cross_project_natural_source_set_templates +8 failed, 3 passed, 2 warnings in 2.91s +Command exited with non-zero status 1 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_source_bound_matched_image_set_anchors.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-base-complete" + User time (seconds): 3.18 + System time (seconds): 0.21 + Percent of CPU this job got: 100% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.39 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 177448 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 37150 + Voluntary context switches: 30 + Involuntary context switches: 22 + Swaps: 0 + File system inputs: 0 + File system outputs: 136 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 1 diff --git a/docs/validation/paired_field_csv_314_20260930/source-anchors-base.log b/docs/validation/paired_field_csv_314_20260930/source-anchors-base.log new file mode 100644 index 0000000000..42da0a71fd --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/source-anchors-base.log @@ -0,0 +1,77 @@ +Traceback (most recent call last): + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 858, in import_plugin + __import__(importspec) +ModuleNotFoundError: No module named 'tests.pytest_integration_options' + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pytest/__main__.py", line 9, in + raise SystemExit(pytest.console_main()) + ^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 201, in console_main + code = main() + ^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 156, in main + config = _prepareconfig(args, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 341, in _prepareconfig + config = pluginmanager.hook.pytest_cmdline_parse( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + raise exception + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + teardown.throw(exception) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/helpconfig.py", line 105, in pytest_cmdline_parse + config = yield + ^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + res = hook_impl.function(*args) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 1140, in pytest_cmdline_parse + self.parse(args) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 1494, in parse + self._preparse(args, addopts=addopts) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 1377, in _preparse + self.pluginmanager.consider_preparse(args, exclude_only=False) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 787, in consider_preparse + self.consider_pluginarg(parg) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 810, in consider_pluginarg + self.import_plugin(arg, consider_entry_points=True) + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 860, in import_plugin + raise ImportError( + File "/home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 858, in import_plugin + __import__(importspec) +ImportError: Error importing plugin "tests.pytest_integration_options": No module named 'tests.pytest_integration_options' +Command exited with non-zero status 1 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_source_bound_matched_image_set_anchors.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-base-controls" + User time (seconds): 0.19 + System time (seconds): 0.04 + Percent of CPU this job got: 111% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.21 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 26776 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 7160 + Voluntary context switches: 25 + Involuntary context switches: 0 + Swaps: 0 + File system inputs: 0 + File system outputs: 8 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 1 diff --git a/docs/validation/paired_field_csv_314_20260930/source-build.log b/docs/validation/paired_field_csv_314_20260930/source-build.log new file mode 100644 index 0000000000..1818a8deea --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/source-build.log @@ -0,0 +1,32 @@ +running build_ext +building 'openhcs.processing.backends.cellprofiler._granularity_native' extension +g++ -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -DPy_LIMITED_API=0x030B0000 -I/home/ts/code/projects/openhcs/.venv/include -I/home/ts/.pyenv/versions/3.12.3/include/python3.12 -c openhcs/processing/backends/cellprofiler/_granularity_native.cpp -o /home/ts/.cache/agent-scratch/issue314-russell/build/openhcs/processing/backends/cellprofiler/_granularity_native.o -O3 +g++ -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -shared /home/ts/.cache/agent-scratch/issue314-russell/build/openhcs/processing/backends/cellprofiler/_granularity_native.o -L/home/ts/.pyenv/versions/3.12.3/lib -o build/lib.linux-x86_64-cpython-312/openhcs/processing/backends/cellprofiler/_granularity_native.abi3.so +building 'openhcs.core._tabular_native' extension +g++ -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -DPy_LIMITED_API=0x030B0000 -I/home/ts/code/projects/openhcs/.venv/include -I/home/ts/.pyenv/versions/3.12.3/include/python3.12 -c openhcs/core/_tabular_native.cpp -o /home/ts/.cache/agent-scratch/issue314-russell/build/openhcs/core/_tabular_native.o -O3 +g++ -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -shared /home/ts/.cache/agent-scratch/issue314-russell/build/openhcs/core/_tabular_native.o -L/home/ts/.pyenv/versions/3.12.3/lib -o build/lib.linux-x86_64-cpython-312/openhcs/core/_tabular_native.abi3.so +copying build/lib.linux-x86_64-cpython-312/openhcs/processing/backends/cellprofiler/_granularity_native.abi3.so -> openhcs/processing/backends/cellprofiler +copying build/lib.linux-x86_64-cpython-312/openhcs/core/_tabular_native.abi3.so -> openhcs/core + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B setup.py build_ext --inplace --parallel 1 --build-temp /home/ts/.cache/agent-scratch/issue314-russell/build" + User time (seconds): 3.61 + System time (seconds): 0.33 + Percent of CPU this job got: 98% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.02 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 144720 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 91503 + Voluntary context switches: 217 + Involuntary context switches: 28 + Swaps: 0 + File system inputs: 4376 + File system outputs: 2304 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/tests/unit/test_source_image_set_identity_policy.py b/tests/unit/test_source_image_set_identity_policy.py index cc0a32eab9..b163730e82 100644 --- a/tests/unit/test_source_image_set_identity_policy.py +++ b/tests/unit/test_source_image_set_identity_policy.py @@ -2,7 +2,7 @@ import pytest -from openhcs.constants.constants import AllComponents +from openhcs.constants.constants import AllComponents, GroupBy from openhcs.core.component_group_scope import RuntimeExecutionAxisScope from openhcs.core.source_bindings import ( ComponentSelector, @@ -145,3 +145,20 @@ def test_path_identity_stays_distinct_without_semantic_field_coordinates(): ) != SourceImageSetIdentity.from_metadata( {}, fallback_source_path="/synthetic/two.tif", policy=policy ) + + +def test_pipeline_config_compiles_the_same_paired_field_identity_policy(): + from openhcs.core.config import ( + LazyProcessingConfig, + LazySourceBindingsConfig, + PipelineConfig, + ) + + config = PipelineConfig( + processing_config=LazyProcessingConfig(group_by=GroupBy.CHANNEL), + source_bindings_config=LazySourceBindingsConfig(bindings=_bindings().bindings), + ) + + policy = SourceImageSetIdentityPolicy.from_pipeline_config(config) + + assert policy.plane_member_components == frozenset((AllComponents.CHANNEL,)) From d8c881756e183ec80fda3cf375426b8a42347464 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Wed, 30 Sep 2026 18:51:30 -0400 Subject: [PATCH 3/6] Qualify merged-main source checks and seal issue314 evidence --- .../paired_field_csv_314_20260930/SHA256SUMS | 36 + .../checkpoint.rst | 53 +- .../merged-main-census.json | 59 ++ .../merged-main-census.log | 54 ++ .../merged-main-owner.log | 38 + .../merged-main-related.log | 659 ++++++++++++++++++ .../owned-disposable.tar.gz | Bin 0 -> 309648 bytes .../ownership-receipt.rst | 19 +- .../paired_field_csv_314_20260930/pr-body.md | 8 +- 9 files changed, 915 insertions(+), 11 deletions(-) create mode 100644 docs/validation/paired_field_csv_314_20260930/SHA256SUMS create mode 100644 docs/validation/paired_field_csv_314_20260930/merged-main-census.json create mode 100644 docs/validation/paired_field_csv_314_20260930/merged-main-census.log create mode 100644 docs/validation/paired_field_csv_314_20260930/merged-main-owner.log create mode 100644 docs/validation/paired_field_csv_314_20260930/merged-main-related.log create mode 100644 docs/validation/paired_field_csv_314_20260930/owned-disposable.tar.gz diff --git a/docs/validation/paired_field_csv_314_20260930/SHA256SUMS b/docs/validation/paired_field_csv_314_20260930/SHA256SUMS new file mode 100644 index 0000000000..fb062f6484 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/SHA256SUMS @@ -0,0 +1,36 @@ +09bc36d6a804f1601315bb842a3c67852ed5d08f5a71b6fc632dd6f7c7a1e12a docs/validation/paired_field_csv_314_20260930/PREFLIGHT.json +e935c5bcb0d0bf4da40c68f855bff5afa484c6b1a6e667405004cb06164f0cd7 docs/validation/paired_field_csv_314_20260930/checkpoint.rst +f7a149a70dd9f82cadd4b1b43eae69a6c70354d04c870113bae2e80d6c697fcf docs/validation/paired_field_csv_314_20260930/core-census.json.gz +abcc421cce2ad109a4be6f9bae9c7ffdb80c48725a416bf4db5f60266fe610d5 docs/validation/paired_field_csv_314_20260930/core-census.log +22a3cbbcc9ac4d15b10c6ae38d5b930fb2a37a687f832f978d29543d803f399b docs/validation/paired_field_csv_314_20260930/core-overlay.json.gz +f842402ed5c9f2eb35f5a9abeb97ee7342e1e0269233d2149aab2a3b03ba4318 docs/validation/paired_field_csv_314_20260930/core-overlay.log +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/validation/paired_field_csv_314_20260930/effective-imports-error.log +6260f67c73bdbb1e138b9733e3100f9c3b82daa032beaa1ab821891a830b8d68 docs/validation/paired_field_csv_314_20260930/effective-imports.json +2d22257b758889c28b6cc68e230075176e81e94b8b3eb5b93f0c8c0458040102 docs/validation/paired_field_csv_314_20260930/final-policy-exporter.log +4e6b60bb28c884fddf203e176e39b6b2a8fec79b0db065e2d3fb87bfc11967a1 docs/validation/paired_field_csv_314_20260930/merged-main-census.json +2a91055d7bc8f70cd70a234c0970babbf0bedf15cfce723dfecd4e028032cbb1 docs/validation/paired_field_csv_314_20260930/merged-main-census.log +bf1aee9710d476cd67ea9ef6e6a03805d50498d1dd38eb1f3f7e325e7fd2a1bd docs/validation/paired_field_csv_314_20260930/merged-main-owner.log +ef34e28b0d9ebe85c9a364f9d64bcba276f1af3de33c782a5452c74d8dd665b5 docs/validation/paired_field_csv_314_20260930/merged-main-related.log +45bb910ec84bccf47c98eab8d48668058c32f888bf3337eadf6af54ebdcc69a0 docs/validation/paired_field_csv_314_20260930/nra-original-resources.log +76efdf6231fe3d520aa5aad4ed07aa619696ed0a1bbc0d9ac58207439fbc1d1c docs/validation/paired_field_csv_314_20260930/nra-original.json +ca8e2518377ceb506f4b6616de041d8e5901d3abb7d53499aacacd284927f365 docs/validation/paired_field_csv_314_20260930/nra-owner-loop-resources.log +85fa34cc7c9365e1433cf13cfde3728b93e826212a862d5a896ee50f24215587 docs/validation/paired_field_csv_314_20260930/nra-owner-loop.json +0ef110ed10150278f09ba7ea4abf837c87f163d834794a99f26731ec3b722a69 docs/validation/paired_field_csv_314_20260930/owned-disposable.tar.gz +4068fc6aebd829bde62c38c9fd8a9c980ff2480214f9e68d638684cb643d6bef docs/validation/paired_field_csv_314_20260930/owner-census-delta.json +d221f41dafd990a5434428d86703b59b1eec66fb99c6537fb40a0c52bdd1205f docs/validation/paired_field_csv_314_20260930/owner-census-delta.log +8db82b08046f81c30100fe92751276352cef7f8a444a3297ec4df82ce2d95c0b docs/validation/paired_field_csv_314_20260930/owner-fixed-corrected.log +d50a0ddd323c80c4992f46e4a96c8a3a1515c6787ee2ad5f86191357ac964989 docs/validation/paired_field_csv_314_20260930/owner-fixed.log +d8375d089d79fb532af311d7d3b8f1509d0f21e9e045b7cd14a9ed04a132f509 docs/validation/paired_field_csv_314_20260930/ownership-receipt.rst +17988389f4355b8274b59fd1141bb8aa5757b6cb6adf94fe879c0b199ca023e3 docs/validation/paired_field_csv_314_20260930/policy-import.log +6b76484efe7c0bcd2634c61337c0f73018d457338bfb077c05c836ec42e3b481 docs/validation/paired_field_csv_314_20260930/pr-body.md +77b93b241966cb96c7e7e8e2adc7964d488abbaa14fb2ab94e74ddb1598c3673 docs/validation/paired_field_csv_314_20260930/related-owner-contracts.log +63ad8bd8fac5a6a06141b607f4d6bd51145a8952ee63bbc9c27c844c07724dcb docs/validation/paired_field_csv_314_20260930/reproducer-original-built.log +9aa5f6c2c1dd4b980dc653be3b1fca951a5eb42ba05e2a99709140190f08ffd0 docs/validation/paired_field_csv_314_20260930/reproducer-original.log +93abbe5307fdb809eae183b7e3fd79f276fb1044b1e889cf95ae3ec754dd36aa docs/validation/paired_field_csv_314_20260930/ruff-focused.log +9a5daa28530cfdb8a9a5dfaf7e4469862c7755067be421ee89f83f824ac2a6d7 docs/validation/paired_field_csv_314_20260930/source-anchors-base-empty-snapshot.log +05d26c97cc6db8b17026c5dfb984b13f5cc667479d0962613118c6d764edc22e docs/validation/paired_field_csv_314_20260930/source-anchors-base-verified.log +89e8f8287e324c431d734ec1f3dbb247459ed329ec939cc9478143cf239ccba3 docs/validation/paired_field_csv_314_20260930/source-anchors-base.log +5e739265347dec1ea5319579c3575f0ca9d4ba12a0a6c4209cbab692196c0b50 docs/validation/paired_field_csv_314_20260930/source-build.log +1b5332ef5d7e47ae6518191ef1e2564dd03ba02c716ded316439f5103b2b4e25 openhcs/core/source_matching.py +8eb0468a59f7545bbdbc86e12e0314899942dae444d57cb10bbf1ece2cd10d5b tests/unit/test_cellprofiler_spreadsheet_export.py +f106cb03132c41485c6c3dc065481abe80eac0682d25fb3a27cf0e1be093832c tests/unit/test_source_image_set_identity_policy.py diff --git a/docs/validation/paired_field_csv_314_20260930/checkpoint.rst b/docs/validation/paired_field_csv_314_20260930/checkpoint.rst index 13353a453d..fd32fe1384 100644 --- a/docs/validation/paired_field_csv_314_20260930/checkpoint.rst +++ b/docs/validation/paired_field_csv_314_20260930/checkpoint.rst @@ -26,15 +26,20 @@ initial production patch had a misplaced generator comma and failed collection (owner-fixed.log). Corrected that syntax, not assertions or behavior, before the passing owner-fixed-corrected.log. Existing extension declarations were built locally without installation or package/source dependency changes (source-build.log). -The failed complete-context NRA attempt (exit124, maximumRSS524536KiB, empty -JSON) remains nra-original.json/nra-original-resources.log; it is not a complete +The failed complete-context NRA attempt (exit124, maximumRSS524536KiB) returned +deadline_incomplete JSON: complete=false, deadline_exceeded=true, stage +parse_python_module, internal budget20s and elapsed22.054s. This corrects the +earlier empty-JSON description; the raw original was preserved. It remains in +nra-original.json/nra-original-resources.log; it is not a complete R1/semantic proof. Do not repeat with greater global limits. Core syntax census and source-witness review are evidence at their actual scope, not global health. Ruff's initial all-rule check exposes13 inherited findings (import order and quoted annotations). Keep unrelated source debt out of this repair; compare changed-owner metrics against exact base rather than claiming a clean repository. -The new test module itself has no Ruff findings. git diff --check passes. +The new test module itself has no Ruff findings. Source/test git diff --check +passes. Published raw diagnostic logs retain original trailing whitespace; +an unrestricted evidence-inclusive diff --check flags that whitespace. Coordination: all7 then-open PR file lists checked. Shared source_bindings.py (#206), runtime_image_values.py/runtime_plane_projection.py (#217) remain @@ -76,6 +81,44 @@ clean at1209068f5fc9e4f7025a24ada8a73ef30dd1ddd7. This dependency is unmodified; these checks do not prove a frozen gitlink dependency closure or installed parity. Exact other effective imports/versions are retained in effective-imports.json. -New main2b7969f700c33eb7f73f891d975afd1efc0628bb is being integrated normally -at the owner's request. It changes viewer owners, not the repaired policy. +Merged current main and final handoff +------------------------------------ + +Main2b7969f700c33eb7f73f891d975afd1efc0628bb was integrated normally with merge +commit e3d991e9cf02c496daa7c9df32c73bfde4a7ad00. It changes viewer owners, not +the repaired policy. Core tree025c72d3ce07962cfbe57c181819bdc6d081e5f3 is byte +identical between original702b2c2c9 and new main; the changed branch core tree +is a10ecc8bcf0b4e68576eaa52b6479bd4f661999a. The original fixture and strict +artifact owner are also unchanged between those main revisions. + +Reran both shards on that exact merged head under the same512MiB/oneCPU bounds: +merged-main-owner.log:101 passed,14.13s, maximumRSS406828KiB; +merged-main-related.log:30 passed/8 inherited failures,6.01s,387968KiB. +No budget escalation or stopped-shard replay. These139 distinct selected tests +therefore have131 passes and8 failures, not a green broad suite. Shape/module/ +secondary contracts pass; the remaining failures occur at the existing strict +subject guard before the changed policy and have an original-source control. +Parent integration is the named disposition owner for those fixture failures; +no active repair by another agent or final acceptance is invented. + +merged-main-census.json/log measures exact merged head against new main: +16 added core code lines and zero other measured syntax-count changes, no parse +failures, maximumRSS20304KiB. Earlier compact NRA input remains byte-identical. No parent viewer/MCP acceptance is attributed to this source-only repair. + +Disposal: owned scratch860KiB and build objects400KiB were archived together as +owned-disposable.tar.gz (309648 bytes,124 archive entries, gzip integrity checked), +then only /home/ts/.cache/agent-scratch/issue314-russell and this worktree's build/ +were removed. SHA2560ef110ed10150278f09ba7ea4abf837c87f163d834794a99f26731ec3b722a69. +Removal is recoverable from that archive. Local compiled extensions remain in +the owned checkout for reproduction; no task-owned persistent worker is active. +Durable .issue314/ retains instruction extraction and original-source controls. +SHA256SUMS seals published source/tests/evidence (excluding the manifest itself). + +Reproduce from this checkout using the existing Python entrypoint and the exact +bounded commands retained in merged-main-owner.log/merged-main-related.log. +The baseline control command and original failing assertions remain in their +logs; no held-out TIFF, frozen CSV or scientific trial artifact is involved. +Draft PR317 contains the coherent source repair and original failures. Parent +owns merge, source-closure/installed/MCP/external-parity acceptance; no installation, +runtime launch, issue closure or frozen-file mutation is requested or claimed. diff --git a/docs/validation/paired_field_csv_314_20260930/merged-main-census.json b/docs/validation/paired_field_csv_314_20260930/merged-main-census.json new file mode 100644 index 0000000000..a32071ea49 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/merged-main-census.json @@ -0,0 +1,59 @@ +{ + "base": "2b7969f700c33eb7f73f891d975afd1efc0628bb", + "rev": "e3d991e9cf02c496daa7c9df32c73bfde4a7ad00", + "change": { + "tally": { + "type_identity_check": 0, + "long_boolean_chain": 0, + "boolean_chain_terms": 0, + "codec_subclass": 0, + "foreign_absence_probe": 0, + "string_dispatch": 0, + "type_switch": 0, + "string_dispatch_arms": 0, + "type_switch_arms": 0, + "string_key_subscript": 0, + "literal_key_get": 0, + "string_equality": 0, + "none_identity": 0, + "isinstance_call": 0, + "attribute_by_name": 0, + "getattr_default": 0, + "broad_except": 0, + "json_loads": 0, + "long_function": 0, + "class_definition": 0, + "abstract_base": 0, + "enum_class": 0, + "code_lines": 16 + }, + "files": { + "openhcs/core/source_matching.py": { + "type_identity_check": 0, + "long_boolean_chain": 0, + "boolean_chain_terms": 0, + "codec_subclass": 0, + "foreign_absence_probe": 0, + "string_dispatch": 0, + "type_switch": 0, + "string_dispatch_arms": 0, + "type_switch_arms": 0, + "string_key_subscript": 0, + "literal_key_get": 0, + "string_equality": 0, + "none_identity": 0, + "isinstance_call": 0, + "attribute_by_name": 0, + "getattr_default": 0, + "broad_except": 0, + "json_loads": 0, + "long_function": 0, + "class_definition": 0, + "abstract_base": 0, + "enum_class": 0, + "code_lines": 16 + } + }, + "unparsed": [] + } +} \ No newline at end of file diff --git a/docs/validation/paired_field_csv_314_20260930/merged-main-census.log b/docs/validation/paired_field_csv_314_20260930/merged-main-census.log new file mode 100644 index 0000000000..9692aea2a9 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/merged-main-census.log @@ -0,0 +1,54 @@ +changed between 2b7969f700c33eb7f73f891d975afd1efc0628bb..e3d991e9cf02c496daa7c9df32c73bfde4a7ad00 (touched files, after minus before) + +change in counts (2b7969f700c33eb7f73f891d975afd1efc0628bb..e3d991e9cf02c496daa7c9df32c73bfde4a7ad00): read these first when code was deleted as well as added + type_identity_check +0 + long_boolean_chain +0 + boolean_chain_terms +0 + codec_subclass +0 + foreign_absence_probe +0 + string_dispatch +0 + type_switch +0 + string_dispatch_arms +0 + type_switch_arms +0 + string_key_subscript +0 + literal_key_get +0 + string_equality +0 + none_identity +0 + isinstance_call +0 + attribute_by_name +0 + getattr_default +0 + broad_except +0 + json_loads +0 + long_function +0 + class_definition +0 + abstract_base +0 + enum_class +0 + code lines +16 + +(densities omitted: under 500 net code lines, a ratio of changes to net lines is meaningless) + +Top 12 files by weighted debt (type_identity_check x3, long_boolean_chain x5, boolean_chain_terms x1, codec_subclass x3, foreign_absence_probe x1, string_dispatch x5, type_switch x5, string_dispatch_arms x1, type_switch_arms x1, string_key_subscript x1, literal_key_get x1, string_equality x1, none_identity x1, isinstance_call x1, attribute_by_name x3, getattr_default x3, broad_except x2): + 0 openhcs/core/source_matching.py (code lines +16) + Command being timed: "timeout 60s env OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 /home/ts/code/projects/openhcs/.venv/bin/python -B .issue314/refactor-audit/scripts/debt_census.py --repo . --root openhcs/core --rev e3d991e9cf02c496daa7c9df32c73bfde4a7ad00 --base 2b7969f700c33eb7f73f891d975afd1efc0628bb --json docs/validation/paired_field_csv_314_20260930/merged-main-census.json" + User time (seconds): 0.17 + System time (seconds): 0.02 + Percent of CPU this job got: 98% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.20 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 20304 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 4669 + Voluntary context switches: 20 + Involuntary context switches: 2 + Swaps: 0 + File system inputs: 72 + File system outputs: 16 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/paired_field_csv_314_20260930/merged-main-owner.log b/docs/validation/paired_field_csv_314_20260930/merged-main-owner.log new file mode 100644 index 0000000000..fc5fcfd85f --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/merged-main-owner.log @@ -0,0 +1,38 @@ +........................................................................ [ 71%] +............................. [100%] +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +101 passed, 2 warnings in 14.13s + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_cellprofiler_spreadsheet_export.py tests/unit/test_source_bindings.py tests/unit/test_source_image_provenance.py tests/unit/test_cellprofiler_measurement_source_group_scope.py tests/unit/test_source_image_set_identity_policy.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-merged-owner" + User time (seconds): 14.82 + System time (seconds): 0.46 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.42 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 406828 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 87851 + Voluntary context switches: 16 + Involuntary context switches: 111 + Swaps: 0 + File system inputs: 88 + File system outputs: 128 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/paired_field_csv_314_20260930/merged-main-related.log b/docs/validation/paired_field_csv_314_20260930/merged-main-related.log new file mode 100644 index 0000000000..a28aa8e395 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/merged-main-related.log @@ -0,0 +1,659 @@ +.................FFFFFF..FF........... [100%] +=================================== FAILURES =================================== +_____ test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata ______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddcad47d0> + + def test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:270: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +___________ test_natural_callable_keeps_each_source_component_anchor ___________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddcdf49b0> + + def test_natural_callable_keeps_each_source_component_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + composed_image_set=False, + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:287: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +_______ test_selected_source_contract_keeps_only_its_exact_alias_anchor ________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddca60710> + + def test_selected_source_contract_keeps_only_its_exact_alias_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=("OrigHoechst",), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:302: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n... name='OrigHoechst')),), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +_______ test_distinct_metadata_sets_each_keep_one_source_representative ________ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddca63950> + + def test_distinct_metadata_sets_each_keep_one_source_representative( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + sites=(1, 2), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:315: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +______ test_independent_source_aligned_outputs_keep_each_execution_group _______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddcdf6c00> + + def test_independent_source_aligned_outputs_keep_each_execution_group( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> filtered = _filter_source_anchors( + monkeypatch, + artifact_aliases=("OrigER", "OrigHoechst"), + shared_output=False, + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:336: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='OrigERMeasurements', artifact_type=, param...pe'>, name='OrigER')),), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='OrigERMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +______ test_missing_alias_in_match_dimension_keeps_existing_strict_error _______ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddca61d30> + + def test_missing_alias_in_match_dimension_keeps_existing_strict_error( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + with pytest.raises( + ValueError, + match="METADATA source binding dimension is missing alias 'OrigER'", + ): +> _filter_source_anchors( + monkeypatch, + artifact_aliases=tuple(alias for alias, _channel in SOURCE_ALIASES), + dimension_aliases=tuple( + alias for alias, _channel in SOURCE_ALIASES if alias != "OrigER" + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:355: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/unit/test_source_bound_matched_image_set_anchors.py:208: in _filter_source_anchors + compiled_pattern = compile_function_pattern( +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='Measurements', artifact_type=, parameter_n...e'>, name='OrigSyto'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError + +During handling of the above exception, another exception occurred: + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddca61d30> + + def test_missing_alias_in_match_dimension_keeps_existing_strict_error( + monkeypatch: pytest.MonkeyPatch, + ) -> None: +> with pytest.raises( + ValueError, + match="METADATA source binding dimension is missing alias 'OrigER'", + ): +E AssertionError: Regex pattern did not match. +E Regex: "METADATA source binding dimension is missing alias 'OrigER'" +E Input: "Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='Measurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + +tests/unit/test_source_bound_matched_image_set_anchors.py:351: AssertionError +___ test_complete_source_set_templates_preserve_each_execution_group_anchor ____ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddcab2ae0> + + def test_complete_source_set_templates_preserve_each_execution_group_anchor( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + bindings = tuple( + NamedSourceBinding( + alias=alias, + selector=SourceSelector( + components=(ComponentSelector(AllComponents.CHANNEL, channel),), + ), + origin=SourceBindingOrigin.PIPELINE_START, + component_identity=(ComponentSelector(AllComponents.CHANNEL, channel),), + ) + for alias, channel in (("OrigStain1", "1"), ("OrigStain2", "2")) + ) + input_specs = tuple(binding.input_spec() for binding in bindings) + measurements = ArtifactSpec.output( + "SourceSetMeasurements", + MeasurementsArtifactType, + relations=tuple( + GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + ), + ) + + @artifact_inputs(*input_specs) + @artifact_outputs(measurements) + @composed_image_payload + def align_source_set(image): + return image + + output_plan = ArtifactOutputPlan( + name=measurements.name, + path="/memory/SourceSetMeasurements.pkl", + artifact_type=measurements.artifact_type, + group_keys=("1", "2"), + group_component=AllComponents.SITE, + relations=measurements.relations, + ) + plan = SimpleNamespace( + axis_id="A01", + step_index=0, + step_name="Align", + main_input_dependency=StepInputDependency.pipeline_start(), + source_binding_plan=CompiledSourceBindingPlan( + bindings=bindings, + match_plan=SourceBindingMatchPlan( + method=SourceBindingMatchMethod.ORDER, + ), + ), + execution_group_scope=ComponentGroupScope.from_raw( + ("1", "2"), + component=AllComponents.SITE, + ), +> compiled_function_pattern=compile_function_pattern( + align_source_set, + {}, + {output_plan.ref(): output_plan}, + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:582: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='SourceSetMeasurements', artifact_type=, pa...>, name='OrigStain2'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='SourceSetMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +__ test_static_site_groups_do_not_cross_project_natural_source_set_templates ___ + +monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fdddcab2fc0> + + def test_static_site_groups_do_not_cross_project_natural_source_set_templates( + monkeypatch: pytest.MonkeyPatch, + ) -> None: + bindings = tuple( + NamedSourceBinding( + alias=alias, + selector=SourceSelector( + filters=(), + ), + origin=SourceBindingOrigin.PIPELINE_START, + component_identity=(ComponentSelector(AllComponents.CHANNEL, channel),), + ) + for alias, channel in (("OrigStain1", "1"), ("OrigStain2", "2")) + ) + input_specs = tuple(binding.input_spec() for binding in bindings) + output_specs = ( + ArtifactSpec.output( + "Stain1", + ImageArtifactType, + relations=(GroupLineageSourceRelation(source=input_specs[0].ref()),), + ), + ArtifactSpec.output( + "Stain2", + ImageArtifactType, + relations=(GroupLineageSourceRelation(source=input_specs[1].ref()),), + ), + ArtifactSpec.output( + "AlignMeasurements", + MeasurementsArtifactType, + relations=tuple( + GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + ), + ), + ) + + @artifact_inputs(*input_specs) + @artifact_outputs(*output_specs) + def align_source_set(image): + return image + + output_plans = { + spec.ref(): ArtifactOutputPlan( + name=spec.name, + path=f"/memory/{spec.name}.pkl", + artifact_type=spec.artifact_type, + group_keys=("1", "2"), + group_component=AllComponents.SITE, + relations=spec.relations, + ) + for spec in output_specs + } + plan = SimpleNamespace( + axis_id="A01", + step_index=0, + step_name="Align", + main_input_dependency=StepInputDependency.pipeline_start(), + source_binding_plan=CompiledSourceBindingPlan( + bindings=bindings, + match_plan=SourceBindingMatchPlan( + method=SourceBindingMatchMethod.ORDER, + ), + ), + execution_group_scope=ComponentGroupScope.from_raw( + ("1", "2"), + component=AllComponents.SITE, + ), +> compiled_function_pattern=compile_function_pattern( + align_source_set, + {}, + output_plans, + ), + ) + +tests/unit/test_source_bound_matched_image_set_anchors.py:711: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +openhcs/core/function_patterns.py:1057: in compile_function_pattern + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1057: in + groups=tuple(compiler.compile(group) for group in normalized.groups), +openhcs/core/function_patterns.py:1227: in compile + invocations = tuple( +openhcs/core/function_patterns.py:1228: in + _compile_invocation( +openhcs/core/function_patterns.py:1267: in _compile_invocation + artifact_selector.validate_artifact_output_declarations() +openhcs/core/artifact_key_selection.py:114: in validate_artifact_output_declarations + self.artifact_output_policy.validate_output_declarations(self.artifact_specs) +openhcs/core/artifact_key_selection.py:32: in validate_output_declarations + cls.validate_payload_declaration(spec) +openhcs/core/artifact_key_selection.py:47: in validate_payload_declaration + spec.artifact_type.validate_native_output_declaration(spec) +openhcs/core/artifacts.py:717: in validate_native_output_declaration + cls.require_output_subject(spec) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +cls = +output = ArtifactSpec(name='AlignMeasurements', artifact_type=, parame...>, name='OrigStain2'))), plan_type=, measurement_feature_owner=None) + + @classmethod + def require_output_subject( + cls, + output: "ArtifactSpec | ArtifactOutputPlan", + ) -> "MeasurementSubject": + """Require the same declared subject at compile and runtime boundaries.""" + + subject = ArtifactSpecRelation.measurement_subject_for_output(output) + if subject is None: +> raise ValueError( + f"Measurement output {output.ref()!r} has no declared " + "measurement subject relation. Add ImageMeasurementSubjectRelation " + "with the exact declared image ref for image-level rows, " + "ObjectMeasurementSubjectRelation with the exact object-label ref " + "for object-level rows, or ArtifactMeasurementSubjectRelation() " + "for artifact-level rows to ArtifactSpec.output(..., relations=(...,))." + ) +E ValueError: Measurement output ArtifactSpecRef(plan_type=, artifact_type=, name='AlignMeasurements') has no declared measurement subject relation. Add ImageMeasurementSubjectRelation with the exact declared image ref for image-level rows, ObjectMeasurementSubjectRelation with the exact object-label ref for object-level rows, or ArtifactMeasurementSubjectRelation() for artifact-level rows to ArtifactSpec.output(..., relations=(...,)). + +openhcs/core/artifacts.py:699: ValueError +=============================== warnings summary =============================== +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_default_fixture_loop_scope + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +../../code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441 + /home/ts/code/projects/openhcs/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py:1441: PytestConfigWarning: Unknown config option: asyncio_mode + + self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_all_loaded_contract_collapses_sibling_alias_groups_by_metadata +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_natural_callable_keeps_each_source_component_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_selected_source_contract_keeps_only_its_exact_alias_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_distinct_metadata_sets_each_keep_one_source_representative +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_independent_source_aligned_outputs_keep_each_execution_group +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_missing_alias_in_match_dimension_keeps_existing_strict_error +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_complete_source_set_templates_preserve_each_execution_group_anchor +FAILED tests/unit/test_source_bound_matched_image_set_anchors.py::test_static_site_groups_do_not_cross_project_natural_source_set_templates +8 failed, 30 passed, 2 warnings in 6.01s +Command exited with non-zero status 1 + Command being timed: "timeout 60s env OPENHCS_CPU_ONLY=true OPENHCS_BACKEND_EXCLUDE=torch,tensorflow,jax,cupy OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/issue314-russell /home/ts/code/projects/openhcs/.venv/bin/python -B -m pytest tests/unit/test_cellprofiler_shape_hotpath.py tests/unit/test_cellprofiler_module_measurement_scopes.py tests/unit/test_cellprofiler_identify_secondary_replacement_primary.py tests/unit/test_cellprofiler_secondary_distance_backend.py tests/unit/test_source_bound_matched_image_set_anchors.py tests/unit/test_source_image_provenance_hotpath.py tests/unit/test_function_output_manifest_input_scope.py -q --basetemp=/home/ts/.cache/agent-scratch/issue314-russell/pytest-merged-related" + User time (seconds): 6.31 + System time (seconds): 0.47 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:06.84 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 387968 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 89386 + Voluntary context switches: 15 + Involuntary context switches: 36 + Swaps: 0 + File system inputs: 200 + File system outputs: 128 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 1 diff --git a/docs/validation/paired_field_csv_314_20260930/owned-disposable.tar.gz b/docs/validation/paired_field_csv_314_20260930/owned-disposable.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e6e11fdc9afa8d4d50dd7cff516ca598b8401b5 GIT binary patch literal 309648 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

Tac?q?mRd{L2{=Mne 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 Date: Wed, 30 Sep 2026 19:34:03 -0400 Subject: [PATCH 4/6] Declare artifact subjects in anchor fixtures and retain installed paired-field journey --- .../create-live-fixture.py | 23 ++++ .../pipeline-live-parent.py | 106 ++++++++++++++++++ .../run-installed-parent.sh | 25 +++++ ..._source_bound_matched_image_set_anchors.py | 35 ++++-- 4 files changed, 177 insertions(+), 12 deletions(-) create mode 100644 docs/validation/paired_field_csv_314_20260930/create-live-fixture.py create mode 100644 docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py create mode 100644 docs/validation/paired_field_csv_314_20260930/run-installed-parent.sh diff --git a/docs/validation/paired_field_csv_314_20260930/create-live-fixture.py b/docs/validation/paired_field_csv_314_20260930/create-live-fixture.py new file mode 100644 index 0000000000..bb5e57f0e4 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/create-live-fixture.py @@ -0,0 +1,23 @@ +"""Author tiny known-value inputs; never reads or alters biological images.""" + +import sys +from pathlib import Path + +import numpy as np +import tifffile + + +root = Path(sys.argv[1]) +root.mkdir(parents=True, exist_ok=False) +(root / "plate.HTD").write_text( + '"XSites", 1\n"YSites", 1\n"PixelSizeUM", 0.65\n' +) +images = root / "TimePoint_1" +images.mkdir() +for well in ("A01", "B01"): + dna = np.zeros((32, 32), dtype=np.uint16) + dna[5:9, 5:9] = 12000 + dna[22:26, 22:26] = 18000 + for channel, image in ((1, dna), (2, np.full((32, 32), 24000, dtype=np.uint16))): + tifffile.imwrite(images / f"{well}_s001_w{channel}_z001_t001.tif", image) +print(root) diff --git a/docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py b/docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py new file mode 100644 index 0000000000..628e75269b --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py @@ -0,0 +1,106 @@ +"""Synthetic paired-channel exporter journey, not a blind biological trial.""" + +from pathlib import Path + +from openhcs.constants import AllComponents, GroupBy, Microscope, VariableComponents +from openhcs.core.config import ( + LazyPathPlanningConfig, + LazyProcessingConfig, + LazySourceBindingsConfig, + LazyVFSConfig, + MaterializationBackend, + PipelineConfig, +) +from openhcs.core.source_bindings import ( + ComponentSelector, MetadataExtractionRule, MetadataSource, + NamedSourceBinding, SourceFilterClause, SourceFilterMatchType, + SourceFilterSubject, SourceSelector, LazyStepSourceBindingsConfig, +) +from openhcs.core.steps.function_step import FunctionStep +from openhcs.processing.backends.cellprofiler.object_images import convert_image_to_objects +from openhcs.processing.backends.cellprofiler.secondary import SecondaryMethod, identify_secondary_objects +from openhcs.processing.backends.cellprofiler.shape import measure_object_size_shape +from openhcs.processing.backends.cellprofiler.spreadsheet_export import export_to_spreadsheet + +pipeline_config = PipelineConfig( + num_workers=1, + use_threading=True, + microscope=Microscope.IMAGEXPRESS, + processing_config=LazyProcessingConfig( + variable_components=[VariableComponents.SITE], group_by=GroupBy.CHANNEL, + ), + source_bindings_config=LazySourceBindingsConfig( + metadata_rules=(MetadataExtractionRule( + source=MetadataSource.FILE_NAME, + pattern=r"(?P[A-Z]\d{2})_s(?P\d+)_w(?P\d+)_z(?P\d+)_t(?P\d+)", + ),), + bindings=tuple( + NamedSourceBinding( + alias=alias, + selector=SourceSelector( + components=(ComponentSelector(AllComponents.CHANNEL, channel),), + filters=(SourceFilterClause( + SourceFilterSubject.FILE, SourceFilterMatchType.CONTAINS, + f"_w{channel}_", + ),), + ), + component_identity=tuple( + ComponentSelector(component, value) + for component, value in ( + (AllComponents.CHANNEL, channel), + (AllComponents.SITE, "1"), + (AllComponents.Z_INDEX, "1"), + (AllComponents.TIMEPOINT, "1"), + ) + ), + ) + for alias, channel in (("DNA", "1"), ("Actin", "2")) + ), + ), + path_planning_config=LazyPathPlanningConfig( + global_output_folder=Path("/home/ts/wt/openhcs-issue-batch-20260929/paired-field-parent-20260930/outputs"), + # This journey's durable result is the typed CSV bundle, not raw copies. + well_filter=0, + ), + vfs_config=LazyVFSConfig(materialization_backend=MaterializationBackend.DISK), +) +pipeline_steps = [ + FunctionStep( + name="KnownNuclei", + source_bindings=LazyStepSourceBindingsConfig( + enabled=True, + bindings=(NamedSourceBinding(alias="DNA"),), + ), + func={"1": (convert_image_to_objects, { + "select_the_input_image": "DNA", "name_the_output_objects": "Nuclei", + "cast_to_bool": True, + })}, + ), + FunctionStep( + name="KnownCells", + source_bindings=LazyStepSourceBindingsConfig( + enabled=True, + bindings=(NamedSourceBinding(alias="Actin"),), + ), + func={"2": (identify_secondary_objects, { + "select_the_input_image": "Actin", "select_the_input_objects": "Nuclei", + "name_the_objects_to_be_identified": "Cells", "method": SecondaryMethod.DISTANCE_N, + "distance_to_dilate": 2, + })}, + ), + FunctionStep( + name="CellShapes", + source_bindings=LazyStepSourceBindingsConfig( + enabled=True, + bindings=(NamedSourceBinding(alias="Actin"),), + ), + func={"2": (measure_object_size_shape, { + "select_object_sets_to_measure": "Cells", + "calculate_advanced": False, "calculate_zernikes": False, + })}, + ), + FunctionStep( + name="CompleteCellRows", + func=(export_to_spreadsheet, {"add_filename_prefix": False}), + ), +] diff --git a/docs/validation/paired_field_csv_314_20260930/run-installed-parent.sh b/docs/validation/paired_field_csv_314_20260930/run-installed-parent.sh new file mode 100644 index 0000000000..65efa139bd --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/run-installed-parent.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# Parent owns the installed candidate and this isolated MCP acceptance slot. +set -eu +unset PYTHONPATH +export PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 +export OPENHCS_CPU_ONLY=true OPENHCS_SUBPROCESS_NO_GPU=1 POLYSTORE_SUBPROCESS_NO_GPU=1 +export OPENHCS_USE_THREADING=true OPENHCS_HEADLESS=true CUDA_VISIBLE_DEVICES= +export JAX_PLATFORMS=cpu XLA_FLAGS=--xla_cpu_multi_thread_eigen=false +export OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMBA_NUM_THREADS=1 +export QT_QPA_PLATFORM=xcb DISPLAY=:91 LIBGL_ALWAYS_SOFTWARE=1 +export POLYSTORE_IMAGEJ_CACHE_ROOT=/home/ts/.cache/polystore/imagej +export POLYSTORE_IMAGEJ_ALLOW_DOWNLOAD=false +export XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/cache +export XDG_CONFIG_HOME=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/config +export XDG_DATA_HOME=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/data +export XDG_STATE_HOME=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/state +export XDG_RUNTIME_DIR=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/runtime +export TMPDIR=/home/ts/.cache/agent-scratch/paired-field-parent-20260930 +export NUMBA_CACHE_DIR=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/numba +export MPLCONFIGDIR=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/matplotlib +export OPENHCS_UI_CONFIG_CACHE_FILE=/home/ts/.cache/agent-scratch/paired-field-parent-20260930/ui_config.config +export OPENHCS_AGENT_READ_ROOTS=/home/ts/wt/openhcs-viewer-reset-parent-integration-20260930:/home/ts/wt/openhcs-issue-batch-20260929/paired-field-parent-20260930:/home/ts/.cache/agent-scratch/paired-field-parent-20260930:/home/ts/.openhcs/tcp/5997.startup.lock:/home/ts/.openhcs/tcp/6997.startup.lock +export OPENHCS_AGENT_WRITE_ROOTS=/home/ts/wt/openhcs-issue-batch-20260929/paired-field-parent-20260930:/home/ts/.cache/agent-scratch/paired-field-parent-20260930:/home/ts/.openhcs/tcp/5997.startup.lock:/home/ts/.openhcs/tcp/6997.startup.lock +cd /home/ts/wt/basicpy-live-candidate-20260930 +exec /home/ts/wt/basicpy-live-candidate-20260930/.venv/bin/python -B "$@" diff --git a/tests/unit/test_source_bound_matched_image_set_anchors.py b/tests/unit/test_source_bound_matched_image_set_anchors.py index 28df89ff50..f79d80899b 100644 --- a/tests/unit/test_source_bound_matched_image_set_anchors.py +++ b/tests/unit/test_source_bound_matched_image_set_anchors.py @@ -5,6 +5,7 @@ from openhcs.constants.constants import AllComponents from openhcs.core.artifacts import ( + ArtifactMeasurementSubjectRelation, ArtifactOutputPlan, ArtifactSpec, GroupLineageSourceRelation, @@ -146,11 +147,16 @@ def _filter_source_anchors( ArtifactSpec.output( "Measurements" if shared_output else f"{binding.alias}Measurements", MeasurementsArtifactType, - relations=tuple( - GroupLineageSourceRelation(source=source_spec.ref()) - for source_spec in ( - declared_specs if shared_output else (binding.input_spec(),) - ) + # These synthetic declarations test dependency anchors, not image + # or object measurement rows. Their subject is the artifact itself. + relations=( + ArtifactMeasurementSubjectRelation(), + *( + GroupLineageSourceRelation(source=source_spec.ref()) + for source_spec in ( + declared_specs if shared_output else (binding.input_spec(),) + ) + ), ), ) for binding in (compiled_bindings[:1] if shared_output else compiled_bindings) @@ -163,9 +169,12 @@ def _filter_source_anchors( ArtifactSpec.output( "AggregateMeasurements", MeasurementsArtifactType, - relations=tuple( - GroupLineageSourceRelation(source=source_spec.ref()) - for source_spec in declared_specs + relations=( + ArtifactMeasurementSubjectRelation(), + *( + GroupLineageSourceRelation(source=source_spec.ref()) + for source_spec in declared_specs + ), ), ), ) @@ -545,8 +554,9 @@ def test_complete_source_set_templates_preserve_each_execution_group_anchor( measurements = ArtifactSpec.output( "SourceSetMeasurements", MeasurementsArtifactType, - relations=tuple( - GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + relations=( + ArtifactMeasurementSubjectRelation(), + *(GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs), ), ) @@ -671,8 +681,9 @@ def test_static_site_groups_do_not_cross_project_natural_source_set_templates( ArtifactSpec.output( "AlignMeasurements", MeasurementsArtifactType, - relations=tuple( - GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs + relations=( + ArtifactMeasurementSubjectRelation(), + *(GroupLineageSourceRelation(source=spec.ref()) for spec in input_specs), ), ), ) From d8fa0d5afd690cb1d37b7dd49012d1e0e8035716 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Wed, 30 Sep 2026 20:24:10 -0400 Subject: [PATCH 5/6] Copy numeric image data through its array owner before object conversion --- .../backends/cellprofiler/object_images.py | 2 +- ...filer_uncovered_object_output_contracts.py | 40 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/openhcs/processing/backends/cellprofiler/object_images.py b/openhcs/processing/backends/cellprofiler/object_images.py index 11f49ba70e..2ec98235ff 100644 --- a/openhcs/processing/backends/cellprofiler/object_images.py +++ b/openhcs/processing/backends/cellprofiler/object_images.py @@ -200,7 +200,7 @@ def convert_image_to_objects( """ from skimage.measure import label - working_image = image.copy() + working_image = np.asarray(image).copy() if cast_to_bool: working_image = (working_image != background).astype(np.uint8) if preserve_label: diff --git a/tests/unit/test_cellprofiler_uncovered_object_output_contracts.py b/tests/unit/test_cellprofiler_uncovered_object_output_contracts.py index 5042e20b44..cde5e96836 100644 --- a/tests/unit/test_cellprofiler_uncovered_object_output_contracts.py +++ b/tests/unit/test_cellprofiler_uncovered_object_output_contracts.py @@ -33,7 +33,11 @@ MeasurementRowAxisField, MeasurementRowValueField, ) -from openhcs.core.runtime_image_values import image_payload_metadata +from openhcs.core.runtime_image_values import ( + ImagePayloadMetadata, + image_payload_metadata, +) +from openhcs.core.source_metadata import SourceVoxelSpacing from openhcs.core.runtime_object_labels import ( ObjectLabelValue, object_label_dense_array, @@ -229,6 +233,40 @@ def test_object_leaf_callables_emit_schema_rows_then_nominal_labels() -> None: assert dead_worms[2].object_label_domain().declared_object_count == 0 +@pytest.mark.parametrize("metadata_bearing", (False, True)) +@pytest.mark.parametrize("preserve_label", (False, True)) +def test_image_conversion_preserves_source_pixels_and_metadata( + metadata_bearing: bool, preserve_label: bool, +) -> None: + pixels = np.zeros((12, 12), dtype=np.uint8) + pixels[2:5, 2:5] = 2 + pixels[7:10, 7:10] = 7 + original = pixels.copy() + metadata = ImagePayloadMetadata( + source_path="/input/A01_s001_w1_z001_t001.TIF", + source_component_metadata={"well": "A01", "channel": "1"}, + source_voxel_spacing=SourceVoxelSpacing((0.65, 0.65)), + ) + image = metadata.payload_with(pixels, None) if metadata_bearing else pixels + + main_image, rows, objects = inspect.unwrap(convert_image_to_objects)( + image, preserve_label=preserve_label, + ) + + assert main_image is image + np.testing.assert_array_equal(pixels, original) + expected_labels = original if preserve_label else np.where(original == 7, 2, original // 2) + np.testing.assert_array_equal(object_label_dense_array(objects), expected_labels) + assert objects.object_label_domain().declared_object_count == 2 + assert tuple(rows.iter_row_mappings()) == ( + {"slice_index": 0, "object_count": 2, "mean_area": 9.0, "total_area": 18}, + ) + source_metadata = image_payload_metadata(image) + assert objects.source_provenance == source_metadata.source_provenance + assert objects.parent_image_source_voxel_spacing == source_metadata.source_voxel_spacing + assert objects.source_spatial_domain.source_shape_yx == pixels.shape + + def test_identify_dead_worms_projects_exact_native_measurement_features() -> None: module = _module( IdentifyDeadWormsModule, From 2911ff9666f31ad7bb4f0df10844b5256abfd993 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Wed, 30 Sep 2026 20:41:20 -0400 Subject: [PATCH 6/6] Retain installed paired-field export acceptance and source-route correction --- .../check-installed-parent.py | 93 ++++++++++++++++ .../installed-parent-checkpoint.rst | 101 ++++++++++++++++++ .../pipeline-live-parent.py | 5 +- 3 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 docs/validation/paired_field_csv_314_20260930/check-installed-parent.py create mode 100644 docs/validation/paired_field_csv_314_20260930/installed-parent-checkpoint.rst diff --git a/docs/validation/paired_field_csv_314_20260930/check-installed-parent.py b/docs/validation/paired_field_csv_314_20260930/check-installed-parent.py new file mode 100644 index 0000000000..1fcc3c9c73 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/check-installed-parent.py @@ -0,0 +1,93 @@ +"""Read-only verification of the installed two-well synthetic export control.""" + +import csv +import json +from pathlib import Path + +import numpy as np +import tifffile + +from openhcs.core.source_workspace_projection import ( + VirtualWorkspacePathLookup, + VirtualWorkspaceSourceProjection, +) +from openhcs.runtime.zmq_execution_observation import ZMQRuntimeExecutionObservationExport + + +def main(root: Path) -> None: + receipts = root / "mcp-image-copy-reconnected" + status = json.loads((receipts / "receipt-017.json").read_text()) + execution = status["payload"]["results"][0]["payloads"][0] + assert status["returncode"] == 0 + assert execution["status"] == "complete" + assert execution["response"]["execution"]["error"] is None + inventory_receipt = json.loads((receipts / "receipt-020.json").read_text()) + inventory = inventory_receipt["payload"]["results"][0]["payloads"][0] + assert inventory_receipt["returncode"] == 0 + assert inventory["total_count"] == inventory["returned_count"] == 16 + assert inventory["truncated_count"] == 0 + cells_record = next(record for record in inventory["records"] if record["key"] == "Cells.csv") + assert cells_record["preview"]["truncated"] is False + cells = cells_record["preview"]["csv_rows"] + assert len(cells) == 4 + assert {(row["image_number"], row["object_label"]) for row in cells} == { + ("1", "1"), ("1", "2"), ("2", "1"), ("2", "2"), + } + for row in cells: + assert row["Parent_Nuclei"] == row["object_label"] + assert float(row["AreaShape_Area"]) == 52.0 + assert float(row["Location_Center_X"]) == float(row["AreaShape_Center_X"]) + assert float(row["Location_Center_Y"]) == float(row["AreaShape_Center_Y"]) + assert all(value != "" for value in row.values()) + + output = root / "outputs-input-source-fixed" / "synthetic_openhcs" + with (output / "results" / "Cells.csv").open(newline="") as handle: + assert list(csv.DictReader(handle)) == cells + projection = VirtualWorkspaceSourceProjection.from_openhcs_metadata( + output, json.loads((output / "openhcs_metadata.json").read_text()), + ) + assert len({(ref.backend, ref.backend_address) + for ref in projection.source_refs_by_virtual_path.values()}) == 4 + for well in ("A01", "B01"): + for channel, name, step in (("1", "Nuclei", 0), ("2", "Cells", 1)): + relative = f"results/{well}_w{channel}_{name}_step{step}.labels.tif" + lookup = VirtualWorkspacePathLookup(relative, str(output / relative)) + source_projection = projection.require_source_projection_for(lookup) + assert source_projection.ref.backend == "disk" + assert source_projection.ref.backend_address == relative + assert source_projection.image_metadata.source_spatial_domain.source_shape_yx == (32, 32) + nuclei = tifffile.imread(output / "results" / f"{well}_w1_Nuclei_step0.labels.tif") + expected_nuclei = np.zeros((32, 32), dtype=np.int32) + expected_nuclei[5:9, 5:9] = 1 + expected_nuclei[22:26, 22:26] = 2 + np.testing.assert_array_equal(nuclei.squeeze(), expected_nuclei) + cell_labels = tifffile.imread(output / "results" / f"{well}_w2_Cells_step1.labels.tif") + assert set(np.unique(cell_labels)) == {0, 1, 2} + assert np.count_nonzero(cell_labels == 1) == np.count_nonzero(cell_labels == 2) == 52 + dna = tifffile.imread(root / "synthetic" / "TimePoint_1" / f"{well}_s001_w1_z001_t001.tif") + expected_dna = np.zeros((32, 32), dtype=np.uint16) + expected_dna[5:9, 5:9] = 12000 + expected_dna[22:26, 22:26] = 18000 + np.testing.assert_array_equal(dna, expected_dna) + actin = tifffile.imread(root / "synthetic" / "TimePoint_1" / f"{well}_s001_w2_z001_t001.tif") + np.testing.assert_array_equal(actin, np.full((32, 32), 24000, dtype=np.uint16)) + + observation = ZMQRuntimeExecutionObservationExport.read( + root / "runtime-observation-input-source-fixed.json", + ) + assert observation.execution_id == "bb932c48-de7a-4867-bbb2-5a090a5aa928" + assert dict(observation.execution_success_by_axis) == {"A01": True, "B01": True} + close_receipt = json.loads((receipts / "receipt-021.json").read_text()) + outcome = close_receipt["payload"]["results"][0]["payloads"][0]["outcome"] + assert outcome["request_attempted"] and outcome["acknowledged"] and outcome["process_exited"] + print("PASS: installed COMPLETE; four complete paired cell rows; four label projections; " + "known source pixels unchanged; native export reopens; exact worker closed. " + "Physical calibration and biological accuracy are not assessed by this control.") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("root", type=Path) + main(parser.parse_args().root) diff --git a/docs/validation/paired_field_csv_314_20260930/installed-parent-checkpoint.rst b/docs/validation/paired_field_csv_314_20260930/installed-parent-checkpoint.rst new file mode 100644 index 0000000000..44d35e3192 --- /dev/null +++ b/docs/validation/paired_field_csv_314_20260930/installed-parent-checkpoint.rst @@ -0,0 +1,101 @@ +Installed paired-field export acceptance +======================================= + +Parent integration owner. Production candidate d8fa0d5afd690cb1d37b7dd49012d1e0e8035716 +normally integrates main8e478cb21f89fe74c3d6ead0cb54c67a5e1047dc with PR317. +This checkpoint supersedes source-only limits without erasing their original +failures or claiming biological acceptance or full ZIP-refactor completion. + +Issue322 reproduces on both metadata-bearing connected-component and preserved +label inputs: two rich-image cases fail at ``image.copy()``, while both plain +array controls pass. The existing runtime payload already owns NumPy conversion. +Replace that consumer-only array-method assumption with ``np.asarray(image).copy()``. +Keep the original image in main flow and SourceImageObjectLabelBuildRequest, +preserving pixels, source identity, domain and declared spacing. No carrier +forwarding method, type/name switch, metadata mirror or fallback is added. +BOUND-2/BOUND-7 prevention uses the declared conversion owner instead of bypassing +the carrier or probing/adding private array attributes. This is an authored +boundary repair, not an NRA-produced equivalence proof. + +Current source checks: 51 tests pass across object-output contracts, source-image +identity policy and the real spreadsheet exporter. Four additional rendering +regression controls pass. The new rich/plain cases retain exact labels, object +counts, areas, untouched input pixels, original main-flow identity, provenance, +spatial domain and configured 0.65 XY spacing. The unchanged packaged structural +ratchet compares 5,133 metrics against current main with zero positive deltas. +Earlier full-context NRA/R1 deadline failures remain incomplete, not passes; +the owner explicitly directed that these not block verified useful checkpoints. +An initial source invocation used a nonexistent test filename and ran no tests; +its exit4/XML are retained and excluded from the 55-pass count. + +Persistent evidence:: + + /home/ts/wt/openhcs-issue-batch-20260929/paired-field-parent-20260930 + +Build/install uses the actual OpenHCS wheel and its recorded ArrayBridge409b1e0 +companion wheel in the isolated candidate environment. Heavy third-party packages +and Fiji are reused; download is disabled and shared main/installations unchanged. +Fresh MCP health reports site-packages, all 56 packaged resources and no stale +source. The original failed installed run029ec591 remains retained independently. + +The first receipt helper exits at its PTY's 4,096-byte canonical input limit +before parsing or dispatching the artifact-plan request. Its native startup +handle149206/create1790814373.81 remains live. A new MCP client150535 reconnects +with noncanonical, echo-disabled terminal input and observes that same child +through readiness. Startup, preparation and execution are not replayed. Ordinary +10-second observation deadlines are unchanged. Native cold preparation takes +about119 seconds; this is explicit preparation, not a raised per-command timeout. + +After the copy repair, executionfa80b527-a1c4-4f00-846c-28164f7a1b27 passes +KnownNuclei and fails at the next step: the parent's synthetic control left +KnownCells on PREVIOUS_STEP although it requires original Actin-channel main +flow, absent from the DNA-only predecessor. The reflected processing-config +schema and existing CellProfiler importer confirm that named artifact binding +does not select main-flow input. Correct only the fixture's existing lazy +``processing_config.input_source`` to PIPELINE_START. Preserve this failed +run and use ``outputs-input-source-fixed`` rather than overwriting its files. +No scientific parameters, algorithm or production source-selection guard change. + +The fresh complete PipelineDocument retains all source aliases/coordinate rules, +two wells, one worker and all four analysis/export steps. Artifact inspection +finds four source files, two axes and eight per-axis step plans without errors. +Compile14d9ac41-4b55-4c88-93a4-02ae04de50e9 completes in0.79 seconds. +Executionbb932c48-de7a-4867-bbb2-5a090a5aa928 completes in1.11 seconds, including +strict final metadata reconciliation. Reconnected receipt017 is terminal success. + +Read-only installed ``check-installed-parent.py RECEIPT_ROOT`` verifies: + +* MCP's explicit result-directory route returns all16 persisted result files + without truncation, including four complete Cells.csv rows rather than eight + split partial rows. Native bounded CSV previews agree exactly with disk. +* Image numbers1/2 each contain objects1/2. Parent_Nuclei, location and shape + coexist in every cell row; all fields are populated. Areas are52 pixels each; + location and shape centres agree at6.5/23.5 pixels. Fields are not collapsed. +* Four physical label references reopen through the existing workspace projection + with disk addresses and32x32 spatial domains. Nuclei labels match the known + masks exactly; both cell IDs contain52 pixels each. All four synthetic raw + images retain their fixture pixels unchanged. +* The existing ZMQRuntimeExecutionObservationExport reader reopens the actual + gzip-pickle observation (the extension is not its format authority) and + verifies both wells succeeded and the exact execution ID. No new reader. + +The checker initially counted aliased lookup keys as physical files; the native +projection intentionally admits relative/full aliases. The corrected assertion +counts distinct backend addresses and requires each declared source projection. +No CSV, label, source-pixel or completion assertion was removed. + +This manually declared generic source-binding fixture omits source_voxel_spacing; +its HTD text alone does not calibrate the generic declaration route. Do not +claim installed physical-unit acceptance from it. The rich-input unit control +proves declared spacing is preserved; this installed control proves field/row +identity and original pixel-coordinate semantics only. Biological raw/result/ +combined QA, calibration of future trials and fresh blind analysis remain separate. + +Owned runtime close in receipt021 reports request_attempted, acknowledged and +process_exited true for149206/create1790814373.81. MCP150535 exits normally; +independent process/socket checks confirm both gone and ports5997/6997 free. +No viewer was launched, desktop:0 and H002 untouched. Runtime logs/settings are +archived in ``runtime-image-copy-fixed-logs.tgz`` before removing only owned +18MiB scratch and20MiB generated build output. All scientific output, failed +attempts, requests, receipts, wheel candidates and persistent source are retained. +H003e remains immutable REJECT with no data access, rerun, tuning or answers read. diff --git a/docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py b/docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py index 628e75269b..b30ec89770 100644 --- a/docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py +++ b/docs/validation/paired_field_csv_314_20260930/pipeline-live-parent.py @@ -2,7 +2,7 @@ from pathlib import Path -from openhcs.constants import AllComponents, GroupBy, Microscope, VariableComponents +from openhcs.constants import AllComponents, GroupBy, InputSource, Microscope, VariableComponents from openhcs.core.config import ( LazyPathPlanningConfig, LazyProcessingConfig, @@ -58,7 +58,7 @@ ), ), path_planning_config=LazyPathPlanningConfig( - global_output_folder=Path("/home/ts/wt/openhcs-issue-batch-20260929/paired-field-parent-20260930/outputs"), + global_output_folder=Path("/home/ts/wt/openhcs-issue-batch-20260929/paired-field-parent-20260930/outputs-input-source-fixed"), # This journey's durable result is the typed CSV bundle, not raw copies. well_filter=0, ), @@ -78,6 +78,7 @@ ), FunctionStep( name="KnownCells", + processing_config=LazyProcessingConfig(input_source=InputSource.PIPELINE_START), source_bindings=LazyStepSourceBindingsConfig( enabled=True, bindings=(NamedSourceBinding(alias="Actin"),),