diff --git a/harness/experiments/ordinary-text-gates-20260913/README.md b/harness/experiments/ordinary-text-gates-20260913/README.md new file mode 100644 index 00000000..51f797a3 --- /dev/null +++ b/harness/experiments/ordinary-text-gates-20260913/README.md @@ -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. diff --git a/harness/experiments/ordinary-text-gates-20260913/evidence.zip b/harness/experiments/ordinary-text-gates-20260913/evidence.zip new file mode 100644 index 00000000..42747d52 Binary files /dev/null and b/harness/experiments/ordinary-text-gates-20260913/evidence.zip differ diff --git a/harness/experiments/ordinary-text-gates-20260913/files.json b/harness/experiments/ordinary-text-gates-20260913/files.json new file mode 100644 index 00000000..31697c18 --- /dev/null +++ b/harness/experiments/ordinary-text-gates-20260913/files.json @@ -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" + } +} diff --git a/harness/experiments/ordinary-text-gates-20260913/manifest.json b/harness/experiments/ordinary-text-gates-20260913/manifest.json new file mode 100644 index 00000000..8c377e75 --- /dev/null +++ b/harness/experiments/ordinary-text-gates-20260913/manifest.json @@ -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" + } + } + } +} diff --git a/harness/experiments/ordinary-text-gates-20260913/verify.py b/harness/experiments/ordinary-text-gates-20260913/verify.py new file mode 100644 index 00000000..1588c6fa --- /dev/null +++ b/harness/experiments/ordinary-text-gates-20260913/verify.py @@ -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() diff --git a/harness/ordinary-text-integration-20260913.md b/harness/ordinary-text-integration-20260913.md index 0643977a..501db0f8 100644 --- a/harness/ordinary-text-integration-20260913.md +++ b/harness/ordinary-text-integration-20260913.md @@ -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.