Integrate reviewed compact source and Text workspace
This commit is contained in:
@@ -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.
|
||||
Binary file not shown.
@@ -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()
|
||||
@@ -0,0 +1,52 @@
|
||||
# Ordinary-text union: closed-run checkpoint
|
||||
|
||||
Run `python verify.py` with Python 3.10 or newer in this directory. The verifier
|
||||
uses only the standard library and these five files. It reads archives in memory,
|
||||
does not extract or execute source/binaries, and does not consult Git, Cargo,
|
||||
network services, or paths recorded from the original machine.
|
||||
|
||||
`files.json` hashes the ZIP, manifest, verifier and this README. `manifest.json`
|
||||
lists every ZIP member and maps each run to its exact input manifest and ZIP.
|
||||
Only byte-identical input files are deduplicated; ZIPs with different timestamps
|
||||
remain separate even when their source inventories match. Receipts and raw logs
|
||||
are retained verbatim, including failures and original local path strings.
|
||||
|
||||
The production composition is d7c065991d3f63cc41341d23a546739de8837ac3.
|
||||
The checkpoint is e624d5b9c4f848eff3fba2ed83f9decf959e14d8, including generated
|
||||
teaching fixtures and normative language documentation. Individual receipt HEADs
|
||||
and input inventories are authoritative for each run; a HEAD alone does not
|
||||
describe dirty fixture/document changes during capture.
|
||||
|
||||
| Closed capture | Recorded outcome |
|
||||
| --- | --- |
|
||||
| core-consumers-1 | Offline dependency resolution failed: num-bigint missing |
|
||||
| windows-dependencies-1 | Dependency preparation completed |
|
||||
| core-1 | 536 passed, 1 failed, 1 ignored; stale generated teaching fixture failure preserved |
|
||||
| teaching-generate-1 | Teaching generator completed; raw generated-release1 outputs included |
|
||||
| teaching-check-2 | 4 passed after fixture regeneration |
|
||||
| language-doc-1 | Warning log from failed strict render preserved |
|
||||
| language-doc-2 | Strict docutils 0.23 render succeeded; empty warning log |
|
||||
| consumers-1 | 63 passed |
|
||||
|
||||
The verifier checks exact archive membership, hashes and lengths, nested input
|
||||
archive membership/content, input counts (including 71 vendored iced_widget
|
||||
files), start/result/process command relationships, unchanged-input assertions,
|
||||
helper hashes, exit codes, exact test summary rows and aggregate counts,
|
||||
compiler-artifact receipt relationships, composition patch hash, generated output
|
||||
inventory, and successful document source/output/warning receipts.
|
||||
|
||||
Limitations: integrity and internal consistency are not independent reproduction
|
||||
or authenticated provenance. Test expectations in the manifest are frozen from
|
||||
the raw capture. No runtime binaries, dependency cache, credentials or user
|
||||
profile are packaged. Recorded artifact readback hashes cannot be independently
|
||||
checked without the excluded binaries. Input archives contain project sources,
|
||||
not a hermetic toolchain or complete dependency distribution. The gate helper is
|
||||
receipt-pinned; the included render helper is its current successful-render
|
||||
version, with no historical helper hash receipt. language-doc-1 contains only
|
||||
warnings.log: its original helper, exact failed input and process/exit receipt
|
||||
were not captured. The successful render inputs and outputs are hash-pinned by
|
||||
its result receipt. Generated outputs are archived as observed, without a
|
||||
separate generation-output hash receipt. This package does not claim a full
|
||||
core rerun after regeneration, complete desktop/GUI validation, lint success,
|
||||
release packaging, or publication. Active desktop-list-1 and any later runs are
|
||||
excluded from this initial checkpoint.
|
||||
Binary file not shown.
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"evidence.zip": {
|
||||
"bytes": 8584848,
|
||||
"sha256": "f220433f8f6fe99cea762aca98ee471c14411b5f6762745cf91432e6bfaca440"
|
||||
},
|
||||
"manifest.json": {
|
||||
"bytes": 24274,
|
||||
"sha256": "ad731f45fda8eb8678160315de00a4c77037d49ee40f0774496e7a2a970342aa"
|
||||
},
|
||||
"README.md": {
|
||||
"bytes": 3328,
|
||||
"sha256": "98c900e5c83e13da6c6edc11521df8edb87f4e1ebebb004fd1d6cc8acc91683b"
|
||||
},
|
||||
"verify.py": {
|
||||
"bytes": 5526,
|
||||
"sha256": "65136bbf0074c63a1478a56e0a66523d785081c368a50cd698d1231f6b0618ba"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,901 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"productionCommit": "d7c065991d3f63cc41341d23a546739de8837ac3",
|
||||
"checkpointCommit": "e624d5b9c4f848eff3fba2ed83f9decf959e14d8",
|
||||
"runs": {
|
||||
"core-consumers-1": {
|
||||
"kind": "cargo",
|
||||
"inputs": "inputs/e3d2d504b18bb1f7c4c3fa1f26abff425b957f18b418d8556888151723ba67b4.json",
|
||||
"archive": "inputs/12ce1ca9c1185d7a91a1dea322cdc0c7fc4372db5d879386595acdbfd412d880.zip",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"-p",
|
||||
"oa-server",
|
||||
"--test",
|
||||
"http",
|
||||
"-p",
|
||||
"oa-cli",
|
||||
"--test",
|
||||
"source_cli",
|
||||
"--no-fail-fast",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "d7c065991d3f63cc41341d23a546739de8837ac3",
|
||||
"exitCode": 101,
|
||||
"inputCount": 707,
|
||||
"testRows": [],
|
||||
"testTotals": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"windows-dependencies-1": {
|
||||
"kind": "cargo",
|
||||
"inputs": "inputs/e3d2d504b18bb1f7c4c3fa1f26abff425b957f18b418d8556888151723ba67b4.json",
|
||||
"archive": "inputs/12ce1ca9c1185d7a91a1dea322cdc0c7fc4372db5d879386595acdbfd412d880.zip",
|
||||
"command": [
|
||||
"cargo",
|
||||
"fetch",
|
||||
"--locked",
|
||||
"--target",
|
||||
"x86_64-pc-windows-gnullvm"
|
||||
],
|
||||
"head": "d7c065991d3f63cc41341d23a546739de8837ac3",
|
||||
"exitCode": 0,
|
||||
"inputCount": 707,
|
||||
"testRows": [],
|
||||
"testTotals": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"core-1": {
|
||||
"kind": "cargo",
|
||||
"inputs": "inputs/e3d2d504b18bb1f7c4c3fa1f26abff425b957f18b418d8556888151723ba67b4.json",
|
||||
"archive": "inputs/12ce1ca9c1185d7a91a1dea322cdc0c7fc4372db5d879386595acdbfd412d880.zip",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--no-fail-fast",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "d7c065991d3f63cc41341d23a546739de8837ac3",
|
||||
"exitCode": 101,
|
||||
"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
|
||||
],
|
||||
[
|
||||
3,
|
||||
1,
|
||||
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": [
|
||||
536,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"teaching-generate-1": {
|
||||
"kind": "cargo",
|
||||
"inputs": "inputs/e3d2d504b18bb1f7c4c3fa1f26abff425b957f18b418d8556888151723ba67b4.json",
|
||||
"archive": "inputs/12ce1ca9c1185d7a91a1dea322cdc0c7fc4372db5d879386595acdbfd412d880.zip",
|
||||
"command": [
|
||||
"cargo",
|
||||
"run",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--example",
|
||||
"generate_release1",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
".local/ordinary-text-integration/generated-release1"
|
||||
],
|
||||
"head": "d7c065991d3f63cc41341d23a546739de8837ac3",
|
||||
"exitCode": 0,
|
||||
"inputCount": 707,
|
||||
"testRows": [],
|
||||
"testTotals": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"teaching-check-2": {
|
||||
"kind": "cargo",
|
||||
"inputs": "inputs/0fa1da63d71c984cd99b079de661e88154b5a31818b384f557deefd40b8ead3a.json",
|
||||
"archive": "inputs/81bd006f10034bc0c203187af179548a549fda6e58bc7cde0702cc26994fd28d.zip",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-core",
|
||||
"--test",
|
||||
"release1_teaching",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "d7c065991d3f63cc41341d23a546739de8837ac3",
|
||||
"exitCode": 0,
|
||||
"inputCount": 707,
|
||||
"testRows": [
|
||||
[
|
||||
4,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
],
|
||||
"testTotals": [
|
||||
4,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"language-doc-1": {
|
||||
"kind": "render"
|
||||
},
|
||||
"language-doc-2": {
|
||||
"kind": "render"
|
||||
},
|
||||
"consumers-1": {
|
||||
"kind": "cargo",
|
||||
"inputs": "inputs/bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48.json",
|
||||
"archive": "inputs/86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1.zip",
|
||||
"command": [
|
||||
"cargo",
|
||||
"test",
|
||||
"--locked",
|
||||
"--offline",
|
||||
"-p",
|
||||
"oa-server",
|
||||
"--test",
|
||||
"http",
|
||||
"-p",
|
||||
"oa-cli",
|
||||
"--test",
|
||||
"source_cli",
|
||||
"--no-fail-fast",
|
||||
"--message-format=json",
|
||||
"--",
|
||||
"--nocapture"
|
||||
],
|
||||
"head": "d7c065991d3f63cc41341d23a546739de8837ac3",
|
||||
"exitCode": 0,
|
||||
"inputCount": 707,
|
||||
"testRows": [
|
||||
[
|
||||
12,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
51,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
],
|
||||
"testTotals": [
|
||||
63,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
}
|
||||
},
|
||||
"members": {
|
||||
"generated-release1/expected-diagnostics.json": {
|
||||
"bytes": 288,
|
||||
"sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e"
|
||||
},
|
||||
"generated-release1/model.json": {
|
||||
"bytes": 134520,
|
||||
"sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727"
|
||||
},
|
||||
"generated-release1/oa/activities/activity_oa_restore_work.arcadia": {
|
||||
"bytes": 1130,
|
||||
"sha256": "21cbd7176af8fad68453306f2371ff03e127a994b8796cdf044567332de9686f"
|
||||
},
|
||||
"generated-release1/oa/behavior/process_oa_assessment_procedure.arcadia": {
|
||||
"bytes": 550,
|
||||
"sha256": "23cabc213c264a16c8595414db6acb09248c1cef9cd699f1b0316e5bb82c062a"
|
||||
},
|
||||
"generated-release1/oa/behavior/process_oa_field_procedure.arcadia": {
|
||||
"bytes": 1178,
|
||||
"sha256": "9c52086759b7344b4809ceb8d372f65647b16fc24153a03b887faa378c37fe96"
|
||||
},
|
||||
"generated-release1/oa/behavior/process_oa_response.arcadia": {
|
||||
"bytes": 2560,
|
||||
"sha256": "675798bd19e6b40d03e7076b0e59b110cdaaab7b6d16c47c3ac80fa960072e84"
|
||||
},
|
||||
"generated-release1/oa/behavior/scenario_oa_conversation.arcadia": {
|
||||
"bytes": 1515,
|
||||
"sha256": "e217e5394a0771dc16206ed9437a231da27905d2f19be64b3f48281c0a32fb6b"
|
||||
},
|
||||
"generated-release1/oa/behavior/scenario_oa_full_scenario.arcadia": {
|
||||
"bytes": 1121,
|
||||
"sha256": "c5a285f2d7c61bd2a136107f267fbf9cddb1cba3f63ff36a6f53f7ab98f33df5"
|
||||
},
|
||||
"generated-release1/oa/behavior/state_machine_oa_monitor.arcadia": {
|
||||
"bytes": 1358,
|
||||
"sha256": "e7349e1e5336282eed3f5a103129db33d3ae4ed500788ee7129e8fc193ac57f6"
|
||||
},
|
||||
"generated-release1/oa/capabilities.arcadia": {
|
||||
"bytes": 630,
|
||||
"sha256": "26a3d9b615a3251ff010e0b47127f2d16bc2dcd45ed95967208b0076d725843a"
|
||||
},
|
||||
"generated-release1/oa/model.arcadia": {
|
||||
"bytes": 531,
|
||||
"sha256": "069a5eaaf525089935cc9d73ae7b916866ed78c6534705d75739650ecdea7ada"
|
||||
},
|
||||
"generated-release1/oa/participants.arcadia": {
|
||||
"bytes": 1580,
|
||||
"sha256": "591a75a9ecad280302be4d4ae0171ad616377ed11ead5e233848ca2dc0a71819"
|
||||
},
|
||||
"generated-release1/oa/types.arcadia": {
|
||||
"bytes": 554,
|
||||
"sha256": "f02c391d584674c879f662a418abba3a220f1fee88471ca49322ac9873de628d"
|
||||
},
|
||||
"generated-release1/project.arcadia": {
|
||||
"bytes": 1958,
|
||||
"sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda"
|
||||
},
|
||||
"generated-release1/sa/behavior/process_sa_assessment_procedure.arcadia": {
|
||||
"bytes": 559,
|
||||
"sha256": "5c414fbdaabf9f9e402b0441fcacf1cacf4dbbc6c822162f028de35abf59be2d"
|
||||
},
|
||||
"generated-release1/sa/behavior/process_sa_field_procedure.arcadia": {
|
||||
"bytes": 1187,
|
||||
"sha256": "ece846fdf93857e71a9ab0efcbdf64a5c41c71180f62afa3f79077fffb53b8f2"
|
||||
},
|
||||
"generated-release1/sa/behavior/process_sa_response.arcadia": {
|
||||
"bytes": 2569,
|
||||
"sha256": "af7fdda280a917cf626f6e077162d481f9aaad280f8e81330c07d7fe384b1c52"
|
||||
},
|
||||
"generated-release1/sa/behavior/scenario_sa_conversation.arcadia": {
|
||||
"bytes": 1847,
|
||||
"sha256": "01339699ec3ee409418d9bb232542f2bcd9419f1e67b183e77700c56bb9f71d2"
|
||||
},
|
||||
"generated-release1/sa/behavior/scenario_sa_full_scenario.arcadia": {
|
||||
"bytes": 1116,
|
||||
"sha256": "5dce6b00a3a441162e8dee3e23d9ca5ab7bed4a24de669b1fba03664a3086dda"
|
||||
},
|
||||
"generated-release1/sa/behavior/state_machine_sa_monitor.arcadia": {
|
||||
"bytes": 1358,
|
||||
"sha256": "17dbcfa5bbfd10fc8e23a325fc950ce853c219b4aa89c74f96278cbb3f34acc8"
|
||||
},
|
||||
"generated-release1/sa/capabilities.arcadia": {
|
||||
"bytes": 630,
|
||||
"sha256": "81706a0ca9d7db2aa0350888b9c00d853885185db2e6b90557d3d51a11c3d645"
|
||||
},
|
||||
"generated-release1/sa/functions/function_sa_audit_thresholds.arcadia": {
|
||||
"bytes": 280,
|
||||
"sha256": "27f798f78f36e72b38edab3725af2feb0eaa010fd52a60b5c6b6bef57ad3b686"
|
||||
},
|
||||
"generated-release1/sa/functions/function_sa_restore_work.arcadia": {
|
||||
"bytes": 2251,
|
||||
"sha256": "357c6acb80f86b4e8d8f5c98f9f79d140f85fbe09f3406b41b7ac6eba464ec8c"
|
||||
},
|
||||
"generated-release1/sa/model.arcadia": {
|
||||
"bytes": 531,
|
||||
"sha256": "805b90262e27090ae7da81a51bcefa49c97fb0b3d3220b4a72323b4c4351c395"
|
||||
},
|
||||
"generated-release1/sa/participants.arcadia": {
|
||||
"bytes": 3604,
|
||||
"sha256": "ca144d6a8f45fe720b5d18c7b59c7671444baa8c37e5ce9117bcba34b3a6aa84"
|
||||
},
|
||||
"generated-release1/sa/types.arcadia": {
|
||||
"bytes": 903,
|
||||
"sha256": "540ddbc2bcd0ccf45298e3ea5660637341aff63ff65fd87ac2f26469d1adc064"
|
||||
},
|
||||
"generated-release1/traceability.arcadia": {
|
||||
"bytes": 28041,
|
||||
"sha256": "474bd28d955ff7af7722f6e9a23220d816879e3f46202e79a233544b9c593116"
|
||||
},
|
||||
"generated-release1/transition-before.json": {
|
||||
"bytes": 35801,
|
||||
"sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d"
|
||||
},
|
||||
"generated-release1/transition-request.json": {
|
||||
"bytes": 4276,
|
||||
"sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a"
|
||||
},
|
||||
"generated-release1/views/diagram_oa_allocation_view.arcadia": {
|
||||
"bytes": 1786,
|
||||
"sha256": "c45d7467839219d894804c1ef2d22ff4d4a5a84a6a273c526bafd4c1facde624"
|
||||
},
|
||||
"generated-release1/views/diagram_sa_allocation_view.arcadia": {
|
||||
"bytes": 1797,
|
||||
"sha256": "352a3ca745517592b5c9b1239b5770f62f0466a329a91fd03457ef2b53c06ed6"
|
||||
},
|
||||
"generated-release1/views/diagram_sa_capability_view.arcadia": {
|
||||
"bytes": 1286,
|
||||
"sha256": "8f18fcccbcddcf3c1ea0ffe727b5b23b77fc148c5da4fde953abe681e4c20cd2"
|
||||
},
|
||||
"generated-release1/views/diagram_sa_service_view.arcadia": {
|
||||
"bytes": 1960,
|
||||
"sha256": "4c72cb7593d9c4be8d2600b0656a7a3a6ce84c45bb2f3e58a4ee5ae3bf91913c"
|
||||
},
|
||||
"generated-release1/views/diagram_sa_state_view.arcadia": {
|
||||
"bytes": 1576,
|
||||
"sha256": "dd1bea81ac7dc549a53f9b190be6f13052e00ede345bd180444cc31edb892230"
|
||||
},
|
||||
"helpers/composition.json": {
|
||||
"bytes": 1190,
|
||||
"sha256": "78a98f3a034cda4d0cc1abfe33efb785e847bb6278b49c2071d70ee5f1dc23f3"
|
||||
},
|
||||
"helpers/gate-union.py": {
|
||||
"bytes": 3495,
|
||||
"sha256": "9cca2646b1bcf09961a9ad1a276d633d8e4296ff2c6f2f356f028afaf789f503"
|
||||
},
|
||||
"helpers/ordinary-contract.patch": {
|
||||
"bytes": 7301,
|
||||
"sha256": "931a5822dbfa5ad34a0dc961035e060ccdc7aed15712c4a9b5dc15a852675f71"
|
||||
},
|
||||
"helpers/ordinary.patch": {
|
||||
"bytes": 145928,
|
||||
"sha256": "e319a5151b7e6713880eaaab632f3f1c01aee6df3cd534d85a1c099fb501dcb7"
|
||||
},
|
||||
"helpers/render-language.py": {
|
||||
"bytes": 1009,
|
||||
"sha256": "82909cf11b0bdb0594b424cba51e71ec0abdead78d878f101b7ae8ff6c4281f8"
|
||||
},
|
||||
"helpers/required-desktop-tests.json": {
|
||||
"bytes": 125261,
|
||||
"sha256": "6672e3f7ccfb92b7710310836af6933a8e58ef113353505ec4fc0c3d6908c136"
|
||||
},
|
||||
"inputs/0fa1da63d71c984cd99b079de661e88154b5a31818b384f557deefd40b8ead3a.json": {
|
||||
"bytes": 118403,
|
||||
"sha256": "0fa1da63d71c984cd99b079de661e88154b5a31818b384f557deefd40b8ead3a"
|
||||
},
|
||||
"inputs/12ce1ca9c1185d7a91a1dea322cdc0c7fc4372db5d879386595acdbfd412d880.zip": {
|
||||
"bytes": 2830239,
|
||||
"sha256": "12ce1ca9c1185d7a91a1dea322cdc0c7fc4372db5d879386595acdbfd412d880"
|
||||
},
|
||||
"inputs/81bd006f10034bc0c203187af179548a549fda6e58bc7cde0702cc26994fd28d.zip": {
|
||||
"bytes": 2828619,
|
||||
"sha256": "81bd006f10034bc0c203187af179548a549fda6e58bc7cde0702cc26994fd28d"
|
||||
},
|
||||
"inputs/86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1.zip": {
|
||||
"bytes": 2831327,
|
||||
"sha256": "86ac50e9cec8b39db91bbc98e5388e8c0f8466e6c217cf2f4eca5f1db087dde1"
|
||||
},
|
||||
"inputs/bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48.json": {
|
||||
"bytes": 118403,
|
||||
"sha256": "bbe8290d9cb11a7ee5dba250350451c5b7ec88069aa65f6be786a67922408c48"
|
||||
},
|
||||
"inputs/e3d2d504b18bb1f7c4c3fa1f26abff425b957f18b418d8556888151723ba67b4.json": {
|
||||
"bytes": 118404,
|
||||
"sha256": "e3d2d504b18bb1f7c4c3fa1f26abff425b957f18b418d8556888151723ba67b4"
|
||||
},
|
||||
"render/language.html": {
|
||||
"bytes": 188141,
|
||||
"sha256": "57e71090f56ae27aa50f757886d6cadf63d49f5641fe4a365547cbd9e59685b6"
|
||||
},
|
||||
"render/language.rst": {
|
||||
"bytes": 142931,
|
||||
"sha256": "5deafe3f75a503ab5fb3d05c5ad8f126d82668f89bef02067ce5d56c3045a2bb"
|
||||
},
|
||||
"runs/consumers-1/process.json": {
|
||||
"bytes": 257,
|
||||
"sha256": "85b18634abd4ccf90144b44b01cbcade2521ef6706b2e46abc2e1d60a4dfc346"
|
||||
},
|
||||
"runs/consumers-1/result.json": {
|
||||
"bytes": 6986,
|
||||
"sha256": "5501663ed1f845b8d18487c90fb827faab2a1c2319cf8ea8c127324fdd9add15"
|
||||
},
|
||||
"runs/consumers-1/started.json": {
|
||||
"bytes": 1488,
|
||||
"sha256": "908dda6bce0013b3c5db9bc5cf678a9df3b221845e9c29d29409bf440bab52d3"
|
||||
},
|
||||
"runs/consumers-1/stderr.log": {
|
||||
"bytes": 652,
|
||||
"sha256": "6dca8394973a95c080a0b8858926efe7779512adf0fd5e64b47d1239f9446618"
|
||||
},
|
||||
"runs/consumers-1/stdout.log": {
|
||||
"bytes": 144498,
|
||||
"sha256": "f1ff82c06e0e1b0f0c3eadb5533402bfea42983c89fa3581340768f3d953de3e"
|
||||
},
|
||||
"runs/core-1/process.json": {
|
||||
"bytes": 197,
|
||||
"sha256": "1bf0f358d94b6e95eab5cf3823a4230a72f0363b77c75b8222c73f1122739f21"
|
||||
},
|
||||
"runs/core-1/result.json": {
|
||||
"bytes": 67077,
|
||||
"sha256": "a9f111627d5a2a7fa33e525cbd43150b803505e3e201b8465f94d2060fce143e"
|
||||
},
|
||||
"runs/core-1/started.json": {
|
||||
"bytes": 1398,
|
||||
"sha256": "56fb8a8824c031ed8f831561241a3bf321158f75cc0a2acdca6b0a77d9b648f6"
|
||||
},
|
||||
"runs/core-1/stderr.log": {
|
||||
"bytes": 12121,
|
||||
"sha256": "ca7ae2dfd0b6eecec811fce5831ea0dc7fb3b6209ffcad88d45eb6c5afd65103"
|
||||
},
|
||||
"runs/core-1/stdout.log": {
|
||||
"bytes": 131218,
|
||||
"sha256": "0d683632d1046f102e6b70af56d67ea6841134d99c923f0648261b4832a860fa"
|
||||
},
|
||||
"runs/core-consumers-1/process.json": {
|
||||
"bytes": 274,
|
||||
"sha256": "16bba7d4e4e3eb39c0ae89ecdbbfe38818c2ed329a32ac52a8db3cea69ed7fd4"
|
||||
},
|
||||
"runs/core-consumers-1/result.json": {
|
||||
"bytes": 1907,
|
||||
"sha256": "4bb8e79cd647aacebe2c4790a18ac37d07bbc29b0f7c8eca1933f1c5020474f8"
|
||||
},
|
||||
"runs/core-consumers-1/started.json": {
|
||||
"bytes": 1515,
|
||||
"sha256": "2ff77ca7601800340bf458d0707aaeef742a010ec7f6a55cf1577a1c33f5c543"
|
||||
},
|
||||
"runs/core-consumers-1/stderr.log": {
|
||||
"bytes": 327,
|
||||
"sha256": "5ded46d388f7ecc597c5e468621e84a297b1231f4eab8c2aa413697dd005e286"
|
||||
},
|
||||
"runs/core-consumers-1/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/language-doc-1/warnings.log": {
|
||||
"bytes": 144,
|
||||
"sha256": "82cf5ddae4d21aa3730437a7962e6582507aa8032cc75fb8164ff7cf9003b7ae"
|
||||
},
|
||||
"runs/language-doc-2/result.json": {
|
||||
"bytes": 415,
|
||||
"sha256": "620a449b2995fbbb27aa769cadf603dd01d9f7036c595d012e66b74469102bde"
|
||||
},
|
||||
"runs/language-doc-2/warnings.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"runs/teaching-check-2/process.json": {
|
||||
"bytes": 210,
|
||||
"sha256": "18e9d3ee3e9c0d2d21c196c811ae543c899cc4580ad3288eca3a544f20f7a9cc"
|
||||
},
|
||||
"runs/teaching-check-2/result.json": {
|
||||
"bytes": 3147,
|
||||
"sha256": "cfc8dad31b1d8ba45face31f7986a30066c3bc464d19bd3b8495c9a013b45c0e"
|
||||
},
|
||||
"runs/teaching-check-2/started.json": {
|
||||
"bytes": 1416,
|
||||
"sha256": "259944f97150c87b2c95e9f53ae5cbb09264b03284510c9ac44272a70fdc9c87"
|
||||
},
|
||||
"runs/teaching-check-2/stderr.log": {
|
||||
"bytes": 218,
|
||||
"sha256": "9c90adb28961f087f33b905352c50c5d2aaa46785f47f3061dbe7dc161bc95d9"
|
||||
},
|
||||
"runs/teaching-check-2/stdout.log": {
|
||||
"bytes": 42153,
|
||||
"sha256": "d53a7d2d3d726302111aab71208814f487489080d250c1f555ad18312e80d86c"
|
||||
},
|
||||
"runs/teaching-generate-1/process.json": {
|
||||
"bytes": 252,
|
||||
"sha256": "c97f65ec53807bca963754b767ab21a88c3476c3639f0b54b38880281aff8a22"
|
||||
},
|
||||
"runs/teaching-generate-1/result.json": {
|
||||
"bytes": 3171,
|
||||
"sha256": "bd0095f78b4ff3cbaf7c1c3183bc280dbb1eec1cb68a528507af27ac35f34f83"
|
||||
},
|
||||
"runs/teaching-generate-1/started.json": {
|
||||
"bytes": 1458,
|
||||
"sha256": "e0526c09c8baa67bdb753ed1b0f15e237d3db2b1c60f097a145a141b9d174169"
|
||||
},
|
||||
"runs/teaching-generate-1/stderr.log": {
|
||||
"bytes": 229,
|
||||
"sha256": "464f44f1eaa5cabe25b7f66bcd689912977482c3eaad0e65328e0210749491fa"
|
||||
},
|
||||
"runs/teaching-generate-1/stdout.log": {
|
||||
"bytes": 41964,
|
||||
"sha256": "c7b195917f9b5b15aaf654703349b713b788f4cfbf00dce966539ff0764f892b"
|
||||
},
|
||||
"runs/windows-dependencies-1/process.json": {
|
||||
"bytes": 146,
|
||||
"sha256": "3901471653ef98f1abe326244dc639c6a2f0f53d3fff72db82acf068d8afabf9"
|
||||
},
|
||||
"runs/windows-dependencies-1/result.json": {
|
||||
"bytes": 1712,
|
||||
"sha256": "f1aa540938e09c5f4b92d13b293861a9e2cd08681e3f6b285b9e85f848a44935"
|
||||
},
|
||||
"runs/windows-dependencies-1/started.json": {
|
||||
"bytes": 1321,
|
||||
"sha256": "a54a7f78b455414d592b7ca3daf3d824487583a844097db76265e564bfb531d7"
|
||||
},
|
||||
"runs/windows-dependencies-1/stderr.log": {
|
||||
"bytes": 117,
|
||||
"sha256": "a82eeeb2d2fffd4d9e5d6e20ef76ed29e9e365923e2cc33bac0ab8f21a7a88d8"
|
||||
},
|
||||
"runs/windows-dependencies-1/stdout.log": {
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
},
|
||||
"generatedFiles": [
|
||||
"generated-release1/expected-diagnostics.json",
|
||||
"generated-release1/model.json",
|
||||
"generated-release1/oa/activities/activity_oa_restore_work.arcadia",
|
||||
"generated-release1/oa/behavior/process_oa_assessment_procedure.arcadia",
|
||||
"generated-release1/oa/behavior/process_oa_field_procedure.arcadia",
|
||||
"generated-release1/oa/behavior/process_oa_response.arcadia",
|
||||
"generated-release1/oa/behavior/scenario_oa_conversation.arcadia",
|
||||
"generated-release1/oa/behavior/scenario_oa_full_scenario.arcadia",
|
||||
"generated-release1/oa/behavior/state_machine_oa_monitor.arcadia",
|
||||
"generated-release1/oa/capabilities.arcadia",
|
||||
"generated-release1/oa/model.arcadia",
|
||||
"generated-release1/oa/participants.arcadia",
|
||||
"generated-release1/oa/types.arcadia",
|
||||
"generated-release1/project.arcadia",
|
||||
"generated-release1/sa/behavior/process_sa_assessment_procedure.arcadia",
|
||||
"generated-release1/sa/behavior/process_sa_field_procedure.arcadia",
|
||||
"generated-release1/sa/behavior/process_sa_response.arcadia",
|
||||
"generated-release1/sa/behavior/scenario_sa_conversation.arcadia",
|
||||
"generated-release1/sa/behavior/scenario_sa_full_scenario.arcadia",
|
||||
"generated-release1/sa/behavior/state_machine_sa_monitor.arcadia",
|
||||
"generated-release1/sa/capabilities.arcadia",
|
||||
"generated-release1/sa/functions/function_sa_audit_thresholds.arcadia",
|
||||
"generated-release1/sa/functions/function_sa_restore_work.arcadia",
|
||||
"generated-release1/sa/model.arcadia",
|
||||
"generated-release1/sa/participants.arcadia",
|
||||
"generated-release1/sa/types.arcadia",
|
||||
"generated-release1/traceability.arcadia",
|
||||
"generated-release1/transition-before.json",
|
||||
"generated-release1/transition-request.json",
|
||||
"generated-release1/views/diagram_oa_allocation_view.arcadia",
|
||||
"generated-release1/views/diagram_sa_allocation_view.arcadia",
|
||||
"generated-release1/views/diagram_sa_capability_view.arcadia",
|
||||
"generated-release1/views/diagram_sa_service_view.arcadia",
|
||||
"generated-release1/views/diagram_sa_state_view.arcadia"
|
||||
],
|
||||
"generatedCount": 34
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
"""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'], 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'])
|
||||
composition = obj('helpers/composition.json')
|
||||
require(composition['patch'] == digest(raw('helpers/ordinary.patch')), 'composition patch')
|
||||
doc = obj('runs/language-doc-2/result.json')
|
||||
require(doc['strict'] is True and doc['docutils'] == '0.23', 'render settings')
|
||||
for field, path in [('source','render/language.rst'), ('html','render/language.html'), ('warnings','runs/language-doc-2/warnings.log')]:
|
||||
require(doc[field] == digest(raw(path)), 'render receipt ' + field)
|
||||
require(raw('runs/language-doc-2/warnings.log') == b'', 'successful render warnings')
|
||||
require(bool(raw('runs/language-doc-1/warnings.log')), 'failed render warning missing')
|
||||
for path in manifest['generatedFiles']:
|
||||
require(path.startswith('generated-release1/') and path in manifest['members'], 'generated mapping')
|
||||
require(len(manifest['generatedFiles']) == manifest['generatedCount'], 'generated count')
|
||||
print('PASS:', len(manifest['runs']), 'closed captures;', len(manifest['members']), 'members;', len(checked), 'input manifest/archive pairs')
|
||||
print('Integrity and receipt consistency only; no rerun, signature, binary verification, or GUI claim.')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -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.
|
||||
Binary file not shown.
@@ -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()
|
||||
Reference in New Issue
Block a user