Skip to content

B6: main's CI green - #1195

Closed
trissim wants to merge 87 commits into
mainfrom
refactor/B6-ci-green
Closed

trissim wants to merge 87 commits into
mainfrom
refactor/B6-ci-green

Conversation

@trissim

@trissim trissim commented Oct 11, 2026

Copy link
Copy Markdown
Collaborator

Surface B6 of the consolidation refactor: make Website, Documentation and Integration Tests green on main. Receipt: docs/refactor/consolidation-20261009/B6-ci-green.md (updated as CI results come in).

B6 · PR #pending · guards 3/3 · production −0 +0 · tests (pending)

🤖 Generated with Claude Code

trissim and others added 2 commits October 11, 2026 03:11
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…alls the OpenHCS candidate

Under --import-mode=importlib (run_installed_tests.py) the test directory is not
on sys.path, so 14 modules importing a sibling test module by bare name stopped
unit-test collection. The website validated against a five-package roster and
then imported openhcs, whose graph needs numba; it now installs the candidate
through install_ci_candidate and triggers on openhcs/**.

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

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 3 commits October 11, 2026 03:16
…tions lazily

reap_spawned_processes called os.getpgid unconditionally, an AttributeError at
teardown of every reaping test on Windows. smoke_installed_gui.py gained a
module-level openhcs.authoring import, so the dependency-light installer
contract tests (pytest, packaging, build only) could not import it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
REPOSITORY_SOURCE_PATH had no left boundary, so
packaging/codex/openhcs/skills/... matched as openhcs/skills/... and the MCP
knowledge-base manifest reported ten existing references as missing. The
pattern now starts at a path boundary and covers packaging/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pytest.ini's addopts carry --max-worker-restart (pytest-xdist), so pytest
without the dev extra rejects its own configuration.

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

Lockstep with OpenHCSDev/PolyStore#38 and OpenHCSDev/PyQT-reactive#21: the
Documentation workflow's sphinx -W builds of both failed on run records in no
toctree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
trissim and others added 3 commits October 11, 2026 03:26
The pinned pycodify differs from v0.1.3 in src/pycodify/formatters.py, so
pypi-dependency-readiness failed. Lockstep with OpenHCSDev/pycodify#3; the job
stays red until the owner tags v0.1.4 and PyPI serves it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
conftest compared OPENHCS_CPU_ONLY to 'true' itself, while
OpenHCSProcessEnvironment.cpu_only_mode also accepts 1/yes/on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every page whose editorial audit went stale (a page or authority digest
changed since review: 828 changed authorities, 78 deleted ones, 34 edited
pages) was re-read against the diff of each changed authority since its
reviewed version. Pages naming deleted mechanisms now name their
replacements (StepSnapshot -> ResolvedPipelineDefinition, MicroscopeHandler ->
DatasetSource, PURE_2D -> Pure2DContract, compiled_plate_execution ->
bundle_execution, RuntimeSliceProjectionStrategy -> RuntimeSliceProjectableValue,
Plate Manager -> Datasets where reviewed, and others); deleted authorities
point at their current owners; findings and validation record the review;
digests were pinned after the comparison (docs/audits/README.md step 4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
trissim and others added 15 commits October 11, 2026 03:42
…fest names ResolvedPipelineDefinition

Lockstep with OpenHCSDev/ZMQRuntime#29.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NumPy exports uint32 buffers with format 'L' on LLP64 Windows and 'I' on
LP64 platforms; reconstruct_f32 compared the format string exactly and
rejected the queues on Windows. Compare unsigned codes by width.

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

_write_temporary_source wrote in text mode, so on Windows newline
translation stored CRLF bytes while the revision digest was computed from
the LF source; require_source then reported every unchanged source as
changed. Write and read the source bytes without newline translation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stale after U1/U5: the end-to-end workflow added plates through the deleted
add_plate_callback and string button keys; it now invokes AddDatasets on the
widget's session, keys buttons by operation_id and waits for the session to
report initialization. The image-browser inventory stub now subclasses
MetadataHandler so it inherits the handler defaults (source_workspace_root).
The managed-window stubs follow the widget protocol
(_get_current_orchestrator, session-taking PlateManagerWidget; the deleted
PlateManagerWindow._setup_connections is no longer patched) and also assert
the session is passed through.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The function catalog attaches only to an existing endpoint, but the smoke
requested it as soon as the window painted, while the GUI was still starting
its endpoint in _prepare_execution_services; the attach failed (CI) or
blocked on the startup lock past its 5 s control deadline (locally). The main
window now keeps the Future of its execution-services preparation and the
smoke waits on it before reading the catalog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UiBridgeOperationExecution unpacked (*request, connection) and called
invoke(operation, *request, connection) positionally; with no request the
connection landed in the request slot, so ui status/list_windows over MCP
failed with "does not accept a request".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
G2 renamed SyntheticPlateGenerationRequest.wells to partition_values; the
installed MCP smoke still sent wells, so the tool rejected the arguments
(extra_forbidden) and returned FastMCP's plain-text error, which the smoke
could not decode as JSON.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On Windows portalocker locks are mandatory, so startup_owner's second handle
on the lock file raised PermissionError in every Windows ZMQ test. Lockstep with
OpenHCSDev/ZMQRuntime#29; pypi-dependency-readiness needs v0.6.1 tagged.

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

Intel macOS installs omit openhcs-basicpy by its pyproject marker, yet the
execution server's catalog preparation imported basic_processor_jax and died
with ModuleNotFoundError: basicpy (regressed in 45437a8).

A catalog module now names the distribution it needs in a literal
REQUIRED_DISTRIBUTIONS tuple. OpenHCSRegistry.get_modules_to_scan reads it
statically and skips the module only when no OpenHCS Requires-Dist entry for
that distribution applies to this environment (markers, extras) and it is not
installed. A distribution required here still fails loudly on import, and a
declaration naming a distribution OpenHCS never requires is rejected. The
excluded set joins the catalog cache identity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
validate_observation_domain is typed RuntimeArrayData (payload or bare array);
G3 replaced image_payload_metadata(source) with source.metadata, which a bare
ndarray lacks. ImagePayload.of is the declared entry that wraps a bare array.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A source-bindings workspace names planes by virtual paths; the stored paths a
plane was admitted from travel in OpenHCSSourceFilterPaths. Candidate matching
already prefers them; provenance matching compared FILE filters to the virtual
path and selected nothing. SourceImageIdentity.filter_paths owns the rule.

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

StreamingConfig.__registry__ is keyed by ViewerFamily classes; the test
selected ViewerType members and read .family on registry keys.

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

The Qt journey created a QApplication inside backend/OMERO integration jobs,
which install no GUI extra and set no Qt platform; on Linux it aborted the
whole pytest process. It now lives under tests/pyqt_gui, run by gui-tests with
the gui extras and QT_QPA_PLATFORM=offscreen, without importorskip. The
read-only journey reads PipelineOrchestrator.dataset_root (G7 rename).

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

The source digest is computed over the code's UTF-8 bytes and checked against
the file's bytes; text-mode writing translated newlines on Windows, so every
persisted source read back as changed. Write with newline="".
The spawn test used the deleted progress emit() and dict events; it now emits
through ProgressExecutionContext and reads ProgressEvent fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PYTHONPATH=<checkout> made the child import openhcs from the source checkout,
which in CI has no built native extensions, instead of the installed wheel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
trissim and others added 27 commits October 11, 2026 06:09
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aits for each batch to end

The workflow suite in tests/pyqt_gui owns its QApplication lifecycle, so the
pre-created application moves to tests/unit/conftest.py. The GUI journey
asserted the next button enabled while the previous batch was still closing.

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

ViewerType is the derived enum view whose member value is the wire name; it
has no wire_value attribute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tempfile.TemporaryFile on Windows reads a PermissionError as a name
collision whenever os.access passes (it ignores ACLs) and retries up to
os.TMP_MAX (2**31 - 1) times, so a source root denying new entries made
initialization spin instead of mirroring. The probe now creates one
uniquely named file with O_CREAT|O_EXCL and removes it.

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

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

zmqruntime 0.6.0 (L3) renamed the results-summary key well_count to
MessageFields.PARTITION_COUNT.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	docs/source/architecture/list_item_preview_system.rst
#	external/ObjectState
#	external/pycodify
#	external/pyqt-reactive
#	external/zmqruntime
#	openhcs/authoring/session/session.py
#	openhcs/core/source_bindings.py
#	openhcs/core/steps/function_runtime.py
#	pyproject.toml
#	tests/integration/test_custom_source_transport.py
#	tests/unit/test_debug_runtime.py
#	tests/unit/test_gray_to_color_binding_axis_432.py
#	tests/unit/test_gray_to_color_payload_axis_compile_432.py
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…merges

Pages naming moved or deleted mechanisms now name their replacements
(SourceSetPairing, ProgressPhase/Status classes, DebugBoundary, pyqt-reactive
config windows and shortcut lifecycle, objectstate.codegen, ScopeKey); records
point at the current owners; digests pinned after review.

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

The website job runs tests/unit with --confcutdir=tests/unit, which loads no
pytest-qt; the fixture now depends on the plugin being present.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	openhcs/authoring/session/session.py
#	openhcs/core/source_bindings.py
#	pyproject.toml
#	tests/unit/test_aggregate_source_scope.py
#	tests/unit/test_automatic_image_role_materialization_435.py
#	tests/unit/test_derived_role_publication_435.py
#	tests/unit/test_gray_to_color_payload_axis_compile_432.py
#	tests/unit/test_named_checkpoint_publication.py
#	tests/unit/test_selected_plane_stream_materialization.py
#	tests/unit/test_singleton_rgb_label_invocation_477.py
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pages and examples naming deleted enum members or the old artifacts module
now name the class families and the artifacts package; digests pinned after
review.

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>
…ute budget

The job was cancelled at 45 minutes with 63% of 11,586 tests run (33 minutes
for the whole suite on 2026-09-24). Local verification already runs
--dist loadfile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d reaches the session as the family; smoke reads the action status family

E1 made the export scope and UI action status families: the CLI passed the
family class into DatasetRunRequest (an enum-view field), RunDatasets passed
the enum member to the session (which expects the family), and the GUI smoke
read UiActionInvocationStatus.ACCEPTED.

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

Replaces the xdist attempt (a worker died in test_mcp_server under xcb): the
suite's 11.6k tests are split by pytest-split into three groups, each one
process, each uploading its coverage as coverage-unit-<group>.

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>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With one shared 'pages' group, every push to main cancelled pull requests'
Website validation.

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>
@trissim

trissim commented Oct 12, 2026

Copy link
Copy Markdown
Collaborator Author

Superseded. B6's functional fixes landed in three parts: the E1 boundary fix in #1212, the CI trigger restructuring in #1214, and the remaining fixes in #1221 (no formatting commits, ratchet mixin moves, audit re-pins or workflow edits).

@trissim trissim closed this Oct 12, 2026
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