Skip to content

0.6.0: domain-blind vocabulary, declared messages, launch policy, execution transport config (L3) - #28

Merged
trissim merged 2 commits into
mainfrom
refactor/L3-zmqruntime-vocabulary
Oct 10, 2026
Merged

trissim merged 2 commits into
mainfrom
refactor/L3-zmqruntime-vocabulary

Conversation

@trissim

@trissim trissim commented Oct 10, 2026

Copy link
Copy Markdown
Contributor

OpenHCS consolidation surface L3 (receipt: docs/refactor/consolidation-20261009/L3-zmqruntime-vocabulary.md in openhcs). Breaking: 0.5.0 → 0.6.0.

What changes

  • Domain-blind vocabulary. plate_id → subject_id on TaskProgress, ExecuteRequest, ExecutionRecord, RunningExecutionInfo, QueuedExecutionInfo; execution_plate_id → execution_subject_id; GenericPlateProjection → GenericSubjectProjection (subjects, by_subject_latest, get_subject, adapter.subject_id). The completion summary carries partition_count/partition_values (OpenHCS's kernel word for the parallel axis's values). No plate/well word remains in src/.
  • Declared messages. WireMessage encodes with python_introspect.to_jsonable and decodes with dataclass_from_mapping; TypedWireMessage carries a wire_type under type; WireView reads its declared fields out of a wider payload (application progress events, status responses, extended heartbeats). Control requests (ExecuteRequest, StatusRequest, CancelRequest, progress (un)registration, shutdown) derive their body from their fields under ControlRequestHeader, which alone encodes the relative observation budget. The 45 hand-written to_dict/from_dict and ExecutionRecord._to_transport_value are gone. CancelResponse, ShutdownAck and ProgressSubscriptionResponse replace hand-built response dicts; the execution client sends declared requests and ExecutionClient.serialize_task returns an ExecuteRequest.
  • Wire shape (runtime state only, reset on install): optional fields travel as null; PongResponse.process_usage and control_capabilities (an ordered tuple) are nested/declared; TaskProgress has execution_id (the task_id alias and the context sweep are gone); ExecutionRecord.client_address defaults to None; its server-local extras (was metadata) and progress_event are attributes, not fields.
  • Launch policy moves here from pyqt-reactive: zmqruntime.process_launch. Host families are BackgroundProcessPlatform subclasses registered by sys.platform (WindowsBackgroundProcesses, default SessionBackgroundProcesses) instead of an enum with branches.
  • Execution transport config: zmqruntime.execution.config.ExecutionTransportConfig(ZMQConfig) (hosts, transport mode, request deadlines, discovery, port range, artifact TTL, client_endpoint). server_poll_interval_seconds moves onto ZMQConfig, where the base client already read it.
  • Deleted: validate_progress_payload (use TaskProgress.from_dict), ROIMessage, ShapesMessage (no readers), 34 unused MessageFields keys, the _run_execution/_handle_status compatibility shims. The package root uses python_introspect.lazy_exports. Requires python-introspect>=0.2.5,<0.3.

Tests

pytest tests (local, Python 3.12): 376 passed. New: one round-trip test over every declared message (it fails if a message is added without an example), typed-kind rejection, the launch-policy family test (moved from pyqt-reactive). Tests that asserted the removed stringifying encoder were deleted.

Lockstep PRs: pyqt-reactive 0.4.0 and PolyStore 0.6.0 (both zmqruntime>=0.6,<0.7), openhcs L3. Not merged or tagged; the owner releases.

L3 · zmqruntime PR · src −1171 +799 (includes +236 moved in: process_launch, ExecutionTransportConfig) · tests −148 +286

🤖 Generated with Claude Code

trissim and others added 2 commits October 10, 2026 16:57
…execution transport config

- plate_id is subject_id (execution_subject_id, GenericSubjectProjection,
  subjects/by_subject_latest/get_subject); the results summary carries
  partition_count/partition_values.
- Messages are declared types: WireMessage encodes with to_jsonable and
  decodes with dataclass_from_mapping; TypedWireMessage carries a wire type,
  WireView reads its fields out of a wider payload, and control requests
  derive their body from their fields under ControlRequestHeader. The 45
  hand-written to_dict/from_dict are gone. CancelResponse, ShutdownAck and
  ProgressSubscriptionResponse replace hand-built response dicts.
- ExecutionRecord's server-local extras and progress event are attributes,
  not fields; its fields are its wire record.
- process_launch moves here from pyqt-reactive; host families are
  BackgroundProcessPlatform subclasses.
- ExecutionTransportConfig (execution.config) owns execution endpoint
  configuration; server_poll_interval_seconds moves onto ZMQConfig, where
  the base client reads it.
- Deleted: validate_progress_payload, ROIMessage, ShapesMessage, unused
  MessageFields keys, the _run_execution/_handle_status shims.
- The package root uses python_introspect.lazy_exports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 10, 2026 21:52

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants