Repository navigation
Retained viewer schema mismatch prevents MCP visual QA despite healthy client handshake #280
Description
Observed on retained isolated H002,30September2026. Engineering integration owner: parent blind-analysis thread. Shared viewer protocol/lifecycle implementation owner already registered: openhcs-pr159-viewer-bind-owner (PR159). Primary geometry author is not yet identified; do not create a competing shared-file patch or silently expand PR159 scope.
Reproducer through the exposed MCP tool, no OS input: openhcs_get_viewer_window_state(host="127.0.0.1",port=5690,transport_mode="tcp",timeout_ms=1000,include_payload_summaries=false,include_component_values=false).
Actual response: observed=false, viewer_window_state_failed, AttributeError: Cannot get attribute ViewerWindowGeometry on openhcs.runtime.viewer_protocol from /home/ts/wt/openhcs-installed-main-20260929. The numeric zero counts accompanying that error are NOT observed biological data. Exact original error: "Can’t get attribute 'ViewerWindowGeometry' on <module 'openhcs.runtime.viewer_protocol' from '/home/ts/wt/openhcs-installed-main-20260929/openhcs/runtime/viewer_protocol.py'>".
Current MCP1953827 health is ok/no stale imported files; own-source health does not establish peer schema compatibility. Actual native viewer2728815 is alive and uses dirty primary /home/ts/code/projects/openhcs, where the new geometry declaration exists. Neither client source nor ordinary installed295e defines it. Both advertise application version0.8.6. Primary protocol/DTO/viewer-service/Napari geometry edits remain uncommitted and untouched; git-log class addition is absent. This is source skew, not an empty or crashed viewer. GUI2685932 and native2703786 remain alive; UI bridge7890 responds to read-only actual list-windows/state/code-document operations and has no active/queued workflow or visible modal.
Existing owners: original application/compatibility declaration, ViewerEndpoint and managed lifecycle, not a new registry or alternate wire decoder. Coordinate intended source/package cutover and detect/report mismatches through original owners. No compatibility class injection, fallback reader, string dispatch, partial installed-source copy, longer timeout or automatic restart/replay. Preserve protected H002 state and require original disposition before any process replacement. Two complete current declaration exports and matching hashes are retained in /home/ts/wt/openhcs-issue-batch-20260929/H002-RETAINED-DECLARATIONS-20260930.rst; full restorable undo/history and referenced custom callable body are NOT exported.
Acceptance: keep the original failure reproducible; demonstrate a source-aligned actual installed MCP/viewer journey with correct typed state/axes/camera/canvas after the authorized coordinated cutover. Prove an incompatible peer produces a precise owned failure and is never interpreted as zero objects. Require matched native raw-only/result-only/combined captures at distributed positions before biological acceptance, no held-out/reference leakage. Tests or a healthy own-process handshake alone do not establish readiness.
Coordination already posted: #159 (comment). No fix or owner acknowledgement is claimed. No new process, install, user-session close or scientific rerun performed. Resource cleanup now reduces swap16.3->14.6GiB but helper remains WARNING; no optional CI delay is the cause.
Activity
trissim commentedon Sep 30, 2026
New installed-live evidence: after main65b2ed101/ArrayBridge409 installation, a fresh nonresident MCP session health reports current exact installed source, no stale paths/restart_required, PID3177232. The same session calls get_viewer_window_state on127.0.0.1:5690/TCP,1000ms, no component values/payload summaries, and still returns viewer_window_state_failed/AttributeError: cannot resolve ViewerWindowGeometry on the NEW /home/ts/wt/openhcs-memory-integration-20260930/openhcs/runtime/viewer_protocol.py. Exit1 in8.10s, full output retained. This is not merely the older embedded MCP connection and NOT proof of an empty viewer. Both owned fresh MCP processes from this checkpoint are confirmed gone. Protected H002 GUI2685932/runtime2703786/viewer2728815 remain alive; current declarations were exported earlier, full in-memory history remains preserved. Parent retains integration ownership; shared PR159 implementation coordination still needed, with no competing patch/source injection/legacy decoder or implicit history-loss cutover.
trissim commentedon Oct 2, 2026
H002 retained viewer: original-source preservation and receiving boundary
Singer owns this source-only investigation. Planck owns H002 viewer2728815,
create1790645051.71, TCP5690/ACK6690, DISPLAY90, through repair or explicit
disposition. Parent owns resource admission, any public client launch and native
handoff. No process, scientific input/output, package, environment, canonical
source or focused scene changed. No failed/UNKNOWN operation was replayed.
Existing issue280 remains the defect owner; no duplicate issue or compatibility
implementation is needed for this checkpoint.472 stays6aad9f181, production94ee.
Exact source-generation defect
Read-only /proc/2728815/cmdline identifies the original canonical interpreter
and bootstrap sys.path root /home/ts/code/projects/openhcs. It launches the
original run_napari_viewer_process at5690, not private465. Current canonical HEAD
is2bc579ca9e5d3d70a130bec96ee6f001f3dd5c74 with retained foreign dirty edits.
This names the live process's import ROOT, not its September28 loaded bytes.
The actual dirty canonical source STILL has the genuine original
ViewerWindowGeometry declaration at runtime/viewer_protocol.py152. It owns
window_size/canvas_size. It is not an alias of today's ViewerNativeWindowGeometry.
Full non-shallow Git history has no committed ViewerWindowGeometry addition or
removal. The September30 INSTALLED-MEMORY-HISTORY-20260930.rst already records
this unpublished dirty-source declaration and both peers advertising0.8.6.
The separate current ViewerNativeWindowGeometry declaration was added by
52d2f77. Installing a newer client cannot
reconstruct an unpublished old class automatically.
Original canonical NapariViewerProjectionABC.wire_envelope at server3582 puts
the geometry INSTANCE in both state and payload replies. Original DTO/viewer.py51
imports that declaration; StateResult931 carries it; original
ViewerWindowService._state_result_from_response2217 admits that same real type.
State/payload options do not omit geometry. Current ZMQViewerWindowGateway
unpickles before any public include_response/component/summary projection.
The reverse request failure is a distinct source move. Original canonical
ExecutionConnectionSpec is agent/dto/execution.py55; private465 sends a snapshot
request whose class refers to agent.dto.execution_connection, unavailable in
the old viewer. No class copy, re-export, codec adaptation or hotpatch is added.
Retained actual public evidence, not a new probe
Planck's original465 MCP508753/PTY51411 recorded these three separate terminal
failures in its existing mcp-candidate11-client-recovery03 journals:
The original viewer log confirms request pickle.loads fails before capture;
no snapshot artifact/directory was produced.
Exact retained disposition and original journal locations:
/home/ts/wt/openhcs-issue-batch-20260929/rbpms-r0010-development-434-20261002/output/
H002-5690-CURRENT-DIAGNOSTIC-DISPOSITION.rst and
H002-5690-PUBLIC-FAILURES-AND-PREFIXES.json. These failures do not mean zero
objects, an empty scene, a crashed viewer or an operation timeout. No extra
public request was submitted by Singer. Absence of a TCP7790 listener in that
receipt does not establish absence of the historical IPC native endpoint.
Existing owner relationships and complete source context
OpenHCSRuntimeImportAuthority.current derives the original module root.
McpDevServerSpec.process_args uses that authority for its MCP child.
DetachedViewerServerEntrypointSpec derives launch code from the same authority.
ManagedViewerLifecycleMixin owns acquisition/readiness/reuse; its nominal leaf
owns the detached entrypoint. OpenHCSViewerServerABC._create_pong_response uses
cooperative super() and the original EndpointApplication. ViewerRuntimeEndpoint
owns compatibility against that declaration; zmqruntime compares exact app/version.
That rejects different versions but cannot identify unpublished same-version
source differences. No second launch owner, generation registry or negotiation
mechanism is introduced. Native catalog/kernel startup remains unchanged.
Current39494738b63d088444cfc99feb964f957bbc94d2e8e claims and actual source were
read.94ee->947 has zero changes throughout runtime and agent trees, or the
original MCP dev-client/core. Root remains394 integration owner. Existing159
shared lifecycle and454 presentation are merged; neither constitutes a live H002
cutover.472's installed94ee target is not an old-H002-compatible source claim.
Original NRA SourceModule discovery/parser and inspect_modules traversed the
entire current canonical production root and all eight canonical external
production roots:1042 modules (592 OpenHCS,450 dependencies), zero parse omissions.
All imports/classes/dataclass fields plus relevant viewer/launch/gateway/DTO/MCP
and zmqruntime/pyqt calls/writes are retained with per-module SHA256. This is
descriptive AST evidence using findings=(), not a full detector/R0/R1 pass,
global dynamic resolution, September28 module identity or live behavior proof.
Existing1026-module receiving94ee/eb2 trace remains unchanged and distinct.
One serial kernel-bounded pass:CPU0/CPUQuota100%, MemoryMax512M, SwapMax0,
timeout60s; finished10.59s,87520KiB peak RSS,0swaps, exit0. No OpenHCS,
scientific/native/UI/provider module imported. Critical disk/swap advisory was
retained; this bounded source operation did not launch a runtime fleet.
Applied current NRA and authoritative refactor-audit.skill catalog:TIME-3/4/9
reject copied old declarations/adapters/version negotiation; BOUND-2/8 keep the
original wire/type owners; IDEN-8 keeps exact viewer incarnation and custody.
No structural refactor or new-case behavior claim is made. Existing polymorphic
owners already carry this path; ornamental MI would not recover a lost generation.
Byte-exact original-source inspection archive:
h002-original-source-inspection-20261002.tar.gz
SHA2561370d7b5c5da80d0e89721bd821c0958182cd94ece6aa126c37d58d85af6cea9.
Original raw log SHA256a64b87fbd9c8f6cb0d316a4ad17ae44cbe0dfc482694b3739626e7e8eb53ffa7.
Driver/raw log remain in this qroot, not a second product scanner.
Archive extraction-to-hash matches the original raw log exactly. An attempted
git sanity check from this non-Git evidence qroot returned128; it changed nothing
and is not counted as qualification. The owned472 checkout is separately checked.
Parent-reviewed preservation step before any reconstruction
The genuine original-source public client is the narrow candidate for saving
observable state WITHOUT replacing2728815. It is NOT a current installed-main
compatibility fix and has not been executed here. Parent must first admit a
separate bounded read-only client and retain its exact module hashes/journal.
Do not change source, environment or dependencies or borrow a foreign resident
MCP. Reconfirm the original viewer incarnation and Planck custody first.
Source-reviewed command, NOT executed or pre-authorized by this receipt::
It uses existing public capability/DTO/service owners and the original real
declaration, not an alternate reader. Preserve original465 failures separately.
Do not launch it within Singer's source-only allowance: the CLI and MCP child
can duplicate imports; parent admits the combined resource bound. Existing
normal tool deadlines remain unchanged. An interrupted result is UNKNOWN and
is not replayed. A bootstrap/source/peer failure remains terminal evidence.
If it succeeds, save its complete public response before any navigation or
presentation change. It can expose routes/current_step/axis labels/visibility,
original viewport center/zoom and window/canvas extents. It does NOT export
full undo, ndisplay/dims.order or3D camera angles: the old original
ViewerNativeViewportPresentation declares only center/zoom. Source-root equality
alone also does not prove all mutable dependency generations match the live
viewer; only actual readback qualifies the attempted boundary.
Minimal safe reconstruction if original-source preservation fails
Keep2728815 Planck-owned and untouched. Parent can review a source-aligned
CURRENT private MCP/viewer sibling on a newly admitted unused endpoint, never
fresh_viewer replacement on5690. Use existing public inventory and managed
streaming only, no scientific rerun, array extraction or restored fake receipt.
Durable declarations already retained under the parent root:
H002-retained-pipeline-document-20260930.json (source1681bytes,
SHA df65f42d7d6ec6b2502863d838f77138b454c90a072203177f52891ac0b71ef2)
and H002-retained-orchestrator-document-20260930.json (source2270bytes,
SHA1dc6c454a92be23d0076271aa250a71453e488d0962e60fdc3af26e5686d2627).
These are historical declaration exports, not current focus or restorable undo.
Saved callable/pipeline/input and all original outputs stay in place.
Original input:openhcs/mcp_outputs/haase_blind_20260927/inputs/H002/image.ome.tif.
Existing prepared source/output root:
openhcs/mcp_outputs/haase_blind_20260927/trials/H002_count_subject_20260929,
with run/H002_openhcs/images and results. Paths are relative to the canonical
OpenHCS checkout. Parent first uses query_plate_files on the original prepared
plate context; only exact returned IMAGE records may be passed to
stream_plate_files_to_viewer. If that context is not currently inventoried,
retain its typed error rather than treating a physical artifact as an image ID.
No foreign default7777/native owner adoption or recreation of a scientific job.
Result reconstruction has a precise additional gate. Metadata-only inspection
of the existing z024 labels ROI archive's original polystore_roi_metadata.json
finds NO openhcs_image_payload_metadata entry. The centres archive has no such
native sidecar member. No ROI geometry or scientific pixels were decoded.
Current ROIArchiveSourceMetadata and strict ROI streaming require represented
source identities for explicit retained-result reopening. These old archives
cannot satisfy that requirement by filenames, a fabricated snapshot receipt,
source-metadata backfill or a duplicate registry. Root394's new source-bearing
writer is not retroactive provenance for these archives. Keep this unresolved
gate separate from raw-only reopening and from biological label identity.
Parent and Planck must explicitly dispose of unexported focus/undo and historical
unsigned-result provenance BEFORE any replacement/closure. A sibling raw scene
does not recover the current olive/green labels, identify a false split or close280.
Engineering acceptance requires actual public typed readback on the declared
source generation; scientific QA remains Planck-owned and needs matched current
raw/result/combined evidence. No package/production fix or readiness is asserted.
trissim commentedon Oct 2, 2026
H002 approved original-source public state attempt: terminal startup failure
Parent approved ONE normal original CLI state call on2728815/5690TCP,
1536MiB combined CLI/MCP, no swap,CPU1,50MiB additional output and normal5s
operation. Singer executed exactly that command once, with no extra health,
discovery, payload, snapshot, navigation, registration or scientific call.
Planck retains H002 custody through repair or explicit disposition.
Actual outcome
Original complete public CLI response is retained byte-exact at
h002-original-public-state-20261002/original-public-reply.stdout:
683bytes, SHA2563d6b9dfff59741036d101a4d80f08d15a8ec42d5cb4d228e011963415e017a3e.
It reports mcp_transport_failed / TimeoutError, phase=start_server,
server_stderr_tail=null, results=[]. CLI exit1, elapsed11.84s.
The original McpDevCommandSpec.run prepares arguments, enters START_SERVER and
awaits open_mcp_dev_session initialization BEFORE run_session sends tool calls.
The retained phase therefore places this failure before viewer-state dispatch;
it is not a5690 geometry-decoding result, empty layers, biological zero or
successful typed-state/payload access. Ordinary initialization remains5.0s;
viewer operation argument remains5000ms. No cap was widened and no retry occurred.
This attempt is terminal known initialization failure, not an UNKNOWN viewer
operation. Other original UNKNOWN dispositions and465 failures remain unchanged.
Original source and runtime identity
Actual filtered file-open/exec trace records CLI718343 and MCP718383 using
/home/ts/code/projects/openhcs/.venv/bin/python, resolving to the existing
/home/ts/.pyenv/versions/3.12.3/bin/python3.12. The MCP child executes the original
OpenHCSRuntimeImportAuthority bootstrap with canonical sys.path root, not465.
Both processes actually open canonical protocol/execution DTO bytecode; CLI also
opens canonical viewer DTO and dev-client/core bytecode. Source hashes of all
seven reviewed boundary modules are identical before/after the attempt.
Actual opened protocol bytecode SHA
a1bbaa42431f07dc2ae0b290658a767e2aae7b6982c3f6484a77d88fbabe19f1;
execution DTO bytecode SHA
f80f5819fad14cefe0892fc420a33f11369d0224cb0d69183dc4029bdaab1162;
viewer DTO bytecode SHA
a2322a06e40afbbd5eecd819f70998ee60b0cf5c184e6d2e32a72aebd68112ce.
The genuine source declaration remains ViewerWindowGeometry at protocol152;
original ExecutionConnectionSpec remains execution55. This proves actual
original module-file/root participation, not September28 loaded bytes or
successful old-viewer instance decoding. No compatibility alias/shim was added.
Filtered strace instrumented ONLY the new client/MCP file opens and execs;
it never attached to the retained viewer. It can add startup overhead, so this
failure does not establish uninstrumented cold-start duration or a product
startup regression. Its exact trace and stderr are preserved, not normalized.
Resources, cleanup and protected scene
Kernel cgroup memory.max1610612736, memory.swap.max0, cpu.max100000/100000,
CPU0 affinity; combined memory.peak395505664bytes (377.18MiB), swap.peak0,
no memory.max/OOM events. Parent's normal operation timeout5s was unchanged;
outer60s safety bound did not fire. Explicit driver/journal/resource/trace/reply
output totals16044bytes before this disposition/archive, within50MiB.
Original CLI cleanup sent SIGTERM to its own MCP718383 after initialization
failure. Trace proves both new client and child exited; /proc entries are absent.
No process was signalled by Singer's output guard. The protected viewer remains
PID2728815/startticks12069171 (create1790645051.71), same command/cwd and owned
5690 listener before/after. No viewer mutation or request was dispatched by this
attempt. There is no typed scene/focus readback, so exact presentation equality
is not independently measured. Parent and Planck retain all focused-scene/undo
custody. No package/source/science/native/viewer launch or installed edit occurred.
Evidence and next disposition
Under the existing engineering394404-wheel-94ee-dd324-20261002 qroot:
source hashes, original file hashes and terminal status.
472 stays6aad9f181; original94ee wheel/target and all untracked QA ledgers remain.
The parent receives the original reply before any new disposition. Planck's
same-coordinate ID/stage QA is NOT released by this result. No further client,
deadline change, reconstruction, source patch or retry is inferred. Existing
normal MCP startup/lifecycle owners remain the repair seam; do not adapt the
old viewer protocol or invent a second client/codec to hide this failure.
trissim commentedon Oct 2, 2026
H002 new uninstrumented public state intent: terminal initialization failure
Intent:H002-PUBLIC-STATE-UNINSTRUMENTED-20261002-01.
Parent expressly authorized this ONE new normal original CLI attempt after
reviewing the prior terminal START_SERVER failure. It is not an UNKNOWN replay.
The prior instrumented attempt, original465 failures and all journals are intact.
Singer engineering custody; Planck retains2728815/5690 focused-scene/undo custody.
No unrelated author thread was contacted, attached or given scientific hints.
Preflight and exact operation
All seven reviewed boundary hashes match the prior receipt before AND after;
viewer2728815/create1790645051.71/startticks12069171 and command/cwd also match.
Fresh resource check:critical disk/swap advisory,9.5GiB availableRAM,4.4GiB
home free,16.7GiB swap used; current some/full PSI avg10/60=0.00. The immediate
guard journal records10539496KiB available and zero avg10/60 pressure. This small
serial operation remained inside the approved1536MiB/noSwap/CPU1/output50MiB cap.
Executed unchanged original CLI once, with NO strace/import tracing::
No extra health/discovery/payload/snapshot/UI/science/source/package operation.
The CLI's original5.0s initialization deadline and5000ms viewer-operation
argument were unchanged; outer60s bound did not fire. A bytecode-write suppression
environment flag on the supervising CLI was the same as the prior attempt;
there was no environment-file/dependency modification or protocol intervention.
Full original public reply and determining failure
Raw683byte reply is h002-uninstrumented-public-state-20261002/
original-public-reply.stdout, SHA256
3d6b9dfff59741036d101a4d80f08d15a8ec42d5cb4d228e011963415e017a3e.
Original CLI stderr is empty. The complete response reports::
CLI exit1, elapsed11.77s. Original McpDevCommandSpec.run sends prepared calls
only AFTER session initialization. This START_SERVER failure therefore occurred
before5690 viewer-state dispatch; no typed state/payload or presentation readback
was obtained. This is a known terminal startup failure, not an UNKNOWN viewer
operation or new proof of geometry deserialization failure. Removing strace did
not resolve startup within this ordinary deadline; it does not identify the
underlying import/lifecycle bottleneck or justify a larger deadline.
Actual source participation, resources and closure
Uninstrumented /proc metadata records CLI777181/startticks45193189 executing
the exact normal command above. Its own MCP child777260/startticks45193796
actually executes OpenHCSRuntimeImportAuthority's canonical-root bootstrap::
Child cwd is canonical OpenHCS, surface=full. Seven boundary hashes are retained
in the new journal, not taken as September28 loaded-byte identity. Original
ViewerWindowGeometry is still the genuine canonical source declaration; this
attempt does not prove that a live viewer instance was decoded or that all
runtime dependencies match. No module tracing or additional introspection call.
Kernel memory.max1610612736,swap.max0,cpu.max100000/100000 and CPU0 affinity.
Combined cgroup memory.peak497618944bytes (474.57MiB),swap.peak0,
memory.max/OOM events0. Outer time exit1 at11.81s. Explicit new driver, journal,
resource log and originalstdout/stderr totaled12697bytes before this receipt
and archive, far below50MiB. No resource guard terminated a process.
Original CLI cleanup closed its own MCP; owned_children_remaining=[].
Both new CLI and MCP /proc identities are absent after terminal completion.
Viewer2728815 remains the same incarnation and5690 listener. No scene-changing
request was dispatched and no viewer was replaced/signalled. Exact current
presentation equality is unmeasured because there is no typed state readback.
Planck remains active owner; no scientific/pass/ID/stage QA gate was released.
Durable evidence and disposition
All evidence is under the existing engineering394404-wheel-94ee-dd324-20261002
qroot: h002-uninstrumented-public-state-driver-20261002.py,
h002-uninstrumented-public-state-journal-20261002.jsonl,
h002-uninstrumented-public-state-resource-20261002.log and the separate
h002-uninstrumented-public-state-20261002 original reply/stderr directory.
The reply happens to byte-match the prior failure but is retained separately
as this actual new output, not substituted or deduplicated.
472 head6aad9f181, immutable94ee wheel/target and original untracked QA ledgers
are untouched. Parent and Planck received the determining startup failure.
No further attempt, initialization widening, reconstruction, science resume,
new native/viewer, package/source patch or shim is inferred from this receipt.
trissim commentedon Oct 6, 2026
Closing this historical retained-viewer/source-generation incident, not claiming backwards compatibility. The original H002 viewer2728815 is no longer present; it was not stopped or replaced by this audit. Its exact unpublished ViewerWindowGeometry declaration and surrounding dirty source are now losslessly published in recovery-main-checkout-source-20261006, with original failure journals unchanged. Current main uses its genuine ViewerNativeWindowGeometry/native dimensions declarations instead of reconstructing or aliasing the unpublished class. Later source-aligned INSTALLED public journeys (#454/#748; issue152 final closure and automatic-point-domain-152-20261005.rst) returned typed native state, camera/canvas and calibrated XY/XZ/YZ geometry with raw/result captures. Current window_state catches peer decoding errors through the original ViewerWindowStateResult.from_error owner, observed=false with structured errors; the original mismatch also returned observed=false, not observed zero biological objects. This meets the source-aligned readback/failure-reporting scope without a compatibility decoder or replay. The old unsaved undo/history and unsigned-result provenance are NOT reconstructed or certified; saved originals and failure evidence remain untouched. Same-version arbitrary source-skew compatibility, separate308 expansion and580 triangulation are not claimed fixed.