Record portable ordinary-text integration gate evidence

This commit is contained in:
2026-09-13 07:31:29 -07:00
parent f714a25bbc
commit 7836a93edb
6 changed files with 1114 additions and 0 deletions
@@ -0,0 +1,66 @@
# Ordinary-text union: subsequent gates
Closed automated-gates checkpoint. Preserve the separately published initial evidence package
at `../ordinary-text-integration-20260913/`.
Run `python verify.py` with Python 3.10 or newer. Verification uses only these
five files and the standard library: no archived code execution, extraction,
network, Git, Cargo, binaries or original-machine paths. All outer text files
are UTF-8 with LF before hashing. Raw ZIP contents retain original bytes.
`files.json` pins the archive, manifest, verifier and README; the manifest pins
each member and maps each capture to exact source inventory/archive objects.
Only byte-identical objects are deduplicated, including ZIP timestamps.
| Capture | Outcome |
| --- | --- |
| desktop-list-1 | 1,185 actual listed test names |
| core-2 | 537 passed, 0 failed, 1 ignored |
| desktop-1 | 1,179 passed, 0 failed, 6 ignored |
| clippy-1 | Failed items_after_test_module lint; raw logs retained |
| clippy-2 | Failed unused SymbolEvent::Close lint; raw logs retained |
| clippy-3 | Passed strict workspace/all-target lint |
| desktop-affected-2 | 83 passed, 0 failed, 1 known ignored, 1,101 filtered |
| windows-build-1 | Workspace binaries built successfully; 3 binary artifact receipts |
The full suites use the e624d5b9c4f848eff3fba2ed83f9decf959e14d8 input
state. The final lint inputs include the reviewed four-file fix committed as
f714a25bbcd435941404104ad0cbb0fea3b89149. That change moves test-only
helpers, removes the unconstructed Close variant and its handler, and changes
existing tests to send the captured HideDrawer event already used by production
UI. `fullSuiteToFinalInputChanges` records the exact four file/digest pairs.
Per-run source inventories are authoritative; receipt HEADs can predate dirty
changes. Full-suite outcomes are scoped to their recorded inputs; they are not
a full-suite rerun of the later fix. The final affected-test recheck uses the
same 707 input hashes as clippy-3. Its 84 names equal the OR-filter selection
from the prior 1,185-name listing: `source_symbols::tests`, `text_workspace::`,
`views::tests`, `palette_union`. All 83 enabled selected tests passed; the
known ignored case is the source-symbol 100-module performance probe. This
check introduces no test names and leaves 1,101 previous tests unexecuted on
the final source state.
The final Windows build uses those same 707 input hashes. Its three binary
artifact records are preserved; the binaries themselves are not in this package.
Verification checks archive membership/hashes, nested source manifests and all
707 inputs including 71 vendored iced_widget files, receipt relationships,
helper identity, commands, outcomes, exact test summary rows, and artifact
receipt records. It independently recomputes actual desktop names/outcomes,
listing/execution equality, all 150 required matches (144 passed, 6 ignored),
removed/retained names, and 24 original checklist Git blob bindings from archived
source bytes. It checks the full-suite-to-final four-file input delta. The
checklist's original pending-listing wording is preserved as raw historical
input; desktop-admission.json records the completed admission.
`final-input-commit-readback.json` is a secondary parent-produced summary of
comparison between all 707 final lint inputs and f714a25 committed blobs. Its
helper and Git stream were not archived. Verification checks its relationship
to the captured input manifest; it does not independently reproduce the Git
comparison or authenticate that commit.
Integrity and internal consistency do not establish independent reproduction or
authenticated provenance. Expected summary rows are frozen from raw logs.
Ignored probes did not execute. Test membership/pass outcomes do not establish
complete requirement coverage or native GUI acceptance. Compiler artifact hashes
are retained as observations; binaries are intentionally absent and cannot be
verified here. Source archives are not a hermetic compiler/dependency bundle.
This package makes no native interaction, release publication or packaged-build
claim. No credentials, dependency caches or whole user profile are included.
@@ -0,0 +1,18 @@
{
"evidence.zip": {
"bytes": 8624040,
"sha256": "b0da6611dd86e83c8f779c025786e473834298f9b9990b19a76b250b61137780"
},
"manifest.json": {
"bytes": 19056,
"sha256": "752d4c8e703cdbac361f959716a8a752096280727f9f0c966854d479aa68750d"
},
"verify.py": {
"bytes": 12815,
"sha256": "5157b5cadf38e59bd59693fe1d14235d2007788bb6c8bd9cbac938cb048b14f4"
},
"README.md": {
"bytes": 4177,
"sha256": "9bfafd6506d1eb322e6efb8070a1599766d6d09532a678251a8b2414387edc6e"
}
}
@@ -0,0 +1,819 @@
{
"schema": 1,
"fullSuiteInputsCommit": "e624d5b9c4f848eff3fba2ed83f9decf959e14d8",
"reviewedFixCommit": "f714a25bbcd435941404104ad0cbb0fea3b89149",
"runs": {
"desktop-list-1": {
"kind": "cargo",
"inputs": "inputs/bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48.json",
"archive": "inputs/86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1.zip",
"command": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-desktop",
"--bin",
"arcadia-studio",
"--message-format=json",
"--",
"--list"
],
"head": "e624d5b9c4f848eff3fba2ed83f9decf959e14d8",
"exitCode": 0,
"inputCount": 707,
"testRows": [],
"testTotals": [
0,
0,
0,
0,
0
]
},
"core-2": {
"kind": "cargo",
"inputs": "inputs/bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48.json",
"archive": "inputs/86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1.zip",
"command": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-core",
"--no-fail-fast",
"--message-format=json",
"--",
"--nocapture"
],
"head": "cb941367d7748f7bfe7dda53641d395ad60a499f",
"exitCode": 0,
"inputCount": 707,
"testRows": [
[
102,
0,
0,
0,
0
],
[
3,
0,
0,
0,
0
],
[
9,
0,
0,
0,
0
],
[
6,
0,
0,
0,
0
],
[
10,
0,
0,
0,
0
],
[
9,
0,
0,
0,
0
],
[
6,
0,
0,
0,
0
],
[
11,
0,
0,
0,
0
],
[
6,
0,
0,
0,
0
],
[
16,
0,
0,
0,
0
],
[
13,
0,
0,
0,
0
],
[
8,
0,
0,
0,
0
],
[
3,
0,
0,
0,
0
],
[
7,
0,
0,
0,
0
],
[
1,
0,
0,
0,
0
],
[
8,
0,
0,
0,
0
],
[
5,
0,
0,
0,
0
],
[
35,
0,
0,
0,
0
],
[
7,
0,
0,
0,
0
],
[
15,
0,
1,
0,
0
],
[
7,
0,
0,
0,
0
],
[
5,
0,
0,
0,
0
],
[
4,
0,
0,
0,
0
],
[
7,
0,
0,
0,
0
],
[
4,
0,
0,
0,
0
],
[
4,
0,
0,
0,
0
],
[
13,
0,
0,
0,
0
],
[
13,
0,
0,
0,
0
],
[
14,
0,
0,
0,
0
],
[
11,
0,
0,
0,
0
],
[
6,
0,
0,
0,
0
],
[
15,
0,
0,
0,
0
],
[
5,
0,
0,
0,
0
],
[
18,
0,
0,
0,
0
],
[
2,
0,
0,
0,
0
],
[
2,
0,
0,
0,
0
],
[
4,
0,
0,
0,
0
],
[
8,
0,
0,
0,
0
],
[
16,
0,
0,
0,
0
],
[
10,
0,
0,
0,
0
],
[
3,
0,
0,
0,
0
],
[
12,
0,
0,
0,
0
],
[
33,
0,
0,
0,
0
],
[
13,
0,
0,
0,
0
],
[
28,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0
]
],
"testTotals": [
537,
0,
1,
0,
0
]
},
"desktop-1": {
"kind": "cargo",
"inputs": "inputs/bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48.json",
"archive": "inputs/86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1.zip",
"command": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-desktop",
"--bin",
"arcadia-studio",
"--no-fail-fast",
"--message-format=json",
"--",
"--nocapture"
],
"head": "cb941367d7748f7bfe7dda53641d395ad60a499f",
"exitCode": 0,
"inputCount": 707,
"testRows": [
[
1179,
0,
6,
0,
0
]
],
"testTotals": [
1179,
0,
6,
0,
0
]
},
"clippy-1": {
"kind": "cargo",
"inputs": "inputs/bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48.json",
"archive": "inputs/86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1.zip",
"command": [
"cargo",
"clippy",
"--locked",
"--offline",
"--workspace",
"--all-targets",
"--message-format=json",
"--",
"-D",
"warnings"
],
"head": "cb941367d7748f7bfe7dda53641d395ad60a499f",
"exitCode": 101,
"inputCount": 707,
"testRows": [],
"testTotals": [
0,
0,
0,
0,
0
]
},
"clippy-2": {
"kind": "cargo",
"inputs": "inputs/6b2c2925c732b79150b1d3c2f9dc215f9221b89796bb1d8668d3ecc138095f82.json",
"archive": "inputs/c5080fa78cb5cac2c6bdbf53f00d9d19313fa08de351153b9c5babd3a55b2f7d.zip",
"command": [
"cargo",
"clippy",
"--locked",
"--offline",
"--workspace",
"--all-targets",
"--message-format=json",
"--",
"-D",
"warnings"
],
"head": "cb941367d7748f7bfe7dda53641d395ad60a499f",
"exitCode": 101,
"inputCount": 707,
"testRows": [],
"testTotals": [
0,
0,
0,
0,
0
]
},
"clippy-3": {
"kind": "cargo",
"inputs": "inputs/a36e2cbc29eb7a9217774464cda9da8aa1d3c39caae9b9aacd6cdb28df5bad95.json",
"archive": "inputs/9346fba1be9bf4dd2225fe9965fd76a30429f086fd6a101f92d0963d3822f71c.zip",
"command": [
"cargo",
"clippy",
"--locked",
"--offline",
"--workspace",
"--all-targets",
"--message-format=json",
"--",
"-D",
"warnings"
],
"head": "cb941367d7748f7bfe7dda53641d395ad60a499f",
"exitCode": 0,
"inputCount": 707,
"testRows": [],
"testTotals": [
0,
0,
0,
0,
0
]
},
"desktop-affected-2": {
"kind": "cargo",
"inputs": "inputs/a36e2cbc29eb7a9217774464cda9da8aa1d3c39caae9b9aacd6cdb28df5bad95.json",
"archive": "inputs/9346fba1be9bf4dd2225fe9965fd76a30429f086fd6a101f92d0963d3822f71c.zip",
"command": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-desktop",
"--bin",
"arcadia-studio",
"--message-format=json",
"--",
"source_symbols::tests",
"text_workspace::",
"views::tests",
"palette_union",
"--nocapture"
],
"head": "f714a25bbcd435941404104ad0cbb0fea3b89149",
"exitCode": 0,
"inputCount": 707,
"testRows": [
[
83,
0,
1,
0,
1101
]
],
"testTotals": [
83,
0,
1,
0,
1101
]
},
"windows-build-1": {
"kind": "cargo",
"inputs": "inputs/a36e2cbc29eb7a9217774464cda9da8aa1d3c39caae9b9aacd6cdb28df5bad95.json",
"archive": "inputs/9346fba1be9bf4dd2225fe9965fd76a30429f086fd6a101f92d0963d3822f71c.zip",
"command": [
"cargo",
"build",
"--locked",
"--offline",
"--workspace",
"--bins",
"--message-format=json"
],
"head": "f714a25bbcd435941404104ad0cbb0fea3b89149",
"exitCode": 0,
"inputCount": 707,
"testRows": [],
"testTotals": [
0,
0,
0,
0,
0
]
}
},
"members": {
"helpers/desktop-admission.json": {
"bytes": 289720,
"sha256": "af2d601032f1f98217d841d181255dda5e123f48078f8d09815b498ee8975eb9"
},
"helpers/final-input-commit-readback.json": {
"bytes": 260,
"sha256": "9670f7400e358c5033b09ae4388cf577fb3db3f288a51d7ffe7b47c87bc377c0"
},
"helpers/gate-union.py": {
"bytes": 3495,
"sha256": "9cca2646b1bcf09961a9ad1a276d633d8e4296ff2c6f2f356f028afaf789f503"
},
"helpers/required-desktop-tests.json": {
"bytes": 125261,
"sha256": "6672e3f7ccfb92b7710310836af6933a8e58ef113353505ec4fc0c3d6908c136"
},
"inputs/6b2c2925c732b79150b1d3c2f9dc215f9221b89796bb1d8668d3ecc138095f82.json": {
"bytes": 118403,
"sha256": "6b2c2925c732b79150b1d3c2f9dc215f9221b89796bb1d8668d3ecc138095f82"
},
"inputs/86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1.zip": {
"bytes": 2831327,
"sha256": "86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1"
},
"inputs/9346fba1be9bf4dd2225fe9965fd76a30429f086fd6a101f92d0963d3822f71c.zip": {
"bytes": 2831326,
"sha256": "9346fba1be9bf4dd2225fe9965fd76a30429f086fd6a101f92d0963d3822f71c"
},
"inputs/a36e2cbc29eb7a9217774464cda9da8aa1d3c39caae9b9aacd6cdb28df5bad95.json": {
"bytes": 118403,
"sha256": "a36e2cbc29eb7a9217774464cda9da8aa1d3c39caae9b9aacd6cdb28df5bad95"
},
"inputs/bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48.json": {
"bytes": 118403,
"sha256": "bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48"
},
"inputs/c5080fa78cb5cac2c6bdbf53f00d9d19313fa08de351153b9c5babd3a55b2f7d.zip": {
"bytes": 2831320,
"sha256": "c5080fa78cb5cac2c6bdbf53f00d9d19313fa08de351153b9c5babd3a55b2f7d"
},
"runs/clippy-1/process.json": {
"bytes": 199,
"sha256": "1af72ef6a92af65144a1faea8cae4f5c868799894bf539385b8f40912b0b50ae"
},
"runs/clippy-1/result.json": {
"bytes": 1799,
"sha256": "355929311a614bfd682e9dc47fa1afef98e14b22f76c856771564b9eb282af57"
},
"runs/clippy-1/started.json": {
"bytes": 1400,
"sha256": "4671c110e5e26a34e48470b0002322fc450b3844ee849f90ae6523091528ece1"
},
"runs/clippy-1/stderr.log": {
"bytes": 1368,
"sha256": "741e0cd2a2418cdb748703cf02cc72064e5b88b123a6fdacb5c6f87a2a6959c6"
},
"runs/clippy-1/stdout.log": {
"bytes": 272957,
"sha256": "37c21ea32cba74fbb54bc9e9f962fc7dfd5c018ac7f3750c2ae905e7cb51a542"
},
"runs/clippy-2/process.json": {
"bytes": 199,
"sha256": "6d11bf41b9461e19f6a06b64841ef1fa30c5129de4a4dad215866fc14c8f29d1"
},
"runs/clippy-2/result.json": {
"bytes": 1797,
"sha256": "0583fa653d2b2be928250b1845d2eec36886a5ea1dc12013ea853b68a79fe4be"
},
"runs/clippy-2/started.json": {
"bytes": 1400,
"sha256": "9d290135f4125ac119601b2704f1ac9b03ec5800a80624155ead21a35e7a4ec6"
},
"runs/clippy-2/stderr.log": {
"bytes": 155,
"sha256": "93a6965e0904eb30abe0657f4a9c30b5ba9e148c9d5274b3c3fb5e78d898c562"
},
"runs/clippy-2/stdout.log": {
"bytes": 270250,
"sha256": "bdc2338aab9fc18fb4e29fbb9e9192ccf9b67e1e9fb2cca828ec50acc90c1437"
},
"runs/clippy-3/process.json": {
"bytes": 199,
"sha256": "0d3a92e71ae9b33b703479a54fd1ca2491b67c1374b1a1e259816eebea9bb3b0"
},
"runs/clippy-3/result.json": {
"bytes": 1796,
"sha256": "cf49e16fa5cbecacf24edbf054036b1190a02771c61f1178c12c6f3d7d9477b0"
},
"runs/clippy-3/started.json": {
"bytes": 1400,
"sha256": "5499895565380e2efb1ccf6a9acc825318dfe09135815adf9512bf50530524a5"
},
"runs/clippy-3/stderr.log": {
"bytes": 325,
"sha256": "d2811192fb769c1a0f2e4258dd31c76f6a475e43bc6214e49db7c0757e7dad00"
},
"runs/clippy-3/stdout.log": {
"bytes": 307989,
"sha256": "319cad11af00c742a1436734b5daee273a112859c7775b06fada1948d54e93d6"
},
"runs/core-2/process.json": {
"bytes": 197,
"sha256": "50d3c62701417b7cf49de72139a71d5b26ede0ebec36eac6ecc254cf45f1594a"
},
"runs/core-2/result.json": {
"bytes": 67027,
"sha256": "2eb69042c0c6eecb89b11e739b9598005b8a26479564d299275817310011b5bb"
},
"runs/core-2/started.json": {
"bytes": 1398,
"sha256": "eadc9d64a5fedc1bea614c2ccae4d19616e2f7b0538bc5e08e84e9ee92f532e0"
},
"runs/core-2/stderr.log": {
"bytes": 8930,
"sha256": "0d5a5d2a4e64bd38c89fffafd8089de7b74a52f1dbbccb8cc59dae640bebba3b"
},
"runs/core-2/stdout.log": {
"bytes": 131042,
"sha256": "4185a25e52e52f3c6ee1dcd942a45e1a3ef57b3961ec7e7c4ca0aacc86967cfc"
},
"runs/desktop-1/process.json": {
"bytes": 227,
"sha256": "38ff4960fbcdf8282c8fc323a337b25f19b1ab424d7ed590917e6765f8a643c1"
},
"runs/desktop-1/result.json": {
"bytes": 3154,
"sha256": "f254ec40b83763f1398ab96fff16d96c9a0ff8a3113c2d16556c973eb5eaf93e"
},
"runs/desktop-1/started.json": {
"bytes": 1438,
"sha256": "ba43fbd949da1d6e453217c2f534d661b81dbe4b42fc1fe198c811234dc48aaf"
},
"runs/desktop-1/stderr.log": {
"bytes": 552,
"sha256": "c975782e7df7ce13b9f298d164fd4cc8e8161b6da7fd77c4607920fd8b3bf900"
},
"runs/desktop-1/stdout.log": {
"bytes": 430091,
"sha256": "1bfcc88362ef725cb3e4b9af7967d4bd18e65db3eccd342fe3264ea6ef95ec19"
},
"runs/desktop-affected-2/process.json": {
"bytes": 287,
"sha256": "b72fb9ac1c7400ef7af2ed80f26a1e13fc718342779c868e4cbad4a5152b131f"
},
"runs/desktop-affected-2/result.json": {
"bytes": 3228,
"sha256": "cfb3f9563f35977efe26d69d6a12040278f725bf09fb30ec812a984cab72dc02"
},
"runs/desktop-affected-2/started.json": {
"bytes": 1513,
"sha256": "cca30f43f1d79c10a996422f9a506a08fc91eba7fc15a02615105f7fed89a20a"
},
"runs/desktop-affected-2/stderr.log": {
"bytes": 281,
"sha256": "90504f37b7256fd61af78a6c636560b3646ec9bdb2bc954c6e5bc77f69f21306"
},
"runs/desktop-affected-2/stdout.log": {
"bytes": 304036,
"sha256": "adf50044a9f6947e7384dbd0193fe069276c2e78da1d6c45a55150d2b1defa26"
},
"runs/desktop-list-1/process.json": {
"bytes": 204,
"sha256": "139e8f5d11f45dd2b6d2151e0b0628d892f3ad228134032ab8c9bfb1989059db"
},
"runs/desktop-list-1/result.json": {
"bytes": 3128,
"sha256": "24eacbb644a6b82be7439e4f8895562356eb63485e82c30292b2951cb090d29d"
},
"runs/desktop-list-1/started.json": {
"bytes": 1410,
"sha256": "33adc56c5fad5bd53dd425f5c6ccf8faf550bd382867b848d04ebaafcb3d5c66"
},
"runs/desktop-list-1/stderr.log": {
"bytes": 1427,
"sha256": "97885faf304979ca43898f88d3ca7118100fd1c2358f9d4729984f7369788704"
},
"runs/desktop-list-1/stdout.log": {
"bytes": 421428,
"sha256": "32f0025d9205288e92c4031dc1b53298b8e79f1ccb8ce990a40d7c3d66f4305f"
},
"runs/windows-build-1/process.json": {
"bytes": 167,
"sha256": "b400c1f8076bcddb583424fe34d155655a41d25b5ccf0db8af26bda6b9b2685e"
},
"runs/windows-build-1/result.json": {
"bytes": 5532,
"sha256": "5e9e227c66a4b71ade734b8ebeb12070b8a5c64a9a6cf9d8d0b6d70379d4ffc2"
},
"runs/windows-build-1/started.json": {
"bytes": 1353,
"sha256": "15c54be09a881e6860735395569b22a7a9114789a1f8276cf79bc6fb095c8163"
},
"runs/windows-build-1/stderr.log": {
"bytes": 261,
"sha256": "480dff999944c756fff581db0f3fac088717e0d73cae20af9a28829446df746f"
},
"runs/windows-build-1/stdout.log": {
"bytes": 295092,
"sha256": "5a824ca91877328acd332585b39194b27fd2cb167279b99c4c78a89bf13bd19b"
}
},
"fullSuiteToFinalInputChanges": {
"crates/oa-desktop/src/app/source_symbols.rs": {
"before": {
"bytes": 26476,
"sha256": "230b2d19b0aeb767a311bdc0eddfd69986ebc5f65b8892382cd033a69f86cb2d"
},
"after": {
"bytes": 26369,
"sha256": "9dbcb70a7eaa0b2f7ec011da1fcc808ba1e53ec1c29a3c9a09cf7517e058c7b7"
}
},
"crates/oa-desktop/src/app/source_symbols/tests.rs": {
"before": {
"bytes": 85389,
"sha256": "0e3ae6861ded52e7d137736f4ffe6bf55a00291bf685d3bbe6141174210eee9c"
},
"after": {
"bytes": 85506,
"sha256": "aebd05f3fa9f1e9c2e744948d4478d9f267365d063f01f8b8f4e67560bc23f32"
}
},
"crates/oa-desktop/src/source_navigation/controller.rs": {
"before": {
"bytes": 3691,
"sha256": "2042d608a4e9698c614c0d308d02896983480087908ecc353369b424eca3d124"
},
"after": {
"bytes": 3680,
"sha256": "938b8264c2d5166bd979439723d6fbec34c4cc5ed7f872f58c2cb9ba06a4a93d"
}
},
"crates/oa-desktop/src/views.rs": {
"before": {
"bytes": 58364,
"sha256": "46bb9410567d47e3043723fc3b8c7342c04e85b1b4a4c06a84e8497757cc04dc"
},
"after": {
"bytes": 58364,
"sha256": "e74da124914a54a3b757eb4728a5093157f172cd7f5e90b7744e526e3ec3f8d2"
}
}
}
}
@@ -0,0 +1,169 @@
"""Read-only, Python-standard-library verification. Never executes archived code."""
from pathlib import Path, PurePosixPath
from datetime import datetime
import hashlib
import io
import json
import re
import zipfile
ROOT = Path(__file__).resolve().parent
def require(ok, message):
if not ok:
raise ValueError(message)
def digest(data):
return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
def members(z, expected):
names = z.namelist()
require(len(names) == len(set(names)), 'duplicate ZIP members')
require(set(names) == set(expected), 'archive membership mismatch')
require(all(not PurePosixPath(n).is_absolute() and '..' not in PurePosixPath(n).parts
and '\\' not in n and ':' not in n for n in names), 'unsafe member')
def main():
inventory = json.loads((ROOT / 'files.json').read_text())
for name, expected in inventory.items():
require(digest((ROOT / name).read_bytes()) == expected, 'external file hash: ' + name)
manifest = json.loads((ROOT / 'manifest.json').read_text())
with zipfile.ZipFile(ROOT / 'evidence.zip') as z:
members(z, manifest['members'])
for name, expected in manifest['members'].items():
require(digest(z.read(name)) == expected, 'member hash: ' + name)
def raw(name): return z.read(name)
def obj(name): return json.loads(raw(name))
checked = set()
for run, spec in manifest['runs'].items():
if spec['kind'] != 'cargo':
continue
prefix = 'runs/' + run + '/'
start, result, process = (obj(prefix + n + '.json') for n in ('started', 'result', 'process'))
require(all(result[k] == v for k, v in start.items()), run + ': start/result relationship')
require(result['command'] == spec['command'] == process['command'], run + ': command')
require(result['head'] == spec['head'], run + ': HEAD')
require(result['exitCode'] == spec['exitCode'] and result['inputsUnchanged'] is True, run + ': outcome')
require(datetime.fromisoformat(result['finish']) >= datetime.fromisoformat(start['start']), run + ': times')
require(result['seconds'] >= 0, run + ': duration')
require(result['helper'] == digest(raw('helpers/gate-union.py')), run + ': helper')
for field, file in [('inputs', spec['inputs']), ('archive', spec['archive']), ('stdout', prefix+'stdout.log'), ('stderr', prefix+'stderr.log')]:
require(result[field] == digest(raw(file)), run + ': receipt ' + field)
inputs = obj(spec['inputs'])
require(len(inputs) == result['inputCount'] == spec['inputCount'] == 707, run + ': input count')
require(sum(p.startswith('crates/vendor/iced_widget/') for p in inputs) == 71, run + ': vendor count')
pair = (spec['inputs'], spec['archive'])
if pair not in checked:
with zipfile.ZipFile(io.BytesIO(raw(spec['archive']))) as source:
members(source, inputs)
for name, expected in inputs.items():
require(digest(source.read(name)) == expected, run + ': source hash ' + name)
checked.add(pair)
stdout = raw(prefix+'stdout.log').decode('utf-8', errors='replace')
rows = [[int(x) for x in row] for row in re.findall(r'test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out;', stdout)]
require(rows == spec['testRows'], run + ': exact test summaries')
require([sum(row[i] for row in rows) for i in range(5)] == spec['testTotals'], run + ': test totals')
artifacts = []
for line in stdout.splitlines():
try: item = json.loads(line)
except json.JSONDecodeError: continue
if isinstance(item, dict) and item.get('reason') == 'compiler-artifact' and item.get('executable'):
artifacts.append(item)
require(artifacts == [a['cargo'] for a in result['artifacts']], run + ': artifact receipt relationship')
print(run, 'exit', result['exitCode'], 'test totals', spec['testTotals'])
admission(z, manifest)
print('PASS:', len(manifest['runs']), 'closed captures;', len(manifest['members']), 'members;', len(checked), 'input manifest/archive pairs')
print('Integrity and recorded outcomes only; no rerun, binary verification, or native GUI claim.')
def admission(z, manifest):
def obj(p): return json.loads(z.read(p))
report = obj('helpers/desktop-admission.json')
checklist = obj('helpers/required-desktop-tests.json')
require(report['status'] == 'PASS', 'admission status')
require({k:report['checklist'][k] for k in ('bytes','sha256')} == digest(z.read('helpers/required-desktop-tests.json')), 'checklist receipt')
require(report['checklist']['sourceCommit'] == checklist['sourceCommit'], 'checklist source pin')
for run, receipt in report['runs'].items():
result = obj('runs/'+run+'/result.json')
for field in ('head','command','exitCode','inputsUnchanged','inputCount'):
require(receipt[field] == result[field], 'admission run relationship '+field)
require(receipt['inputManifest'] == result['inputs'] and receipt['stdout'] == result['stdout'], 'admission inputs/log')
require(receipt['resultReceipt'] == digest(z.read('runs/'+run+'/result.json')), 'admission result hash')
listing = z.read('runs/desktop-list-1/stdout.log').decode('utf-8')
execution = z.read('runs/desktop-1/stdout.log').decode('utf-8')
names = re.findall(r'^([A-Za-z0-9_:]+): test$', listing, re.M)
outcomes = re.findall(r'^test ([A-Za-z0-9_:]+) \.\.\. (ok|FAILED|ignored)(?:, (.*))?$', execution, re.M)
require(len(names) == len(set(names)) == 1185, 'listing names/count/uniqueness')
require(len(outcomes) == len({r[0] for r in outcomes}) == 1185, 'execution names/count/uniqueness')
require(set(names) == {r[0] for r in outcomes}, 'listing/execution set equality')
actual = {n:(status, reason or None) for n,status,reason in outcomes}
require(actual == {r['name']:(r['status'],r['reason']) for r in report['allActualNamesAndOutcomes']}, 'admission raw outcomes')
require(len(report['allActualNamesAndOutcomes']) == len(actual), 'admission duplicate outcomes')
required = []
for spec in checklist['required']:
matches = [n for n in names if n.endswith(spec['match']['suffix'])]
require(len(matches) == spec['match']['expectedOccurrences'] == 1, 'required unique match '+spec['name'])
n = matches[0]
require(actual[n][0] == ('ignored' if spec['expectedIgnored'] else 'ok'), 'required outcome '+n)
required.append({'sourcePath':spec['sourcePath'],'expectedBasename':spec['name'],'actualName':n,'expectedIgnored':spec['expectedIgnored'],'status':actual[n][0],'reason':actual[n][1]})
require(required == report['requiredOutcomes'], 'required admission relationships')
removed=[]
for spec in checklist['removedOrReplaced']:
require(not any(n.endswith('::'+spec['name']) for n in names), 'removed test present')
replacements=[n for replacement in spec.get('replacementNames',[]) for n in names if n.endswith('::'+replacement)]
removed.append({'name':spec['name'],'absent':True,'replacementActualNames':replacements})
require(removed == report['removedOrReplaced'], 'removed admission relationship')
retained=[]
for spec in checklist['duplicateDeparture']:
require(actual[spec['requiredFullName']][0] == 'ok' and spec['removedFullName'] not in names, 'retained duplicate admission')
require(sum(n.endswith('::'+spec['name']) for n in names) == spec['expectedTotalOccurrences'] == 1, 'retained duplicate count')
retained.append({'name':spec['name'],'retainedName':spec['requiredFullName'],'retainedStatus':'ok','removedParentNameAbsent':True})
require(retained == report['retainedDepartureCases'], 'retained admission relationship')
before = obj(manifest['runs']['desktop-1']['inputs'])
require(before == obj(manifest['runs']['desktop-list-1']['inputs']), 'listing/execution source equality')
require(before == obj(manifest['runs']['core-2']['inputs']), 'core/desktop full-suite source equality')
with zipfile.ZipFile(io.BytesIO(z.read(manifest['runs']['desktop-1']['archive']))) as source:
bindings=[]
for spec in checklist['sourceBindings']:
b=source.read(spec['path'])
blob=hashlib.sha1(b'blob '+str(len(b)).encode()+b'\0'+b).hexdigest()
require(blob == spec['gitBlob'], 'original checklist source blob '+spec['path'])
bindings.append({**spec,'capturedAndCurrentDigest':digest(b),'matchesOriginalChecklistBlob':True})
require(bindings == report['sourceBindings'], 'source binding admission')
summary={'listed':len(names),'executed':len(actual),'exactNameSetEquality':True,'duplicateListedNames':0,'duplicateExecutedNames':0,
'passed':sum(v[0]=='ok' for v in actual.values()),'failed':sum(v[0]=='FAILED' for v in actual.values()),'ignored':sum(v[0]=='ignored' for v in actual.values()),
'required':len(required),'requiredPassed':sum(r['status']=='ok' for r in required),'requiredIgnored':sum(r['status']=='ignored' for r in required),
'removedNamesAbsent':len(checklist['removedOrReplaced']),'retainedDuplicateCasesPassExactlyOnce':len(checklist['duplicateDeparture']),
'originalChecklistSourceFilesVerified':len(checklist['sourceBindings']),'listingAndExecutionInputManifestsEqual':True}
require(summary == report['summary'], 'admission summary')
after = obj(manifest['runs']['clippy-3']['inputs'])
changed={p:{'before':before.get(p),'after':after.get(p)} for p in sorted(set(before)|set(after)) if before.get(p)!=after.get(p)}
require(changed == manifest['fullSuiteToFinalInputChanges'] and len(changed)==4, 'four-file source delta')
require(set(changed) == {'crates/oa-desktop/src/source_navigation/controller.rs','crates/oa-desktop/src/app/source_symbols.rs','crates/oa-desktop/src/app/source_symbols/tests.rs','crates/oa-desktop/src/views.rs'}, 'reviewed four-file scope')
readback=obj('helpers/final-input-commit-readback.json')
require(readback['status']=='PASS' and readback['commit']==manifest['reviewedFixCommit'], 'secondary readback summary')
require(readback['inputCount']==len(after) and readback['inputManifestSha256']==digest(z.read(manifest['runs']['clippy-3']['inputs']))['sha256'], 'secondary readback input relationship')
for run in ('desktop-affected-2','windows-build-1'):
if run in manifest['runs']:
require(obj(manifest['runs'][run]['inputs']) == after, run+': final source equality')
if 'windows-build-1' in manifest['runs']:
result=obj('runs/windows-build-1/result.json')
require(result['exitCode']==0 and len(result['artifacts'])==3, 'final build outcome/artifacts')
require({a['cargo']['target']['name'] for a in result['artifacts']}=={'arcadia','arcadia-server','arcadia-studio'}, 'final build target membership')
if 'desktop-affected-2' in manifest['runs']:
spec=manifest['runs']['desktop-affected-2']
args=spec['command'][spec['command'].index('--')+1:]
filters=[arg for arg in args if not arg.startswith('--')]
require(filters==['source_symbols::tests','text_workspace::','views::tests','palette_union'], 'affected OR filters')
selected={n for n in names if any(f in n for f in filters)}
log=z.read('runs/desktop-affected-2/stdout.log').decode('utf-8')
affected=re.findall(r'^test ([A-Za-z0-9_:]+) \.\.\. (ok|FAILED|ignored)(?:, (.*))?$',log,re.M)
require(len(affected)==len({r[0] for r in affected})==len(selected)==84, 'affected count/unique names')
require({n for n,s,r in affected}==selected, 'affected exact OR-filter selection from prior listing')
require(sum(s=='ok' for n,s,r in affected)==83 and sum(s=='FAILED' for n,s,r in affected)==0, 'affected enabled passes')
require([n for n,s,r in affected if s=='ignored']==['app::source_symbols::tests::source_symbols_100_modules_1000_definitions_10000_uses'], 'affected known ignored probe')
require(spec['testTotals']==[83,0,1,0,len(names)-len(selected)], 'affected summary and filtered count')
print('Affected recheck: exact prior-list OR selection; 83 passed, 1 known ignored, 1101 filtered')
print('Desktop admission:', summary['passed'], 'passed,', summary['ignored'], 'ignored;',len(required),'required; four final changed input files')
if __name__ == '__main__':
main()
@@ -101,3 +101,45 @@ receipt relationships without executing archived code or consulting this machine
The README records provenance limitations and the absence of runtime binaries.
All 707 consumer inputs were independently compared with committed Git blobs at
`e624d5b9c4f848eff3fba2ed83f9decf959e14d8` and matched exactly.
## Subsequent combined checks and lint repair
The final fixture/documentation state completed the full core suite: **537 passed,
zero failed, one existing opt-in probe ignored**. Desktop listing and execution
have exactly the same 1,185 unique names: **1,179 passed, zero failed, six existing
opt-in probes ignored**. Independent admission checked all 144 enabled critical
checklist cases, all six expected ignored cases and their reasons, five replaced
names absent, four retained departure cases present exactly once, and all 24
checklist source-file bindings. These runs use the same 707 input bytes as the
successful consumers; full listing and execution are recorded separately.
Strict all-target Clippy then exposed two integration cleanups. The first was
two unchanged test-only helper functions appearing after a test module in
`views.rs`. The second was the unused internal `SymbolEvent::Close`: production
already emits captured `TextWorkspace(Event::HideDrawer)` instead. Commit
`f714a25bbcd435941404104ad0cbb0fea3b89149` moves the helpers before the test module,
removes the obsolete event/handler, and switches four existing test sites to the
actual UI close message without weakening their assertions. Current close tests
therefore exercise document/session/visit authority and the presentation boundary;
Query/Back/Choose continue to test source-file authority. Independent review
accepted both changes. No production sender used the removed event.
Strict `cargo clippy --locked --offline --workspace --all-targets -- -D warnings`
now passes. Its captured HEAD was `cb94136` plus those four files, with all 707
inputs unchanged; exact Git-blob comparison binds those inputs to `f714a25`.
The earlier complete suites remain scoped to the preceding input state.
Affected desktop execution on `f714a25` passed: **83 passed, zero failed, one
existing manual source-navigation performance probe ignored**, with 1,101 cases
outside the selected scope. The filters cover source-symbol tests, Text workspace
tests, surrounding view tests and the palette/drawer integration cases. The
updated close assertions and both recovery-warning regressions passed. The
matching Windows GUI, CLI and server then built successfully from `f714a25` with
the same final inputs. Native acceptance remains pending at this checkpoint.
[The subsequent gate package](experiments/ordinary-text-gates-20260913/README.md)
preserves these eight closed gates, both failed lint attempts, complete listing
admission, the exact affected-test selection, and the three build artifact
receipts. Its 8,624,040-byte ZIP has SHA-256
`b0da6611dd86e83c8f779c025786e473834298f9b9990b19a76b250b61137780`.
Independent review verified all 50 stored members against raw captures, source
relationships, the safe read-only verifier, and prospective Git-clean outer bytes.