Record portable ordinary-text native acceptance evidence

This commit is contained in:
2026-09-13 07:38:59 -07:00
parent 7836a93edb
commit 3f9e6a18af
6 changed files with 835 additions and 1 deletions
@@ -0,0 +1,45 @@
# Ordinary-text union: native trial evidence
Run `python verify.py` with Python 3.10 or newer. These five files form a portable
read-only package. The verifier uses only the Python standard library, reads
ZIPs without extraction, and executes neither archived helpers nor binaries.
It requires no Git checkout, original machine, network, UI or dependency cache.
Outer files are UTF-8 LF before hash pins; all archived raw bytes are unchanged.
The complete closed trial-1 capture set is preserved, including small auxiliary
picker frames, extra captures, resumed-state capture, and repeated save-path
attempts. Filename numbering labels recorded observations; it is not a complete
action log and does not assert an unrecorded intermediate transition. Screenshots
and accessibility snapshots support human review; their interpretation is not
automatically proven by this verifier.
`native/independent-review.md` preserves the separate review of screenshots,
source/CLI evidence and claim boundaries. Its judgments are human-readable review
evidence, distinct from machine-verified byte and receipt relationships. Dialog
states are archived; operator/tool calls are not a complete archived action log.
Archived material includes original input, both saved bundles, all trial receipts,
logs and frames, capture/launch helpers, saved-bundle check helper and raw results.
The exact successful windows-build-1 receipts, logs, gate helper, input manifest
and 707-file input archive are included for a self-contained receipt chain.
Those build captures also appear in the gates package committed at
7836a93edb98d2f9dcbf9c0290352e38f9acbb39. The production build source is
f714a25bbcd435941404104ad0cbb0fea3b89149. Binaries are intentionally excluded;
hashes establish receipt consistency, not independent binary reproduction.
Verification checks every archive member/hash, nested source membership and
content, build and native start/result/helper relationships, GUI/CLI binary
receipt links, original input archive, capture timestamps/image references,
normal GUI exit and empty logs. It recomputes exact saved-source membership and
bytes: compact added activity and include, stable recorded IDs, and only the
intended existing diagram x coordinate changing from 120 to 190 between saved
bundles. Both CLI captures report checked status, four warnings, no writes or
changes, and zero identities to stabilize.
These are saved-byte and recorded CLI parsing/validation oracles, not a comparison
of the complete parsed models. Undo/Redo, reopening, diagnostic freshness and
navigation observations require inspecting the actual frames and review. Empty
logs and exit zero alone do not establish usability or complete acceptance.
The hashes are integrity checks, not authenticated provenance. Raw captures
retain original local path strings and timestamps; no credentials, user profile,
runtime binaries or dependency cache are packaged.
@@ -0,0 +1,18 @@
{
"evidence.zip": {
"bytes": 5704887,
"sha256": "b827d0bdaec76b7b86d8a169530dcf98767c9883187ecdda02b4ea87171a42b5"
},
"manifest.json": {
"bytes": 24911,
"sha256": "49d0bf1c4c4732c9db8a44ae525fb4516cca4883e1a209aa736b913550396037"
},
"README.md": {
"bytes": 2931,
"sha256": "2422dd76bfcd3e81d57d1db48db27b36e7505ff6b17a68c3b393518f623de256"
},
"verify.py": {
"bytes": 9043,
"sha256": "7242e9ecc68f21349f0073379391d7890367e0b4f5f32697af306cc2346e50d0"
}
}
@@ -0,0 +1,624 @@
{
"schema": 1,
"productionCommit": "f714a25bbcd435941404104ad0cbb0fea3b89149",
"relatedGatesCommit": "7836a93edb98d2f9dcbf9c0290352e38f9acbb39",
"captures": [
"native/trial-1/01-start.json",
"native/trial-1/02-open-dialog.json",
"native/trial-1/03-open-dialog-ready.json",
"native/trial-1/04-open-picker.json",
"native/trial-1/05-open-filename-focus.json",
"native/trial-1/06-open-fixture-path.json",
"native/trial-1/07-opened-fixture.json",
"native/trial-1/08-model-explorer.json",
"native/trial-1/09-created-activity.json",
"native/trial-1/10-text-created-source.json",
"native/trial-1/11-source-folder.json",
"native/trial-1/12-activity-folder.json",
"native/trial-1/13-compact-activity.json",
"native/trial-1/14-save-before-dialog.json",
"native/trial-1/15-save-before-picker.json",
"native/trial-1/16-save-before-focus.json",
"native/trial-1/17-save-before-selected.json",
"native/trial-1/18-save-before-selection-confirmed.json",
"native/trial-1/19-save-before-path.json",
"native/trial-1/20-baseline-saved.json",
"native/trial-1/21-before-drag.json",
"native/trial-1/22-after-drag.json",
"native/trial-1/23-text-after-drag.json",
"native/trial-1/24-root-after-drag.json",
"native/trial-1/25-text-actions.json",
"native/trial-1/25a-resumed-state.json",
"native/trial-1/26-model-undo.json",
"native/trial-1/27-redo-menu.json",
"native/trial-1/28-model-redo.json",
"native/trial-1/29-save-after-pending.json",
"native/trial-1/30-save-after-dialog.json",
"native/trial-1/31a-save-after-field.json",
"native/trial-1/32-save-after-path.json",
"native/trial-1/33-save-after-path-ready.json",
"native/trial-1/34-save-after-path.json",
"native/trial-1/35-saved-after.json",
"native/trial-1/36-new-cleared.json",
"native/trial-1/37-home-reopen.json",
"native/trial-1/38-reopened-after.json",
"native/trial-1/39-reopened-source.json",
"native/trial-1/40-problems-menu.json",
"native/trial-1/41-fresh-diagnostics.json",
"native/trial-1/42-fresh-warning-navigation.json",
"native/trial-1/43-comment-insertion-point.json",
"native/trial-1/44-edited-diagnostics-stale.json",
"native/trial-1/45-refreshed-diagnostics.json",
"native/trial-1/46-refreshed-warning-navigation.json",
"native/trial-1/47-restore-menu.json",
"native/trial-1/48-diagnostic-edit-undone.json"
],
"captureCount": 49,
"imageCount": 62,
"members": {
"build/gate-union.py": {
"bytes": 3495,
"sha256": "9cca2646b1bcf09961a9ad1a276d633d8e4296ff2c6f2f356f028afaf789f503"
},
"build/inputs.json": {
"bytes": 118403,
"sha256": "a36e2cbc29eb7a9217774464cda9da8aa1d3c39caae9b9aacd6cdb28df5bad95"
},
"build/inputs.zip": {
"bytes": 2831326,
"sha256": "9346fba1be9bf4dd2225fe9965fd76a30429f086fd6a101f92d0963d3822f71c"
},
"build/process.json": {
"bytes": 167,
"sha256": "b400c1f8076bcddb583424fe34d155655a41d25b5ccf0db8af26bda6b9b2685e"
},
"build/result.json": {
"bytes": 5532,
"sha256": "5e9e227c66a4b71ade734b8ebeb12070b8a5c64a9a6cf9d8d0b6d70379d4ffc2"
},
"build/started.json": {
"bytes": 1353,
"sha256": "15c54be09a881e6860735395569b22a7a9114789a1f8276cf79bc6fb095c8163"
},
"build/stderr.log": {
"bytes": 261,
"sha256": "480dff999944c756fff581db0f3fac088717e0d73cae20af9a28829446df746f"
},
"build/stdout.log": {
"bytes": 295092,
"sha256": "5a824ca91877328acd332585b39194b27fd2cb167279b99c4c78a89bf13bd19b"
},
"native/bundle-checks/saved-after.result.json": {
"bytes": 1930,
"sha256": "34e2e8754026f35f4d57b24f8bde39f5b354aea703cd9c6650c673f674c2d167"
},
"native/bundle-checks/saved-after.stderr.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"native/bundle-checks/saved-after.stdout.json": {
"bytes": 2592,
"sha256": "095f83e38f6c59b69fd72d0d7d0825b7849d34b963ff35e7f9a4ab7434bae5f2"
},
"native/bundle-checks/saved-before.result.json": {
"bytes": 1931,
"sha256": "52d3f54ce37412fe6f0bf23484d7ada549ed26f8b16501e0ddff1261df673f6c"
},
"native/bundle-checks/saved-before.stderr.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"native/bundle-checks/saved-before.stdout.json": {
"bytes": 2593,
"sha256": "966ee3fac987156a8b9e5e1ebf9d10dd7f7a89c84d0f42645874d153a404517e"
},
"native/bundle-checks/summary.json": {
"bytes": 484,
"sha256": "7f9f6ddd98b303caf0edebef19aa507257c176168f94218ac86f3ac180d13631"
},
"native/capture-snippet.js": {
"bytes": 1579,
"sha256": "55279ed080289ccf5ba482cb24b5a807669a9360012e2d87f794d4465227cb2c"
},
"native/check-saved-bundles.py": {
"bytes": 4216,
"sha256": "beaf19c8d07e63fbc462c555f5e486fc6d035f0175ae9567ac1217414a63038c"
},
"native/independent-review.md": {
"bytes": 5534,
"sha256": "7e952270478fb0f57b0ed44d54bba6c2b09b5c315cebe11ac7ab613155ed299f"
},
"native/input/project.arcadia": {
"bytes": 451,
"sha256": "375c80aaf2b26bb7a638e79d76e4374454e0a86b9698b888d39dc5cad0206818"
},
"native/run-native.py": {
"bytes": 2609,
"sha256": "2d2a63bcfccad32c2b5db09cd723dcff9877d3cbe813853e278cb3df49ed7b88"
},
"native/saved-after/oa/activities/activity_new_activity.arcadia": {
"bytes": 89,
"sha256": "7d2a6a27fecb94eaf42a13b330fed5a269d0e80cad75688a9f26d4e08db0dfe7"
},
"native/saved-after/project.arcadia": {
"bytes": 511,
"sha256": "c93bd35eaaf3a19bc07b5c6a4ee5839ab565e9fd90a2605261b7618fc8a7ecef"
},
"native/saved-before/oa/activities/activity_new_activity.arcadia": {
"bytes": 89,
"sha256": "7d2a6a27fecb94eaf42a13b330fed5a269d0e80cad75688a9f26d4e08db0dfe7"
},
"native/saved-before/project.arcadia": {
"bytes": 511,
"sha256": "dad153f45038ed9ae79ea7263364e6cdedc40737fe7f63fdad7fb198ee7f65c8"
},
"native/trial-1/01-start-0.jpg": {
"bytes": 117627,
"sha256": "0778c21336a401d30316ed3ef5c93abe9ed349082a64cf78e8643edc0b29ee9e"
},
"native/trial-1/01-start.json": {
"bytes": 919,
"sha256": "986aab266f45d9871bd5b134d318a38ce7d8a7c992e2a78a38c54dcfa4a86baa"
},
"native/trial-1/02-open-dialog-0.jpg": {
"bytes": 116197,
"sha256": "e6248082f0dbe81d8d387906686538061ce1cf0f1be4b68aa70156238ea991c0"
},
"native/trial-1/02-open-dialog.json": {
"bytes": 925,
"sha256": "e9852679994314e8ede462a414787841ed8254b8ea660f83543b1bf4e4ab3979"
},
"native/trial-1/03-open-dialog-ready-0.jpg": {
"bytes": 90928,
"sha256": "2a931629a94f94660af8b189f919ab3e41400ca860ae8eac486f4b90184083ce"
},
"native/trial-1/03-open-dialog-ready.json": {
"bytes": 735,
"sha256": "5aea33223bfdb19456c182f9c7cd55eaedaa8c62a6af63c33b5d334d6b7a4af6"
},
"native/trial-1/04-open-picker-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/04-open-picker-1.jpg": {
"bytes": 53413,
"sha256": "61176947f83f35fe13aa1e31b0aa61ea478d0537b9a08fbf45ab6442ab4e2296"
},
"native/trial-1/04-open-picker.json": {
"bytes": 4951,
"sha256": "c8f356251dafcf9465555c629d32e68d6d905d5c221e9580853f6f378123dbe4"
},
"native/trial-1/05-open-filename-focus-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/05-open-filename-focus-1.jpg": {
"bytes": 53809,
"sha256": "fc29b6c470522c8d8c024a9ce43477b507525b4c5ad6482f812f69b526a321eb"
},
"native/trial-1/05-open-filename-focus.json": {
"bytes": 4967,
"sha256": "4ad084f9d123899129c9c7cb4faa53f4727b14bc901fc1cc1dce45e0a15702b4"
},
"native/trial-1/06-open-fixture-path-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/06-open-fixture-path-1.jpg": {
"bytes": 56049,
"sha256": "fc7d2cd6b12111e9bca60cc786b82f1f8f42ee37654a29bd058345ce10b77eaf"
},
"native/trial-1/06-open-fixture-path.json": {
"bytes": 4963,
"sha256": "1eb51f68dc204ad419d54cc3d7bf1e5335b41bd65a083d23bed53dfc90f9a374"
},
"native/trial-1/07-opened-fixture-0.jpg": {
"bytes": 98357,
"sha256": "eddb3b2e85487bc4e53da399a2062c6bd138b6022216dc0b01c3cffc811c2c99"
},
"native/trial-1/07-opened-fixture.json": {
"bytes": 956,
"sha256": "d384ab6efa1fbf49e1b2afd93f933c64d865aa2b6baf6c7a69e2ac372da50449"
},
"native/trial-1/08-model-explorer-0.jpg": {
"bytes": 90072,
"sha256": "65a6e4f0545f6a5e104b9a2896e9b1f82851528a9e91651a31915d9a4f7a0058"
},
"native/trial-1/08-model-explorer.json": {
"bytes": 963,
"sha256": "3a772406fe219f21d954590f6c96f47adc9901d130c2d7bb087acc086cf6079b"
},
"native/trial-1/09-created-activity-0.jpg": {
"bytes": 100572,
"sha256": "115443b3ac12e32fc5a9d0736c9a475a431ed7423a84275a17fa1b4b10496185"
},
"native/trial-1/09-created-activity.json": {
"bytes": 975,
"sha256": "49a134749f520039a5390fc4b4110e5411822c6fb7573e31e1ffb1bff428a4d0"
},
"native/trial-1/10-text-created-source-0.jpg": {
"bytes": 103031,
"sha256": "6999c782d6b38719757898cd7d1575e71239fab882b040ce3125e823e734d995"
},
"native/trial-1/10-text-created-source.json": {
"bytes": 978,
"sha256": "56af19e09aa7d9bd4ef315a80d5060bfd52bd8e08d111c3647ead2bfff9f8b12"
},
"native/trial-1/11-source-folder-0.jpg": {
"bytes": 103956,
"sha256": "72656e598bfef0ad4355ca53d85b88a0d62ad186b3189b0a3e3f5900461e16b1"
},
"native/trial-1/11-source-folder.json": {
"bytes": 972,
"sha256": "e59af1c50e4f374cd840bd62fd0b8676e18e47a45ad820dd8b6a8dd835315c27"
},
"native/trial-1/12-activity-folder-0.jpg": {
"bytes": 105653,
"sha256": "2aff6c99a3845c334b94ba3e7b27fbdb3c31056784ce3ec4e76ef45ebb32911f"
},
"native/trial-1/12-activity-folder.json": {
"bytes": 974,
"sha256": "383be400c6317b571546e51d0c40128e7381b5ce1686ab3aaa20ece1a5e801ee"
},
"native/trial-1/13-compact-activity-0.jpg": {
"bytes": 88781,
"sha256": "87b367c8fe3017d221228ec63aa5192aaee19b4f80db6a07007b32f10f41d242"
},
"native/trial-1/13-compact-activity.json": {
"bytes": 975,
"sha256": "ba4daa10aeb0d9cd555d03cfbcb6bf5a7c6777d9247a46859f35d6fe740fa347"
},
"native/trial-1/14-save-before-dialog-0.jpg": {
"bytes": 83376,
"sha256": "9fd9bd5067f57dc0f297f5d02442e41e3395bd3f6964d726e852746c54a0cff7"
},
"native/trial-1/14-save-before-dialog.json": {
"bytes": 977,
"sha256": "91884e38ade4bd4fa93474a1076d84a4228b4d65a3d4c70afe296166150335b5"
},
"native/trial-1/15-save-before-picker-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/15-save-before-picker-1.jpg": {
"bytes": 55054,
"sha256": "3529090d92bf9ea0375a8e95cc6f1b67d9159872367c89e3bf308e3d024a7ff7"
},
"native/trial-1/15-save-before-picker.json": {
"bytes": 4764,
"sha256": "febecff84014510968d802845126b9935a1c5b40a92dc2795d7bd05d4b11ecbf"
},
"native/trial-1/16-save-before-focus-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/16-save-before-focus-1.jpg": {
"bytes": 55425,
"sha256": "2544f1ccc8ed5a21e682f6e3c836daa684a60f5ee0e4eb39de8ec4f05aca5daa"
},
"native/trial-1/16-save-before-focus.json": {
"bytes": 4762,
"sha256": "e07187e7179555f84a8b3ad7c87e707ba686945bf60dc89b2bfe86ce34d4fb42"
},
"native/trial-1/17-save-before-selected-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/17-save-before-selected-1.jpg": {
"bytes": 55437,
"sha256": "7e12139b558f7427de23cf4a611c6a0a8b20be25e6a0b0799832ddc715ba1fd5"
},
"native/trial-1/17-save-before-selected.json": {
"bytes": 4768,
"sha256": "96d7d8468d87e24808617aea0cd42b52acdf4126c601b10e6f98b614beaf5f75"
},
"native/trial-1/18-save-before-selection-confirmed-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/18-save-before-selection-confirmed-1.jpg": {
"bytes": 54676,
"sha256": "4cc51ff7fa2af6325879b442aea5eee1992f0fd41c4b6455fab3540601691a49"
},
"native/trial-1/18-save-before-selection-confirmed.json": {
"bytes": 4790,
"sha256": "a24fb0576c3339fa281c96d82055428d1e947ea8e0fbda3d9304fbec2410ea62"
},
"native/trial-1/19-save-before-path-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/19-save-before-path-1.jpg": {
"bytes": 57797,
"sha256": "3e5f67d8125353318557c1fffc3aa3184e7870b79f57fb2b272f784a55438854"
},
"native/trial-1/19-save-before-path.json": {
"bytes": 4760,
"sha256": "0af8bed5fa5a3d93b59d046b48623992321d2436275d835ba39550df0edf3a89"
},
"native/trial-1/20-baseline-saved-0.jpg": {
"bytes": 85738,
"sha256": "2a1cb7c65ce2ae68c6c8e1b60c052fec4ccad5574da8e8900d452b41324150c0"
},
"native/trial-1/20-baseline-saved.json": {
"bytes": 965,
"sha256": "5990919d8cdb16e9f5445bb858b0d014015ef02d9157cbc2dc84f75a74f02b00"
},
"native/trial-1/21-before-drag-0.jpg": {
"bytes": 101486,
"sha256": "81f4bb4b0cb7314011b8acd829e9905993b596175139c482cef6030ec542e078"
},
"native/trial-1/21-before-drag.json": {
"bytes": 960,
"sha256": "e35a0357f5b334c8e519cb83116b2d516e9f19bb1ac794cfde0aaf3f6c98d62d"
},
"native/trial-1/22-after-drag-0.jpg": {
"bytes": 103060,
"sha256": "6a8f8c1bd011bd6224050236736e90a982c2102ec2a4700d09e7fc0ecd6ee9a6"
},
"native/trial-1/22-after-drag.json": {
"bytes": 967,
"sha256": "68e018c9d5b9e28b9a138f8085539bc9d87b0e0e48761049fd57d67334313715"
},
"native/trial-1/23-text-after-drag-0.jpg": {
"bytes": 83460,
"sha256": "dfb676eca325444b0383f47d056621d62c9cba3a522739a0015eb1d4a04a36f3"
},
"native/trial-1/23-text-after-drag.json": {
"bytes": 974,
"sha256": "100687443402acff33f2c9eba03a57d1146475e2225e6e90baa9d36624fec96f"
},
"native/trial-1/24-root-after-drag-0.jpg": {
"bytes": 104490,
"sha256": "25a2302b69bd367ea04c4b1ca28030c34e4a5b32a7c88c7c21c5a721fa69c60d"
},
"native/trial-1/24-root-after-drag.json": {
"bytes": 974,
"sha256": "ebbd8e200f431ad99760ed94895a74bc0b01d33f1fb67a6ab1464a1cf008c40a"
},
"native/trial-1/25-text-actions-0.jpg": {
"bytes": 117335,
"sha256": "4627be733b9c84798ff8324fe8bb8bba98dd7c8f3c7be5563d1a24c99e66b59c"
},
"native/trial-1/25-text-actions.json": {
"bytes": 971,
"sha256": "4d0a137244adf721a04dc17af1ae0ef380db737c3ab7478fbf6661bab24ce835"
},
"native/trial-1/25a-resumed-state-0.jpg": {
"bytes": 117221,
"sha256": "f509ed4e37b675d4cbcf1c075a983654b016d5459905a68b45514e24891ced3f"
},
"native/trial-1/25a-resumed-state.json": {
"bytes": 973,
"sha256": "304de4fa36d0b97b891455b26a14850b43bfd0811eb7e7be22bdcae9814da703"
},
"native/trial-1/26-model-undo-0.jpg": {
"bytes": 103052,
"sha256": "a8966f1244e9bbe9be4ad75278f3a492e748029c3fff3174ce38250997250a11"
},
"native/trial-1/26-model-undo.json": {
"bytes": 959,
"sha256": "9cd25b0f2d954f7772ae139c8d5afcb04ab1bf4c965aae6c6e22af37c352618b"
},
"native/trial-1/27-redo-menu-0.jpg": {
"bytes": 117521,
"sha256": "13634900648a485f38fd5183aa097ae544688b5a6112b821362b7128709d06c1"
},
"native/trial-1/27-redo-menu.json": {
"bytes": 958,
"sha256": "4cb0672342dd468ce4a403993e22613abe7498cdceb6111eb39747e7a24a8c86"
},
"native/trial-1/28-model-redo-0.jpg": {
"bytes": 103295,
"sha256": "8202074761aca9c067f5851a17c0586cc6698426473c1621defd3739cbbb817b"
},
"native/trial-1/28-model-redo.json": {
"bytes": 969,
"sha256": "252817aafe641c994ddba7fa244435371b4e75f6b9bbd16d355f02e1b35f0d9d"
},
"native/trial-1/29-save-after-pending-0.jpg": {
"bytes": 102718,
"sha256": "57a731a2b96cd9685ed0dc206a49b7804231d83d763503308fe73e6e326e725d"
},
"native/trial-1/29-save-after-pending.json": {
"bytes": 977,
"sha256": "32490225d11e793b31168cbd00ce184d38190c6e7c4420dba0e4c20424b19533"
},
"native/trial-1/30-save-after-dialog-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/30-save-after-dialog-1.jpg": {
"bytes": 56737,
"sha256": "58dab12435a2f7b258e0c83ab0edd4a95379b0d6ec95f16184d63f8d76b94daf"
},
"native/trial-1/30-save-after-dialog.json": {
"bytes": 5057,
"sha256": "c9515daa0a573ee5510a421a205d1697835dfeaa3d2d69a64d93e4d66c94310e"
},
"native/trial-1/31a-save-after-field-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/31a-save-after-field-1.jpg": {
"bytes": 56737,
"sha256": "58dab12435a2f7b258e0c83ab0edd4a95379b0d6ec95f16184d63f8d76b94daf"
},
"native/trial-1/31a-save-after-field.json": {
"bytes": 5057,
"sha256": "39e59a6120ad31528e55d379eeb2a463af05b5bea8710020c659687b414208fc"
},
"native/trial-1/32-save-after-path-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/32-save-after-path-1.jpg": {
"bytes": 55986,
"sha256": "cb789f536317fff99d6f55133297a8d8511ef280a6b82c5e6e2960da6d0ceafe"
},
"native/trial-1/32-save-after-path.json": {
"bytes": 5053,
"sha256": "9167fd1352cfe5bb1b70631d1413cb7dac3a49311f459c39df374cdfe2d453d8"
},
"native/trial-1/33-save-after-path-ready-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/33-save-after-path-ready-1.jpg": {
"bytes": 56034,
"sha256": "b41240172f775f45e4f19c1240784595004134baace690ccc5388097c9776104"
},
"native/trial-1/33-save-after-path-ready.json": {
"bytes": 5065,
"sha256": "00f3dc075eb6e446a6e7b85790a6d7e913151de53ff8041d9a63c6acd2597c47"
},
"native/trial-1/34-save-after-path-0.jpg": {
"bytes": 674,
"sha256": "5a2387a1a593a32ea169b56b9a3e59333936ee1da95164564e4d9be61bf5a24b"
},
"native/trial-1/34-save-after-path-1.jpg": {
"bytes": 59217,
"sha256": "182c41675727c07555b126f0e7876b32e7c8f141b0d7254e1511299318e08c9d"
},
"native/trial-1/34-save-after-path.json": {
"bytes": 5053,
"sha256": "2c356eeff45b49e9ce17919042929382027445ee07917a80eb8432581ede66e3"
},
"native/trial-1/35-saved-after-0.jpg": {
"bytes": 102789,
"sha256": "cb90a19d855faf3bab39cdb9468c788d72cf840366ef41b98e99d2cd4d9160fc"
},
"native/trial-1/35-saved-after.json": {
"bytes": 962,
"sha256": "f96d3e0c7d0c83603ae14ec4231250e7be9f12113b465050c101852de1755548"
},
"native/trial-1/36-new-cleared-0.jpg": {
"bytes": 90719,
"sha256": "dfc505fa7c2ce48fea5a04aa90b2745d11b144704c16cec0b2431a92291a8966"
},
"native/trial-1/36-new-cleared.json": {
"bytes": 925,
"sha256": "04c4e7a5de7af7974b5ecff290582854cb07979ffca6ca3e468eda09af403b09"
},
"native/trial-1/37-home-reopen-0.jpg": {
"bytes": 115448,
"sha256": "79680f4fbe8ea41a8318d175959d9bf80b8f28ae161b81818f6daa1a97ff294f"
},
"native/trial-1/37-home-reopen.json": {
"bytes": 925,
"sha256": "93b4c5dedb87e64bfd4ebead90b9fb6e6cc89a96983312b70260d8b1cd2ea430"
},
"native/trial-1/38-reopened-after-0.jpg": {
"bytes": 98471,
"sha256": "1a463750e7eeca04b36db7d1ebd3e093f44c92cff40bc68ce603e2e788c23fe7"
},
"native/trial-1/38-reopened-after.json": {
"bytes": 956,
"sha256": "154ba579c620a7d4adaf6c303e045b73223e69996ebaa5841d751dc9cf3f090f"
},
"native/trial-1/39-reopened-source-0.jpg": {
"bytes": 103219,
"sha256": "2bf7bc9dc32c265c303453c054a032af780cb091fb4cc9e8830b0c8d1019c4cd"
},
"native/trial-1/39-reopened-source.json": {
"bytes": 964,
"sha256": "5faf1b0d7810c67d17c77d914824b111b945915a1cf97020e544d3df5c2378d8"
},
"native/trial-1/40-problems-menu-0.jpg": {
"bytes": 117324,
"sha256": "ffdbb858d382d5eb7f5c02769fb6ca0fea64a223280f27366c95087ee5a1f618"
},
"native/trial-1/40-problems-menu.json": {
"bytes": 962,
"sha256": "a2f4a64ce2619952ce1983af22400c13f28f496ba69cc2c9e09eb3b19d0d045b"
},
"native/trial-1/41-fresh-diagnostics-0.jpg": {
"bytes": 124773,
"sha256": "25f26374a247b7188a8458950ded42eeb1635919a54b4bfd33cedc17446f7506"
},
"native/trial-1/41-fresh-diagnostics.json": {
"bytes": 966,
"sha256": "3c227b0e93aa63082536324498c01a47df905fe7677bda072bd8309dc369e78f"
},
"native/trial-1/42-fresh-warning-navigation-0.jpg": {
"bytes": 107742,
"sha256": "2d5d6b4dc722d63313f8aaa2bb6943d3bec11a1bcf9087cdc56ad287e5b5936d"
},
"native/trial-1/42-fresh-warning-navigation.json": {
"bytes": 973,
"sha256": "0a3fd08f2e994530dd41b6fdc6d28bcb0d665e5d9c16a2e89f8bd54dcb797048"
},
"native/trial-1/43-comment-insertion-point-0.jpg": {
"bytes": 108879,
"sha256": "4267f2294d6ceb9ffdb1ea5e72cfbd9aa17ef14df72ea410c0e80128ef854520"
},
"native/trial-1/43-comment-insertion-point.json": {
"bytes": 972,
"sha256": "182b10cdcaf379defeb0fc448cf1e933aab4f783aa383a97bdbf73a3338af69d"
},
"native/trial-1/44-edited-diagnostics-stale-0.jpg": {
"bytes": 91431,
"sha256": "206a1ea8360ca766a17d12594265edc5c54abeda976456259315569879aa4165"
},
"native/trial-1/44-edited-diagnostics-stale.json": {
"bytes": 983,
"sha256": "222c7915eb406f618e8e10caf8b02bb57545a3668fe32f20ef4381eb3780d67a"
},
"native/trial-1/45-refreshed-diagnostics-0.jpg": {
"bytes": 107187,
"sha256": "0c9309378f1bac39941836312b926eddf52a78c164329955f677df1000c8c4c1"
},
"native/trial-1/45-refreshed-diagnostics.json": {
"bytes": 980,
"sha256": "42a51a6eccce6b983368981c194a54c2e3172cee61302bc75b9ee555ace9c367"
},
"native/trial-1/46-refreshed-warning-navigation-0.jpg": {
"bytes": 109007,
"sha256": "e2e23d83f8e5ad9ddbc98f53858276990e27e59550de94dcf6e96054ee0f6a00"
},
"native/trial-1/46-refreshed-warning-navigation.json": {
"bytes": 987,
"sha256": "39d8e7cc945cb444b5f664c243e9ad373ccc1d18b6c04e8cc6dd37a8ce46c643"
},
"native/trial-1/47-restore-menu-0.jpg": {
"bytes": 120506,
"sha256": "a5f11f64e091b20caa628c3253ad92b8b98b2647c19e798f150f3a2d7a3f87e8"
},
"native/trial-1/47-restore-menu.json": {
"bytes": 971,
"sha256": "4a7e3bc9c23f95df538a488d0186f37dc54a5bb1dd184d06d2d6268bf1ccf256"
},
"native/trial-1/48-diagnostic-edit-undone-0.jpg": {
"bytes": 105205,
"sha256": "cf550b51b74b6fef8e21cd2d50f41f1797e22b4b7f38214d8311062bee3e0483"
},
"native/trial-1/48-diagnostic-edit-undone.json": {
"bytes": 971,
"sha256": "43c970d94c53c31a570ab92c6855566a6e2ce690768f6ed7836d64c5a6120f81"
},
"native/trial-1/input.zip": {
"bytes": 343,
"sha256": "f73fb93e2ee2eae45d1df2f63cdbb838a60cdda3f09b8977af6ded6e4ab424f0"
},
"native/trial-1/process.json": {
"bytes": 61,
"sha256": "8a60a20728ea02517d7c22812d27f9814bc3aa98fee597820e8351076f32e7c2"
},
"native/trial-1/result.json": {
"bytes": 1665,
"sha256": "6e615456856f30b8c25dedcd881d7dff6918535916a62b39b4de15c591960dd2"
},
"native/trial-1/started.json": {
"bytes": 1198,
"sha256": "39425278d31c29db4f293b4be7f3e9b2616a85e09c2f6a124dbab2b7ea0ac48c"
},
"native/trial-1/stderr.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"native/trial-1/stdout.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
}
}
@@ -0,0 +1,100 @@
"""Portable read-only evidence verification; no archived helper or binary runs."""
from pathlib import Path, PurePosixPath
from datetime import datetime
import hashlib, io, json, zipfile
ROOT=Path(__file__).resolve().parent
def require(ok,message):
if not ok: raise ValueError(message)
def pin(b): return {'bytes':len(b),'sha256':hashlib.sha256(b).hexdigest()}
def membership(z,expected):
names=z.namelist()
require(len(names)==len(set(names)) and set(names)==set(expected),'ZIP membership')
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 ZIP path')
def main():
files=json.loads((ROOT/'files.json').read_bytes())
for name,p in files.items(): require(pin((ROOT/name).read_bytes())==p,'outer hash '+name)
manifest=json.loads((ROOT/'manifest.json').read_bytes())
with zipfile.ZipFile(ROOT/'evidence.zip') as z:
membership(z,manifest['members'])
for name,p in manifest['members'].items():require(pin(z.read(name))==p,'member hash '+name)
def raw(p):return z.read(p)
def obj(p):return json.loads(raw(p))
build=obj('build/result.json'); start=obj('build/started.json')
require(all(build[k]==v for k,v in start.items()),'build start/result')
require(build['exitCode']==0 and build['inputsUnchanged'] is True,'build success')
require(build['head']==manifest['productionCommit'],'build commit')
require(datetime.fromisoformat(build['start'])<=datetime.fromisoformat(build['finish']),'build time order')
require(build['command']==obj('build/process.json')['command'],'build process command')
for field,path in [('inputs','build/inputs.json'),('archive','build/inputs.zip'),('helper','build/gate-union.py'),('stdout','build/stdout.log'),('stderr','build/stderr.log')]:
require(build[field]==pin(raw(path)),'build receipt '+field)
inputs=obj('build/inputs.json')
require(len(inputs)==build['inputCount']==707,'707 build inputs')
require(sum(p.startswith('crates/vendor/iced_widget/') for p in inputs)==71,'vendor inventory')
with zipfile.ZipFile(io.BytesIO(raw('build/inputs.zip'))) as source:
membership(source,inputs)
for name,p in inputs.items():require(pin(source.read(name))==p,'source input '+name)
artifacts=[]
for line in raw('build/stdout.log').decode('utf-8').splitlines():
try:a=json.loads(line)
except json.JSONDecodeError:continue
if a.get('reason')=='compiler-artifact' and a.get('executable'):artifacts.append(a)
require(artifacts==[a['cargo'] for a in build['artifacts']],'build artifact receipts')
binaries={a['cargo']['target']['name']:a['readback'] for a in build['artifacts']}
executables={a['cargo']['target']['name']:a['cargo']['executable'] for a in build['artifacts']}
require(set(binaries)=={'arcadia','arcadia-server','arcadia-studio'},'build artifact targets')
result=obj('native/trial-1/result.json');start=obj('native/trial-1/started.json')
require(all(result[k]==v for k,v in start.items()),'native start/result')
require(result['exitCode']==0 and result['inputUnchanged'] is True,'native closure/input')
require(result['command']==[executables['arcadia-studio']],'native exact GUI command')
process=obj('native/trial-1/process.json')
require(isinstance(process['pid'],int) and process['pid']>0,'native positive process ID')
require(datetime.fromisoformat(result['start'])<=datetime.fromisoformat(process['observed'])<=datetime.fromisoformat(result['finish']),'native process observation time')
require(result['binary']==result['binaryAfter']==binaries['arcadia-studio'],'GUI binary receipt chain')
require(result['buildReceipt']==pin(raw('build/result.json')) and result['buildInputs']==pin(raw('build/inputs.json')) and result['buildHead']==build['head'],'native build receipt chain')
for field,path in [('helper','native/run-native.py'),('captureHelper','native/capture-snippet.js'),('inputArchive','native/trial-1/input.zip'),('stdout','native/trial-1/stdout.log'),('stderr','native/trial-1/stderr.log')]:
require(result[field]==pin(raw(path)),'native receipt '+field)
require(not raw('native/trial-1/stdout.log') and not raw('native/trial-1/stderr.log'),'native empty streams')
with zipfile.ZipFile(io.BytesIO(raw('native/trial-1/input.zip'))) as fixture:
membership(fixture,result['input'])
for name,p in result['input'].items():require(pin(fixture.read(name))==p and fixture.read(name)==raw('native/input/'+name),'fixture bytes')
captures=manifest['captures']; seen=[]
for name in captures:
capture=obj(name)
require(datetime.fromisoformat(result['start'])<=datetime.fromisoformat(capture['time'])<=datetime.fromisoformat(result['finish']),'capture timestamp')
for image in capture['images']:
path='native/trial-1/'+image['file']
require(path in manifest['members'] and image['width']>0 and image['height']>0,'capture image reference')
require(raw(path).startswith(b'\xff\xd8'),'JPEG signature')
seen.append(path)
images=[n for n in manifest['members'] if n.startswith('native/trial-1/') and n.endswith('.jpg')]
require(len(seen)==len(set(seen)) and set(seen)==set(images),'all raw frames referenced exactly once')
require(len(captures)==manifest['captureCount'] and len(images)==manifest['imageCount'],'capture counts')
original=raw('native/input/project.arcadia')
expected={'project.arcadia':original[:-2]+b'\n include "oa/activities/activity_new_activity.arcadia";\n}\n',
'oa/activities/activity_new_activity.arcadia':b'\noa_activity new_activity "New activity" id "d2b6d784-dea5-433d-aea9-214c604744e5" {\n}\n\n\n'}
require(original.endswith(b'}\n') and expected['project.arcadia'].count(b'position { x 120.0; y 80.0; };')==1,'fixture oracle preconditions')
for bundle in ['saved-before','saved-after']:
if bundle=='saved-after':expected['project.arcadia']=expected['project.arcadia'].replace(b'position { x 120.0; y 80.0; };',b'position { x 190.0; y 80.0; };',1)
prefix='native/'+bundle+'/'
actual={n[len(prefix):]:raw(n) for n in manifest['members'] if n.startswith(prefix)}
require(actual==expected,bundle+' exact source-byte oracle')
receipt=obj('native/bundle-checks/'+bundle+'.result.json')
report=obj('native/bundle-checks/'+bundle+'.stdout.json')
expected_entry=result['cwd'].replace('\\','/').rstrip('/')+'/.local/union-native/'+bundle+'/project.arcadia'
require(len(receipt['command'])==4 and receipt['command'][0]==executables['arcadia'] and receipt['command'][1]=='check' and receipt['command'][2].replace('\\','/')==expected_entry and receipt['command'][3]=='--json',bundle+' exact CLI command')
require(datetime.fromisoformat(receipt['start'])<=datetime.fromisoformat(receipt['finish']),bundle+' CLI time order')
require(receipt['files']=={n:pin(b) for n,b in actual.items()} and receipt['filesUnchanged'] is True,bundle+' file receipts')
require(receipt['binary']==binaries['arcadia'] and receipt['buildReceipt']==pin(raw('build/result.json')),bundle+' CLI build receipt')
require(receipt['producer']==pin(raw('native/check-saved-bundles.py')),bundle+' producer')
require(receipt['exitCode']==0 and report['status']=='checked',bundle+' CLI status')
for field,suffix in [('stdout','.stdout.json'),('stderr','.stderr.log')]:require(receipt[field]==pin(raw('native/bundle-checks/'+bundle+suffix)),bundle+' '+field)
require(not raw('native/bundle-checks/'+bundle+'.stderr.log'),bundle+' empty stderr')
require(len(report['diagnostics'])==4 and all(d['severity']=='warning' for d in report['diagnostics']),bundle+' warnings')
require(receipt['diagnostics']==[{k:d[k] for k in ('severity','code','object_id')} for d in report['diagnostics']],bundle+' diagnostic receipt')
require(not report['changes'] and not report['written'] and report['identities_to_stabilize']==0,bundle+' nonmutating stable-ID check')
summary=obj('native/bundle-checks/summary.json')
require(summary['status']=='PASS' and summary['runs']==['saved-before','saved-after'] and summary['producer']==pin(raw('native/check-saved-bundles.py')),'bundle summary')
print('PASS:',len(manifest['members']),'members;',len(captures),'captures;',len(images),'unaltered frames; 707 build inputs; native closure and both saved-byte/CLI receipt oracles.')
print('No archived code executed. Screenshot interpretation and full parsed-model equality are not machine-verified.')
if __name__=='__main__':main()