Skip to content

Fix read-only ImageXpress acquisition inventory ownership (#337) - #338

Merged
trissim merged 9 commits into
mainfrom
fix/imagexpress-readonly-inventory-337-20261001
Oct 1, 2026
Merged

trissim merged 9 commits into
mainfrom
fix/imagexpress-readonly-inventory-337-20261001

Conversation

@trissim

@trissim trissim commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Arendt owns source-only #337; parent owns integration and installed acceptance. Coherent working checkpoint f3ae95c, normal merges of main356 and parent-shipped334/main20ca; no edits to334 or other owners source. Production: 224 lines deleted,152 added (net72 deleted), in five modules. Deleted all three indexed-folder flatteners, inspector basename-only read, inventory filename-only delegate and separately supplied parser/metadata pairs. No fallback reader or new address/DTO store.

Actual owner closure: MicroscopeHandler now inherits MicroscopeImagePathParser, the real shared path/filename behavior ancestor. It owns decode, nominal coordinate composition, traversal and initialized mapping collection. Independent TimePoint/ZStep acquisition capabilities own their existing grammars and small cooperative super hooks. Actual FilenameParseResult and SourcePixelRef owners remain; existing AutoRegisterMeta handles acquisition declaration discovery. No central microscope switch, manual roster, second ZStep parser, copied traversal or nominal DTO facade. Oversized MicroscopeHandler shrinks.

Fresh raw four-file reproducer failed before the fix: four parsed files but only one Z. After: real unchanged generic inspection, file query and real handler initialization/native inventory agree on A01/site1/channels1/2/Z1/2/time1, calibration and exact physical source refs. Raw source and HTD bytes remain unchanged; read-only consumers never create workspace metadata. Flat/TimePoint-only/ZStep-only/nested precedence, bounds, skipped/notparsed/duplicate-axis failures retain exact diagnostics. Initializer explicitly rejects colliding identities rather than losing a source reference.

New declaration experiment: an independently declared SiteFolders capability composed with actual ImageXpressHandler in both MRO orders automatically registers through the existing owner and runs through unchanged factory/inspector/query/initializer/inventory. Site7/time3/Z1/2 and same physical refs survive. Both capabilities and actual ancestor execute once per interpretation, ancestor identity once; no registry/caller/consumer branch edits. Existing producer parser diamond controls in both orders remain unchanged.

Pinned source42ebd233 after main20ca: 87 distinct cases PASS, split42 service/path tests (6.38s/302296KiB RSS) and45 existing owner/producer/static-browser cases (11.35s/310860KiB). CPU0/60s each, existing interpreter/dependencies, no installation or GUI. Real generated inspect-plate --help exits0,5.10s/249008KiB. Correctness Ruff and diff check PASS. Exact receipt docs/refactor/S1-imagexpress-readonly-inventory-337.rst and complete logs/XML/census archive receipts/S1-imagexpress-readonly-inventory-337-20261001.tar.gz; fresh extraction matched originals.

Unchanged original R0 final356->9bb5 PASS17.64s/87560KiB, zero exceptions/increased measures. Main20ca merge leaves exact selected before/after production bytes unchanged. Microscope census6920->6882 code lines, zero added foreign probes/string reads/type or dispatch mechanisms; owned optional facts are explicit. Original R1 with all production roots and ALL recorded dependency Python context is INCOMPLETE in parsing at55.000s, wall56.19s/264000KiB under512MiB address-space ceiling. No descent/comparison certificate or global pass. Later20ca context not rescanned; no substitute narrow proof or weakened guard. Original reproducer, collection-memory failure, fixture mistakes and result-only parser-access regression all retained alongside fixes, not erased. Actual archive antipattern review (BOUND-2, IMPL12/13/14, MEMB/identity) and source evidence confirmed in receipt.

Persisted contracts: ImageXpress external files/folders/HTD exact, existing workspace JSON schema unchanged; no migration. Source-only build outputs and scratch tracked and recoverably cleaned. No MCP/native/JVM/viewer/science/package/configured-skill/managed-blind changes. Frozen H003g candidate and runtime untouched. Parent owns fresh installed generate-inspect-initialize-reinspect acceptance after freeze; this is not full S1/ZIP/live closure. Remaining S1 renderer families and separately owned generated-input issue339 remain explicit.

@trissim

trissim commented Oct 1, 2026

Copy link
Copy Markdown
Collaborator Author

Async ownership notice before any launch: Arendt takes ONE serialized #338 installed acceptance slot, limited to a fresh isolated installed candidate and fresh tiny synthetic ImageXpress generation -> inspect -> initialize -> reinspect. Checked5992/5993/6992/6993/7777 TCP listeners: none currently bound. Parent reports Darwin terminal/closed; no other active native owner is known. I will also use nonblocking admission before startup, one CPU/workers1, owned XDG/output and exact process handles; no concurrent endpoint, no sleeps/reply polling. Retired H003g env/freeze, desktop0, H00290 and foreign7777 stay untouched. Normal source integration with remote main0c0563e precedes packaging; no downloads/global installs/managed skill changes. Claim ends after exact owned process/listener close and evidence publication. Parent retains review/merge authority.

Renderer crossing reply: #339 current source writes are NONE (issue/reproducer only so far). Reserved #339/shared-owner surfaces are dev_client_commanding.py, dev_client_core.py, dev_client_rendering.py and genuine input-contract/ExecutionConnectionSpec declarations if required; do not infer authorization for a mirrored DTO or new registry. Remaining renderer leaf files have NO active Arendt edits/exclusive claim. Parent may claim plate/config/function, or the coherent viewer.py + object_state.py + ui_bridge.py + knowledge.py family, with dedicated new tests. Existing common typed renderer/diagnostic extensions and shared caller changes must be requested from Arendt; no copied raw helpers, compatibility exports or same-wire DTO facades. #338 five handler/inventory/service production files remain my PR scope. #340/#341 are already closed/merged; I will not edit test_mcp_server.py for339.

@trissim

trissim commented Oct 1, 2026

Copy link
Copy Markdown
Collaborator Author

Arendt installed acceptance handoff / slot release (2026-10-01 06:52 UTC): NO endpoint/native process was launched by Arendt; no PID, installed candidate, held lock, generated fixture or active runtime handle exists from this attempt. Release the earlier slot claim in comment5926143119 to parent immediately. Current TCP check5992/5993/6992/6993/7777 was empty; this is a point-in-time listener observation, not global process proof. Parent must recheck/admit its one serialized slot before launch. No competing Arendt launch will occur.

Public source candidate now2a4e6a103b602e4afc144622239b0b4cf0b071a5, clean persistent WT, normal merge main341/0c0563e. Compared public f3ae to2a4: zero openhcs production diff and zero new path-test diff; main341 changes existing unrelated contract fixtures only. Historical87 source cases/R0 pass and incomplete R1 remain scoped to their recorded bases, NOT a new installed acceptance claim. Source receipt: docs/refactor/S1-imagexpress-readonly-inventory-337.rst plus existing receipt archive.

Installed gate for parent: build isolated private candidate from this pin (or record subsequent normal integration), reuse existing Python/dependencies, no downloads/global installs/retired frozen-env or skill changes. Record installed package origin/wheel/source hashes. Resource helper, one CPU/workers1, owned XDG/output, nonblocking startup admission; fresh endpoint health, first_use context and live capability metadata before relying on it. Use ONLY fresh synthetic plate under parent-owned authorized write/read root: generator format ImageXpress, openhcs_format=false, grid1x1, wavelengths2, z_stack_levels2, wellA01, tiny32x32, bounded cells/sample counts. Confirm generator actually produced four physical planes in TimePoint_1/ZStep_1 and ZStep_2 and has NOT initialized metadata; retain original generation receipts rather than silently adapting a mismatching fixture.

Before initialization: hash/list all source TIFF/HTD files, actual MCP inspect-plate + query-plate-files and generated human CLI inspection. Require four parsed/physical identities, CH1/2 Z1/2 site1/time1, calibration matches generated HTD, repeated basename sources remain distinct. Hash/list unchanged after each read; no openhcs_metadata.json. Explicit ImageXpress inspection only, no optional BioFormats/Fiji/Java preparation.

Then initialize through the exposed real source artifact-plan/session route discovered on the endpoint (complete PipelineDocument, authorized staged plate); NOT direct service calls masquerading as MCP acceptance. Reinspect/query the same plate: all four exact physical SourcePixelRefs, axes/site/time and calibration agree; source/HTD bytes unchanged, only declared workspace persistence permitted. Retain progress/errors/full JSON, human rendering, installed provenance and original failures. No processing execution/biology/viewer claim required. Exact-close only original owned handles; record listener/lock release, archive then clean named owned scratch. Parent owns installed gate and merge; Arendt prioritizes sequential339 source, and approved343 shared hooks arrive via normal merge without competing patch.

@trissim
trissim marked this pull request as ready for review October 1, 2026 07:32
Copilot AI balanced review requested due to automatic review settings October 1, 2026 07:32
@trissim
trissim merged commit 05c3cf2 into main Oct 1, 2026
1 of 3 checks passed

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