Experiment formal candidate artifact build plan 01 - kmosoti/FabricO11y GitHub Wiki

Candidate artifact build plan

Current plan for frozen 8fb6f413179b094288316e25845c137440ba23fa. All18 active cells actually exited0 with confirmed cgroup stops. Separate console A/B builds and staged/packaged console diffs had no output. Both DEBs compare byte-for-byte after matched build-image/source/toolchain guards; both canonical-DEB-input RPM rebuilds compare byte-for-byte. The mismatched-image control refused before comparison and the forged console-binding control observed inspector2/exact named rejection. Final inspector exited0. These are artifact-build results; installation, browser and service acceptance remain pending. Marker-control01's initial stub failure and its raw receipt/failure evidence remain preserved; the corrected unique marker-control02 exited0 with all three refusals. The green frozen record supplies CI admission.

Tree e77f61ee6b3ea3e9f22283c3496dd945293cf8b5; parents af2d9804fc281aeca29eaf2ce99bb2ce4c5b86b0 and 7eac20973829aae03104efc781338e281e47783e; epoch 1791841113; Cargo.lock SHA256 b8c9010b1a694b809ac35c4b3eaf1e6882eda83278db0ae0906797f8126f2a8c. A/B are clean detached frozen checkouts. No historical candidate build/acceptance result is reused.

Serial default containment:16GiB high/20GiB max/no swap/1800s. Each isolated DEB independently uses7/8GiB/no swap/1500s. Both drivers set CARGO_HOME=/run/media/kmosoti/data/FabricO11y/toolchain-cache/cargo and RUSTUP_HOME=/run/media/kmosoti/data/FabricO11y/toolchain-cache/rustup. Pinned Rust1.99.0 and repository UI tools/default features remain unchanged. No changed limits are proposed.

Strict full-namespace DATA census before each run and every30s, stop95,000,000,000 bytes, unchanged100GB ceiling. Census+full reservation must be<=95GB; unreadable paths fail closed. Prior measured census85,548,822,013 bytes is bound to /run/media/kmosoti/data/FabricO11y/results/service-opening-candidate/stress-pagination-evidence-docs-hooks-path-02.json, SHA256 5c27773fbd1fe00e2367c7046479a9f8104a730997f38d94b096e866d21e5e38, exit0/stopped. This is historical observation, never future admission.

Cells Reservation bytes Maximum admission census bytes
UI/tools/console 2,147,483,648 92,852,516,352
Isolated DEB 8,589,934,592 86,410,065,408
Cleanup/compare/RPM/inspect 1,073,741,824 93,926,258,176
Later #41 VM 9,663,676,416 85,336,323,584

Active exact command inventory: /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/build-command-plan-amended.json SHA256 27b097f883de7bd0965c905c032754d9b7b53c0741ef3b69bbdadb6cc66f6f5a. Original build-command-plan.json is archived historical proposal, consumed by no current driver or inspector; its stale vectors do not govern execution.

Prepared file (under /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01) SHA256
run-step-a.py 22e11438447b1822ea090fb716016ebfd3f391012cca089d873b880dfa624e57
run-step-b.py 1d52dfa32fd68f95229a5dd12a378cf24cd7ba05246474f8d94477d8ccd0ccd0
census.py 399bc25f8c5c4f2bc5c386f286369815db7ee432b02d5be9301f13833eb0a495
cleanup-fresh-console-targets.py 7fbdf2db556bc4cd7179983914f4ff52bece9074a4f31442768657ab10c7c383
negative-console-target-markers.py 00c1db37049d519b69cf1ff576cb24b2872f3480a77a012bba1cb481b2c4746e
guard-deb-reproducibility.py d3eb7ce47113b82726fb5fd5912c05d7c47fc1084d2fa69872a1b0bca4dfba76
inspect-candidate.py 82a104d669d4a0adedb7bb8e8009dd5784c69f12e8927fb288570b50d21bb075
negative-console-binding.py 685bd98ac703d0bacb96c1fb6d70cd9a1517d30a9ff61dfac91bd414f45bc306
candidate-admission.json fc37ad5c5d39b7ce1b6f2825ad1812c6240c90edd38813b9e69e6005eb83b4a6
console-target-forged-marker.json ce3149990ceca17e8193a6d9ecbc546954087490620cba668679190350319c40
console-target-forged-marker-side.json 17ec766856374a9c74b1a26dfcde3156d53c20e7c6c494b4cd8f81ecd024d3c9
console-target-forged-marker-path.json 9a1b0bd39206b1013f89964ea29ef71dcf601b9b0a608a706c3d400a5ff9a7e0

Actual completed outer receipts (same META directory):

Receipt SHA256 Result
fresh-8fb6f413179b-01-ui-tools.json e2ca3c389d889cc75c885c43ba07de3889c74e6e922455e6bc1405a216e9c637 exit0; stopped
fresh-8fb6f413179b-01-cargo-fetch.json ee509fd61ab34b4501e80c1d125970f10a09d203c73b5088e4f49305b0a204e7 exit0; stopped
fresh-8fb6f413179b-01-console-a.json 9f02ec0764355ce42bc04dcd83bc2dc732390acbc00f34c343ebc7c5b715bc33 exit0; stopped
fresh-8fb6f413179b-01-console-b.json 133dd275471098db1ac6e42daffa36bf07a24693c04b66d507240aec23e0d423 exit0; stopped
fresh-8fb6f413179b-01-console-diff.json 7d4f6e5702305dc4f938174d42c82533cd213bdb45ff55b96133b0b19dcfa523 exit0; stopped
fresh-8fb6f413179b-01-console-target-hardlink-controls-01.json 2497969454360a5997ae12fdc068760cb7406d11b98261f2b945f0f16ad6d9bf exit0; stopped
fresh-8fb6f413179b-01-console-target-marker-controls-02.json 87dd63b0ad9a3aa5e7685c6ea4908bd73eef2fb91a01997b3b1040c81475b50f exit0; stopped
fresh-8fb6f413179b-01-console-target-dry-run-01.json 87a4c1e29b5b874b7369f0162faa4795ef7405eed33cd1d39a14170d32b12140 exit0; stopped
fresh-8fb6f413179b-01-console-target-cleanup-01.json aaedff334119d792c392bd0625abafec79f1ae371620bc852c8810bbaeff9543 exit0; stopped
fresh-8fb6f413179b-01-deb-a.json e4531d0c72c3bf295c36c3be91ceab17664e200374b1e0dfb8c6647689b4cb2d exit0; stopped
fresh-8fb6f413179b-01-deb-b.json 8d0a0a5213264f965e5b84ddb5899fd9536e625df323503c1167f29b9e17641d exit0; stopped
fresh-8fb6f413179b-01-deb-image-negative-01.json b80ba6b3da7f50340c192deea20d0bc01eac129776661e902837f32fc3cfd9ee exit0; stopped
fresh-8fb6f413179b-01-deb-compare-01.json a8f0fced6843d5c082c38056e8e192415e39c0e689e48190039a5d27f2c00aa9 exit0; stopped
fresh-8fb6f413179b-01-rpm-a.json 710de7d7d4359988c3604d9f180a52a8b4dd0560dfb791fb099b2181b8859bc7 exit0; stopped
fresh-8fb6f413179b-01-rpm-b.json 1d00b0d81000cfe21f347a0fedac6249931890d13f22956d02548a6cc9b34da8 exit0; stopped
fresh-8fb6f413179b-01-rpm-diff.json ca0633f2b46adc2de7d5058fb868af43bc66cce483933c33c19ad2c6f65d3d7e exit0; stopped
fresh-8fb6f413179b-01-negative-console-binding.json e93f542d0429f786926ba326511b48578492f53e63d2e7e8324b17899e354995 exit0; stopped
fresh-8fb6f413179b-01-package-inspect.json 03115270f0e7d48dd83ec9f6b421f3d47ae1b45107455c7cd9afc7b321ddace3 exit0; stopped

Each complete invocation follows in execution order. Read/answer new #59 requests before every step and after each run. Continue only after expected success and confirmed stop. Any unexpected control outcome, nonzero actual dry-run/execute or partial removal stops the sequence before DEB admission, preserves evidence and posts BLOCKED with observed sizes. A retry after partial removal needs a new inventory and pre-flight review.

  1. fresh-8fb6f413179b-01-ui-tools — Verify/install repository-pinned UI tools once.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-ui-tools 2147483648 python3 -B tools/ci/install-ui-tools.py
  1. fresh-8fb6f413179b-01-cargo-fetch — Prepare pinned offline Cargo inputs once.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-cargo-fetch 2147483648 cargo +1.99.0 fetch --locked
  1. fresh-8fb6f413179b-01-console-a — Independent console distribution from fresh clean checkout A.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-console-a 2147483648 env SOURCE_DATE_EPOCH=1791841113 CARGO_TARGET_DIR=/run/media/kmosoti/data/FabricO11y/scratch/console-target-fresh-8fb6f413179b-01-a python3 -B tools/ui/build.py --out /run/media/kmosoti/data/FabricO11y/results/console-fresh-8fb6f413179b-01-a
  1. fresh-8fb6f413179b-01-console-b — Independent console distribution from fresh clean checkout B.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-b

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-b.py fresh-8fb6f413179b-01-console-b 2147483648 env SOURCE_DATE_EPOCH=1791841113 CARGO_TARGET_DIR=/run/media/kmosoti/data/FabricO11y/scratch/console-target-fresh-8fb6f413179b-01-b python3 -B tools/ui/build.py --out /run/media/kmosoti/data/FabricO11y/results/console-fresh-8fb6f413179b-01-b
  1. fresh-8fb6f413179b-01-console-diff — Compare every dist file; do not compare path-bearing receipts for byte equality.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-console-diff 1073741824 diff -ru /run/media/kmosoti/data/FabricO11y/results/console-fresh-8fb6f413179b-01-a/dist /run/media/kmosoti/data/FabricO11y/results/console-fresh-8fb6f413179b-01-b/dist
  1. fresh-8fb6f413179b-01-console-target-hardlink-controls-01 — Five synthetic ownership/identity/mount observations, all true, wrapper exit0.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-console-target-hardlink-controls-01 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/cleanup-fresh-console-targets.py --hardlink-controls
  1. fresh-8fb6f413179b-01-console-target-marker-controls-02 — Three exact main-return1/named marker refusals; wrapper exit0, no inventory/deletion.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-console-target-marker-controls-02 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/negative-console-target-markers.py
  1. fresh-8fb6f413179b-01-console-target-dry-run-01 — Immutable inventory plus successful stopped dry-run, exit0.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-console-target-dry-run-01 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/cleanup-fresh-console-targets.py --inventory /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/fresh-console-targets-inventory.json
  1. fresh-8fb6f413179b-01-console-target-cleanup-01 — Execute only after binding actual prior inventory SHA256; exit0 and targets absent.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-console-target-cleanup-01 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/cleanup-fresh-console-targets.py --inventory /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/fresh-console-targets-inventory.json --execute --expected-inventory-sha256 ACTUAL_DRY_RUN_SHA256
  1. fresh-8fb6f413179b-01-deb-a — Clean isolated DEB build A with corresponding independent console output.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-deb-a 8589934592 env SOURCE_DATE_EPOCH=1791841113 python3 -B tools/qualification/install/build-isolated.py --family debian --run-id fresh-8fb6f413179b-01-deb-a --console-build /run/media/kmosoti/data/FabricO11y/results/console-fresh-8fb6f413179b-01-a
  1. fresh-8fb6f413179b-01-deb-b — Clean isolated DEB build B with corresponding independent console output.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-b

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-b.py fresh-8fb6f413179b-01-deb-b 8589934592 env SOURCE_DATE_EPOCH=1791841113 python3 -B tools/qualification/install/build-isolated.py --family debian --run-id fresh-8fb6f413179b-01-deb-b --console-build /run/media/kmosoti/data/FabricO11y/results/console-fresh-8fb6f413179b-01-b
  1. fresh-8fb6f413179b-01-deb-image-negative-01 — Observe exact forged-image ValueError in shared guard, no cmp, wrapper exit0.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-deb-image-negative-01 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/guard-deb-reproducibility.py --negative-control
  1. fresh-8fb6f413179b-01-deb-compare-01 — Require actual matched image and receipt/operand inputs, record cmp_argv and raw cmp exit0.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-deb-compare-01 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/guard-deb-reproducibility.py
  1. fresh-8fb6f413179b-01-rpm-a — RPM metadata execution A from the same canonical validated DEB A receipt.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-rpm-a 1073741824 python3 -B tools/packaging/build_candidate_rpm.py --deb-receipt /run/media/kmosoti/data/FabricO11y/results/installation-package-build/fresh-8fb6f413179b-01-deb-a/receipt.json --out /run/media/kmosoti/data/FabricO11y/results/packages/fresh-8fb6f413179b-01-rpm-a
  1. fresh-8fb6f413179b-01-rpm-b — RPM metadata execution B from the same canonical validated DEB A receipt.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-b

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-b.py fresh-8fb6f413179b-01-rpm-b 1073741824 python3 -B tools/packaging/build_candidate_rpm.py --deb-receipt /run/media/kmosoti/data/FabricO11y/results/installation-package-build/fresh-8fb6f413179b-01-deb-a/receipt.json --out /run/media/kmosoti/data/FabricO11y/results/packages/fresh-8fb6f413179b-01-rpm-b
  1. fresh-8fb6f413179b-01-rpm-diff — Require equal RPM bytes for two executions from receipt A.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-rpm-diff 1073741824 cmp /run/media/kmosoti/data/FabricO11y/results/packages/fresh-8fb6f413179b-01-rpm-a/fabrico11y-0.1.0-0.alpha.1.x86_64.rpm /run/media/kmosoti/data/FabricO11y/results/packages/fresh-8fb6f413179b-01-rpm-b/fabrico11y-0.1.0-0.alpha.1.x86_64.rpm
  1. fresh-8fb6f413179b-01-negative-console-binding — Inspector actual in-process exit2 with b-matching-console-receipt mismatch, wrapper exit0.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-negative-console-binding 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/negative-console-binding.py
  1. fresh-8fb6f413179b-01-package-inspect — Final artifact inspection including both guarded DEB reports and stopped outer receipts, exit0.

Working directory: /run/media/kmosoti/data/FabricO11y/scratch/candidate-build-fresh-8fb6f413179b-01-a

python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/run-step-a.py fresh-8fb6f413179b-01-package-inspect 1073741824 python3 -B /run/media/kmosoti/data/FabricO11y/results/candidate-build-fresh-8fb6f413179b-01/inspect-candidate.py package-inspection.json

Cleanup conditions: --hardlink-controls requires exit0 and all five named observations true: two_owned_links_removed, outside_link_rejected_before_deletion, changed_identity_rejected_before_deletion, moved_root_rejected_before_deletion, descendant_mount_rejected. Moved-root case preserves original and replacement markers plus original hardlink fixture files, with zero removed paths/bytes before refusal. All fixtures are tiny, synthetic, launcher-owned disk scratch; no actual target deletion by these controls.

During actual main() the marker wrapper configures raising stubs for inventory/remove_tree, raw os.unlink/remove/rmdir/rename/replace and every mkdir except a modeled EEXIST for the exact already-existing canonical owned DATA root, write-mode builtins.open/io.open (including Path.open/write_text/write_bytes), and write-capable os.open; required reads remain available. Its report write occurs outside these stubs. Marker wrapper requires exactly three distinct one-field corruptions (frozen, side, path), observed main() return1, its exact actual validated cgroup banner, and exact CONSOLE-TARGET-MARKER-BINDING diagnostic, unchanged target-marker hashes, no inventory and intercepted inventory/deletion boundaries. It exits0 only when every rejection is detected. This is an in-process entry-point control; no subprocess exit is fabricated.

Actual cleanup requires console A/B and dist-diff outer exit0/confirmed stopped, the successful stopped dry-run, and no other active fabric unit; target marker SHA256 A=d0006b9f933cb63a8e94ea3b5a398a815260c7948ee0836931c77156d1f6e129, B=4b10e6bd2949d6ade3faec9bde46e2c4a39a9995cafe311f15403e040f85e60c. Actual cleanup admits only the exact marker-owned fresh console targets. Each marker is a regular single-link owner-UID1000 mode0600 file, schema fabric-console-target-v1, exact frozen commit/run/side/absolute target path and integer uid1000; symlink ancestors refuse. Before first unlink it compares the entire current entry set/identity/hash inventory with the immutable dry-run inventory, checks complete hardlink accounting across both trees, canonical held-root identity, owner UID, same-device membership and no target/descendant mounts in /proc/self/mountinfo. Every member is rechecked through no-follow held FDs. Only own unlink link/ctime transitions update sibling expectations; outside hardlinks, unaccounted changes, extra/missing entries and mountpoints refuse. Root identity is checked before any member deletion and again before marker removal. Sources, console distributions, receipts, failures and all other cache paths are protected. Fenn independently reviewed the earlier root/marker correction; Fenn also independently rereviewed the current mount guard and marker wrapper at their published hashes with no actionable static finding. No controls or deletion ran during those reviews.

DEB guard receipt paths are fixed to:

  • /run/media/kmosoti/data/FabricO11y/results/installation-package-build/fresh-8fb6f413179b-01-deb-a/receipt.json.
  • /run/media/kmosoti/data/FabricO11y/results/installation-package-build/fresh-8fb6f413179b-01-deb-b/receipt.json.

Both actual receipts require state=built and a resolved image_digest matching ^docker\.io/library/debian@sha256:[0-9a-f]{64}$, equal A/B. The image_tag_resolved field is the constant input tag, not evidence that the tag was resolved; only actual image_digest establishes image identity. All toolchain/registry/build inputs must match. Semantic source equality requires original_head, source_date_epoch, source_commit, source_tree, every source_files hash/size, and source_diff_sha256. Each side independently requires actual manifest SHA256/content equality to its source receipt, actual bundle SHA256 integrity, and an intact empty source-diff.patch. Bundle and manifest A/B hashes are recorded with equality flags; differing pack bytes alone do not reject equal source content. Each receipt package path equals its fixed operand; SHA256 is checked at admission and again immediately before cmp. Any mismatch exits nonzero and stops before RPM construction. Normal report records exact cmp_argv, raw stdout/stderr/exit and unchanged original receipt/package hashes.

Only after the guard admits those same operands does it execute:

cmp '/run/media/kmosoti/data/FabricO11y/results/installation-package-build/fresh-8fb6f413179b-01-deb-a/fabrico11y_0.1.0~alpha.1_amd64.deb' '/run/media/kmosoti/data/FabricO11y/results/installation-package-build/fresh-8fb6f413179b-01-deb-b/fabrico11y_0.1.0~alpha.1_amd64.deb'

The literal forged-image negative uses the same guard function and requires exact observed ValueError image_digest mismatch; no reproducibility verdict, cmp_invoked:false and untouched original receipts/packages. This is function-level detection, not an invented subprocess exit.

Final inspector reads deb-reproducibility-01.json and deb-reproducibility-negative-control-01.json from META, requires their current script/original receipt/control bindings, successful cmp on those exact operands and both matching stopped outer receipts. It independently compares actual DEB image/tool/source inputs and artifact/payload hashes. It never looks for the obsolete deb-diff receipt. The false-console-binding control still requires inspector exit2 and exact B binding rejection, with A binding success and all six original receipts unchanged.

Completion output includes actual package/binary SHA256, dependency floors/ELF GLIBC<=2.34, PNG timelessness, console dist/payload comparisons, static-file equality, minimized snapshot semantic identity and per-side manifest/bundle integrity, both tool/image/registry input bindings, source cleanliness and cleanup receipts. CANDIDATE-PROVENANCE.json exact bytes/hash and package inspection remain private under META until report publication; packages remain private until #48.

Both RPM executions deliberately use the complete canonical DEB(A) receipt. This supports two RPM executions from one canonical receipt; it does not claim independent Fedora compilation or source-only reproduction from differing receipts. Preserve this #47 limitation. No build/snapshot/receipt identity is borrowed from older candidates.

All final results go to a pinned wiki report; #40 receives its pointer and hashes. This amended plan documents only completed console/tool steps and prospective remaining work.