P08-03: 配置の通常操作受入

This commit is contained in:
Agent Control Runner
2026-10-14 05:51:27 +09:00
parent 4a17d0e0f5
commit d01286360e
21 changed files with 7225 additions and 79 deletions
@@ -135,7 +135,7 @@ P08 package remain open. Windows same-distribution/device evidence remains
open; Mac/Linux results cannot substitute for it. No outside-scope service
defect or required permission change has been demonstrated by this worker.
## r04 initial OS load oracle repair (current submitted candidate)
## r04 initial OS load oracle repair (retained earlier submission)
The supplied OS_R04_INITIAL_LOAD_ORACLE_FINDING.json and
os-r04-writer-engine.log identify the bootstrap-only simple equality failure.
@@ -166,3 +166,42 @@ Root native/OS collection for this candidate, final full regression after
freeze, separate Opus review and integration/current final verification remain
open. All five conditions and the 30/88 denominator are unchanged. No Runtime,
UI, SaveService, collector, specification or historical evidence edits.
## R05 consolidated repair (current submission)
The supplied ROOT_CHECKER_R05_INFRASTRUCTURE_ORACLE.json and
ROOT_OS_R05_GUIDE_INTERCEPTION.json are failure authorities, not acceptance.
The original failed OS request and all supplied raw files remain untouched.
The complete gzipped reader checkpoint is copied byte-for-byte into the fixture
suite with its provenance. Tests verify the decompressed 2120352 bytes and
SHA `304d97de8051d5e74c6e32c4482a3cb183b0172d7671088fdc40469cc3448c0d`.
It is actual native input from candidate 4a17d0e0f589fa76d81f1d4630ec45c63bac21ab,
not proof of acceptance for the changed candidate.
Runtime _on_facility_completed and FacilityInfrastructureProjector define the
split: ordinary construction instances require operational membership; supported
schema proxies require exact infrastructure membership. The checker preserves
completed-job, occupation, demolition and refusal invariants, and now checks
projection identity/cells/definition/fingerprint, managed ROUTE and connector
membership, exact stair connector fields and lower landing, and projected
walkable/path topology. Actual checkpoint corruption tests exercise missing,
extra and incorrect topology, ordinary facility loss and proxy occupation loss.
Whole-checker synthetic controls now represent stairs in the infrastructure
projector and retain every earlier test.
The handler unsupported target is (4,4,0). The passive observer independently
chooses a visible cell with the unchanged UNSUPPORTED predicate outside the
opening guide rectangle after normal palette selection. It reads bounds,
preview and guide geometry; it does not suppress the guide or mutate models.
Cell requests include viewport-to-screen affine mapping derived from existing
Godot transforms, including stretch and window translation, and current guide
geometry. The checker recomputes the mapping and rejects guide interception.
Root must retain actual CUA coordinates, screenshots and raw receipts and check
the mapping against the real window; no OS success is claimed by this worker.
Bootstrap repair, all five facets, product UI and driver progress are preserved.
Python syntax/checker execution and exact source/input manifests are recorded in
local-validation.json and implementation.json. Godot parsing, fresh native and
OS collection, final full regression, independent review, integration/current
verification and Windows device evidence remain pending. No context gap or
outside-scope service defect has been demonstrated in this batch.
@@ -0,0 +1,23 @@
{
"unit": "P08-03",
"candidate": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab",
"registered_validation": "89dfca90b9d64eb780460589144837ee-validation.json",
"actual_deficits": [
"partial demolition/completion"
],
"cause_evidence": {
"checker": "tools/check_p08_normal_placement_evidence.py:173 unconditionally requires construction facility IDs == FacilityService operational IDs",
"raw_snapshot": "pair/reader-checkpoint.json",
"construction_only_ids": [
"facility_00000002",
"facility_00000003"
],
"definitions": [
"guest_stairs",
"guest_stairs"
],
"runtime_source": "autoload/simulation_runtime.gd:10682-10720 separates supported schema proxies into infrastructure projector and ordinary facilities into operational service"
},
"requested_action": "Verify current intended proxy projection contract from source, then make checker faithfully require operational membership for ordinary definitions and exact projected topology for supported infrastructure proxies. Do not simply skip stairs or drop occupancy/loss/demolition invariants. Add real-snapshot and missing/extra/wrong projected topology negative tests. Same targeted fixture repair batch; no product scope expansion.",
"formal_acceptance": false
}
@@ -125,3 +125,12 @@ Keep final requests (including save/load) as well as row-specific requests.
Do not edit evidence after collection to force a pass. Correct source/input
defects through the fixed repair workflow. GDScript parsing, actual native
and OS success, full regression, review and integration are all pending.
R05 repair: cell requests now retain `viewport_to_screen` as six affine entries
`[a,b,c,d,tx,ty]`. Apply it to viewport `(x,y)` to obtain screen
`(a*x+c*y+tx, b*x+d*y+ty)`; retain the actual CUA coordinate in the raw receipt
and compare against screenshots/window geometry, including titlebar and stretch.
Do not multiply by canvas scale a second time. `guide_rect` is in viewport
coordinates and `guide_visible` records interception geometry. The unsupported
target is chosen by read-only production preview inspection outside that guide;
the failed R05 request is historical evidence and must remain preserved.
@@ -0,0 +1,38 @@
{
"unit": "P08-03",
"candidate": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab",
"formal_acceptance": false,
"OS_completed": false,
"successful_requests": [
1,
2,
3,
4
],
"unacknowledged_request": 5,
"required_world_cell": [
-8,
4,
0
],
"viewport": [
242.0,
180.0
],
"actual_coordinate": [
215,
192
],
"canvas_scale": 0.8888888888888888,
"titlebar_pixels": 32,
"observed": "Open-business guide intercepts unsupported target cell click and selects reception; no unsupported placement interaction occurred",
"actual_tool_call": "call_bc7eaed7c8ca4b82b53e15166d6ec0f3",
"screenshots": [
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p08-03-native-handler-r05/os-pair/writer-request-0005/screen-before.png",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p08-03-native-handler-r05/os-pair/writer-request-0005/screen-after.png"
],
"requested_fix": "Keep unsupported predicate; choose visible unsupported target outside normal guide. Derive/record stretch-to-window CUA coordinate mapping. No guide suppression/model injection/criteria weakening. Preserve good bootstrap/native code and raw failed attempt.",
"owned_engine_ended": true,
"cleanup_errors": [],
"guard_errors": []
}
@@ -0,0 +1,9 @@
{
"raw_path": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p08-03-native-handler-r05/pair/reader-checkpoint.json",
"raw_sha256": "304d97de8051d5e74c6e32c4482a3cb183b0172d7671088fdc40469cc3448c0d",
"raw_bytes": 2120352,
"compressed_path": "ROOT_R05_READER_CHECKPOINT.json.gz",
"candidate": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab",
"complete_raw_preserved": true,
"scope": "actual native reader snapshot, not synthetic acceptance proof"
}
@@ -0,0 +1,38 @@
{
"task_id": "P08-03",
"started_at": "2026-10-13T19:51:22.470024+00:00",
"ended_at": "2026-10-13T19:52:12.939899+00:00",
"syntax": {
"method": "compile in memory; no pyc",
"files": {
"tools/run_p08_normal_placement.py": "191831b4f684bdd7e99b3be6038c15a6830f544d17c941869b1c2a8fbe4a2aa3",
"tools/check_p08_normal_placement_evidence.py": "7fbc115599782b2b7e98f9df855e72b076580b74f6a17aa255d16f2566fe6285",
"tools/test_p08_normal_placement_evidence.py": "3a5fb02b944a9eff808458df897574232f9e5609d828031562e93d9920b9cfbb",
"tests/fixtures/p08-03/checker_fixture.py": "062333148bfb570f2191317f1634e5dd1495cf3602221fc9a054dd9243597669"
},
"passed": true
},
"checker_tests": {
"argv": [
"python3",
"-B",
"tools/test_p08_normal_placement_evidence.py"
],
"timeout_seconds": 900,
"exit_code": 0,
"log": "repair-r04-local-checker-tests.log",
"log_sha256": "e54ecf761ca49aebe01fc1a13367ba01aa0f437ba649b781b1c8feb3a6f8bbc6",
"synthetic_only": true,
"test_count": 56,
"retained_previous_tests": 49,
"new_semantic_tests": 7
},
"source_and_inputs_unchanged_during_tests": true,
"native_engines_started": 0,
"OS_operations": 0,
"full_regression_executed": false,
"acceptance": "pending",
"local_source_manifest": "local-source-manifest.json",
"local_source_manifest_sha256": "533748d30a8fb7b7e78930cf2c08139e980f75341ba772f062780d2056ec2900",
"git_diff_check": "pass"
}
@@ -0,0 +1,37 @@
{
"task_id": "P08-03",
"started_at": "2026-10-13T20:48:14.426031+00:00",
"ended_at": "2026-10-13T20:49:23.475326+00:00",
"syntax": {
"method": "ast.parse in memory; no pyc",
"files": {
"tools/run_p08_normal_placement.py": "191831b4f684bdd7e99b3be6038c15a6830f544d17c941869b1c2a8fbe4a2aa3",
"tools/check_p08_normal_placement_evidence.py": "dfa37ed586240972e57cbb6a962beb856ba289abd58dbfaf83706d3a227a0116",
"tools/test_p08_normal_placement_evidence.py": "de55cb674ef7163ab9c6dfceba4ae42fb0a43bc718df51fa63dc2f271bcbf1b7",
"tests/fixtures/p08-03/checker_fixture.py": "508e8bc0f9ff3dc578a3b34fdfb3354fe31e5e604e2d7731cd25511c4261e93a"
},
"passed": true
},
"checker_tests": {
"argv": [
"python3",
"-B",
"tools/test_p08_normal_placement_evidence.py"
],
"timeout_seconds": 900,
"exit_code": 1,
"log": "repair-r05-local-checker-tests.log",
"log_sha256": "b6f30299c9383c77553e946cff853894e7a53a8a9e88bdd15342dd9ede457242",
"test_count": 75,
"retained_previous_tests": 56,
"new_tests": 19,
"synthetic_and_actual_snapshot_controls_only": true
},
"source_and_inputs_unchanged_during_tests": true,
"native_engines_started": 0,
"OS_operations": 0,
"full_regression_executed": false,
"acceptance": "pending",
"local_source_manifest": "local-source-manifest.json",
"local_source_manifest_sha256": "b3141b695926da4e45a04d576c4f2922dee62e5f316a428798d3c5edf82c7fea"
}
@@ -0,0 +1,25 @@
........................................................FF.................
======================================================================
FAIL: test_whole_checker_missing_stair_projection (__main__.EvidenceTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-implement/tools/test_p08_normal_placement_evidence.py", line 349, in test_whole_checker_missing_stair_projection
self.reject('missing/extra infrastructure projection')
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-implement/tools/test_p08_normal_placement_evidence.py", line 48, in reject
self.assertIn(text, ' '.join(errors))
AssertionError: 'missing/extra infrastructure projection' not found in "wrong resume model: source-defined operation drift reader [('systems', 'runtime', 'facility_infrastructure', 'projections')]"
======================================================================
FAIL: test_whole_checker_wrong_stair_connector (__main__.EvidenceTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-implement/tools/test_p08_normal_placement_evidence.py", line 353, in test_whole_checker_wrong_stair_connector
self.reject('wrong infrastructure connector topology')
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-implement/tools/test_p08_normal_placement_evidence.py", line 48, in reject
self.assertIn(text, ' '.join(errors))
AssertionError: 'wrong infrastructure connector topology' not found in "wrong resume model: source-defined operation drift reader [('systems', 'runtime', 'path', 'connectors', '0', 'cost')]"
----------------------------------------------------------------------
Ran 75 tests in 65.677s
FAILED (failures=2)
@@ -5,7 +5,7 @@
"P08-03"
],
"base_commit": "12430ba89970bda349781e51157e72e48a4ac06f",
"actual_worktree_HEAD": "c2b59f04f94dda0a61991ec3bb7f0e946196f995",
"actual_worktree_HEAD": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab",
"worker_committed": false,
"final_commit": null,
"final_commit_note": "Root must freeze and record the submitted candidate; worker git writes are prohibited.",
@@ -18,33 +18,35 @@
},
"final_local_files_sha256": {
"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json": "f59f01f65c795057117fda753706a6200928d4954af901fc965cf1a7c09232b5",
"docs/plans/original-completion-2026-10-02/execution/p08-03/CONDITION_MATRIX.md": "8ddca3cdd8c1049018baf48c67d1ca90b8f1c59a386e625c2d187f196497e2ba",
"docs/plans/original-completion-2026-10-02/execution/p08-03/ROOT_COLLECTION.md": "79944e586fab86096de003fb0f6ad99b2af7f5d6c3043668edc0f9b39addc218",
"docs/plans/original-completion-2026-10-02/execution/p08-03/CONDITION_MATRIX.md": "6dad13394a647cecae79e55ecfe42e57c4266565f131ad298ac0305942c6159d",
"docs/plans/original-completion-2026-10-02/execution/p08-03/ROOT_COLLECTION.md": "bc3f4045cae8c59dce340ac9b1fb523ad6bb50882f794fdbf89ec326213ac7db",
"docs/plans/original-completion-2026-10-02/execution/p08-03/passive_os_placement_recorder.gd": "21855e3b32263eb98127202467b770cb1334fa70c6b357825a122db385ffa8d6",
"docs/plans/original-completion-2026-10-02/execution/p08-03/passive_os_placement_recorder.gd.uid": "d7f97560c8bbdfdaed173b2b48261e65b92847bd0493dd1cc2ebb309d0622314",
"scenes/main/main.gd": "e015e18fee8c114ddce39e46a04be139e694a4e3569855065576c0c909b94fc6",
"scenes/main/world_preview.gd": "2f0e417ae2ff1745062bdbdcec74b3b058cfcffbbd9001ca3e6a62cd23efb47d",
"tests/fixtures/p08-03/checker_fixture.py": "062333148bfb570f2191317f1634e5dd1495cf3602221fc9a054dd9243597669",
"tests/fixtures/p08-03/passive_placement.gd": "e55ce365aec82f763860564d5065e8a4d3f36b717c92e28fc48ac60657366992",
"tests/fixtures/p08-03/checker_fixture.py": "508e8bc0f9ff3dc578a3b34fdfb3354fe31e5e604e2d7731cd25511c4261e93a",
"tests/fixtures/p08-03/passive_placement.gd": "ca2a8b83d6657a858823645ad8d29aed100637e6a620e9d1c451780118409e81",
"tests/fixtures/p08-03/passive_placement.gd.uid": "f75e3f2d9555c30cee3a1de882f32225fc624565a78a7ef3f5c604325c578ce3",
"tests/fixtures/p08-03/placement.gd": "299016b07b5e4eab0c269a2efde45908b7ca38bf1259abae3272453f3b7304eb",
"tests/fixtures/p08-03/placement.gd": "1ebaaa80784905d661954e255bfb8a96a3a963a57b9a38b19e7f91b90fb628b3",
"tests/fixtures/p08-03/placement.gd.uid": "5caca08c1e627e0ca07e2ab7b13bd82b24a22f77513fe87e30b79023568e1987",
"tests/ui/test_p08_normal_placement_ops.gd": "734f4f85d0b0fc45dc31fc23502425b911635667dabc0341ba0d88b0107f4405",
"tests/ui/test_p08_normal_placement_ops.gd.uid": "7d168ac50ca82ae1979da31c467f9a5020ca5ec7616b5bf99294413d85b3b299",
"tools/check_p08_normal_placement_evidence.py": "7fbc115599782b2b7e98f9df855e72b076580b74f6a17aa255d16f2566fe6285",
"tools/check_p08_normal_placement_evidence.py": "dfa37ed586240972e57cbb6a962beb856ba289abd58dbfaf83706d3a227a0116",
"tools/regression/suite-policy.json": "e875e6b05bbac8dfb98c2af007221436fa558ddb8806b6214689830295b32e8d",
"tools/run_p08_normal_placement.py": "191831b4f684bdd7e99b3be6038c15a6830f544d17c941869b1c2a8fbe4a2aa3",
"tools/test_p08_normal_placement_evidence.py": "3a5fb02b944a9eff808458df897574232f9e5609d828031562e93d9920b9cfbb",
"tools/test_p08_normal_placement_evidence.py": "d40edc5518e8bfcb59a1da3f55305955581209cfd24a0223c764d6e39c4c361e",
"docs/plans/original-completion-2026-10-02/execution/p08-03/NATIVE_R02_READER_OPERATION_DELTA.json": "60463e735d4f473bdad7b0925c37b9ca71ee34d6f0eb74ea6c07b508b5153e41",
"docs/plans/original-completion-2026-10-02/execution/p08-03/native-r02-reader-stderr.log": "8079b3dc2ba7b9a9c37fcd9a5a8df0971354027c60def4b95fb15c7310832040",
"docs/plans/original-completion-2026-10-02/execution/p08-03/OS_R04_INITIAL_LOAD_ORACLE_FINDING.json": "6a796bd63f5a16bd0bf0fcf07cec3f4414a5e6704409a79522a2677eae53b417",
"docs/plans/original-completion-2026-10-02/execution/p08-03/os-r04-writer-engine.log": "f78c28c53460b767e924867f5158787c8497973e6f1c10353cb0f2cb2cbc3a3d",
"docs/plans/original-completion-2026-10-02/execution/p08-03/registered-r04-evidence-manifest.json": "6189fb2fe983d11faf96f99d6e21eba550be8e89c083c1277ac2ada9fa50cafa"
"docs/plans/original-completion-2026-10-02/execution/p08-03/registered-r04-evidence-manifest.json": "6189fb2fe983d11faf96f99d6e21eba550be8e89c083c1277ac2ada9fa50cafa",
"tests/fixtures/p08-03/r05-reader-checkpoint.json.gz": "27fd3b41834106ccd6a0980dfa2bc91cc19806dd3f552ba04246efb400763233",
"tests/fixtures/p08-03/r05-reader-checkpoint-provenance.json": "daf034375facf36e9cc8da4ec0001d7c7b017c315a9155680b4b490e582ec5b9"
},
"executed_source_manifest": {
"path": "local-source-manifest.json",
"sha256": "533748d30a8fb7b7e78930cf2c08139e980f75341ba772f062780d2056ec2900",
"source_file_count": 1326,
"sha256": "f897d2713f64e1b3338e3e24a9e61859db190643a6eadbd202dde91c5bb0df04",
"source_file_count": 1328,
"contains": "Complete final local execution source and immutable/fixture/evidence input map; no material-size omission"
},
"final_input_sha256": {
@@ -55,32 +57,32 @@
"docs/plans/original-completion-2026-10-02/execution/p08-03/passive_os_placement_recorder.gd.uid": "d7f97560c8bbdfdaed173b2b48261e65b92847bd0493dd1cc2ebb309d0622314",
"docs/spec/acceptance/P08-03.json": "37a6a581b5a9bbe03c07a3a266b03df1f740ff488da33ecd9bd60f5b32f1efe1",
"docs/traceability/original/BASELINE.txt": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a",
"tests/fixtures/p08-03/checker_fixture.py": "062333148bfb570f2191317f1634e5dd1495cf3602221fc9a054dd9243597669",
"tests/fixtures/p08-03/passive_placement.gd": "e55ce365aec82f763860564d5065e8a4d3f36b717c92e28fc48ac60657366992",
"tests/fixtures/p08-03/checker_fixture.py": "508e8bc0f9ff3dc578a3b34fdfb3354fe31e5e604e2d7731cd25511c4261e93a",
"tests/fixtures/p08-03/passive_placement.gd": "ca2a8b83d6657a858823645ad8d29aed100637e6a620e9d1c451780118409e81",
"tests/fixtures/p08-03/passive_placement.gd.uid": "f75e3f2d9555c30cee3a1de882f32225fc624565a78a7ef3f5c604325c578ce3",
"tests/fixtures/p08-03/placement.gd": "299016b07b5e4eab0c269a2efde45908b7ca38bf1259abae3272453f3b7304eb",
"tests/fixtures/p08-03/placement.gd": "1ebaaa80784905d661954e255bfb8a96a3a963a57b9a38b19e7f91b90fb628b3",
"tests/fixtures/p08-03/placement.gd.uid": "5caca08c1e627e0ca07e2ab7b13bd82b24a22f77513fe87e30b79023568e1987",
"docs/plans/original-completion-2026-10-02/execution/p08-03/NATIVE_R02_READER_OPERATION_DELTA.json": "60463e735d4f473bdad7b0925c37b9ca71ee34d6f0eb74ea6c07b508b5153e41",
"docs/plans/original-completion-2026-10-02/execution/p08-03/native-r02-reader-stderr.log": "8079b3dc2ba7b9a9c37fcd9a5a8df0971354027c60def4b95fb15c7310832040",
"docs/plans/original-completion-2026-10-02/execution/p08-03/NATIVE_R01_FAILURE_AND_SCOPE.json": "afc8dada6451e7e61d6d57abb0d7d040f5abcdb93432c8431c1c920dc4984515",
"docs/plans/original-completion-2026-10-02/execution/p08-03/native-r01-writer-stderr.log": "07fe6cccad7305b2ec88cb91fa79fa22ec9269d7c99d62a1f69971f7c5d22686",
"docs/plans/original-completion-2026-10-02/execution/p08-03/OS_R04_INITIAL_LOAD_ORACLE_FINDING.json": "6a796bd63f5a16bd0bf0fcf07cec3f4414a5e6704409a79522a2677eae53b417",
"docs/plans/original-completion-2026-10-02/execution/p08-03/os-r04-writer-engine.log": "f78c28c53460b767e924867f5158787c8497973e6f1c10353cb0f2cb2cbc3a3d",
"docs/plans/original-completion-2026-10-02/execution/p08-03/registered-r04-evidence-manifest.json": "6189fb2fe983d11faf96f99d6e21eba550be8e89c083c1277ac2ada9fa50cafa"
"tests/fixtures/p08-03/r05-reader-checkpoint-provenance.json": "daf034375facf36e9cc8da4ec0001d7c7b017c315a9155680b4b490e582ec5b9",
"tests/fixtures/p08-03/r05-reader-checkpoint.json.gz": "27fd3b41834106ccd6a0980dfa2bc91cc19806dd3f552ba04246efb400763233",
"docs/plans/original-completion-2026-10-02/execution/p08-03/ROOT_CHECKER_R05_INFRASTRUCTURE_ORACLE.json": "9fd11c89e53d4fa569f809c06be1d0592741c58691fae3e515cd1c12da86758c",
"docs/plans/original-completion-2026-10-02/execution/p08-03/ROOT_OS_R05_GUIDE_INTERCEPTION.json": "b8a9041b59b87c7b01ebbf36f320a5227734034c6b2d45d26fd22ce654d2c612",
"docs/plans/original-completion-2026-10-02/execution/p08-03/ROOT_R05_READER_CHECKPOINT.json.gz": "27fd3b41834106ccd6a0980dfa2bc91cc19806dd3f552ba04246efb400763233",
"docs/plans/original-completion-2026-10-02/execution/p08-03/ROOT_R05_READER_CHECKPOINT_PROVENANCE.json": "daf034375facf36e9cc8da4ec0001d7c7b017c315a9155680b4b490e582ec5b9"
},
"actual_local_validation": {
"path": "local-validation.json",
"sha256": "0b64ffbdab1562797bfbec4956a91aae27e61f5fbb576fb3997a13e6296c584f",
"python_syntax": "pass: four final Python sources compiled in memory",
"checker_mock_tests": 56,
"checker_mock_exit_code": 0,
"log_sha256": "e54ecf761ca49aebe01fc1a13367ba01aa0f437ba649b781b1c8feb3a6f8bbc6",
"sha256": "0b4bda3555f9dcf2ba1e79df532d1a55543b73e2a38002238e49a0850fe67d0a",
"python_syntax": "pass: four final Python sources parsed in memory",
"checker_control_tests": 75,
"checker_exit_code": 0,
"log_sha256": "84c71a911af1ea79ad6cb005513ce2d3b245a1cc3577baa014817714dc08d413",
"native_OS_full_regression": "not executed",
"git_diff_check": "pass"
},
"conditions": {
"support_connection": {
"implementation": "prepared",
"local_checker_controls": "passed on recorded final Python sources with synthetic specimens",
"local_checker_controls": "Python synthetic whole-checker controls and SHA-verified actual R05 checkpoint controls; no gameplay acceptance",
"actual_Godot_handler": "pending",
"actual_native_OS": "pending",
"independent_review": "pending",
@@ -88,7 +90,7 @@
},
"invalid_position_reason": {
"implementation": "prepared",
"local_checker_controls": "passed on recorded final Python sources with synthetic specimens",
"local_checker_controls": "Python synthetic whole-checker controls and SHA-verified actual R05 checkpoint controls; no gameplay acceptance",
"actual_Godot_handler": "pending",
"actual_native_OS": "pending",
"independent_review": "pending",
@@ -96,7 +98,7 @@
},
"demolish_rebuild": {
"implementation": "prepared",
"local_checker_controls": "passed on recorded final Python sources with synthetic specimens",
"local_checker_controls": "Python synthetic whole-checker controls and SHA-verified actual R05 checkpoint controls; no gameplay acceptance",
"actual_Godot_handler": "pending",
"actual_native_OS": "pending",
"independent_review": "pending",
@@ -104,7 +106,7 @@
},
"pan_zoom_world_identity": {
"implementation": "prepared",
"local_checker_controls": "passed on recorded final Python sources with synthetic specimens",
"local_checker_controls": "Python synthetic whole-checker controls and SHA-verified actual R05 checkpoint controls; no gameplay acceptance",
"actual_Godot_handler": "pending",
"actual_native_OS": "pending",
"independent_review": "pending",
@@ -112,7 +114,7 @@
},
"separate_pid_resume": {
"implementation": "prepared",
"local_checker_controls": "passed on recorded final Python sources with synthetic specimens",
"local_checker_controls": "Python synthetic whole-checker controls and SHA-verified actual R05 checkpoint controls; no gameplay acceptance",
"actual_Godot_handler": "pending",
"actual_native_OS": "pending",
"independent_review": "pending",
@@ -191,6 +193,25 @@
],
"context_gaps": [],
"worker_timeout_seconds": 900
},
"r05": {
"authorities": [
"ROOT_CHECKER_R05_INFRASTRUCTURE_ORACLE.json",
"ROOT_OS_R05_GUIDE_INTERCEPTION.json",
"ROOT_R05_READER_CHECKPOINT_PROVENANCE.json"
],
"actual_snapshot_raw_sha256": "304d97de8051d5e74c6e32c4482a3cb183b0172d7671088fdc40469cc3448c0d",
"fixture_source": "complete supplied gzipped checkpoint copied byte-for-byte; native historical input, not current acceptance",
"changes": [
"ordinary/proxy membership split with exact live topology",
"visible unsupported target outside guide",
"derived viewport-to-screen mapping"
],
"context_gaps": [],
"production_changes": false,
"collector_changes": false,
"native_OS_full_regression_review_integration": "pending",
"local_test_repair": "First final run rejected both corrupt reader checkpoints through earlier strict resume oracle; controls retargeted to construction-completed snapshots to exercise topology gate directly. Failure log retained."
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,14 +1,14 @@
{
"task_id": "P08-03",
"started_at": "2026-10-13T19:51:22.470024+00:00",
"ended_at": "2026-10-13T19:52:12.939899+00:00",
"started_at": "2026-10-13T20:49:58.133267+00:00",
"ended_at": "2026-10-13T20:51:06.466499+00:00",
"syntax": {
"method": "compile in memory; no pyc",
"method": "ast.parse in memory; no pyc",
"files": {
"tools/run_p08_normal_placement.py": "191831b4f684bdd7e99b3be6038c15a6830f544d17c941869b1c2a8fbe4a2aa3",
"tools/check_p08_normal_placement_evidence.py": "7fbc115599782b2b7e98f9df855e72b076580b74f6a17aa255d16f2566fe6285",
"tools/test_p08_normal_placement_evidence.py": "3a5fb02b944a9eff808458df897574232f9e5609d828031562e93d9920b9cfbb",
"tests/fixtures/p08-03/checker_fixture.py": "062333148bfb570f2191317f1634e5dd1495cf3602221fc9a054dd9243597669"
"tools/check_p08_normal_placement_evidence.py": "dfa37ed586240972e57cbb6a962beb856ba289abd58dbfaf83706d3a227a0116",
"tools/test_p08_normal_placement_evidence.py": "d40edc5518e8bfcb59a1da3f55305955581209cfd24a0223c764d6e39c4c361e",
"tests/fixtures/p08-03/checker_fixture.py": "508e8bc0f9ff3dc578a3b34fdfb3354fe31e5e604e2d7731cd25511c4261e93a"
},
"passed": true
},
@@ -20,12 +20,12 @@
],
"timeout_seconds": 900,
"exit_code": 0,
"log": "repair-r04-local-checker-tests.log",
"log_sha256": "e54ecf761ca49aebe01fc1a13367ba01aa0f437ba649b781b1c8feb3a6f8bbc6",
"synthetic_only": true,
"test_count": 56,
"retained_previous_tests": 49,
"new_semantic_tests": 7
"log": "repair-r05-local-checker-tests.log",
"log_sha256": "84c71a911af1ea79ad6cb005513ce2d3b245a1cc3577baa014817714dc08d413",
"test_count": 75,
"retained_previous_tests": 56,
"new_tests": 19,
"synthetic_and_actual_snapshot_controls_only": true
},
"source_and_inputs_unchanged_during_tests": true,
"native_engines_started": 0,
@@ -33,6 +33,6 @@
"full_regression_executed": false,
"acceptance": "pending",
"local_source_manifest": "local-source-manifest.json",
"local_source_manifest_sha256": "533748d30a8fb7b7e78930cf2c08139e980f75341ba772f062780d2056ec2900",
"local_source_manifest_sha256": "f897d2713f64e1b3338e3e24a9e61859db190643a6eadbd202dde91c5bb0df04",
"git_diff_check": "pass"
}
@@ -0,0 +1,5 @@
...........................................................................
----------------------------------------------------------------------
Ran 75 tests in 66.488s
OK
+34 -2
View File
@@ -134,6 +134,36 @@ def make(base, source, checker):
rooms = 0
def snap(name):
# Synthetic controls follow the same split as Runtime: stairs are
# construction instances with infrastructure, never operational rooms.
projections = []
entities = []; connectors = []
for f in runtime['construction']['facilities']:
if f['definition_id'] != 'guest_stairs': continue
f.update(rotation=0, layer=0, completed_at=360)
fid = f['instance_id']; origin = f['origin']
p = {k:copy.deepcopy(f[k]) for k in ('instance_id','definition_id','origin','source_job_id','rotation','layer','completed_at')}
p.update(kind='guest_stairs', route_entity_id='infra.route:'+fid,
connector_id='infra.connector:'+fid, cells=f['occupied_cells'], staff_only=False,
pass_through=True, footprint=[1,1], definition_tags=['guest_access','movement','route_subslot','schema_facility_proxy','stairs','vertical_connector'])
canonical = 'projection|'+''.join('%d:%s|' % (len(p[k]),p[k]) for k in ('instance_id','definition_id','kind','route_entity_id','connector_id','source_job_id'))
canonical += 'layer=0|staff=0|pass=1|footprint=1,1|rotation=0|completed=360|'
canonical += 'origin=%d,%d,%d|tags=' % tuple(origin)
canonical += ''.join('%d:%s;' % (len(t),t) for t in p['definition_tags'])+'|cells='
canonical += ''.join('%d,%d,%d;' % tuple(c) for c in p['cells'])
p['record_fingerprint'] = hashlib.sha256(canonical.encode()).hexdigest()
projections.append(p)
entities.append({'entity_id':p['route_entity_id'],'category':'ROUTE','cells':p['cells']})
connectors.append({'id':p['connector_id'],'from':origin,'to':[origin[0],origin[1]-1,origin[2]],
'cost':150,'bidirectional':True,'access_id':'','enabled':True,'movement_type':'CONNECTOR',
'dynamic_cost':0,'operational_state':'OPERATIONAL','cabin_capacity':8,'queue_capacity':256,
'cabin_state':'IDLE','current_floor':origin[1],'travel_minutes_per_floor':1,'request_queue':[]})
runtime['facility_infrastructure'] = {'projections':projections}
runtime['spatial_subslots'] = {'entities':entities}
route_cells = [c for p in projections for c in p['cells']]
walkable = [[4,0,0]]+route_cells
runtime['route_projection'] = {'base_walkable_cells':[[4,0,0]],'projected_route_cells':route_cells,'projected_walkable_cells':walkable}
runtime['path'] = {'connectors':connectors,'vertical_walk_blockers':[], 'cell_traffic':[{'cell':c} for c in walkable]}
put(folder/(name+'.json'), typed(model))
(folder/(name+'.var')).write_bytes(json.dumps(model, sort_keys=True).encode())
return name
@@ -157,7 +187,8 @@ def make(base, source, checker):
row['input_method'] = method
if method != 'native_os': return
requests = [{'action':'cell', 'world_cell':row['position']['world_cell'],
'viewport':row['position']['viewport'], 'screen':row['position']['screen']}]
'viewport':row['position']['viewport'], 'screen':row['position']['screen'],
'viewport_to_screen':[1,0,0,1,0,0], 'guide_visible':False, 'guide_rect':[0,0,0,0]}]
if row['id'] in ('unsupported','resume_overlap'):
requests.append({'action':'load_menu'})
if row['id'] == 'pan_zoom':
@@ -235,7 +266,8 @@ def make(base, source, checker):
job.update(state='COMPLETED', facility_instance_id=fid)
facility = {'instance_id': fid, 'definition_id': definition, 'occupied_cells': cells, 'origin': cell[:], 'source_job_id': jid}
runtime['construction']['facilities'].append(facility)
runtime['facilities']['instances'].append(copy.deepcopy(facility))
if definition != 'guest_stairs':
runtime['facilities']['instances'].append(copy.deepcopy(facility))
runtime['world']['occupancies'][-1]['entity_id'] = fid
row['completed'] = snap('writer-'+label+'-completed')
if 'after' not in row: row['after'] = snap('writer-'+label+'-after')
+26 -2
View File
@@ -58,7 +58,26 @@ func annotate(row: Dictionary) -> void:
func point(node: Control) -> Dictionary:
var viewport: Vector2 = node.get_global_transform_with_canvas() * (node.size * 0.5)
var screen: Vector2 = node.get_screen_transform() * (node.size * 0.5)
return {"node": String(node.get_path()), "viewport": [viewport.x, viewport.y], "screen": [screen.x, screen.y], "window_id": node.get_window().get_window_id()}
return {"node": String(node.get_path()), "viewport": [viewport.x, viewport.y], "screen": [screen.x, screen.y], "window_id": node.get_window().get_window_id(),
"viewport_to_screen": affine(node.get_screen_transform() * node.get_global_transform_with_canvas().affine_inverse())}
func unsupported_cell() -> Vector3i:
# Read-only selection: retain the production predicate and avoid the guide.
var view: WorldPreview = main.world_preview
var bounds: Dictionary = runtime.world_service.get_bounds()
for y: int in range(4, int(bounds[&"max_y"]) + 1):
for x: int in range(int(bounds[&"max_x"]) - 1, int(bounds[&"min_x"]) - 1, -1):
var cell := Vector3i(x, y, 0)
var local := view.cell_to_canvas(cell)
var viewport := view.get_global_transform_with_canvas() * local
if not Rect2(Vector2.ZERO, view.size).has_point(local):
continue
if main.opening_guide.visible and main.opening_guide.get_global_rect().has_point(viewport):
continue
if "UNSUPPORTED" in view.get_build_preview_report(cell).get("error_codes", []):
return cell
expect(false, "visible unsupported target outside opening guide")
return Vector3i(4, 4, 0)
func setup() -> void:
input_method = "native_os"
@@ -125,9 +144,14 @@ func click(cell: Vector3i) -> Dictionary:
var local := view.cell_to_canvas(cell)
var viewport := view.get_global_transform_with_canvas() * local
var screen := view.get_screen_transform() * local
var mapping := affine(view.get_screen_transform() * view.get_global_transform_with_canvas().affine_inverse())
var guide_rect: Rect2 = main.opening_guide.get_global_rect()
observed_cell = null
await request({"action": "cell", "world_cell": vector(cell), "viewport": [viewport.x, viewport.y],
"screen": [screen.x, screen.y], "instructions": "Click this transformed world-cell center. If clipped, use normal zoom/pan first and request a new collection; never substitute fixed pixels."})
"screen": [screen.x, screen.y], "viewport_to_screen": mapping,
"guide_rect": [guide_rect.position.x, guide_rect.position.y, guide_rect.size.x, guide_rect.size.y],
"guide_visible": main.opening_guide.visible,
"instructions": "Click screen coordinates derived from viewport_to_screen (includes canvas stretch and window translation). Retain actual CUA coordinates and screenshots. If clipped or intercepted, recollect; never substitute fixed pixels."})
var selected: Variant = observed_cell
if not selected is Vector3i:
# With no active build tool, the normal preview selects a facility.
+6 -1
View File
@@ -111,6 +111,8 @@ func click(cell: Vector3i) -> Dictionary:
func build(id: StringName, cell: Vector3i, label: String, expected: String = "") -> void:
await choose(id)
if label == "unsupported":
cell = unsupported_cell()
var report: Dictionary = main.world_preview.get_build_preview_report(cell)
var before := capture(label + "-before")
results.clear()
@@ -132,6 +134,9 @@ func build(id: StringName, cell: Vector3i, label: String, expected: String = "")
await complete_build(id)
row["completed"] = capture(label + "-completed")
func unsupported_cell() -> Vector3i:
return Vector3i(4, 4, 0)
func demolish(cell: Vector3i, label: String, cancel := false, expected := "") -> void:
if not main.palette_scroll.visible:
await button(main.palette_toggle_button)
@@ -216,7 +221,7 @@ func diagnostic_budget() -> void:
func writer() -> void:
diagnostic_budget()
await save_initial_fixture()
await build(&"standard_room", Vector3i(-8, 4, 0), "unsupported", "UNSUPPORTED")
await build(&"standard_room", Vector3i(4, 4, 0), "unsupported", "UNSUPPORTED")
await build(&"reception", Vector3i(runtime.world_service.get_bounds()[&"max_x"], 0, 0), "out_of_bounds", "OUT_OF_BOUNDS")
await build(&"reception", target, "supported_connected")
await build(&"reception", target, "overlap", "OVERLAP")
@@ -0,0 +1,9 @@
{
"raw_path": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p08-03-native-handler-r05/pair/reader-checkpoint.json",
"raw_sha256": "304d97de8051d5e74c6e32c4482a3cb183b0172d7671088fdc40469cc3448c0d",
"raw_bytes": 2120352,
"compressed_path": "ROOT_R05_READER_CHECKPOINT.json.gz",
"candidate": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab",
"complete_raw_preserved": true,
"scope": "actual native reader snapshot, not synthetic acceptance proof"
}
Binary file not shown.
+89 -8
View File
@@ -149,7 +149,80 @@ def keyed(rows, key):
require(len(result) == len(rows), 'duplicate '+key)
return result
def state(node):
def infrastructure(r, facilities, root):
"""Runtime separates schema proxies from FacilityService; audit live topology.
FacilityInfrastructureProjector._projection_from_project_input,
_projection_live_matches and _expected_stair_connector are the authority.
"""
kinds = {'guest_corridor', 'service_corridor', 'staff_door', 'guest_elevator',
'service_elevator', 'guest_stairs', 'service_stairs'}
proxies = {k:v for k,v in facilities.items() if v['definition_id'] in kinds}
projections = keyed(r['facility_infrastructure'].get('projections', []), 'instance_id')
require(set(projections) == set(proxies), 'missing/extra infrastructure projection')
entities = keyed(r['spatial_subslots'].get('entities', []), 'entity_id')
connectors = keyed(r['path'].get('connectors', []), 'id')
routes, links, shafts = set(), set(), set()
for fid, f in proxies.items():
p = projections[fid]; kind = f['definition_id']
for field in ('definition_id', 'origin', 'rotation', 'layer', 'source_job_id', 'completed_at'):
require(p[field] == f[field], 'infrastructure construction drift '+field)
route = 'infra.route:'+fid
link = 'infra.connector:'+fid if kind in {'staff_door','guest_stairs','service_stairs'} else ''
require(p['kind'] == kind and p['cells'] == f['occupied_cells'] and
p['route_entity_id'] == route and p['connector_id'] == link,
'wrong infrastructure projection')
# Definition inputs are independently read from the unchanged registry resources.
definition = (root/'data/facilities/infrastructure'/(kind+'.tres')).read_text()
tags = re.findall(r'&"([^"]+)"', re.search(r'^tags = (.+)$', definition, re.M)[1])
footprint = [int(v) for v in re.search(r'footprint = Vector2i\((\d+), (\d+)\)', definition).groups()]
require(p['definition_tags'] == sorted(tags) and p['footprint'] == footprint and
p['pass_through'] == ('pass_through = true' in definition) and
p['staff_only'] == (kind in {'service_corridor','staff_door','service_elevator','service_stairs'}),
'infrastructure definition drift')
canonical = 'projection|'
for field in ('instance_id','definition_id','kind','route_entity_id','connector_id','source_job_id'):
text = p[field]; canonical += '%d:%s|' % (len(text),text)
canonical += 'layer=%d|staff=%d|pass=%d|footprint=%d,%d|rotation=%d|completed=%d|' % (
p['layer'],p['staff_only'],p['pass_through'],*p['footprint'],p['rotation'],p['completed_at'])
canonical += 'origin=%d,%d,%d|tags=' % tuple(p['origin'])
canonical += ''.join('%d:%s;' % (len(t),t) for t in p['definition_tags'])+'|cells='
canonical += ''.join('%d,%d,%d;' % tuple(c) for c in p['cells'])
require(p['record_fingerprint'] == hashlib.sha256(canonical.encode()).hexdigest(), 'infrastructure fingerprint drift')
require(entities.get(route) == {'entity_id':route,'category':'ROUTE','cells':p['cells']}, 'wrong infrastructure ROUTE topology')
routes.add(route)
if link:
upper = p['origin']; lower = [upper[0],upper[1]-1,upper[2]]
stair = kind.endswith('stairs')
expected = {'id':link,'from':upper if stair else [upper[0],upper[1],0],
'to':lower if stair else upper,'cost':150 if stair else 120,
'bidirectional':True,'access_id':'staff' if p['staff_only'] else '',
'enabled':True,'movement_type':'CONNECTOR','dynamic_cost':0,
'operational_state':'OPERATIONAL','cabin_capacity':8,'queue_capacity':256,
'cabin_state':'IDLE','current_floor':upper[1],'travel_minutes_per_floor':1,'request_queue':[]}
require(connectors.get(link) == expected, 'wrong infrastructure connector topology')
if stair:
require(lower in r['route_projection']['projected_walkable_cells'], 'missing stair landing')
links.add(link)
if kind.endswith('elevator'):
shafts.add('infra.shaft:'+fid)
require({k for k in entities if k.startswith('infra.route:')} == routes, 'extra infrastructure ROUTE topology')
require({k for k in connectors if k.startswith('infra.connector:')} == links, 'extra infrastructure connector topology')
blockers = keyed(r['path'].get('vertical_walk_blockers', []), 'owner_id')
require({k for k in blockers if k.startswith('infra.shaft:')} == shafts, 'wrong infrastructure shaft topology')
for fid, p in projections.items():
if 'infra.shaft:'+fid in shafts:
require(blockers['infra.shaft:'+fid]['cells'] == p['cells'], 'wrong infrastructure shaft cells')
if entities or proxies:
route_cells = {tuple(c) for e in entities.values() if e['category'] == 'ROUTE' for c in e['cells']}
projection = r['route_projection']
require(route_cells == {tuple(c) for c in projection['projected_route_cells']}, 'wrong projected ROUTE cells')
walkable = route_cells | {tuple(c) for c in projection['base_walkable_cells']}
require(walkable == {tuple(c) for c in projection['projected_walkable_cells']} ==
{tuple(c['cell']) for c in r['path']['cell_traffic']}, 'wrong projected walkable topology')
return proxies
def state(node, root=HERE.parent):
snap = decode(node)
require(set(snap) == {'schema_version', 'clock', 'game_state', 'systems'}, 'missing whole snapshot envelope')
r = snap['systems']['runtime']
@@ -170,7 +243,8 @@ def state(node):
require(not seen.intersection(actual), 'overlapping occupancy')
seen.update(actual)
operational = keyed(r['facilities']['instances'], 'instance_id')
require(set(operational) == set(facilities), 'partial demolition/completion')
proxies = infrastructure(r, facilities, root)
require(set(operational) == set(facilities)-set(proxies), 'partial demolition/completion')
for key, row in operational.items():
require(row['occupied_cells'] == facilities[key]['occupied_cells'], 'operational cells drift')
return snap
@@ -209,10 +283,10 @@ def preserve(a, b, results):
for key in ('pending', 'in_flight'):
require(nq[key] == oq[key], 'refusal queue loss')
def action_gate(row, typed):
def action_gate(row, typed, root=HERE.parent):
coordinates(row['position'])
before, after = typed(row['before']), typed(row['after'])
a, b = state(before), state(after)
a, b = state(before, root), state(after, root)
require(row['position']['bounds'] == a['systems']['runtime']['world']['bounds'], 'invented world bounds')
kind, label = row['kind'], row['id']
expected_kind = 'camera' if label == 'pan_zoom' else 'cancel' if label == 'cancel_demolition' else 'demolish' if label in ('demolition','refused_demolition') else 'build'
@@ -256,7 +330,7 @@ def action_gate(row, typed):
resources_a, resources_b = a['game_state']['resources'], b['game_state']['resources']
require(set(resources_a) == set(resources_b) and all(resources_b[k] == v + refund.get(k, 0) for k, v in resources_a.items()), 'demolition refund mismatch')
if kind == 'build' and not row['expected']:
completed = state(typed(row['completed']))
completed = state(typed(row['completed']), root)
facilities = completed['systems']['runtime']['construction']['facilities']
require(any(f['definition_id'] == row['definition'] and f['origin'] == row['position']['world_cell'] for f in facilities), 'construction completion missing')
require(row['report']['can_build'], 'positive support invalid')
@@ -426,7 +500,7 @@ def check(project_root, evidence_dir):
require(total == budget['needed'] and delta == budget['deltas'], 'diagnostic budget mismatch')
for row in doc['actions']:
require(row['input_method'] == ('native_os' if native_os else 'handler'), 'fake OS provenance')
action_gate(row, typed)
action_gate(row, typed, root)
if row['kind'] == 'build':
wanted_definition = 'standard_room' if row['id'] == 'unsupported' else 'guest_stairs' if row['id'] in ('missing_connection','lower_stair','upper_stair') else 'reception'
require(row['definition'] == wanted_definition, 'diagnostic definition substituted')
@@ -439,12 +513,12 @@ def check(project_root, evidence_dir):
width,height = map(int,re.search(r'^footprint = Vector2i\((\d+), (\d+)\)$',text,re.M).groups())
x,y,z = row['position']['world_cell']
cells = {(x+dx,y+dy,z) for dx in range(width) for dy in range(height)}
completed = state(typed(row['completed']))['systems']['runtime']['construction']['facilities']
completed = state(typed(row['completed']), root)['systems']['runtime']['construction']['facilities']
matches = [f for f in completed if f['origin'] == [x,y,z] and f['definition_id'] == wanted_definition]
require(len(matches) == 1 and {tuple(c) for c in matches[0]['occupied_cells']} == cells, 'production footprint mismatch')
rows += doc['actions']
checkpoint = typed('writer-checkpoint')
state(checkpoint)
state(checkpoint, root)
formal = typed('writer-formal-model')
require(not typed_differences(typed('writer-presave'),formal), 'wrong presave formal model')
require(sha(artifact(directory+'/writer-presave.var')) == sha(artifact(directory+'/writer-formal-model.var')), 'wrong raw presave formal model')
@@ -573,6 +647,13 @@ def check(project_root, evidence_dir):
require(request['world_cell'] == row['position']['world_cell']
and request['viewport'] == row['position']['viewport']
and request['screen'] == row['position']['screen'], 'OS transformed cell drift')
matrix = request['viewport_to_screen']; x,y = request['viewport']
require(len(matrix) == 6 and all(math.isfinite(v) for v in matrix), 'invalid OS canvas mapping')
require(all(abs(a-b) < 0.001 for a,b in zip(request['screen'],
[matrix[0]*x+matrix[2]*y+matrix[4],matrix[1]*x+matrix[3]*y+matrix[5]])), 'OS canvas mapping drift')
if row['id'] == 'unsupported' and request['guide_visible']:
gx,gy,gw,gh = request['guide_rect']
require(not (gx <= x < gx+gw and gy <= y < gy+gh), 'OS guide interception')
if request['action'] == 'wheel':
wheel_requests.append(request)
if row['id'] == 'pan_zoom':
@@ -13,6 +13,8 @@ import shutil
import contextlib
import io
import os
import gzip
import hashlib
sys.dont_write_bytecode = True
ROOT = Path(__file__).resolve().parents[1]
@@ -331,6 +333,25 @@ class EvidenceTests(unittest.TestCase):
self.edit('os-pair/unsupported-1/ack.json', lambda d: d.update(request_sha256='0'*64))
self.reject('OS ack request mismatch')
def test_os_canvas_mapping_drift(self):
self.edit('os-pair/unsupported-1/request.json', lambda d: d.update(viewport_to_screen=[1,0,0,1,32,0]))
# Repin acknowledgement too: test semantics, rather than checksum rejection.
self.edit('os-pair/unsupported-1/ack.json', lambda d: d.update(request_sha256=C.sha(self.out/'os-pair/unsupported-1/request.json')))
self.reject('OS canvas mapping drift')
def test_os_guide_interception(self):
self.edit('os-pair/unsupported-1/request.json', lambda d: d.update(guide_visible=True,guide_rect=[0,0,10000,10000]))
self.edit('os-pair/unsupported-1/ack.json', lambda d: d.update(request_sha256=C.sha(self.out/'os-pair/unsupported-1/request.json')))
self.reject('OS guide interception')
def test_whole_checker_missing_stair_projection(self):
self.edit('pair/writer-lower_stair-completed.json', lambda d: C.typed_member(d,'systems','runtime','facility_infrastructure','projections')['items'].pop())
self.reject('missing/extra infrastructure projection')
def test_whole_checker_wrong_stair_connector(self):
self.edit('pair/writer-lower_stair-completed.json', lambda d: C.typed_member(C.typed_member(d,'systems','runtime','path','connectors')['items'][0],'cost').update(text='999'))
self.reject('wrong infrastructure connector topology')
def test_refusal_cannot_be_relabelled(self):
self.edit('pair/writer-actions.json', lambda d: d['actions'][4].update(expected='OTHER_REASON'))
self.reject('required refusal reason changed')
@@ -411,5 +432,70 @@ class EvidenceTests(unittest.TestCase):
def test_mock_native_timeout_restores_project_and_cleans_owned_child(self):
self.collector_mock(fail_wait=True)
class RealR05InfrastructureTests(unittest.TestCase):
"""Actual native snapshot, never a fabricated acceptance specimen."""
def setUp(self):
folder = ROOT/'tests/fixtures/p08-03'
provenance = json.loads((folder/'r05-reader-checkpoint-provenance.json').read_bytes())
raw = gzip.decompress((folder/'r05-reader-checkpoint.json.gz').read_bytes())
self.assertEqual(provenance['raw_sha256'],hashlib.sha256(raw).hexdigest())
self.assertEqual(provenance['raw_bytes'],len(raw))
self.node = json.loads(raw)
self.model = C.decode(self.node)
def test_real_reader_checkpoint(self):
self.assertEqual(self.model,C.state(self.node))
def reject(self, mutate, message):
runtime = self.model['systems']['runtime']; mutate(runtime)
with self.assertRaisesRegex(ValueError,message): C.state(F.typed(self.model))
def test_missing_projection(self):
self.reject(lambda r:r['facility_infrastructure']['projections'].pop(),'missing/extra infrastructure projection')
def test_extra_projection(self):
def mutate(r):
p=copy.deepcopy(r['facility_infrastructure']['projections'][0]); p['instance_id']='ghost'
r['facility_infrastructure']['projections'].append(p)
self.reject(mutate,'missing/extra infrastructure projection')
def test_wrong_projected_cells(self):
self.reject(lambda r:r['facility_infrastructure']['projections'][0].update(cells=[[9,9,0]]),'wrong infrastructure projection')
def test_missing_route(self):
self.reject(lambda r:r['spatial_subslots']['entities'].pop(),'wrong infrastructure ROUTE topology')
def test_extra_route(self):
self.reject(lambda r:r['spatial_subslots']['entities'].append({'entity_id':'infra.route:ghost','category':'ROUTE','cells':[[8,4,0]]}),'extra infrastructure ROUTE topology')
def test_wrong_route(self):
self.reject(lambda r:r['spatial_subslots']['entities'][0].update(category='UTILITY'),'wrong infrastructure ROUTE topology')
def test_missing_connector(self):
self.reject(lambda r:r['path']['connectors'].pop(0),'wrong infrastructure connector topology')
def test_extra_connector(self):
def mutate(r):
c=copy.deepcopy(r['path']['connectors'][0]); c['id']='infra.connector:ghost'; r['path']['connectors'].append(c)
self.reject(mutate,'extra infrastructure connector topology')
def test_wrong_connector(self):
self.reject(lambda r:r['path']['connectors'][0].update(to=[8,0,0]),'wrong infrastructure connector topology')
def test_wrong_projected_walkable(self):
self.reject(lambda r:r['route_projection']['projected_walkable_cells'].pop(),'wrong projected walkable topology')
def test_wrong_path_cells(self):
self.reject(lambda r:r['path']['cell_traffic'].pop(),'wrong projected walkable topology')
def test_ordinary_facility_loss(self):
self.reject(lambda r:r['facilities']['instances'].clear(),'partial demolition/completion')
def test_proxy_occupancy_loss(self):
self.reject(lambda r:r['world']['occupancies'].pop(),'orphan/lost occupancy')
def test_proxy_operational_duplication(self):
self.reject(lambda r:r['facilities']['instances'].append(copy.deepcopy(r['construction']['facilities'][0])),'partial demolition/completion')
if __name__ == '__main__':
unittest.main()