Repository navigation
U3+L4: generic Qt machinery leaves OpenHCS (pyqt-reactive, ObjectState, python-introspect) - #1196
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The editable-table block of the source-binding editor (cell editor family, dataclass-derived columns, record picker, table controller and layout) now lives in pyqt_reactive.widgets.editable_table; the editor imports it. - FieldLabel comes from python-introspect; core/field_label.py is deleted. - core/path_cache.py, a verbatim copy of the library module, is deleted. The plate manager declares PlateImport, a PathCacheKey subclass, beside its one use; the stored key is unchanged (plate_import). - xdg_paths no longer migrates files out of a pre-XDG ~/.openhcs directory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SCOPE_SEGMENT_SEPARATOR and the hand-written '::' joins, splits and prefix tests in the session, step scopes, pipeline scope identity, compiler, image browser, live measurements, plate viewer and MCP viewer renderer call ScopeKey. Window-route regexes derive the separator from ScopeKey.SEPARATOR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GlobalEventBus restated two facts the session already publishes: a dataset's pipeline changed (PipelineChanged/PipelineImported) and the global config changed (GlobalConfigChanged). The pipeline editor re-broadcast the first only for its current plate, and only DualEditorWindow listened. DualEditorWindow now subscribes to the session's events for its own plate (and follows its pipeline after time travel restores it); GlobalEventBus, GuiEventBusBroadcaster and get_event_bus are deleted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The main window builds its panes with pyqt-reactive's DockPane, persists the layout with DockLayoutStore under its existing key and version, and binds its menu and time-travel shortcuts through ShortcutLifecycle[ShortcutConfig]. OpenHCS keeps the window specs, the dock topology and MainWindowEmbeddedWidgets, a DockPanes subclass naming its panes by window id. The generic dock and shortcut tests moved to the library. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The status-bar time-travel widget, the snapshot browser and the restore commands are pyqt-reactive's; OpenHCS supplies its mutation guard and hides the global and dataset-list scopes from history. The post-restore navigation (main.py's four methods and services/time_travel_navigation.py) is TimeTravelNavigator; OpenHCS supplies which scopes are a step's function children (step_function_scope, through StepEditorScope rather than a second 'functionstep_' parser) and which dual-editor tab to show. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The plate view is a GridSelectorWidget addressed by the family's GridAddressed axis itself (it already declares the default grid, cell positions and row labels). Deleted with plate_view_widget.py: the plate-output subdirectory selector, whose selection nothing read, and the partition-filter sync, whose filter widget was never assigned. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenHCSConfigWindow is pyqt-reactive's ConfigWindow with the OpenHCS configuration document (an adapter over ConfigDocumentAuthority) and the global-config window id. Deleted: config_edit_session.py, config_window_code_document.py, ui/shared/code_editor_form_updater.py, the three readings of OPENHCS_USE_EXTERNAL_EDITOR (the variable name is now the form config's external_editor_env_var) and LazyDataclassFieldEmissionState.retain_only_authored_paths (now objectstate.retain_only_authored_paths). The image browser's grid selector addresses wells through GridAxisAddressing over the GridAddressed axis. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ObjectStateFieldSemanticProjection inherits objectstate's FieldInspection (value, edit state, provenance, types) and adds only the bridge DTO projection; the provenance effect classes and the duplicated type/field-name helpers are deleted. The '*'/'_' marker rule, written four times, is objectstate.inspection's field_markers/state_markers. tests/unit/pyqt_gui/test_generic_qt_machinery_guards.py keeps the moved modules and names out of OpenHCS, the '::' scope grammar inside ScopeKey, the legacy XDG migration deleted, the library families free of enums, the external-editor switch named once and the markers in objectstate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ve 0.5.0, python-introspect 0.2.6) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…river step_function_scope asks StepEditorScope.is_function_scope and the tab choice goes through DualEditorWindowNavigationDriver.select_tab_for_field_path, which already owns the field-path-to-tab rule, instead of probing their fields. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s connected Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…doff 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>
…ctive 0.5.0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Surfaces U3 + L4 of the consolidation refactor: generic Qt and ObjectState machinery leaves OpenHCS. Receipt:
docs/refactor/consolidation-20261009/U3-generic-qt-machinery.md(first commit; updated at the end with what was built and the corrections).Library PRs (release first, in this order)
FieldLabel)ScopeKey,objectstate.inspection,retain_only_authored_paths,MAIN_BRANCH,is_restoring_snapshot; deletesHistoryMigration/migration=)PathCacheKeyfamily, header-timer leak fix)The submodules point at those branch heads and
pyproject.tomlbounds are bumped (objectstate>=1.4,<2,python-introspect>=0.2.6,<0.3,pyqt-reactive>=0.5,<0.6). pyqt-reactive'srequirements-ci.txtpins the unreleased ObjectState and python-introspect heads until they are published. Nothing is tagged or released.What moved (OpenHCS keeps only declarations and domain glue)
source_bindings_editor.py;core/path_cache.py(verbatim copy) deleted,PlateImport(PathCacheKey)declared beside its use;core/field_label.py→ python-introspect; the pre-XDG~/.openhcsmigration inxdg_paths.pydeleted.::join/split/prefix test andSCOPE_SEGMENT_SEPARATOR→objectstate.ScopeKey.GlobalEventBusdeleted:DualEditorWindowfollows the session'sPipelineChanged/PipelineImported/GlobalConfigChangedevents for its own plate and its pipeline after a restore.DockPane/DockFloatController/DockPanes/DockLayoutStoreandShortcutLifecycle[ShortcutConfig]; OpenHCS keeps window specs, topology andMainWindowEmbeddedWidgets(DockPanes).TimeTravelNavigator(main.py's four navigation methods andtime_travel_navigation.pydeleted); OpenHCS supplies the hidden dataset-list scope,step_function_scopeand the tab choice.plate_view_widget.pydeleted; the image browser usesGridSelectorWidgetthroughGridAxisAddressingover theGridAddressedaxis.ConfigWindow,ConfigEditSession,ConfigCodeDocumentDriver,CodeEditorFormUpdater; OpenHCS keepsOpenHCSConfigWindow(document-format adapter, window id).OPENHCS_USE_EXTERNAL_EDITORis read in one place (form config).objectstate.inspection.FieldInspection; the*/_marker rule (written four times) isfield_markers/state_markers.Corrections to the plan
openhcs.agent.dto.ui_bridgetypes and dispatch throughUiBridgeOperation; moving them now would ship ~2.9k lines of DTO/contract code inside a Qt package for U4 to move again. Reassigned to U4 (recorded in 04-ARCHITECTURE.md's U4 row).Session; metadata contracts already hold state outside dirty detection).GlobalEventBusreplacement is the session's event log, not a new ObjectState subscription API (ObjectState already had them).Deletion certificates
core/path_cache.py(pyqt-reactive owns it);core/field_label.py(python-introspectFieldLabel);GlobalEventBus,GuiEventBusBroadcaster,get_event_bus,AbstractManagerWidget.event_bus(session events publish the same facts; the bus firedpipeline_changedonly for the pipeline editor's current plate, the subscription now follows each editor's own plate);ExternalCodeEditorPreference,external_editor_enabled,pipeline_editor_external_editor_enabled,PIPELINE_EDITOR_EXTERNAL_EDITOR_ENV(use_external_code_editor+FormGenConfig.external_editor_env_var);CodeEditorFormUpdater.patch_lazy_constructors(forwarded to objectstate);LazyDataclassFieldEmissionState.retain_only_authored_paths(objectstate); the four*/_marker helpers and the bridge's type/field-name helpers (objectstate.inspection);ObjectStateFieldProvenanceEffectfamily (FieldProvenance).get_root_from_scope_key,is_scope_affected(no callers;ScopeKey.root/contains);DualEditorWindow._on_config_changed'sPipelineConfigbranch (never emitted); the plate view's subdirectory selector (active_subdirnever read) and partition-filter sync (partition_filter_widgetnever assigned); libraryget_cached_path,clear_cache,remove_cached_pathand unusedPathCacheKeymembers; thetree::flash namespace (never produced).~/.openhcslegacy migration inxdg_paths.pyandHistoryMigration/migration=(rule 1, no backwards compatibility; U5 decision that histories are runtime state); the library's path-cache alias functions;PathNameRole.PIPELINE/STEP/FUNCTION(F1 deleted those file formats).PatternDataManager.extract_func_and_kwargsraises on a malformed pattern entry instead of the entry being dropped on save; a path parameter named likepipeline_pathnow gets the default path behaviour and cache context.Verification
tests/unit/pyqt_gui/test_generic_qt_machinery_guards.py9/9 pass.agent-comms-ratchet, openhcs/scripts/benchmark vs 84e7a29): exit 0, no positive delta (TypeIdentity 9→6, LongBooleanChain 12→9, StringSubscript 46→17)..github/tests/test_refactor_guardrails.py36 passed;scripts.check_refactor_r1increased: [].QT_QPA_PLATFORM=offscreen, no DISPLAY):tests/unit/pyqt_gui+tests/pyqt_gui907 passed; the remaining failures (test_managed_windows.py×2,test_image_browser_filter_controller.py×3,test_end_to_end_workflow_foundation.py×8) fail identically on an export of 84e7a29 or reference attributes absent there.tests/unit/agent,tests/unit/desktopand the scope/compiler/session tests: 1431 passed;test_declaration_selected_discovery/test_knowledge_lazy_conversion_boundary(also fail on 84e7a29 here),test_mcp_distribution_runtime×2 (known failures), and three that pass when rerun alone (test_mcp_stdio_transport,test_desktop_restart,test_viewer_render_snapshot).U3 · PR #1196 · guards 9/9 · production −6,617 +356 · tests −1,155 +359
🤖 Generated with Claude Code