P24-02: 操作と通知の全受入
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"scope": "Prospective actual Git composition, not a normal integration candidate or runtime evidence",
|
||||
"S": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08",
|
||||
"M": "54cade4181f6c3c4f5701ba54ac5fcbeca695945",
|
||||
"Q": "60eadb8bc839bfcb46bff41949db9c59611e3e6f",
|
||||
"T": "5dfac310b6be88b9dc4224e4b8c4b16f585d8b58",
|
||||
"parents": [
|
||||
"54cade4181f6c3c4f5701ba54ac5fcbeca695945",
|
||||
"78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
],
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-root-composed-78f7cba-r01",
|
||||
"conflict_paths": [
|
||||
"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"scenes/main/main.gd",
|
||||
"scenes/main/world_preview.gd",
|
||||
"tools/regression/suite-policy.json"
|
||||
],
|
||||
"resolution": "Exact actual submitted S blobs in four already-reconciled paths, no Root source edits",
|
||||
"all8_accepted": false,
|
||||
"normal_integration_candidate": false,
|
||||
"formally_closed_units": 14
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
[
|
||||
{
|
||||
"path": "result.json",
|
||||
"sha256": "afec8969aa1a0a2338504566092493313c04c9eabea25412411de60f5e657a3f",
|
||||
"bytes": 9867,
|
||||
"actual_source": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/f725571e5b46473ea04a90424a404bd5/result.json"
|
||||
},
|
||||
{
|
||||
"path": "stdout.log",
|
||||
"sha256": "73ce2f7b317c6ce9dc2e6d224e5108550e31bc6ea4c459aa9327e3374f8e199f",
|
||||
"bytes": 21102,
|
||||
"actual_source": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/f725571e5b46473ea04a90424a404bd5/stdout.log"
|
||||
},
|
||||
{
|
||||
"path": "stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"bytes": 0,
|
||||
"actual_source": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/f725571e5b46473ea04a90424a404bd5/stderr.log"
|
||||
},
|
||||
{
|
||||
"path": "command.json",
|
||||
"sha256": "ceeb13991ce637b6d0cb4f1c2206c4b105934887b2bb82549d3aa5e98222944d",
|
||||
"bytes": 1846,
|
||||
"actual_source": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/f725571e5b46473ea04a90424a404bd5/command.json"
|
||||
},
|
||||
{
|
||||
"path": "packet.txt",
|
||||
"sha256": "bae2c7759d01ae8db80c923414a865bd81a8c5f668b8a0fb3a9857aa74a7d328",
|
||||
"bytes": 4230,
|
||||
"actual_source": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/f725571e5b46473ea04a90424a404bd5/packet.txt"
|
||||
},
|
||||
{
|
||||
"path": "sandbox.sb",
|
||||
"sha256": "82aaea232b1c988582f5695263444f00f5c9e39ce05e71496566d731112ae709",
|
||||
"bytes": 2022,
|
||||
"actual_source": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/f725571e5b46473ea04a90424a404bd5/sandbox.sb"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_REPAIR5_PREPARED_COMPOSITION.json",
|
||||
"sha256": "8f168e7a693ad9c9fbcf579abdb7bb89fc47684d15bd6b502e008bcfa1fcda50",
|
||||
"bytes": 976,
|
||||
"actual_source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/coordinator-resume-20261017-r02/ACTUAL_REPAIR5_PREPARED_COMPOSITION.json"
|
||||
},
|
||||
{
|
||||
"path": "ROOT_REPAIR5_LOCAL_PROOF_REAUDIT.json",
|
||||
"sha256": "80f0a8eea3ca917534a0304c031295d15de639e547fad3753394c8255f7e5e67",
|
||||
"bytes": 21349,
|
||||
"actual_source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/coordinator-resume-20261017-r02/ROOT_REPAIR5_LOCAL_PROOF_REAUDIT.json"
|
||||
}
|
||||
]
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
# Same-task continuation facts
|
||||
|
||||
S=78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08; M=54cade4181f6c3c4f5701ba54ac5fcbeca695945; Q=60eadb8bc839bfcb46bff41949db9c59611e3e6f; T=5dfac310b6be88b9dc4224e4b8c4b16f585d8b58. Source backup codex/p24-02-source-78f7cba pushed. Existing task no new registration/cap. All original8 unaccepted, formally14/88. No new native/OS/full; do not start them while correcting actual2medium findings. Current main remains54cade4.
|
||||
|
||||
Actual independent f725 findings are full result.json in this same directory; raw stdout/command/sandbox and Root source/local proof are here, not inaccessible coordinator paths. Root already checked actual process end. Existing GUI terminal quota remains preserved; continue same-task non-UI Runner.llm via actual recorded Opus run and model, original worker=agy registration unchanged. Root bridge owns ps/no competing/lease preflight. Worker never ps/search home. Task-local TMPPREFIX/PYTHONPYCACHEPREFIX already solved actual transport failure with unchanged sandbox.
|
||||
|
||||
Primary proof21+9 passed only in uncommitted phase at oldHEADbd3a134; do not call preservation comparison reproducible at currentS. Fix pinned pre-repair baseline and verify repeatability at actual submitted S and genuine Q after next normal submit, without rerunning full regression. Root can own true post-submit repeatability.
|
||||
|
||||
Non-OS facts must retain actual producer identity/process/lifecycle/time. Never generate OS timestamps/PID/session for Claude review, roster controller or integration to satisfy the checker. No real acceptance index exists; no false proof should be created. Give the normal validation stage and actual integration/final stage explicit applicability: normal validation before formal review/integration cannot require facts that can only exist after it; actual integration/final must still enforce every applicable original condition and genuine stage evidence. No acceptance/criterion waiver, no JSON boolean substitute, no partial credit. Bind coverage to the SAME validated full-roster rows and source hashes. Retain all OS/IME/save/Windows/runtime and raw-proof guards.
|
||||
|
||||
Only acceptance-required focused fixes; defer unrelated low cleanups. A valid-target positive control strengthens the defense behind-dialog test where needed, not a new interaction. Do not invent gameplay values or production triggers. Leave world_preview unchanged. No NEXT_CLOSURE/Main shared ledger or Root context edits. Complete source/local verification only; do not commit/push or run Godot/OS/full.
|
||||
+256
@@ -0,0 +1,256 @@
|
||||
{
|
||||
"scope": "Root actual source/primary local-output re-audit; not native/OS/full/all8 acceptance",
|
||||
"source_before_normal_submit": "bd3a13405115fc9bf6c5acec55bcfef7dd15266a",
|
||||
"actual_run": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/150085055a4946bfa897ebfc15192b55",
|
||||
"actual_primary_command_event": {
|
||||
"type": "item.completed",
|
||||
"item": {
|
||||
"id": "item_30",
|
||||
"type": "command_execution",
|
||||
"command": "/bin/zsh -lc 'TMPPREFIX=\"$TMPDIR/p24-zsh\" python3 - <<'\"'PY'\nimport hashlib,json,os,subprocess,sys\nfrom pathlib import Path\nroot=Path.cwd(); here=root/'docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017'\nrepair4=here.parent/'repair4'\ncommands=[\n ('py_compile',[sys.executable,'-m','py_compile','tools/check_p24_operations_evidence.py',str(here/'composition.py'),str(here/'correspondence.py'),str(here/'test_repair5.py'),str(repair4/'check_repair4_preservation.py'),str(repair4/'test_checker_roster_head.py')]),\n ('import',[sys.executable,'-c',\\\"import importlib.util; s=importlib.util.spec_from_file_location('p24','tools/check_p24_operations_evidence.py'); m=importlib.util.module_from_spec(s); s.loader.exec_module(m); print('stdlib checker import OK; ROOT='+str(m.ROOT))\\\"]),\n ('repair5_tests',[sys.executable,str(here/'test_repair5.py')]),\n ('repair4_tests',[sys.executable,str(repair4/'test_checker_roster_head.py')]),\n ('preservation',[sys.executable,str(repair4/'check_repair4_preservation.py')]),\n ('missing_real_evidence',[sys.executable,'tools/check_p24_operations_evidence.py','--verify-only']),\n ('diff_check',['git','diff','--check'])]\nresults=[]\nfor name,argv in commands:\n p=subprocess.run(argv,capture_output=True,cwd=root,env=dict(os.environ,PYTHONPYCACHEPREFIX=os.environ['TMPDIR']+'/p24-phase-pyc'))\n log=p.stdout+b'\\\\n--- STDERR ---\\\\n'+p.stderr\n path=here/(name+'.log');path.write_bytes(log)\n results.append(dict(name=name,argv=argv,exit_code=p.returncode,expected_exit_code=1 if name=='missing_real_evidence' else 0,raw_log=path.relative_to(root).as_posix(),sha256=hashlib.sha256(log).hexdigest()))\n print(name, 'exit_code='+str(p.returncode), 'log_sha256='+results[-1]['sha256'],flush=True)\n(here/'LOCAL_COMMAND_RESULTS.json').write_text(json.dumps({'scope':'SOURCE-ONLY; stdlib/Git, TEST-ONLY synthetic fixtures; no acceptance','commands':results},indent=2)+'\\\\n')\nPY\"",
|
||||
"aggregated_output": "py_compile exit_code=0 log_sha256=169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb\nimport exit_code=0 log_sha256=4a2fe8c27abe4d9c077ca3701b07ee860d4673f93267e4ae4697638a1f2254c9\nrepair5_tests exit_code=0 log_sha256=48a4c44bd1f5f94faa0f78f14afea371f04d4e9652c89fc8dcad91a24e7cf836\nrepair4_tests exit_code=0 log_sha256=d3852846638752b6f8421776da825a037228ead8c67333c6b14e93a2fffb8f7a\npreservation exit_code=0 log_sha256=7e6691b7ae2ae94f956758a8907d3d67db29b9642ed0aecbfbc94421dcbdbace\nmissing_real_evidence exit_code=1 log_sha256=e1f4250f0078f0a88e8fd4ec485386ab67e835d0e966e609def115de00f4c48c\ndiff_check exit_code=0 log_sha256=169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb\n",
|
||||
"exit_code": 0,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"verified_file_bindings": [
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"bytes": 189076,
|
||||
"sha256": "d3599139e2358c1ac9edb5059a823880f72efe5ff457da2887114c243139f743",
|
||||
"git_blob_sha1": "932e8c4e8e6113aac8b629197d757a73a6f1260e"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py",
|
||||
"bytes": 22108,
|
||||
"sha256": "e7dc30bcd56dcdf3f057131bf5dc9a3a672e357bc9b8e5bf2b818d3302d4c83a",
|
||||
"git_blob_sha1": "a2259ee3ec1d0b981504e446c3fc6e213fde8f9f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py",
|
||||
"bytes": 5689,
|
||||
"sha256": "5c10efe7a9c6b3d290020f8dfbb2431956b3dafff7abdd4859b8e6d83e1d9365",
|
||||
"git_blob_sha1": "f1a07ecf07b94f1508efa98a8606eeeaa61a7a46"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/LOCAL_COMMAND_RESULTS.json",
|
||||
"bytes": 4909,
|
||||
"sha256": "aacde68f9d6909c1c347197b257fa31a66d3e7519c01e16c79fd45aba6e8d82f",
|
||||
"git_blob_sha1": "8a5e25505d56f5f41e40ef426a69b54900689f92"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/PROTOCOL.md",
|
||||
"bytes": 6620,
|
||||
"sha256": "c07618fd692f911120e70ac13e3de4addf379aa8d29e535867ff93d9bd32e8f6",
|
||||
"git_blob_sha1": "9cf90f38f067c67f09b7540ae475f341f97fa7a9"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/REFERENCE_INTEGRITY.json",
|
||||
"bytes": 1695,
|
||||
"sha256": "be8549f3f6462757c7fb1bc664ccd6c5165f09e2eee4468aec75a8d84e4addf9",
|
||||
"git_blob_sha1": "c109a1ab6c7a954faff4897ca5bb37f3b2fd0fe8"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/STATUS.json",
|
||||
"bytes": 3620,
|
||||
"sha256": "b27c9bf3d75e59544528605413d4253b0c88e91298f6fb6c561a12b3aa0b26bd",
|
||||
"git_blob_sha1": "2fbc3d66cf7de3061da20bf67adc4ba84c1cb5ed"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/composition.py",
|
||||
"bytes": 13130,
|
||||
"sha256": "b2fc058b1589310499917c8c5fad056fd8861ccf6bb32dd3ce205d367f493864",
|
||||
"git_blob_sha1": "85c7157858eae2f0019ca578aaad12af3c09eecd"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py",
|
||||
"bytes": 12934,
|
||||
"sha256": "7a0eda4900bc405569b9a797b1f80446e6210a77a81c3c7967f639364c493821",
|
||||
"git_blob_sha1": "f3bce62d865da58e0bbfd3a1101b20909579d3f3"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/diff_check.log",
|
||||
"bytes": 16,
|
||||
"sha256": "169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb",
|
||||
"git_blob_sha1": "fa146f5e868243f2f30da886ba8857913f7ba42a"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/import.log",
|
||||
"bytes": 137,
|
||||
"sha256": "4a2fe8c27abe4d9c077ca3701b07ee860d4673f93267e4ae4697638a1f2254c9",
|
||||
"git_blob_sha1": "733ed0946b27fc409db84e600a3ec15a8dc25945"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/missing_real_evidence.log",
|
||||
"bytes": 134,
|
||||
"sha256": "e1f4250f0078f0a88e8fd4ec485386ab67e835d0e966e609def115de00f4c48c",
|
||||
"git_blob_sha1": "c40aa5563c4816cfb29faf41da7f53ba1131b07b"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/preservation.log",
|
||||
"bytes": 927,
|
||||
"sha256": "7e6691b7ae2ae94f956758a8907d3d67db29b9642ed0aecbfbc94421dcbdbace",
|
||||
"git_blob_sha1": "ec333d287202ab01d6a9a3df8faf9cc9906ad7a1"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/py_compile.log",
|
||||
"bytes": 16,
|
||||
"sha256": "169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb",
|
||||
"git_blob_sha1": "fa146f5e868243f2f30da886ba8857913f7ba42a"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/repair4_tests.log",
|
||||
"bytes": 634,
|
||||
"sha256": "d3852846638752b6f8421776da825a037228ead8c67333c6b14e93a2fffb8f7a",
|
||||
"git_blob_sha1": "1731dbb82f16a817c95f69f34ceb2d4da7fad12c"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/repair5_tests.log",
|
||||
"bytes": 1656,
|
||||
"sha256": "48a4c44bd1f5f94faa0f78f14afea371f04d4e9652c89fc8dcad91a24e7cf836",
|
||||
"git_blob_sha1": "a03710c0d634ad1da8e7ada00f91296c1808cdae"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py",
|
||||
"bytes": 21118,
|
||||
"sha256": "f6e00851b444b018a176588f3077d98ab146c64fc0c1ac1dba98bf4dadc7542d",
|
||||
"git_blob_sha1": "77064fcbac9866b00f73aa062cda26a8d9aa4102"
|
||||
},
|
||||
{
|
||||
"path": "scenes/main/main.gd",
|
||||
"bytes": 146784,
|
||||
"sha256": "35c3cec2d1d13f56c1635010a5811c853d7fb42e13b8d2af6cfe8261832be6c6",
|
||||
"git_blob_sha1": "5d136195c7e28a060cde7473ab76baf46b7949e8"
|
||||
},
|
||||
{
|
||||
"path": "tests/ui/test_operations_notification.gd",
|
||||
"bytes": 18698,
|
||||
"sha256": "50172ab6daa031d221f6a78cac5cdbcb8884f295f8062b54656562e2412faff2",
|
||||
"git_blob_sha1": "15dc9e63b0167a0809a949087c23d79a9189623c"
|
||||
},
|
||||
{
|
||||
"path": "tools/check_p24_operations_evidence.py",
|
||||
"bytes": 38965,
|
||||
"sha256": "0c4699fa032e9961e8e9965000382301cfd55898131ddad463ec8a38024d7818",
|
||||
"git_blob_sha1": "57a1b34e94295a687a05cb0f1af60f62545fee45"
|
||||
},
|
||||
{
|
||||
"path": "tools/regression/suite-policy.json",
|
||||
"bytes": 17581,
|
||||
"sha256": "93178d9f68b15307158f1050993bdc75d8790d65ebe75400a3572978e37ec26a",
|
||||
"git_blob_sha1": "d0bddce72981ae73d11a56e07b0e326d56fe9a46"
|
||||
}
|
||||
],
|
||||
"verified_raw_local_commands": [
|
||||
{
|
||||
"name": "py_compile",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"-m",
|
||||
"py_compile",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/composition.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"raw_log": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/py_compile.log",
|
||||
"sha256": "169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb"
|
||||
},
|
||||
{
|
||||
"name": "import",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"-c",
|
||||
"import importlib.util; s=importlib.util.spec_from_file_location('p24','tools/check_p24_operations_evidence.py'); m=importlib.util.module_from_spec(s); s.loader.exec_module(m); print('stdlib checker import OK; ROOT='+str(m.ROOT))"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"raw_log": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/import.log",
|
||||
"sha256": "4a2fe8c27abe4d9c077ca3701b07ee860d4673f93267e4ae4697638a1f2254c9"
|
||||
},
|
||||
{
|
||||
"name": "repair5_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"raw_log": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/repair5_tests.log",
|
||||
"sha256": "48a4c44bd1f5f94faa0f78f14afea371f04d4e9652c89fc8dcad91a24e7cf836"
|
||||
},
|
||||
{
|
||||
"name": "repair4_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"raw_log": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/repair4_tests.log",
|
||||
"sha256": "d3852846638752b6f8421776da825a037228ead8c67333c6b14e93a2fffb8f7a"
|
||||
},
|
||||
{
|
||||
"name": "preservation",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"raw_log": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/preservation.log",
|
||||
"sha256": "7e6691b7ae2ae94f956758a8907d3d67db29b9642ed0aecbfbc94421dcbdbace"
|
||||
},
|
||||
{
|
||||
"name": "missing_real_evidence",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"expected_exit_code": 1,
|
||||
"raw_log": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/missing_real_evidence.log",
|
||||
"sha256": "e1f4250f0078f0a88e8fd4ec485386ab67e835d0e966e609def115de00f4c48c"
|
||||
},
|
||||
{
|
||||
"name": "diff_check",
|
||||
"argv": [
|
||||
"git",
|
||||
"diff",
|
||||
"--check"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"raw_log": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/diff_check.log",
|
||||
"sha256": "169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb"
|
||||
}
|
||||
],
|
||||
"later_commands": [
|
||||
{
|
||||
"id": "item_31",
|
||||
"type": "command_execution",
|
||||
"command": "/bin/zsh -lc 'git status --short; cat docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/repair5_tests.log; cat docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/missing_real_evidence.log'",
|
||||
"aggregated_output": " M docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json\n M docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py\n M docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py\n M scenes/main/main.gd\n M tests/ui/test_operations_notification.gd\n M tools/check_p24_operations_evidence.py\n M tools/regression/suite-policy.json\n?? docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair5-context-20261017/\n?? docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/\n\n--- STDERR ---\ntest_altered_conflict_nonconflict_and_main_only (__main__.CompositionTests) ... ok\ntest_bindings_and_source_map (__main__.CompositionTests) ... ok\ntest_docs_only_main_fresh_q (__main__.CompositionTests) ... ok\ntest_fifth_conflict (__main__.CompositionTests) ... ok\ntest_final_mode_clean_exact_parents (__main__.CompositionTests) ... ok\ntest_git_environment_and_crosschecks (__main__.CompositionTests) ... ok\ntest_new_main_old_q_and_stale_source_new_q (__main__.CompositionTests) ... ok\ntest_outside_scope (__main__.CompositionTests) ... ok\ntest_parent_order_extra_and_tree_mismatch (__main__.CompositionTests) ... ok\ntest_positive_normal_and_private_objects (__main__.CompositionTests) ... ok\ntest_root_context_sha_symlink_and_cwd (__main__.CompositionTests) ... ok\ntest_engine_requires_actual_receipt_and_bytes (__main__.CorrespondenceTests) ... ok\ntest_observer_payloads_and_pointer (__main__.CorrespondenceTests) ... ok\ntest_alias_identical_bytes (__main__.CoverageAttackTests) ... ok\ntest_all_true_opaque_and_scaffold (__main__.CoverageAttackTests) ... ok\ntest_cross_process_and_whole_roster_engine (__main__.CoverageAttackTests) ... ok\ntest_missing_meaning_reused_and_relabelled_record (__main__.CoverageAttackTests) ... ok\ntest_old_catchall_plus_seven_fillers (__main__.CoverageAttackTests) ... ok\ntest_one_shared_trace_distinct_records_positive (__main__.CoverageAttackTests) ... ok\ntest_wrong_root_source_and_engine (__main__.CoverageAttackTests) ... ok\ntest_exact_nonp24_and_schema_preservation (__main__.PreservationTests) ... ok\n\n----------------------------------------------------------------------\nRan 21 tests in 10.582s\n\nOK\n\n--- STDERR ---\nERROR: Could not locate p24-operations-evidence index.json.\nEnsure BUILD_OUTPUT_DIR is set or provide --index <path>.\n",
|
||||
"exit_code": 0,
|
||||
"status": "completed"
|
||||
},
|
||||
{
|
||||
"id": "item_32",
|
||||
"type": "command_execution",
|
||||
"command": "/bin/zsh -lc 'TMPPREFIX=\"$TMPDIR/p24-zsh\" python3 - <<'\"'PY'\nimport hashlib,json,subprocess\nfrom pathlib import Path\nroot=Path.cwd(); here=root/'docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017'\nmanifest=json.loads((here.parent/'root-repair5-context-20261017/REFERENCE_MANIFEST.json').read_text())\nrefs=[]\nfor row in manifest['files']:\n digest=hashlib.sha256((root/row['reference_path']).read_bytes()).hexdigest()\n assert digest==row['sha256'],row['reference_path']\n refs.append({'path':row['reference_path'],'sha256':digest,'matches_manifest':True})\n(here/'REFERENCE_INTEGRITY.json').write_text(json.dumps({'reference_only_not_runtime_proof':True,'files':refs},indent=2)+'\\\\n')\nstatus=json.loads((here/'STATUS.json').read_text());status['local_checks']={'py_compile_exit':0,'python_import_exit':0,'repair5_stdlib_git_tests':21,'repair5_exit':0,'preserved_roster_head_tests':9,'repair4_exit':0,'preservation_exit':0,'diff_check_exit':0,'missing_real_evidence_exit':1,'raw_results':'LOCAL_COMMAND_RESULTS.json','source_hashes':'SOURCE_MANIFEST.json'}\n(here/'STATUS.json').write_text(json.dumps(status,ensure_ascii=False,indent=2)+'\\\\n')\ntracked=subprocess.run(['git','diff','--name-only'],capture_output=True,text=True,check=True).stdout.splitlines()\nfiles=sorted(set(tracked)|{p.relative_to(root).as_posix() for p in here.rglob('*') if p.is_file() and p.name\"'!='\"'SOURCE_MANIFEST.json'})\nrows=[]\nfor name in files:\n raw=(root/name).read_bytes()\n rows.append(dict(path=name,bytes=len(raw),sha256=hashlib.sha256(raw).hexdigest(),git_blob_sha1=hashlib.sha1(b'blob %d\\\\0'%len(raw)+raw).hexdigest()))\noutput={'task_id':'P24-02','existing_HEAD':subprocess.run(['git','rev-parse','HEAD'],capture_output=True,text=True,check=True).stdout.strip(),'status':'SOURCE-READY/NOTRUN','note':'Uncommitted source/local phase only. This manifest excludes itself. Supplied Root references are unchanged and excluded from authored files.','files':rows}\n(here/'SOURCE_MANIFEST.json').write_text(json.dumps(output,indent=2)+'\\\\n')\nfor row in rows:\n if row['path'] in tracked or row['path'].endswith(('/composition.py','/correspondence.py','/test_repair5.py')):\n print(row['sha256'],row['path'])\nprint('SOURCE_MANIFEST.json sha256='+hashlib.sha256((here/'SOURCE_MANIFEST.json').read_bytes()).hexdigest())\nPY\"",
|
||||
"aggregated_output": "d3599139e2358c1ac9edb5059a823880f72efe5ff457da2887114c243139f743 docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json\ne7dc30bcd56dcdf3f057131bf5dc9a3a672e357bc9b8e5bf2b818d3302d4c83a docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py\n5c10efe7a9c6b3d290020f8dfbb2431956b3dafff7abdd4859b8e6d83e1d9365 docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py\nb2fc058b1589310499917c8c5fad056fd8861ccf6bb32dd3ce205d367f493864 docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/composition.py\n7a0eda4900bc405569b9a797b1f80446e6210a77a81c3c7967f639364c493821 docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py\nf6e00851b444b018a176588f3077d98ab146c64fc0c1ac1dba98bf4dadc7542d docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py\n35c3cec2d1d13f56c1635010a5811c853d7fb42e13b8d2af6cfe8261832be6c6 scenes/main/main.gd\n50172ab6daa031d221f6a78cac5cdbcb8884f295f8062b54656562e2412faff2 tests/ui/test_operations_notification.gd\n0c4699fa032e9961e8e9965000382301cfd55898131ddad463ec8a38024d7818 tools/check_p24_operations_evidence.py\n93178d9f68b15307158f1050993bdc75d8790d65ebe75400a3572978e37ec26a tools/regression/suite-policy.json\nSOURCE_MANIFEST.json sha256=09f8e61b49c6c590f347928e35074aaef9fb90abdb7ac6e3a930d1ded4fe059e\n",
|
||||
"exit_code": 0,
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"actual_worker_ended": true,
|
||||
"no_scope_violations": true,
|
||||
"tests_reexecuted_by_Root": false,
|
||||
"all8_accepted": false,
|
||||
"ended": 1792216171.950909
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"argv": [
|
||||
"/Users/korizatou114/.local/bin/claude",
|
||||
"-p",
|
||||
"--safe-mode",
|
||||
"--restricted",
|
||||
"--output-format",
|
||||
"json",
|
||||
"--tools",
|
||||
"Read,Grep,Glob",
|
||||
"--strict-mcp-config",
|
||||
"--mcp-config",
|
||||
"{\"mcpServers\":{}}",
|
||||
"--setting-sources",
|
||||
"",
|
||||
"--no-session-persistence",
|
||||
"--permission-mode",
|
||||
"plan",
|
||||
"--json-schema",
|
||||
"{\"type\": \"object\", \"additionalProperties\": false, \"required\": [\"task_id\", \"commit\", \"status\", \"summary\", \"acceptance_ids\", \"findings\"], \"properties\": {\"task_id\": {\"type\": \"string\", \"enum\": [\"P24-02\"]}, \"commit\": {\"type\": \"string\", \"enum\": [\"78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08\"]}, \"status\": {\"type\": \"string\", \"enum\": [\"pass\", \"changes_requested\"]}, \"summary\": {\"type\": \"string\"}, \"acceptance_ids\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"maxItems\": 0}, \"findings\": {\"type\": \"array\", \"items\": {\"type\": \"object\", \"additionalProperties\": false, \"required\": [\"severity\", \"message\"], \"properties\": {\"severity\": {\"type\": \"string\", \"enum\": [\"critical\", \"high\", \"medium\", \"low\"]}, \"message\": {\"type\": \"string\"}}}}}}",
|
||||
"--model",
|
||||
"claude-opus-5-5"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-root-composed-78f7cba-r01",
|
||||
"env_names": [
|
||||
"AGY_CLI_DISABLE_AUTO_UPDATE",
|
||||
"BROWSER_PROFILE_DIR",
|
||||
"BUILD_OUTPUT_DIR",
|
||||
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC",
|
||||
"CLAUDE_CODE_OAUTH_TOKEN",
|
||||
"GIT_TERMINAL_PROMPT",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"LC_ALL",
|
||||
"LOGNAME",
|
||||
"MAC_CHROMIUM_TMPDIR",
|
||||
"PATH",
|
||||
"PORT",
|
||||
"PYTHONDONTWRITEBYTECODE",
|
||||
"TEMP",
|
||||
"TERM",
|
||||
"TEST_DATABASE_PATH",
|
||||
"TMP",
|
||||
"TMPDIR",
|
||||
"USER"
|
||||
],
|
||||
"execution": "sandbox"
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
Latest owner review-material policy: fixed 500000-byte limits are removed. Do not omit required sources or evidence or perform compression/re-submission merely to satisfy the obsolete cap. Claude commander/reviewer can inspect their source checkout with Read,Grep,Glob; reviewer validation materials are mirrored into .review-material within the frozen checkout. Other services keep their own tool sets. Preserve scope, acceptance, exact-version evidence and independent review. Read relevant dependencies directly and report required context gaps.
|
||||
Actual independent limited static review of completed repair5 source/local batch; NOT formal whole-unit acceptance. Use separate actual Claude Opus5.5 session. Return commit 78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08 acceptance_ids=[]; status pass only if no critical/high/medium source readiness defect. Review actual complete changed source and tests, not implementation claims. You are in genuine Root prospective Q checkout with all Main dependencies. No Godot/native/OS/full has run on this new source; all8 still unaccepted; original30/88, formally14 unchanged. Do not turn explicit missing real evidence/upstream/Windows gates into a claimed new code failure, but identify real checker/UI/test defects precisely. No material cap; Read/Grep/Glob whole relevant dependencies. No execution/tools Bash, no source edits.
|
||||
Actual roles: {"scope": "Prospective actual Git composition, not a normal integration candidate or runtime evidence", "S": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08", "M": "54cade4181f6c3c4f5701ba54ac5fcbeca695945", "Q": "60eadb8bc839bfcb46bff41949db9c59611e3e6f", "T": "5dfac310b6be88b9dc4224e4b8c4b16f585d8b58", "parents": ["54cade4181f6c3c4f5701ba54ac5fcbeca695945", "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"], "worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-root-composed-78f7cba-r01", "conflict_paths": ["docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json", "scenes/main/main.gd", "scenes/main/world_preview.gd", "tools/regression/suite-policy.json"], "resolution": "Exact actual submitted S blobs in four already-reconciled paths, no Root source edits", "all8_accepted": false, "normal_integration_candidate": false, "formally_closed_units": 14}
|
||||
Review: (1) new composition.py checker Git root/env overrides, normalS vs integrationC, exact4 typed conflicts/private objects/index, allowed_scope/Main-only/S-only, verified T/Q/C/parents, source/input/blob completeness, Main reconciliation-input binding including changedM staleS newQ negative; external engine pins actual receipt separate from Git blobs. (2) correspondence.py real condition↔record links in observer/OS formats, shared trace distinct records permitted, alias/filler/catchall/pid-only/opaque/relabel/root/source/engine/crossprocess rejected, no fictitious acceptance format or test-only route in production. (3) defense dialog visibility callback before add_child and meaningful real-model native test, preserves ledger/selection; native execution remains mandatory later. Own P24 marker/policy SHA rebind exact, nonP24/schema/guards preserved. (4) existing9 and new stdlib/Git tests meaningful positive/negative, helper own source/provenance pins; source-ready docs honest all8 gaps. Optional preservation ordered/exact exceptions and write-evidence semantics only if changed. Full raw provider/command/sandbox/result and actual Root proof under .review-material/p24-repair5-static/manifest.json, use exact relative paths there; no opaque summaries or omitted files. Prior independent95cffd7 low5 findings available full. Reuse unchanged prior source scope, but assess all repair5 deltas. Source map/full roster/P23 actual old evidence cannot be relabelled to this tree. Natural upstream production cutins, IME/save/scales, bubble actual rendering, staff-panel actual OS click, exact final full roster, whole8 independent review, normal integration/final and Windows all remain needed. OriginalP18 backend265ce30 is complete ancestor, never restart it. Any remaining issue must distinguish static defect needing this batch correction from future runtime/proof dependency. Root will not bypass these gates.
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"task_id": "P24-02",
|
||||
"commit": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08",
|
||||
"status": "changes_requested",
|
||||
"summary": "Limited independent static review of repair5 (S=78f7cba) in the Root prospective Q checkout (Q=60eadb8, M=54cade4, T=5dfac31). I used only Read, Grep and Glob, and ran nothing. This is not formal acceptance: acceptance_ids=[], all 8 conditions stay unaccepted, and original 30/88 and formally closed 14 are unchanged. Nothing here counts as Godot, native, OS, full-roster or Windows evidence.\n\nI read in full: composition.py, correspondence.py, test_repair5.py, PROTOCOL.md and STATUS.json; tools/check_p24_operations_evidence.py; repair4 check_repair4_preservation.py and test_checker_roster_head.py; the main.gd defense/guard region; the repair5 block in tests/ui/test_operations_notification.gd and its surroundings; the world_preview _gui_input/_can_drop_data/_drop_data code; operations_os_observer.gd; the P24 marker/policy rows; and the Root repair5 context files (CLARIFICATIONS, APPLICABILITY). From the manifest I read the Root result, re-audit and prepared-composition records and the prior 95cffd7 result.\n\n(1) composition.py is sound for its declared scope:\n- Every Git call strips inherited GIT_* variables. An inherited override that changes HEAD is rejected, and CANDIDATE_COMMIT/TARGET_HEAD only cross-check. ROOT is the script root, and cwd must be the same toplevel.\n- normal_validation requires HEAD=S. integration_final requires C=HEAD, exact [M,S] parents, C tree=T and a clean checkout. Q parents must be exactly [M,S] and the Q tree must equal T.\n- merge-tree runs with a private object directory and index (repo objects as alternates). It must return exactly four typed CONTENT conflicts; binary, mode and type conflicts are rejected. Only those four entries are replaced with S blobs, and write-tree must equal T.\n- Checks cover allowed_scope, S-only, Main-only and conflict provenance.\n- The source map must be complete under the run_all_tests filter. The spec, marker, project.godot, policy and both helper SHAs are pinned. blob_bindings must exactly cover the source map plus inputs, verified by SHA1 and SHA256 and against checkout bytes for S-owned paths.\n- The four Main 54cade4 input blobs are pinned, so a changed-M/stale-S new Q is rejected (with a test).\n- The engine fingerprint (path, SHA, version plus a started/ended receipt) is separate from the Git blobs.\n\n(2) correspondence.py does reject aliases, record reuse, relabelled actions, missing meanings, fillers, all-true/opaque fields, scaffold/TEST-ONLY payloads, wrong root/S/T/source/pid/session/engine provenance, a same-PID restart and a different roster engine. A shared trace with distinct records is permitted. However, see the medium finding about the OS-event-only format for the final_validation_review meanings.\n\n(3) UI: defense_manager.visibility_changed is now connected before add_child (main.gd:3088-3089), which fixes the prior low finding. The new test asserts that the guard turns on when the dialog opens and off when it closes, which is a genuine regression check. Its model and selection preservation assertions are weak (low finding). Native execution is still required.\n\n(4) Pins: the P24 marker row and suite-policy SHA are both rebound to 50172ab6…, which is the actual test SHA in SOURCE_MANIFEST. The rest of the marker/policy JSON is unchanged, ignoring only that P24 SHA field (the preservation helper's 3-way ordered check). --write-evidence now behaves as documented. STATUS.json honestly lists every gap for all 8 conditions.\n\nBlocking: PreservationTests in test_repair5.py compares against the moving HEAD, so it fails when re-run at S or Q (medium). The correspondence format forces non-OS final-validation facts into OS-session events (medium).\n\nNot blocking, and not code failures in this batch: natural upstream cut-ins, IME/save/scales, actual bubble rendering, a real OS click on the staff panel, the exact final full roster, whole-8 review, normal integration/final, and Windows. These still need real evidence later.",
|
||||
"acceptance_ids": [],
|
||||
"findings": [
|
||||
{
|
||||
"severity": "medium",
|
||||
"message": "PreservationTests.test_exact_nonp24_and_schema_preservation in test_repair5.py (lines 311-322) uses the moving `HEAD:` as its pre-repair baseline, not the pinned source commit bd3a13405115fc9bf6c5acec55bcfef7dd15266a. It only passed in the worker's uncommitted state, where HEAD was still bd3a134. At the submitted commit S=78f7cba, and at Q=60eadb8, HEAD:scenes/main/main.gd already contains `defense_manager.visibility_changed.connect(_update_modal_input_guard)`. So `main_old.replace('\\t\\tadd_child(defense_manager)', '<connect>\\n\\t\\tadd_child(defense_manager)')` adds the line a second time and the assertEqual fails. For the same reason, `new[:start]+new[end:] == old` fails, because HEAD's test file already contains the inserted block. The world_preview comparison against HEAD is trivially true and proves nothing. The 21/21 pass in repair5_tests.log therefore cannot be reproduced at the exact submitted source, and a later re-run by Root on S, Q or C will report a failure. Fix in this batch: pin these comparisons to bd3a134 (as the JSON half of the test already does), or to a reviewed blob ID."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"message": "correspondence.verify (lines 141-149) requires every coverage meaning to be an OS-trace event: `/events/N` with action==meaning, monotonic_ns inside the single OS receipt's [started, ended] window, and provenance pid/session equal to os_environment. This includes the final_validation_review meanings static_import_local_affected (commands/results), exact_final_full_roster, independent_claude_runtime_review and current_main_integration_final (S/M/Q/T/mode), and doc facts such as held_gestures_deferred and macos_windows_classification. Genuine evidence cannot take this form:\n- A full roster runs many separate engine processes.\n- An independent Claude review happens after the runtime artifacts exist, yet it must reference runtime_artifact_sha256 from inside a trace recorded during that runtime.\n- In normal_validation (HEAD=S) no integration-final record exists yet.\nThe only way to pass is for Root to write these facts into the OS session trace with the OS PID/session and in-window timestamps, which is exactly the relabelling the design is meant to forbid. Separately, the exact_final_full_roster record's `results` only gets verify_engine per row. Its suite set and source SHAs are never compared with the full_roster list that the legacy _validate_condition_artifact_content actually validates; the positive test uses results=[receipt]. So the record linked to the meaning is not the validated roster. Fix in this batch: give non-OS meanings typed record kinds bound to their own actual artifacts and receipts (command logs, roster result rows, review artifact SHA, composition roles), and bind the coverage record to the same roster rows the suite-set check validates."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "composition.py pins only the Main side of the four conflict inputs (MAIN_INPUTS). Conflicts are always resolved to whatever blob S has, and nothing pins the reconciled S blobs. A later S that rewrites a conflict file, for example from the old P24 branch, dropping Main hunks, would still compose against an unchanged Main. That protection currently relies on check_repair4_preservation.py, which the checker does not call and which pins MAIN=51e8657. Consider pinning the reviewed S conflict blobs, or making preservation a checker input or gate."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "correspondence.verify keeps a `test_only=True` keyword route in production code that relaxes the scaffold/TEST-ONLY word filter. It is not reachable from the CLI and it requires fixture_scope=TEST-ONLY, so it is not an acceptance bypass. Still, the review asked for no test-only route in production; moving the adapter into the test module would be cleaner. Also, several malformed-input cases raise AttributeError, which is not in the checker's except tuple: a non-dict receipt (receipt.get), a non-dict before/after, or a non-dict os_environment. They end in an uncaught traceback (still exit 1) instead of a clean rejection."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "The new defense-modal test (tests/ui/test_operations_notification.gd:136-159) proves the visibility-callback fix through the modal_input_blocked true/false assertions. Its model and selection preservation assertions have no positive control, though. The click at (200,200) may not map to a buildable cell, and the drop at Vector2.ZERO probably hits no facility. Both could be no-ops even without the guard. A matching unblocked attempt that does change state, or a check that the targets are a valid cell and facility, would make these assertions meaningful. Native execution is still required."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "Carry-overs from prior review 95cffd7:\n- Still open: world_preview.staff_assignment_clicked is still never emitted (dead wiring; documented, and the direct assign_staff_by_click call is not map-click evidence). check_repair4_preservation still compares bodies as sets of lines; this is documented and optional hardening was not done. Bubble first-relationship order, the heart rule and the O(N²) scan remain whole-8 review items.\n- Fixed: the defense visibility hookup, --write-evidence behaviour, the HEAD root vs cwd split (now root_identity plus a verified T view), and the catch-all-plus-fillers case (now per-meaning coverage plus used==artifacts).\n- Note: check_repair4_preservation.git_show and its ls-tree/grep calls still inherit GIT_* environment variables, unlike composition.clean_env."
|
||||
}
|
||||
]
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
(version 1)
|
||||
(allow default)
|
||||
(deny file-write*)
|
||||
(deny file-read-data (require-all (subpath "/Users/korizatou114") (require-not (literal "/Users/korizatou114")) (require-not (literal "/Users/korizatou114/.claude.json")) (require-not (literal "/Users/korizatou114/.local")) (require-not (literal "/Users/korizatou114/.local/share")) (require-not (literal "/Users/korizatou114/Projects")) (require-not (literal "/Users/korizatou114/Projects/TheTree-managed-worktrees")) (require-not (literal "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations")) (require-not (literal "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime")) (require-not (subpath "/Users/korizatou114/.local/bin")) (require-not (subpath "/Users/korizatou114/.local/share/claude")) (require-not (subpath "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02")) (require-not (subpath "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-root-composed-78f7cba-r01")) (require-not (subpath "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/.git"))))
|
||||
(allow file-write* (subpath "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02"))
|
||||
(allow file-write* (literal "/dev/null") (literal "/dev/tty") (literal "/dev/stdout") (literal "/dev/stderr"))
|
||||
(deny file-read* file-write* (subpath "/private/tmp/the-tree-p24-02-control-r02"))
|
||||
(deny file-read* file-write* (subpath "/Users/korizatou114/Library/Application Support/agent-control"))
|
||||
(deny file-read* file-write* (subpath "/Users/korizatou114/.ssh"))
|
||||
(deny file-read* file-write* (subpath "/Users/korizatou114/.aws"))
|
||||
(deny file-read* file-write* (subpath "/Users/korizatou114/.azure"))
|
||||
(deny file-read* file-write* (subpath "/Users/korizatou114/.config/gcloud"))
|
||||
(deny file-read* file-write* (subpath "/Users/korizatou114/Library/Keychains"))
|
||||
(deny file-write* (subpath "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/.git"))
|
||||
+1
File diff suppressed because one or more lines are too long
+2
@@ -1,5 +1,7 @@
|
||||
# Repair5 source/local handoff (not acceptance)
|
||||
|
||||
Historical repair5 protocol. Repair6 supersedes the universal OS-event envelope and stage rules below: see [repair6 protocol](../source-ready-repair6-20261017/PROTOCOL.md). Existing repair5 logs, STATUS and SOURCE_MANIFEST remain old-source historical proof; they do not certify repair6.
|
||||
|
||||
The existing collector_protocol.json and operations_os_observer.gd remain authoritative about scope: the observer's local_unit_fixture_only_not_native_os_input_evidence summaries are never OS acceptance. No actual index is included. No engine executable path has been invented. TEST-ONLY fixtures exercise validators, not the game.
|
||||
|
||||
## Composition and paths
|
||||
|
||||
BIN
Binary file not shown.
+156
-15
@@ -103,10 +103,143 @@ def verify_engine(engine, receipt):
|
||||
and 0 < receipt['started_monotonic_ns'] < receipt['ended_monotonic_ns'], 'runtime interval required')
|
||||
|
||||
|
||||
def verify(data, artifacts, roles, root, *, test_only=False):
|
||||
# These facts have independent producers, never the OS trace's provenance.
|
||||
KINDS = {
|
||||
'static_import_local_affected': 'command_log',
|
||||
'exact_final_full_roster': 'roster_controller',
|
||||
'independent_claude_runtime_review': 'claude_review',
|
||||
'current_main_integration_final': 'composition_result',
|
||||
'held_gestures_deferred': 'held_gestures_document',
|
||||
'macos_windows_classification': 'platform_document',
|
||||
}
|
||||
LATER = {'independent_claude_runtime_review', 'current_main_integration_final'}
|
||||
|
||||
|
||||
def stage_report(mode):
|
||||
require(mode in ('normal_validation', 'integration_final'), 'unknown validation stage')
|
||||
return {'stage': mode, 'complete': False,
|
||||
'source_prerequisites': 'required', 'runtime_os_roster_prerequisites': 'required',
|
||||
'later_gates': {m: ('not-yet-applicable' if mode == 'normal_validation' else 'required')
|
||||
for m in sorted(LATER)}}
|
||||
|
||||
|
||||
def suite_rows(rows):
|
||||
require(isinstance(rows, list) and bool(rows), 'actual roster rows required')
|
||||
result = {}
|
||||
for row in rows:
|
||||
require(isinstance(row, dict), 'roster row object required')
|
||||
suite = row.get('test', row.get('suite', row.get('path')))
|
||||
require(isinstance(suite, str) and suite and suite not in result, 'roster suite identity/duplicate')
|
||||
require(isinstance(row.get('source_sha256'), str) and len(row['source_sha256']) == 64,
|
||||
'roster source SHA required')
|
||||
result[suite] = row
|
||||
return result
|
||||
|
||||
|
||||
def typed_document(doc, common, os_env):
|
||||
require(doc.get('kind') in KINDS.values(), 'unknown typed artifact kind')
|
||||
require(doc.get('provenance') == common, 'non-OS source provenance mismatch')
|
||||
require(not {'pid', 'session_id', 'window_size', 'monotonic_ns', 'engine', 'events'} & doc.keys(),
|
||||
'OS provenance on non-OS artifact')
|
||||
producer = doc.get('producer')
|
||||
require(isinstance(producer, dict) and set(producer) == {
|
||||
'kind', 'identity', 'pid', 'run_id', 'started_unix_ns', 'ended_unix_ns',
|
||||
'lifecycle', 'records_sha256'}, 'typed producer receipt schema')
|
||||
require(producer['kind'] == doc['kind'], 'producer kind relabelling')
|
||||
require(all(isinstance(producer[k], str) and producer[k].strip() for k in ('identity', 'run_id')),
|
||||
'producer identity/run required')
|
||||
require(type(producer['pid']) is int and producer['pid'] > 1
|
||||
and producer['pid'] != os_env['pid'] and producer['run_id'] != os_env['session_id'],
|
||||
'non-OS producer must not borrow OS identity')
|
||||
require(producer['lifecycle'] == ['started', 'ended']
|
||||
and type(producer['started_unix_ns']) is int and type(producer['ended_unix_ns']) is int
|
||||
and 0 < producer['started_unix_ns'] < producer['ended_unix_ns'], 'producer lifecycle/times')
|
||||
require(isinstance(doc.get('records'), list) and doc['records']
|
||||
and producer['records_sha256'] == canonical_sha(doc['records']), 'producer payload binding')
|
||||
return producer
|
||||
|
||||
|
||||
def verify_typed(meaning, record, doc, data, roles, docs, hashes, validated_roster, composition_result):
|
||||
kind = KINDS[meaning]
|
||||
require(doc['kind'] == kind and record.get('kind') == kind and record.get('meaning') == meaning,
|
||||
'wrong kind or meaning relabelling')
|
||||
require(not {'provenance', 'pid', 'session_id', 'window_size', 'monotonic_ns', 'action', 'engine'} & record.keys(),
|
||||
'OS provenance on non-OS record')
|
||||
producer = doc['producer']
|
||||
if kind == 'command_log':
|
||||
commands = record.get('commands')
|
||||
require(isinstance(commands, list) and commands and all(isinstance(r, dict) for r in commands), 'command log required')
|
||||
require(isinstance(record.get('results'), list) and all(type(code) is int for code in record['results'])
|
||||
and record['results'] == [r.get('exit_code') for r in commands], 'command results binding')
|
||||
for command in commands:
|
||||
require(isinstance(command.get('argv'), list) and command['argv']
|
||||
and all(isinstance(a, str) and a for a in command['argv']), 'command argv')
|
||||
require(isinstance(command.get('cwd'), str) and Path(command['cwd']).is_absolute(), 'command cwd')
|
||||
require(type(command.get('pid')) is int and command['pid'] > 1
|
||||
and command['pid'] != data['os_environment']['pid'], 'command process identity')
|
||||
require(type(command.get('exit_code')) is int and command['exit_code'] == 0, 'command failure')
|
||||
for key in ('stdout', 'stderr'):
|
||||
require(isinstance(command.get(key), str)
|
||||
and command.get(key+'_sha256') == hashlib.sha256(command[key].encode()).hexdigest(), 'command stream SHA')
|
||||
require(command.get('source_map_sha256') == canonical_sha(data['source_hashes']), 'command source map')
|
||||
require(type(command.get('started_unix_ns')) is int and type(command.get('ended_unix_ns')) is int
|
||||
and producer['started_unix_ns'] <= command['started_unix_ns'] < command['ended_unix_ns'] <= producer['ended_unix_ns'],
|
||||
'command lifecycle/times')
|
||||
elif kind == 'roster_controller':
|
||||
require(record['source_hashes'] == data['source_hashes'] and record['inputs'] == data['inputs'], 'roster input identity')
|
||||
rows = suite_rows(record['results'])
|
||||
require(canonical_sha(rows) == canonical_sha(suite_rows(validated_roster)),
|
||||
'roster differs from validated full_roster rows/source hashes')
|
||||
processes = set()
|
||||
for suite, row in rows.items():
|
||||
require(row['source_sha256'] == data['source_hashes'].get(suite), 'roster source map mismatch')
|
||||
verify_engine(data['engine'], row)
|
||||
require(type(row.get('pid')) is int and row['pid'] > 1 and row['pid'] != data['os_environment']['pid']
|
||||
and isinstance(row.get('run_id'), str) and row['run_id']
|
||||
and row['run_id'] != data['os_environment']['session_id'], 'suite process identity')
|
||||
require((row['pid'], row['run_id']) not in processes, 'suite process receipt reused')
|
||||
processes.add((row['pid'], row['run_id']))
|
||||
require(type(row.get('started_unix_ns')) is int and type(row.get('ended_unix_ns')) is int
|
||||
and producer['started_unix_ns'] <= row['started_unix_ns'] < row['ended_unix_ns'] <= producer['ended_unix_ns'],
|
||||
'suite lifecycle/times outside controller')
|
||||
elif kind == 'claude_review':
|
||||
require(record.get('reviewer') == producer['identity'] and record.get('reviewer_run_id') == producer['run_id'],
|
||||
'reviewer receipt identity')
|
||||
require(all(producer['run_id'] != item['producer']['run_id']
|
||||
and producer['identity'] != item['producer']['identity']
|
||||
for item in docs.values() if 'kind' in item and item is not doc), 'review must have independent producer')
|
||||
review = record.get('review')
|
||||
require(isinstance(review, dict) and review.get('provider') == 'Claude'
|
||||
and isinstance(review.get('text'), str) and review['text'].strip()
|
||||
and review.get('decision') == 'pass', 'actual independent Claude review artifact')
|
||||
require(record.get('review_sha256') == canonical_sha(review), 'review artifact SHA')
|
||||
runtime = {hashes[aid] for aid, item in docs.items() if 'kind' not in item or item['kind'] == 'roster_controller'}
|
||||
require(isinstance(record.get('runtime_artifact_sha256'), list)
|
||||
and set(record['runtime_artifact_sha256']) == runtime, 'review runtime artifact SHA set')
|
||||
require(review.get('runtime_artifact_sha256') == record['runtime_artifact_sha256'], 'review references runtime SHAs')
|
||||
for aid, item in docs.items():
|
||||
if hashes[aid] in runtime:
|
||||
end = item.get('producer', {}).get('ended_unix_ns') if 'kind' in item else item.get('ended_unix_ns')
|
||||
require(type(end) is int and 0 < end < producer['started_unix_ns'], 'review must follow runtime artifacts')
|
||||
elif kind == 'composition_result':
|
||||
require(composition_result == roles and isinstance(composition_result, dict), 'actual composition.py result required')
|
||||
require(record.get('result') == composition_result, 'composition result receipt mismatch')
|
||||
require(all(record.get(k) == roles.get(k) for k in ('S', 'M', 'Q', 'T', 'mode'))
|
||||
and record['mode'] == 'integration_final', 'integration roles/mode mismatch')
|
||||
else:
|
||||
require(record.get('source_map_sha256') == canonical_sha(data['source_hashes'])
|
||||
and record.get('spec_sha256') == data.get('spec_sha256') and bool(data.get('spec_sha256')),
|
||||
'document source/spec binding')
|
||||
if kind == 'platform_document':
|
||||
require(record['windows_status'] == 'NOTRUN' and record['platform'] == data['os_environment']['platform'],
|
||||
'Windows must remain separate, not accepted')
|
||||
|
||||
|
||||
def verify(data, artifacts, roles, root, *, test_only=False, validated_roster=None, composition_result=None):
|
||||
if test_only:
|
||||
require(data.get("fixture_scope") == "TEST-ONLY", "test adapter requires labelled data")
|
||||
require(set(data['conditions']) == set(MEANINGS), 'whole-eight required')
|
||||
stage = stage_report(roles.get('mode'))
|
||||
os_env = data['os_environment']
|
||||
receipt_id = os_env['receipt_artifact_id']
|
||||
docs = {aid: json.loads(row['file'].read_bytes()) for aid, row in artifacts.items()}
|
||||
@@ -117,20 +250,30 @@ def verify(data, artifacts, roles, root, *, test_only=False):
|
||||
expected = {'root': str(root.resolve()), 'S': roles['S'], 'T': roles['T'],
|
||||
'source_map_sha256': canonical_sha(data['source_hashes']),
|
||||
'pid': os_env['pid'], 'session_id': os_env['session_id'], 'engine': data['engine']}
|
||||
hashes = [hashlib.sha256(row['file'].read_bytes()).hexdigest() for row in artifacts.values()]
|
||||
require(len(set(hashes)) == len(hashes), 'artifact alias/identical bytes')
|
||||
hashes = {aid: hashlib.sha256(row['file'].read_bytes()).hexdigest() for aid, row in artifacts.items()}
|
||||
require(len(set(hashes.values())) == len(hashes), 'artifact alias/identical bytes')
|
||||
for aid, doc in docs.items():
|
||||
require(isinstance(doc, dict) and doc.get('provenance') == expected, 'artifact root/source/session/engine mismatch: '+aid)
|
||||
require(isinstance(doc, dict), 'artifact object required')
|
||||
if 'kind' in doc:
|
||||
typed_document(doc, {k: expected[k] for k in ('root', 'S', 'T', 'source_map_sha256')}, os_env)
|
||||
else:
|
||||
require(doc.get('provenance') == expected, 'artifact root/source/session/engine mismatch: '+aid)
|
||||
raw = json.dumps(doc).lower()
|
||||
require((test_only and doc.get('fixture_scope') == 'TEST-ONLY') or not any(word in raw for word in ('test-only', 'local_unit_fixture_only', 'scaffold', 'pending-template')),
|
||||
'fixture/template is not actual evidence')
|
||||
used = {receipt_id}
|
||||
linked = {link.get('artifact_id') for cond in data['conditions'].values()
|
||||
for link in cond.get('coverage', {}).values() if isinstance(link, dict) and 'artifact_id' in link}
|
||||
require(linked | used == set(artifacts), 'unreferenced filler artifacts')
|
||||
seen_records = set()
|
||||
for condition, meanings in MEANINGS.items():
|
||||
coverage = data['conditions'][condition].get('coverage')
|
||||
require(isinstance(coverage, dict) and set(coverage) == set(meanings), 'missing/extra meaning: '+condition)
|
||||
for meaning, fields in meanings.items():
|
||||
link = coverage[meaning]
|
||||
if roles['mode'] == 'normal_validation' and meaning in LATER:
|
||||
require(link == {'status': 'not-yet-applicable'}, 'later gate must be explicitly not-yet-applicable')
|
||||
continue
|
||||
require(isinstance(link, dict) and set(link) == {'artifact_id', 'pointer'}, 'coverage must point to raw record')
|
||||
aid, ptr = link['artifact_id'], link['pointer']
|
||||
require(aid in docs, 'unknown coverage artifact')
|
||||
@@ -138,15 +281,20 @@ def verify(data, artifacts, roles, root, *, test_only=False):
|
||||
require(aid in data['conditions'][condition]['artifact_ids'], 'coverage artifact absent from condition')
|
||||
require((aid, ptr) not in seen_records, 'record reused for different meanings')
|
||||
seen_records.add((aid, ptr)); used.add(aid)
|
||||
# Existing OS trace event format is action + monotonic_ns. Native
|
||||
# observer records alone have no OS action and cannot prove these clauses.
|
||||
if meaning not in KINDS:
|
||||
require(record.get('action') == meaning, 'OS action does not cover meaning')
|
||||
require(all(k in record and substantive(record[k]) for k in fields), 'opaque/boolean-only evidence: '+meaning)
|
||||
if meaning in KINDS:
|
||||
require(ptr.startswith('/records/') and ptr.count('/') == 2, 'typed record pointer required')
|
||||
verify_typed(meaning, record, docs[aid], data, roles, docs, hashes, validated_roster, composition_result)
|
||||
continue
|
||||
require('kind' not in docs[aid] and 'kind' not in record, 'OS event kind relabelling')
|
||||
require(ptr.startswith('/events/') and ptr.count('/') == 2, 'coverage must point to an OS event')
|
||||
require(record.get('action') == meaning, 'OS action does not cover meaning')
|
||||
require(type(record.get('monotonic_ns')) is int
|
||||
and receipt['started_monotonic_ns'] <= record['monotonic_ns'] <= receipt['ended_monotonic_ns'],
|
||||
'record outside receipt runtime')
|
||||
require(record.get('provenance') == expected, 'record provenance mismatch')
|
||||
require(all(k in record and substantive(record[k]) for k in fields), 'opaque/boolean-only evidence: '+meaning)
|
||||
if meaning in ('invalid_rejection_with_reason_and_model_ledger_selection_unchanged',
|
||||
'behind_dialog_build_assignment_unchanged', 'pending_commands_save_identity',
|
||||
'presentation_model_unchanged'):
|
||||
@@ -184,15 +332,8 @@ def verify(data, artifacts, roles, root, *, test_only=False):
|
||||
and child.get('source_map_sha256') == expected['source_map_sha256'], 'restart source binding')
|
||||
require(all(child.get(k) == record[k] for k in ('manifest_sha256', 'world_sha256')), 'restart save mismatch')
|
||||
require(producer['pid'] != consumer['pid'], 'restart must be a separate process')
|
||||
if meaning == 'exact_final_full_roster':
|
||||
require(record['source_hashes'] == data['source_hashes'] and record['inputs'] == data['inputs'], 'roster input identity')
|
||||
require(isinstance(record['results'], list) and record['results'], 'actual roster rows')
|
||||
for row in record['results']:
|
||||
verify_engine(data['engine'], row)
|
||||
if meaning == 'valid_commit_once':
|
||||
require(isinstance(record['command_ids'], list) and len(record['command_ids']) == 1,
|
||||
'placement must commit once')
|
||||
if meaning == 'macos_windows_classification':
|
||||
require(record['windows_status'] == 'NOTRUN' and record['platform'] == os_env['platform'],
|
||||
'Windows must remain separate, not accepted')
|
||||
require(used == set(artifacts), 'unreferenced filler artifacts')
|
||||
return stage
|
||||
|
||||
+76
-6
@@ -239,12 +239,74 @@ class CoverageAttackTests(unittest.TestCase):
|
||||
coverage[meaning] = dict(artifact_id='trace', pointer='/events/'+str(len(events)))
|
||||
events.append(row)
|
||||
|
||||
# Typed synthetic producer artifacts. No real OS identity or execution.
|
||||
self.roles.update(M='5'*40, Q='6'*40, mode='integration_final')
|
||||
self.data['spec_sha256'] = '7'*64
|
||||
self.data['source_hashes'] = {'tests/TEST-ONLY.gd': '3'*64}
|
||||
self.prov['source_map_sha256'] = e.canonical_sha(self.data['source_hashes'])
|
||||
for event in events:
|
||||
if event['action'] == 'cross_process_restart':
|
||||
for child in ('producer', 'consumer'):
|
||||
event[child]['source_map_sha256'] = self.prov['source_map_sha256']
|
||||
self.validated_roster = [dict(self.receipt, test='tests/TEST-ONLY.gd', source_sha256='3'*64,
|
||||
failures=0, passed=True, pid=5432, run_id='TEST-ONLY suite',
|
||||
started_unix_ns=210, ended_unix_ns=220)]
|
||||
self.docs['receipt']['ended_unix_ns'] = 100
|
||||
self.docs['trace']['ended_unix_ns'] = 100
|
||||
typed = [row for row in events if row['action'] in e.KINDS]
|
||||
events[:] = [row for row in events if row['action'] not in e.KINDS]
|
||||
for row in typed:
|
||||
meaning = row.pop('action'); kind = e.KINDS[meaning]
|
||||
row.pop('monotonic_ns'); row.pop('provenance')
|
||||
row.update(kind=kind, meaning=meaning)
|
||||
producer = dict(kind=kind, identity='TEST-ONLY '+kind, pid=4321,
|
||||
run_id='TEST-ONLY '+kind, started_unix_ns=200, ended_unix_ns=300,
|
||||
lifecycle=['started', 'ended'])
|
||||
if kind == 'command_log':
|
||||
command = dict(argv=['TEST-ONLY'], cwd=str(self.root), exit_code=0, pid=5433,
|
||||
stdout='', stderr='', stdout_sha256=hashlib.sha256(b'').hexdigest(),
|
||||
stderr_sha256=hashlib.sha256(b'').hexdigest(), started_unix_ns=210, ended_unix_ns=220,
|
||||
source_map_sha256=self.prov['source_map_sha256'])
|
||||
row.update(commands=[command], results=[0])
|
||||
elif kind == 'roster_controller':
|
||||
row.update(results=copy.deepcopy(self.validated_roster), source_hashes=self.data['source_hashes'], inputs=self.data['inputs'])
|
||||
elif kind == 'composition_result':
|
||||
row.update(**self.roles, result=copy.deepcopy(self.roles))
|
||||
elif kind.endswith('_document'):
|
||||
row.update(source_map_sha256=self.prov['source_map_sha256'], spec_sha256=self.data['spec_sha256'])
|
||||
self.docs[kind] = dict(fixture_scope='TEST-ONLY', kind=kind,
|
||||
provenance={k: self.prov[k] for k in ('root', 'S', 'T', 'source_map_sha256')}, producer=producer, records=[row])
|
||||
review_doc = self.docs['claude_review']; review = review_doc['records'][0]
|
||||
runtime = [hashlib.sha256(json.dumps(self.docs[aid]).encode()).hexdigest() for aid in ('receipt', 'trace')]
|
||||
self.seal_typed()
|
||||
runtime.append(hashlib.sha256(json.dumps(self.docs['roster_controller']).encode()).hexdigest())
|
||||
review.update(reviewer=review_doc['producer']['identity'], reviewer_run_id=review_doc['producer']['run_id'],
|
||||
runtime_artifact_sha256=runtime,
|
||||
review=dict(provider='Claude', text='TEST-ONLY synthetic review', decision='pass', runtime_artifact_sha256=runtime))
|
||||
review['review_sha256'] = e.canonical_sha(review['review'])
|
||||
review_doc['producer'].update(started_unix_ns=400, ended_unix_ns=500)
|
||||
self.seal_typed()
|
||||
for cond, meanings in e.MEANINGS.items():
|
||||
coverage = self.data['conditions'][cond]['coverage']
|
||||
for meaning in meanings:
|
||||
if meaning in e.KINDS:
|
||||
coverage[meaning] = dict(artifact_id=e.KINDS[meaning], pointer='/records/0')
|
||||
else:
|
||||
coverage[meaning] = dict(artifact_id='trace', pointer='/events/'+str(next(i for i,r in enumerate(events) if r['action'] == meaning)))
|
||||
self.data['conditions'][cond]['artifact_ids'] = sorted({link['artifact_id'] for link in coverage.values()})
|
||||
|
||||
def seal_typed(self):
|
||||
for doc in self.docs.values():
|
||||
if 'kind' in doc:
|
||||
doc['producer']['records_sha256'] = e.canonical_sha(doc['records'])
|
||||
|
||||
def verify(self, actual=False):
|
||||
artifacts = {}
|
||||
for aid, doc in self.docs.items():
|
||||
path = self.root/(aid+'.json'); path.write_text(json.dumps(doc))
|
||||
artifacts[aid] = dict(file=path)
|
||||
return e.verify(self.data, artifacts, self.roles, self.root, test_only=not actual)
|
||||
return e.verify(self.data, artifacts, self.roles, self.root, test_only=not actual,
|
||||
validated_roster=self.validated_roster, composition_result=self.roles)
|
||||
|
||||
def test_one_shared_trace_distinct_records_positive(self):
|
||||
self.verify()
|
||||
@@ -290,11 +352,19 @@ class CoverageAttackTests(unittest.TestCase):
|
||||
event['consumer']['pid'] = event['producer']['pid']
|
||||
with self.assertRaisesRegex(ValueError, 'separate process'): self.verify()
|
||||
event['consumer']['pid'] = 2345
|
||||
event = next(r for r in self.docs['trace']['events'] if r['action'] == 'exact_final_full_roster')
|
||||
event['results'][0] = dict(self.receipt, engine=dict(self.engine, version='other'))
|
||||
event = self.docs['roster_controller']['records'][0]
|
||||
event['results'][0]['engine'] = dict(self.engine, version='other')
|
||||
self.validated_roster = copy.deepcopy(event['results'])
|
||||
self.seal_typed()
|
||||
with self.assertRaisesRegex(ValueError, 'engine mismatch'): self.verify()
|
||||
|
||||
class PreservationTests(unittest.TestCase):
|
||||
def test_inherited_git_overrides_are_scrubbed(self):
|
||||
with patch.dict(os.environ, {'GIT_DIR': '/nonexistent/p24',
|
||||
'GIT_WORK_TREE': '/nonexistent/p24',
|
||||
'GIT_INDEX_FILE': '/nonexistent/p24'}):
|
||||
self.test_exact_nonp24_and_schema_preservation()
|
||||
|
||||
def test_exact_nonp24_and_schema_preservation(self):
|
||||
test = 'tests/ui/test_operations_notification.gd'
|
||||
digest = hashlib.sha256((ROOT/test).read_bytes()).hexdigest()
|
||||
@@ -308,15 +378,15 @@ class PreservationTests(unittest.TestCase):
|
||||
old_row = next(r for r in old_rows if r['test'] == test) if isinstance(old_rows, list) else old_rows[test]
|
||||
row[field] = old_row[field]
|
||||
self.assertEqual(new, old)
|
||||
self.assertEqual((ROOT/'scenes/main/world_preview.gd').read_bytes(), c.git_bytes(ROOT, 'show', 'HEAD:scenes/main/world_preview.gd'))
|
||||
old = c.git_bytes(ROOT, 'show', 'HEAD:'+test).decode()
|
||||
self.assertEqual((ROOT/'scenes/main/world_preview.gd').read_bytes(), c.git_bytes(ROOT, 'show', 'bd3a13405115fc9bf6c5acec55bcfef7dd15266a:scenes/main/world_preview.gd'))
|
||||
old = c.git_bytes(ROOT, 'show', 'bd3a13405115fc9bf6c5acec55bcfef7dd15266a:'+test).decode()
|
||||
new = (ROOT/test).read_text()
|
||||
self.assertIn('await FixtureCleanup.free_owner_and_wait(self, main)', new)
|
||||
self.assertEqual(old[old.index('\tvar cleanup:'):], new[new.index('\tvar cleanup:'):])
|
||||
start = new.index('\t# Defense dialog uses the ordinary visibility callback')
|
||||
end = new.index('\t# Pause freezes simulation via process_real_delta', start)
|
||||
self.assertEqual(new[:start]+new[end:], old)
|
||||
main_old = c.git_bytes(ROOT, 'show', 'HEAD:scenes/main/main.gd').decode()
|
||||
main_old = c.git_bytes(ROOT, 'show', 'bd3a13405115fc9bf6c5acec55bcfef7dd15266a:scenes/main/main.gd').decode()
|
||||
self.assertEqual((ROOT/'scenes/main/main.gd').read_text(), main_old.replace(
|
||||
'\t\tadd_child(defense_manager)',
|
||||
'\t\tdefense_manager.visibility_changed.connect(_update_modal_input_guard)\n\t\tadd_child(defense_manager)'))
|
||||
|
||||
+343
@@ -0,0 +1,343 @@
|
||||
{
|
||||
"scope": "SOURCE-ONLY actual worker checks; synthetic TEST-ONLY fixtures, no acceptance/runtime proof",
|
||||
"existing_HEAD": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08",
|
||||
"environment": {
|
||||
"TMPDIR": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02/tmp",
|
||||
"TMPPREFIX": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02/tmp/p24-zsh",
|
||||
"PYTHONPYCACHEPREFIX": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02/tmp/p24-phase-pyc"
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"name": "py_compile",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"-m",
|
||||
"py_compile",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/test_repair6.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217070419420000,
|
||||
"ended_unix_ns": 1792217070498310000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile_final.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile_final.stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "import",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"-c",
|
||||
"import importlib.util; s=importlib.util.spec_from_file_location('p24','tools/check_p24_operations_evidence.py'); m=importlib.util.module_from_spec(s); s.loader.exec_module(m); print('stdlib checker import OK; ROOT='+str(m.ROOT))"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217070498569000,
|
||||
"ended_unix_ns": 1792217070615361000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import_final.stdout.log",
|
||||
"sha256": "227e4f4314d035bbceb5c19e6729cbd2a562d41fe4e619fc9b43ef06d585bbd8"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import_final.stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "repair5_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217070615651000,
|
||||
"ended_unix_ns": 1792217081062430000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests_final.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests_final.stderr.log",
|
||||
"sha256": "493a9af9fad2232faff405fe4c980b9f2d16aed498bd3050ee113033c00ebbb6"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "repair6_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/test_repair6.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217081063000000,
|
||||
"ended_unix_ns": 1792217082071978000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests_final.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests_final.stderr.log",
|
||||
"sha256": "caa40f0804691880e2d4a6eb538b39349b0c7c1f8b1ffd675a0166b274057904"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "repair4_roster_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217082072276000,
|
||||
"ended_unix_ns": 1792217082723977000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests_final.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests_final.stderr.log",
|
||||
"sha256": "0adb30a92012d8b4619f01e069fc0f56ddc45daacc8c3b212a63fa832cf0b412"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "missing_real_evidence",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217082724279000,
|
||||
"ended_unix_ns": 1792217082863893000,
|
||||
"exit_code": 1,
|
||||
"expected_exit_code": 1,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence_final.stdout.log",
|
||||
"sha256": "99c1064974aee51d8216bcdf4b06bb23455486d0c33010f83c48b590e00d4269"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence_final.stderr.log",
|
||||
"sha256": "7085270e8aa6835668d4bdf5b0cf911151fd73a0de1734e700517d2d99471299"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "diff_check",
|
||||
"argv": [
|
||||
"git",
|
||||
"diff",
|
||||
"--check"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217082864195000,
|
||||
"ended_unix_ns": 1792217082886605000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check_final.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check_final.stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"earlier_commands": [
|
||||
{
|
||||
"name": "py_compile",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"-m",
|
||||
"py_compile",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/test_repair6.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217025324921000,
|
||||
"ended_unix_ns": 1792217025409162000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile.stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "import",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"-c",
|
||||
"import importlib.util; s=importlib.util.spec_from_file_location('p24','tools/check_p24_operations_evidence.py'); m=importlib.util.module_from_spec(s); s.loader.exec_module(m); print('stdlib checker import OK; ROOT='+str(m.ROOT))"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217025409418000,
|
||||
"ended_unix_ns": 1792217025528235000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import.stdout.log",
|
||||
"sha256": "227e4f4314d035bbceb5c19e6729cbd2a562d41fe4e619fc9b43ef06d585bbd8"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import.stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "repair5_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217025528551000,
|
||||
"ended_unix_ns": 1792217036154558000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests.stderr.log",
|
||||
"sha256": "024c7b22e820ff22be9d56e5847fc3a5d8de623cf779bb9dd17944876d8339ce"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "repair6_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/test_repair6.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217036155059000,
|
||||
"ended_unix_ns": 1792217037444081000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests.stderr.log",
|
||||
"sha256": "776bc53636215fefb415624b88a625905ceb46f32685859871e4c0f4bc99671b"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "repair4_roster_tests",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement/docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217037444461000,
|
||||
"ended_unix_ns": 1792217038222625000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests.stderr.log",
|
||||
"sha256": "3feee74bcfd21a227b7a9927fdda5eef8ae23efb890c97495630705fa07ec3d5"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "missing_real_evidence",
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217038222937000,
|
||||
"ended_unix_ns": 1792217038393099000,
|
||||
"exit_code": 1,
|
||||
"expected_exit_code": 1,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence.stdout.log",
|
||||
"sha256": "99c1064974aee51d8216bcdf4b06bb23455486d0c33010f83c48b590e00d4269"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence.stderr.log",
|
||||
"sha256": "7085270e8aa6835668d4bdf5b0cf911151fd73a0de1734e700517d2d99471299"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "diff_check",
|
||||
"argv": [
|
||||
"git",
|
||||
"diff",
|
||||
"--check"
|
||||
],
|
||||
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"started_unix_ns": 1792217038393493000,
|
||||
"ended_unix_ns": 1792217038424058000,
|
||||
"exit_code": 0,
|
||||
"expected_exit_code": 0,
|
||||
"logs": {
|
||||
"stdout": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check.stdout.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"stderr": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check.stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"tested_source_sha256": {
|
||||
"tools/check_p24_operations_evidence.py": "6d97a687a45f177d0c8b999436afddcf1d1e399e56bcc0ea352e74b17bd92ca3",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py": "19b56e0edf74ffce0e2d62028c4c3c8bf3ed4304fa3a6c64b58ff46f2df45099",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py": "d3c8e8ea95a1b8e1d651a7af0126336e9afdd097d4bc7f298217779ecfc4b409",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/test_repair6.py": "f4e289c8a1056d12c9d5a63c4283e7bc00eb49782a897f82c339ba0b4d9292c3"
|
||||
}
|
||||
}
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
{
|
||||
"scope": "read-only byte checks, not runtime or acceptance",
|
||||
"HEAD": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08",
|
||||
"changed_tracked_files": [
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/PROTOCOL.md",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py",
|
||||
"tools/check_p24_operations_evidence.py"
|
||||
],
|
||||
"root_context_manifest_matches": [
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/result.json",
|
||||
"sha256": "afec8969aa1a0a2338504566092493313c04c9eabea25412411de60f5e657a3f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/stdout.log",
|
||||
"sha256": "73ce2f7b317c6ce9dc2e6d224e5108550e31bc6ea4c459aa9327e3374f8e199f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/stderr.log",
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/command.json",
|
||||
"sha256": "ceeb13991ce637b6d0cb4f1c2206c4b105934887b2bb82549d3aa5e98222944d"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/packet.txt",
|
||||
"sha256": "bae2c7759d01ae8db80c923414a865bd81a8c5f668b8a0fb3a9857aa74a7d328"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/sandbox.sb",
|
||||
"sha256": "82aaea232b1c988582f5695263444f00f5c9e39ce05e71496566d731112ae709"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/ACTUAL_REPAIR5_PREPARED_COMPOSITION.json",
|
||||
"sha256": "8f168e7a693ad9c9fbcf579abdb7bb89fc47684d15bd6b502e008bcfa1fcda50"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair6-context-20261017/ROOT_REPAIR5_LOCAL_PROOF_REAUDIT.json",
|
||||
"sha256": "80f0a8eea3ca917534a0304c031295d15de639e547fad3753394c8255f7e5e67"
|
||||
}
|
||||
],
|
||||
"protected_tracked_files": [
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/REPAIR4_CODE_PHASE_STATUS.md",
|
||||
"sha256": "8d18133375c2776a2ba627143c30188b0dd6cf0ce467ae3edd1edac0186f58cb",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/SOURCE_READY_PRESERVATION_RESULT.json",
|
||||
"sha256": "94388558fcb52b98abc27fb8f0ea88dfb395167f69db4e452b1e40ccbf6a6771",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py",
|
||||
"sha256": "e7dc30bcd56dcdf3f057131bf5dc9a3a672e357bc9b8e5bf2b818d3302d4c83a",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py",
|
||||
"sha256": "5c10efe7a9c6b3d290020f8dfbb2431956b3dafff7abdd4859b8e6d83e1d9365",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/LOCAL_COMMAND_RESULTS.json",
|
||||
"sha256": "aacde68f9d6909c1c347197b257fa31a66d3e7519c01e16c79fd45aba6e8d82f",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/REFERENCE_INTEGRITY.json",
|
||||
"sha256": "be8549f3f6462757c7fb1bc664ccd6c5165f09e2eee4468aec75a8d84e4addf9",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/SOURCE_MANIFEST.json",
|
||||
"sha256": "09f8e61b49c6c590f347928e35074aaef9fb90abdb7ac6e3a930d1ded4fe059e",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/STATUS.json",
|
||||
"sha256": "b27c9bf3d75e59544528605413d4253b0c88e91298f6fb6c561a12b3aa0b26bd",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/composition.py",
|
||||
"sha256": "b2fc058b1589310499917c8c5fad056fd8861ccf6bb32dd3ce205d367f493864",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/diff_check.log",
|
||||
"sha256": "169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/import.log",
|
||||
"sha256": "4a2fe8c27abe4d9c077ca3701b07ee860d4673f93267e4ae4697638a1f2254c9",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/missing_real_evidence.log",
|
||||
"sha256": "e1f4250f0078f0a88e8fd4ec485386ab67e835d0e966e609def115de00f4c48c",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/preservation.log",
|
||||
"sha256": "7e6691b7ae2ae94f956758a8907d3d67db29b9642ed0aecbfbc94421dcbdbace",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/py_compile.log",
|
||||
"sha256": "169f24774e13a79b6341d6c41c58f159e180701e87e9028aa70afdf8712b6fbb",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/repair4_tests.log",
|
||||
"sha256": "d3852846638752b6f8421776da825a037228ead8c67333c6b14e93a2fffb8f7a",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/repair5_tests.log",
|
||||
"sha256": "48a4c44bd1f5f94faa0f78f14afea371f04d4e9652c89fc8dcad91a24e7cf836",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "scenes/main/main.gd",
|
||||
"sha256": "35c3cec2d1d13f56c1635010a5811c853d7fb42e13b8d2af6cfe8261832be6c6",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "scenes/main/world_preview.gd",
|
||||
"sha256": "8c2daa9e95d56e6e40bb2071b206693069cb7e4731b4d660d59d41c34cb43dfa",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "tests/ui/test_operations_notification.gd",
|
||||
"sha256": "50172ab6daa031d221f6a78cac5cdbcb8884f295f8062b54656562e2412faff2",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "tools/regression/suite-policy.json",
|
||||
"sha256": "93178d9f68b15307158f1050993bdc75d8790d65ebe75400a3572978e37ec26a",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"sha256": "d3599139e2358c1ac9edb5059a823880f72efe5ff457da2887114c243139f743",
|
||||
"identical_to": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08"
|
||||
}
|
||||
],
|
||||
"world_preview_identical_to_pinned_baseline": true
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
# Repair6 source/local protocol — not acceptance
|
||||
|
||||
Scope is only M1 and M2 from actual f725571e5b46473ea04a90424a404bd5. Current worker HEAD is 78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08; edits are uncommitted. No real index is supplied or created. All eight groups remain unaccepted; original 30/88 and formal14 are unchanged. No Godot, native, OS, full-roster or Windows execution occurred. Synthetic TEST-ONLY fixtures never become evidence.
|
||||
|
||||
The repair5 composition.py is byte-identical (SHA256 b2fc058b1589310499917c8c5fad056fd8861ccf6bb32dd3ce205d367f493864). Its original root, S/M/Q/T, mode, deterministic composition, complete source map, helper pins and source/checkout guards still apply. No new composition implementation or alternate result flag exists. Main, world_preview, UI tests, marker and policy are unchanged in repair6. The optional defense-test positive control and unrelated low findings are deferred.
|
||||
|
||||
## Preservation
|
||||
|
||||
All three source comparisons in PreservationTests use bd3a13405115fc9bf6c5acec55bcfef7dd15266a, as do the JSON comparisons. Reads use composition.git_bytes, which strips every inherited GIT_* variable. A negative-environment control supplies invalid GIT_DIR/GIT_WORK_TREE/GIT_INDEX_FILE and still runs the entire preservation check. world_preview must match baseline bytes; main must contain exactly the existing callback delta; the UI test must contain exactly the existing added block. There is no moving HEAD baseline or trivial baseline==HEAD success path.
|
||||
|
||||
Local checks only describe these uncommitted worker bytes. Root must normally submit, then run test_repair5.py and test_repair6.py at the actual new S and actual prepared Q before heavier tests, followed by the actual independent limited Opus review. This worker does not claim post-submit reproducibility has been observed.
|
||||
|
||||
## Stage applicability
|
||||
|
||||
Mode comes from the verified root-composition.json, never an index waiver. Both modes require all eight condition keys, every applicable runtime/OS meaning, static/import/local commands, full roster, source/config/engine bindings, original content guards, IME/save/restart and Windows classification.
|
||||
|
||||
In normal_validation HEAD must be S. The final_validation_review group has passed=false and status=prerequisites-only. Its static_import_local_affected and exact_final_full_roster coverage links remain mandatory. Its independent_claude_runtime_review and current_main_integration_final coverage values must each be exactly {"status":"not-yet-applicable"}. They are not satisfied or synthesized; later artifacts cannot be slipped into normal validation as fillers. Other groups retain their strict passed=true declaration plus substantive evidence. Successful normal verification reports only source/runtime/OS/roster prerequisites and explicitly P24-02 NOT complete, all eight unaccepted.
|
||||
|
||||
integration_final requires every original group and every meaning, including actual typed independent review and composition records. Every group retains passed=true plus actual evidence checks. A boolean never substitutes for a record. composition.py independently requires C=HEAD, clean checkout, exact parents and T. Successful machine verification still does not confer independent formal acceptance.
|
||||
|
||||
Stage reporting lists source/runtime prerequisites and later gates before checking. After composition it reports source verification; runtime failure remains NOT VERIFIED. If there is no index, no stage or prerequisites are established and completion is explicitly denied.
|
||||
|
||||
## OS versus other producers
|
||||
|
||||
OS/runtime meanings retain /events/N, action==meaning, the existing in-window monotonic_ns, and exact root/S/T/source-map/pid/session/engine provenance. All bubble/cutin/restart/save/IME guards remain. The OS engine receipt and runtime trace also need genuine ended_unix_ns when a later independent review references them. This is their real artifact-end time, not a review event inserted into their monotonic window.
|
||||
|
||||
The six non-OS meanings use separate JSON artifacts, with kind, provenance, producer and records. Their provenance is exactly {root,S,T,source_map_sha256}; no OS pid/session/window/engine fields. Coverage points to /records/N. Each record carries its exact kind and meaning. Wrong-kind relabelling, OS action/time/provenance on a typed record and OS metadata on a typed artifact are rejected. Artifacts still require the outer index's file SHA verification, distinct bytes, meaningful coverage and no fillers. Existing legacy substantive content fields can coexist on the appropriate artifact; the typed coverage does not replace those checks.
|
||||
|
||||
Each producer receipt has exactly kind, identity, pid, run_id, started_unix_ns, ended_unix_ns, lifecycle and records_sha256. kind matches the artifact and record kind. Identity/run are nonempty, pid is a real producer process separate from the OS PID, and run_id must not borrow the OS session. lifecycle is ["started","ended"], times are positive increasing actual Unix nanoseconds, and records_sha256 binds the canonical records array. Canonical SHA means UTF-8 JSON, sorted keys, compact separators, ensure_ascii=false. Root must collect actual producer receipts; these fields do not authenticate themselves and require independent inspection of the real logs. Never invent identities or timestamps to populate this schema.
|
||||
|
||||
- static_import_local_affected → command_log. commands contains actual argv, absolute cwd, child pid, exit_code=0, stdout/stderr text and their UTF-8 SHAs, source_map_sha256 and start/end Unix nanoseconds within the command producer's lifecycle. results equals the command exit-code list. These are the actual completed commands, not OS events.
|
||||
- exact_final_full_roster → roster_controller. The controller receipt binds results, source_hashes and inputs. The checker passes the exact row objects successfully validated by _validate_condition_artifact_content to correspondence. Coverage results must have equal unique suite-id sets, source hashes and complete row contents (order is immaterial), and each suite SHA must equal the source map. Receipt-only results, altered rows, duplicates or different suites fail. Every row additionally passes verify_engine and carries its own pid/run_id and start/end Unix times within the controller interval; process/run pairs cannot be reused. Row engine monotonic intervals are local to that engine, not the OS window.
|
||||
- independent_claude_runtime_review → claude_review. reviewer and reviewer_run_id match the independent producer receipt; its identity/run differ from the other typed producers. review is the actual embedded review artifact with provider=Claude, nonempty text, decision=pass and runtime_artifact_sha256; review_sha256 binds its canonical content. Both the review and coverage record reference exactly the actual SHA set of all runtime artifacts (including OS receipt/trace) and the roster-controller artifact. Review producer start must follow their real artifact end times. No OS timestamp is needed.
|
||||
- current_main_integration_final → composition_result. S/M/Q/T/mode match the verified roles, mode is integration_final, and result equals the actual dictionary returned by composition.verify_composition during this checker execution, including C and blob bindings. The producer receipt binds the archived result to the run. True/false cannot replace this result and no composition rules are duplicated.
|
||||
- held_gestures_deferred → held_gestures_document. Retains remaining_scope and source_reference and binds source_map_sha256 plus the frozen spec_sha256. P23 held gestures remain deferred, not waived.
|
||||
- macos_windows_classification → platform_document. Also binds source/spec; platform matches the actual OS environment and windows_status must stay NOTRUN. Same-release Windows device acceptance remains a later required platform gate.
|
||||
|
||||
## Local proof and handoff
|
||||
|
||||
LOCAL_COMMAND_RESULTS.json and separate stdout/stderr files capture actual source-only worker checks; SOURCE_MANIFEST.json binds the authored files and preserved inputs. These are not a production acceptance index. Prior repair5 raw proofs and STATUS remain unchanged and historical. Tests include positive typed/stage controls, wrong-kind and producer/lifecycle negatives, command stream/source errors, exact validated roster row handoff, review SHA/time/reference errors, composition-result mismatch, document bindings, normal-stage exclusions and final whole-eight enforcement.
|
||||
|
||||
Root owns lease/process checks, normal submit, exact-S/Q reruns, independent limited review, all runtime/native/OS/full-roster collection, whole-eight runtime review and final integration validation. Natural invasion/duel/defense upstream triggers, actual bubble rendering, staff-panel OS click, IME/save/scales, Windows and all other gaps remain as listed in STATUS.json. There is no new acceptance credit or change to task registration, contract or denominator.
|
||||
+229
@@ -0,0 +1,229 @@
|
||||
{
|
||||
"task_id": "P24-02",
|
||||
"existing_HEAD": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08",
|
||||
"scope": "Uncommitted repair6 source/local files only; not acceptance. Excludes itself and preexisting Root context/cache. Protected inputs are bound in PRESERVATION_AND_CONTEXT.json.",
|
||||
"files": [
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/PROTOCOL.md",
|
||||
"bytes": 6909,
|
||||
"sha256": "5957906580486513ce1569985903396d8c878f3ccb95188292d7ccf10972d14b",
|
||||
"git_blob_sha1": "638b416713b4337ce37e78e4b6b2564360f89e8f"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/correspondence.py",
|
||||
"bytes": 22489,
|
||||
"sha256": "19b56e0edf74ffce0e2d62028c4c3c8bf3ed4304fa3a6c64b58ff46f2df45099",
|
||||
"git_blob_sha1": "62fea34b77926c0fe13703843a73668cc962ceca"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair5-20261017/test_repair5.py",
|
||||
"bytes": 25962,
|
||||
"sha256": "d3c8e8ea95a1b8e1d651a7af0126336e9afdd097d4bc7f298217779ecfc4b409",
|
||||
"git_blob_sha1": "10bee7082c38ae7d337e170f42865f70975147a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/LOCAL_COMMAND_RESULTS.json",
|
||||
"bytes": 17465,
|
||||
"sha256": "a0f3a59b641c09a0df71932eb86bb6af6a6011977a3d96eb1a70ad2629869929",
|
||||
"git_blob_sha1": "243ca32d9ae92bea53fd53832e9708acd988ae68"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/PRESERVATION_AND_CONTEXT.json",
|
||||
"bytes": 8077,
|
||||
"sha256": "edd211d6a107e4998caaa879a1426ba40a3b84e0243eeda0ca597d46133d4178",
|
||||
"git_blob_sha1": "90730bd7ef5f8336a6bfa0eaa840e71631bc10ec"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/PROTOCOL.md",
|
||||
"bytes": 8937,
|
||||
"sha256": "6f315d6e73d4526727d26a9d69c29dd222ead2c1499da06e4f6efaa2fef84a56",
|
||||
"git_blob_sha1": "d1f35a0806ce7d633b5db91fa55b232ff016cca3"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/STATUS.json",
|
||||
"bytes": 5364,
|
||||
"sha256": "2f557bb3f965e1957ae87b2003cc75be03f06c4a24d503b85ae8748882948ea4",
|
||||
"git_blob_sha1": "28b7bc851f7476b1a49afdbb95fb922c7c2e5b43"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check_final.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/diff_check_final.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import.stdout.log",
|
||||
"bytes": 121,
|
||||
"sha256": "227e4f4314d035bbceb5c19e6729cbd2a562d41fe4e619fc9b43ef06d585bbd8",
|
||||
"git_blob_sha1": "880d13f6b8240144f13f6d72dd9076939cc575a9"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import_final.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/import_final.stdout.log",
|
||||
"bytes": 121,
|
||||
"sha256": "227e4f4314d035bbceb5c19e6729cbd2a562d41fe4e619fc9b43ef06d585bbd8",
|
||||
"git_blob_sha1": "880d13f6b8240144f13f6d72dd9076939cc575a9"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence.stderr.log",
|
||||
"bytes": 118,
|
||||
"sha256": "7085270e8aa6835668d4bdf5b0cf911151fd73a0de1734e700517d2d99471299",
|
||||
"git_blob_sha1": "4dad6858c0bdc83821363c91e49760f29513596a"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence.stdout.log",
|
||||
"bytes": 87,
|
||||
"sha256": "99c1064974aee51d8216bcdf4b06bb23455486d0c33010f83c48b590e00d4269",
|
||||
"git_blob_sha1": "a39487f1ca9b0802793e09b7fd7b450ab31d8920"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence_final.stderr.log",
|
||||
"bytes": 118,
|
||||
"sha256": "7085270e8aa6835668d4bdf5b0cf911151fd73a0de1734e700517d2d99471299",
|
||||
"git_blob_sha1": "4dad6858c0bdc83821363c91e49760f29513596a"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/missing_real_evidence_final.stdout.log",
|
||||
"bytes": 87,
|
||||
"sha256": "99c1064974aee51d8216bcdf4b06bb23455486d0c33010f83c48b590e00d4269",
|
||||
"git_blob_sha1": "a39487f1ca9b0802793e09b7fd7b450ab31d8920"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile_final.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/py_compile_final.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests.stderr.log",
|
||||
"bytes": 618,
|
||||
"sha256": "3feee74bcfd21a227b7a9927fdda5eef8ae23efb890c97495630705fa07ec3d5",
|
||||
"git_blob_sha1": "8e6170ce10bcfa9f1c531b30eb678cf2ce371b17"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests_final.stderr.log",
|
||||
"bytes": 618,
|
||||
"sha256": "0adb30a92012d8b4619f01e069fc0f56ddc45daacc8c3b212a63fa832cf0b412",
|
||||
"git_blob_sha1": "1cfb9aee720ec6a2339019eb5cb770eb6b52796b"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair4_roster_tests_final.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests.stderr.log",
|
||||
"bytes": 1718,
|
||||
"sha256": "024c7b22e820ff22be9d56e5847fc3a5d8de623cf779bb9dd17944876d8339ce",
|
||||
"git_blob_sha1": "adb56f4847071456bd9ef6fbe0c3b598bcc0ed97"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests_final.stderr.log",
|
||||
"bytes": 1718,
|
||||
"sha256": "493a9af9fad2232faff405fe4c980b9f2d16aed498bd3050ee113033c00ebbb6",
|
||||
"git_blob_sha1": "07c6e7a905be522e3e3b2c8085059f139fefdfa4"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair5_tests_final.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests.stderr.log",
|
||||
"bytes": 1172,
|
||||
"sha256": "776bc53636215fefb415624b88a625905ceb46f32685859871e4c0f4bc99671b",
|
||||
"git_blob_sha1": "28260c3efb2fe539f96c980317889269e4538336"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests_final.stderr.log",
|
||||
"bytes": 1172,
|
||||
"sha256": "caa40f0804691880e2d4a6eb538b39349b0c7c1f8b1ffd675a0166b274057904",
|
||||
"git_blob_sha1": "3c69fbbfd0c42493575cd87f8227dd789595526a"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/repair6_tests_final.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"git_blob_sha1": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair6-20261017/test_repair6.py",
|
||||
"bytes": 11168,
|
||||
"sha256": "f4e289c8a1056d12c9d5a63c4283e7bc00eb49782a897f82c339ba0b4d9292c3",
|
||||
"git_blob_sha1": "da0840cd0931e185841443dd99c285a2a9e0346d"
|
||||
},
|
||||
{
|
||||
"path": "tools/check_p24_operations_evidence.py",
|
||||
"bytes": 40557,
|
||||
"sha256": "6d97a687a45f177d0c8b999436afddcf1d1e399e56bcc0ea352e74b17bd92ca3",
|
||||
"git_blob_sha1": "a526eda4f58ae4a5cb04aed0b81afa166be6d138"
|
||||
}
|
||||
]
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
{
|
||||
"task_id": "P24-02",
|
||||
"source": "78f7cba7a9fb5e5dcb144758e1a86fe63b3d7d08",
|
||||
"phase": "non-UI source/local repair6; uncommitted worker bytes",
|
||||
"acceptance_ids": [],
|
||||
"native_runs": 0,
|
||||
"full_roster_runs": 0,
|
||||
"game_completion_credit": 0,
|
||||
"conditions": {
|
||||
"placement_and_invalid_drop": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "Native placement/rejection/ledger/selection and actual staff-panel OS click coverage NOTRUN."
|
||||
},
|
||||
"modal_and_pause_resume": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "Defense modal test source added; native execution, pending-command/save identity, ordinary pause/resume and actual separate-process save restart NOTRUN."
|
||||
},
|
||||
"unit_bubbles": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "Bubble native render/model/state switching and removal NOTRUN. First-relationship order, heart semantics and O(N²) scan remain whole-eight review candidates."
|
||||
},
|
||||
"event_log": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "Current exact-source production bounded log/Japanese sequence/amount/time/reason/pause/load evidence NOTRUN; historical evidence is not current acceptance."
|
||||
},
|
||||
"important_warning_cutin": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "Natural NTR/duel/defense production triggers require whole P18-01/02, P19, P21 inputs. P18 backend 265ce30 is a completed ancestor and is not restarted. Unknown production initial values remain unresolved; no new values added."
|
||||
},
|
||||
"click_alternatives": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "Actual staff-panel facility_option/apply_button OS click and navigation coverage NOTRUN. Direct handler calls are not map-click evidence. P23 held gestures remain deferred."
|
||||
},
|
||||
"japanese_input_and_scale": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "OS IME composition/confirm/cancel, persisted save display, scale/focus/clipping and old-save protection NOTRUN. Same-Windows-release device evidence unavailable and still required."
|
||||
},
|
||||
"final_validation_review": {
|
||||
"source_status": "SOURCE-READY",
|
||||
"runtime_status": "NOTRUN",
|
||||
"accepted": false,
|
||||
"gap": "Only worker stdlib/compile/import checks passed. Actual post-submit S/Q reruns and independent limited source review are NOTRUN. Actual import/affected game tests, native/OS collection, exact-final full roster, whole-eight runtime review, integration/final and Windows remain Root-owned. No real acceptance index exists."
|
||||
}
|
||||
},
|
||||
"denominator": {
|
||||
"packages": 30,
|
||||
"units": 88,
|
||||
"completed": 14,
|
||||
"partial_credit": false
|
||||
},
|
||||
"root_next_gate": "Verify this local proof; normal submit; rerun targeted stdlib tests at actual committed S and actual Q; independent limited Opus review; later import/affected, native/OS, exact-final full roster, independent whole-eight runtime review, normal integration and final validation.",
|
||||
"local_checks": {
|
||||
"py_compile_exit": 0,
|
||||
"python_import_exit": 0,
|
||||
"repair5_stdlib_git_tests": 22,
|
||||
"repair6_stdlib_tests": 12,
|
||||
"preserved_roster_head_tests": 9,
|
||||
"total_tests": 43,
|
||||
"all_test_exits": 0,
|
||||
"diff_check_exit": 0,
|
||||
"missing_real_evidence_exit": 1,
|
||||
"raw_results": "LOCAL_COMMAND_RESULTS.json",
|
||||
"source_hashes": "SOURCE_MANIFEST.json",
|
||||
"preservation_and_root_context": "PRESERVATION_AND_CONTEXT.json",
|
||||
"actual_new_S_rerun": "NOTRUN; Root-owned after normal submit",
|
||||
"actual_new_Q_rerun": "NOTRUN; Root-owned before heavy/native gates"
|
||||
},
|
||||
"status": "SOURCE-READY / runtime NOTRUN",
|
||||
"os_runs": 0,
|
||||
"fixed_findings": {
|
||||
"M1": "Pinned all preservation baseline reads to bd3a134; composition.git_bytes scrubs inherited GIT_*; added override test. Current worker check only.",
|
||||
"M2": "Typed non-OS artifacts and actual producer receipts; canonical full-row equality to the legacy-validated roster objects, exact suite/source hashes and per-row engine/process checks; explicit normal/final applicability and whole-eight guards."
|
||||
},
|
||||
"historical_proof": "Repair5 raw logs, manifests and STATUS are unchanged old-source history; not proof for these repair6 bytes.",
|
||||
"preserved": "composition.py, world_preview, main.gd, UI test, marker/policy and all repair4 files unchanged. No marker/policy rebind was needed.",
|
||||
"deferred_low_findings": "Optional defense positive control and unrelated low cleanup deferred; no new interaction.",
|
||||
"stage_applicability": {
|
||||
"normal_validation": {
|
||||
"source_runtime_os_roster": "required actual prerequisites; not fulfilled by worker unit tests",
|
||||
"independent_claude_runtime_review": "not-yet-applicable",
|
||||
"current_main_integration_final": "not-yet-applicable",
|
||||
"complete": false
|
||||
},
|
||||
"integration_final": "Every original condition and meaning required, including actual typed independent runtime review and composition result. No boolean substitute, waiver or partial credit."
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
stdlib checker import OK; ROOT=/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement
|
||||
+1
@@ -0,0 +1 @@
|
||||
stdlib checker import OK; ROOT=/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
ERROR: Could not locate p24-operations-evidence index.json.
|
||||
Ensure BUILD_OUTPUT_DIR is set or provide --index <path>.
|
||||
+1
@@ -0,0 +1 @@
|
||||
Source/runtime prerequisites NOT VERIFIED; stage not established; P24-02 NOT complete.
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
ERROR: Could not locate p24-operations-evidence index.json.
|
||||
Ensure BUILD_OUTPUT_DIR is set or provide --index <path>.
|
||||
+1
@@ -0,0 +1 @@
|
||||
Source/runtime prerequisites NOT VERIFIED; stage not established; P24-02 NOT complete.
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
test_1_invented_replacement (__main__.CheckerTests) ... ok
|
||||
test_2_duplicate_padding (__main__.CheckerTests) ... ok
|
||||
test_3_unknown_extra (__main__.CheckerTests) ... ok
|
||||
test_4_required_results (__main__.CheckerTests) ... ok
|
||||
test_5_source_hash (__main__.CheckerTests) ... ok
|
||||
test_6_missing_or_malformed_rows (__main__.CheckerTests) ... ok
|
||||
test_7_env_mismatch_and_positive_head (__main__.CheckerTests) ... ok
|
||||
test_8_git_unavailable_env_only (__main__.CheckerTests) ... ok
|
||||
test_positive_roster (__main__.CheckerTests) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.569s
|
||||
|
||||
OK
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
test_1_invented_replacement (__main__.CheckerTests) ... ok
|
||||
test_2_duplicate_padding (__main__.CheckerTests) ... ok
|
||||
test_3_unknown_extra (__main__.CheckerTests) ... ok
|
||||
test_4_required_results (__main__.CheckerTests) ... ok
|
||||
test_5_source_hash (__main__.CheckerTests) ... ok
|
||||
test_6_missing_or_malformed_rows (__main__.CheckerTests) ... ok
|
||||
test_7_env_mismatch_and_positive_head (__main__.CheckerTests) ... ok
|
||||
test_8_git_unavailable_env_only (__main__.CheckerTests) ... ok
|
||||
test_positive_roster (__main__.CheckerTests) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.455s
|
||||
|
||||
OK
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
test_altered_conflict_nonconflict_and_main_only (__main__.CompositionTests) ... ok
|
||||
test_bindings_and_source_map (__main__.CompositionTests) ... ok
|
||||
test_docs_only_main_fresh_q (__main__.CompositionTests) ... ok
|
||||
test_fifth_conflict (__main__.CompositionTests) ... ok
|
||||
test_final_mode_clean_exact_parents (__main__.CompositionTests) ... ok
|
||||
test_git_environment_and_crosschecks (__main__.CompositionTests) ... ok
|
||||
test_new_main_old_q_and_stale_source_new_q (__main__.CompositionTests) ... ok
|
||||
test_outside_scope (__main__.CompositionTests) ... ok
|
||||
test_parent_order_extra_and_tree_mismatch (__main__.CompositionTests) ... ok
|
||||
test_positive_normal_and_private_objects (__main__.CompositionTests) ... ok
|
||||
test_root_context_sha_symlink_and_cwd (__main__.CompositionTests) ... ok
|
||||
test_engine_requires_actual_receipt_and_bytes (__main__.CorrespondenceTests) ... ok
|
||||
test_observer_payloads_and_pointer (__main__.CorrespondenceTests) ... ok
|
||||
test_alias_identical_bytes (__main__.CoverageAttackTests) ... ok
|
||||
test_all_true_opaque_and_scaffold (__main__.CoverageAttackTests) ... ok
|
||||
test_cross_process_and_whole_roster_engine (__main__.CoverageAttackTests) ... ok
|
||||
test_missing_meaning_reused_and_relabelled_record (__main__.CoverageAttackTests) ... ok
|
||||
test_old_catchall_plus_seven_fillers (__main__.CoverageAttackTests) ... ok
|
||||
test_one_shared_trace_distinct_records_positive (__main__.CoverageAttackTests) ... ok
|
||||
test_wrong_root_source_and_engine (__main__.CoverageAttackTests) ... ok
|
||||
test_exact_nonp24_and_schema_preservation (__main__.PreservationTests) ... ok
|
||||
test_inherited_git_overrides_are_scrubbed (__main__.PreservationTests) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 10.413s
|
||||
|
||||
OK
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
test_altered_conflict_nonconflict_and_main_only (__main__.CompositionTests) ... ok
|
||||
test_bindings_and_source_map (__main__.CompositionTests) ... ok
|
||||
test_docs_only_main_fresh_q (__main__.CompositionTests) ... ok
|
||||
test_fifth_conflict (__main__.CompositionTests) ... ok
|
||||
test_final_mode_clean_exact_parents (__main__.CompositionTests) ... ok
|
||||
test_git_environment_and_crosschecks (__main__.CompositionTests) ... ok
|
||||
test_new_main_old_q_and_stale_source_new_q (__main__.CompositionTests) ... ok
|
||||
test_outside_scope (__main__.CompositionTests) ... ok
|
||||
test_parent_order_extra_and_tree_mismatch (__main__.CompositionTests) ... ok
|
||||
test_positive_normal_and_private_objects (__main__.CompositionTests) ... ok
|
||||
test_root_context_sha_symlink_and_cwd (__main__.CompositionTests) ... ok
|
||||
test_engine_requires_actual_receipt_and_bytes (__main__.CorrespondenceTests) ... ok
|
||||
test_observer_payloads_and_pointer (__main__.CorrespondenceTests) ... ok
|
||||
test_alias_identical_bytes (__main__.CoverageAttackTests) ... ok
|
||||
test_all_true_opaque_and_scaffold (__main__.CoverageAttackTests) ... ok
|
||||
test_cross_process_and_whole_roster_engine (__main__.CoverageAttackTests) ... ok
|
||||
test_missing_meaning_reused_and_relabelled_record (__main__.CoverageAttackTests) ... ok
|
||||
test_old_catchall_plus_seven_fillers (__main__.CoverageAttackTests) ... ok
|
||||
test_one_shared_trace_distinct_records_positive (__main__.CoverageAttackTests) ... ok
|
||||
test_wrong_root_source_and_engine (__main__.CoverageAttackTests) ... ok
|
||||
test_exact_nonp24_and_schema_preservation (__main__.PreservationTests) ... ok
|
||||
test_inherited_git_overrides_are_scrubbed (__main__.PreservationTests) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 10.241s
|
||||
|
||||
OK
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
test_checker_stage_declarations_no_boolean_substitute (__main__.TypedProducerTests) ... ok
|
||||
test_command_schema_source_stream_and_result_negatives (__main__.TypedProducerTests) ... ok
|
||||
test_composition_receipt_requires_actual_result (__main__.TypedProducerTests) ... ok
|
||||
test_document_bindings_and_windows_notrun (__main__.TypedProducerTests) ... ok
|
||||
test_each_kind_positive_and_both_stages (__main__.TypedProducerTests) ... ok
|
||||
test_each_kind_rejects_relabelling_and_os_provenance (__main__.TypedProducerTests) ... ok
|
||||
test_final_requires_every_original_condition_and_later_meaning (__main__.TypedProducerTests) ... ok
|
||||
test_normal_cannot_synthesize_later_gates_or_skip_runtime (__main__.TypedProducerTests) ... ok
|
||||
test_review_artifact_references_and_chronology (__main__.TypedProducerTests) ... ok
|
||||
test_roster_process_receipts_cannot_borrow_os_identity_or_window (__main__.TypedProducerTests) ... ok
|
||||
test_roster_receipt_only_differing_rows_and_source_sets (__main__.TypedProducerTests) ... ok
|
||||
test_roster_uses_exact_legacy_validated_objects (__main__.TypedProducerTests) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 12 tests in 1.082s
|
||||
|
||||
OK
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
test_checker_stage_declarations_no_boolean_substitute (__main__.TypedProducerTests) ... ok
|
||||
test_command_schema_source_stream_and_result_negatives (__main__.TypedProducerTests) ... ok
|
||||
test_composition_receipt_requires_actual_result (__main__.TypedProducerTests) ... ok
|
||||
test_document_bindings_and_windows_notrun (__main__.TypedProducerTests) ... ok
|
||||
test_each_kind_positive_and_both_stages (__main__.TypedProducerTests) ... ok
|
||||
test_each_kind_rejects_relabelling_and_os_provenance (__main__.TypedProducerTests) ... ok
|
||||
test_final_requires_every_original_condition_and_later_meaning (__main__.TypedProducerTests) ... ok
|
||||
test_normal_cannot_synthesize_later_gates_or_skip_runtime (__main__.TypedProducerTests) ... ok
|
||||
test_review_artifact_references_and_chronology (__main__.TypedProducerTests) ... ok
|
||||
test_roster_process_receipts_cannot_borrow_os_identity_or_window (__main__.TypedProducerTests) ... ok
|
||||
test_roster_receipt_only_differing_rows_and_source_sets (__main__.TypedProducerTests) ... ok
|
||||
test_roster_uses_exact_legacy_validated_objects (__main__.TypedProducerTests) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 12 tests in 0.804s
|
||||
|
||||
OK
|
||||
+179
@@ -0,0 +1,179 @@
|
||||
"""TEST-ONLY stdlib controls: no real evidence index or runtime execution."""
|
||||
import copy
|
||||
import hashlib
|
||||
import importlib.util
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
spec = importlib.util.spec_from_file_location('repair5_tests', HERE.parent/'source-ready-repair5-20261017/test_repair5.py')
|
||||
r5 = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(r5)
|
||||
e, checker = r5.e, r5.checker
|
||||
|
||||
|
||||
class TypedProducerTests(unittest.TestCase):
|
||||
def fixture(self, normal=False):
|
||||
f = r5.CoverageAttackTests()
|
||||
f.setUp()
|
||||
self.addCleanup(f.doCleanups)
|
||||
if normal:
|
||||
f.roles['mode'] = 'normal_validation'
|
||||
for meaning in e.LATER:
|
||||
del f.docs[e.KINDS[meaning]]
|
||||
f.data['conditions']['final_validation_review']['coverage'][meaning] = {'status': 'not-yet-applicable'}
|
||||
f.data['conditions']['final_validation_review']['artifact_ids'] = ['command_log', 'roster_controller']
|
||||
return f
|
||||
|
||||
def test_each_kind_positive_and_both_stages(self):
|
||||
f = self.fixture()
|
||||
self.assertEqual(set(e.KINDS.values()), {d['kind'] for d in f.docs.values() if 'kind' in d})
|
||||
self.assertEqual(f.verify()['stage'], 'integration_final')
|
||||
f = self.fixture(normal=True)
|
||||
report = f.verify()
|
||||
self.assertFalse(report['complete'])
|
||||
self.assertEqual(set(report['later_gates'].values()), {'not-yet-applicable'})
|
||||
|
||||
def test_each_kind_rejects_relabelling_and_os_provenance(self):
|
||||
for kind in e.KINDS.values():
|
||||
for attack in ('kind', 'meaning', 'os_record', 'os_doc', 'os_pid', 'os_session', 'receipt_kind', 'receipt_hash', 'lifecycle', 'times', 'identity'):
|
||||
with self.subTest(kind=kind, attack=attack):
|
||||
f = self.fixture(); doc = f.docs[kind]; record = doc['records'][0]
|
||||
if attack == 'kind': record['kind'] = 'os_event'
|
||||
elif attack == 'meaning': record['meaning'] = 'grid_snap'
|
||||
elif attack == 'os_record': record['session_id'] = 'TEST-ONLY'
|
||||
elif attack == 'os_doc': doc['provenance'] = f.prov
|
||||
elif attack == 'os_pid': doc['producer']['pid'] = f.data['os_environment']['pid']
|
||||
elif attack == 'os_session': doc['producer']['run_id'] = f.data['os_environment']['session_id']
|
||||
elif attack == 'receipt_kind': doc['producer']['kind'] = 'other'
|
||||
elif attack == 'lifecycle': doc['producer']['lifecycle'] = ['started']
|
||||
elif attack == 'times': doc['producer']['ended_unix_ns'] = doc['producer']['started_unix_ns']
|
||||
elif attack == 'identity': doc['producer']['identity'] = ''
|
||||
f.seal_typed()
|
||||
if attack == 'receipt_hash': doc['producer']['records_sha256'] = '0'*64
|
||||
with self.assertRaises(ValueError): f.verify()
|
||||
|
||||
def test_command_schema_source_stream_and_result_negatives(self):
|
||||
changes = [('pid', 1234), ('argv', []), ('cwd', 'relative'), ('exit_code', 1), ('exit_code', True),
|
||||
('stdout_sha256', '0'*64), ('stderr', 'unbound output'),
|
||||
('started_unix_ns', 1), ('ended_unix_ns', 10000), ('source_map_sha256', '0'*64)]
|
||||
for key, value in changes:
|
||||
with self.subTest(key=key, value=value):
|
||||
f = self.fixture(normal=True)
|
||||
f.docs['command_log']['records'][0]['commands'][0][key] = value
|
||||
f.seal_typed()
|
||||
with self.assertRaisesRegex(ValueError, 'command'): f.verify()
|
||||
|
||||
def test_roster_receipt_only_differing_rows_and_source_sets(self):
|
||||
for attack in ('receipt_only', 'different', 'duplicate', 'source', 'no_validated_rows', 'boolean_relabel', 'engine'):
|
||||
with self.subTest(attack=attack):
|
||||
f = self.fixture(normal=True); record = f.docs['roster_controller']['records'][0]
|
||||
if attack == 'receipt_only': record['results'] = [f.receipt]
|
||||
elif attack == 'different': record['results'][0]['checks'] = 999
|
||||
elif attack == 'duplicate': record['results'] *= 2
|
||||
elif attack == 'source': record['results'][0]['source_sha256'] = '0'*64
|
||||
elif attack == 'no_validated_rows': f.validated_roster = None
|
||||
elif attack == 'boolean_relabel': record['results'][0]['failures'] = False
|
||||
else:
|
||||
record['results'][0]['engine_ended'] = False
|
||||
f.validated_roster = copy.deepcopy(record['results'])
|
||||
f.seal_typed()
|
||||
with self.assertRaises(ValueError): f.verify()
|
||||
|
||||
def test_roster_uses_exact_legacy_validated_objects(self):
|
||||
f = self.fixture(normal=True)
|
||||
suite = 'tests/TEST-ONLY.gd'; path = f.root/suite
|
||||
path.parent.mkdir(); path.write_text('TEST-ONLY suite bytes')
|
||||
rows = [dict(f.receipt, test=suite, source_sha256=hashlib.sha256(path.read_bytes()).hexdigest(), failures=0, passed=True)]
|
||||
content = dict(test_suite='tests/ui/test_operations_notification.gd', failures=0, checks=1,
|
||||
full_roster={'results': rows})
|
||||
validated = []
|
||||
with patch.object(checker, 'VERIFIED_ROOT', f.root), patch.object(checker, 'get_required_suite_roster', return_value=[suite]):
|
||||
self.assertEqual(checker._validate_condition_artifact_content('final_validation_review', content, 'json', f.root, {}, {}, validated), (True, ''))
|
||||
self.assertIs(validated[0], rows[0])
|
||||
bad = copy.deepcopy(content); bad['full_roster']['results'][0]['source_sha256'] = '0'*64
|
||||
rejected = []
|
||||
self.assertFalse(checker._validate_condition_artifact_content('final_validation_review', bad, 'json', f.root, {}, {}, rejected)[0])
|
||||
self.assertEqual(rejected, [])
|
||||
# The coverage list must be equal to these actual objects, not merely
|
||||
# another engine receipt or a differently hashed suite with a pass flag.
|
||||
with self.assertRaises(ValueError):
|
||||
e.verify_typed('exact_final_full_roster', f.docs['roster_controller']['records'][0],
|
||||
f.docs['roster_controller'], f.data, f.roles, f.docs, {}, validated, f.roles)
|
||||
|
||||
def test_review_artifact_references_and_chronology(self):
|
||||
for attack in ('hash', 'references', 'early', 'run', 'provider', 'decision', 'independence'):
|
||||
with self.subTest(attack=attack):
|
||||
f = self.fixture(); doc = f.docs['claude_review']; record = doc['records'][0]
|
||||
if attack == 'hash': record['review_sha256'] = '0'*64
|
||||
elif attack == 'references': record['runtime_artifact_sha256'] = ['0'*64]
|
||||
elif attack == 'early': doc['producer']['started_unix_ns'] = 50
|
||||
elif attack == 'run': record['reviewer_run_id'] = 'other'
|
||||
elif attack == 'independence': doc['producer']['identity'] = f.docs['roster_controller']['producer']['identity']
|
||||
else:
|
||||
record['review'][attack] = 'wrong'
|
||||
record['review_sha256'] = e.canonical_sha(record['review'])
|
||||
f.seal_typed()
|
||||
with self.assertRaises(ValueError): f.verify()
|
||||
|
||||
def test_composition_receipt_requires_actual_result(self):
|
||||
f = self.fixture(); doc = f.docs['composition_result']; record = doc['records'][0]
|
||||
for result in (None, True, dict(f.roles, T='0'*40)):
|
||||
with self.assertRaisesRegex(ValueError, 'composition.py result'):
|
||||
e.verify_typed('current_main_integration_final', record, doc, f.data, f.roles, f.docs, {}, f.validated_roster, result)
|
||||
record['result'] = dict(f.roles, M='0'*40); f.seal_typed()
|
||||
with self.assertRaisesRegex(ValueError, 'composition result receipt'): f.verify()
|
||||
|
||||
def test_document_bindings_and_windows_notrun(self):
|
||||
for kind in ('held_gestures_document', 'platform_document'):
|
||||
for field in ('source_map_sha256', 'spec_sha256'):
|
||||
f = self.fixture(normal=True); f.docs[kind]['records'][0][field] = '0'*64; f.seal_typed()
|
||||
with self.assertRaisesRegex(ValueError, 'document source/spec'): f.verify()
|
||||
f = self.fixture(normal=True); f.docs['platform_document']['records'][0]['windows_status'] = 'PASS'; f.seal_typed()
|
||||
with self.assertRaisesRegex(ValueError, 'Windows'): f.verify()
|
||||
|
||||
def test_normal_cannot_synthesize_later_gates_or_skip_runtime(self):
|
||||
for meaning in e.LATER:
|
||||
for link in (True, {'passed': True}, {'status': 'satisfied'}):
|
||||
f = self.fixture(normal=True)
|
||||
f.data['conditions']['final_validation_review']['coverage'][meaning] = link
|
||||
with self.assertRaises(ValueError): f.verify()
|
||||
f = self.fixture(normal=True)
|
||||
f.data['conditions']['placement_and_invalid_drop']['coverage']['grid_snap'] = {'status': 'not-yet-applicable'}
|
||||
with self.assertRaises(ValueError): f.verify()
|
||||
f = self.fixture(normal=True); f.roles['mode'] = 'integration_final'
|
||||
with self.assertRaises(ValueError): f.verify()
|
||||
with self.assertRaises(ValueError): e.stage_report('waiver')
|
||||
|
||||
def test_final_requires_every_original_condition_and_later_meaning(self):
|
||||
for condition in e.MEANINGS:
|
||||
f = self.fixture(); del f.data['conditions'][condition]
|
||||
with self.assertRaisesRegex(ValueError, 'whole-eight'): f.verify()
|
||||
for meaning in e.LATER:
|
||||
f = self.fixture()
|
||||
f.data['conditions']['final_validation_review']['coverage'][meaning] = {'status': 'not-yet-applicable'}
|
||||
with self.assertRaises(ValueError): f.verify()
|
||||
|
||||
def test_roster_process_receipts_cannot_borrow_os_identity_or_window(self):
|
||||
for key, value in [('pid', 1234), ('run_id', 'TEST-ONLY'), ('started_unix_ns', 1), ('ended_unix_ns', 10000)]:
|
||||
f = self.fixture(normal=True)
|
||||
row = f.docs['roster_controller']['records'][0]['results'][0]
|
||||
row[key] = value
|
||||
f.validated_roster = copy.deepcopy([row]); f.seal_typed()
|
||||
with self.assertRaisesRegex(ValueError, 'suite'): f.verify()
|
||||
|
||||
def test_checker_stage_declarations_no_boolean_substitute(self):
|
||||
checker.validate_condition_stage('final_validation_review', {'passed': False, 'status': 'prerequisites-only'}, 'normal_validation')
|
||||
for mode in ('normal_validation', 'integration_final'):
|
||||
for cond in checker.REQUIRED_CONDITIONS:
|
||||
if mode == 'normal_validation' and cond == 'final_validation_review':
|
||||
with self.assertRaises(ValueError): checker.validate_condition_stage(cond, {'passed': True}, mode)
|
||||
else:
|
||||
checker.validate_condition_stage(cond, {'passed': True}, mode)
|
||||
for flag in (False, 1, None):
|
||||
with self.assertRaises(ValueError): checker.validate_condition_stage(cond, {'passed': flag}, mode)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(verbosity=2)
|
||||
@@ -146,6 +146,7 @@ def _validate_condition_artifact_content(
|
||||
evidence_dir: Path,
|
||||
root_data: dict,
|
||||
validated_artifacts: dict,
|
||||
validated_roster: list = None,
|
||||
) -> tuple[bool, str]:
|
||||
if not isinstance(art_data, dict):
|
||||
return False, f"Artifact content for condition '{cond}' must be a JSON object"
|
||||
@@ -428,10 +429,24 @@ def _validate_condition_artifact_content(
|
||||
if seen_suites != set(required_suites):
|
||||
return False, f"Full roster execution missing required suites: {sorted(list(missing_from_roster))[:5]}"
|
||||
|
||||
# Hand the exact successfully validated objects to correspondence; never
|
||||
# re-read a different list from the index or a coverage receipt.
|
||||
if validated_roster is not None:
|
||||
validated_roster.extend(suite_entries)
|
||||
|
||||
return True, ""
|
||||
|
||||
|
||||
def _verify_evidence(index_path: Path) -> bool:
|
||||
def validate_condition_stage(condition, row, mode):
|
||||
correspondence.stage_report(mode)
|
||||
if condition == 'final_validation_review' and mode == 'normal_validation':
|
||||
correspondence.require(row.get('passed') is False and row.get('status') == 'prerequisites-only',
|
||||
'normal_validation final group must be prerequisites-only, passed=false')
|
||||
else:
|
||||
correspondence.require(row.get('passed') is True, 'condition requires passed=true plus actual evidence: '+condition)
|
||||
|
||||
|
||||
def _verify_evidence(index_path: Path, roles: dict, composition_result: dict) -> bool:
|
||||
print(f"Reading evidence index from: {index_path}")
|
||||
try:
|
||||
data = json.loads(index_path.read_text(encoding="utf-8"))
|
||||
@@ -654,6 +669,7 @@ def _verify_evidence(index_path: Path) -> bool:
|
||||
print(f"ERROR: Unknown invented conditions present in evidence index: {sorted(invented)}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
validated_roster = []
|
||||
condition_to_artifacts = {}
|
||||
for cond in REQUIRED_CONDITIONS:
|
||||
cond_data = conditions[cond]
|
||||
@@ -661,13 +677,10 @@ def _verify_evidence(index_path: Path) -> bool:
|
||||
print(f"ERROR: Condition '{cond}' must be a structured JSON object with evidence details, not bare boolean or primitive", file=sys.stderr)
|
||||
return False
|
||||
|
||||
passed_val = cond_data.get("passed")
|
||||
if isinstance(passed_val, bool):
|
||||
if passed_val is not True:
|
||||
print(f"ERROR: Condition '{cond}' explicitly marked not passed", file=sys.stderr)
|
||||
return False
|
||||
else:
|
||||
print(f"ERROR: Condition '{cond}' missing strict boolean 'passed': true (value={passed_val!r})", file=sys.stderr)
|
||||
try:
|
||||
validate_condition_stage(cond, cond_data, roles['mode'])
|
||||
except ValueError as exc:
|
||||
print(f"ERROR: {exc}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
cond_art_ids = cond_data.get("artifact_ids")
|
||||
@@ -704,6 +717,7 @@ def _verify_evidence(index_path: Path) -> bool:
|
||||
evidence_dir,
|
||||
data,
|
||||
validated_artifacts,
|
||||
validated_roster,
|
||||
)
|
||||
if ok:
|
||||
content_verified = True
|
||||
@@ -716,12 +730,16 @@ def _verify_evidence(index_path: Path) -> bool:
|
||||
return False
|
||||
|
||||
try:
|
||||
correspondence.verify(data, validated_artifacts, composition.root_context(evidence_dir, data), ROOT)
|
||||
correspondence.verify(data, validated_artifacts, roles, ROOT,
|
||||
validated_roster=validated_roster, composition_result=composition_result)
|
||||
except (ValueError, KeyError, TypeError, OSError, IndexError) as exc:
|
||||
print(f"ERROR: correspondence: {exc}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
print("SUCCESS: All 8 required conditions, candidate version, scope manifest, and OS execution artifacts strictly verified.")
|
||||
if roles['mode'] == 'normal_validation':
|
||||
print("SUCCESS: Source/runtime/OS/full-roster prerequisites verified. P24-02 NOT complete; independent runtime review and integration-final are not-yet-applicable. All 8 remain unaccepted.")
|
||||
else:
|
||||
print("SUCCESS: All 8 required condition evidence groups including typed review/integration records strictly verified. Independent formal acceptance remains separate.")
|
||||
return True
|
||||
|
||||
|
||||
@@ -731,14 +749,19 @@ def verify_evidence(index_path: Path) -> bool:
|
||||
composition.root_identity(ROOT, Path.cwd())
|
||||
data = composition.strict_json(index_path.read_bytes())
|
||||
roles = composition.root_context(index_path.parent, data)
|
||||
print(json.dumps(correspondence.stage_report(roles.get('mode')), sort_keys=True))
|
||||
composition.require(data.get('inputs', {}).get(composition.SPEC) == EXPECTED_SPEC_SHA256, 'frozen spec input SHA mismatch')
|
||||
required_helpers = {_HELPER.relative_to(ROOT).as_posix(), _HELPER.with_name('correspondence.py').relative_to(ROOT).as_posix()}
|
||||
composition.require(required_helpers <= set(data['inputs']), 'missing checker helper input pins')
|
||||
composition.verify_composition(ROOT, roles, data.get('source_hashes'), data.get('inputs'),
|
||||
composition_result = composition.verify_composition(ROOT, roles, data.get('source_hashes'), data.get('inputs'),
|
||||
EXPECTED_BASE_COMMIT, REQUIRED_SCOPE_FILES + ['docs/plans/original-completion-2026-10-02/execution/p24-02/**'])
|
||||
print("Source/composition prerequisites: verified; runtime/OS/roster prerequisites: verification pending; P24-02 NOT complete.")
|
||||
with composition.tested_checkout(ROOT, roles['T']) as view:
|
||||
VERIFIED_ROOT = view
|
||||
return _verify_evidence(index_path)
|
||||
verified = _verify_evidence(index_path, roles, composition_result)
|
||||
if not verified:
|
||||
print("Runtime/OS/roster or applicable later prerequisites: NOT VERIFIED; P24-02 NOT complete.")
|
||||
return verified
|
||||
except (ValueError, KeyError, TypeError, OSError, IndexError) as exc:
|
||||
print(f"ERROR: composition: {exc}", file=sys.stderr)
|
||||
return False
|
||||
@@ -761,6 +784,7 @@ def main() -> int:
|
||||
if not index_file:
|
||||
print("ERROR: Could not locate p24-operations-evidence index.json.", file=sys.stderr)
|
||||
print("Ensure BUILD_OUTPUT_DIR is set or provide --index <path>.", file=sys.stderr)
|
||||
print("Source/runtime prerequisites NOT VERIFIED; stage not established; P24-02 NOT complete.")
|
||||
return 1
|
||||
|
||||
if not verify_evidence(index_file):
|
||||
|
||||
Reference in New Issue
Block a user