From 9d65d4b6cb6b6a66b4bf08cb1c3ef4b2e8e8d6ea Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 15:33:37 -0400 Subject: [PATCH 1/5] build: pin Root production and 404 receiving wheel preparation --- .../graph-roi-source-roundtrip-134.rst | 255 ++++++++++++++++++ .../pr394-404-wheel-receiving-20261002.rst | 34 +++ .../build-394-404-receiving-wheel-20261002.sh | 18 ++ 3 files changed, 307 insertions(+) create mode 100644 docs/validation/graph-roi-source-roundtrip-134.rst create mode 100644 docs/validation/pr394-404-wheel-receiving-20261002.rst create mode 100644 validation/build-394-404-receiving-wheel-20261002.sh diff --git a/docs/validation/graph-roi-source-roundtrip-134.rst b/docs/validation/graph-roi-source-roundtrip-134.rst new file mode 100644 index 0000000000..d5a572446f --- /dev/null +++ b/docs/validation/graph-roi-source-roundtrip-134.rst @@ -0,0 +1,255 @@ +Graph ROI native-source roundtrip: receiving 134 +=============================================== + +Status and ownership +-------------------- + +Tristan's latest explicit correction on2026-10-02 restores Singer's ownership of +draft404 after the temporary handoff/stop. Root retains394 and shared production +ownership, including ``openhcs/processing/materialization/core.py``. Parent owns +actual installed/native graph reopening;404 retains that receiving acceptance. + +The graph writer repair integrated by Root at +``45f3a721e115b37ab662f362fa5ab4d5e58e1f6e`` remains present at current394 +``94ee1079d22540f9b5ed48b69481d7e7ab51095d``. No shared-hunk release remains +pending. Root owns production integration; Singer owns404 receiving acceptance; +parent owns installed/native qualification after the retinal11 slot yields. +404 is not merged wholesale. Its historical production base/proposal is not a +replacement for current394. Saved-directory publication at822 is not reapplied. + +Account-switch resume and current source +--------------------------------------- + +Tristan explicitly resumed work on2026-10-02. The preceding pause interrupted +no owned qualification operation: the last completed task was disposable-scratch +cleanup. On resume there is no active goal and no owned QA/ratchet process. +Original logs, failed fixtures, source proposals and uncertain dispositions +remain intact; no interrupted input is replayed. + +The existing persistent checkout is reused. The unpublished445 integration +receipt/archive is preserved on its local branch at1574ee396, without pushing +that branch.404 resumes from its existing published5f17851cd checkpoint; all +three untracked QA ledgers remain. No new WT, environment, dependency download, +package change, native launch, test rerun or cleanup is needed for this update. +Recorded submodule gitlinks differ from local dependency worktrees; none is +changed or represented as an installed qualification. + +Read the current394/404 claims and open468/469 rosters before this review. +468 owns tracking renderer correctness;469 owns MCP sampling presentation. +Neither claims the graph writer/binder or404 receipt. Root's shared production +files remain untouched. No competing404 implementation is started. + +At pinned94ee1079d, both graph test files and original ``SpatialGraph``, +``ROIArchiveSourceMetadata``, ``SourceImageProvenance``, ``SourceVoxelSpacing``, +``ImagePayloadMetadata`` and ``StreamingService`` modules are byte-identical to +the integrated45f3 checkpoint. Whole materialization/core.py has44 additions and +25 deletions since45f3 for retained-image role filename/context ownership; its +graph writer is unchanged. Function-runtime changes leave the graph context +strategy unchanged. Public plate streaming adds progress/typed failure receipts +and retains ``require_source_metadata=request.result_directory is not None``. +These differences do not justify copying the writer or weakening source admission. + +Current source still follows the original graph projection -> typed metadata -> +shared archive binder -> strict reader relationship. BOUND-2/BOUND-8 and +IMPL-12 remain resolved at that receiving boundary. The unchanged seven-case +fixture retains actual cooperative ``AuditedGraph(ProjectionAudit, SpatialGraph)`` +hooks and independent edge-feature roundtrip evidence; no generic consumer edit +is required for that new declaration. Historical executed source controls below +are reused, not presented as a new run at94ee1079d or a whole394 qualification. + +The finite remaining404 gate is a fresh correctly materialized source-bearing +graph ZIP through public ``kind=result`` inventory and the explicitly owned +native reopen route, with actual source/channel/plane/calibration, geometry and +subject/edge feature readbacks plus matched raw/result/combined placement review. +Parent owns that serial installed check. Original candidate6's broken archive +and failed job are historical evidence, not an input to repair/replay. Root's +optimization target, whole-branch R0 adjudication and separate saved-image parity +work do not require another404 source implementation. + +Verified integrated source checkpoint +------------------------------------- + +Root's commit45f3a721e has parent +``38067a4a5c348e0c7fcedd1d48f69bb99b7be19b``. Its production diff is exactly the +published narrow writer patch: one bare-content line replaced, nine lines added +for original typed metadata/spacing and binder reuse. Whole core.py and existing +``test_spatial_graph_materialization.py`` have zero differences from the qualified +proposal comparison3913c5008. The imported seven-case receiving fixture has the +same Git blob as f3e566485: +``83f0b9b4789a14a3d762d2f63d6599c7b939536f``. + +The original graph context hook still owns explicit source-plane selection; +the writer performs no second selection. ``ROIArchiveSourceMetadata`` retains +encoding, decoding and geometry projection. ``Output.metadata`` carries the same +declaration. The native reader and its missing/conflicting-source guard are not +changed by this integration. The geometry-test adaptation and cooperative +new-declaration/edge-feature behaviour are the exact receiving version. + +Root's committed integration receipt reports original current-source3RED/4PASS +and87 integrated controls PASS in2.28s, with original before/after logs retained +under RUNS.394's body reports the isolated original R0 graph delta passed with +zero positive deltas. These are Root's execution evidence, not a receiving rerun +or a waiver of394's separate whole-branch architecture/native/performance gates. +Receipt: +https://github.com/OpenHCSDev/openhcs/blob/45f3a721e115b37ab662f362fa5ab4d5e58e1f6e/docs/validation/shared_runtime_plumbing_384_20261001.rst. + +NRA/refactor-audit source review accepts the exact BOUND-2/BOUND-8 repair using +the existing projection/binder owners, without IMPL-12 duplication or another +consumer/registry. No test was repeated, source patch reapplied, foreign worktree +edited or live installation changed for this receiving checkpoint. + +Original receiving witness +-------------------------- + +Parent retained ``GRAPH-ROI-REOPEN-134-RECEIVING-20261002.rst`` under +``/home/ts/wt/openhcs-issue-batch-20260929``. The candidate6 saved +``A01_s001_w2_z001_t001_neurite_morphology_step0.graph.roi.zip`` resolves through +public result inventory but native reopening refuses missing embedded source +identity. Original request/error remains in the author's actual recorder: +``/home/ts/wt/openhcs-issue-batch-20260929/neurite-development-skill383-20261001/output/assisted-2-post426-1.stdout``. +Read-only verification locates ``plate_file_stream_failed`` at line7602 and the +``ValueError`` message requiring native ROI source metadata at line7605, naming +the exact candidate6 graph ZIP above. This corrects the recorder reference in +the ddbc1b197 receipt; historical receiving receipts and original archives remain +unchanged. The original broken archive was not opened, rewritten or backfilled. + +Required relation and original owners +------------------------------------- + +An authorised graph archive must preserve its already-declared source identity, +selected channel/plane, declared coordinate spacing, polyline geometry and +neuron subject/edge features through writing and loading. Native reopening must +still reject absent, unbound, partially bound or conflicting source declarations. + +``SpatialGraph.contextualized_source_provenance`` owns explicit source-plane +selection. ``SpatialGraphFunctionOutputContextStrategy`` consumes that hook and +attaches invocation provenance before materialisation. It already produces a +scalar selected-source graph, including when the original plane index is1. +Selecting that index again from the scalar graph would be incorrect. + +``MaterializationInputItem.metadata`` delegates to ``image_payload_metadata``; +``SpatialGraph`` is not an image-metadata carrier, so that value is empty for +graphs. The original graph carries ``source_provenance`` and +``coordinate_spacing``. The registered graph ROI writer projects those facts +into the existing ``ImagePayloadMetadata`` and ``SourceVoxelSpacing`` owners. +``ROIArchiveSourceMetadata.bind/decode/geometry`` retain the single encoding, +decoding and presentation procedures. ``Output.metadata`` carries the same +declaration into downstream materialisation. No new source schema is introduced. + +Historical exact source proposal +-------------------------------- + +``graph-roi-source-roundtrip-134.patch`` contains the narrow production hunk and +one geometry-test adaptation. Its historical822 admission used zero-context +``git apply --unidiff-zero``. Do not reapply it over Root's integrated45f3a721e. +The production change removes one bare-content +line and adds nine lines in the existing registered leaf writer/imports. The +unchanged binder performs archive encoding. The reader, source-plane projection, +writer registry, subject projection, capture and viewer implementations are +unchanged. Source voxel spacing requires an import from its existing owner; +the first coordination note's statement that core already imported it was +incorrect and is corrected here. + +Synthetic Git comparison commit +``3913c5008b606a51268b5aeb4a3c8a527b89f1b0`` has parent82243634c and only the +proposed core file plus the existing geometry-test adaptation. It is a ratchet +comparison object, not an applied production commit or release branch. + +``tests/unit/test_graph_roi_source_roundtrip_134.py`` exercises actual context +selection, registered materialisation, disk ZIP writing and original ZIP loading. +It asserts both explicit input planes0/1, exact source/channel/names/provenance, +declared1.3556 spacing, fractional Y/X coordinates, node/edge IDs, graph features, +neuron label and typed subject identity, and transport-field removal from geometry. +The misleading archive filename supplies no identity. + +An independent ``AuditedGraph(ProjectionAudit, SpatialGraph)`` declaration +exercises cooperative ``super().__init__`` and before/after +``contextualized_source_provenance`` hooks. Its newly declared +``engineering_confidence`` edge feature survives the same ZIP writer/reader; +no generic consumer or registry changes are needed. This is behavioural MRO +evidence, not an inheritance assertion or ornamental production hierarchy. + +The four rejection cases call the original ``StreamingService.stream_rois`` with +``require_source_metadata=True``. They fail before reaching transport; no native +viewer is instantiated. Successful native streaming remains the later parent gate. +The graph type does not declare cropped source-domain bounds. This checkpoint +does not infer or claim such bounds from coordinates or filenames. + +Bounded qualification and original failures +------------------------------------------- + +Every execution was serial, existing Python/ABI dependencies only, CPU affinity0, +``CPUQuota=100%``, kernel ``MemoryMax=512M``, ``MemorySwapMax=0``, shell deadline60s, +pytest external plugins/cache disabled and numerical thread counts1. Tests use +only explicitly constructed disk storage; a fixture fails optional storage +bootstrap. No native/MCP/UI launch, package/environment change, download, provider, +scientific execution or shared slot was used. + +The existing source-selection runner now loads changed OpenHCS Python modules +directly from pinned Git blobs when ``QA134_GIT_REF`` is supplied. Unchanged files +come from the existing branch, equal to that revision; only the proposed core +overrides a blob. This avoids another worktree/full source snapshot and preserves +the actual current dependency closure instead of monkeypatching product methods. + +Original logs, including harness failures, are retained in the paired archive: + +* ``original.log``: collection fails because a partial current-source selection + lacked ``DurableSourceMetadata``;1.74s/91656KiB. No product assertion executed. +* ``original2.log``: collection fails because mixing current source metadata with + old source bindings lacked ``SourceMetadataIdentityProjection``; + 2.22s/79076KiB. No product assertion executed. +* ``pinned-original.log``: exact pinned source, three native-source-loss REDs + and four rejection controls PASS;2.52s/177464KiB. +* ``proposed.log``: seven receiving cases plus five existing metadata cases, + 12PASS;3.05s/199284KiB. +* ``graph-regression.log``:15PASS/1RED. The existing test compared the bare ROI + feature mapping including transport metadata. This authentic first failure is + retained. The proposed adaptation uses original ``geometry`` before the same + exact feature/coordinate assertions; no assertion is removed or weakened. +* ``graph-regression-final.log``: the existing full graph family,16PASS; + 2.40s/172992KiB. No receiving cases were repeated for ceremony. +* ``r0.log``: original unmodified pinned agent-comms R0 at + ``3b03785f45df2ef5dc62ba6aed99294192ecbb01``, from the existing + ``/home/ts/wt/openhcs-s1-original-ratchet-20261001``. Exact822→3913c5008 + comparison includes the entire changed production core file: exit0, every + delta zero;33.81s/87660KiB. The old UI348 ratchet WT no longer exists; + no new WT or copied detector was created. + +Ownership/antipattern review +---------------------------- + +Refreshed full NRA skill and authoritative refactor-audit ZIP, catalog README, +boundaries, implementation, membership and surface-receipt guidance were read. +NRA skill SHA256: +``9f2f8b28bc82256eefa3e9d63248c50722dc3ffe7d77adba5793296df196b47e``. +Audit ZIP SHA256: +``ef0367d878cc57565f2b257a8e6647a234d4ba4298f61391709d9c3c82bec9f7``. + +BOUND-2/BOUND-8 classify the lost original source declaration at the writer +boundary. IMPL-12 is avoided by reusing the shared binder/decoder/geometry owner +rather than copying metadata encoding. IMPL-3/IMPL-5 and MEMB-1/MEMB-2 introduce +no new consumer type switch, repeated dispatch or roster. The registered writer +is the existing format leaf; shared algorithms remain on their original owners. +No forwarding facade, compatibility reader or parallel store is introduced. +This source review and original R0 pass are not a complete global NRA/R1 scan; +earlier bounded global-scan failures remain in the historical receiving receipts. + +Disposition and later acceptance +-------------------------------- + +Source integration is complete in394 at45f3a721e; no production-hunk dependency +remains for404.404 retains the receiving record and pending installed/native +acceptance, not another implementation to merge over394. Parent controls the +coherent package qualification, installed freeze release and later public +inventory→owned native reopen of a +new correctly written graph ZIP, with source/channel/calibration readbacks and +personally opened same-coordinate raw/result/combined placement. Existing failed +jobs/archives remain unchanged; no biological acceptance is claimed. + +Owned scratch is ``.qa134-graph-20261002`` in Singer's existing persistent WT. +Cleanup remains stopped; no completed disposable directories were deleted here. +The byte-exact original logs and synthetic engineering ZIP inputs/outputs are +archived, not reformatted to remove their authentic whitespace. +Archive: ``graph-roi-source-roundtrip-134-source-20261002.tar.gz``; SHA256 +``0b04936ffd6f54fb124f4c5ce27f300f72bd83af01922bc874e7e5014efbf375``. +Direct archive reads match the original negative and positive raw-log hashes. diff --git a/docs/validation/pr394-404-wheel-receiving-20261002.rst b/docs/validation/pr394-404-wheel-receiving-20261002.rst new file mode 100644 index 0000000000..b63926d526 --- /dev/null +++ b/docs/validation/pr394-404-wheel-receiving-20261002.rst @@ -0,0 +1,34 @@ +Ordinary wheel for394/404 public receiving acceptance +==================================================== + +Owner: Singer, wheel preparation only. Root retains394 production integration; +parent reviews the wheel before any private installation and owns later public +inventory -> native graph reopening. Dalton retains the original assisted5 +journals and source closure. No scientific execution is authorized here. + +Pinned production:394 ``94ee1079d22540f9b5ed48b69481d7e7ab51095d``. +Pinned receiving receipt:404 ``dd3242d01fc74203ef077e88a7d18a4cc81f9e1d``. +This branch is based directly on394 and carries only that404 receipt. It does +not merge404's historical implementation or introduce another writer. +Both current PR heads and Root's shared claims were read before preparation. + +Existing checkout ``/home/ts/wt/openhcs-knowledge-lazy-conversion-20261001`` is +reused, including all retained untracked QA ledgers. The original ordinary +PEP517/setuptools build uses existing ``basicpy-live-candidate-20260930/.venv`` +tools with no isolation, dependency installation, download or environment creation. +``validation/build-394-404-receiving-wheel-20261002.sh`` records exact admission. + +Private artifacts live only under the existing parent qroot: +``/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002``. +Wheel preparation is pending at this initial source checkpoint. No target is +installed. Parent resource helper reports home7.0GiB, RAM10.5GiB, swap12.8GiB: +critical advisory. Preparation remains serial, CPU0/one CPU, kernel512MiB, +no swap and60s; no heavy fleet, native viewer or scientific run is launched. + +Current394 already contains the accepted source publication and graph binder +repairs. Existing source qualification is reused; original failures and unknown +collision components remain unchanged. The remaining installed gate is actual +Site001 CYX/order/provenance plus ordinary public result inventory -> source-bearing +native graph reopen, exact source/channel/calibration/geometry/subject features +and matched raw/result/combined placement. A wheel alone does not establish that +gate, biological acceptance or Root's performance target. diff --git a/validation/build-394-404-receiving-wheel-20261002.sh b/validation/build-394-404-receiving-wheel-20261002.sh new file mode 100644 index 0000000000..72856bcc1e --- /dev/null +++ b/validation/build-394-404-receiving-wheel-20261002.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -euo pipefail +# Reuse the original ordinary setuptools/PEP517 owner and installed build tools. +# No installation, dependency resolution, isolation, package import or native UI. +unset PYTHONPATH +export PYTHONDONTWRITEBYTECODE=1 OPENHCS_CPU_ONLY=true CUDA_VISIBLE_DEVICES= +export OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMBA_NUM_THREADS=1 +export MAX_JOBS=1 CARGO_BUILD_JOBS=1 +export PIP_NO_INDEX=1 PIP_DISABLE_PIP_VERSION_CHECK=1 UV_OFFLINE=1 +export POLYSTORE_IMAGEJ_ALLOW_DOWNLOAD=false +export XDG_CACHE_HOME=/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002/scratch/cache +export TMPDIR=/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002/scratch/tmp +cd /home/ts/wt/openhcs-knowledge-lazy-conversion-20261001 +git merge-base --is-ancestor 94ee1079d22540f9b5ed48b69481d7e7ab51095d HEAD +git diff --exit-code 94ee1079d22540f9b5ed48b69481d7e7ab51095d -- openhcs benchmark scripts pyproject.toml setup.py MANIFEST.in +exec /home/ts/wt/basicpy-live-candidate-20260930/.venv/bin/python -B -m build \ + --wheel --no-isolation \ + --outdir /home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002/wheels From c5722d9373c5b4942c43ab6e278de1f87af10990 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 15:40:08 -0400 Subject: [PATCH 2/5] build: qualify offline 394/404 wheel and archive exact member receipts --- .../pr394-404-wheel-receiving-20261002.rst | 75 +++++++++++++- .../pr394-404-wheel-receiving-20261002.tar.gz | Bin 0 -> 78552 bytes ...verify-394-404-receiving-wheel-20261002.py | 96 ++++++++++++++++++ 3 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 docs/validation/pr394-404-wheel-receiving-20261002.tar.gz create mode 100644 validation/verify-394-404-receiving-wheel-20261002.py diff --git a/docs/validation/pr394-404-wheel-receiving-20261002.rst b/docs/validation/pr394-404-wheel-receiving-20261002.rst index b63926d526..668f9d4e97 100644 --- a/docs/validation/pr394-404-wheel-receiving-20261002.rst +++ b/docs/validation/pr394-404-wheel-receiving-20261002.rst @@ -20,7 +20,7 @@ tools with no isolation, dependency installation, download or environment creati Private artifacts live only under the existing parent qroot: ``/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002``. -Wheel preparation is pending at this initial source checkpoint. No target is +The ordinary wheel is built and source/member verification passes. No target is installed. Parent resource helper reports home7.0GiB, RAM10.5GiB, swap12.8GiB: critical advisory. Preparation remains serial, CPU0/one CPU, kernel512MiB, no swap and60s; no heavy fleet, native viewer or scientific run is launched. @@ -32,3 +32,76 @@ Site001 CYX/order/provenance plus ordinary public result inventory -> source-bea native graph reopen, exact source/channel/calibration/geometry/subject features and matched raw/result/combined placement. A wheel alone does not establish that gate, biological acceptance or Root's performance target. + +Terminal build and source-member qualification +--------------------------------------------- + +Build source checkpoint ``9d65d4b6cb6b6a66b4bf08cb1c3ef4b2e8e8d6ea`` adds only +receiving documentation and a build driver atop exact394. No production, +benchmark, packaging configuration or build-helper bytes differ from94ee1079d. +The carried graph receipt is byte-identical to404dd3242d01. Current394 remained +94ee1079d at final verification; later Root heads require separate review. + +Private wheel relative to the artifact root above: +``wheels/openhcs-0.8.7-cp311-abi3-linux_x86_64.whl``. +Size:4224047 bytes. SHA256: +``f236ccfb557c2c08f5ac8c174fd0e5350ad4c9f552fb02b1d302b46d52dd8c60``. +Do not substitute this for a parent-reviewed installed target. + +The existing Python3.12.3/setuptools84.0.0/wheel0.45.1/build1.2.2.post1 +environment executed the original PEP517/setuptools owner without isolation or +dependency resolution. Both declared stable-ABI native extensions are in the +ordinary wheel. No extension is imported or exercised by this preparation. +No dependency, Fiji, scientific data or source-tree installation was created. + +* ``build-original.log``: exit127,0.01s; systemd's initial working directory + did not contain the relative driver. Builder never started; original failure + remains unchanged. This is a terminal harness failure, not UNKNOWN input. +* ``build-qualified.log``: explicit working directory and absolute driver, + exit0,17.21s wall; process max147004KiB, aggregate systemd peak224.6MiB, + zero swap. Successfully built the ordinary cp311-abi3 wheel. +* ``member-verification-original.log``: exit0,0.80s; max24680KiB, + aggregate peak33.5MiB, zero swap. Every wheel member has its byte count and + SHA256 in the original JSON output. All814 tracked wheel members match source; + all792 Python members derived from original setuptools include/exclude + declarations are covered. Every member's original RECORD hash/size passes. + +Both successful commands used ``systemd-run --user --wait --pipe`` with +``MemoryMax=512M``, ``MemorySwapMax=0`` and ``CPUQuota=100%``; ``timeout60s`` +and ``taskset -c0`` wrap the original build/verifier. Systemd units are terminal +and auto-unloaded; querying their defaults afterwards is not a new limit proof. +No operation is running or pending, and no failed/unknown author input is replayed. + +Source tree identities at the pinned production head: +``openhcs`` Git tree ``8767dfdcd5f5944fa961d11c7cafb05219502215``; +``benchmark`` Git tree ``69f043fbb08d382c42fa2cc0fcb3adc86d8c0cb0``. +The read-only verifier does not import OpenHCS. It derives package membership from +pyproject.toml and tracked Git paths, then consumes the wheel's original RECORD; +it introduces no product registry, schema, native reader or source authority. + +Byte-exact original logs and complete wheel-member/source-hash JSON are archived +in ``pr394-404-wheel-receiving-20261002.tar.gz``. SHA256: +``782ffa907f02b1759aa62b1a5135cae85116a22badf699f5e6725d62b8112ead``. +Raw logs retain authentic whitespace. No source tests or ratchets were repeated +for this unchanged production packaging checkpoint. Diff whitespace passes. + +Parent's next action is review of this pinned source/wheel before any installation. +Then use only a private target beneath the existing artifact root for the actual +public inventory -> owned native graph receiving journey, plus Site001 CYX/order/ +provenance. Existing retinal QA viewer6006, native/author handoff, original sessions +and scientific outputs are not touched. Root394 production/performance and404 +installed acceptance remain their original owners, not a new parallel writer. + +Owned terminal scratch cleanup +------------------------------ + +After logs were archived and byte-exact matches checked, lsof found no handles +on this build's two newly created disposable directories. Removed only +``/home/ts/wt/openhcs-knowledge-lazy-conversion-20261001/build`` (20406272 allocated +bytes) and ``/home/ts/wt/openhcs-knowledge-lazy-conversion-20261001/openhcs.egg-info`` +(98304 bytes), releasing20504576 bytes. Neither existed before this build. +Removal is permanent; original setup/source and archived build log regenerate +them. The private wheel and original logs/member receipt remain unchanged. +All earlier untracked QA ledgers, source, failed fixtures, saved viewers and +UNKNOWN dispositions remain. No parent cache, environment, dependency/Fiji +installation, foreign WT or scientific artifact was removed. diff --git a/docs/validation/pr394-404-wheel-receiving-20261002.tar.gz b/docs/validation/pr394-404-wheel-receiving-20261002.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f45d51949340e5651bf45b4e585d98f3b04a0029 GIT binary patch literal 78552 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 =!^#x0vcJNsO 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 Kwx3D>s0RS9xX^|G literal 0 HcmV?d00001 diff --git a/validation/verify-394-404-receiving-wheel-20261002.py b/validation/verify-394-404-receiving-wheel-20261002.py new file mode 100644 index 0000000000..cbc09e161f --- /dev/null +++ b/validation/verify-394-404-receiving-wheel-20261002.py @@ -0,0 +1,96 @@ +"""Read-only ordinary wheel/source/RECORD receipt; does not import OpenHCS.""" + +import base64 +import csv +import fnmatch +import hashlib +import io +import json +from pathlib import Path +import subprocess +import sys +import tomllib +import zipfile + + +source = Path(__file__).resolve().parents[1] +source_ref = "94ee1079d22540f9b5ed48b69481d7e7ab51095d" +receipt_ref = "dd3242d01fc74203ef077e88a7d18a4cc81f9e1d" +artifact_root = Path(sys.argv[1]).resolve() +wheel, = (artifact_root / "wheels").glob("*.whl") + +subprocess.run( + ["git", "diff", "--exit-code", source_ref, "--", "openhcs", "benchmark", + "scripts", "pyproject.toml", "setup.py", "MANIFEST.in"], + cwd=source, check=True, +) +receipt_path = "docs/validation/graph-roi-source-roundtrip-134.rst" +assert (source / receipt_path).read_bytes() == subprocess.check_output( + ["git", "show", f"{receipt_ref}:{receipt_path}"], cwd=source, +) +tracked = set(subprocess.check_output( + ["git", "ls-tree", "-r", "--name-only", "-z", source_ref], cwd=source, +).decode().rstrip("\0").split("\0")) +packaging = tomllib.loads((source / "pyproject.toml").read_text()) +discovery = packaging["tool"]["setuptools"]["packages"]["find"] +expected_python = set() +for name in tracked: + path = Path(name) + if path.suffix != ".py": + continue + package = ".".join(path.parent.parts) + if any(fnmatch.fnmatchcase(package, rule) for rule in discovery["include"]): + if not any(fnmatch.fnmatchcase(package, rule) for rule in discovery["exclude"]): + expected_python.add(name) + +members = [] +matched = set() +with zipfile.ZipFile(wheel) as archive: + names = archive.namelist() + assert len(names) == len(set(names)), "Duplicate wheel members" + record_name, = [name for name in names if name.endswith(".dist-info/RECORD")] + record = { + name: (digest, size) + for name, digest, size in csv.reader(io.StringIO(archive.read(record_name).decode())) + } + assert set(record) == set(names), "Wheel RECORD/member mismatch" + for name in names: + data = archive.read(name) + digest = hashlib.sha256(data).hexdigest() + recorded_hash, recorded_size = record[name] + if name == record_name: + assert recorded_hash == recorded_size == "" + else: + record_hash = base64.urlsafe_b64encode(hashlib.sha256(data).digest()).decode().rstrip("=") + assert recorded_hash == f"sha256={record_hash}", name + assert recorded_size == str(len(data)), name + tracked_source = name in tracked + if tracked_source: + assert (source / name).read_bytes() == data, name + matched.add(name) + members.append({ + "path": name, "sha256": digest, "bytes": len(data), + "tracked_source_equal": tracked_source, + }) + assert expected_python <= matched, sorted(expected_python - matched) + generated_native = [name for name in names if name.endswith(".abi3.so")] + assert generated_native, "Ordinary wheel has no compiled declared native extensions" + +with wheel.open("rb") as stream: + wheel_sha256 = hashlib.file_digest(stream, "sha256").hexdigest() +print(json.dumps({ + "source_ref": source_ref, + "receiving_ref": receipt_ref, + "build_checkpoint": subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=source, text=True).strip(), + "production_unchanged": True, + "receiving_receipt_byte_equal": True, + "wheel": str(wheel), + "wheel_sha256": wheel_sha256, + "wheel_bytes": wheel.stat().st_size, + "tracked_source_members_equal": len(matched), + "declared_python_members_covered": len(expected_python), + "record_verified": True, + "generated_native_members": generated_native, + "members": members, + "installed": False, +}, indent=2, sort_keys=True)) From 474759de036504fcda83a2f58f24eb38733a736b Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 15:49:05 -0400 Subject: [PATCH 3/5] build: install approved wheel privately and verify original member bytes --- .../pr394-404-private-install-20261002.tar.gz | Bin 0 -> 52204 bytes .../pr394-404-wheel-receiving-20261002.rst | 99 ++++++++++++++++-- .../install-394-404-private-wheel-20261002.sh | 16 +++ ...verify-394-404-receiving-wheel-20261002.py | 32 +++++- 4 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 docs/validation/pr394-404-private-install-20261002.tar.gz create mode 100644 validation/install-394-404-private-wheel-20261002.sh diff --git a/docs/validation/pr394-404-private-install-20261002.tar.gz b/docs/validation/pr394-404-private-install-20261002.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d8caaa3ed22b387dc9040d474276d551eb1bbb44 GIT binary patch literal 52204 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 native graph reopening. Dalton retains the original assisted5 journals and source closure. No scientific execution is authorized here. @@ -20,8 +20,9 @@ tools with no isolation, dependency installation, download or environment creati Private artifacts live only under the existing parent qroot: ``/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002``. -The ordinary wheel is built and source/member verification passes. No target is -installed. Parent resource helper reports home7.0GiB, RAM10.5GiB, swap12.8GiB: +The ordinary wheel is built and source/member verification passes. The subsequent +authorized private install and byte verification also pass, detailed below. +Initial parent resource helper reports home7.0GiB, RAM10.5GiB, swap12.8GiB: critical advisory. Preparation remains serial, CPU0/one CPU, kernel512MiB, no swap and60s; no heavy fleet, native viewer or scientific run is launched. @@ -46,7 +47,7 @@ Private wheel relative to the artifact root above: ``wheels/openhcs-0.8.7-cp311-abi3-linux_x86_64.whl``. Size:4224047 bytes. SHA256: ``f236ccfb557c2c08f5ac8c174fd0e5350ad4c9f552fb02b1d302b46d52dd8c60``. -Do not substitute this for a parent-reviewed installed target. +Its approved private target is identified in the install checkpoint below. The existing Python3.12.3/setuptools84.0.0/wheel0.45.1/build1.2.2.post1 environment executed the original PEP517/setuptools owner without isolation or @@ -85,8 +86,8 @@ in ``pr394-404-wheel-receiving-20261002.tar.gz``. SHA256: Raw logs retain authentic whitespace. No source tests or ratchets were repeated for this unchanged production packaging checkpoint. Diff whitespace passes. -Parent's next action is review of this pinned source/wheel before any installation. -Then use only a private target beneath the existing artifact root for the actual +Parent reviewed this pinned source/wheel and authorized the private install below. +Use only that private target beneath the existing artifact root for the actual public inventory -> owned native graph receiving journey, plus Site001 CYX/order/ provenance. Existing retinal QA viewer6006, native/author handoff, original sessions and scientific outputs are not touched. Root394 production/performance and404 @@ -105,3 +106,89 @@ them. The private wheel and original logs/member receipt remain unchanged. All earlier untracked QA ledgers, source, failed fixtures, saved viewers and UNKNOWN dispositions remain. No parent cache, environment, dependency/Fiji installation, foreign WT or scientific artifact was removed. + +Authorized private install and byte verification +----------------------------------------------- + +Parent independently ran the existing verifier atc5722d937 and reviewed the full +source/build/member receipt, then explicitly authorized ONE offline/no-deps +installation into a new unused private target. That operation is terminal: + +``/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002/target-reviewed-f236ccfb-20261002``. + +The installer checks the approved wheel SHA256, refuses an existing target and +claims the directory with non-overwriting mkdir. Existing interpreter only: +``python -B -m pip install --no-deps --no-index --no-compile --no-cache-dir +--target ``. Exact driver is +``validation/install-394-404-private-wheel-20261002.sh``. No canonical/global +package, dependency, .pth, old target, environment or saved source is changed. + +Host advisory remained critical: resource helper reported home6.2GiB, available +RAM6.0GiB and swap13.3GiB. Immediate admission readback showed MemAvailable +8308252KiB and memory PSI some/full avg10=0.00. This small operation could fit +its unchanged512MiB bound; no heavy slot or fleet was admitted. + +* ``private-install-original.log``: exactly one install, exit0,0.90s wall, + max49280KiB RSS, aggregate79.3MiB, zero swap. +* ``installed-bytes-original.log``: exit0,0.41s wall, max25108KiB RSS, + aggregate20.4MiB, zero swap. All883 original non-RECORD wheel members are + byte-identical in the private target, including all Python, stable-ABI native + modules and original distribution metadata. All814 tracked source members + and792 declared Python members remain covered. Their installed RECORD + hash/size entries equal the original wheel's entries. + +Pip owns installed RECORD rewriting and generated scripts/INSTALLER/REQUESTED/ +direct_url metadata. The verifier does not mislabel that RECORD as byte-identical +to the wheel: it compares original payload entries and verifies direct_url's +exact wheel URL/SHA256. INSTALLER is pip; the target contains no .pth. No +OpenHCS, scientific or native module is imported. This extends the original +read-only verifier's existing member loop, not another product reader/store. +Both operations retain CPU0/CPUQuota100%, kernel MemoryMax512MiB, +MemorySwapMax0 and60s. No retry, UNKNOWN replay or broad source suite is run. + +Byte-exact install/member logs are archived separately; the original build archive +is unchanged. ``pr394-404-private-install-20261002.tar.gz`` SHA256: +``65a94c07d3fb705f463221486af24b7094d91d7c04a9e22973b83f9577da1adb``. +Direct archive reads match both original log hashes. Private target retained; +no application startup, source execution, native viewer or live readiness follows +from this installed-byte checkpoint. + +Existing public receiving owner and next ports +--------------------------------------------- + +Reuse ``PublicJourney`` from the existing +``/home/ts/wt/openhcs-prior-measurement-role-projection-20261001/validation/public_two_vector_388.py`` +with original ``McpDevClient(use_resident_server=False)``. It uses the existing +capability declarations, typed decoder, original10s client bound and exclusive +journal writes; each mutation is sent once and uncertain results stop. The +existing parent invocation example is +``/home/ts/wt/openhcs-issue-batch-20260929/paired397-388-installed-20261001/verify-reopen399-viewer.py``; +its historical candidate-image constants are not a new graph fixture. Reuse its +owner/session, not its old scientific input or top-level trial. + +For parent's next new engineering materialization, the original public calls are +``openhcs_query_plate_files`` with ``kind=result`` and the exact result directory, +then ``openhcs_stream_plate_files_to_viewer`` with the returned canonical graph +record path and an explicit owned TCP endpoint. The original typed contracts are +``PlateFileQueryRequest``/``PlateFileStreamRequest`` in +``openhcs/agent/dto/plate.py``. Follow with original window-state/payload and +render-complete snapshot controls, source/scale/geometry/subject readbacks and +personally opened matched raw/result/combined placement. Result graph archives +must carry native source metadata; an image source receipt is not fabricated to +bypass the separate explicit-result-image guard. No filename establishes source +identity, and old broken graph ZIPs/jobs are not backfilled or replayed. + +Parent owns the installed/native acceptance slot and endpoint incarnation. +Historical isolated pair is viewer5992/native5993 on DISPLAY91; the read-only TCP +check at this checkpoint found neither listening, not a reservation or proof of +IPC absence.6006 is occupied by parent's protected retinal QA viewer513495 and +must not be reused/stopped. Recheck actual ownership before any launch. Do not +default to foreign7777. From a directory outside source, admission for the fresh +MCP/native child must put this private target first on its import route while +reusing existing dependencies; no .pth/global change is needed. + +Root retains394 source/materialization/projection/performance, Singer retains +404/472 receiving records, parent retains live integration, Dalton retains +assisted5 journals/scientific custody, and Dewey retains H003 handoff repair. +No native or scientific run is started by this install. Site001 CYX/order/ +provenance and public inventory -> native graph receiving remain parent's gate. diff --git a/validation/install-394-404-private-wheel-20261002.sh b/validation/install-394-404-private-wheel-20261002.sh new file mode 100644 index 0000000000..4cd554ba64 --- /dev/null +++ b/validation/install-394-404-private-wheel-20261002.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail +# Explicit parent authorization: one install into this new unused private target. +unset PYTHONPATH +export PYTHONDONTWRITEBYTECODE=1 PIP_NO_INDEX=1 PIP_DISABLE_PIP_VERSION_CHECK=1 +export UV_OFFLINE=1 POLYSTORE_IMAGEJ_ALLOW_DOWNLOAD=false +export OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 +export TMPDIR=/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002/scratch/tmp +wheel_path=/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002/wheels/openhcs-0.8.7-cp311-abi3-linux_x86_64.whl +target_path=/home/ts/wt/openhcs-issue-batch-20260929/carrier434-installed-20261002/engineering394404-wheel-94ee-dd324-20261002/target-reviewed-f236ccfb-20261002 +test "$(sha256sum "$wheel_path" | cut -d ' ' -f 1)" = f236ccfb557c2c08f5ac8c174fd0e5350ad4c9f552fb02b1d302b46d52dd8c60 +test ! -e "$target_path" +mkdir -- "$target_path" +exec /home/ts/wt/basicpy-live-candidate-20260930/.venv/bin/python -B -m pip install \ + --no-deps --no-index --no-compile --no-cache-dir \ + --target "$target_path" "$wheel_path" diff --git a/validation/verify-394-404-receiving-wheel-20261002.py b/validation/verify-394-404-receiving-wheel-20261002.py index cbc09e161f..0945bf469b 100644 --- a/validation/verify-394-404-receiving-wheel-20261002.py +++ b/validation/verify-394-404-receiving-wheel-20261002.py @@ -18,6 +18,11 @@ receipt_ref = "dd3242d01fc74203ef077e88a7d18a4cc81f9e1d" artifact_root = Path(sys.argv[1]).resolve() wheel, = (artifact_root / "wheels").glob("*.whl") +target = Path(sys.argv[2]).resolve() if len(sys.argv) == 3 else None +if target is not None: + assert target != artifact_root and target.is_relative_to(artifact_root) + assert target.is_dir() + assert not list(target.rglob("*.pth")), "Unexpected installed path injection" subprocess.run( ["git", "diff", "--exit-code", source_ref, "--", "openhcs", "benchmark", @@ -45,6 +50,7 @@ members = [] matched = set() +installed_members = 0 with zipfile.ZipFile(wheel) as archive: names = archive.namelist() assert len(names) == len(set(names)), "Duplicate wheel members" @@ -53,6 +59,15 @@ name: (digest, size) for name, digest, size in csv.reader(io.StringIO(archive.read(record_name).decode())) } + installed_record = None + if target is not None: + installed_record = { + name: (digest, size) + for name, digest, size in csv.reader( + io.StringIO((target / record_name).read_text()) + ) + } + assert (target / Path(record_name).parent / "INSTALLER").read_text() == "pip\n" assert set(record) == set(names), "Wheel RECORD/member mismatch" for name in names: data = archive.read(name) @@ -64,6 +79,10 @@ record_hash = base64.urlsafe_b64encode(hashlib.sha256(data).digest()).decode().rstrip("=") assert recorded_hash == f"sha256={record_hash}", name assert recorded_size == str(len(data)), name + if target is not None: + assert (target / name).read_bytes() == data, name + assert installed_record[name] == record[name], name + installed_members += 1 tracked_source = name in tracked if tracked_source: assert (source / name).read_bytes() == data, name @@ -78,6 +97,10 @@ with wheel.open("rb") as stream: wheel_sha256 = hashlib.file_digest(stream, "sha256").hexdigest() +if target is not None: + direct_url = json.loads((target / Path(record_name).parent / "direct_url.json").read_text()) + assert direct_url["url"] == wheel.as_uri() + assert direct_url["archive_info"]["hashes"]["sha256"] == wheel_sha256 print(json.dumps({ "source_ref": source_ref, "receiving_ref": receipt_ref, @@ -92,5 +115,12 @@ "record_verified": True, "generated_native_members": generated_native, "members": members, - "installed": False, + "installed": target is not None, + "installed_target": None if target is None else str(target), + "installed_original_members_equal": installed_members, + "installed_metadata_byte_equal": target is not None, + "installed_record_policy": ( + "Original payload hashes/sizes equal; pip rewrites RECORD and adds installer metadata/scripts" + if target is not None else None + ), }, indent=2, sort_keys=True)) From db7c962a456379cb33aa4a5c18206770956cfeb4 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 15:51:26 -0400 Subject: [PATCH 4/5] docs: record independent private install review and terminal tmp cleanup --- .../pr394-404-wheel-receiving-20261002.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/validation/pr394-404-wheel-receiving-20261002.rst b/docs/validation/pr394-404-wheel-receiving-20261002.rst index e25c74d0b3..79a3493ab9 100644 --- a/docs/validation/pr394-404-wheel-receiving-20261002.rst +++ b/docs/validation/pr394-404-wheel-receiving-20261002.rst @@ -192,3 +192,21 @@ Root retains394 source/materialization/projection/performance, Singer retains assisted5 journals/scientific custody, and Dewey retains H003 handoff repair. No native or scientific run is started by this install. Site001 CYX/order/ provenance and public inventory -> native graph receiving remain parent's gate. + +Parent independent receiving checkpoint +--------------------------------------- + +Parent independently reran the updated existing verifier and accepted all883 +non-RECORD installed payload/metadata bytes and the direct URL/wheel hash. Its +durable review is ``PARENT-PRIVATE-INSTALL-REVIEW.rst`` in the same engineering +artifact root. This confirms installed identity, not native ABI use or graph QA. +The ordinary wheel, target and original archives remain retained.472 stays draft; +it is not merged into Root without Root coordination. Parent retains actual +Site001/graph validation, prioritizing original H003 allowance restoration before +any new native/scientific fleet. No application is launched here. + +Only terminal install tmp was removed: the empty, handle-free owned +``engineering394404-wheel-94ee-dd324-20261002/scratch/tmp`` directory under the +artifact qroot (4096 allocated bytes). rmdir removed no files; this disposable +container is regenerable. All source, original logs, saved viewers, private target, +ordinary wheel, earlier evidence and UNKNOWN dispositions remain untouched. From 6aad9f1818f464ac6b8eea24bbd0a1569f559131 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 16:01:19 -0400 Subject: [PATCH 5/5] docs: compare pinned graph receiving source with current394 --- .../pr394-404-wheel-receiving-20261002.rst | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/docs/validation/pr394-404-wheel-receiving-20261002.rst b/docs/validation/pr394-404-wheel-receiving-20261002.rst index 79a3493ab9..76528bb8a1 100644 --- a/docs/validation/pr394-404-wheel-receiving-20261002.rst +++ b/docs/validation/pr394-404-wheel-receiving-20261002.rst @@ -210,3 +210,86 @@ Only terminal install tmp was removed: the empty, handle-free owned artifact qroot (4096 allocated bytes). rmdir removed no files; this disposable container is regenerable. All source, original logs, saved viewers, private target, ordinary wheel, earlier evidence and UNKNOWN dispositions remain untouched. + +Receiving comparison with current394 eb2f23ef +-------------------------------------------- + +Parent requested this source-only review before its installed graph journey. +Compared immutable wheel production94ee1079d with live394 head +``eb2f23efdf6c9f7d4da0e5692567b3535f23f257``; the latter incorporates main +``a6c18f054457b7693fb0585ca2167b43325a0c01``. Neither source movement nor this +review authorizes another build/install. The approved wheel, target, byte +receipts,404dd324 graph receipt and original failed/UNKNOWN inputs stay unchanged. + +Read the complete Git delta (23 files, four production files), then the original +graph/provenance/projection/alignment/publication/role consumers, public inventory +and streaming contracts, strict native reader, Napari source/feature projection, +renderer inheritance and processing-preparation callers. The comparison includes +all production roots, not only the historical graph patch. Reproduce the complete +production/dependency difference with:: + + git diff --name-status 94ee1079d eb2f23ef -- openhcs benchmark external \ + packaging scripts tools pyproject.toml setup.py setup.cfg MANIFEST.in \ + .gitmodules requirements-omero.txt server.json + +Exactly four paths differ: + +* ``openhcs/mcp/dev_client_renderers/plate.py``: merged469 direct/selected sample + formatting now inherits ``McpDevTypedOutputRenderer``. Original typed decoding + and diagnostics replace raw outer-envelope reads and a manufactured nested + MCP response. Compact missing/error/omission presentation is changed. +* ``openhcs/mcp/dev_client_renderers/viewer.py``: only + ``ViewerImageSampleRenderer`` uses the inherited scalar-preview counter instead + of its deleted copy. Inventory, stream, state, payload, ROI summary, navigation + and snapshot renderer implementations are unchanged. +* ``openhcs/mcp/dev_client_rendering.py``: the existing typed ancestor gains + ``json_value_count`` shared by those three sample leaves. Its existing decoding, + diagnostics and nominal payload dispatch methods are unchanged. Public sample + producers, DTOs, serialization and generated commands are unchanged; compact + sample rendering cannot be represented as byte-identical current acceptance. +* ``openhcs/processing/backends/cellprofiler/illumination.py``: merged474 adds ten + lines to the declared ``_prepare_correct_illumination_calculate`` hook, preparing + canonical float64 contiguous images and bool masks in masked/unmasked and + writable/read-only combinations. Numerical processing bodies are unchanged; + the registered readiness lifecycle now performs additional JIT preparation. + The94ee target does not exercise that newer readiness behavior. + +Every other production/dependency path above has zero diff, including all core, +agent and runtime declarations/consumers, interop, IO, processing materialization, +graph leaf, benchmark, packaging and dependency/configuration sources. Complete +tree identities agree at both heads (not a selected-file equality assertion): + +* ``openhcs/core``: ``54ec18e75054af860534a40064cdc4c8760de89f``. +* ``openhcs/runtime``: ``2713fda4ec6185b465d0f28a1c2a41c73cea8770``. +* ``openhcs/agent``: ``62f607cb7486270fb4d2ca82b02af09b3aabd651``. +* ``openhcs/processing/materialization``: + ``3df1b7ce9f402014f14d17766cba33f3244f0dbc``. + +The graph writer still derives ``ImagePayloadMetadata`` from graph provenance +and coordinate spacing, then calls original ``ROIArchiveSourceMetadata.bind`` +for archive content and supplies the same metadata to ``Output``. Public result +inventory/selection stays under original inspection/streaming services. The +reader still rejects missing represented source identities before projecting +geometry; image source-receipt guards are not relaxed. ``SourceProjectionSet``, +``AlignedImageSliceContext``, selected-source axis/CYX normalization, role and +filename identity, materialization/publication and Napari feature/scale consumers +are unchanged across their complete core/runtime/agent families. No old writer +proposal is reapplied and no acquisition/scientific file is inspected. + +All eight external gitlinks and dependency declarations are identical. This is +Git source/declaration identity, not a fresh dependency installation or native ABI +test. Existing469 AST/new-capability evidence is reused, not rerun. Current NRA +and authoritative audit catalog were read: BOUND-1/2 concern the removed raw +sample reader, IMPL-12 the deleted preview counter copies, BOUND-8 the preserved +typed source/role boundaries, and AGENT-7 prohibits a ceremonial rebuild. No +structural implementation is performed here and no new R0/R1 pass is asserted. + +Root retains production integration and the two semantic deltas above. Direct +coordination on394 receives these exact pins/deltas; Dalton receives the same +source/publication boundary. Parent can qualify the immutable94ee graph/Site001/ +roles path at its actual installed strength. That does not qualify current394 +sampling presentation or merged474 readiness, and source identity alone is not +live reopening evidence. WholeRoot R0 remains RED (+1 switch/+3 arms), exactly as +its current public body records; neither472 readiness nor pinned receiving +acceptance waives it or queues a final-main merge. Parent's public inventory -> +native graph reopening and Site001 CYX/order/provenance gate remains outstanding.