Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
aeb72e5
E1: receipt for leftover families, value-to-JSON copies and path iden…
trissim Oct 11, 2026
6be32aa
E1: numpy values through to_jsonable; delete two private JSON switches
trissim Oct 11, 2026
9366929
E1: hosted MCP authentication modes are a family
trissim Oct 11, 2026
4af0532
E1: MCP process recovery reasons are a family that answers restart_re…
trissim Oct 11, 2026
15208b0
E1: GUI shell kinds own their behaviour (startup readiness, startup e…
trissim Oct 11, 2026
d408cd2
E1: client registration outcomes are a family; the report encodes its…
trissim Oct 11, 2026
79cdf43
E1: viewer settlement phases are a family; settle progress is a decla…
trissim Oct 11, 2026
08f0cf5
E1: the artifact inspection request is its wire message
trissim Oct 11, 2026
feee7e5
E1: debug session phases, toolbar placements and the inspect action a…
trissim Oct 11, 2026
b3ba85e
E1: host platforms are a family; per-platform client and deployment l…
trissim Oct 11, 2026
d32c833
E1: dataset and store identity use the one source path identity
trissim Oct 11, 2026
484004f
E1: viewer lifecycle, launch session, napari layer kinds, label route…
trissim Oct 11, 2026
974394b
E1: viewer process-launch declaration is a declared wire message
trissim Oct 11, 2026
3976531
E1: selection scope, update origin and update failure response are fa…
trissim Oct 11, 2026
9c3ee00
E1: CellProfiler interop kinds as families; grid ordering carries its…
trissim Oct 11, 2026
87f6c08
E1: payload summaries are spelled by their declared record fields
trissim Oct 11, 2026
b1c4099
E1: catalog views and ranks, parameter sources, selected-plate target…
trissim Oct 11, 2026
8c56525
E1: source-binding kinds are families; filter, metadata and role beha…
trissim Oct 11, 2026
81b2c44
E1: threshold diagnostics, watershed runtime, experimental formats, D…
trissim Oct 11, 2026
9f59e93
E1: step input dependencies are a family; delete three status/role enums
trissim Oct 11, 2026
eff45b0
Merge branch 'e1-f4-labels-cp' into refactor/E1-leftover-families
trissim Oct 11, 2026
abd40ea
Merge branch 'e1-f1-viewers' into refactor/E1-leftover-families
trissim Oct 11, 2026
8e666c1
E1: action invocation, workflow poll and widget-tree output formats a…
trissim Oct 11, 2026
917c97d
E1: orchestrator state, terminal status, axis outcome, observation mo…
trissim Oct 11, 2026
66593f6
E1: function-catalog control requests carry their wire_type; response…
trissim Oct 11, 2026
c1749eb
Merge branch 'e1-f2-agent' into refactor/E1-leftover-families
trissim Oct 11, 2026
baf84e2
E1: shrink the kernel domain-reference pin (DebugSessionPhase.NO_PLAT…
trissim Oct 11, 2026
4da43bf
E1: materialization backend is a family; dead get_required_backend de…
trissim Oct 11, 2026
477e7ca
Merge branch 'e1-f3-core' into refactor/E1-leftover-families
trissim Oct 11, 2026
cddd60c
E1: custom-function lifetime and MFD presets without enums
trissim Oct 11, 2026
0fdc095
E1: input source is a family
trissim Oct 11, 2026
3956bc8
E1: materialized filename identity is a family
trissim Oct 11, 2026
1b4e308
E1: guard enum dispatch to listed boundaries; pin python-introspect a…
trissim Oct 11, 2026
c501f82
E1: zero structural-ratchet regressions
trissim Oct 11, 2026
c3bbadb
E1: the thesis demo decodes the applied document through its assignme…
trissim Oct 11, 2026
9a1476a
E1: tests ask the observation and parameter-source families directly
trissim Oct 11, 2026
e1b1864
E1: receipt records the census outcome, reassignments and corrections
trissim Oct 11, 2026
c7a9530
E1: merge origin/main (K5); require python-introspect 0.2.8
trissim Oct 11, 2026
257b757
E1: decode family fields at the config boundary; keep the MCP schema …
trissim Oct 11, 2026
1b44a50
Merge origin/main into E1 (K3 landed)
trissim Oct 11, 2026
4ebb7b8
E1: merge origin/main (K2 artifacts package)
trissim Oct 11, 2026
ba5f851
E1: guard table regenerated after K2/K3/K5; receipt notes the remaini…
trissim Oct 11, 2026
a052d83
E1: pin released python-introspect 0.2.8
trissim Oct 11, 2026
b216a6e
Merge remote-tracking branch 'origin/main' into refactor/E1-leftover-…
trissim Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions benchmark/adapters/openhcs.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
CompilationDebugConfig,
GlobalPipelineConfig,
LazyCompilationDebugConfig,
MaterializationBackend,
MaterializeToDisk,
PipelineConfig,
)
from openhcs.core.equivalence.policy import RuntimeEquivalencePolicy
Expand Down Expand Up @@ -326,7 +326,7 @@ def _execution_global_config(
),
vfs_config=replace(
self.global_config.vfs_config,
materialization_backend=MaterializationBackend.DISK,
materialization_backend=MaterializeToDisk,
),
compilation_debug_config=compilation_debug_config,
materialize_runtime_artifacts=request.materialize_runtime_artifacts,
Expand Down
11 changes: 6 additions & 5 deletions benchmark/cellprofiler_benchmark_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
)
from benchmark.datasets.cppipe_case_catalog import official_cp3_case_category
from benchmark.runtime_env import configure_headless_cpu_benchmark_runtime
from openhcs.core.source_matching import is_image_path
from openhcs.core.source_bindings import PathIsImage


class BenchmarkCliCommand(ABC, metaclass=AutoRegisterMeta):
Expand Down Expand Up @@ -173,6 +173,7 @@ def configure(
) -> argparse.ArgumentParser:
parser = self._parser(subparsers)
from openhcs.runtime.zmq_execution_signature import (
ExportRuntimeValues,
ZMQRuntimeObservationExportScope,
)

Expand All @@ -197,8 +198,8 @@ def configure(
parser.add_argument("--pipeline-name")
parser.add_argument(
"--observation-scope",
choices=tuple(scope.value for scope in ZMQRuntimeObservationExportScope),
default=ZMQRuntimeObservationExportScope.VALUES.value,
choices=tuple(ZMQRuntimeObservationExportScope.__registry__),
default=ExportRuntimeValues.name,
help="Retain full runtime values or outcome-only execution evidence.",
)
parser.add_argument("--host", default="localhost")
Expand Down Expand Up @@ -280,7 +281,7 @@ def run(self, args: argparse.Namespace) -> int:
runtime_observation_export_path=str(
MeasuredPipelineRunArtifact.RUNTIME_OBSERVATION.path_in(output_dir)
),
runtime_observation_export_scope=ZMQRuntimeObservationExportScope(
runtime_observation_export_scope=ZMQRuntimeObservationExportScope.named(
args.observation_scope
),
submit_timeout_ms=args.submit_timeout_ms,
Expand Down Expand Up @@ -1008,7 +1009,7 @@ def _official_cellprofiler3_source_root(dataset_wrapper_path: Path) -> Path:

def _has_image_payloads(path: Path) -> bool:
return any(
candidate.is_file() and is_image_path(str(candidate))
candidate.is_file() and PathIsImage.holds_for(str(candidate))
for candidate in path.iterdir()
)

Expand Down
5 changes: 3 additions & 2 deletions benchmark/cellprofiler_comparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
run_cellprofiler_cppipe_parity,
)
from benchmark.timing import BenchmarkPhase, additive_phase_total_seconds
from openhcs.interop.cellprofiler.module_settings import SettingUnmapped
from openhcs.core.config import GlobalPipelineConfig, PartitionFilterConfig
from benchmark.equivalence.outputs import image_paths, table_paths

Expand Down Expand Up @@ -271,7 +272,7 @@ def from_report(
unmapped_cppipe_setting_row_count=sum(
1
for setting in report.cppipe_settings
if setting.coverage.value == "unmapped"
if setting.coverage is SettingUnmapped
),
supported_absorbed_processing_modules=(
coverage.supported_absorbed_processing_modules
Expand Down Expand Up @@ -304,7 +305,7 @@ def from_report(
module_num=setting.module_num,
setting_name=setting.setting_name,
normalized_setting_name=setting.normalized_setting_name,
coverage=setting.coverage.value,
coverage=setting.coverage.name,
value=setting.value,
)
for setting in report.cppipe_settings
Expand Down
16 changes: 8 additions & 8 deletions benchmark/contracts/measured_run_receipt.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
from benchmark.contracts.run_artifacts import write_new_measured_artifact
from benchmark.timing import PhaseTimingRecord
from openhcs.runtime.environment_provenance import RuntimeEnvironmentSnapshot
from openhcs.runtime.zmq_execution_signature import ZMQRuntimeObservationExportScope
from openhcs.runtime.zmq_execution_signature import (
ExportRuntimeValues,
ZMQRuntimeObservationExportScope,
)

MEASURED_PIPELINE_RUN_RECEIPT_SCHEMA_VERSION = "openhcs.benchmark.measured-pipeline.v2"
_ARCHIVED_MEASURED_PIPELINE_RUN_RECEIPT_SCHEMA_VERSION = (
Expand Down Expand Up @@ -65,8 +68,8 @@ class MeasuredPipelineRunReceipt:
completed_at_epoch_seconds: float
compile_artifact_id: str | None = None
server_environment: RuntimeEnvironmentSnapshot | None = None
observation_export_scope: ZMQRuntimeObservationExportScope = (
ZMQRuntimeObservationExportScope.VALUES
observation_export_scope: type[ZMQRuntimeObservationExportScope] = (
ExportRuntimeValues
)
expected_axis_count: int | None = None
observed_axis_count: int | None = None
Expand Down Expand Up @@ -138,11 +141,8 @@ def read(cls, path: Path) -> Self:
cls,
{
**payload,
"observation_export_scope": ZMQRuntimeObservationExportScope(
payload.get(
"observation_export_scope",
ZMQRuntimeObservationExportScope.VALUES.value,
)
"observation_export_scope": ZMQRuntimeObservationExportScope.named(
payload.get("observation_export_scope", ExportRuntimeValues.name)
),
"phase_timings": tuple(
PhaseTimingRecord.from_payload(record) for record in timing_payloads
Expand Down
2 changes: 1 addition & 1 deletion benchmark/control.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ def report_measured_pipeline_run(
f"- Compile artifact: `{receipt.compile_artifact_id or 'none; server job may include compilation'}`",
f"- Output roots: {len(receipt.output_roots)}",
"- Output files: not inspected; use output/equivalence evidence for output claims",
f"- Runtime observation scope: `{receipt.observation_export_scope.value}`",
f"- Runtime observation scope: `{receipt.observation_export_scope.name}`",
f"- Execution axes: {receipt.observed_axis_count if receipt.observed_axis_count is not None else 'not recorded'}"
+ (
f" / {receipt.expected_axis_count} expected"
Expand Down
2 changes: 1 addition & 1 deletion benchmark/converter/compatibility_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class CPPipeSettingCompatibilityCoverage(ModuleSettingRowRecord):

case_name: str
canonical_module_name: str
coverage: ModuleSettingCoverageStatus
coverage: type[ModuleSettingCoverageStatus]


@dataclass(frozen=True, slots=True)
Expand Down
6 changes: 4 additions & 2 deletions benchmark/equivalence/outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
RuntimeArtifactExecutionObservation,
)
from openhcs.core.runtime_exports import RuntimeExportObservation
from openhcs.core.source_bindings import SourceProjectionRole
from openhcs.core.source_bindings import (
SourceArtifactRole,
)
from openhcs.core.source_matching import SourceImageSetIdentityPolicy
from openhcs.core.source_projection import SourceProjectionSet
from openhcs.core.source_workspace_projection import VirtualWorkspaceSourceProjection
Expand Down Expand Up @@ -159,7 +161,7 @@ def image_snapshots(
for projection in (
workspace.source_projections_by_virtual_path[virtual_path],
)
if projection.projection_role is SourceProjectionRole.SOURCE_ARTIFACT
if projection.projection_role is SourceArtifactRole
and (root / projection.ref.backend_address).absolute() in expected_paths
)
if not projections:
Expand Down
8 changes: 4 additions & 4 deletions benchmark/matched_cellprofiler_batch.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
GlobalPipelineConfig,
LazyPathPlanningConfig,
LazyPartitionFilterConfig,
MaterializationBackend,
MaterializeToDisk,
MultiprocessingStartMethod,
PathPlanningConfig,
PipelineConfig,
Expand Down Expand Up @@ -121,7 +121,7 @@
)
from openhcs.runtime.zmq_execution_signature import (
ZMQAuxiliaryExecutionParams,
ZMQRuntimeObservationExportScope,
ExportRuntimeOutcomes,
)
from python_introspect import to_jsonable
from openhcs.domains.microscopy.axes import Microscopy
Expand Down Expand Up @@ -1112,7 +1112,7 @@ def _global_config(
global_output_folder=output_dir,
output_dir_suffix="_matched_pilot",
),
vfs_config=VFSConfig(materialization_backend=MaterializationBackend.DISK),
vfs_config=VFSConfig(materialization_backend=MaterializeToDisk),
analysis_consolidation_config=AnalysisConsolidationConfig(enabled=False),
materialize_runtime_artifacts=False,
)
Expand Down Expand Up @@ -1659,7 +1659,7 @@ def capture_progress_event(event: Mapping[str, Any]) -> None:
axis_events.clear()
progress_events.clear()
print(f"OpenHCS batch {repetition} starting.", flush=True)
export_scope = ZMQRuntimeObservationExportScope.OUTCOMES
export_scope = ExportRuntimeOutcomes
evidence_dir = root / "candidate_evidence" / str(repetition)
output_dir = root / "candidate" / str(repetition)
global_config = _global_config(
Expand Down
4 changes: 2 additions & 2 deletions benchmark/openhcs_measured_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
)
from openhcs.runtime.zmq_execution_signature import (
ZMQAuxiliaryExecutionParams,
ZMQRuntimeObservationExportScope,
ExportRuntimeOutcomes,
)

from .timing import (
Expand Down Expand Up @@ -381,7 +381,7 @@ def retain_measured_openhcs_completion(
)
if (
auxiliary_params.runtime_observation_export_scope
is ZMQRuntimeObservationExportScope.OUTCOMES
is ExportRuntimeOutcomes
):
observation_export = ZMQRuntimeExecutionOutcomeExport.read(
observation_export_path
Expand Down
16 changes: 8 additions & 8 deletions benchmark/validation/corpus.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,16 @@
ImportedMetadataTable,
MetadataExtractionRule,
MetadataSelector,
MetadataSource,
FromFileName,
FromPipelineStart,
NamedSourceBinding,
SourceBindingMatchDimension,
SourceBindingMatchField,
PairByMetadata,
PairByOrder,
SourceBindingOrigin,
SourceFilterClause,
SourceFilterMatchType,
SourceFilterSubject,
PathIsImage,
SourceFileName,
SourceSelector,
)
from openhcs.domains.microscopy.axes import Microscopy
Expand Down Expand Up @@ -533,7 +533,7 @@ def source_bindings_for_validation(
metadata=(MetadataSelector(field="channel", value=channel.value),),
inherit_current_scope=True,
),
origin=SourceBindingOrigin.PIPELINE_START,
origin=FromPipelineStart,
component_identity=(
ComponentSelector(
component=Microscopy.Channel,
Expand Down Expand Up @@ -562,14 +562,14 @@ def source_bindings_for_validation(
return SourceBindingsConfig(
source_filters=(
SourceFilterClause(
subject=SourceFilterSubject.FILE,
match_type=SourceFilterMatchType.IS_IMAGE,
subject=SourceFileName,
match_type=PathIsImage,
),
),
bindings=bindings,
metadata_rules=(
MetadataExtractionRule(
source=MetadataSource.FILE_NAME,
source=FromFileName,
pattern=(
r"^(?:plate-(?P<plate>[^_]+)_)?"
r"well-(?P<well>[A-P]\d{2})_site-(?P<site>[^_]+)_"
Expand Down
8 changes: 4 additions & 4 deletions benchmark/well_throughput_scaling.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
LazyPathPlanningConfig,
LazyVFSConfig,
LazyPartitionFilterConfig,
MaterializationBackend,
MaterializeToDisk,
MultiprocessingStartMethod,
PartitionFilterConfig,
)
Expand Down Expand Up @@ -76,7 +76,7 @@
from openhcs.runtime.zmq_execution_observation import ZMQRuntimeExecutionOutcomeExport
from openhcs.runtime.zmq_execution_signature import (
ZMQAuxiliaryExecutionParams,
ZMQRuntimeObservationExportScope,
ExportRuntimeOutcomes,
)
from python_introspect import to_jsonable
from openhcs.domains.microscopy.axes import Microscopy
Expand Down Expand Up @@ -2122,7 +2122,7 @@ def run_case_well_throughput(
output_dir_suffix="_well_throughput",
),
vfs_config=LazyVFSConfig(
materialization_backend=MaterializationBackend.DISK
materialization_backend=MaterializeToDisk
),
),
global_config,
Expand All @@ -2146,7 +2146,7 @@ def run_case_well_throughput(
).with_auxiliary_params(
ZMQAuxiliaryExecutionParams(
runtime_observation_export_path=observation_path,
runtime_observation_export_scope=ZMQRuntimeObservationExportScope.OUTCOMES,
runtime_observation_export_scope=ExportRuntimeOutcomes,
)
)
progress_events: list[dict[str, Any]] = []
Expand Down
Loading
Loading