P08-03: 配置の通常操作受入
This commit is contained in:
@@ -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.
|
||||
|
||||
+23
@@ -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.
|
||||
|
||||
+38
@@ -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": []
|
||||
}
|
||||
BIN
Binary file not shown.
+9
@@ -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"
|
||||
}
|
||||
+5330
File diff suppressed because it is too large
Load Diff
+38
@@ -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"
|
||||
}
|
||||
+37
@@ -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"
|
||||
}
|
||||
+25
@@ -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."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1356
-21
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"
|
||||
}
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
...........................................................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 75 tests in 66.488s
|
||||
|
||||
OK
|
||||
+34
-2
@@ -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
@@ -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.
|
||||
|
||||
Vendored
+6
-1
@@ -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.
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user