Skip to content

E1: leftover families, value-to-JSON copies, path identity; enum-dispatch guard - #1203

Merged
trissim merged 44 commits into
mainfrom
refactor/E1-leftover-families
Oct 11, 2026
Merged

trissim merged 44 commits into
mainfrom
refactor/E1-leftover-families

Conversation

@trissim

@trissim trissim commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator

Receipt: docs/refactor/consolidation-20261009/E1-leftover-families.md

  • Source-binding kinds (SourceFilterMatchType, SourceFilterSubject, MetadataSource, SourceSetRole, SourceProjectionRole, SourceBindingOrigin) are families whose members own the behaviour; the matcher/target-resolver restatements are deleted.
  • GUI debug enums converted; DebugSessionPhase is its declaration family; CompiledArtifactInspectionRequest is its wire message (payload copy deleted).
  • numpy values encode through to_jsonable; two private switches deleted.
  • Dataset/store identity uses K4's lexical path identity (absolute_source_path), no resolve().
  • Whole-tree census: ~70 dispatched enums converted or deleted; the rest justified as boundary spellings or reassigned (K3, K5, K2, plane-mode family, L7/G6, U2, E2) in the guard's table.
  • Guard tests/unit/test_e1_enum_dispatch_guards.py: no Enum-member dispatch (compare, match, dict key, EnumKeyedStrategyMixin) outside listed boundary modules; stale entries fail.
  • Library: 0.2.8: RegisteredClassChoices validates registry keys in pydantic python-introspect#22 (0.2.8, pydantic accepts RegisteredClassChoices keys); submodule at its branch head, pin bump after release.

Checks: structural ratchet (openhcs, scripts, benchmark) exit 0; NRA R1 exit 0; official30 parity passed (1 passed, 11m17s); focused unit suites and related integration tests pass except failures that also fail on base 72a5c32.

E1 · PR #1203 · guards 6/6 · production −4095 +4010 · tests −1517 +2120

🤖 Generated with Claude Code

trissim and others added 30 commits October 11, 2026 10:25
…tity

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…quired

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…vents, ROI columns); platform and log-level spellings stay at their boundary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…elf through to_jsonable

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…red wire view

ViewerSettlePhase becomes SettlementRunning/SettlementComplete/SettlementFailed;
each phase owns its validation and idle completion. ViewerSettleProgress decodes
and encodes through its declared fields (WireView), so ViewerSettleField and the
from_response/to_wire_mapping copies are deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CompiledArtifactInspectionControlPayload copied the request's one field and
hand-coded its codec against a one-member type enum; the request now
subclasses TypedWireMessage and the control strategy keys by its wire_type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re families

DebugSessionPhase was an enum keying the phase declarations that already
carried the behaviour; the declarations are now the phases. Toolbar placement
is a family the toolbar iterates; the runtime-values action is identified by
its own declaration. The Pipeline* aliases of the core debug types are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eaves key by platform class

AgentRuntimePlatformKey is deleted; the *AgentRuntimePlatformAuthority classes
are the platforms (AgentRuntimePlatform, LinuxRuntimePlatform, ...), and Claude
Desktop paths and desktop deployment select their leaf by nominal type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
source_projection, dataset_sources and the Bio-Formats adapter compared
resolve() results, a second identity rule beside K4's lexical one. They now
use absolute_source_path (the lexical identity made absolute, no symlink
following). A plate reached through a symlink alias is a different dataset
root; the registration test now checks reuse for a lexically equal spelling.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s and variable-size handling are families

ViewerLifecycleMode and ViewerLifecycleState become the ViewerLifecycle family
(ViewerStopped, ViewerConnectedExternal, ViewerOwnedProcess); each owns
is_running and bootstrap rollback. ViewerLaunchContextMode becomes
ViewerLaunchSession. NapariLayerKind members own layer creation, replacing the
creator and logger tables. NapariDimensionLabelRouteSource members carry their
logged reason. NapariVariableSizeHandling members (PadToMaxSize,
SeparateLayers) own routing and materialization; the EnumKeyed strategy family
is deleted and the config field holds the class (RegisteredClassChoices).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ViewerProcessLaunchConfig encodes and decodes through its fields (WireMessage);
ViewerProcessLaunchField and the hand-written mapping are deleted. Decoding
still requires every declared field.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…milies; PlateManager document assignments are a record

SelectedAllSelectionMode and its UiCodeDocumentSelectionMode alias are
deleted: SelectedItems/AllItems own keeps() and pick(), and the wire keeps
their registry names. DesktopUpdateCheckOrigin members declare quiet;
DesktopUpdateProgressAction becomes ReopenAfterFailedUpdate/
ExitAfterFailedUpdate, each following itself. PlateManagerCodeNamespaceField
is replaced by PlateManagerDocumentAssignments, whose fields are the names.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… numbering

CellProfilerPipelineStage, ModuleSettingCoverageStatus, CellProfilerMeasurementFeatureKind
(merged with its parser family) and MeasurementImageReferenceDomain become AutoRegisterMeta
families whose members own what consumers switched on; CellProfilerPipelineFileKind and
the CellProfilerMeasurementImageDomain alias are deleted. SpatialGridOrdering members carry
whether numbers fill a row first, so the grid stops comparing members.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The napari state projection builds summary mappings that ViewerPayloadSummary
and ViewerArrayValueSummary decode strictly; ViewerPayloadSummaryField restated
those field names and is deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s, field filters and bridge operation states are families

Members own what consumers switched on: parameter sources answer
agent_supplied and their runtime description; selected-plate targets resolve
their plate root; field filters match a field summary (the separate
ObjectStateFieldFilterDeclaration family is deleted); operation states answer
is_terminal, severity and completion selection. Catalog signature and summary
views render themselves; the unused search_rank is deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…viour on the members

SourceFilterMatchType, SourceFilterSubject, MetadataSource, SourceSetRole,
SourceProjectionRole and SourceBindingOrigin were enums whose meaning each
consumer re-decided; the matcher and target-resolver strategy families restated
two of them one-to-one, keyed by .value. Each is now an AutoRegisterMeta family:
match types own matches() (text comparisons and their negations, path
predicates), subjects own text_of(), metadata sources own texts(), the
primary-plane role checks its artifact kind. Fields hold the member class with
RegisteredClassChoices; the wire spelling is the registry name (unchanged
strings). CellProfiler's subject literals decode through the family registry;
its operator literals are one table naming our classes. Workspace projection
strategies and source-universe requests key by the member class.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efineGrid and SplitOrMerge variants keyed by class

ThresholdDiagnosticDomain, WatershedRuntimeFamily, ExperimentalAnalysisScope, DefineGridVariant
and SplitOrMergeInputTopology are deleted as enums: their strategy leaves (or new variant
classes) are the family members, keyed by name or function name, and own what was switched on.
DefineGrid's resolve_function asks the variant instead of re-deciding it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
StepInputDependency packed four variants into a kind enum plus optional
fields that every consumer re-checked; each case is now a frozen subclass
(UnresolvedStepInput, NoMainFlowInput, PipelineStartInput, StepOutputInput),
and only StepOutputInput carries the producer step. SourceImageSetComponentRole
restated a membership test; SourceAnchorSelectionStatus was written and never
read; SourceBindingMatchResolutionStatus restated whether a binding matched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re families; descriptor-set size picks its resolver directly; error dialogs are a window field

DescriptorSetCardinality and UiWindowSemanticMarker are deleted: the
descriptor set returns the resolver for its size, and a window summary carries
error_dialog instead of a one-member marker string.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…de and export scope are families

OrchestratorState, TerminalExecutionStatus, ExecutionStatus,
RuntimeObservationMode and ZMQRuntimeObservationExportScope become class
families whose members carry what consumers switched on (retain_records,
returns_every_record, completion_payload, export, succeeded). Wire spellings
are the registry names; the agent run request keeps a boundary Enum view
derived from the export-scope registry. ExecutionResult.is_error is deleted
(derived from status).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s use one result key

FunctionCatalogControlMessageType, FunctionCatalogControlField and
FunctionCatalogPreparationStatus are deleted: each request declares its wire
type (the execution server keys its strategies by it), every response carries
its value under one result key, and the pending reply declares its status.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…E is gone)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…leted

Each MaterializationBackend member declares its PolyStore backend and whether
it writes Zarr; the compiler asks writes_zarr instead of comparing members.
DatasetSource.get_required_backend had no caller.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CustomFunctionLifetime members own whether a source file must be checked.
MfdPresetKey keyed a table restating each preset and MfdPresetFamily keyed the
materializer registry; each preset is now one definition naming its
materializer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
trissim and others added 7 commits October 11, 2026 11:18
InputSource's two members were compared by every planner; ReadPreviousStep
and ReadPipelineStart now declare whether the step reads the pipeline-start
main flow, and the config field holds the class (RegisteredClassChoices).
Wire spellings unchanged ('previous', 'start'). The steps.abstract re-export
and a re-check of the declared field type are deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t the 0.2.8 branch head

The guard resolves each Enum.MEMBER through the module's imports and fails
on a comparison, match case, dict key or EnumKeyedStrategyMixin key outside
the table of boundary spellings and reassigned enums; a stale table entry
fails too. It also keeps the deleted names deleted, the dataset identity
modules free of resolve(), and numpy encodable through to_jsonable.

python-introspect 0.2.8 (OpenHCSDev/python-introspect#22) lets pydantic
accept a RegisteredClassChoices field's registry key, which the MCP tool
schemas need for the family-valued config fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Membership questions the converted families answer by flags become nominal
identity or member behaviour: parameter sources split into agent- and
runtime-supplied branches, the outcome export scope checks its own export
path (one rule, written once), default step directories move onto the
step-input dependency, viewers answer their own process liveness, and the
semantic ObjectState field filter is the union of the four it names. Flags
that restated a member's identity (writes_zarr, streams_from_source_context,
keeps_every_field, completed, editable, collects_records,
returns_every_record) are deleted. Forward references are unquoted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nts record

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 11, 2026 16:23

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.

trissim and others added 5 commits October 11, 2026 12:24
Conflicts resolved keeping both sides: K5's graph-built compiles and
AuthoredFunctionPattern, E1's step-input and input-source families, and the
catalog's runtime_bound_parameter_names with the artifact-input family member.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…contract

- ConfigService decodes a type[Family] patch value once, through the family
  registry (MCP JSON patches spell members by registry key).
- MCP tool schemas: python-introspect's RegisteredClassChoices publishes a
  named enum definition, and the server's schema generator spells a family
  default by its registry key, so openhcs_stream_plate_files_to_viewer and
  openhcs_run_datasets match the published contract again; the run-datasets
  boundary enum keeps its published name.
- python-introspect decodes registry keys without running the encoder.
- benchmark CLI and the desktop update smoke script use the families.
- Tests that built removed enum members (orchestrator READY, a string
  materialization backend) or could not populate family fields now use the
  member classes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Import conflicts only: K2's owning modules under openhcs/core/artifacts/ with
E1's families (input source, orchestrator state, projection roles, filename
identity).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng owners

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
trissim and others added 2 commits October 11, 2026 15:34
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