P28-01-GATE: 原P28-01 whole-unit 受入ゲート(既存証拠の結合)
This commit is contained in:
+23684
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,873 @@
|
||||
{
|
||||
"schema": "p28-01-gate-conditions-v1",
|
||||
"conditions": [
|
||||
{
|
||||
"id": "P28-01-G0",
|
||||
"original": true,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "a76082f767e0a0d52cb70e2f66fa371b62a88754e9be319da3c08d4b48e78ba0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/admission.json",
|
||||
"sha256": "c4a3b5ba7a2b6427e55a6f85f037ded08e0c6bfd8c0a766647747ea9cc94378d"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/execution.json",
|
||||
"sha256": "a4d10e9b1a75a17b981792265338d64fac61178cb6f87dd646c5b486292db73c"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/bootstrap/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/collect_perf.py",
|
||||
"sha256": "43f3e42900a670957a01cfcaca7e485809527b79912a358917c935c57ea9c063"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/evidence/report.json",
|
||||
"sha256": "f1d447937158a884a1b287c3b5be38b6e73b73c5d748f9576401877402dabe1b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure-native/stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure.stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/before/evidence/report.json",
|
||||
"sha256": "a070c061ca783aaec37152bf66ad6b6e6dc69b80d9c4c024eceab916d4c5d4e9"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/execution.json",
|
||||
"sha256": "553971f55635e529b48634ef86ad7d4198c8bafe04d5a6a5ef778a4de0439fc1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/guarded.gd",
|
||||
"sha256": "c9deebb39ee643d312a77bae64f74cf6851697bb31036fc56d67dd7c4037ee09"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/measure.gd",
|
||||
"sha256": "95e5967835cb05ad96e8e6f257689d0bd831792aa9c228c022e3af81448ff76a"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/readiness.json",
|
||||
"sha256": "da93aecdd2c1648952e2a80382acb7e3f30cfe48a7e5df982315791161fedde2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant",
|
||||
"sha256": "eb4f770071eb07cd7e136fe54c3f78768cc8de7a4264e62a9af1f06a8f90f9bd"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"Tick と描画(CPU は P1〜P4)は E2。経路・snapshot・保存・読込は E3",
|
||||
"E2 と E3 の各 report の欄"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"稼働していた施設は100。GPU は null。E3 は headless・Ops OFF・x1",
|
||||
"記録の項目がそろえば成立する。予算の合否は条件に含まれない"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-G1",
|
||||
"original": true,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "external/018d39f49eb251238be3/result.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json",
|
||||
"sha256": "2886547ae2ccd000a85cf8374304f292f85ed2899d9ebe9818833600dc9ff55f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_INDEPENDENT_REVIEW_5DB97D7.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json",
|
||||
"sha256": "5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json",
|
||||
"sha256": "5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json",
|
||||
"sha256": "c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"collector C1/C9(`_set_speed`→`_process`、main)と RESTART RS1(UI での保存と読込)"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"測定の範囲は Mac(Mac16,10)。Windows での最終受入は未達のまま"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-G2",
|
||||
"original": true,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "a76082f767e0a0d52cb70e2f66fa371b62a88754e9be319da3c08d4b48e78ba0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/admission.json",
|
||||
"sha256": "c4a3b5ba7a2b6427e55a6f85f037ded08e0c6bfd8c0a766647747ea9cc94378d"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/execution.json",
|
||||
"sha256": "a4d10e9b1a75a17b981792265338d64fac61178cb6f87dd646c5b486292db73c"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/bootstrap/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/collect_perf.py",
|
||||
"sha256": "43f3e42900a670957a01cfcaca7e485809527b79912a358917c935c57ea9c063"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/evidence/report.json",
|
||||
"sha256": "f1d447937158a884a1b287c3b5be38b6e73b73c5d748f9576401877402dabe1b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure-native/stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure.stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/before/evidence/report.json",
|
||||
"sha256": "a070c061ca783aaec37152bf66ad6b6e6dc69b80d9c4c024eceab916d4c5d4e9"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/execution.json",
|
||||
"sha256": "553971f55635e529b48634ef86ad7d4198c8bafe04d5a6a5ef778a4de0439fc1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/guarded.gd",
|
||||
"sha256": "c9deebb39ee643d312a77bae64f74cf6851697bb31036fc56d67dd7c4037ee09"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/measure.gd",
|
||||
"sha256": "95e5967835cb05ad96e8e6f257689d0bd831792aa9c228c022e3af81448ff76a"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/readiness.json",
|
||||
"sha256": "da93aecdd2c1648952e2a80382acb7e3f30cfe48a7e5df982315791161fedde2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant",
|
||||
"sha256": "eb4f770071eb07cd7e136fe54c3f78768cc8de7a4264e62a9af1f06a8f90f9bd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json",
|
||||
"sha256": "c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"既定の autoload の世界、O の実際の Ops ON、RESTART の実際の継続"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"O は小さな入力(客0〜2)。200客での Ops ON は上限100のため不可"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-G3",
|
||||
"original": true,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json",
|
||||
"sha256": "5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json",
|
||||
"sha256": "5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json",
|
||||
"sha256": "c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/independent-review-bc703c9-changes-requested-r01/result.json",
|
||||
"sha256": "f2e67cb2adbef9c9294ec1e879da70b500fa27d2220d9ae1b9fb50c96cbdc3b2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_DELIVERY.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_RESULT.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/origin.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/result.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"RESTART RS1〜RS5(E5、E6)と、下の明示した証拠"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"下の判断材料を参照。最終的な判定は whole-unit の独立レビューが行う"
|
||||
],
|
||||
"product_contract": [
|
||||
{
|
||||
"path": "scripts/core/simulation_kernel.gd",
|
||||
"sha256": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb",
|
||||
"lines": "217-231"
|
||||
},
|
||||
{
|
||||
"path": "autoload/simulation_runtime.gd",
|
||||
"sha256": "dbde152e4d93a297e1215a281b22ccd97bed994541c3fc89417cb8f56304ad95",
|
||||
"lines": "521-583"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-G4",
|
||||
"original": true,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "external/018d39f49eb251238be3/result.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json",
|
||||
"sha256": "2886547ae2ccd000a85cf8374304f292f85ed2899d9ebe9818833600dc9ff55f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_INDEPENDENT_REVIEW_5DB97D7.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "a76082f767e0a0d52cb70e2f66fa371b62a88754e9be319da3c08d4b48e78ba0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/admission.json",
|
||||
"sha256": "c4a3b5ba7a2b6427e55a6f85f037ded08e0c6bfd8c0a766647747ea9cc94378d"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/execution.json",
|
||||
"sha256": "a4d10e9b1a75a17b981792265338d64fac61178cb6f87dd646c5b486292db73c"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json",
|
||||
"sha256": "5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json",
|
||||
"sha256": "5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json",
|
||||
"sha256": "c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"collector の停止契約と phase の失敗の記録、RESTART の改ざん・停止・境界"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"実施していない分岐は U1 で開示する"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-G5",
|
||||
"original": true,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "external/018d39f49eb251238be3/result.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json",
|
||||
"sha256": "2886547ae2ccd000a85cf8374304f292f85ed2899d9ebe9818833600dc9ff55f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_INDEPENDENT_REVIEW_5DB97D7.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/all-tests.json",
|
||||
"sha256": "31da4c4672f4321469183996e12fb23064b3772a69e8330052ab3e2ea66044f1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-ended.json",
|
||||
"sha256": "705fb2c12007bab125548742dc8d9b07918e30cae3a63c7d89e965c43b8b5f7b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-input.json",
|
||||
"sha256": "5bc9760c0c114a80a3c9e93634e733fc8fa93d4eeea5d8bcfda85d8e4eebd094"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"sha256": "0ff86a20891da66d84295f0c66ae7517ef586b54a1a668acb7778a450d473cd2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json",
|
||||
"sha256": "5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json",
|
||||
"sha256": "5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"E4 を再利用(source と marker の一致)。collector と RESTART の unit validation"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"製品が変わったら、全 roster をやり直す"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-G6",
|
||||
"original": true,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "external/018d39f49eb251238be3/result.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json",
|
||||
"sha256": "2886547ae2ccd000a85cf8374304f292f85ed2899d9ebe9818833600dc9ff55f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_INDEPENDENT_REVIEW_5DB97D7.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "a76082f767e0a0d52cb70e2f66fa371b62a88754e9be319da3c08d4b48e78ba0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/admission.json",
|
||||
"sha256": "c4a3b5ba7a2b6427e55a6f85f037ded08e0c6bfd8c0a766647747ea9cc94378d"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/execution.json",
|
||||
"sha256": "a4d10e9b1a75a17b981792265338d64fac61178cb6f87dd646c5b486292db73c"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/bootstrap/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/collect_perf.py",
|
||||
"sha256": "43f3e42900a670957a01cfcaca7e485809527b79912a358917c935c57ea9c063"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/evidence/report.json",
|
||||
"sha256": "f1d447937158a884a1b287c3b5be38b6e73b73c5d748f9576401877402dabe1b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure-native/stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure.stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/before/evidence/report.json",
|
||||
"sha256": "a070c061ca783aaec37152bf66ad6b6e6dc69b80d9c4c024eceab916d4c5d4e9"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/execution.json",
|
||||
"sha256": "553971f55635e529b48634ef86ad7d4198c8bafe04d5a6a5ef778a4de0439fc1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/guarded.gd",
|
||||
"sha256": "c9deebb39ee643d312a77bae64f74cf6851697bb31036fc56d67dd7c4037ee09"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/measure.gd",
|
||||
"sha256": "95e5967835cb05ad96e8e6f257689d0bd831792aa9c228c022e3af81448ff76a"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/readiness.json",
|
||||
"sha256": "da93aecdd2c1648952e2a80382acb7e3f30cfe48a7e5df982315791161fedde2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant",
|
||||
"sha256": "eb4f770071eb07cd7e136fe54c3f78768cc8de7a4264e62a9af1f06a8f90f9bd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/all-tests.json",
|
||||
"sha256": "31da4c4672f4321469183996e12fb23064b3772a69e8330052ab3e2ea66044f1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-ended.json",
|
||||
"sha256": "705fb2c12007bab125548742dc8d9b07918e30cae3a63c7d89e965c43b8b5f7b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-input.json",
|
||||
"sha256": "5bc9760c0c114a80a3c9e93634e733fc8fa93d4eeea5d8bcfda85d8e4eebd094"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"sha256": "0ff86a20891da66d84295f0c66ae7517ef586b54a1a668acb7778a450d473cd2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json",
|
||||
"sha256": "5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json",
|
||||
"sha256": "5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json",
|
||||
"sha256": "c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/independent-review-bc703c9-changes-requested-r01/result.json",
|
||||
"sha256": "f2e67cb2adbef9c9294ec1e879da70b500fa27d2220d9ae1b9fb50c96cbdc3b2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_DELIVERY.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_RESULT.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/origin.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/result.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"全 receipt の SHA、Root の結合、verifier の manifest"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"—"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-U1",
|
||||
"original": false,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "external/018d39f49eb251238be3/result.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json",
|
||||
"sha256": "2886547ae2ccd000a85cf8374304f292f85ed2899d9ebe9818833600dc9ff55f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_INDEPENDENT_REVIEW_5DB97D7.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "a76082f767e0a0d52cb70e2f66fa371b62a88754e9be319da3c08d4b48e78ba0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/admission.json",
|
||||
"sha256": "c4a3b5ba7a2b6427e55a6f85f037ded08e0c6bfd8c0a766647747ea9cc94378d"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/execution.json",
|
||||
"sha256": "a4d10e9b1a75a17b981792265338d64fac61178cb6f87dd646c5b486292db73c"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/bootstrap/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/collect_perf.py",
|
||||
"sha256": "43f3e42900a670957a01cfcaca7e485809527b79912a358917c935c57ea9c063"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/evidence/report.json",
|
||||
"sha256": "f1d447937158a884a1b287c3b5be38b6e73b73c5d748f9576401877402dabe1b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure-native/stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure.stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/before/evidence/report.json",
|
||||
"sha256": "a070c061ca783aaec37152bf66ad6b6e6dc69b80d9c4c024eceab916d4c5d4e9"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/execution.json",
|
||||
"sha256": "553971f55635e529b48634ef86ad7d4198c8bafe04d5a6a5ef778a4de0439fc1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/guarded.gd",
|
||||
"sha256": "c9deebb39ee643d312a77bae64f74cf6851697bb31036fc56d67dd7c4037ee09"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/measure.gd",
|
||||
"sha256": "95e5967835cb05ad96e8e6f257689d0bd831792aa9c228c022e3af81448ff76a"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/readiness.json",
|
||||
"sha256": "da93aecdd2c1648952e2a80382acb7e3f30cfe48a7e5df982315791161fedde2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant",
|
||||
"sha256": "eb4f770071eb07cd7e136fe54c3f78768cc8de7a4264e62a9af1f06a8f90f9bd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/all-tests.json",
|
||||
"sha256": "31da4c4672f4321469183996e12fb23064b3772a69e8330052ab3e2ea66044f1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-ended.json",
|
||||
"sha256": "705fb2c12007bab125548742dc8d9b07918e30cae3a63c7d89e965c43b8b5f7b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-input.json",
|
||||
"sha256": "5bc9760c0c114a80a3c9e93634e733fc8fa93d4eeea5d8bcfda85d8e4eebd094"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"sha256": "0ff86a20891da66d84295f0c66ae7517ef586b54a1a668acb7778a450d473cd2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json",
|
||||
"sha256": "5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json",
|
||||
"sha256": "5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json",
|
||||
"sha256": "c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/independent-review-bc703c9-changes-requested-r01/result.json",
|
||||
"sha256": "f2e67cb2adbef9c9294ec1e879da70b500fa27d2220d9ae1b9fb50c96cbdc3b2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_DELIVERY.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_RESULT.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/origin.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/result.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"未達と、実施していない分岐を、合格に数えずに開示する"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"予算の未達: P1 x1 平均 479.210 ms > 4、P1 stall 最大 4809.099 ms > 50、P2 x3 P95 5062.697 ms > 12、P2 stall 最大 5891.466 ms > 50。",
|
||||
"200客での Operations ON(不可)。O の P3/P4 の合格は、小さな入力に限られる。",
|
||||
"GPU 時間は null(gl_compatibility)。R0 と O0 は CPU も null。",
|
||||
"同一の Windows 実機、長期の操作感とバランス、ゲーム全体の受入。",
|
||||
"RESTART の low 3件と、G3 の判断の結果。"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "P28-01-U2",
|
||||
"original": false,
|
||||
"evidence": [
|
||||
{
|
||||
"path": "external/018d39f49eb251238be3/result.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json",
|
||||
"sha256": "2886547ae2ccd000a85cf8374304f292f85ed2899d9ebe9818833600dc9ff55f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_INDEPENDENT_REVIEW_5DB97D7.json",
|
||||
"sha256": "23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "a76082f767e0a0d52cb70e2f66fa371b62a88754e9be319da3c08d4b48e78ba0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/admission.json",
|
||||
"sha256": "c4a3b5ba7a2b6427e55a6f85f037ded08e0c6bfd8c0a766647747ea9cc94378d"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/execution.json",
|
||||
"sha256": "a4d10e9b1a75a17b981792265338d64fac61178cb6f87dd646c5b486292db73c"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/bootstrap/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/collect_perf.py",
|
||||
"sha256": "43f3e42900a670957a01cfcaca7e485809527b79912a358917c935c57ea9c063"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/evidence/report.json",
|
||||
"sha256": "f1d447937158a884a1b287c3b5be38b6e73b73c5d748f9576401877402dabe1b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure-native/stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/after/measure.stdout.log",
|
||||
"sha256": "294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/before/evidence/report.json",
|
||||
"sha256": "a070c061ca783aaec37152bf66ad6b6e6dc69b80d9c4c024eceab916d4c5d4e9"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/execution.json",
|
||||
"sha256": "553971f55635e529b48634ef86ad7d4198c8bafe04d5a6a5ef778a4de0439fc1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/guarded.gd",
|
||||
"sha256": "c9deebb39ee643d312a77bae64f74cf6851697bb31036fc56d67dd7c4037ee09"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/measure.gd",
|
||||
"sha256": "95e5967835cb05ad96e8e6f257689d0bd831792aa9c228c022e3af81448ff76a"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/run-r02/readiness.json",
|
||||
"sha256": "da93aecdd2c1648952e2a80382acb7e3f30cfe48a7e5df982315791161fedde2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/profile_guard.gd",
|
||||
"sha256": "597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant",
|
||||
"sha256": "eb4f770071eb07cd7e136fe54c3f78768cc8de7a4264e62a9af1f06a8f90f9bd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/all-tests.json",
|
||||
"sha256": "31da4c4672f4321469183996e12fb23064b3772a69e8330052ab3e2ea66044f1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-ended.json",
|
||||
"sha256": "705fb2c12007bab125548742dc8d9b07918e30cae3a63c7d89e965c43b8b5f7b"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/runner-input.json",
|
||||
"sha256": "5bc9760c0c114a80a3c9e93634e733fc8fa93d4eeea5d8bcfda85d8e4eebd094"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"sha256": "0ff86a20891da66d84295f0c66ae7517ef586b54a1a668acb7778a450d473cd2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json",
|
||||
"sha256": "5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json",
|
||||
"sha256": "5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/ROOT_RAW_ACCEPTANCE_JOIN.json",
|
||||
"sha256": "6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json",
|
||||
"sha256": "c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/independent-review-bc703c9-changes-requested-r01/result.json",
|
||||
"sha256": "f2e67cb2adbef9c9294ec1e879da70b500fa27d2220d9ae1b9fb50c96cbdc3b2"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_DELIVERY.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_RESULT.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/origin.json",
|
||||
"sha256": "90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/actual-output-after-receiver-timeout/result.json",
|
||||
"sha256": "b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300"
|
||||
}
|
||||
],
|
||||
"basis": [
|
||||
"再利用する各証拠は、それ自身の source・設定・engine・marker・入力・範囲にだけ適用する"
|
||||
],
|
||||
"scope_and_unmet": [
|
||||
"全証拠に共通の入力を仮定しない。各固定証拠とその manifest 参照を個別に検査する。"
|
||||
]
|
||||
}
|
||||
],
|
||||
"original_condition_count": 7,
|
||||
"auxiliary_condition_count": 2,
|
||||
"package_denominator": 30,
|
||||
"deliverable_denominator": 88,
|
||||
"original_completed_before_gate": 22,
|
||||
"package_status": "in_progress",
|
||||
"whole_unit_accepted": false,
|
||||
"g3_decision": "independent_review_required",
|
||||
"g3_material": "(これらは証拠の提示であって、合否はそこから導きません):\n- E7 の最終 review の RS5 の判断(「overload は条件付きの分岐で、実施されていないことを開示し、保持されるとは主張しない」)と、low の1件目(「0でない backlog の保持は実施していない」)。\n- 製品の契約: `scripts/core/simulation_kernel.gd:217-231`(`restore_clock` が `_accumulator` を0に戻し、`_skip_next_process` を立てる)と、snapshot の範囲(`autoload/simulation_runtime.gd:521-583`)。1分未満の accumulator は、保存される状態の外にある。\n- 「発生しなかった」ことは、保存できたことの証明ではありません。独立レビューは、原本の条件「途中保存・再起動で再現」が、overload で止まって backlog が0でない状態の保存と、1分未満の実時間の位相までを要求するかどうかを、原文と上の証拠から判断します。要求すると判断した場合は、未達として changes_requested にします。",
|
||||
"unmet": [
|
||||
"予算の未達: P1 x1 平均 479.210 ms > 4、P1 stall 最大 4809.099 ms > 50、P2 x3 P95 5062.697 ms > 12、P2 stall 最大 5891.466 ms > 50。",
|
||||
"200客での Operations ON(不可)。O の P3/P4 の合格は、小さな入力に限られる。",
|
||||
"GPU 時間は null(gl_compatibility)。R0 と O0 は CPU も null。",
|
||||
"同一の Windows 実機、長期の操作感とバランス、ゲーム全体の受入。",
|
||||
"RESTART の low 3件と、G3 の判断の結果。"
|
||||
],
|
||||
"restart_low_findings": [
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "RS5: non-zero backlog preservation is still unexercised. Both writers had overloads=0 and backlog_at_save=0. This is correctly disclosed (coverage.overload_nonzero_backlog=not_exercised, no persistence claim), and the contract treats overload as conditional. Even so, 'backlog not consumed' has only been shown with backlog 0. Do not cite this run as proof that a stopped state with a non-zero backlog survives a restart."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "RS6: the public report includes probe_deadline.engine_elapsed_at_begin_seconds, a wall-clock engine start-up time of 1.5–1.9 s. It is a watchdog diagnostic outside deterministic_step and not a performance or budget claim. However, check_no_metrics and public_has_forbidden only reject the key suffixes *_us/*_ms and a few names, so timing values in seconds pass without check. Consider either listing this field in an explicit allowlist or keeping it only in the sidecar."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "RS4: the checker does not prove that at_390.events is complete. It checks that each listed event is in the 390 window and inside (saved_minute, 390]. It does not check that every event in that interval is present, for example that domain_event_counter minus the E index equals the event count, or that the window did not overflow. In this run the raw data is complete (IDs 9–24 are contiguous, counter 24, and the recent window holds 24 of 256), so this is a gap in the checker's strength, not a defect in this run."
|
||||
}
|
||||
],
|
||||
"scopes": {
|
||||
"full9_commit": "db9d6132a8349928560dc4a4a99306d27a81e332",
|
||||
"r02_display": "headless",
|
||||
"r02_operations": "OFF",
|
||||
"r02_speed": "x1",
|
||||
"r02_seed_field_present": false,
|
||||
"r02_seed_provenance": "Input SHA equals E2 R; E2 R report seed 28012026. No seed field is invented in r02.",
|
||||
"r02_marker": "not_applicable: performance observation, not a regression run",
|
||||
"R_registered": [
|
||||
20000,
|
||||
200,
|
||||
50,
|
||||
150
|
||||
],
|
||||
"R_active_facilities": 100,
|
||||
"O_guest_range": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"P2_warm_minutes": 31,
|
||||
"CPU_measured_phases": [
|
||||
"P1",
|
||||
"P2",
|
||||
"P3",
|
||||
"P4"
|
||||
],
|
||||
"GPU_value": null,
|
||||
"GPU_reason": "zero_from_api_on_gl_compatibility_unsupported_or_unmeasured",
|
||||
"budget_pass": false,
|
||||
"Windows_verified": false,
|
||||
"approval": "Existing delegation; no new human utterance"
|
||||
}
|
||||
}
|
||||
+337
@@ -0,0 +1,337 @@
|
||||
"""Synthetic tests; no engine, Runner, or actual evidence bundle required."""
|
||||
import contextlib
|
||||
import copy
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
sys.dont_write_bytecode = True
|
||||
import verify_p28_01_evidence as v
|
||||
|
||||
|
||||
def measured(count=10):
|
||||
return dict(count=count, mean=1, p95=2, max=3, reason=None)
|
||||
|
||||
|
||||
def unmeasured():
|
||||
return dict(count=0, mean=None, p95=None, max=None, reason=v.NULL_REASON)
|
||||
|
||||
|
||||
def full_fixture():
|
||||
admission = dict(commit=v.FULL_COMMIT, source_map={str(i): "a" * 64 for i in range(1407)})
|
||||
phases = [dict(phase=k, passed=True) for k in ("import", "parse-base", "parse-wrapper")]
|
||||
for name in ("R0", "P1", "P2", "O0", "P3", "P4"):
|
||||
representative = name in ("R0", "P1", "P2")
|
||||
count = dict(walkable_cells=20000, guests=200, staff=50, facilities=150)
|
||||
registered = {k: dict(min=x, max=x) for k, x in count.items()}
|
||||
if not representative:
|
||||
registered["guests"] = dict(min=0, max=2)
|
||||
measurement = dict(start_minute=30, end_minute=150, start_wall=1, end_wall=2, frames=150,
|
||||
frame_observation={"sim_us_per_minute": measured()},
|
||||
render_gpu_ms=unmeasured(),
|
||||
render_cpu_ms=unmeasured() if name in ("R0", "O0") else measured({"P1": 150, "P2": 50, "P3": 2398, "P4": 745}[name]),
|
||||
count_ranges=dict(registered=registered, active=dict(facilities=dict(min=100, max=100))))
|
||||
report = dict(seed="28012026", speed=3 if name in ("P2", "P4") else 1,
|
||||
metadata=dict(machine={"hw.model": "Mac16,10"}, build=dict(project_commit=v.FULL_COMMIT, engine_sha256=v.ENGINE)),
|
||||
measurement=measurement, warmup=dict(actual_minutes=31 if name == "P2" else 30),
|
||||
budget_verdict=dict(simulation=dict(passed=False, value=479210, limit_us=4000)))
|
||||
phases.append(dict(phase=name, passed=True, report=report))
|
||||
return dict(admission=copy.deepcopy(admission), passed=True, phases=phases), admission
|
||||
|
||||
|
||||
class MemoryEvidence:
|
||||
def __init__(self, files):
|
||||
self.files = files
|
||||
|
||||
def raw(self, path):
|
||||
return self.files[path]
|
||||
|
||||
def json(self, path):
|
||||
return json.loads(self.raw(path))
|
||||
|
||||
|
||||
def r02_fixture():
|
||||
report = dict(pid=46264, input_sha256="a" * 64,
|
||||
counts_prepared=dict(walkable_cells=20000, guests=200, staff=50, facilities=150),
|
||||
advance_one_minute_wall_ms_x1=measured(300),
|
||||
prepared_state_sha256="b" * 64, migrated_input_state_sha256="c" * 64,
|
||||
running_state_sha256="d" * 64)
|
||||
for key in ("path_after_tick_ms", "path_after_request_ms", "path_after_cancel_ms", "save_load_ms"):
|
||||
report[key] = {"found_cold": measured(245)}
|
||||
readiness = dict(fixture_sha256="a" * 64, engine_sha256=v.ENGINE,
|
||||
hardware=["Mac16,10", "10", "10", "25769803776"],
|
||||
after="83b170a4c7176761b0b18d8e9292017d990e80a9", after_source_files=1407,
|
||||
probe_sha256=v.digest(b"probe"), runner_sha256=v.digest(b"runner"))
|
||||
raw = json.dumps(report).encode()
|
||||
execution = dict(phases=[dict(variant="after", phase="measure", actual_pid=46264,
|
||||
report=report, report_sha256=v.digest(raw), argv=["engine", "--headless"])])
|
||||
files = {v.PERF + "run-r02/readiness.json": json.dumps(readiness).encode(),
|
||||
v.PERF + "run-r02/execution.json": json.dumps(execution).encode(),
|
||||
v.PERF + "run-r02/after/evidence/report.json": raw,
|
||||
v.PERF + "run-r02/after/measure.stdout.log": b"P14_03_PERF_REPORT=" + raw + b"\n",
|
||||
v.PERF + "run-r02/measure.gd": b"probe", v.PERF + "collect_perf.py": b"runner"}
|
||||
return MemoryEvidence(files), {"R0": dict(input_sha256="a" * 64)}
|
||||
|
||||
|
||||
def restart_fixture():
|
||||
phases = [dict(phase=k, passed=True, process=dict(pid=i))
|
||||
for i, k in enumerate(("import", "parse-base", "parse-wrapper"))]
|
||||
for i, name in enumerate(("R-writer", "R-reader", "O-writer", "O-reader"), 3):
|
||||
at = dict(clock=dict(absolute_minute=390), domain_event_counter=24,
|
||||
events=[dict(event_id="domain_event.%012d" % j) for j in range(9, 25)])
|
||||
report = dict(pid=i, actual_k=30, saved_minute=361,
|
||||
minutes=[dict(after=362+j, sha256=str(j)) for j in range(30)],
|
||||
io=[dict(code="CHECKSUM_MISMATCH")], at_390=at if name.startswith("O") else None)
|
||||
phases.append(dict(phase=name, passed=True, report=report, process=dict(pid=i)))
|
||||
return dict(passed=True, phases=phases)
|
||||
|
||||
|
||||
class EvidenceTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.tmp = tempfile.TemporaryDirectory(dir=os.environ.get("BUILD_OUTPUT_DIR"))
|
||||
self.addCleanup(self.tmp.cleanup)
|
||||
self.root = Path(self.tmp.name).resolve()
|
||||
self.project = self.root / "project"
|
||||
self.bundle_root = self.root / "evidence"
|
||||
self.project.mkdir()
|
||||
self.bundle_root.mkdir()
|
||||
|
||||
def bundle(self):
|
||||
raw = b'{"passed":true}\n'
|
||||
(self.bundle_root / "receipt.json").write_bytes(raw)
|
||||
manifest = dict(files=[dict(path="receipt.json", original_path="/old/receipt.json", location="bundle", bytes=len(raw), sha256=v.digest(raw))])
|
||||
return v.Bundle(self.project, self.bundle_root, manifest)
|
||||
|
||||
def test_bundle_positive_and_original_path_resolution(self):
|
||||
b = self.bundle()
|
||||
b.verify_all()
|
||||
self.assertEqual(b.json("/old/receipt.json"), dict(passed=True))
|
||||
|
||||
def test_missing_file(self):
|
||||
b = self.bundle()
|
||||
(self.bundle_root / "receipt.json").unlink()
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
b.verify_all()
|
||||
|
||||
def test_extra_file(self):
|
||||
b = self.bundle()
|
||||
(self.bundle_root / "extra").write_bytes(b"x")
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
b.verify_all()
|
||||
|
||||
def test_file_outside_manifest(self):
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
self.bundle().raw("unknown.json")
|
||||
|
||||
def test_same_size_tampering(self):
|
||||
b = self.bundle()
|
||||
p = self.bundle_root / "receipt.json"
|
||||
p.write_bytes(p.read_bytes().replace(b"true", b"null"))
|
||||
with self.assertRaisesRegex(v.InvalidEvidence, "SHA256"):
|
||||
b.verify_all()
|
||||
|
||||
def test_byte_count_tampering(self):
|
||||
b = self.bundle()
|
||||
(self.bundle_root / "receipt.json").write_bytes(b"x")
|
||||
with self.assertRaisesRegex(v.InvalidEvidence, "byte count"):
|
||||
b.verify_all()
|
||||
|
||||
def test_traversal_and_symlink(self):
|
||||
for name in ("../escape", "/absolute"):
|
||||
with self.subTest(name=name), self.assertRaises(v.InvalidEvidence):
|
||||
v.safe_path(self.bundle_root, name)
|
||||
(self.bundle_root / "alias").symlink_to(self.project)
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.safe_path(self.bundle_root, "alias")
|
||||
|
||||
def test_duplicate_json_keys(self):
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.load_json('{"passed":false,"passed":true}')
|
||||
|
||||
def test_full9_positive(self):
|
||||
self.assertEqual(len(v.full9(*full_fixture())), 6)
|
||||
|
||||
def test_empty_stall_samples_are_disclosed(self):
|
||||
e, a = full_fixture()
|
||||
for p in e["phases"][-2:]:
|
||||
p["report"]["measurement"]["frame_observation"]["stall_over_50000_us"] = dict(count=0, mean=None, p95=None, max=None, reason="no_samples")
|
||||
v.full9(e, a)
|
||||
e["phases"][-1]["report"]["measurement"]["frame_observation"]["stall_over_50000_us"]["mean"] = 0
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.full9(e, a)
|
||||
|
||||
def test_probe_bytes_must_match_base(self):
|
||||
p = self.project / "restart_probe.gd"
|
||||
p.write_bytes(b"base/Q probe")
|
||||
pins = {p.name: v.digest(p.read_bytes())}
|
||||
v.verify_base_files(self.project, pins)
|
||||
p.write_bytes(b"modified probe")
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.verify_base_files(self.project, pins)
|
||||
|
||||
def test_full9_commit_cannot_be_Q(self):
|
||||
e, a = full_fixture()
|
||||
a["commit"] = "3ac2cedc8dc977778fd5a3ba152197cc6cf00fa2"
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.full9(e, a)
|
||||
|
||||
def test_full9_boundary_and_scope_rejections(self):
|
||||
mutations = {
|
||||
"R0 CPU claimed": lambda r: r["R0"]["measurement"].update(render_cpu_ms=measured()),
|
||||
"O0 CPU claimed": lambda r: r["O0"]["measurement"].update(render_cpu_ms=measured()),
|
||||
"GPU zero": lambda r: r["P1"]["measurement"]["render_gpu_ms"].update(mean=0),
|
||||
"GPU pass": lambda r: r["P1"]["measurement"].update(render_gpu_ms=measured()),
|
||||
"budget false becomes pass": lambda r: r["P1"]["budget_verdict"]["simulation"].update(passed=True),
|
||||
"registered facilities 100": lambda r: r["P1"]["measurement"]["count_ranges"]["registered"].update(facilities=dict(min=100,max=100)),
|
||||
"O 200 guests": lambda r: r["P3"]["measurement"]["count_ranges"]["registered"].update(guests=dict(min=200,max=200)),
|
||||
"warmup 150": lambda r: r["P2"]["warmup"].update(actual_minutes=150),
|
||||
"missing interval": lambda r: r["P1"]["measurement"].pop("start_minute"),
|
||||
"missing P95": lambda r: r["P1"]["measurement"]["render_cpu_ms"].pop("p95"),
|
||||
}
|
||||
for name, mutate in mutations.items():
|
||||
with self.subTest(name=name):
|
||||
e, a = full_fixture()
|
||||
mutate({p["phase"]: p["report"] for p in e["phases"][3:]})
|
||||
with self.assertRaises((v.InvalidEvidence, KeyError)):
|
||||
v.full9(e, a)
|
||||
|
||||
def test_r02_positive(self):
|
||||
ready, report = v.r02(*r02_fixture())
|
||||
self.assertEqual(report["pid"], 46264)
|
||||
|
||||
def test_r02_windowed_and_seed_rejected(self):
|
||||
for mode in ("windowed", "invented seed", "wrong PID", "stdout mismatch", "input mismatch"):
|
||||
with self.subTest(mode=mode):
|
||||
b, reports = r02_fixture()
|
||||
path = v.PERF + "run-r02/execution.json"
|
||||
e = b.json(path)
|
||||
if mode == "windowed":
|
||||
e["phases"][0]["argv"] = ["engine"]
|
||||
elif mode == "wrong PID":
|
||||
e["phases"][0]["actual_pid"] = 7
|
||||
elif mode == "stdout mismatch":
|
||||
b.files[v.PERF + "run-r02/after/measure.stdout.log"] = b"P14_03_PERF_REPORT={}\n"
|
||||
elif mode == "input mismatch":
|
||||
reports["R0"]["input_sha256"] = "0" * 64
|
||||
else:
|
||||
report = e["phases"][0]["report"]
|
||||
report["seed"] = 28012026
|
||||
raw = json.dumps(report).encode()
|
||||
e["phases"][0]["report_sha256"] = v.digest(raw)
|
||||
b.files[v.PERF + "run-r02/after/evidence/report.json"] = raw
|
||||
b.files[v.PERF + "run-r02/after/measure.stdout.log"] = b"P14_03_PERF_REPORT=" + raw
|
||||
b.files[path] = json.dumps(e).encode()
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.r02(b, reports)
|
||||
|
||||
def test_all_four_normal_gates_required(self):
|
||||
rows = [dict(kind=k, passed=1) for k in ("validation", "review", "integration", "final")]
|
||||
v.four_gates(rows)
|
||||
for i in range(4):
|
||||
with self.subTest(missing=i), self.assertRaises(v.InvalidEvidence):
|
||||
v.four_gates(rows[:i] + rows[i+1:])
|
||||
rows[2]["passed"] = 0
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.four_gates(rows)
|
||||
|
||||
def test_restart_positive(self):
|
||||
self.assertEqual(len(v.restart(restart_fixture())), 4)
|
||||
|
||||
def test_restart_pid_minutes_tamper_and_boundary(self):
|
||||
mutations = {
|
||||
"PID reuse": lambda p: p[4]["report"].update(pid=3),
|
||||
"K missing": lambda p: p[3]["report"].update(actual_k=29),
|
||||
"typed SHA": lambda p: p[4]["report"]["minutes"][0].update(sha256="bad"),
|
||||
"tamper accepted": lambda p: p[4]["report"].update(io=[dict(code="OK")]),
|
||||
"event omission": lambda p: p[5]["report"]["at_390"]["events"].pop(),
|
||||
"counter wrong": lambda p: p[5]["report"]["at_390"].update(domain_event_counter=23),
|
||||
}
|
||||
for name, mutate in mutations.items():
|
||||
with self.subTest(name=name):
|
||||
e = restart_fixture()
|
||||
mutate(e["phases"])
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.restart(e)
|
||||
|
||||
def test_regression_positive_and_source_marker_rejection(self):
|
||||
source = {str(i): "a" * 64 for i in range(1407)}
|
||||
tests = [dict(test=str(i), passed=True, failed=False) for i in range(192)]
|
||||
reg = dict(selected_source_map=copy.deepcopy(source), marker_contract_sha256="marker", engine_sha256=v.ENGINE, roster=[r["test"] for r in tests])
|
||||
ended = dict(passed=True, actual_suites=192, failed_suites=0, strict_accepted_checks=22198, actual_all_roster_checks=22198)
|
||||
v.regression(reg, ended, tests, source, "marker")
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.regression(reg, ended, tests, source, "changed")
|
||||
source["0"] = "changed"
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.regression(reg, ended, tests, source, "marker")
|
||||
|
||||
def test_disclosures_cannot_be_removed_or_promoted(self):
|
||||
expected = json.loads(Path(v.__file__).with_name("GATE_CONDITIONS.json").read_text())
|
||||
v.verify_conditions(copy.deepcopy(expected), expected)
|
||||
mutations = {
|
||||
"missing U1 disclosure": lambda c: c["unmet"].pop(),
|
||||
"U1 is original": lambda c: c["conditions"][-2].update(original=True),
|
||||
"U2 is original": lambda c: c["conditions"][-1].update(original=True),
|
||||
"G3 absent overload proves pass": lambda c: c.update(g3_decision="pass"),
|
||||
"whole unit self accepted": lambda c: c.update(whole_unit_accepted=True),
|
||||
"low finding omitted": lambda c: c["restart_low_findings"].pop(),
|
||||
"windowed attribution": lambda c: c["scopes"].update(r02_display="windowed"),
|
||||
"seed invented": lambda c: c["scopes"].update(r02_seed_field_present=True),
|
||||
}
|
||||
for name, mutate in mutations.items():
|
||||
with self.subTest(name=name):
|
||||
c = copy.deepcopy(expected)
|
||||
mutate(c)
|
||||
with self.assertRaises(v.InvalidEvidence):
|
||||
v.verify_conditions(c, expected)
|
||||
|
||||
def test_manifest_and_conditions_seals(self):
|
||||
here = Path(v.__file__).parent
|
||||
self.assertEqual(v.digest((here / "EVIDENCE_BUNDLE_MANIFEST.json").read_bytes()), v.MANIFEST_SHA256)
|
||||
self.assertEqual(v.digest((here / "GATE_CONDITIONS.json").read_bytes()), v.CONDITIONS_SHA256)
|
||||
# Also reject ambiguous aliases before any actual bundle is read.
|
||||
v.Bundle(self.project, self.bundle_root, json.loads((here / "EVIDENCE_BUNDLE_MANIFEST.json").read_text()))
|
||||
|
||||
def test_cli_missing_root_and_missing_bundle_are_structured(self):
|
||||
for args in ([], ["--project-root", str(self.project)],
|
||||
["--project-root", str(self.project), "--evidence-root", str(self.root / "missing")]):
|
||||
with self.subTest(args=args), patch.dict(os.environ, {}, clear=True), contextlib.redirect_stdout(io.StringIO()) as out:
|
||||
self.assertEqual(v.main(args), 1)
|
||||
data = json.loads(out.getvalue())
|
||||
self.assertFalse(data["passed"])
|
||||
self.assertEqual(len(data["conditions"]), 9)
|
||||
self.assertTrue(data["failures"])
|
||||
|
||||
def test_source_output_refused(self):
|
||||
output = self.project / "forbidden.json"
|
||||
with contextlib.redirect_stdout(io.StringIO()) as out:
|
||||
self.assertEqual(v.main(["--project-root", str(self.project), "--json", str(output)]), 1)
|
||||
self.assertFalse(output.exists())
|
||||
self.assertFalse(json.loads(out.getvalue())["passed"])
|
||||
|
||||
def test_failure_json_explicit_and_build_default(self):
|
||||
for explicit in (True, False):
|
||||
with self.subTest(explicit=explicit):
|
||||
output = self.root / ("explicit.json" if explicit else "p28-01-gate-verify.json")
|
||||
args = ["--project-root", str(self.project), "--evidence-root", str(self.root / "missing")]
|
||||
if explicit:
|
||||
args += ["--json", str(output)]
|
||||
with patch.dict(os.environ, {"BUILD_OUTPUT_DIR": str(self.root)}), contextlib.redirect_stdout(io.StringIO()) as out:
|
||||
self.assertEqual(v.main(args), 1)
|
||||
self.assertEqual(json.loads(output.read_text()), json.loads(out.getvalue()))
|
||||
|
||||
def test_checkout_docs_are_read_from_project(self):
|
||||
(self.project / "doc.json").write_bytes(b"{}")
|
||||
manifest = dict(files=[dict(path="doc.json", location="checkout", bytes=2, sha256=v.digest(b"{}"))])
|
||||
b = v.Bundle(self.project, self.bundle_root, manifest)
|
||||
b.verify_all()
|
||||
self.assertEqual(b.json("doc.json"), {})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main(verbosity=2)
|
||||
+362
@@ -0,0 +1,362 @@
|
||||
"""Read-only evidence join. A successful join is NOT whole-unit acceptance.
|
||||
|
||||
Only the standard library is used. No engine, product module or Runner is run.
|
||||
The manifest is sealed to prevent replacing both evidence and its claimed hash.
|
||||
"""
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
BASE = "0aee05e1d987e126ee9c00536aed5d9c75115d00"
|
||||
MANIFEST_SHA256 = "f95f2cd3777fa60c7dbbdfd6777c647bda1165cefc2a186ec87218f3c8f76848"
|
||||
CONDITIONS_SHA256 = "6268646995bef77fe96b6246c90e8d37eba4f1fda3314d2b1aa1e35018bc1a78"
|
||||
DOC = "docs/plans/original-completion-2026-10-02/execution/"
|
||||
ART = "artifacts/original-completion-2026-10-02/"
|
||||
PERF = ART + "p14-03-representative-perf-r01/"
|
||||
FULL = ART + "p28-01-runner-preflight-r01/full-measurement-db9d613-r01/"
|
||||
PRE = ART + "p28-01-runner-preflight-r01/"
|
||||
RESTART = PRE + "native-restart-954528a-r01/"
|
||||
REG = ART + "p14-03-formal-regression-83b170a-r01/"
|
||||
ENGINE = "c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf"
|
||||
FULL_COMMIT = "db9d6132a8349928560dc4a4a99306d27a81e332"
|
||||
NULL_REASON = "zero_from_api_on_gl_compatibility_unsupported_or_unmeasured"
|
||||
IDS = ["P28-01-" + k for k in ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "U1", "U2"]]
|
||||
|
||||
|
||||
class InvalidEvidence(ValueError):
|
||||
pass
|
||||
|
||||
|
||||
def require(value, message):
|
||||
if not value:
|
||||
raise InvalidEvidence(message)
|
||||
|
||||
|
||||
def digest(raw):
|
||||
return hashlib.sha256(raw).hexdigest()
|
||||
|
||||
|
||||
def load_json(raw):
|
||||
def pairs(items):
|
||||
result = {}
|
||||
for key, value in items:
|
||||
require(key not in result, "duplicate JSON key: " + key)
|
||||
result[key] = value
|
||||
return result
|
||||
return json.loads(raw, object_pairs_hook=pairs,
|
||||
parse_constant=lambda value: (_ for _ in ()).throw(InvalidEvidence(value)))
|
||||
|
||||
|
||||
def safe_path(root, name):
|
||||
p = Path(name)
|
||||
require(not p.is_absolute() and p.parts and ".." not in p.parts,
|
||||
"unsafe evidence path: " + name)
|
||||
target = root / p
|
||||
require(not any(part.is_symlink() for part in [target, *target.parents]),
|
||||
"symlink refused: " + name)
|
||||
require(target.resolve().is_relative_to(root.resolve()), "path escaped root: " + name)
|
||||
return target
|
||||
|
||||
|
||||
class Bundle:
|
||||
def __init__(self, project, root, manifest):
|
||||
self.project, self.root = project, root
|
||||
self.entries = {}
|
||||
self.aliases = {}
|
||||
for row in manifest["files"]:
|
||||
key = row["path"]
|
||||
require(key not in self.entries, "duplicate manifest path: " + key)
|
||||
require(row["location"] in ("bundle", "checkout"), "invalid location")
|
||||
self.entries[key] = row
|
||||
self.aliases[key] = key
|
||||
if row.get("original_path"):
|
||||
alias = row["original_path"]
|
||||
require(alias not in self.aliases or self.aliases[alias] == key,
|
||||
"ambiguous original_path: " + alias)
|
||||
self.aliases[alias] = key
|
||||
|
||||
def raw(self, name):
|
||||
require(name in self.aliases, "file outside manifest: " + name)
|
||||
row = self.entries[self.aliases[name]]
|
||||
root = self.project if row["location"] == "checkout" else self.root
|
||||
data = safe_path(root, row["path"]).read_bytes()
|
||||
require(len(data) == row["bytes"], "byte count mismatch: " + name)
|
||||
require(digest(data) == row["sha256"], "SHA256 mismatch: " + name)
|
||||
return data
|
||||
|
||||
def json(self, name):
|
||||
return load_json(self.raw(name))
|
||||
|
||||
def verify_all(self):
|
||||
require(self.root.is_dir(), "evidence root missing")
|
||||
actual = {p.relative_to(self.root).as_posix() for p in self.root.rglob("*")
|
||||
if p.is_file() or p.is_symlink()}
|
||||
expected = {k for k, v in self.entries.items() if v["location"] == "bundle"}
|
||||
require(actual == expected, "bundle inventory differs: " + repr({
|
||||
"missing": sorted(expected - actual), "extra": sorted(actual - expected)}))
|
||||
for name in self.entries:
|
||||
self.raw(name)
|
||||
|
||||
|
||||
def product_sources(project):
|
||||
# Same selection as tools/run_all_tests.py:source_refs, without importing it.
|
||||
paths = [p for folder in ("autoload", "scripts", "scenes", "data", "tests", "assets", "tools")
|
||||
for p in (project / folder).rglob("*")
|
||||
if p.is_file() and p.name != ".DS_Store" and "__pycache__" not in p.parts]
|
||||
paths += [project / p for p in ("project.godot", "export_presets.cfg", "Makefile", "AGENTS.md")]
|
||||
return {p.relative_to(project).as_posix(): digest(safe_path(project, p.relative_to(project).as_posix()).read_bytes())
|
||||
for p in sorted(paths)}
|
||||
|
||||
|
||||
def normalized_map(mapping):
|
||||
return {k: v["sha256"] if isinstance(v, dict) else v for k, v in mapping.items()}
|
||||
|
||||
|
||||
def verify_base_files(project, pins):
|
||||
for path, pin in pins.items():
|
||||
require(digest(safe_path(project, path).read_bytes()) == pin, "base/probe bytes changed: " + path)
|
||||
|
||||
|
||||
def four_gates(rows):
|
||||
require(len(rows) == 4 and {r["kind"] for r in rows} ==
|
||||
{"validation", "review", "integration", "final"}, "four normal gates required")
|
||||
require(all(r["passed"] == 1 for r in rows), "normal gate failed")
|
||||
|
||||
|
||||
def regression(reg, ended, tests, source, marker):
|
||||
require(len(source) == 1407 and source == reg["selected_source_map"], "E4 current source map mismatch")
|
||||
require(reg["marker_contract_sha256"] == marker, "E4 marker mismatch")
|
||||
require(reg["engine_sha256"] == ENGINE, "E4 engine mismatch")
|
||||
require(ended["passed"] is True and ended["actual_suites"] == 192 and
|
||||
ended["failed_suites"] == 0 and ended["strict_accepted_checks"] ==
|
||||
ended["actual_all_roster_checks"] == 22198, "E4 formal 192/22198 totals")
|
||||
require(len(tests) == 192 and all(t["passed"] is True and t["failed"] is False for t in tests), "E4 failed suite")
|
||||
require([t["test"] for t in tests] == reg["roster"], "E4 roster join")
|
||||
|
||||
|
||||
def stats(value, null=False):
|
||||
require(set(("count", "mean", "p95", "max")) <= value.keys(), "incomplete statistics")
|
||||
if null:
|
||||
require(value["count"] == 0 and all(value[k] is None for k in ("mean", "p95", "max"))
|
||||
and value["reason"] == NULL_REASON, "unmeasured render time must remain null")
|
||||
else:
|
||||
require(type(value["count"]) is int and value["count"] > 0 and
|
||||
all(type(value[k]) in (int, float) and value[k] >= 0 for k in ("mean", "p95", "max")),
|
||||
"invalid measured statistics")
|
||||
|
||||
|
||||
def full9(execution, admission):
|
||||
require(admission["commit"] == FULL_COMMIT, "full9 was not measured at Q")
|
||||
require(len(admission["source_map"]) == 1407, "full9 source count")
|
||||
require(execution["admission"] == admission, "full9 admission join")
|
||||
require(execution["passed"] is True, "full9 execution failed")
|
||||
phases = execution["phases"]
|
||||
require([p["phase"] for p in phases] == ["import", "parse-base", "parse-wrapper", "R0", "P1", "P2", "O0", "P3", "P4"], "full9 phase order")
|
||||
require(all(p["passed"] is True for p in phases), "full9 phase failure")
|
||||
reports = {p["phase"]: p["report"] for p in phases[3:]}
|
||||
for name, r in reports.items():
|
||||
require(r["metadata"]["machine"]["hw.model"] == "Mac16,10", "full9 machine")
|
||||
require(r["metadata"]["build"]["project_commit"] == FULL_COMMIT, "full9 build misattribution")
|
||||
require(r["metadata"]["build"]["engine_sha256"] == ENGINE, "full9 engine")
|
||||
require(r["seed"] and r["speed"] in (1, 3), "seed/speed missing")
|
||||
m = r["measurement"]
|
||||
require(all(k in m for k in ("start_minute", "end_minute", "start_wall", "end_wall", "frames")), "full9 interval missing")
|
||||
require(m["end_minute"] > m["start_minute"] and m["end_wall"] > m["start_wall"] and m["frames"] > 0, "full9 interval invalid")
|
||||
for field, value in m["frame_observation"].items():
|
||||
if field == "stall_over_50000_us" and value["count"] == 0:
|
||||
require(all(value[k] is None for k in ("mean", "p95", "max")) and
|
||||
value["reason"] == "no_samples", "empty stall statistics must remain null/no_samples")
|
||||
else:
|
||||
stats(value)
|
||||
stats(m["render_gpu_ms"], null=True)
|
||||
stats(m["render_cpu_ms"], null=name in ("R0", "O0"))
|
||||
if name in ("P1", "P2", "P3", "P4"):
|
||||
require(m["render_cpu_ms"]["count"] == {"P1": 150, "P2": 50, "P3": 2398, "P4": 745}[name], "CPU sample count")
|
||||
counts = m["count_ranges"]
|
||||
if name in ("R0", "P1", "P2"):
|
||||
for k, v in {"walkable_cells": 20000, "guests": 200, "staff": 50, "facilities": 150}.items():
|
||||
require(counts["registered"][k] == {"min": v, "max": v}, "R registered count: " + k)
|
||||
require(counts["active"]["facilities"] == {"min": 100, "max": 100}, "R active facilities")
|
||||
else:
|
||||
require(counts["registered"]["guests"]["max"] <= 2, "O is only a small input")
|
||||
for verdict in r["budget_verdict"].values():
|
||||
require(verdict["passed"] is (verdict["value"] <= verdict["limit_us"]), "false budget reported as pass")
|
||||
require(reports["P2"]["warmup"]["actual_minutes"] == 31, "P2 warmup is 31 minutes")
|
||||
require(str(reports["R0"]["seed"]) == "28012026", "R seed")
|
||||
return reports
|
||||
|
||||
|
||||
def r02(bundle, reports):
|
||||
readiness = bundle.json(PERF + "run-r02/readiness.json")
|
||||
execution = bundle.json(PERF + "run-r02/execution.json")
|
||||
report = bundle.json(PERF + "run-r02/after/evidence/report.json")
|
||||
phase = [p for p in execution["phases"] if p["variant"] == "after" and p["phase"] == "measure"]
|
||||
require(len(phase) == 1, "r02 after/measure missing or duplicated")
|
||||
p = phase[0]
|
||||
require(p["actual_pid"] == report["pid"] == 46264 and p["report"] == report, "r02 PID/report join")
|
||||
require(p["report_sha256"] == digest(bundle.raw(PERF + "run-r02/after/evidence/report.json")), "r02 report SHA join")
|
||||
require("--headless" in p["argv"] and "seed" not in report, "r02 scope/seed misattribution")
|
||||
lines = [line.split("=", 1)[1] for line in bundle.raw(PERF + "run-r02/after/measure.stdout.log").decode().splitlines()
|
||||
if line.startswith("P14_03_PERF_REPORT=")]
|
||||
require(len(lines) == 1 and load_json(lines[0]) == report, "r02 stdout report join")
|
||||
require(report["input_sha256"] == reports["R0"]["input_sha256"] == readiness["fixture_sha256"], "r02/R input join")
|
||||
require(readiness["engine_sha256"] == ENGINE and readiness["hardware"] == ["Mac16,10", "10", "10", "25769803776"], "r02 engine/hardware")
|
||||
require(readiness["after"] == "83b170a4c7176761b0b18d8e9292017d990e80a9" and readiness["after_source_files"] == 1407, "r02 source provenance")
|
||||
for field, path in (("probe_sha256", PERF + "run-r02/measure.gd"), ("runner_sha256", PERF + "collect_perf.py")):
|
||||
require(readiness[field] == digest(bundle.raw(path)), "r02 script join: " + field)
|
||||
for k, v in {"walkable_cells": 20000, "guests": 200, "staff": 50, "facilities": 150}.items():
|
||||
require(report["counts_prepared"][k] == v, "r02 counts_prepared")
|
||||
require(report["advance_one_minute_wall_ms_x1"]["count"] == 300, "r02 x1 sample count")
|
||||
require(report["path_after_tick_ms"]["found_cold"]["count"] == 245, "r02 path sample count")
|
||||
for field in ("prepared_state_sha256", "migrated_input_state_sha256", "running_state_sha256"):
|
||||
require(len(report[field]) == 64, "r02 state identity missing")
|
||||
for field in ("path_after_tick_ms", "path_after_request_ms", "path_after_cancel_ms", "save_load_ms"):
|
||||
for value in report[field].values():
|
||||
stats(value)
|
||||
stats(report["advance_one_minute_wall_ms_x1"])
|
||||
return readiness, report
|
||||
|
||||
|
||||
def restart(execution):
|
||||
require(execution["passed"] is True, "restart execution failed")
|
||||
phases = execution["phases"]
|
||||
require([p["phase"] for p in phases] == ["import", "parse-base", "parse-wrapper", "R-writer", "R-reader", "O-writer", "O-reader"], "restart seven phases")
|
||||
require(all(p["passed"] is True for p in phases), "restart phase failure")
|
||||
require(len({p["process"]["pid"] for p in phases}) == 7, "restart seven distinct PIDs")
|
||||
reports = {p["phase"]: p["report"] for p in phases[3:]}
|
||||
pids = [r["pid"] for r in reports.values()]
|
||||
require(len(set(pids)) == 4, "restart writer/reader PID reuse")
|
||||
for prefix in ("R", "O"):
|
||||
writer, reader = reports[prefix + "-writer"], reports[prefix + "-reader"]
|
||||
require(writer["actual_k"] == reader["actual_k"] == 30, "restart K must be 30")
|
||||
require(len(writer["minutes"]) == len(reader["minutes"]) == 30, "restart minute count")
|
||||
for i, (w, r) in enumerate(zip(writer["minutes"], reader["minutes"])):
|
||||
require(w["after"] == r["after"] == writer["saved_minute"] + i + 1 and
|
||||
w["sha256"] == r["sha256"], "restart per-minute typed SHA mismatch")
|
||||
require("CHECKSUM_MISMATCH" in json.dumps(reader["io"]), "tampered load rejection missing")
|
||||
for name in ("O-writer", "O-reader"):
|
||||
at = reports[name]["at_390"]
|
||||
require(at["clock"]["absolute_minute"] == 390 and at["domain_event_counter"] == 24, "O boundary counter")
|
||||
require([int(e["event_id"].split(".")[-1]) for e in at["events"]] == list(range(9, 25)), "O boundary events incomplete")
|
||||
require(reports["O-writer"]["at_390"] == reports["O-reader"]["at_390"], "O boundary differs across restart")
|
||||
return reports
|
||||
|
||||
|
||||
def verify_conditions(conditions, expected):
|
||||
# Reject omissions AND additional claims. The expected record is SHA-sealed
|
||||
# independently of the input evidence, including the unresolved G3 decision.
|
||||
require(conditions == expected, "condition scope/disclosure differs from sealed contract")
|
||||
require([r["id"] for r in conditions["conditions"]] == IDS, "condition baseline")
|
||||
require([r["original"] for r in conditions["conditions"]] == [True] * 7 + [False] * 2, "U1/U2 are auxiliary")
|
||||
require(conditions["whole_unit_accepted"] is False and conditions["g3_decision"] == "independent_review_required", "G3 cannot be inferred from absence of overload")
|
||||
|
||||
|
||||
def run(project, evidence_root, manifest, conditions):
|
||||
bundle = Bundle(project, evidence_root, manifest)
|
||||
bundle.verify_all()
|
||||
for path, pin in manifest["spec_pins"].items():
|
||||
require(digest(bundle.raw(path)) == pin, "SPEC fixed SHA mismatch: " + path)
|
||||
require(digest((project / (DOC + "p28-01/gate/SPEC.md")).read_text().strip().encode()) ==
|
||||
"641ce9eaa7acd58e5d7aeab3e3394e798b47c080fd6b463ae1c9eb036d8d7bee", "SPEC contract hash")
|
||||
verify_base_files(project, manifest["base_files"])
|
||||
collector = bundle.json(DOC + "p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json")
|
||||
require(collector["state"] == "completed" and collector["candidate"] == "0f53a67210227207efa63045de88a9a7c6e45409", "collector completion")
|
||||
four_gates(collector["evidence"])
|
||||
execution = bundle.json(FULL + "run/execution.json")
|
||||
admission = bundle.json(FULL + "run/admission.json")
|
||||
reports = full9(execution, admission)
|
||||
readiness, perf_report = r02(bundle, reports)
|
||||
reg = bundle.json(REG + "runner-input.json")
|
||||
source = product_sources(project)
|
||||
require(len(source) == 1407 and source == reg["selected_source_map"] == normalized_map(admission["source_map"]), "E4/current/full9 source map mismatch")
|
||||
require(source == manifest["r02_source_map"] and manifest["r02_source_commit"] == readiness["after"], "r02 after source map mismatch")
|
||||
for key, name in (("runner_input_sha256", "runner-input.json"),
|
||||
("runner_ended_sha256", "runner-ended.json"),
|
||||
("all_tests_sha256", "all-tests.json")):
|
||||
require(readiness["full_run_binding"][key] == digest(bundle.raw(REG + name)), "r02/E4 receipt binding: " + key)
|
||||
regression(reg, bundle.json(REG + "runner-ended.json"), bundle.json(REG + "all-tests.json"),
|
||||
source, digest(bundle.raw(DOC + "completion_marker_contracts.json")))
|
||||
require(reg["engine_sha256"] == readiness["engine_sha256"] == ENGINE, "E4 engine mismatch")
|
||||
require(reg["marker_contract_sha256"] == digest(bundle.raw(DOC + "completion_marker_contracts.json")), "E4 marker mismatch")
|
||||
formal = bundle.json(PRE + "RESTART_3AC2CED_FORMAL_DB_JOIN.json")
|
||||
require(formal["state"] == "completed" and formal["helper_acceptance"] == {"completed": 8, "total": 8}, "restart completion 8/8")
|
||||
four_gates(formal["normal_evidence_join"])
|
||||
require([formal[k] for k in ("S", "Q", "M")] == ["954528a7c5a0e27e2e50b642373168fa0a550aba", "3ac2cedc8dc977778fd5a3ba152197cc6cf00fa2", "3086af2ccd970ddee271a184214dad037bd1d6af"], "restart S/Q/M binding")
|
||||
qualification = bundle.json(PRE + "ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json")
|
||||
require(qualification["qualified"] is True and
|
||||
[qualification[k] for k in ("submitted", "candidate", "main_base")] ==
|
||||
[formal[k] for k in ("S", "Q", "M")], "restart qualification binding")
|
||||
native = bundle.json(RESTART + "run/execution.json")
|
||||
require(source == normalized_map(native["source_before"]) == normalized_map(native["source_after"]), "restart source identity")
|
||||
restart(native)
|
||||
for name, sha in native["worker_before"].items():
|
||||
require(manifest["base_files"][DOC + "p28-01/restart/probe/" + name] == sha, "probe not equal to native/Q")
|
||||
require(native["worker_before"] == native["worker_after"] and len(native["worker_before"]) == 4, "restart four probes preserved")
|
||||
review = bundle.json(PRE + "restart-independent-review-954528a-r01/DESKTOP_RESULT.json")
|
||||
require(review["status"] == "pass" and len(review["findings"]) == 3 and
|
||||
all(f["severity"] == "low" for f in review["findings"]), "independent review/low findings")
|
||||
require(conditions["restart_low_findings"] == review["findings"], "low findings omitted")
|
||||
# The fixed-SHA Root joins bind all raw receipts, source snapshots and formal
|
||||
# regression totals. Recheck their recorded boolean results as well.
|
||||
for path, flag in ((FULL + "ROOT_RAW_ACCEPTANCE_JOIN.json", "all_raw_join_checks_passed"),
|
||||
(RESTART + "ROOT_RAW_ACCEPTANCE_JOIN.json", "passed")):
|
||||
join = bundle.json(path)
|
||||
require(join[flag] is True and all(c["passed"] is True for c in join["checks"]), "Root join failed: " + path)
|
||||
return {"verified_files": len(bundle.entries), "source_files": len(source),
|
||||
"r02_state_hashes": {k: perf_report[k] for k in ("prepared_state_sha256", "migrated_input_state_sha256", "running_state_sha256")}}
|
||||
|
||||
|
||||
class Parser(argparse.ArgumentParser):
|
||||
def error(self, message):
|
||||
raise InvalidEvidence(message)
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
result = {"task_id": "P28-01-GATE", "commit": BASE, "passed": False,
|
||||
"whole_unit_accepted": False, "g3_decision": "independent_review_required",
|
||||
"conditions": [], "failures": []}
|
||||
output = None
|
||||
try:
|
||||
parser = Parser(description=__doc__)
|
||||
parser.add_argument("--project-root", required=True)
|
||||
parser.add_argument("--evidence-root")
|
||||
parser.add_argument("--json")
|
||||
args = parser.parse_args(argv)
|
||||
project = Path(args.project_root).resolve()
|
||||
build = os.environ.get("BUILD_OUTPUT_DIR")
|
||||
root = args.evidence_root or (str(Path(build) / "p28-01-gate-evidence") if build else None)
|
||||
output = Path(args.json) if args.json else (Path(build) / "p28-01-gate-verify.json" if build else None)
|
||||
if output:
|
||||
require(not output.resolve().is_relative_to(project), "JSON output inside source tree refused")
|
||||
require(root is not None, "--evidence-root or BUILD_OUTPUT_DIR is required")
|
||||
here = Path(__file__).resolve().parent
|
||||
mraw = (here / "EVIDENCE_BUNDLE_MANIFEST.json").read_bytes()
|
||||
craw = (here / "GATE_CONDITIONS.json").read_bytes()
|
||||
require(digest(mraw) == MANIFEST_SHA256, "manifest seal mismatch")
|
||||
require(digest(craw) == CONDITIONS_SHA256, "conditions seal mismatch")
|
||||
conditions = load_json(craw)
|
||||
verify_conditions(conditions, load_json(craw))
|
||||
result["disclosures"] = conditions
|
||||
result["details"] = run(project, Path(root).resolve(), load_json(mraw), conditions)
|
||||
result["passed"] = True
|
||||
except (OSError, ValueError, KeyError, TypeError, IndexError) as exc:
|
||||
result["failures"].append({"check": "evidence_join", "error": str(exc), "type": type(exc).__name__})
|
||||
result["conditions"] = [{"id": key, "join_status": "pass" if result["passed"] else "fail",
|
||||
"acceptance_status": "independent_review_required"} for key in IDS]
|
||||
if output is not None:
|
||||
try:
|
||||
# Never create source outputs, including on a failed argument check.
|
||||
require(not output.resolve().is_relative_to(project), "JSON output inside source tree refused")
|
||||
output.write_text(json.dumps(result, ensure_ascii=False, indent=2) + "\n")
|
||||
except (OSError, ValueError) as exc:
|
||||
result["passed"] = False
|
||||
result["failures"].append({"check": "output", "error": str(exc)})
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2))
|
||||
return 0 if result["passed"] else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user