Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1875b032b7 | ||
|
|
6e17cae5c9 | ||
|
|
b81f9f2860 | ||
|
|
806de25068 | ||
|
|
c5e2087dde | ||
|
|
e0420d57a3 | ||
|
|
8ca9263fee | ||
|
|
1b07b87d37 | ||
|
|
65f07bf5ea | ||
|
|
191ea3b4d1 | ||
|
|
d60f1c6d04 | ||
|
|
ef96967d8a | ||
|
|
a7e3069b16 | ||
|
|
27fc5f0544 | ||
|
|
f7ef53ac48 | ||
|
|
e930a1dedf | ||
|
|
1e8d4ea888 | ||
|
|
2f3884be11 |
@@ -20,6 +20,7 @@ const OPERATING_EXPENSE_ACCOUNT := &"OPERATING_EXPENSE"
|
||||
const AUTHORITY_FINE_ACCOUNT := &"AUTHORITY_FINE_EXPENSE"
|
||||
const WAGE_EXPENSE_ACCOUNT := &"WAGE_EXPENSE"
|
||||
const RUNTIME_SNAPSHOT_VERSION := 14
|
||||
const PeepingRooms := preload("res://scripts/special/peeping_room_service.gd")
|
||||
const AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION := 14
|
||||
const EVENT_THREAT_RUNTIME_SNAPSHOT_VERSION := 13
|
||||
const MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION := 15
|
||||
@@ -97,6 +98,7 @@ const DEFENSE_COMMAND_TYPES: Array[StringName] = [
|
||||
var definition_registry := DefinitionRegistry.new()
|
||||
var command_queue := CommandQueue.new()
|
||||
var id_generator := StableIdGenerator.new()
|
||||
var peeping_room_service := PeepingRooms.new()
|
||||
var domain_events := DomainEventStream.new()
|
||||
var world_service := WorldService.new()
|
||||
var path_service := PathService.new()
|
||||
@@ -233,6 +235,7 @@ func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_S
|
||||
_hired_staff_candidate_ids.clear()
|
||||
command_queue = CommandQueue.new()
|
||||
id_generator = StableIdGenerator.new()
|
||||
peeping_room_service = PeepingRooms.new()
|
||||
domain_events = DomainEventStream.new()
|
||||
world_service = WorldService.new()
|
||||
path_service = PathService.new()
|
||||
@@ -253,6 +256,7 @@ func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_S
|
||||
_initialize_s5_defense()
|
||||
construction_service = ConstructionService.new(world_service, construction_resource_state)
|
||||
construction_service.current_minute = _clock.absolute_minute
|
||||
peeping_room_service.configure(world_service, facility_service, construction_service, path_service, id_generator)
|
||||
_connect_construction_signals()
|
||||
var initial_infrastructure_ok := _initialize_infrastructure_services()
|
||||
_next_command_id = 1
|
||||
@@ -298,6 +302,8 @@ func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_S
|
||||
register_command_executor(&"build_facility", Callable(self, "_execute_build_facility"))
|
||||
register_command_executor(&"cancel_construction", Callable(self, "_execute_cancel_construction"))
|
||||
register_command_executor(&"demolish_facility", Callable(self, "_execute_demolish_facility"))
|
||||
for command_type: StringName in [&"peeping_room_validate", &"peeping_room_place", &"peeping_room_relink", &"peeping_room_record_evidence"]:
|
||||
register_command_executor(command_type, Callable(self, "_execute_peeping_room"))
|
||||
register_command_executor(&"set_elevator_operation", Callable(self, "_execute_set_elevator_operation"))
|
||||
register_command_executor(&"start_excavation", Callable(self, "_execute_start_excavation"))
|
||||
register_command_executor(&"pause_excavation", Callable(self, "_execute_pause_excavation"))
|
||||
@@ -565,6 +571,8 @@ func create_snapshot() -> Dictionary:
|
||||
}
|
||||
if PurchaseQuoteV2.has_history(owned_systems[&"runtime"]):
|
||||
owned_systems[&"runtime"][&"runtime_schema_version"] = MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION
|
||||
if not peeping_room_service.is_empty():
|
||||
owned_systems[&"runtime"][&"special_peeping_rooms"] = peeping_room_service.create_snapshot()
|
||||
# Every component above returns detached containers. Transfer this fresh
|
||||
# tree into the envelope instead of deep-copying all component snapshots a
|
||||
# second time. Keep generic capture's caller-owned-extra contract unchanged.
|
||||
@@ -666,6 +674,8 @@ func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bo
|
||||
runtime_current_keys.append(&"facility_cleanliness")
|
||||
if runtime_schema_version >= AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION:
|
||||
runtime_current_keys.append(&"auto_purchase_plans")
|
||||
if runtime_data.has(&"special_peeping_rooms"):
|
||||
runtime_current_keys.append(&"special_peeping_rooms")
|
||||
if not _dictionary_has_exact_canonical_keys(runtime_data, runtime_current_keys) \
|
||||
or typeof(runtime_data.get(&"runtime_schema_version", null)) != TYPE_INT \
|
||||
or typeof(runtime_data.get(&"world_seed", null)) != TYPE_INT \
|
||||
@@ -1290,6 +1300,16 @@ func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bo
|
||||
var restored_next_id := int(runtime_data.get(&"next_command_id", 0))
|
||||
if restored_next_id <= 0:
|
||||
return false
|
||||
var restored_peeping_rooms := PeepingRooms.new()
|
||||
restored_peeping_rooms.configure(restored_world, restored_facilities, restored_construction, restored_path, restored_id_generator)
|
||||
if runtime_data.has(&"special_peeping_rooms"):
|
||||
if not runtime_data[&"special_peeping_rooms"] is Dictionary:
|
||||
return false
|
||||
for raw_key: Variant in runtime_data:
|
||||
if raw_key == &"special_peeping_rooms" and typeof(raw_key) != TYPE_STRING_NAME:
|
||||
return false
|
||||
if not restored_peeping_rooms.restore_section(runtime_data.get(&"special_peeping_rooms", null), restored_minute):
|
||||
return false
|
||||
if not SimulationSnapshot.restore(snapshot, _clock, _state):
|
||||
return false
|
||||
world_seed = restored_world_seed
|
||||
@@ -1297,6 +1317,7 @@ func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bo
|
||||
_staffing_projection_enabled = restored_staffing_projection
|
||||
command_queue = restored_queue
|
||||
id_generator = restored_id_generator
|
||||
peeping_room_service = restored_peeping_rooms
|
||||
domain_events = restored_domain_events
|
||||
_rng_streams = restored_streams
|
||||
world_service = restored_world
|
||||
@@ -5546,6 +5567,7 @@ func _connect_facility_signals() -> void:
|
||||
return
|
||||
facility_service.instance_registered.connect(Callable(self, "_on_cleanliness_facility_registered"))
|
||||
facility_service.instance_unregistered.connect(Callable(self, "_on_cleanliness_facility_unregistered"))
|
||||
facility_service.instance_unregistered.connect(Callable(self, "_on_peeping_target_removed"))
|
||||
facility_service.facility_state_changed.connect(Callable(self, "_on_facility_state_changed"))
|
||||
facility_service.service_started.connect(Callable(self, "_on_service_started"))
|
||||
facility_service.service_interrupted.connect(Callable(self, "_on_service_interrupted"))
|
||||
@@ -10817,6 +10839,7 @@ func _on_excavation_completed(report: Dictionary) -> void:
|
||||
))
|
||||
|
||||
func _on_facility_demolished(instance_id: StringName, refund: Dictionary) -> void:
|
||||
peeping_room_service.target_removed(instance_id)
|
||||
if not mana_network_service.get_node(instance_id).is_empty():
|
||||
mana_network_service.unregister_node(instance_id)
|
||||
if facility_service.has_instance(instance_id):
|
||||
@@ -10831,6 +10854,31 @@ func _on_facility_demolished(instance_id: StringName, refund: Dictionary) -> voi
|
||||
0
|
||||
))
|
||||
|
||||
func _on_peeping_target_removed(instance_id: StringName) -> void:
|
||||
peeping_room_service.target_removed(instance_id)
|
||||
|
||||
func _execute_peeping_room(command: SimulationCommand) -> CommandResult:
|
||||
var payload := command.payload
|
||||
var report: Dictionary
|
||||
if command.command_type == &"peeping_room_place":
|
||||
report = PeepingRooms.result(&"BUILD_DEFINITION_PENDING_D04")
|
||||
elif command.command_type == &"peeping_room_validate":
|
||||
if typeof(payload.get(&"origin")) != TYPE_VECTOR3I or typeof(payload.get(&"footprint", Vector2i(2, 1))) != TYPE_VECTOR2I or typeof(payload.get(&"target_instance_id", &"")) not in [TYPE_STRING, TYPE_STRING_NAME]:
|
||||
report = PeepingRooms.result(&"INVALID_PAYLOAD")
|
||||
else:
|
||||
report = peeping_room_service.validate_placement(payload[&"origin"], payload.get(&"footprint", Vector2i(2, 1)), StringName(payload.get(&"target_instance_id", &"")))
|
||||
else:
|
||||
var key: StringName = &"target_instance_id" if command.command_type == &"peeping_room_relink" else &"source_event_key"
|
||||
if typeof(payload.get(&"room_id")) not in [TYPE_STRING, TYPE_STRING_NAME] or typeof(payload.get(key, &"")) not in [TYPE_STRING, TYPE_STRING_NAME]:
|
||||
report = PeepingRooms.result(&"INVALID_PAYLOAD")
|
||||
elif command.command_type == &"peeping_room_relink":
|
||||
report = peeping_room_service.relink(StringName(payload[&"room_id"]), StringName(payload.get(key, &"")))
|
||||
else:
|
||||
report = peeping_room_service.record_evidence(StringName(payload[&"room_id"]), StringName(payload.get(key, &"")), _runtime_event_minute())
|
||||
if report[&"ok"]:
|
||||
return CommandResult.succeeded(command.command_id, report)
|
||||
return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, String(report[&"reason"]), report)
|
||||
|
||||
func _on_ledger_transaction_posted(transaction_id: StringName, _entries: Array) -> void:
|
||||
if _operations_flushing_economy_notifications.has(transaction_id):
|
||||
return
|
||||
|
||||
+49
-5
@@ -3736,14 +3736,58 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "tests/ui/test_operations_notification.gd",
|
||||
"template": "Operations notification: <checks> checks, <failures> failures",
|
||||
"test": "tests/special/test_peeping_room_geometry.gd",
|
||||
"template": "Peeping room geometry: <checks> checks, <failures> failures",
|
||||
"required": true,
|
||||
"fixed_check_count_used": false,
|
||||
"source_sha256_at_schema_audit": "50172ab6daa031d221f6a78cac5cdbcb8884f295f8062b54656562e2412faff2",
|
||||
"source_sha256_at_schema_audit": "103d85f83e1e97a8637892504264275eef23f172eeec56c94e5c022d81bf6945",
|
||||
"authority": {
|
||||
"path": "docs/spec/acceptance/P24-02-code-r01.json",
|
||||
"scope": "new local suite source marker; actual execution pending"
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
|
||||
"scope": "new backend suite marker; native execution pending"
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "tests/special/test_peeping_room_reference.gd",
|
||||
"template": "Peeping room reference: <checks> checks, <failures> failures",
|
||||
"required": true,
|
||||
"fixed_check_count_used": false,
|
||||
"source_sha256_at_schema_audit": "188b00a60f7aefda69dc4973f1de9c14447a0d4bcdd1257a2eabe7c4782e4caf",
|
||||
"authority": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
|
||||
"scope": "new backend suite marker; native execution pending"
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "tests/special/test_peeping_room_evidence.gd",
|
||||
"template": "Peeping room evidence: <checks> checks, <failures> failures",
|
||||
"required": true,
|
||||
"fixed_check_count_used": false,
|
||||
"source_sha256_at_schema_audit": "390e0032d14de9a8875ced163a922341ce655744200d78b4ffa776d42c4f8c2a",
|
||||
"authority": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
|
||||
"scope": "new backend suite marker; native execution pending"
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "tests/special/test_peeping_room_save.gd",
|
||||
"template": "Peeping room save: <checks> checks, <failures> failures",
|
||||
"required": true,
|
||||
"fixed_check_count_used": false,
|
||||
"source_sha256_at_schema_audit": "ba0e7644277477c1821135cae6d6fd533651799c6f9bd8c43ccf45e63b96c63c",
|
||||
"authority": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
|
||||
"scope": "new backend suite marker; native execution pending"
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "tests/special/test_peeping_room_runtime.gd",
|
||||
"template": "Peeping room runtime: <checks> checks, <failures> failures",
|
||||
"required": true,
|
||||
"fixed_check_count_used": false,
|
||||
"source_sha256_at_schema_audit": "924efd34414c12a325a1b700f799aef0396de9f15441fd88a3608292ff221657",
|
||||
"authority": {
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
|
||||
"scope": "new backend suite marker; native execution pending"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"task_id": "P04-01",
|
||||
"commit": "2dde7596a87c43f7bf0bf704b7479f2fa06a5b1c",
|
||||
"status": "blocked",
|
||||
"summary": "The repair29 documents describe the current code accurately but leave the required ordering rules undefined. The D05 candidate's source references match the current product (product1338): FacilityService._prepare_service_for_tick:853-874 checks RELATED_FACILITY_INACTIVE before NO_POWER, and the cited runtime functions are at 5743/7553/8482/8577/8738/9804/11785. The submission itself states that D05 items (a) power vs closure/dependency precedence, (b) destruction vs completion, (c) exit vs completion and (d) which day a 00:00 sale belongs to are pending an owner decision. P04-01 requires the order across 閉店/停電/破壊/退出/課金/シフト交代/00:00決算 to be stated ('順序を明記'). That cannot be met while these mandatory rules are only a recommended 'keep current behavior' candidate that nobody has approved. Several final steps are also unfinished, and CURRENT_STATUS.md says the unit is incomplete (13/88 unchanged). The passing p04-acceptance check is mechanical (it confirms an index exists and does not approve the rules), so it is not enough for pass. The blocker is undecided rules (spec insufficient), which needs an owner decision, so the status is blocked.",
|
||||
"acceptance_ids": [
|
||||
"P04-01"
|
||||
],
|
||||
"findings": [
|
||||
{
|
||||
"severity": "high",
|
||||
"message": "Mandatory ordering rules are undefined. The order between power stop and closure/dependency, between destruction and completion/charging, between exit and completion, and which day a 00:00 sale belongs to are pending. D05_REMAINING_ORDER_CANDIDATE.md/.json offers only Option A (keep current behavior), which has not been approved. P04-01 requires the order to be stated explicitly ('順序を明記'), and code behavior is not authority, so acceptance cannot be granted. An owner decision is needed (spec insufficient → blocked)."
|
||||
},
|
||||
{
|
||||
"severity": "high",
|
||||
"message": "Under current behavior, Option (b) allows an incident-driven destruction in the same tick to follow a completion and charge (B4a: 25G charged, then destroyed). Whether this conflicts with the 'no charging while stopped' (停止中課金なし) criterion has not been settled. A D05 destruction rule is required."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"message": "The checker's destruction_stop rule (tools/check_p04_order_evidence.py:49) points to BASELINE:183, which covers mana depletion, not destruction. The authority reference does not match the domain. The repair is deferred until D05 is approved, so the 破壊 domain still has no valid authority link."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"message": "No final validation has been run on the final source and checker. Full178 ran with checker f5, not the current a61, and no full1339 run exists. tests/business/test_required_kitchen.gd differs from the version that run used. The support53cb rebind, final source/config/input/environment binding, formal review, integration (P04 first, then support) and any nativeWindows conditions are all still pending."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "S4 NO_POWER evidence comes from a direct disconnect_nodes call and does not represent global mana depletion, which appears only in the B1 combined diagnostic run. The documents say this correctly, but the scope of the power-stop evidence is limited."
|
||||
}
|
||||
]
|
||||
}
|
||||
+7
File diff suppressed because one or more lines are too long
+62
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"observed_at": "2026-10-17T16:30:38.746525+09:00",
|
||||
"original_packages": 30,
|
||||
"original_units": 88,
|
||||
"formally_completed": 14,
|
||||
"new_credit": 0,
|
||||
"plan_id": "P04-01",
|
||||
"state": "in_progress",
|
||||
"runner_project": "the-tree-p04-01",
|
||||
"runner_state": "repair_pending",
|
||||
"repairs": 29,
|
||||
"max_repairs": null,
|
||||
"submitted": "2dde7596a87c43f7bf0bf704b7479f2fa06a5b1c",
|
||||
"candidate": null,
|
||||
"worktree_clean_at_observation": true,
|
||||
"active_worker": false,
|
||||
"current_main_at_audit": "565fd805079d8c446f29e30c57979242561113ea",
|
||||
"acceptance_unchanged": {
|
||||
"domains": [
|
||||
"閉店",
|
||||
"停電",
|
||||
"破壊",
|
||||
"退出",
|
||||
"課金",
|
||||
"シフト交代",
|
||||
"00:00決算"
|
||||
],
|
||||
"safety": [
|
||||
"停止中課金0",
|
||||
"二重決算0",
|
||||
"予約の孤立0"
|
||||
],
|
||||
"conditions": "all15 + EV, original frozen rules unchanged",
|
||||
"required_gates": [
|
||||
"exact final source/checker applicability",
|
||||
"required final full regression",
|
||||
"independent whole review",
|
||||
"ordinary prepare-integration / integration / final",
|
||||
"ledger reflection"
|
||||
]
|
||||
},
|
||||
"latest_commander": "ea12167cffff444596c0c36caa700a26",
|
||||
"latest_formal_review": "275d1fd64fff4d5782c6f7667fc1e031",
|
||||
"no_duplicate_repair": true,
|
||||
"remaining": [
|
||||
"owner choices for destruction order and midnight-sale day, plus explicit disposition of reason label and command/AI exit",
|
||||
"after actual answers, normal batched checker destruction-authority pin / registry / approval record / stale current metadata correction",
|
||||
"final gates as listed; previous full178 f5 receipt is not full final checker a61 evidence; no relabeling"
|
||||
],
|
||||
"already_corrected_per_actual_opus": [
|
||||
"raw joins",
|
||||
"canonical getter contract explanation",
|
||||
"candidate HEAD fixtures",
|
||||
"schema2 index",
|
||||
"S4r28",
|
||||
"Local8",
|
||||
"r22 collection"
|
||||
],
|
||||
"owner_response_pending": true,
|
||||
"approval_not_inferred": true,
|
||||
"whole_acceptance": false
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
# P04-01 current status — repair29
|
||||
|
||||
Worker checks: SOURCE-READY / NOTRUN. No probes or tests were run by this worker.
|
||||
|
||||
This canonical table overrides creation-time NOT RUN / pending-execution entries in REPAIR22–28, their status/validation records, and the runbooks (including S4_ROOT_RUN.md). Those files are historical and remain untouched. It does not relabel an old run as execution of repair29.
|
||||
|
||||
`B` = `/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build`.
|
||||
|
||||
| Item | Canonical status | Exact-version evidence |
|
||||
| --- | --- | --- |
|
||||
| Current native product / main | Root-measured `5f6bc11d` / `9b1a18c1` | Product1338 at B/audit-support/p04-r17-full-inputs-r01/product; current SHA256 inventory in REPAIR29_STATIC_SOURCE.json. Old deb11300 is not current. |
|
||||
| S4 r28 | Root-measured 4/4 PASS; import/parse/Writer/Reader PIDs49940,50044,50078,50105 all ended; guards0; cleanup0 | B/p04-s4-native-r28; B/audit-support/p04-root-fb8b-s4-r01/native.result.json. Full controls in that same support directory. |
|
||||
| Local8 | Root-measured PASS | B/audit-support/p04-root-fb8b-local-r01: bulk, negative, applicability, native, series, encoder, join, roles result/stdio records. |
|
||||
| Collection | Root-measured r22 collected, no native re-run claimed | B/audit-support/p04-raw-collect-r22/MANIFEST.json and s1/s2a/s2b/s3/s4.json. |
|
||||
| Index | Root-measured schema2, missing_conditions=[], all15 conditions + EV mechanically verified | B/p04-evidence/index.json and generation-invocation.json; local-r01 index/checker output. This is not D05 approval. |
|
||||
| Registered validation on fb8b7919 | Root-measured PASS,28.095s | B/audit-support/p04-root-fb8b-local-r01/registered-validation.result.json and stdout log. Does not establish final repair29 validation or acceptance. |
|
||||
| Full178 | Root-measured178 suites /21615 checks PASS used checker f5, **not a61** | B/audit-support/p18-regression-support-final-r01/native-full178/runner-ended.json and source-start.json; exact receipt remains preserved. Checker f5 SHA256 `f5b44827958f2ae352fe5c4bc3a1ffd4211ec7a41fc4c0759c8b954891662324`. |
|
||||
| Full1339 against a61 | **No such full run exists** | a61 SHA256 `a61c5b496e656f60c66898e42500bc9a2d45f947690ce8f5f19a03984ebbc850`. Local8 and registered validation are separate evidence. |
|
||||
| Worker repair29 | SOURCE-READY / NOTRUN | Static source/line/registration/SHA256 inspection only. No tests, probes, Git, engine, Runner or agents. |
|
||||
| Owner D05 | Pending a–d, candidate only | D05_REMAINING_ORDER_CANDIDATE.md/json; A01, dependency hold and18:00 remain approved. |
|
||||
| Original unit | **Incomplete;13/88 unchanged** | Mechanical PASS does not approve unknown mandatory priorities, replace independent review, or integrate the unit. |
|
||||
|
||||
Proof hashes for the exact collection/index/full receipt/validation and current source are in [REPAIR29_STATIC_SOURCE.json](REPAIR29_STATIC_SOURCE.json). Applicable source/config/input/environment joins stay in the immutable schema2 index and raw collection; no raw is normalized, spliced, regenerated or relabelled here.
|
||||
|
||||
Product reuse requires exact applicability: the178 suites do not execute the Python checker and the316-file GDScript parse roster excludes it. Static comparison with the preserved full178 selected_source_map found one test-source difference, tests/business/test_required_kitchen.gd (full178 3a9c92f8…, current product5dcc86d6…), and no game-source difference. Preserve the Runner applicability binding for this test; do not claim all1338 selected product hashes match that full178 receipt or byte-identical full1339 validation against a61. Preserve the f5 full178 receipt and all historical partial/full outputs separately.
|
||||
|
||||
Remaining Runner steps: independent review of these documents, then Root obtains owner decisions (or explicit non-mandatory rulings) for D05 a–d. Unknown mandatory rules stay pending. Any destruction authority pin/registry or other approved implementation change follows a normal repair. The support53cb normal registered rebind, final full run on the final source/checker, final source/config/input/environment binding, formal independent review and integration remain Runner work. Integration order is **P04 first, then support on main9b (`9b1a18c1`)**. NativeWindows obligations remain individually pending if required. No criterion is waived and no extra original unit is counted.
|
||||
|
||||
Known authority/scope gaps: destruction_stop binds BASELINE:183 (mana depletion, not destruction); explicit D05 destruction rule required before normal pin repair. S4 NO_POWER was induced by direct disconnect_nodes; global depletion appears only in B1 combined diagnostic. Preserve these distinctions even though the mechanical index passes.
|
||||
|
||||
Changed files in repair29 (all under this directory): ORDER_AUDIT.md; order-audit.json; D05_REMAINING_ORDER_CANDIDATE.md; D05_REMAINING_ORDER_CANDIDATE.json; CHECKER_PROTOCOL.md; EVIDENCE_COLLECTION.md; P04_ORDER_EVIDENCE_PROTOCOL.json; CURRENT_STATUS.md; REPAIR29_STATIC_SOURCE.json. Product/checker/registry, native footprint, staged inputs, raw and historical runbooks are unchanged.
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"task_id": "P04-01",
|
||||
"revision": "repair29",
|
||||
"status": "approval candidate only; SOURCE-READY / NOTRUN",
|
||||
"approval": null,
|
||||
"apply_to_product_or_checker": false,
|
||||
"review_flow": "Root asks owner after review. This document neither requests approval from worker nor records it.",
|
||||
"proof_legend": {
|
||||
"R": "B/audit-support/p04-raw-collect-r22",
|
||||
"I": "B/p04-evidence/index.json schema2",
|
||||
"pins": "REPAIR29_STATIC_SOURCE.json; R/MANIFEST.json and I raw_references/versions"
|
||||
},
|
||||
"choices": [
|
||||
{
|
||||
"id": "a",
|
||||
"topic": "Power vs closure/dependency",
|
||||
"status": "pending D05",
|
||||
"observation": {
|
||||
"status": "observed-current",
|
||||
"behavior": "RELATED_FACILITY_INACTIVE selected before NO_POWER; both pause service with no charge.",
|
||||
"source": "FacilityService _prepare_service_for_tick:853–874, phase FACILITY_COMPLETION after MANA projection",
|
||||
"proof": "Root-measured R/s4.json isolated NO_POWER; R/s3.json B1 combined RELATED diagnostic; REPAIR29_STATIC_SOURCE.json source pins"
|
||||
},
|
||||
"inputs": "Same service and minute, related facility inactive and power unavailable; include direct closure separately under D-034.",
|
||||
"A": {
|
||||
"recommended": true,
|
||||
"rule": "Keep current RELATED-first reason selection.",
|
||||
"outcome": "Service held, progress/payment paused, reservation and serviceID retained.",
|
||||
"side_effects": "Reason reports dependency while both causes apply; no new hold limit.",
|
||||
"dependencies": "Approved dependency hold, D-034 direct closure, existing MANA-before-completion order."
|
||||
},
|
||||
"B": {
|
||||
"rule": "NO_POWER wins reason selection when both conditions fail.",
|
||||
"outcome": "Same no-charge hold safety; reason reports power.",
|
||||
"side_effects": "Reason/event and recovery-precedence semantics would change; concrete implementation and exact-version proof require normal repair.",
|
||||
"dependencies": "Must retain no-charge while either legitimate hold persists; preserve approved dependency reservation/identity behavior."
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "b",
|
||||
"topic": "Destruction",
|
||||
"status": "pending D05",
|
||||
"observation": {
|
||||
"status": "observed-current",
|
||||
"behavior": "Command destruction in APPLY precedes completion. Incident destruction in INCIDENTS follows it; B4a shows25G charge then destruction in same tick.",
|
||||
"source": "Runtime _process_tick_commands:5743, _advance_facilities:8482, _advance_defense:8577 / _apply_defense_outcome_boundary:9804",
|
||||
"proof": "Root-measured R/s3.json B4a/B4b; REPAIR29_STATIC_SOURCE.json"
|
||||
},
|
||||
"inputs": "A service due for completion in a minute with command or incident destruction of its facility.",
|
||||
"A": {
|
||||
"recommended": true,
|
||||
"rule": "Keep command-before-completion and incident-after-completion behavior.",
|
||||
"outcome": "Command destruction prevents completion; incident may follow a valid completion/charge that minute; next-tick broken failure/release remains.",
|
||||
"side_effects": "Completion and destruction can coexist in one tick as B4a; not a universal no-sale-on-destruction rule.",
|
||||
"dependencies": "P04 stopped-charge and orphan-reservation safety; explicit D05 destruction authority required."
|
||||
},
|
||||
"B": {
|
||||
"rule": "An incident in the same minute suppresses that minute completion (or voids it if already posted).",
|
||||
"outcome": "No retained completion/sale for the incident-destruction minute.",
|
||||
"side_effects": "Would require preemption or atomic reversal of completion, inventory, payment and rewards; no unapproved numbers or refund amounts supplied.",
|
||||
"dependencies": "Owner must specify the suppress/void transaction semantics; preserve idempotency, no orphan reservations and approved shift/hold rules; normal implementation and new proof required."
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "c",
|
||||
"topic": "Exit",
|
||||
"status": "pending D05",
|
||||
"observation": {
|
||||
"status": "observed-current",
|
||||
"behavior": "Command exit APPLY before completion/charging; AI PLANNED_EXIT after them; LEAVING despawns later.",
|
||||
"source": "Runtime _execute_leave_facility_queue:7553; _advance_guest_ai_decisions:8738–8762",
|
||||
"proof": "Root-measured R/s3.json B2a/B2b/B3 and B1 departure history; source pins REPAIR29_STATIC_SOURCE.json"
|
||||
},
|
||||
"inputs": "Exit command or AI exit due at a minute with a completion-ready service. Current AI PLANNED_EXIT applies to DECIDING guests; do not assume it preempts an active service.",
|
||||
"A": {
|
||||
"recommended": true,
|
||||
"rule": "Keep current command/AI distinction and state predicates.",
|
||||
"outcome": "Command leave/release happens first; eligible AI planned exit follows completion/charging and queue processing.",
|
||||
"side_effects": "AI due time alone does not universally cancel current-minute completion; later despawn remains separate.",
|
||||
"dependencies": "D-034, reservation ownership/release, phase6 completion before phase10 AI."
|
||||
},
|
||||
"B": {
|
||||
"rule": "An exit due this minute preempts completion.",
|
||||
"outcome": "Applicable due exits release/cancel before completion and no completion sale occurs for that preempted service.",
|
||||
"side_effects": "Changes eligibility for exit and service cancellation; would change simultaneous completion/payment observations.",
|
||||
"dependencies": "Owner must define applicable due-exit states; preserve no orphan reservation, no duplicate charge and approved dependency/shift behavior; normal repair and exact proof required."
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "d",
|
||||
"topic": "Cost time/day attribution beyond A01 and18:00",
|
||||
"status": "pending D05",
|
||||
"observation": {
|
||||
"status": "observed-current",
|
||||
"behavior": "Sale dated at post-increment minute. At00:00 TIME_BOUNDARIES settlement/upkeep precede completions;00:00 sales go to new day because daily-close period_end is exclusive.",
|
||||
"source": "Kernel advance_one_minute:122; Runtime _apply_service_transaction:11785 /11826–11838; coordinator _process_daily_close:1125 /1136",
|
||||
"proof": "Root-measured R/s2a.json paid midnight/replay; I C; REPAIR29_STATIC_SOURCE.json"
|
||||
},
|
||||
"inputs": "Service completes on calendar boundary; account period ends at boundary minute. A01 ownership upkeep and18:00 shift interval remain fixed.",
|
||||
"A": {
|
||||
"recommended": true,
|
||||
"rule": "Keep post-increment sale time and new-day attribution for00:00 sales.",
|
||||
"outcome": "Closing day excludes boundary-minute completion; new day receives sale.",
|
||||
"side_effects": "Closing summary is finalized before those sales; upkeep ownership rule unchanged.",
|
||||
"dependencies": "Exclusive daily-close interval, sale timestamp, idempotent close/replay; P04 mandatory timing/attribution separate from D04/P05 numeric cost math."
|
||||
},
|
||||
"B": {
|
||||
"rule": "Boundary-minute sales belong to closing day.",
|
||||
"outcome": "Closing day includes those sales.",
|
||||
"side_effects": "Would require a distinct accounting attribution or revised boundary transaction sequencing; affects daily summaries/reconciliation/replay. No numeric cost policy is invented.",
|
||||
"dependencies": "Owner must settle attribution mechanics and same-boundary replay; preserve A01 and18:00, all P04 safety criteria; normal repair and exact-version proof required."
|
||||
}
|
||||
}
|
||||
],
|
||||
"bundle": {
|
||||
"label": "accept current-behavior A for a-d",
|
||||
"status": "pending D05",
|
||||
"recommended": true,
|
||||
"coupling_notes": [
|
||||
"a preserves the approved hold and no-charge safety independent of reason priority.",
|
||||
"b and c use the same completion boundary: commands before, incidents and AI after. Changing either requires separate applicability and replay checks.",
|
||||
"d relies on TIME_BOUNDARIES before completion; changing attribution can affect the transaction history used by b/c and settlement idempotency.",
|
||||
"A01 ownership upkeep, dependency hold and18:00 interval are already approved and are excluded from renewed approval.",
|
||||
"Owner may explicitly rule some remaining items non-mandatory; no such ruling exists here. Unknowns stay pending; mandatory acceptance is never relaxed."
|
||||
]
|
||||
},
|
||||
"authority_gap": "destruction_stop currently binds BASELINE:183, which is mana depletion, not destruction authority. Explicit D05 destruction rule required. Pin/registry repair only after approval through normal repair.",
|
||||
"power_scope": "S4 NO_POWER uses direct disconnect_nodes; not proof of global depletion, which exists only in B1 combined diagnostic.",
|
||||
"original_unit_complete": false
|
||||
}
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
# D05 remaining order candidate — repair29
|
||||
|
||||
**Approval candidate only. SOURCE-READY / NOTRUN.** Root asks the owner after review. Nothing is applied to product, checker or registry; observation is not approval. A01 midnight ownership upkeep, dependency hold and18:00 are already approved and are not re-asked.
|
||||
|
||||
Structured choices: [D05_REMAINING_ORDER_CANDIDATE.json](D05_REMAINING_ORDER_CANDIDATE.json). Source path/line/SHA256 pins: [REPAIR29_STATIC_SOURCE.json](REPAIR29_STATIC_SOURCE.json); phase map: [ORDER_AUDIT.md](ORDER_AUDIT.md). R = B/audit-support/p04-raw-collect-r22; I = B/p04-evidence/index.json. These are Root-measured exact-version proof references, with raw/provenance pins in R/MANIFEST.json, I and the static manifest.
|
||||
|
||||
## (a) Power vs closure/dependency — pending D05
|
||||
|
||||
**Observed-current:** RELATED_FACILITY_INACTIVE selected before NO_POWER; both pause service with no charge. Source: FacilityService _prepare_service_for_tick:853–874, phase FACILITY_COMPLETION after MANA projection. Proof: Root-measured R/s4.json isolated NO_POWER; R/s3.json B1 combined RELATED diagnostic; REPAIR29_STATIC_SOURCE.json source pins.
|
||||
|
||||
**Inputs:** Same service and minute, related facility inactive and power unavailable; include direct closure separately under D-034.
|
||||
|
||||
**Option A (recommended; keep current behavior):** Keep current RELATED-first reason selection.
|
||||
|
||||
- Outcomes: Service held, progress/payment paused, reservation and serviceID retained.
|
||||
- Side effects: Reason reports dependency while both causes apply; no new hold limit.
|
||||
- Dependencies: Approved dependency hold, D-034 direct closure, existing MANA-before-completion order.
|
||||
|
||||
**Option B:** NO_POWER wins reason selection when both conditions fail.
|
||||
|
||||
- Outcomes: Same no-charge hold safety; reason reports power.
|
||||
- Side effects: Reason/event and recovery-precedence semantics would change; concrete implementation and exact-version proof require normal repair.
|
||||
- Dependencies: Must retain no-charge while either legitimate hold persists; preserve approved dependency reservation/identity behavior.
|
||||
|
||||
## (b) Destruction — pending D05
|
||||
|
||||
**Observed-current:** Command destruction in APPLY precedes completion. Incident destruction in INCIDENTS follows it; B4a shows25G charge then destruction in same tick. Source: Runtime _process_tick_commands:5743, _advance_facilities:8482, _advance_defense:8577 / _apply_defense_outcome_boundary:9804. Proof: Root-measured R/s3.json B4a/B4b; REPAIR29_STATIC_SOURCE.json.
|
||||
|
||||
**Inputs:** A service due for completion in a minute with command or incident destruction of its facility.
|
||||
|
||||
**Option A (recommended; keep current behavior):** Keep command-before-completion and incident-after-completion behavior.
|
||||
|
||||
- Outcomes: Command destruction prevents completion; incident may follow a valid completion/charge that minute; next-tick broken failure/release remains.
|
||||
- Side effects: Completion and destruction can coexist in one tick as B4a; not a universal no-sale-on-destruction rule.
|
||||
- Dependencies: P04 stopped-charge and orphan-reservation safety; explicit D05 destruction authority required.
|
||||
|
||||
**Option B:** An incident in the same minute suppresses that minute completion (or voids it if already posted).
|
||||
|
||||
- Outcomes: No retained completion/sale for the incident-destruction minute.
|
||||
- Side effects: Would require preemption or atomic reversal of completion, inventory, payment and rewards; no unapproved numbers or refund amounts supplied.
|
||||
- Dependencies: Owner must specify the suppress/void transaction semantics; preserve idempotency, no orphan reservations and approved shift/hold rules; normal implementation and new proof required.
|
||||
|
||||
## (c) Exit — pending D05
|
||||
|
||||
**Observed-current:** Command exit APPLY before completion/charging; AI PLANNED_EXIT after them; LEAVING despawns later. Source: Runtime _execute_leave_facility_queue:7553; _advance_guest_ai_decisions:8738–8762. Proof: Root-measured R/s3.json B2a/B2b/B3 and B1 departure history; source pins REPAIR29_STATIC_SOURCE.json.
|
||||
|
||||
**Inputs:** Exit command or AI exit due at a minute with a completion-ready service. Current AI PLANNED_EXIT applies to DECIDING guests; do not assume it preempts an active service.
|
||||
|
||||
**Option A (recommended; keep current behavior):** Keep current command/AI distinction and state predicates.
|
||||
|
||||
- Outcomes: Command leave/release happens first; eligible AI planned exit follows completion/charging and queue processing.
|
||||
- Side effects: AI due time alone does not universally cancel current-minute completion; later despawn remains separate.
|
||||
- Dependencies: D-034, reservation ownership/release, phase6 completion before phase10 AI.
|
||||
|
||||
**Option B:** An exit due this minute preempts completion.
|
||||
|
||||
- Outcomes: Applicable due exits release/cancel before completion and no completion sale occurs for that preempted service.
|
||||
- Side effects: Changes eligibility for exit and service cancellation; would change simultaneous completion/payment observations.
|
||||
- Dependencies: Owner must define applicable due-exit states; preserve no orphan reservation, no duplicate charge and approved dependency/shift behavior; normal repair and exact proof required.
|
||||
|
||||
## (d) Cost time/day attribution beyond A01 and18:00 — pending D05
|
||||
|
||||
**Observed-current:** Sale dated at post-increment minute. At00:00 TIME_BOUNDARIES settlement/upkeep precede completions;00:00 sales go to new day because daily-close period_end is exclusive. Source: Kernel advance_one_minute:122; Runtime _apply_service_transaction:11785 /11826–11838; coordinator _process_daily_close:1125 /1136. Proof: Root-measured R/s2a.json paid midnight/replay; I C; REPAIR29_STATIC_SOURCE.json.
|
||||
|
||||
**Inputs:** Service completes on calendar boundary; account period ends at boundary minute. A01 ownership upkeep and18:00 shift interval remain fixed.
|
||||
|
||||
**Option A (recommended; keep current behavior):** Keep post-increment sale time and new-day attribution for00:00 sales.
|
||||
|
||||
- Outcomes: Closing day excludes boundary-minute completion; new day receives sale.
|
||||
- Side effects: Closing summary is finalized before those sales; upkeep ownership rule unchanged.
|
||||
- Dependencies: Exclusive daily-close interval, sale timestamp, idempotent close/replay; P04 mandatory timing/attribution separate from D04/P05 numeric cost math.
|
||||
|
||||
**Option B:** Boundary-minute sales belong to closing day.
|
||||
|
||||
- Outcomes: Closing day includes those sales.
|
||||
- Side effects: Would require a distinct accounting attribution or revised boundary transaction sequencing; affects daily summaries/reconciliation/replay. No numeric cost policy is invented.
|
||||
- Dependencies: Owner must settle attribution mechanics and same-boundary replay; preserve A01 and18:00, all P04 safety criteria; normal repair and exact-version proof required.
|
||||
|
||||
## Bundle: accept current-behavior A for a-d
|
||||
|
||||
Recommended candidate, not approved.
|
||||
|
||||
- a preserves the approved hold and no-charge safety independent of reason priority.
|
||||
- b and c use the same completion boundary: commands before, incidents and AI after. Changing either requires separate applicability and replay checks.
|
||||
- d relies on TIME_BOUNDARIES before completion; changing attribution can affect the transaction history used by b/c and settlement idempotency.
|
||||
- A01 ownership upkeep, dependency hold and18:00 interval are already approved and are excluded from renewed approval.
|
||||
- Owner may explicitly rule some remaining items non-mandatory; no such ruling exists here. Unknowns stay pending; mandatory acceptance is never relaxed.
|
||||
|
||||
destruction_stop currently binds BASELINE:183, which is mana depletion, not destruction authority. Explicit D05 destruction rule required. Pin/registry repair only after approval through normal repair.
|
||||
|
||||
S4 NO_POWER uses direct disconnect_nodes; not proof of global depletion, which exists only in B1 combined diagnostic.
|
||||
|
||||
P04 timing/attribution remains mandatory; D04/P05 numeric cost math is separate. No acceptance criterion is relaxed. P04 remains incomplete; original13/88 unchanged.
|
||||
+1802
File diff suppressed because it is too large
Load Diff
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"action": "wait",
|
||||
"task_id": "P04-01",
|
||||
"reason": "P04-01: WAIT. Waiting for the owner's Japanese answers on D05 (a) power vs closure/dependency precedence, (b) destruction vs completion, (c) exit vs completion, (d) which day a 00:00 sale belongs to. Do not re-ask, do not request-repair (repair30), do not redo tests.\n\nINDEPENDENT NEXT ORIGINAL UNIT (new contract proposal; no matching project in the 20-project inventory, nothing started here): P13-02 「背面条件と対象参照」.\n- Work: 覗き部屋の対象背面、通路寸断、対象喪失と証拠IDを状態として実装する。\n- Acceptance (unchanged): 対象撤去、重複収集、停止、途中保存で状態と参照が整合する。\n- Package P13 acceptance also applies: special rules hold at build time and run time; invalid placement and actions on lost targets rejected; event state saved; implemented scope reported separately from unmade content.\n- Package deps: P09, P12 (both incomplete; bounded progress is allowed, not unit closure). Decisions D04/D05/D08.\n- Original sources: B-2.5 (built behind VIPルーム/風俗個室/脱衣所 on back layer; its cells are no longer usable as back corridor; 記録係 collects 脅迫ネタ); B-8.3 (VIP/浴場/風俗の裏限定・裏通路を寸断); B-10.6 (覗き部屋 2x1, back-only).\n\nSOURCE GAP (main 2f3884b): no peeping/覗き code, data or tests in scripts/autoload/data/resources/tests/tools.\n- FacilityCatalog (scripts/data/facility_catalog.gd) has no peeping_room.\n- No recorder role; no back-side target reference; no evidence-ID ledger; no target-loss state.\n- Existing targets: public_bath, adult_private_room. VIP suite is undefined (P10-01); vip_private_salon must not substitute.\n- Rejected alternatives:\n - P07-01: weather_timeline has no rain/fog effects or natural generation (D04 values).\n - P12-01: security_station only checks the guard role (simulation_runtime.gd:6631); guard effects need D04 values.\n - P15-02: cleric witness/morale rule needs an undecided definition of \"witness\" plus a D04 magnitude.\n - P16: wages/severance/sale amounts are D04.\n\nMECHANISMS POSSIBLE WITH APPROVED INPUTS vs PENDING:\n- Possible:\n - placement check: room cells must lie entirely behind a single allowed, completed target's FRONT footprint on the BACK layer;\n - corridor blocking as an occupancy rule with no automatic bypass;\n - stable target reference;\n - target removal sets TARGET_LOST; no automatic recovery, explicit relink only (D03 pattern / kitchen relink);\n - idempotent evidence IDs keyed by (room, target, source_event_key);\n - no collection while stopped (NO_POWER/closed/under construction);\n - versioned save section with legacy-absent migration and atomic rejection of malformed data.\n- Pending (record, do not invent):\n - build cost/materials/build_minutes/upkeep (D04); FacilityDefinition requires them, so no normal palette registration;\n - recorder role and staffing, collection trigger/rate (D04/D08/P16);\n - VIP suite target (P10-01);\n - D05 ordering;\n - blackmail use and camera UI (P19/P24).\n\nBRIEF: Add a separate PeepingRoomService connected from the Runtime; no rewrite of the whole runtime.\n- Reuse world_service.cells_for_footprint/validate_occupancy/occupy and construction_service.validate_placement.\n- Copy the weather snapshot-version pattern (simulation_runtime.gd:29/520/663/1248).\n- Hook facility removal so the target is marked lost.\n- Add commands for placement validation, explicit relink and evidence recording.\n- No product values, no content, no Clock/P04 change.\n\nALLOWED PATHS:\n- scripts/special/peeping_room_service.gd (new)\n- autoload/simulation_runtime.gd (bounded connection: save section, removal hook, commands)\n- scripts/core/save_service.gd (only if needed)\n- tests/special/test_peeping_room_*.gd\n- docs/plans/original-completion-2026-10-02/execution/p13-02/**\n\nLOCAL TESTS:\n- Valid public_bath and adult_private_room backs.\n- Rejections: front layer, partial overlap, non-target, incomplete target, VIP pending.\n- Corridor cell conflict and path disconnect.\n- Target demolition leads to TARGET_LOST; rebuilt target does not auto-relink; explicit relink works.\n- Duplicate event key yields a single evidence ID.\n- Stopped room rejects collection.\n- Save/restore round-trip, legacy save without the section, malformed restore leaves state unchanged.\n- Existing suites: construction/world/path, tests/supply/test_supply_save_migration.gd, tests/transport/test_transport_save.gd, tests/environment/test_runtime_weather.gd.\n\nREUSE / FULL REVIEW:\n- No completed P18/P23 rerun.\n- Full regression only on the exact final version, then a separate Claude review and normal integration.\n- No partial credit (formal 14/88 and original 30/88 unchanged); do not claim P13 or the backend complete.\n\nOwner must register the new task contract before any run.",
|
||||
"codex_model": "gpt-6.1-sol",
|
||||
"codex_model_reason": "P04-01 itself stays in wait, so no worker runs for it. For the proposed P13-02 batch: one new state service plus a bounded runtime connection. It follows existing patterns (weather snapshot versioning, kitchen explicit relink, world occupancy), uses no numeric balancing and no native code. Sol is sufficient on quality, time and usage. Switch to Astra only if review finds the runtime save-version change crosses many existing save paths."
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
# P13-02-CODE1 implementation handoff
|
||||
|
||||
This is non-graphic state/reference/occupancy/save machinery only. It does not
|
||||
complete P13-02, grant partial credit, or change the original 30/88 denominator
|
||||
or formal 14/88 count. Native execution and acceptance are pending.
|
||||
|
||||
## Declared scope and verification
|
||||
|
||||
Before editing, the worker declared the new service, bounded Runtime hooks,
|
||||
special tests, narrow runner, marker additions and this documentation. SaveService
|
||||
was conditional on an exact-key dependency; inspection found
|
||||
`SupplyAutoPurchaseQuotePlans.valid_runtime_format` has that dependency.
|
||||
Only allowed paths were edited. No asset, UI, content, model, policy, clock phase,
|
||||
or P04 change is involved.
|
||||
|
||||
The full ignored `build/owner-handoff/ACTUAL_OPUS_RUN_DECISION.json` was read and
|
||||
left untouched. Base HEAD is `1e8d4ea88876865a72547ff0edf43ed5b0e74c7e`.
|
||||
The immutable spec was not edited. Its SHA-256 without the terminal newline is
|
||||
the registered `8ea65f2eefedc772c08170186f5cd03ac017432f4b069ade4f9210d4215c2d43`;
|
||||
the on-disk file including that newline is
|
||||
`988d6e18a49372549863cd433432c2852c962fa64b138e490361c023e80249dc`.
|
||||
|
||||
Worker verification: Python AST parsing/compilation only, without executing the
|
||||
runner or importing its dependencies; source/JSON/hash review. GDScript parsing,
|
||||
all tests, `--prepare-only`, native collection and regression were **not run**.
|
||||
No check totals or native success receipts are claimed. No git writes, commits,
|
||||
branches, other agents, integration or Runner operations were performed.
|
||||
|
||||
## Service and commands
|
||||
|
||||
`PeepingRoomService` is a separate RefCounted service with no content or UI.
|
||||
All command executors use the existing Runtime queue; queue/history receipts
|
||||
remain normal Runtime behavior even for rejected/read-only domain commands.
|
||||
|
||||
| Command | Preconditions and result |
|
||||
| --- | --- |
|
||||
| `peeping_room_validate` | `origin: Vector3i`, optional `footprint: Vector2i` (2x1), optional `target_instance_id: String/StringName`. Pure domain validation. |
|
||||
| `peeping_room_place` | Always `BUILD_DEFINITION_PENDING_D04`; no occupancy, resource, room or ID mutation. |
|
||||
| `peeping_room_relink` | Existing `room_id`, explicit nonempty `target_instance_id`; full geometry and ownership validation excluding only the room's exact own occupancy. Leaves `LINKED`, stopped, `RELINKED_PENDING_RESUME`. |
|
||||
| `peeping_room_record_evidence` | Existing `room_id`, nonblank named `source_event_key`. Uses Runtime minute, never caller-supplied time. Checks stopped, target power, target closure/opening hours, completed construction authority, and lost target in that order. Otherwise rejects with `RECORDER_ELIGIBILITY_PENDING_D04_D08_P16`. Never writes the ledger. |
|
||||
|
||||
Malformed command field types return `INVALID_PAYLOAD`. Missing/blank source keys
|
||||
return `SOURCE_EVENT_KEY_REQUIRED` before operational checks. Loss latches both
|
||||
`TARGET_LOST` and stopped, so collection after normal demolition returns `STOPPED`
|
||||
while the room's link/stop reason identifies `TARGET_LOST`. No resume command or
|
||||
automatic resume is defined. Power/closure guards read actual target conditions;
|
||||
they do not define special-room power demand, staffing or normal operation.
|
||||
|
||||
Placement is exactly 2x1 BACK, fully behind a single completed FRONT
|
||||
`public_bath` or `adult_private_room`. It checks bounds/excavation, both real
|
||||
FacilityService and ConstructionService ownership, FRONT cells, World occupancy,
|
||||
and both World walkability and PathService membership. Exact rejection families:
|
||||
`WRONG_LAYER`, `WRONG_FOOTPRINT`, `OUT_OF_BOUNDS`, `NOT_EXCAVATED`,
|
||||
`TARGET_INCOMPLETE`, `TARGET_MISSING`, `PARTIAL_TARGET`, `MULTIPLE_TARGETS`,
|
||||
`TARGET_MISMATCH`, `TARGET_UNKNOWN`, `TARGET_NOT_ALLOWED`, `TARGET_WRONG_LAYER`,
|
||||
`CORRIDOR_CONFLICT`, `BACK_OCCUPIED`. The named `vip_suite` request returns
|
||||
`PENDING_P10_01`; `vip_private_salon` is not an allowed substitute.
|
||||
|
||||
Any existing corridor cell conflicts. A proposed cut through a connected corridor
|
||||
is rejected before mutation, preserving the route; no reroute or bypass is
|
||||
invented. Accepted fixture cells were already nonwalkable and become occupied
|
||||
under `special_peeping_room`. No special-room construction weight/cost is assumed.
|
||||
|
||||
Runtime demolition and FacilityService unregistration latch loss. Collection also
|
||||
detects missing FRONT occupancy/identity. Rebuilding the same cells produces a
|
||||
different construction ID and never silently reattaches rooms. Relink is explicit.
|
||||
|
||||
## CONTROLLED_FIXTURE boundary
|
||||
|
||||
Only service methods named `controlled_fixture_place`,
|
||||
`controlled_fixture_set_stopped`, and `controlled_fixture_record_evidence` create
|
||||
test rooms, enable fixture collection, or write evidence. They are labeled
|
||||
CONTROLLED_FIXTURE in code and tests. They have no command/palette registration,
|
||||
and no Runtime executor calls them. Test helpers disclose direct underground
|
||||
geometry setup and MIMI registration; those do not assert natural unlock/join or
|
||||
production eligibility. Target construction uses existing definitions/costs/times.
|
||||
|
||||
Room IDs come from the existing StableIdGenerator's `peeping_room` counter.
|
||||
Evidence IDs encode the UTF-8 lengths and hex bytes of the full
|
||||
`(room_id, target_instance_id, source_event_key)` tuple. This is injective rather
|
||||
than delimiter concatenation or a hash with possible collisions. Replays return
|
||||
the existing ID with `duplicated=true` and retain the first minute. Evidence is
|
||||
only IDs, source key and minute. Room `target_history` retains prior bindings so
|
||||
relink does not orphan existing opaque evidence.
|
||||
|
||||
## Save invariants
|
||||
|
||||
Runtime versions remain 14 and 15, with version 15 only for existing v2 purchase
|
||||
history. Optional canonical StringName key `special_peeping_rooms` has section
|
||||
version 1 and exact keys `version`, `rooms`, `evidence`. Empty service state emits
|
||||
no key, preserving original snapshots. Absent sections restore empty only if no
|
||||
world occupancy uses the special kind or `peeping_room.` prefix. Thus removing
|
||||
the section from a current room-bearing save is rejected without a version bump.
|
||||
|
||||
Restore stages the entire section against staged world, path, facilities,
|
||||
construction and ID generator before committing any Runtime state. It checks
|
||||
canonical keys/types, version, duplicate room/evidence identities, deterministic
|
||||
evidence tuple encoding, bounds/geometry, room/occupancy correspondence in both
|
||||
directions, generator high-water mark, known historical facility IDs, present
|
||||
target definition/geometry, loss/stopped coherence, and evidence room/history/time
|
||||
references. Null/present-empty sections are invalid; absence is the only empty
|
||||
encoding. Existing pending command/reference and schema migration checks remain.
|
||||
|
||||
SaveService validates a present section through the same staged service validator,
|
||||
then supplies a shallow copy without this one key to the original purchase-format
|
||||
allowlist. No other keys are removed. The original format 1 (Runtime 1–14),
|
||||
format 2 (Runtime 15), manifest duplicate 15 and MIMI checks remain unchanged.
|
||||
|
||||
## Verification handoff
|
||||
|
||||
Five strict suites cover geometry/corridor, removal/relink, evidence/guards,
|
||||
typed atomic save corruption and physical format 1, and Runtime commands plus
|
||||
physical MIMI format 2. Tests use `var_to_bytes` for whole Runtime atomicity and
|
||||
roundtrip checks. New marker rows carry final test source hashes; prior rows and
|
||||
policy are unchanged. A helper under `tests/special/` is not a discovered suite.
|
||||
|
||||
`tools/run_p13_reference_tests.py` defaults to read-only verification of
|
||||
`$BUILD_OUTPUT_DIR/p13-reference-native`, failing closed without an absolute
|
||||
environment path. Explicit `--output --collect` is for Root only. The strict flag
|
||||
parser rejects abbreviations, repeated flags, positional inputs and `=` aliases.
|
||||
`--prepare-only` is non-native but was not executed by this worker.
|
||||
|
||||
The runner imports the existing P18 core by path. Since its three entry functions
|
||||
hardcode their label and seven/nine counts, a bounded AST adapter changes only
|
||||
protocol/runner identities, those explicit roster cardinalities, and diagnostic
|
||||
labels. It checks the exact adaptation-site counts and fails closed on drift.
|
||||
All confinement, inventory, JSON, sealing, source/engine/marker/policy binding,
|
||||
process, diagnostic, profile and cleanup gates are reused. It neither copies the
|
||||
whole runner nor modifies P18/helpers. The whole selected source map binds both
|
||||
runner sources. Phase count derives from `len(ROSTER) + 2`.
|
||||
|
||||
Roster includes all five new suites and existing construction/world/path/runtime
|
||||
construction, supply migration, transport save, Runtime weather, snapshot
|
||||
serialization, save lifecycle and MIMI purchase suites. Receipts retain
|
||||
`formal_acceptance=false` and `original_unit_complete=false`.
|
||||
|
||||
Root must perform serialized native collection with the allocation/private
|
||||
profile, then registered `p13-reference` validation, a separate actual Opus
|
||||
review, and the final exact-version required regression. Only those steps can
|
||||
establish execution results.
|
||||
|
||||
## Still pending, without invented values
|
||||
|
||||
D04 build/upkeep/build minutes and other product numbers; recorder staffing and
|
||||
natural triggers/rates D04/D08/P16; VIP suite P10-01; D05 transaction decisions
|
||||
(no tick-phase changes here); P19 evidence use and P24 camera UI; normal palette
|
||||
registration/construction/operation and natural production evidence; whole P13
|
||||
acceptance, final review/integration, and applicable native Windows conditions.
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"id": "P13-02-CODE1",
|
||||
"parent_original_delivery_unit": "P13-02",
|
||||
"parent_work": "覗き部屋の対象背面、通路寸断、対象喪失と証拠IDを状態として実装する。",
|
||||
"parent_acceptance": "対象撤去、重複収集、停止、途中保存で状態と参照が整合する。",
|
||||
"original_denominator": {
|
||||
"packages": 30,
|
||||
"units": 88,
|
||||
"formal_complete_at_registration": 14,
|
||||
"partial_credit": false
|
||||
},
|
||||
"whole_parent_acceptance": false,
|
||||
"scope": "Non-graphic state/reference/occupancy/save machinery connected to real Runtime; no sexual depiction, camera content or blackmail action; this registered batch is not the whole original unit.",
|
||||
"authority": [
|
||||
{
|
||||
"ref": "BASELINE:52-53",
|
||||
"text": "Target FRONT VIP room/private room/changing area BACK; occupied room cells cannot be back corridor; recorder collects evidence."
|
||||
},
|
||||
{
|
||||
"ref": "BASELINE:167-174",
|
||||
"text": "VIP suite/public bath/private room explicitly peeping-compatible; restricted behind these target types and cuts back corridor."
|
||||
},
|
||||
{
|
||||
"ref": "BASELINE:199-209",
|
||||
"text": "Peeping room 2x1 BACK. Current public_bath/adult_private_room target definitions exist; missing VIP suite must remain missing, vip_private_salon is not a substitute."
|
||||
}
|
||||
],
|
||||
"implementation_requirements": [
|
||||
"Introduce separate PeepingRoomService, bounded real Runtime wiring; no whole runtime rewrite.",
|
||||
"Validate 2x1 BACK footprint entirely behind one allowed completed FRONT target, integrate existing construction/world occupancy rules; reject wrong layer, partial/multi-target overlap, unknown/missing/incomplete target and corridor conflicts.",
|
||||
"Stable room/target identity with target removal/loss detection; reconstructed different target is not silently the old identity; explicit validated relink only, preserving stopped/no-auto-resume rules.",
|
||||
"Idempotent evidence IDs bound to stable room/target/source event key; replay cannot duplicate or alias another target. Opaque state records only.",
|
||||
"Collection rejects stopped/no-power/closed/under-construction/lost-target cases; do not create undefined natural trigger/rate/staffing eligibility.",
|
||||
"Versioned Runtime snapshot section; genuinely legacy absent section migrates empty; current-schema missing/malformed/unknown/wrong-reference/duplicate data reject atomically with original whole Runtime untouched. Preserve all existing schema migrations and pending references.",
|
||||
"No free production placement, bypassed build costs or arbitrary content-event injection exposed through new commands. Unknown build/upkeep/staff/collection values remain unset and unavailable; backend tests may use clearly labeled controlled fixtures. Normal palette registration and naturally collected production evidence are pending. Define command preconditions precisely; construction costs/definition and recorder eligibility cannot be silently invented.",
|
||||
"Reuse existing guarded native harness logic for a strict narrow runner and add new test marker registrations without weakening prior marker/policy behavior. Do not rerun full regression during implementation."
|
||||
],
|
||||
"required_local_coverage": [
|
||||
"public_bath and adult_private_room valid geometry; VIP unavailable not substituted",
|
||||
"wrong FRONT, partial/multiple target footprint, incomplete/missing target; corridor/path occupancy conflict/disconnection",
|
||||
"target demolition/loss, rebuild different identity, explicit relink; reject collection after removal",
|
||||
"same event replay one evidence ID; different room/target keys distinct and stable",
|
||||
"stopped/no-power/closed/under-construction collection rejection",
|
||||
"roundtrip exact typed state; legacy absence; current missing/malformed version/references/duplicates atomic unchanged",
|
||||
"Runtime command/removal/save integration; existing construction/world/path/supply-save/transport-save/weather migrations impact coverage"
|
||||
],
|
||||
"pending_not_invented": [
|
||||
"D04 build/upkeep/build_minutes and related numbers",
|
||||
"recorder role staffing and natural collection trigger/rate D04/D08/P16",
|
||||
"VIP suite P10-01",
|
||||
"D05 unresolved transaction rules; no tick-phase changes",
|
||||
"P19 use of evidence and P24 camera UI",
|
||||
"normal construction/operation/full parent acceptance, final whole review and applicable Windows conditions"
|
||||
],
|
||||
"workflow": [
|
||||
"Actual Opus commander confirms registered run and model; Runner worker only edits allowed paths.",
|
||||
"Worker static/local preparation only; Root owns serialized native collection in allocation build with private profile and guarded process/cleanup receipts.",
|
||||
"Registered validation reads/verifies complete native evidence, exact current selected source and marker/policy/engine/input/environment binding. Zero exit alone is not acceptance.",
|
||||
"Separate actual Opus review, final exact-version required regression and ordinary integration/final; any backend completion never adds parent original-unit credit."
|
||||
],
|
||||
"model_proposal": {
|
||||
"codex": "gpt-6.1-sol",
|
||||
"selected_by_actual_opus_run": "e65d48f5a7294378a81bb58dea00c605"
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"actual_suites": 184,
|
||||
"missing_marker_paths": [],
|
||||
"remaining_unexecuted_tests": [],
|
||||
"available_marker_checks": 21903,
|
||||
"actual_all_roster_checks": 21903,
|
||||
"strict_accepted_checks": 21903,
|
||||
"verified": true,
|
||||
"composed": true,
|
||||
"original_full_attempt_passed": false,
|
||||
"whole_original_acceptance": false,
|
||||
"parse_checks": 329,
|
||||
"setup_phases": 2,
|
||||
"owned_ended": 186,
|
||||
"tested_source": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"engines_started": 0,
|
||||
"verifier_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a"
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"controller_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a",
|
||||
"harness_sha256": "744177b243fb97ff7ad954880a433acf6a9b879c06d4ee51cfe02ed95be29422",
|
||||
"cases": [
|
||||
{
|
||||
"case": "copytree string arguments create separate byte-exact support files",
|
||||
"expected": "accept",
|
||||
"actual": "accept"
|
||||
},
|
||||
{
|
||||
"case": "exact whole private-profile move and readback",
|
||||
"expected": "accept",
|
||||
"actual": "accept"
|
||||
},
|
||||
{
|
||||
"case": "absent empty startup profile explicitly retained",
|
||||
"expected": "accept",
|
||||
"actual": "accept"
|
||||
},
|
||||
{
|
||||
"case": "reject unowned profile name",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "reject valid nonce at wrong canonical location",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "reject changed original profile",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "reject undeclared profile member",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "reject profile symlink",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "reject existing retention destination",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "large profile lossless compression entire readback",
|
||||
"expected": "accept",
|
||||
"actual": "accept"
|
||||
},
|
||||
{
|
||||
"case": "reject compressed bytes changed",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "reject incomplete compressed member manifest",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
},
|
||||
{
|
||||
"case": "reject invalid archive hash",
|
||||
"expected": "reject",
|
||||
"actual": "reject"
|
||||
}
|
||||
],
|
||||
"passed": true,
|
||||
"native_engines_started": 0
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"task_id": "P13-02-CODE1",
|
||||
"commit": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"status": "pass",
|
||||
"summary": "判定: pass。ただし対象は登録済みの限定バックエンド CODE1 のみです。親の P13-02 は完了していないままで、30/88・formal 14/88 の分母にも加算しません。\n\n【実装の照合(仕様のすべての要件・カバレッジ項目と突き合わせ)】\n- 構成: PeepingRoomService を独立サービスとして追加し、Runtime 側の接続は限定的です。\n - 生成と読み込みのたびに構成し直し、施設登録解除と解体の両方で接続しています。\n - コマンドは validate / place / relink / record_evidence の4種で、通常の実行キューを通ります。\n- 配置判定: 2x1 の BACK 配置が、許可された完成済み FRONT 対象1つの真裏に完全に収まるかを検査します。\n - 拒否理由を網羅しています: 層違い、形状違い、範囲外、未掘削、建設中、対象なし、部分重なり、複数対象、対象不一致、不明対象、許可外対象、通路衝突(World の歩行可否と Path の両方で判定)、BACK 占有済み。\n - vip_suite は PENDING_P10_01 として扱い、vip_private_salon を代用に使わないことを確認しました。\n- 対象の同一性:\n - 撤去すると TARGET_LOST になり、停止状態に固定されます。\n - 同じ位置に再建すると別の ID になり、自動で再リンクしません。\n - 明示的な relink は配置判定をすべてやり直し、停止状態(RELINKED_PENDING_RESUME)のまま残ります。\n - target_history に過去の対象 ID を残すため、既存の証拠が孤立しません。\n- 証拠 ID: (room, target, source_event_key) を長さ付き UTF-8 の hex で符号化しており、単射です。\n - 同じイベントの再実行は同一 ID を返し、記録は増えません。\n - 部屋や対象が違えば ID も別になり、取り違えは起きません。\n- 本番経路の封じ込め:\n - 本番の記録は RECORDER_ELIGIBILITY_PENDING_D04_D08_P16 で拒否され、台帳を変えません。\n - place は BUILD_DEFINITION_PENDING_D04 を返すだけです。テストで、ドメインイベントの受領が1件だけ発行され、それ以外の ID とドメインデータが変わらないことを確認しています。\n - CONTROLLED_FIXTURE 用のメソッドは公開コマンドやパレットから呼べません。\n - 停止中 / 無電力 / 閉店 / 建設中 / 対象喪失 の各ケースで収集を拒否します。\n- 保存:\n - Runtime のバージョンは 14 / 15 のままで、format2 は MIMI15 の場合だけです。\n - 新セクションは任意キーで、空のときは出力しません。セクションのない本物の旧形式セーブは空として移行します。\n - 現行形式で不正なものは全体をそのまま保ったまま原子的に拒否し、元の Runtime を壊しません。対象は、セクション欠落 / null / バージョン / 未知キー / 重複 / 参照不正 / 時刻 / ID 上限 / 型 / 孤立占有、およびその逆方向の不整合で、テストの18変異ケースと孤立ケースで確認しています。\n - SaveService は同じ検証器を通したうえで、購入用の許可キー一覧を元のまま維持しています。\n\n【検証証跡】\n- 登録済みの p13-reference 検証は exit 0 で通過しています(narrow 15 スイート / 863 チェック / 構文 329 / 終了 17)。\n- 全体の 184 スイート / 21903 チェックは合成検証です。\n - 構成: 元の通し実行は ENOSPC で失敗しており、失敗のまま残っています。その前半58スイートを再検証し、後半126スイートを実際に実行した結果を組み合わせたものです。\n - 結果: 読み取り専用の集計で verified / composed=true(ネイティブ終了 186 件、すべて一意)を、元の通し実行と対象コミットに紐付いた記録で確認しました。\n- 自己申告だけに依拠していません。\n\n【残る後続ゲート】\n- 最終版でのリグレッション、通常の統合と最終確定。\n- D04 / D08 / P16 の数値、記録係の配置、自然な収集トリガー、VIP(P10-01)、P19 / P24、通常のパレット登録、Windows 条件。",
|
||||
"acceptance_ids": [
|
||||
"P13-02-CODE1"
|
||||
],
|
||||
"findings": [
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "create_snapshot は対象喪失を正規化しません(detect_target_loss は収集時にだけ遅延実行されます)。そのため、シグナルを経ずに対象が消えた場合は LINKED の部屋が残ります。こうして書かれたセーブは restore_section の配置判定で全体が拒否され、読み込めなくなります。現状、そのような経路は確認できませんでした(facility_service.restore_snapshot はシグナルを出さず、ロールバックは既存の対象を消しません)。ただし、スナップショット生成時に正規化するか、後続で防御策を入れることを推奨します。"
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "Runtime の schema バージョンが 5 未満(v1〜4)の旧形式に special_peeping_rooms があっても拒否されず、検証を通れば受理されます。仕様の「本物の旧形式はセクションなし」に照らすと、偽装された旧ペイロードを受け入れる余地がわずかにあります。中身は restore_section で厳密に検証されるため、実害は小さいと判断します。"
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "施設の寸法移行(prepare_facility_dimension_snapshot)で public_bath / adult_private_room の占有セルが変わると、LINKED の部屋の再検証に失敗し、移行全体が拒否されます。現在の部屋はテスト用フィクスチャでしか作れないため影響は限定的です。後続の本番配置の実装時に扱いを決める必要があります。"
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "「建設中なら収集を拒否」の分岐は、本番状態では到達できません。テストは ConstructionService を差し替えて確認しており、意味上の網羅としては人工的です。配置判定も、建物定義(D04)が未定のため construction_service.validate_placement(支持・重量の判定)を使っていません。いずれも仕様の「未定値を発明しない」範囲内として許容しますが、記録に残します。"
|
||||
}
|
||||
]
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"passed": true,
|
||||
"error": null,
|
||||
"ended_unix_ns": 1792230973546897000,
|
||||
"controller_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a",
|
||||
"owner_runner_pid": 92258,
|
||||
"original_full_attempt_passed": false,
|
||||
"whole_original_acceptance": false
|
||||
}
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"source": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"original_import_and_parse_passed": 2,
|
||||
"reusable_suites": 58,
|
||||
"raw057_qualified_after_archival_recovery": true,
|
||||
"original_owned_ended_pids": [
|
||||
73903,
|
||||
73987,
|
||||
74026,
|
||||
74052,
|
||||
74079,
|
||||
74092,
|
||||
74125,
|
||||
74151,
|
||||
74171,
|
||||
74194,
|
||||
74212,
|
||||
74236,
|
||||
74256,
|
||||
74284,
|
||||
74327,
|
||||
74632,
|
||||
75319,
|
||||
75331,
|
||||
75368,
|
||||
75392,
|
||||
75429,
|
||||
75453,
|
||||
75466,
|
||||
75555,
|
||||
75577,
|
||||
75603,
|
||||
75619,
|
||||
75654,
|
||||
75687,
|
||||
75932,
|
||||
76254,
|
||||
76409,
|
||||
76434,
|
||||
76455,
|
||||
76480,
|
||||
76487,
|
||||
76566,
|
||||
76851,
|
||||
76898,
|
||||
76931,
|
||||
76945,
|
||||
76973,
|
||||
76989,
|
||||
77012,
|
||||
77035,
|
||||
77087,
|
||||
77108,
|
||||
77120,
|
||||
77143,
|
||||
77158,
|
||||
77179,
|
||||
77206,
|
||||
77240,
|
||||
77253,
|
||||
77277,
|
||||
77297,
|
||||
77325,
|
||||
77340,
|
||||
77364,
|
||||
77382
|
||||
],
|
||||
"original_checks": 10991,
|
||||
"remaining_suites": 126,
|
||||
"engine_runs": 0,
|
||||
"whole_original_acceptance": false,
|
||||
"original_full_attempt_passed": false,
|
||||
"controller_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a",
|
||||
"free_bytes": 4484616192,
|
||||
"admission_required_bytes": 3467374666,
|
||||
"root_owner_pid": 92258,
|
||||
"run_id": "52bfe67d08e54acd9478d74d5b030293",
|
||||
"started_unix_ns": 1792229968318418000,
|
||||
"original_input_sha256": "24d10b3a91553df54b3b2fd4b1a57dce683cc72a55576e0c73c9e142b335ad40"
|
||||
}
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
{
|
||||
"at_jst": "2026-10-17T19:05:57.762697+09:00",
|
||||
"plan_id": "P13-02",
|
||||
"batch": "P13-02-CODE1",
|
||||
"S": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"original_packages": 30,
|
||||
"original_units": 88,
|
||||
"formally_completed": 14,
|
||||
"new_credit": 0,
|
||||
"normal_validation": "passed; exact S narrow15/863/329parse/17nativeended",
|
||||
"actual_full": {
|
||||
"actual_suites": 184,
|
||||
"missing_marker_paths": [],
|
||||
"remaining_unexecuted_tests": [],
|
||||
"available_marker_checks": 21903,
|
||||
"actual_all_roster_checks": 21903,
|
||||
"strict_accepted_checks": 21903,
|
||||
"verified": true,
|
||||
"composed": true,
|
||||
"original_full_attempt_passed": false,
|
||||
"whole_original_acceptance": false,
|
||||
"parse_checks": 329,
|
||||
"setup_phases": 2,
|
||||
"owned_ended": 186,
|
||||
"tested_source": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"engines_started": 0,
|
||||
"verifier_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a"
|
||||
},
|
||||
"formal_review": {
|
||||
"state": "terminal_pass",
|
||||
"run_id": "ead8e74b9683404d8cf3d97bca118726",
|
||||
"model": "claude-opus-5-5",
|
||||
"critical_high_medium": 0,
|
||||
"low": 4,
|
||||
"artifact": "ACTUAL_INDEPENDENT_OPUS_REVIEW.json"
|
||||
},
|
||||
"normal_integration_candidate": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"source_on_main": true,
|
||||
"remaining_conditions": [
|
||||
"Whole original P13-02 normal construction/recorder/natural triggers/approved quantities/VIP/UI/assets/Windows and all original conditions remain unaccepted; CODE1 has no new original-unit credit",
|
||||
"Four low severity future-production defensive/migration/coverage observations retained from actual Opus review; no observed ordinary production path and no critical/high/medium finding",
|
||||
"P04-01 remains next original formal closure when existing D05 owner choices arrive; independent next original-unit selection will be requested from actual Opus"
|
||||
],
|
||||
"evidence": [
|
||||
{
|
||||
"path": "ACTUAL_AGGREGATE_READONLY_VERIFICATION.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-full-composed-readonly-verification-a7e3069.json",
|
||||
"bytes": 562,
|
||||
"sha256": "3a8be9f92c76d14dc1c9f6d387fad8e939d0d333a6f8d5903b53b8fc44ef584b"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_SUFFIX_INPUT.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-full-continuation-a7/controller-input.json",
|
||||
"bytes": 1401,
|
||||
"sha256": "81c3dcfdd092fde977c158482310f164a727a73dabea698e18807eeb585d4937"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_SUFFIX_ENDED.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-full-continuation-a7/controller-ended.json",
|
||||
"bytes": 277,
|
||||
"sha256": "b0759724f65175e01822b94ee731b3b9574c5098b82ce931e73e087fc5a89c65"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_CONTINUATION_CONTROLS.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-full-continuation-a7/CONTINUATION_STORAGE_CONTROLS.json",
|
||||
"bytes": 1846,
|
||||
"sha256": "96f47033ef95614426cb8646f7a4fbfedcb5af6bd95a0ab1e54a802d3eed77a6"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_INDEPENDENT_OPUS_REVIEW.json",
|
||||
"actual_original": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/ead8e74b9683404d8cf3d97bca118726/result.json",
|
||||
"bytes": 6753,
|
||||
"sha256": "cc12bb1011da2f3a21018da8fdde966a13e70dcf33ef7c83310dcf0ca08f4ec8"
|
||||
},
|
||||
{
|
||||
"path": "FORMAL_VALIDATION.json",
|
||||
"actual_original": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/6df11a390bc44b48a10c916cbeab95c9-validation.json",
|
||||
"bytes": 380,
|
||||
"sha256": "d9e73b97bb173a75931a0263119ff6430a2049e204ca459fbb53ca04b8aa0e4a"
|
||||
},
|
||||
{
|
||||
"path": "FORMAL_INTEGRATION.json",
|
||||
"actual_original": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/562e2bb9ca8b4f458d0cc011edd41cc4-integration.json",
|
||||
"bytes": 381,
|
||||
"sha256": "513ab79bd5fadafb929d5ad3201a8e9d5ff0e826eda37a80c831d82327940d8e"
|
||||
},
|
||||
{
|
||||
"path": "FORMAL_FINAL.json",
|
||||
"actual_original": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/45fdaf3b82c84e1485ad0d4cc7bf993c-final.json",
|
||||
"bytes": 375,
|
||||
"sha256": "213af13d38587ff108802fc96f6c410af6e9bf66ab6bb683963af62d36ecae2f"
|
||||
},
|
||||
{
|
||||
"path": "RUNNER_COMPLETED_TRACEABILITY.json",
|
||||
"actual_original": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/traceability/P13-02-CODE1.json",
|
||||
"bytes": 3697,
|
||||
"sha256": "c11f2f390bfe3222dc4e955fb001878ba5db03deafd1b85534299da758354250"
|
||||
},
|
||||
{
|
||||
"path": "EXACT_INTEGRATED_FULL_REUSE_QUALIFICATION.json",
|
||||
"actual_original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/coordinator-start-20261017/EXACT_C65F07B_FULL_REUSE_QUALIFICATION.json",
|
||||
"bytes": 1487,
|
||||
"sha256": "b5c4f52638b34be0c95030486560d1ce8ed83f48e855a2fddfef528e6e635721"
|
||||
}
|
||||
],
|
||||
"next_formal_original_unit": "P04-01 pending existing real-owner D05 choices; no duplicate request or fabricated approval",
|
||||
"backend_batch_state": "completed",
|
||||
"normal_main_base": "191ea3b4d1289144d8d31096f50fbd71435656c9",
|
||||
"normal_final": {
|
||||
"passed": true,
|
||||
"commit": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"artifact": "FORMAL_FINAL.json"
|
||||
},
|
||||
"whole_original_acceptance": false
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"S": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"C": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"M": "191ea3b4d1289144d8d31096f50fbd71435656c9",
|
||||
"candidate_worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/P13-02-CODE1-integration-15cc1271",
|
||||
"whole_selected_source_files": 1368,
|
||||
"all_source_settings_assets_test_inputs_helpers_byte_equal": true,
|
||||
"marker_policy_engine_roster_parse_default_player_equal": true,
|
||||
"full_evidence_reuse_qualified": true,
|
||||
"original_full_attempt_passed": false,
|
||||
"whole_original_acceptance": false,
|
||||
"aggregate": {
|
||||
"actual_suites": 184,
|
||||
"missing_marker_paths": [],
|
||||
"remaining_unexecuted_tests": [],
|
||||
"available_marker_checks": 21903,
|
||||
"actual_all_roster_checks": 21903,
|
||||
"strict_accepted_checks": 21903,
|
||||
"verified": true,
|
||||
"composed": true,
|
||||
"original_full_attempt_passed": false,
|
||||
"whole_original_acceptance": false,
|
||||
"parse_checks": 329,
|
||||
"setup_phases": 2,
|
||||
"owned_ended": 186,
|
||||
"tested_source": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"engines_started": 0,
|
||||
"verifier_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a"
|
||||
},
|
||||
"actual_independent_review": "ead8e74b9683404d8cf3d97bca118726",
|
||||
"critical_high_medium": 0,
|
||||
"low_findings": 4,
|
||||
"ownership_authority": "Existing explicit human main-update and commit/push permission only; no new SHA-specific human speech is claimed",
|
||||
"time_ns": 1792231367426496000
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"task_id": "P13-02-CODE1",
|
||||
"commit": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"kind": "final",
|
||||
"checks": [
|
||||
{
|
||||
"id": "p13-reference",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/2add11628b67481495b3782fa64dee52",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"task_id": "P13-02-CODE1",
|
||||
"commit": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"kind": "integration",
|
||||
"checks": [
|
||||
{
|
||||
"id": "p13-reference",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/19d3100d61564e3c9878624d2d8ea496",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"task_id": "P13-02-CODE1",
|
||||
"commit": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"kind": "validation",
|
||||
"checks": [
|
||||
{
|
||||
"id": "p13-reference",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/339d1c3cc94648aa94b00a750a5fa5ce",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"source_review": "ead8e74b9683404d8cf3d97bca118726",
|
||||
"scope": "Future normal production unlock and dimension-migration defensive handling; no mandatory CODE1 gate remains, parent P13-02 incomplete",
|
||||
"findings": [
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "create_snapshot は対象喪失を正規化しません(detect_target_loss は収集時にだけ遅延実行されます)。そのため、シグナルを経ずに対象が消えた場合は LINKED の部屋が残ります。こうして書かれたセーブは restore_section の配置判定で全体が拒否され、読み込めなくなります。現状、そのような経路は確認できませんでした(facility_service.restore_snapshot はシグナルを出さず、ロールバックは既存の対象を消しません)。ただし、スナップショット生成時に正規化するか、後続で防御策を入れることを推奨します。"
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "Runtime の schema バージョンが 5 未満(v1〜4)の旧形式に special_peeping_rooms があっても拒否されず、検証を通れば受理されます。仕様の「本物の旧形式はセクションなし」に照らすと、偽装された旧ペイロードを受け入れる余地がわずかにあります。中身は restore_section で厳密に検証されるため、実害は小さいと判断します。"
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "施設の寸法移行(prepare_facility_dimension_snapshot)で public_bath / adult_private_room の占有セルが変わると、LINKED の部屋の再検証に失敗し、移行全体が拒否されます。現在の部屋はテスト用フィクスチャでしか作れないため影響は限定的です。後続の本番配置の実装時に扱いを決める必要があります。"
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "「建設中なら収集を拒否」の分岐は、本番状態では到達できません。テストは ConstructionService を差し替えて確認しており、意味上の網羅としては人工的です。配置判定も、建物定義(D04)が未定のため construction_service.validate_placement(支持・重量の判定)を使っていません。いずれも仕様の「未定値を発明しない」範囲内として許容しますが、記録に残します。"
|
||||
}
|
||||
]
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"contract": {
|
||||
"id": "P13-02-CODE1",
|
||||
"title": "P13-02 背面対象参照・占有・保存の非描写機構(全原成果の一部、加算なし)",
|
||||
"requirement_ids": [
|
||||
"P13-02"
|
||||
],
|
||||
"acceptance_ids": [
|
||||
"P13-02-CODE1"
|
||||
],
|
||||
"spec_ref": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
|
||||
"base_commit": "1e8d4ea88876865a72547ff0edf43ed5b0e74c7e",
|
||||
"worker": "codex",
|
||||
"allowed_paths": [
|
||||
"scripts/special/peeping_room_service.gd",
|
||||
"autoload/simulation_runtime.gd",
|
||||
"scripts/core/save_service.gd",
|
||||
"tests/special/**",
|
||||
"tools/run_p13_reference_tests.py",
|
||||
"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p13-02/**"
|
||||
],
|
||||
"depends_on": [],
|
||||
"resource_locks": [
|
||||
"runtime-save-schema",
|
||||
"special-target-reference",
|
||||
"p13-reference-tests"
|
||||
],
|
||||
"validation_ids": [
|
||||
"p13-reference"
|
||||
],
|
||||
"max_repair_attempts": null,
|
||||
"spec_sha256": "8ea65f2eefedc772c08170186f5cd03ac017432f4b069ade4f9210d4215c2d43"
|
||||
},
|
||||
"implementation_commit": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"integration_commit": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"owner": "このチャットのユーザーによる既存の明示指示「mainの更新を明示的に許可します」「コミットすべき内容をコミットして。その上でpushして」に基づく継続許可。対象は全条件レビュー合格の登録CODE1と、この実C/M。新たなSHA指定の人間発言は主張しない。原P13-02の完了加算なし。",
|
||||
"evidence": [
|
||||
{
|
||||
"id": 1,
|
||||
"task_id": "P13-02-CODE1",
|
||||
"kind": "validation",
|
||||
"commit_sha": "e930a1dedff7ab4c4a94d274a2e0c55fc2b95829",
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/212e4352722a442990b6fe923abe8f84-validation.json",
|
||||
"passed": 0
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"task_id": "P13-02-CODE1",
|
||||
"kind": "validation",
|
||||
"commit_sha": "27fc5f05442ca3a2b0986a976b303cf0ef675f66",
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/5526523400ff41b6aeacd0d6f8ffd9b9-validation.json",
|
||||
"passed": 0
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"task_id": "P13-02-CODE1",
|
||||
"kind": "validation",
|
||||
"commit_sha": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/6df11a390bc44b48a10c916cbeab95c9-validation.json",
|
||||
"passed": 1
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"task_id": "P13-02-CODE1",
|
||||
"kind": "review",
|
||||
"commit_sha": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/ead8e74b9683404d8cf3d97bca118726/result.json",
|
||||
"passed": 1
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"task_id": "P13-02-CODE1",
|
||||
"kind": "integration",
|
||||
"commit_sha": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/562e2bb9ca8b4f458d0cc011edd41cc4-integration.json",
|
||||
"passed": 1
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"task_id": "P13-02-CODE1",
|
||||
"kind": "final",
|
||||
"commit_sha": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/45fdaf3b82c84e1485ad0d4cc7bf993c-final.json",
|
||||
"passed": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
+10226
File diff suppressed because it is too large
Load Diff
+4945
File diff suppressed because it is too large
Load Diff
+209
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"scripts/special/peeping_room_service.gd.uid": {
|
||||
"owner": "scripts/special/peeping_room_service.gd",
|
||||
"owner_sha256": "4dc02bc99f081d63a2518f69c960397d778d577b93d87d57bcac29bc6f108531",
|
||||
"file_type": "regular",
|
||||
"bytes": 20,
|
||||
"raw_bytes": [
|
||||
117,
|
||||
105,
|
||||
100,
|
||||
58,
|
||||
47,
|
||||
47,
|
||||
98,
|
||||
105,
|
||||
51,
|
||||
54,
|
||||
102,
|
||||
118,
|
||||
112,
|
||||
49,
|
||||
106,
|
||||
105,
|
||||
105,
|
||||
105,
|
||||
118,
|
||||
10
|
||||
],
|
||||
"sha256": "3f045afc3c140886c70ec8494d6dcb012e6da645e8a3ff3c6488442ce63a9353",
|
||||
"text": "uid://bi36fvp1jiiiv\n"
|
||||
},
|
||||
"tests/special/peeping_room_fixture.gd.uid": {
|
||||
"owner": "tests/special/peeping_room_fixture.gd",
|
||||
"owner_sha256": "0243b1d35e1fdd8aa085894a0ce1e5cd1a189e5c98fcb859f81b70ae75b98bed",
|
||||
"file_type": "regular",
|
||||
"bytes": 20,
|
||||
"raw_bytes": [
|
||||
117,
|
||||
105,
|
||||
100,
|
||||
58,
|
||||
47,
|
||||
47,
|
||||
98,
|
||||
48,
|
||||
99,
|
||||
51,
|
||||
111,
|
||||
117,
|
||||
117,
|
||||
113,
|
||||
52,
|
||||
50,
|
||||
121,
|
||||
99,
|
||||
103,
|
||||
10
|
||||
],
|
||||
"sha256": "a74e5ef6d8959826919a648e8b5d82e96d1c73ff22cd6c1f216be8b5c4060a8a",
|
||||
"text": "uid://b0c3ouuq42ycg\n"
|
||||
},
|
||||
"tests/special/test_peeping_room_evidence.gd.uid": {
|
||||
"owner": "tests/special/test_peeping_room_evidence.gd",
|
||||
"owner_sha256": "390e0032d14de9a8875ced163a922341ce655744200d78b4ffa776d42c4f8c2a",
|
||||
"file_type": "regular",
|
||||
"bytes": 20,
|
||||
"raw_bytes": [
|
||||
117,
|
||||
105,
|
||||
100,
|
||||
58,
|
||||
47,
|
||||
47,
|
||||
100,
|
||||
102,
|
||||
116,
|
||||
115,
|
||||
107,
|
||||
121,
|
||||
49,
|
||||
51,
|
||||
112,
|
||||
101,
|
||||
48,
|
||||
117,
|
||||
106,
|
||||
10
|
||||
],
|
||||
"sha256": "26bbc1435bcda963b5866327b887096f798b1629c7984768c85bfb6175648ec5",
|
||||
"text": "uid://dftsky13pe0uj\n"
|
||||
},
|
||||
"tests/special/test_peeping_room_geometry.gd.uid": {
|
||||
"owner": "tests/special/test_peeping_room_geometry.gd",
|
||||
"owner_sha256": "103d85f83e1e97a8637892504264275eef23f172eeec56c94e5c022d81bf6945",
|
||||
"file_type": "regular",
|
||||
"bytes": 19,
|
||||
"raw_bytes": [
|
||||
117,
|
||||
105,
|
||||
100,
|
||||
58,
|
||||
47,
|
||||
47,
|
||||
52,
|
||||
114,
|
||||
52,
|
||||
48,
|
||||
102,
|
||||
49,
|
||||
107,
|
||||
112,
|
||||
106,
|
||||
109,
|
||||
118,
|
||||
106,
|
||||
10
|
||||
],
|
||||
"sha256": "391b78806bc0bf759f00c778cb25dfaa97d47f6e309c3b302412c38123c5440c",
|
||||
"text": "uid://4r40f1kpjmvj\n"
|
||||
},
|
||||
"tests/special/test_peeping_room_reference.gd.uid": {
|
||||
"owner": "tests/special/test_peeping_room_reference.gd",
|
||||
"owner_sha256": "188b00a60f7aefda69dc4973f1de9c14447a0d4bcdd1257a2eabe7c4782e4caf",
|
||||
"file_type": "regular",
|
||||
"bytes": 20,
|
||||
"raw_bytes": [
|
||||
117,
|
||||
105,
|
||||
100,
|
||||
58,
|
||||
47,
|
||||
47,
|
||||
99,
|
||||
110,
|
||||
110,
|
||||
111,
|
||||
110,
|
||||
53,
|
||||
119,
|
||||
111,
|
||||
117,
|
||||
102,
|
||||
117,
|
||||
114,
|
||||
112,
|
||||
10
|
||||
],
|
||||
"sha256": "db8bfa98b7943dba15858ccaa6681bc430efd43f40f57de99117dc19c51ac417",
|
||||
"text": "uid://cnnon5woufurp\n"
|
||||
},
|
||||
"tests/special/test_peeping_room_runtime.gd.uid": {
|
||||
"owner": "tests/special/test_peeping_room_runtime.gd",
|
||||
"owner_sha256": "924efd34414c12a325a1b700f799aef0396de9f15441fd88a3608292ff221657",
|
||||
"file_type": "regular",
|
||||
"bytes": 19,
|
||||
"raw_bytes": [
|
||||
117,
|
||||
105,
|
||||
100,
|
||||
58,
|
||||
47,
|
||||
47,
|
||||
52,
|
||||
110,
|
||||
53,
|
||||
119,
|
||||
101,
|
||||
108,
|
||||
113,
|
||||
102,
|
||||
104,
|
||||
100,
|
||||
113,
|
||||
103,
|
||||
10
|
||||
],
|
||||
"sha256": "b742bb8e4077f111e0f7b4d9039261a06fe6deaad8ea308ba3b89c7b5a4a9069",
|
||||
"text": "uid://4n5welqfhdqg\n"
|
||||
},
|
||||
"tests/special/test_peeping_room_save.gd.uid": {
|
||||
"owner": "tests/special/test_peeping_room_save.gd",
|
||||
"owner_sha256": "ba0e7644277477c1821135cae6d6fd533651799c6f9bd8c43ccf45e63b96c63c",
|
||||
"file_type": "regular",
|
||||
"bytes": 19,
|
||||
"raw_bytes": [
|
||||
117,
|
||||
105,
|
||||
100,
|
||||
58,
|
||||
47,
|
||||
47,
|
||||
56,
|
||||
117,
|
||||
121,
|
||||
116,
|
||||
109,
|
||||
112,
|
||||
106,
|
||||
117,
|
||||
112,
|
||||
56,
|
||||
113,
|
||||
52,
|
||||
10
|
||||
],
|
||||
"sha256": "005561b37df9051e618d4714b2a91a82f4a48ec63c841cdf27c251bcd2865505",
|
||||
"text": "uid://8uytmpjup8q4\n"
|
||||
}
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"S": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"argv": [
|
||||
"/Users/korizatou114/Antigravity/\u74b0\u5883\u69cb\u7bc9/agent-control/.venv/bin/python",
|
||||
"-B",
|
||||
"tests/special/test_p13_uid_policy.py"
|
||||
],
|
||||
"started_unix_ns": 1792225317277353000,
|
||||
"ended_unix_ns": 1792225317417668000,
|
||||
"exit_code": 0,
|
||||
"stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"stderr_sha256": "c8904f75939074499eaa0d8a5add9f1fd5007a4e4e5e75cc9b1ce324d8f4b69c"
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
.......
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.053s
|
||||
|
||||
OK
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"at_jst": "2026-10-17T17:28:02.473746+09:00",
|
||||
"plan_id": "P13-02",
|
||||
"batch": "P13-02-CODE1",
|
||||
"original_packages": 30,
|
||||
"original_units": 88,
|
||||
"formally_completed": 14,
|
||||
"new_credit": 0,
|
||||
"S": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"source_backup_branch": "codex/p13-02-reference",
|
||||
"source_on_main": false,
|
||||
"normal_integration_candidate": null,
|
||||
"runner_state_after_registered_validation": "review_pending",
|
||||
"repairs": 4,
|
||||
"max_repairs": null,
|
||||
"implementation_models": "Astra selected by Opus for coupled save schema; Sol selected by Opus for UID policy and exact queue-event oracle corrections",
|
||||
"actual_narrow": {
|
||||
"suites": 15,
|
||||
"checks": 863,
|
||||
"parse_files": 329,
|
||||
"phases": 17,
|
||||
"actual_PIDs": [
|
||||
63523,
|
||||
63619,
|
||||
63653,
|
||||
63684,
|
||||
63709,
|
||||
63723,
|
||||
63751,
|
||||
63773,
|
||||
63789,
|
||||
63815,
|
||||
63830,
|
||||
63854,
|
||||
63870,
|
||||
63896,
|
||||
63919,
|
||||
63933,
|
||||
63993
|
||||
],
|
||||
"passed": true,
|
||||
"all_owned_engines_ended": true,
|
||||
"guard_errors": [],
|
||||
"cleanup_errors": [],
|
||||
"finite_UID_set": 7,
|
||||
"game_body_changed_by_latest_fix": false
|
||||
},
|
||||
"test_oracle_correction": "Direct rejected placement full typed Runtime unchanged; queued placement keeps world/economy/room/non-event IDs unchanged and verifies exactly1 COMMAND_FAILED domain-event ID/cause receipt. No blanket normalization or event suppression.",
|
||||
"current_next_gate": "Full standard regression with finite native UID metadata extension must preserve all standard generated-report/audio/diagnostic/process/profile/source/marker gates; actual Opus plan requested before collection, formal independent review then ordinary integration/final remain.",
|
||||
"whole_original_unit": "not accepted; pending ordinary construction/recorder/natural collection triggers/approved values/VIP/UI/content/Windows and all P13 conditions unchanged",
|
||||
"P04_priority": "Next formal closure P04-01, existing D05 questions pending, no repeated questions or fake approval",
|
||||
"previous_failures_retained": [
|
||||
"p13-reference-native-e930a1d-import-failed",
|
||||
"p13-reference-native-uid-corrected-27fc5f0-runtime-failed"
|
||||
],
|
||||
"evidence": [
|
||||
{
|
||||
"path": "ACTUAL_NATIVE_ENDED.json",
|
||||
"actual_original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native-uid-corrected/runner-ended.json",
|
||||
"bytes": 469751,
|
||||
"sha256": "4694cc13c0e0c309adf1f5c3c3885fc2d54efa8dc8ec63319ce016e48d2d66a5"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_NATIVE_INPUT.json",
|
||||
"actual_original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native-uid-corrected/runner-input.json",
|
||||
"bytes": 320481,
|
||||
"sha256": "c899b3463fdc8925a98f5dd288eea5cca1d41b3591bc17d29394ec90da0b1094"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_RETAINED_UIDS.json",
|
||||
"actual_original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native-uid-corrected/accepted-uids.json",
|
||||
"bytes": 4198,
|
||||
"sha256": "6a6987d53b93387aaa0f8cae268c96eb4bf326fa4599eea4e837af00384e3c38"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_STATIC_UID_CONTROLS.json",
|
||||
"actual_original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/audit-support/p13-root-native-a7e3069/static-uid-controls.json",
|
||||
"bytes": 493,
|
||||
"sha256": "d9f4acac3e7f0ed869ece76bc5ef3e9dbe96314e893f1d7a2081a39d97b66053"
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_STATIC_UID_STDERR.log",
|
||||
"actual_original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/audit-support/p13-root-native-a7e3069/static-uid-controls.stderr.log",
|
||||
"bytes": 105,
|
||||
"sha256": "c8904f75939074499eaa0d8a5add9f1fd5007a4e4e5e75cc9b1ce324d8f4b69c"
|
||||
}
|
||||
]
|
||||
}
|
||||
+252
@@ -0,0 +1,252 @@
|
||||
{
|
||||
"phase": "import",
|
||||
"test": null,
|
||||
"passed": false,
|
||||
"failed": true,
|
||||
"validation_error": null,
|
||||
"profile_startup_name": "TheTree-PCK-tests-974717b708984f0d81f24d8164fe7bc3-standard-startup-import",
|
||||
"private_project_sha256": "f825875e910e090ce57fc0527f34b55386a77123c1784d6916718113139a3673",
|
||||
"private_project_fields": 2,
|
||||
"source_sha256": null,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/stage",
|
||||
"--editor",
|
||||
"--import",
|
||||
"--quit",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log"
|
||||
],
|
||||
"logical_script": null,
|
||||
"starter_sha256": null,
|
||||
"controlled_environment": {},
|
||||
"native_process": {
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/stage",
|
||||
"--editor",
|
||||
"--import",
|
||||
"--quit",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log"
|
||||
],
|
||||
"pid": 55035,
|
||||
"started_utc": "2026-10-17T08:05:39.153436+00:00",
|
||||
"ended_utc": "2026-10-17T08:05:54.328314+00:00",
|
||||
"wall_seconds": 15.174453041981906,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "a7044e250290690749e344039a98595963550e89777a727da0532dd975c95778",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 55035,
|
||||
"owner_pid": 53623,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/stage",
|
||||
"--editor",
|
||||
"--import",
|
||||
"--quit",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 2836045348628125,
|
||||
"pid": 55035,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/stage",
|
||||
"--editor",
|
||||
"--import",
|
||||
"--quit",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-17T08:05:39.153436+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 55035,
|
||||
"ppid": 53623,
|
||||
"pgid": 55035,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/stage --editor --import --quit --verbose --log-file /Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 55035,
|
||||
"owner_pid": 53623,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/stage",
|
||||
"--editor",
|
||||
"--import",
|
||||
"--quit",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 2836060496050750,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 55035,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/stage",
|
||||
"--editor",
|
||||
"--import",
|
||||
"--quit",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-17T08:05:54.320361+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
},
|
||||
"outer_actual_capture": {
|
||||
"actual_captured_pids": [
|
||||
55035
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 55035,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true,
|
||||
"outer_receipt_written": true,
|
||||
"outer_receipt_error": null,
|
||||
"passed": true
|
||||
},
|
||||
"actual_pid": 55035,
|
||||
"engine_ended": true,
|
||||
"exit_code": 0,
|
||||
"log": "import/combined-raw.log",
|
||||
"log_sha256": "a7044e250290690749e344039a98595963550e89777a727da0532dd975c95778",
|
||||
"raw_native_log": {
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import/engine-native.log",
|
||||
"bytes": 119669,
|
||||
"sha256": "9e66d1295be17e1bfa9052e78e06e7cf9bfee7fe5624ea97226529209404b8ed"
|
||||
},
|
||||
"finite_original_diagnostic_review": {
|
||||
"verified": true,
|
||||
"original_NUL_fixture_contract_applied": false,
|
||||
"producer_source_sha256": null,
|
||||
"actual_transport_counts": {
|
||||
"stdout": 0,
|
||||
"stderr": 0,
|
||||
"native_file": 0
|
||||
},
|
||||
"actual_complete_diagnostic_sequences": {
|
||||
"stdout": [],
|
||||
"stderr": [],
|
||||
"native_file": []
|
||||
},
|
||||
"unknown_or_error_or_leak_lines": {
|
||||
"stdout": [],
|
||||
"stderr": [],
|
||||
"native_file": []
|
||||
},
|
||||
"raw_lines_deleted_or_rewritten": 0,
|
||||
"contract_sha256": "22fd41c59eb13e0af397984bed418870c55fa8942524c377490a90a2aca8dedd",
|
||||
"allowed_e31_error_lines": []
|
||||
},
|
||||
"whole_startup_profile_after": {
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-974717b708984f0d81f24d8164fe7bc3-standard-startup-import",
|
||||
"files": {},
|
||||
"fresh_before_engine": true
|
||||
},
|
||||
"guard_error": "AssertionError: complete source/UID/generated report set"
|
||||
}
|
||||
+3868
File diff suppressed because it is too large
Load Diff
+4944
File diff suppressed because it is too large
Load Diff
+7
File diff suppressed because one or more lines are too long
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"task_id": "P13-02-CODE1",
|
||||
"commit": "1e8d4ea88876865a72547ff0edf43ed5b0e74c7e",
|
||||
"status": "submitted",
|
||||
"summary": "許可範囲内で非描写サービス、Runtime・保存連携、5試験、専用検証スクリプト、マーカー・説明書を追加。Python構文とマーカーSHA整合を確認。エンジン・試験・Runner操作・git書込みは未実施。正式検証と独立レビュー待ちで、P13受入への加算はありません。",
|
||||
"acceptance_ids": [
|
||||
"P13-02-CODE1"
|
||||
],
|
||||
"findings": []
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"at_jst": "2026-10-17T17:09:16.053627+09:00",
|
||||
"plan_id": "P13-02",
|
||||
"batch": "P13-02-CODE1",
|
||||
"original_packages": 30,
|
||||
"original_units": 88,
|
||||
"formally_completed": 14,
|
||||
"new_credit": 0,
|
||||
"source_submitted": "e930a1dedff7ab4c4a94d274a2e0c55fc2b95829",
|
||||
"source_backup_branch": "codex/p13-02-reference-e930a1d",
|
||||
"normal_integration_candidate": null,
|
||||
"source_on_main": false,
|
||||
"worker_model": "gpt-6-astra",
|
||||
"model_selection": "actual Opus19f00667 after examining coupled14/15 save paths; earlier Sol was proposal only",
|
||||
"repairs_before_current_correction": 2,
|
||||
"max_repairs": null,
|
||||
"worker_run": "b3af838ff79b4f3fafe7b68040a89079",
|
||||
"worker_terminal": "submitted",
|
||||
"source_change_summary": "12 files/1015 additions, service plus bounded Runtime/save/5suite/harness wiring; no mandatory numbers or normal palette invented",
|
||||
"native": {
|
||||
"import_actual_pid": 55035,
|
||||
"engine_ended": true,
|
||||
"exit_code": 0,
|
||||
"diagnostic_errors": 0,
|
||||
"accepted": false,
|
||||
"guard_failure": "exactly7 native-generated UID sidecars undeclared in complete source/UID/generated set",
|
||||
"suite_count": 0,
|
||||
"all15_suites_unexecuted": true,
|
||||
"all329_parse_unexecuted": true,
|
||||
"default_player_changed": false,
|
||||
"cleanup_errors": []
|
||||
},
|
||||
"next": "actual Opus decision for precise UID artifact handling; do not waive source/UID/process/profile guard or rerun full regression now",
|
||||
"P04_priority": "Next original unit to close remains P04-01; owner D05 answers pending, this batch is independent work",
|
||||
"required_remaining": [
|
||||
"UID correction then exact narrow/impact verification with strict raw evidence",
|
||||
"separate actual Opus independent code/evidence review",
|
||||
"required final exact-source full regression, normal integration/final and ledger update for backend batch",
|
||||
"whole original P13-02 normal build/production/content/roles/approved D04/D05/D08 values/VIP/UI/Windows and all original conditions remain unaccepted"
|
||||
],
|
||||
"manifest": [
|
||||
{
|
||||
"path": "ACTUAL_OPUS_MODEL_AND_BRIEF.json",
|
||||
"original": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/19f00667226d42dd8e9b3a4ae99aaa68/result.json",
|
||||
"sha256": "1afa4b721f45c10cabeb10830db1c8b064d29c55000c3c6fbf5802ec0474c533",
|
||||
"bytes": 11457
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_WORKER_RESULT.json",
|
||||
"original": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p13-02-reference/runs/b3af838ff79b4f3fafe7b68040a89079/result.json",
|
||||
"sha256": "e38129543ab8796c51b6f1c56fba7417a6f7efe8d4cff338d1a0b074bbf23dd1",
|
||||
"bytes": 538
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_IMPORT_RECEIPT.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/import-receipt.json",
|
||||
"sha256": "cfa6b72b59f8df394eb22adfe1e73babbca31fb0c2a9caed9190dcc80b52d8f1",
|
||||
"bytes": 9333
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_NATIVE_ENDED.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/runner-ended.json",
|
||||
"sha256": "9f13934d7844e4ceba72e87a7c5dc88e7e2ebdea5de1c556c5f19d90092917c3",
|
||||
"bytes": 167969
|
||||
},
|
||||
{
|
||||
"path": "ACTUAL_NATIVE_INPUT.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-reference-native/runner-input.json",
|
||||
"sha256": "6018a3d83835317a46aee69188d5f3ca0e01977212e36b030a751894cb3284dc",
|
||||
"bytes": 320355
|
||||
},
|
||||
{
|
||||
"path": "ROOT_REVIEW_CHECKLIST.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/coordinator-start-20261017/ROOT_REVIEW_CHECKLIST.json",
|
||||
"sha256": "32079bede7a4da3defabbdc4fca7eaf96a03ffc12344cfd7631c2d5c5e22e7c7",
|
||||
"bytes": 1440
|
||||
},
|
||||
{
|
||||
"path": "EXACT_FAILURE_FACTS.json",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/P13-02-CODE1-implement/build/owner-handoff/native-import-failure/ROOT_EXACT_FAILURE_FACTS.json",
|
||||
"sha256": "a7c906d0df05003be005e8d7160ae8c104dbdb00388bd57b87696f1dd425de86",
|
||||
"bytes": 1782
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"S": "e930a1dedff7ab4c4a94d274a2e0c55fc2b95829",
|
||||
"actual_engine_pid": 55035,
|
||||
"exit_code": 0,
|
||||
"owned_engine_ended": true,
|
||||
"diagnostic_errors": 0,
|
||||
"actual_suites": 0,
|
||||
"new_stage_files": [
|
||||
{
|
||||
"path": "tests/special/peeping_room_fixture.gd.uid",
|
||||
"sha256": "a74e5ef6d8959826919a648e8b5d82e96d1c73ff22cd6c1f216be8b5c4060a8a",
|
||||
"bytes": 20,
|
||||
"text": "uid://b0c3ouuq42ycg\n"
|
||||
},
|
||||
{
|
||||
"path": "tests/special/test_peeping_room_runtime.gd.uid",
|
||||
"sha256": "f7276000bd3b4c3429c72612f791ca2ed6bb04dde1de8e278cb1a055ae4ce743",
|
||||
"bytes": 20,
|
||||
"text": "uid://dkc1kiqioypih\n"
|
||||
},
|
||||
{
|
||||
"path": "tests/special/test_peeping_room_save.gd.uid",
|
||||
"sha256": "005561b37df9051e618d4714b2a91a82f4a48ec63c841cdf27c251bcd2865505",
|
||||
"bytes": 19,
|
||||
"text": "uid://8uytmpjup8q4\n"
|
||||
},
|
||||
{
|
||||
"path": "tests/special/test_peeping_room_geometry.gd.uid",
|
||||
"sha256": "391b78806bc0bf759f00c778cb25dfaa97d47f6e309c3b302412c38123c5440c",
|
||||
"bytes": 19,
|
||||
"text": "uid://4r40f1kpjmvj\n"
|
||||
},
|
||||
{
|
||||
"path": "tests/special/test_peeping_room_evidence.gd.uid",
|
||||
"sha256": "26bbc1435bcda963b5866327b887096f798b1629c7984768c85bfb6175648ec5",
|
||||
"bytes": 20,
|
||||
"text": "uid://dftsky13pe0uj\n"
|
||||
},
|
||||
{
|
||||
"path": "tests/special/test_peeping_room_reference.gd.uid",
|
||||
"sha256": "db8bfa98b7943dba15858ccaa6681bc430efd43f40f57de99117dc19c51ac417",
|
||||
"bytes": 20,
|
||||
"text": "uid://cnnon5woufurp\n"
|
||||
},
|
||||
{
|
||||
"path": "scripts/special/peeping_room_service.gd.uid",
|
||||
"sha256": "3f045afc3c140886c70ec8494d6dcb012e6da645e8a3ff3c6488442ce63a9353",
|
||||
"bytes": 20,
|
||||
"text": "uid://bi36fvp1jiiiv\n"
|
||||
}
|
||||
],
|
||||
"guards_not_waived": true,
|
||||
"whole_acceptance": false
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"scope": "Root-derived review checklist within the immutable original P13-02 state/reference/save conditions. Not extra product rules, test results, or implementation directions.",
|
||||
"created_unix_ns": 1792223589246621000,
|
||||
"checks": [
|
||||
"Retain prior evidence identities/history after target loss and explicit relink; a new target does not turn old evidence into a different event or silently discard it. Check roundtrip after this combined history.",
|
||||
"Relink may ignore only the same room own occupancy, never another room or corridor conflict. A rebuilt different facility ID cannot silently revive the link.",
|
||||
"Ordinary production commands cannot reach CONTROLLED_FIXTURE entry points or bypass missing build/recorder approvals; rejection leaves whole typed Runtime unchanged.",
|
||||
"Optional section absence is valid only for truly empty state; orphan world occupancy or owned IDs cannot be accepted by dropping the section. Other existing exact schema key allowlists remain strict.",
|
||||
"Failed section restore or later-system failure restores original whole Runtime including clock, ID generator, commands, facilities, ledger and new service references; var_to_bytes evidence, no JSON normalization.",
|
||||
"Source/marker/policy/engine/input/environment identities and actual owned process endings cover the final tested version; local test numbers never substitute whole-unit acceptance."
|
||||
],
|
||||
"formal_credit": 0
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"archive_sha256": "f962d3622f5da562c3c07c4afed84bf4f1042a2470f555c16148d450e70453ff",
|
||||
"drive_archive_id": "1F6MYrZ7begmlNaZkjMOlJT5y9uMcSVwM",
|
||||
"drive_restore_kit_id": "1eT98KWt71v62IGhxyBSjmf4FEoTvFMxA",
|
||||
"views": [
|
||||
{
|
||||
"original": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-cb0e908014ed4be48b1cc74787337f66-standard-runtime-057",
|
||||
"files": 2792,
|
||||
"logical_bytes": 1839108706,
|
||||
"verified_all_bytes_before_retirement": true,
|
||||
"restore_view": "original",
|
||||
"absent_after": true
|
||||
},
|
||||
{
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/P13-02-CODE1/build/p13-full-controller/run/profiles/057/runtime",
|
||||
"files": 1535,
|
||||
"logical_bytes": 861302992,
|
||||
"verified_all_bytes_before_retirement": true,
|
||||
"restore_view": "failed-copy",
|
||||
"absent_after": true
|
||||
}
|
||||
],
|
||||
"free_before": 894099456,
|
||||
"free_after": 2749599744,
|
||||
"time_ns": 1792229099545221000,
|
||||
"original_full_attempt_passed": false,
|
||||
"receipt_bytes_unmodified": true,
|
||||
"actual_free_gain_bytes": 1855500288
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"removed": [
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/P13-02-CODE1-final-b0291970",
|
||||
"head": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"git_files": 4919,
|
||||
"byte_equal_review_duplicate_files": 0
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/P13-02-CODE1-integration-15cc1271",
|
||||
"head": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"git_files": 4919,
|
||||
"byte_equal_review_duplicate_files": 0
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/P13-02-CODE1-review-e6fc1237",
|
||||
"head": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"git_files": 4894,
|
||||
"byte_equal_review_duplicate_files": 16049
|
||||
}
|
||||
],
|
||||
"full_restore_proof": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/coordinator-start-20261017/CLOSED_P13_READONLY_FULL_RESTORE_PROOF.json",
|
||||
"free_before": 3651289088,
|
||||
"free_after": 4381392896,
|
||||
"all_unique_evidence_preserved": true,
|
||||
"time_ns": 1792232004526885000,
|
||||
"actual_free_gain": 730103808
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"at_jst": "2026-10-17T18:34:28.900674+09:00",
|
||||
"plan_id": "P13-02",
|
||||
"batch": "P13-02-CODE1",
|
||||
"S": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"original_packages": 30,
|
||||
"original_units": 88,
|
||||
"formally_completed": 14,
|
||||
"new_credit": 0,
|
||||
"original_full_attempt_passed": false,
|
||||
"failure": "ENOSPC while copying ended native5374check P08 migration runtime profile; incomplete original runner-ended preserved",
|
||||
"causal_measurements": {
|
||||
"single_runtime_profile_files": 2792,
|
||||
"single_runtime_logical_bytes": 1839108706,
|
||||
"partial_duplicate_whole_files": 1534,
|
||||
"partial_duplicate_zero_byte_fragment": 1
|
||||
},
|
||||
"recovery": "Exact full archive plus original partial-copy view and fragment retained; every member SHA verified locally, remote complete archives fetched and streamed SHA verified before retiring only verified uncompressed profiles. No test log or acceptance data erased.",
|
||||
"archives": [
|
||||
{
|
||||
"drive_id": "1F6MYrZ7begmlNaZkjMOlJT5y9uMcSVwM",
|
||||
"url": "https://drive.google.com/file/d/1F6MYrZ7begmlNaZkjMOlJT5y9uMcSVwM/view",
|
||||
"purpose": "current057 full profile"
|
||||
},
|
||||
{
|
||||
"drive_id": "1eT98KWt71v62IGhxyBSjmf4FEoTvFMxA",
|
||||
"url": "https://drive.google.com/file/d/1eT98KWt71v62IGhxyBSjmf4FEoTvFMxA/view",
|
||||
"purpose": "current057 restore kit with exact original and failed-copy views"
|
||||
},
|
||||
{
|
||||
"drive_id": "1_HFt31YEAs6ak7Z2BiX9xOCQJkYBjovE",
|
||||
"url": "https://drive.google.com/file/d/1_HFt31YEAs6ak7Z2BiX9xOCQJkYBjovE/view",
|
||||
"purpose": "previous ended P23 full179 runtime profile, full restore metadata embedded"
|
||||
},
|
||||
{
|
||||
"drive_id": "1tR_3rlst7AshVskaVxG6JFvQxF5OP5ow",
|
||||
"url": "https://drive.google.com/file/d/1tR_3rlst7AshVskaVxG6JFvQxF5OP5ow/view",
|
||||
"purpose": "older ended P08 phase profile, full restore metadata embedded; failed whole attempt remains failed"
|
||||
}
|
||||
],
|
||||
"proof_records": {
|
||||
"DRIVE_FULL_ARCHIVE_READBACK.json": {
|
||||
"bytes": 221,
|
||||
"sha256": "36a59d70bb6b67b20c89a26bc5bc1bae3e16f1e4cdc34faf8690cb8d47f4ea55",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/storage-profile-recovery-20261017/DRIVE_FULL_ARCHIVE_READBACK.json"
|
||||
},
|
||||
"DRIVE_RESTORE_KIT_READBACK.json": {
|
||||
"bytes": 219,
|
||||
"sha256": "29119b49b58bdaed54b672bab4629fd17f56c33b5cb6961ce2061f222a0897e3",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/storage-profile-recovery-20261017/DRIVE_RESTORE_KIT_READBACK.json"
|
||||
},
|
||||
"057-ARCHIVAL-RECOVERY.json": {
|
||||
"bytes": 1110,
|
||||
"sha256": "220aa68ceb8195b1ac3358118b4ea652750cafc4a421b9f277026ccfadb76722",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/storage-profile-recovery-20261017/057-ARCHIVAL-RECOVERY.json"
|
||||
},
|
||||
"PREVIOUS_P23_PROFILE057_DRIVE_AND_RETIREMENT.json": {
|
||||
"bytes": 785,
|
||||
"sha256": "6633575fcf6cba529d72c3fc652fffc082128114e20cdf9f0fd0a223ff5d9c8e",
|
||||
"original": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/storage-profile-recovery-20261017/PREVIOUS_P23_PROFILE057_DRIVE_AND_RETIREMENT.json"
|
||||
}
|
||||
},
|
||||
"current_free_bytes": 4153327616,
|
||||
"next_full_scope": "Import and329parse plus original58 suites qualified; remaining126 require unchanged native per-phase gates, exact input equality, all cross-segment checks, separate actual Opus review, normal integration/final. No restart of accepted native phases.",
|
||||
"admission_required_bytes": 3467374666,
|
||||
"P04_next_formal_unit": "P04-01 pending actual owner D05 choices, no fake approval",
|
||||
"whole_original_acceptance": false,
|
||||
"later_archival_result": "Additional1.838GB logical old profile preserved remotely with full readback SHA. Immediate measured free gain153612288B; logical size is not claimed as physical space recovered.",
|
||||
"subsequent_verified_copy_retirements": {
|
||||
"P13_ended3_copies_actual_gain_bytes": 730103808,
|
||||
"P04_ended9_validation_copies_actual_gain_bytes": 1304444928,
|
||||
"P04_preserved_remote_source": "codex/p04-01-preserved-2dde759",
|
||||
"all_tracked_blobs_verified": true,
|
||||
"all_unique_central_native_review_evidence_retained": true
|
||||
},
|
||||
"last_capacity_observation_jst": "2026-10-17T19:39:39.105864+09:00"
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"drive_id": "1F6MYrZ7begmlNaZkjMOlJT5y9uMcSVwM",
|
||||
"bytes": 97976496,
|
||||
"sha256": "f962d3622f5da562c3c07c4afed84bf4f1042a2470f555c16148d450e70453ff",
|
||||
"full_remote_readback": true,
|
||||
"time_ns": 1792229035052351000
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"drive_id": "1eT98KWt71v62IGhxyBSjmf4FEoTvFMxA",
|
||||
"bytes": 216139,
|
||||
"sha256": "8517b61a253141a76e3bde5bab81f3971ca91989b37b2c89e95a5ee42c010cda",
|
||||
"full_remote_readback": true,
|
||||
"time_ns": 1792229078775515000
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"at_unix_ns": 1792232721652518000,
|
||||
"removed": [
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-3ca36075",
|
||||
"head": "d393e4d90f068faa82fde40ca1ecd411ff7f2c1f",
|
||||
"files": 3022,
|
||||
"logical_bytes": 137851869
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-998f2af8",
|
||||
"head": "55f1fb49aaefa5c1b86de1c3eda72392ef6b58f2",
|
||||
"files": 3025,
|
||||
"logical_bytes": 137889196
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-a2c2024a",
|
||||
"head": "7af6fafaf00cffbb731f6a4765e5891457c51bda",
|
||||
"files": 3024,
|
||||
"logical_bytes": 137863410
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-b191eb70",
|
||||
"head": "8418560aaf2f0f9ed3977ca477b5601ffebcbbda",
|
||||
"files": 3021,
|
||||
"logical_bytes": 137848317
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-b85d6800",
|
||||
"head": "b543c26c95a1d634b8d7efdf127cc55eba55611a",
|
||||
"files": 3013,
|
||||
"logical_bytes": 137734675
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-e0a2d54f",
|
||||
"head": "4ab7ab8712cc3b3d8bb0514ebb4b2c0927456443",
|
||||
"files": 3025,
|
||||
"logical_bytes": 137887158
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-e0f78b8f",
|
||||
"head": "fb8b7919dbecba9a9de2a28dc2a25ce5cd73e9c6",
|
||||
"files": 3027,
|
||||
"logical_bytes": 137898418
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-e61af951",
|
||||
"head": "2dde7596a87c43f7bf0bf704b7479f2fa06a5b1c",
|
||||
"files": 3031,
|
||||
"logical_bytes": 138115695
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-f79a151b",
|
||||
"head": "16207d353ae4a2bb180793325cba9aec9ef68d66",
|
||||
"files": 3015,
|
||||
"logical_bytes": 137746167
|
||||
}
|
||||
],
|
||||
"free_before_bytes": 3734835200,
|
||||
"free_after_bytes": 5039280128,
|
||||
"observed_gain_bytes": 1304444928,
|
||||
"all_source_blobs_verified": true,
|
||||
"all_unique_runtime_evidence_preserved": true,
|
||||
"restore_manifest": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-storage-20261017/ENDED_VALIDATION_CHECKOUT_FULL_GIT_RESTORE_PROOF.json"
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"drive_id": "1tR_3rlst7AshVskaVxG6JFvQxF5OP5ow",
|
||||
"remote_bytes": 98084260,
|
||||
"remote_sha256": "79879544b1351706d96e072f77a5b893aced99204c3c8fa83c216279b2cef011",
|
||||
"full_remote_readback": true,
|
||||
"all_original_bytes_verified_before_retirement": true,
|
||||
"original": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-4c87cfdfbfff41fd85a9686027d4b109-standard-runtime-057",
|
||||
"files": 2792,
|
||||
"archive": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/storage-profile-recovery-20261017/p08-older-ended-profile057-lossless.tar.gz",
|
||||
"archive_contains_full_manifest": true,
|
||||
"original_full_attempt_passed": false,
|
||||
"phase_passed_and_ended": true,
|
||||
"time_ns": 1792230632135468000,
|
||||
"free_before": 3985821696,
|
||||
"original_absent": true,
|
||||
"free_after": 4139433984,
|
||||
"actual_free_gain": 153612288
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"drive_id": "1_HFt31YEAs6ak7Z2BiX9xOCQJkYBjovE",
|
||||
"remote_bytes": 98141942,
|
||||
"remote_sha256": "0cdfb0eb3dc7b5bced24f209bd024436db5450926dae74885d658bcdcf407ed5",
|
||||
"full_remote_readback": true,
|
||||
"all_original_bytes_verified_before_retirement": true,
|
||||
"original": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-4572ef90efe94bc59f24b8e3d80452d0-standard-runtime-057",
|
||||
"files": 2792,
|
||||
"archive": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-02-reference/.runtime/storage-profile-recovery-20261017/p23-previous-full179-profile057-lossless.tar.gz",
|
||||
"archive_contains_full_manifest": true,
|
||||
"time_ns": 1792229606376983000,
|
||||
"free_before": 2652545024,
|
||||
"original_absent": true,
|
||||
"free_after": 4500942848,
|
||||
"actual_free_gain": 1848397824
|
||||
}
|
||||
+7
File diff suppressed because one or more lines are too long
+5686
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,75 @@
|
||||
# P19-03 実装提出報告
|
||||
|
||||
提出状態。受入は未確定。原受入「7名×3ルートの到達表があり、未制作内容は欠損として残る。」を維持する。14/88は変更しない。
|
||||
|
||||
## 変更範囲
|
||||
|
||||
修復開始点e0420d57a381a1644357f0590536e1d47c9bca9fから、このディレクトリの指定5ファイルのみを変更した。原本、原子要件、work packages、decisions、TASK_SPEC、選定記録、frozen pins、ゲーム入力、marker registryは変更していない。git書込み、他worker起動、Runner操作、ゲーム起動は行っていない。素材追加なし。
|
||||
|
||||
## 要件と検査の対応
|
||||
|
||||
|TASK_SPEC implementation_requirements順|成果物|検査|
|
||||
|---|---|---|
|
||||
|1: 原7名×3ルート|REACHABILITY_TABLE.json / .md|expectedのPEOPLE/ROUTES、原本118–124行、atomic entityと21セルの完全一致。test_exact_cell_product|
|
||||
|2: 8カテゴリ、共通/人物固有の分離|JSON common_rules / cells.categories|CATEGORIES全件のcanonical比較。test_categories_and_citations|
|
||||
|3: 原本本文・行・status・anchorのsource SHA・owner|JSONの各共通項目/人物固有項目、catalog_evidence|expected.evidence/cite、verify。test_stale_record_evidence / test_owner_and_status|
|
||||
|4: 欠損、理由、担当、未知値pending|各character_specific、pending、natural_route_complete=false|test_no_invented_values_or_completion。D05/D08は未回答のまま|
|
||||
|5: docs内stdlibチェッカー/自己試験|check_reachability_table.py / test_reachability_table.py|stdlib importsのみ。選択対象外のdocs内配置|
|
||||
|6: read-only --check、厳密な表/Markdown|verify / verify_records / markdown|test_json_and_types / test_markdown_drift。--checkは書込み分岐を通らない|
|
||||
|7: 全frozen source mapと各identity|binding / selection|1368選択ファイルの完全map、marker/policy/engine、184-suite roster、329 .gd、baseline、spec→pins SHA。test_full_frozen_map_and_identities / test_real_source_and_baseline_changes|
|
||||
|8: UI/Runtime/save/Windowsの適用性|JSON route_support、MDルート別適用性|各ルートをcanonical比較。汎用UIラベル、原本登録Runtime、専用snapshotの限定証拠をcommon_rulesで参照|
|
||||
|9: 有意な負例と3種の正例|test_reachability_table.py|欠落/重複/誤人物/誤route/カテゴリ/引用/古い本文・SHA/値創作/誤完成/owner・status/JSON型/Markdown、実ファイル読込差替え、map差分とpins/marker/policy/engine改変。全3statusを含む正例|
|
||||
|10: P13パターン・原文保全|checkerのexpected/verify/markdown、原資料のbase blob照合|tools/check_p13_content_difference.pyのcanonical生成・厳密比較・read-only Git blob証拠パターンを参照。元ファイルは無変更|
|
||||
|11: 報告・残課題・外部gate|本報告、JSON accounting|正式試験・全単位独立レビュー・統合/finalは未実行と明記|
|
||||
|
||||
原子要件はB-7.1〜B-7.6をsource_group_idsに含む61件の完全レコードを読込対象とし、JSON authority_snapshotsに保持する。人物キーと原名はそのentityから確認し、原本§6の順で並べた。原本§6は114–135行、§7は136–161行であり、実際の見出しと本文を照合した。人物別の原本仕様がない部分を共通ルールから創作していない。中断/保存の人物固有手順は原本に定義されず、work_packagesのP19-02受入が所有する欠損として残した。
|
||||
|
||||
指定されたoriginal_relationship_state.gdには7名のrosterはなく、汎用subject_id等の明示入力検証のみがある。既存unique catalogのヒロインはheroine_anriのみ。監査IDには既存atomic entity.key(anri/fine/tomari/amelia/liz/mimi/satsuki)を使い、他6名の実装catalog ID、ライバル対応、初期値を創作していない。この実装欠損は表の欠損であり、原7名を削減する理由にしていない。
|
||||
|
||||
## Repair 1: 4指摘の対応
|
||||
|
||||
編集前に build/owner-handoff/p19-review-r01/ の ACTUAL_OPUS_REPAIR_DIRECTION.json、ACTUAL_WHOLE_UNIT_REVIEW.json、SPEC_HASH_REPRESENTATIONS.json を読んだ。
|
||||
|
||||
- MEDIUM: coassignment_attack / zero_break / love_actions / threshold_route_loss と旧UIのlegacy_evidenceを追加。固定anchorの実際の本文・行・Git blob OID・file-bytes SHA-256を保持する。原本準拠statusはmissing、旧実装分類はlegacy_not_originalに統一。P18-01は一対一変換を禁止し、旧数値・日次制限は原本として未承認と明記した。UI定数は実際には98–101行であり、89–97行の無関係なラベルを除いた。共通ルール参照により各該当セルへ結び付けた。所有者・原本欠損・natural_route_complete=falseを維持。
|
||||
- LOW 独立試験: validate_legacyは候補とcanonicalの比較とは独立に、git showで固定anchorのソースを読み、引用行本文とgit rev-parseによるblob OID、現ファイルとの一致を検査する。test_independent_legacy_source_evidenceは実際のJSONと実ファイルを開き、git hash-object --stdin(書込みなし)でOIDを独立計算し、関数名とshield_broken/EXCLUSIVE_LOCKEDも確認。test_legacy_evidence_required_independentlyは対象全項目の証拠削除・空配列・無条件not implemented・古いOID/本文を拒否する。
|
||||
- LOW 中断参照: 全21セルのinterruption_cancellationに原本148・153行の本文とbaseline hash、および343–355行のconfirm_route_lockをlegacy_not_originalとして追加。人物固有欠損と担当は維持。
|
||||
- LOW ハッシュ表示: 263a01b943d8056727335fb76977c010298e1c229077f8da76e48683ba2e89bb は TASK_SPEC.json file-bytes SHA-256。3af3d9b931edc5449796662ad69bb6f67c80b48827a86565b1952931db68dd15 は Runner git-show stripped-UTF-8 contract spec_sha256。上記SPEC_HASH_REPRESENTATIONS.jsonのunchanged_file=trueが証拠であり、両者は同じ無変更ファイルを表す。checker定数と出力にも区別を反映。Git blob OIDは別のgit_blob_oidフィールドでありfile-bytes SHA-256とは区別する。
|
||||
|
||||
## 実行記録(今回のローカル確認)
|
||||
|
||||
以下は正式Runner実行ではない。記録済み修復指示に基づき3登録コマンドをローカル実行した。
|
||||
|
||||
生成 — exit 0
|
||||
|
||||
```sh
|
||||
python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement --write
|
||||
```
|
||||
|
||||
p19-table — exit 0
|
||||
|
||||
```sh
|
||||
python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement --check
|
||||
```
|
||||
|
||||
p19-negative — exit 0
|
||||
|
||||
```sh
|
||||
python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement
|
||||
```
|
||||
|
||||
p19-source-binding — exit 0
|
||||
|
||||
```sh
|
||||
python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement --source-binding-only
|
||||
```
|
||||
|
||||
--writeの実際の呼出しは同一checkout内で相対スクリプトパスと --project-root . を使用(上記は絶対パス表記)。--checkはMarkdownのバイト完全一致を確認。自己試験は12件OK。source bindingは1368ファイル一致、file_equality=true、actual_commit=e0420d57a381a1644357f0590536e1d47c9bca9f、native_evidence_reuse_accepted=false。git diff --checkはexit 0。構文は上記Python実行で確認。最初の編集用here-documentは一時ファイル作成制限でexit 1、変更は行われず、python3 -cで再実行してexit 0。native full・ゲーム起動・git書込み・Runner操作・他エージェント起動は行っていない。
|
||||
|
||||
## 残る親成果・ゲームの欠損
|
||||
|
||||
- P18-01: 原本3軸/盾の通常UI、承認済み初期値、本来の全単位受入。P18-02/03: 同配置・軽減・ブレイク・接触・閾値・確定遷移。既存旧汎用モデルの閾値を原本へ転用しない。
|
||||
- P19-01/02: 原本行動と全3種決闘、勝敗・費用・盾/履歴の一度だけ反映、通常入口、停止/取消/離脱/保存再開。原本状態保持のbackendを自然ルート完成としない。
|
||||
- P20-01/02/03: スキル/章・全エンド・図鑑と新規からの通常到達。P26-01/02/03: 人物別必要内容、状態接続、完成資産と制作受入。人物固有イベント/条件/履歴/立ち絵差分は欠損。
|
||||
- D05、D08はpending。未知の閾値・率・初期値もpendingのまま。P04の既存D05選択、P13の4件の制作followupも未解決。
|
||||
- この文書単位のnative GUI/Windows実行は適用外。global same-Windows、held gestures、全ゲーム受入はopen。固定入力一致から既存native証拠の正式再利用承認を推定していない。
|
||||
- Runnerの3 validator、原本§6–7と元受入に対する実装者から独立したwhole-unit Opus review、その後の通常prepare-integration/finalが必要。どの完了数・元台帳も変更していない。
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+64
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"at_jst": "2026-10-17T19:58:24.516684+09:00",
|
||||
"plan_id": "P19-03",
|
||||
"registered_task": "P19-03-TABLE",
|
||||
"project": "the-tree-p19-03-reachability",
|
||||
"S": "806de25068bc423136063791afcea811d251ee1b",
|
||||
"implementation_model": "gpt-6.1-sol",
|
||||
"actual_model_decision": "c767de1cd89d40e5a23964f2e62ce4c6",
|
||||
"state": "whole_original_review_passed_integration_final_pending",
|
||||
"original_acceptance": "7名×3ルートの到達表があり、未制作内容は欠損として残る。",
|
||||
"original_units": 88,
|
||||
"formally_completed": 14,
|
||||
"new_credit": 0,
|
||||
"registered_validation": {
|
||||
"passed": true,
|
||||
"artifact": "ROOT_FORMAL_VALIDATION_806DE25.json",
|
||||
"checks": [
|
||||
"p19-table",
|
||||
"p19-negative",
|
||||
"p19-source-binding"
|
||||
],
|
||||
"self_tests": 12
|
||||
},
|
||||
"actual_reviewer": {
|
||||
"id": "38eaaacdb31b4c76bcf982987816a391",
|
||||
"status": "finished_pass"
|
||||
},
|
||||
"reviewer_model": "claude-opus-5-5",
|
||||
"full_game_input_equality": {
|
||||
"files": 1368,
|
||||
"markers_policy_engine_roster_parse_default_player_same": true,
|
||||
"full184_21903_329parse_186ended_reuse_qualified": true,
|
||||
"new_native_runs": 0,
|
||||
"artifact": "ROOT_EXACT_GAME_INPUT_REUSE_806DE25.json"
|
||||
},
|
||||
"required_before_acceptance": [
|
||||
"Normal actual integrationC/M and independent candidate source/input equality",
|
||||
"Normal final and existing exact real-owner main authorization, thenledger/push; no new humanSHA speech fabricated"
|
||||
],
|
||||
"source_gaps_preserved": [
|
||||
"Six missing productioncatalog IDs are not fabricated; table audit uses existing original atomic entity keys",
|
||||
"D05/D08 and unknown values/content remain missing or pending; backend/generic labels are not natural route completion",
|
||||
"Global Windows/game/content conditions stay open; this audit adds no product OS behavior"
|
||||
],
|
||||
"execution_issues_preserved": [
|
||||
"Initial registered {worktree} invocation failed before scripts opened; exact-root adapter madeactual3sameSchecks run, repairs0/source/config/policy unchanged",
|
||||
"Initial full inline review rejected beforeinference at actual1milliontoken providerlimit; completefile/diff sourceviews retainalloriginalbytes, no file/bytecaps, sameOpus5.5/sourceS"
|
||||
],
|
||||
"normal_integration_candidate": null,
|
||||
"repairs": 1,
|
||||
"repair_cap": null,
|
||||
"whole_original_review": {
|
||||
"run_id": "38eaaacdb31b4c76bcf982987816a391",
|
||||
"status": "pass",
|
||||
"critical_high_medium": 0,
|
||||
"low": 3,
|
||||
"artifact": "ROOT_WHOLE_REVIEW_806DE25.json"
|
||||
},
|
||||
"actual_repair_worker": {
|
||||
"id": "bf8a86e053044bfea0051253fefb2ec7",
|
||||
"status": "finished"
|
||||
},
|
||||
"repair_scope": "Same5Docfiles: legacy presence vsoriginalconformance for4clauses, independent source-presence/evidence-loss tests, route-ending interruption crossrefs, precise hash labels. No game/values/pins/roster changes."
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"actual_review": "38eaaacdb31b4c76bcf982987816a391",
|
||||
"findings": [
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "Most data-level negative tests still compare the document against the same expected() canonical. The independent semantic checks name only three markers: restore_shield, shield_broken and EXCLUSIVE_LOCKED. Citations such as the preview service's contact/shield-candidate lines, and the 6850, 1039 and 1047 call sites, are checked only for text and blob equality, not for a function-name marker. Consider asserting a marker for every legacy entry."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "The run log in IMPLEMENTATION_REPORT.md reports source binding actual_commit=e0420d5. That comes from the pre-commit local run. The Runner output correctly binds 806de25, but the report should mark that line as the pre-submission local value."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "The snapshot_container evidence range (relationship_service.gd 423–479) starts mid-function and cuts off inside restore_snapshot. It is accurate as evidence, but a range aligned to function boundaries would be clearer for downstream owners (P18-01, P19-02)."
|
||||
}
|
||||
],
|
||||
"disposition": "Low severity optional hardening/clarity notes, not original audit blockers. Formal Runner output pins806de25; worker report e0420d5 is a pre-submission local-run HEAD, not the final accepted version."
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"artifact_S": "806de25068bc423136063791afcea811d251ee1b",
|
||||
"existing_product_C": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"old_actual_native_S": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"all1368_selected_source_settings_assets_tests_tools_byte_equal": true,
|
||||
"marker_policy_engine_roster_parse_default_player_equal": true,
|
||||
"scope": "All source_refs keys exactly equal; no file set was narrowed or omitted. New doc-only audit helpers are outside this unchanged pre-existing selection algorithm.",
|
||||
"native_full_evidence_reuse_qualified": true,
|
||||
"new_native_runs": 0,
|
||||
"existing_full": {
|
||||
"actual_suites": 184,
|
||||
"missing_marker_paths": [],
|
||||
"remaining_unexecuted_tests": [],
|
||||
"available_marker_checks": 21903,
|
||||
"actual_all_roster_checks": 21903,
|
||||
"strict_accepted_checks": 21903,
|
||||
"verified": true,
|
||||
"composed": true,
|
||||
"original_full_attempt_passed": false,
|
||||
"whole_original_acceptance": false,
|
||||
"parse_checks": 329,
|
||||
"setup_phases": 2,
|
||||
"owned_ended": 186,
|
||||
"tested_source": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"engines_started": 0,
|
||||
"verifier_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a"
|
||||
},
|
||||
"previous_actual_whole_backend_Opus_review": "ead8e74b9683404d8cf3d97bca118726",
|
||||
"P19_whole_original_acceptance": "pending actual independent semantic review of full original §6–7, all21cells and all source/status/owner/gap claims, then normalintegration/final",
|
||||
"time_ns": 1792234414270856000
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"artifact_S": "e0420d57a381a1644357f0590536e1d47c9bca9f",
|
||||
"existing_product_C": "65f07bf5eaa759a8e2e17c7bdbbbdbceb24ee373",
|
||||
"old_actual_native_S": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"all1368_selected_source_settings_assets_tests_tools_byte_equal": true,
|
||||
"marker_policy_engine_roster_parse_default_player_equal": true,
|
||||
"scope": "All source_refs keys exactly equal; no file set was narrowed or omitted. New doc-only audit helpers are outside this unchanged pre-existing selection algorithm.",
|
||||
"native_full_evidence_reuse_qualified": true,
|
||||
"new_native_runs": 0,
|
||||
"existing_full": {
|
||||
"actual_suites": 184,
|
||||
"missing_marker_paths": [],
|
||||
"remaining_unexecuted_tests": [],
|
||||
"available_marker_checks": 21903,
|
||||
"actual_all_roster_checks": 21903,
|
||||
"strict_accepted_checks": 21903,
|
||||
"verified": true,
|
||||
"composed": true,
|
||||
"original_full_attempt_passed": false,
|
||||
"whole_original_acceptance": false,
|
||||
"parse_checks": 329,
|
||||
"setup_phases": 2,
|
||||
"owned_ended": 186,
|
||||
"tested_source": "a7e3069b167511b3194242b3403fbcc35244a526",
|
||||
"engines_started": 0,
|
||||
"verifier_sha256": "d00bf46bfcc0e0bb197edd284a3ae14610ca710507831e18e071a79461946e8a"
|
||||
},
|
||||
"previous_actual_whole_backend_Opus_review": "ead8e74b9683404d8cf3d97bca118726",
|
||||
"P19_whole_original_acceptance": "pending actual independent semantic review of full original §6–7, all21cells and all source/status/owner/gap claims, then normalintegration/final",
|
||||
"time_ns": 1792233062748520000
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"task_id": "P19-03-TABLE",
|
||||
"commit": "806de25068bc423136063791afcea811d251ee1b",
|
||||
"kind": "validation",
|
||||
"checks": [
|
||||
{
|
||||
"id": "p19-table",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p19-03-reachability/runs/8d14038fd19c4277a2ab9d430bf2dbd0",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"id": "p19-negative",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p19-03-reachability/runs/ad32d058245d45c6a0554ca92e0f46dd",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"id": "p19-source-binding",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p19-03-reachability/runs/fec4a9beda95427d89b4050e07a771e9",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"task_id": "P19-03-TABLE",
|
||||
"commit": "e0420d57a381a1644357f0590536e1d47c9bca9f",
|
||||
"kind": "validation",
|
||||
"checks": [
|
||||
{
|
||||
"id": "p19-table",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p19-03-reachability/runs/1c501211989843c190f0ee1eb6d4674b",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"id": "p19-negative",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p19-03-reachability/runs/bc25ca3804ad4aa796ba7a2cf6d9a197",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"id": "p19-source-binding",
|
||||
"exit_code": 0,
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p19-03-reachability/runs/3e07aaa43f84446aa0f375264e8d2d51",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "P19-03-TABLE",
|
||||
"commit": "806de25068bc423136063791afcea811d251ee1b",
|
||||
"status": "pass",
|
||||
"summary": "I re-reviewed the whole P19-03 unit at 806de25, read-only. I checked it against BASELINE §6 (lines 114–135) and §7 (lines 136–161), the work_packages P19-03 record, the 61 B-7.x atomic records snapshotted in the JSON, the immutable TASK_SPEC, and the frozen game source. I did not edit or run anything.\n\n**Original acceptance (「7名×3ルートの到達表があり、未制作内容は欠損として残る。」)**\n- The acceptance text is identical to work_packages.json:16100.\n- The table has 21 cells: the seven original names × 純愛/NTR/堕落.\n - The names アンリ/フィーネ/トマリ/アメリア/リズ/ミミ/サツキ match BASELINE lines 118–124.\n - The IDs are the existing atomic keys AR.heroine.<key>.route.{love,ntr,corruption}.\n - No character or route was invented or substituted.\n- The catalog has only heroine_anri, and original_relationship_state.gd has no roster. So using the atomic keys, and leaving the six missing catalog IDs as explicit gaps, is honest and invents no IDs.\n- Each cell has all 8 categories. Common rules are kept separate from character-specific content.\n- Every character-specific item is recorded as 欠損 / 原本未定義 / D08 pending. Each carries a reason, an owner from the real work_packages deliverables (P18-02, P19-01, P19-02, P20-02, P26-01, P26-02), the citations [138–161] plus the character's own line, and natural_route_complete=false.\n- D05, D08, thresholds, rates and initial values all stay pending, with no invented numbers. The original's undefined per-character content therefore stays as gaps, which is what this audit acceptance allows. It is not game acceptance.\n\n**Previous findings from the e0420d5 review**\n1. MEDIUM, missing legacy evidence: fixed.\n - coassignment_attack, zero_break, love_actions, threshold_route_loss and legacy_event_ui now carry legacy_evidence: path, anchor 1b07b87, git blob OID, file SHA-256, line range and quoted text.\n - I checked every range against the real source:\n - relationship_service.gd: restore_shield 246–261, apply_shield_attack 264–312 (includes shield_broken), request_route_lock 315–340, confirm_route_lock 343–355.\n - simulation_runtime.gd: command registration 342–343 and the apply_shield_attack call at 6850.\n - event_service.gd: lines 1039 and 1047.\n - placement_risk_preview_service.gd: _contact_summary 536–565 and _shield_attack_candidates 619–640.\n - main.gd: 98–101 is EVENT_CHOICE_NAMES. The correction from 89–101 is right, because 89–97 are unrelated excavation labels.\n - These clauses all use the same rule: original status missing, classified legacy_not_original, with the P18-01 reason. The main.gd label constant is no longer credited as partial.\n2. LOW, independent tests: addressed.\n - validate_legacy reads the anchored blobs via git show / rev-parse and is enforced by --check.\n - The self-tests compute the blob OID independently with git hash-object, assert function and text markers, and reject evidence that is dropped, emptied, marked \"not implemented\", or has a stale OID or text, for every legacy clause.\n3. LOW, interruption cross-references: addressed. All 21 cells' interruption_cancellation entries now cite lines 148 and 153 (exact text plus baseline hash) and the legacy confirm_route_lock as legacy_not_original.\n4. LOW, hash labels: addressed in the checker constants, the checker output and the report.\n\n**Scope:** the diff touches only the 5 allowed files under execution/p19-03/. TASK_SPEC, the frozen pins, the selection record, the original registers and the game files are unchanged.\n\n**Validation:** all 3 registered checks ran on 806de25 and exited 0.\n- p19-table: --check output binds actual_commit 806de25, 1368 selected files, file_equality true.\n- p19-negative: 12 tests OK.\n- p19-source-binding: passed.\n\nThe earlier failed invocations were unexpanded `{worktree}` placeholders that never opened a script; no failure was turned into a pass.\n\nOnly low-severity notes remain, and they do not block the audit acceptance. Integration/final and the other gates are still required before the count moves from 14 to 15; I give no credit before those.",
|
||||
"acceptance_ids": [
|
||||
"P19-03"
|
||||
],
|
||||
"findings": [
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "Most data-level negative tests still compare the document against the same expected() canonical. The independent semantic checks name only three markers: restore_shield, shield_broken and EXCLUSIVE_LOCKED. Citations such as the preview service's contact/shield-candidate lines, and the 6850, 1039 and 1047 call sites, are checked only for text and blob equality, not for a function-name marker. Consider asserting a marker for every legacy entry."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "The run log in IMPLEMENTATION_REPORT.md reports source binding actual_commit=e0420d5. That comes from the pre-commit local run. The Runner output correctly binds 806de25, but the report should mark that line as the pre-submission local value."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "The snapshot_container evidence range (relationship_service.gd 423–479) starts mid-function and cuts off inside restore_snapshot. It is accurate as evidence, but a range aligned to function boundaries would be clearer for downstream owners (P18-01, P19-02)."
|
||||
}
|
||||
]
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"task_id": "P19-03-TABLE",
|
||||
"commit": "e0420d57a381a1644357f0590536e1d47c9bca9f",
|
||||
"status": "changes_requested",
|
||||
"summary": "Independent read-only whole-unit review of P19-03 at e0420d5 against BASELINE §6 (lines 114–135) and §7 (136–161), the B-7.x atomic records, work_packages and the immutable TASK_SPEC.\n\nWhat passes:\n- Scope: the diff adds only the 5 required files under execution/p19-03/**. TASK_SPEC, pins, selection record, original registers and game files are unchanged.\n- Roster and routes: exactly 7 original names (アンリ, フィーネ, トマリ, アメリア, リズ, ミミ, サツキ, matching BASELINE lines 118–124 and atomic entity keys AR.heroine.<key>.route.{love,ntr,corruption}) × 純愛/NTR/堕落 gives 21 cells. I confirmed the catalog has only heroine_anri/rival_rai and that original_relationship_state.gd has no roster, so using atomic keys and keeping the other six as gaps is honest and invents no IDs.\n- Gaps: every cell keeps 8 categories, separates common rules from character-specific content, marks character-specific content 欠損/D08 pending with a plausible owner (P18-02/P19-01/P19-02/P20-02/P26-01/P26-02), and sets natural_route_complete=false. Thresholds, rates, initial values and D05/D08 stay pending. Original citations quote exact line text with the baseline hash. Implemented/partial evidence carries path+SHA, bound to anchor 1b07b87 by blob equality.\n- Validation: the 3 registered checks ran on the same commit and exit 0 (10 self-tests OK; source binding 1368 files, file_equality true). The 3 initial exit-2 runs were literal `{worktree}` placeholders that never opened a script; no failure was converted to PASS.\n- Under the original acceptance wording the table structurally exists and missing content stays as gaps.\n\nWhat fails:\n- The 'audit existing support' requirement is not met, and several statuses are inaccurate. The audit marks coassignment_attack, zero_break, love_actions (shield recovery) and threshold_route_loss as \"not implemented\" with no source path. But the frozen game source has live legacy mechanisms for exactly these clauses:\n - relationship_service.gd: apply_shield_attack (reports shield_broken), restore_shield, request_route_lock/confirm_route_lock (irreversible route lock).\n - simulation_runtime.gd registers request_route_lock/confirm_route_lock as commands; line 6850 calls apply_shield_attack.\n - event_service.gd lines 1039/1047 apply these as event effects.\n - placement_risk_preview_service.gd computes heroine/rival contact intervals and _shield_attack_candidates.\n- Meanwhile a legacy UI label constant in main.gd is credited as 'partial'. Treating legacy support inconsistently undermines the audit's accuracy for downstream owners.\n\nThe legacy mechanisms need not count as original support (P18-01 forbids one-to-one conversion), but they must be listed with path+SHA and a stated reason for not crediting them. The 'not implemented' entries for the affected clauses are wrong as written.",
|
||||
"acceptance_ids": [
|
||||
"P19-03"
|
||||
],
|
||||
"findings": [
|
||||
{
|
||||
"severity": "medium",
|
||||
"message": "Existing-support audit is incomplete and inconsistent. coassignment_attack, zero_break, love_actions (shield recovery) and threshold_route_loss are recorded as implementation \"not implemented\", but frozen source at anchor 1b07b87 has live legacy mechanisms for them: scripts/relationship/relationship_service.gd apply_shield_attack (264–312, reports shield_broken), restore_shield (246–261), request_route_lock/confirm_route_lock (315–355); autoload/simulation_runtime.gd registers request_route_lock/confirm_route_lock as commands (342–343) and calls apply_shield_attack (6850); scripts/events/event_service.gd applies them as event effects (1039, 1047); scripts/relationship/placement_risk_preview_service.gd computes heroine/rival contact and _shield_attack_candidates (536, 619). Meanwhile a legacy main.gd label constant (89–101) is credited as 'partial'. Fix: record these legacy mechanisms per clause with exact path+SHA+lines at the anchor. Classify each as partial/legacy-not-original (or keep missing for the original model) with an explicit reason, e.g. P18-01 forbids one-to-one conversion and the numbers/daily limits are not approved originals. Keep owners and gaps unchanged. Regenerate the MD and add a self-test that rejects dropping this evidence."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "Most data-level negative tests (wrong character/route, owner, status, stale text) mutate the document and compare it to a canonical built by the same expected() function. They only prove equality with hard-coded facts, not that those facts are correct. Source/baseline/blob/pin corruption tests are real. Consider adding independent assertions, e.g. that every 'missing' item's semantic claim is cross-checked against grep-able absence or presence in the cited source files, so mislabeled statuses like the one above are caught."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "interruption_cancellation maps only §6.5 departure (line 135). The route-terminating clauses — duel loss 'ヒロインを即座に強奪' (153) and '純愛ルート完全消失' (148) — and legacy route_lock irreversibility are not cross-referenced as interruption/cancellation authorities. The character-specific gap covers it, but the common enumeration of interruption handling required by the original work is thin."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "The checker's SPEC_HASH (263a01b9…) is the TASK_SPEC.json file-byte hash. It differs from the contract spec_sha256 (3af3d9b9…), presumably because the contract hashes a different serialization. The runner pass confirms the file is unchanged from base, but the report should say which representation each hash covers."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"id": "P19-03-TABLE",
|
||||
"original_plan_id": "P19-03",
|
||||
"title": "分岐の到達性",
|
||||
"original_work": "人物ごとの3ルートに必要なイベント・条件・中断処理を列挙する。",
|
||||
"original_acceptance": "7名×3ルートの到達表があり、未制作内容は欠損として残る。",
|
||||
"original_denominator": {
|
||||
"packages": 30,
|
||||
"units": 88,
|
||||
"completed_at_start": 14,
|
||||
"partial_credit": false
|
||||
},
|
||||
"whole_original_unit_review_required": true,
|
||||
"scope": "Whole original documentation/audit unit P19-03. Neutral non-graphic state/event IDs and exact source citations only; never create intimate content, narrative events, per-character mechanics or product numbers. Does not implement or accept route gameplay, content, endings, Windows or the whole game.",
|
||||
"authority": [
|
||||
{
|
||||
"path": "docs/traceability/original/BASELINE.txt",
|
||||
"sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a",
|
||||
"sections": "Original §6 seven-character catalog; §7 lines136–161 three routes and relation/duel/action/history rules. Read actual full relevant lines, do not trust line numbers without matching text."
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/work_packages.json",
|
||||
"unit": "P19-03",
|
||||
"acceptance_exact": true
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/atomic_requirements.json",
|
||||
"requirements": "B-7.1 through B-7.6 and relevant character/route clauses; inspect complete selected entries."
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/decisions.json",
|
||||
"rule": "Only approved decisions may fill specifications. D08 pending cells remain 原本未定義/D08 pending 欠損."
|
||||
}
|
||||
],
|
||||
"actual_opus_selection": "dc342e4d69154660bef7e688a70fd783",
|
||||
"frozen_game_input_pins_sha256": "6c778226a4cc6d0b0d682500759e7d4229c926a27bd2e247b00b9c3e5f1a2fb0",
|
||||
"audit_source_anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23",
|
||||
"implementation_requirements": [
|
||||
"Build REACHABILITY_TABLE.json plus deterministic REACHABILITY_TABLE.md with exactly7 canonical character IDs/names from original §6, existing catalog and scripts/relationship/original_relationship_state.gd, crossed with3 original routes 純愛/NTR/堕落. No invented or substituted character/route.",
|
||||
"Every one of21 cells enumerates applicable entry/required events, source-defined state conditions, duel win/loss and route/selection effects, interruption/cancellation and save handling, history/marks and current reachability. Distinguish common baseline rules from character-specific content undefined by the original.",
|
||||
"Every listed event/condition/handling item carries exact original line range+text/hash authority, concrete implementation status implemented/partial/missing, exact existing source path+SHA at the audited source anchor (or explicit not implemented with no fake path), and owning remaining original deliverable. Do not call backend model support a completed natural route.",
|
||||
"Unproduced or undefined character-specific events/conditions/interruption/save/history content remains explicitly 欠損 with reason and owning remaining original item. Missing content is allowed by the unchanged original audit acceptance; it is never game acceptance. Preserve unknown numeric thresholds/rates/initial values as pending; use neutral abstract state IDs only.",
|
||||
"Implement stdlib check_reachability_table.py and test_reachability_table.py under this documentation directory. This placement is inside actual Opus proposed docs/** scope and preserves the exact1368 selected native-game input set. Do not add new files under tools, game scripts, data, tests, marker registry or other game-selected paths.",
|
||||
"Checker verifies exact7×3 unique complete cell set, canonical IDs, original pinned source+line text, no uncited item, exact current source SHA+anchor binding, valid status/owner and explicit gaps, no fabricated thresholds/unsupported completion, and byte-for-byte deterministic Markdown regeneration. --check must be read-only; optional --write may regenerate view during implementation.",
|
||||
"Source binding enforces complete frozen selected-source map, no missing/new/changed selected files, marker/policy/engine/roster/parse identity and baseline hash. Validate FROZEN_GAME_INPUT_PINS.json against this immutable spec SHA field. Code source evidence may cite published audited anchor; checker output binds actual current commit and proves exact file equality. Do not fabricate a future self-containing commit SHA.",
|
||||
"Cross-cutting UI/Runtime/save/Windows applicability is explicit: audit existing support and missing mechanisms per route; this documentation-only unit introduces no product OS behavior, so audit-unit native GUI/Windows execution is not applicable. Global/other-unit Windows and game acceptance remain open.",
|
||||
"Self-tests meaningfully reject missing/duplicate cell, wrong character/route, missing category/citation, stale source/baseline text/hash, invented numeric threshold, missing content falsely marked complete, wrong owning deliverable/status, malformed JSON/types, or Markdown drift; include valid implemented/partial/missing controls. No test-count padding.",
|
||||
"Reuse existing completed P13-03 content-audit checker pattern as guidance. Preserve all current game files, original text, decisions, frozen pins, immutable TASK_SPEC and selection record. Do not revise acceptance or invent D05/D08 answers.",
|
||||
"Provide concise implementation report with all requirements mapped to files/checks, actual invocations/results and remaining parent/game gaps. No worker claim or exit0 substitutes for independent whole-unit review and normal gates."
|
||||
],
|
||||
"required_outputs": [
|
||||
"REACHABILITY_TABLE.json",
|
||||
"REACHABILITY_TABLE.md",
|
||||
"check_reachability_table.py",
|
||||
"test_reachability_table.py",
|
||||
"IMPLEMENTATION_REPORT.md"
|
||||
],
|
||||
"validation_interface": [
|
||||
{
|
||||
"id": "p19-table",
|
||||
"argv": [
|
||||
"{python}",
|
||||
"{worktree}/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py",
|
||||
"--project-root",
|
||||
"{worktree}",
|
||||
"--check"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "p19-negative",
|
||||
"argv": [
|
||||
"{python}",
|
||||
"{worktree}/docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py",
|
||||
"--project-root",
|
||||
"{worktree}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "p19-source-binding",
|
||||
"argv": [
|
||||
"{python}",
|
||||
"{worktree}/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py",
|
||||
"--project-root",
|
||||
"{worktree}",
|
||||
"--source-binding-only"
|
||||
]
|
||||
}
|
||||
],
|
||||
"workflow": [
|
||||
"Register fixed original acceptance P19-03 once; actual Opus confirms next registered run and chooses Sol6.1 default/Astra only justified. One managed worker, no duplicate task.",
|
||||
"Worker local static+checker+self-tests only; do not run native full during implementation.",
|
||||
"Required full native evidence may be reused only after independent exact candidate input equality against frozen C/S source/settings/markers/policy/engine/test inputs/roster/applicability. Doc helpers live outside selected source set; no narrowed equality definition. If equality fails do not claim reuse or launch an uncontrolled full.",
|
||||
"Separate actual Opus whole-original P19-03 review against full original §6–7 and exact acceptance. Reviewer decides whether explicit D08/content gaps satisfy audit acceptance; fail honestly if not, never redefine it.",
|
||||
"Normal prepare-integration, actual C/M exact equality, existing real main permission only (no fabricated new human speech), normal final, ledger+push. Only then original P19-03 may add1 to14/88."
|
||||
],
|
||||
"pending_not_waived": [
|
||||
"P04 existing D05 owner choices",
|
||||
"D08 production chapter/route/content scope",
|
||||
"P19-01/02 Runtime and normal route gameplay",
|
||||
"P20/P26 content/endings/encyclopedia",
|
||||
"P13 four low production followups",
|
||||
"Global same-Windows acceptance and held gestures remain open"
|
||||
],
|
||||
"model_proposal": {
|
||||
"codex_model": "gpt-6.1-sol",
|
||||
"actual_opus_decision": "dc342e4d69154660bef7e688a70fd783"
|
||||
}
|
||||
}
|
||||
+325
@@ -0,0 +1,325 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Read-only, stdlib P19-03 documentation validator; never accepts gameplay."""
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
OUT = 'docs/plans/original-completion-2026-10-02/execution/p19-03/'
|
||||
PLAN = 'docs/plans/original-completion-2026-10-02/'
|
||||
BASELINE = 'docs/traceability/original/BASELINE.txt'
|
||||
ANCHOR = '1b07b87d3736e777932315a4bdde8b70cbf9cb23'
|
||||
BASE = '8ca9263fee1ec4374d97c01fda82b95e1df6a977'
|
||||
BASE_HASH = '75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a'
|
||||
SPEC_FILE_BYTES_SHA256 = '263a01b943d8056727335fb76977c010298e1c229077f8da76e48683ba2e89bb'
|
||||
# Proof: build/owner-handoff/p19-review-r01/SPEC_HASH_REPRESENTATIONS.json
|
||||
# Both hashes describe the same unchanged TASK_SPEC.json.
|
||||
RUNNER_CONTRACT_SPEC_SHA256 = '3af3d9b931edc5449796662ad69bb6f67c80b48827a86565b1952931db68dd15'
|
||||
PINS_HASH = '6c778226a4cc6d0b0d682500759e7d4229c926a27bd2e247b00b9c3e5f1a2fb0'
|
||||
ROUTES = {'love': '純愛', 'ntr': 'NTR', 'corruption': '堕落'}
|
||||
PEOPLE = [('anri', 'アンリ'), ('fine', 'フィーネ'), ('tomari', 'トマリ'),
|
||||
('amelia', 'アメリア'), ('liz', 'リズ'), ('mimi', 'ミミ'), ('satsuki', 'サツキ')]
|
||||
CATEGORIES = ('entry_required_events', 'state_conditions', 'duel_effects',
|
||||
'route_selection_effects', 'interruption_cancellation', 'save_handling',
|
||||
'history_marks', 'current_reachability')
|
||||
STATE = 'scripts/relationship/original_relationship_state.gd'
|
||||
SERVICE = 'scripts/relationship/relationship_service.gd'
|
||||
RUNTIME = 'autoload/simulation_runtime.gd'
|
||||
CATALOG = 'data/characters/mvp_unique_characters.json'
|
||||
|
||||
EVENT = 'scripts/events/event_service.gd'
|
||||
PREVIEW = 'scripts/relationship/placement_risk_preview_service.gd'
|
||||
LEGACY_REASON = 'P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.'
|
||||
LEGACY_RANGES = {
|
||||
'coassignment_attack': [(SERVICE,264,312),(RUNTIME,6850,6850),(EVENT,1039,1039),(PREVIEW,536,565),(PREVIEW,619,640)],
|
||||
'zero_break': [(SERVICE,264,312),(RUNTIME,6850,6850),(EVENT,1039,1039)],
|
||||
'love_actions': [(SERVICE,246,261)],
|
||||
'threshold_route_loss': [(SERVICE,315,340),(SERVICE,343,355),(RUNTIME,342,343),(EVENT,1047,1047)],
|
||||
'legacy_event_ui': [('scenes/main/main.gd',98,101)],
|
||||
}
|
||||
|
||||
|
||||
def validate_legacy(root, document):
|
||||
rules = {r['id']: r for r in document['common_rules']}
|
||||
for identity, ranges in LEGACY_RANGES.items():
|
||||
rule = rules[identity]
|
||||
require(rule['status'] == 'missing' and rule['legacy_classification'] == 'legacy_not_original',
|
||||
'legacy/original classification')
|
||||
require(rule['implementation'] == 'original conformance missing; see legacy_evidence'
|
||||
and rule['legacy_reason'] == LEGACY_REASON, 'unqualified legacy absence')
|
||||
entries = rule.get('legacy_evidence')
|
||||
require(type(entries) is list and len(entries) == len(ranges), 'missing legacy evidence')
|
||||
for entry, (path, start, end) in zip(entries, ranges):
|
||||
data = blob(root, ANCHOR, path)
|
||||
oid = subprocess.check_output(['git','rev-parse',ANCHOR+':'+path],cwd=root).decode().strip()
|
||||
require(entry == {'path':path,'anchor':ANCHOR,'git_blob_oid':oid,
|
||||
'sha256':sha(data),'lines':[start,end],
|
||||
'text':'\n'.join(data.decode().splitlines()[start-1:end])}, 'legacy text/blob/range')
|
||||
require(data == (root/path).read_bytes(), 'legacy current source mismatch')
|
||||
|
||||
|
||||
def sha(data):
|
||||
return hashlib.sha256(data).hexdigest()
|
||||
|
||||
|
||||
def require(value, message):
|
||||
if not value:
|
||||
raise ValueError(message)
|
||||
|
||||
|
||||
def decode(data):
|
||||
def unique(pairs):
|
||||
result = {}
|
||||
for k, v in pairs:
|
||||
require(k not in result, 'duplicate JSON key: ' + k)
|
||||
result[k] = v
|
||||
return result
|
||||
return json.loads(data, object_pairs_hook=unique,
|
||||
parse_constant=lambda s: (_ for _ in ()).throw(ValueError(s)))
|
||||
|
||||
|
||||
def blob(root, commit, path):
|
||||
return subprocess.check_output(['git', 'show', commit + ':' + path], cwd=root)
|
||||
|
||||
|
||||
def selection(root):
|
||||
paths = [p for folder in ('autoload', 'scripts', 'scenes', 'data', 'tests', 'assets', 'tools')
|
||||
for p in (root / folder).rglob('*')
|
||||
if p.is_file() and p.name != '.DS_Store' and '__pycache__' not in p.parts]
|
||||
paths += [root / p for p in ('project.godot', 'export_presets.cfg', 'Makefile', 'AGENTS.md')]
|
||||
require(all(not p.is_symlink() for p in paths), 'selected source aliases refused')
|
||||
return {p.relative_to(root).as_posix(): {'bytes': p.stat().st_size, 'sha256': sha(p.read_bytes())}
|
||||
for p in sorted(paths)}
|
||||
|
||||
|
||||
def binding(root):
|
||||
raw = lambda p: (root / p).read_bytes()
|
||||
require(sha(raw(OUT + 'TASK_SPEC.json')) == SPEC_FILE_BYTES_SHA256, 'immutable spec changed')
|
||||
spec = decode(raw(OUT + 'TASK_SPEC.json'))
|
||||
require(sha(raw(OUT + 'FROZEN_GAME_INPUT_PINS.json')) == spec['frozen_game_input_pins_sha256'] == PINS_HASH,
|
||||
'frozen pins SHA differs from immutable spec')
|
||||
pins = decode(raw(OUT + 'FROZEN_GAME_INPUT_PINS.json'))
|
||||
require(pins['audited_game_source_anchor_commit'] == spec['audit_source_anchor'] == ANCHOR, 'anchor identity')
|
||||
actual = selection(root)
|
||||
require(actual == pins['source_files'], 'full selected-source map: missing/new/changed file')
|
||||
for key in ('marker_contract', 'policy', 'engine'):
|
||||
require(sha(Path(pins[key + '_path']).read_bytes() if key == 'engine' else raw(pins[key + '_path']))
|
||||
== pins[key + '_sha256'], key + ' identity')
|
||||
require(sha(raw(BASELINE)) == pins['baseline_sha256'] == BASE_HASH, 'baseline hash')
|
||||
require(len(raw(BASELINE)) == pins['baseline_bytes'], 'baseline bytes')
|
||||
roster = ['tests/run_tests.gd'] + sorted(p.relative_to(root).as_posix()
|
||||
for p in (root / 'tests').rglob('test*.gd') if 'export' not in p.relative_to(root).parts
|
||||
and p.relative_to(root).as_posix() != 'tests/s0/test_kernel_and_save.gd')
|
||||
require(roster == pins['roster'], 'roster identity')
|
||||
require(sum(p.endswith('.gd') for p in actual) == pins['parse_files'], 'parse selection identity')
|
||||
# Audit evidence is bound to published blobs, never a future self-containing commit.
|
||||
for p in (STATE, SERVICE, RUNTIME, CATALOG):
|
||||
require(raw(p) == blob(root, ANCHOR, p), 'stale audited source: ' + p)
|
||||
return {'actual_commit': subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip(),
|
||||
'selected_files': len(actual), 'anchor': ANCHOR, 'file_equality': True,
|
||||
'native_evidence_reuse_accepted': False,
|
||||
'TASK_SPEC_file_bytes_sha256': SPEC_FILE_BYTES_SHA256,
|
||||
'Runner_git_show_stripped_UTF8_contract_spec_sha256': RUNNER_CONTRACT_SPEC_SHA256}
|
||||
|
||||
|
||||
def expected(root):
|
||||
raw = lambda p: (root / p).read_bytes()
|
||||
require(sha(raw(BASELINE)) == BASE_HASH, 'baseline changed')
|
||||
for name in ('atomic_requirements.json', 'work_packages.json', 'decisions.json'):
|
||||
require(raw(PLAN + name) == blob(root, BASE, PLAN + name), 'original register changed: ' + name)
|
||||
require(raw(OUT + 'ACTUAL_OPUS_NEXT_ORIGINAL_UNIT_SELECTION.json') ==
|
||||
blob(root, BASE, OUT + 'ACTUAL_OPUS_NEXT_ORIGINAL_UNIT_SELECTION.json'), 'selection record changed')
|
||||
lines = raw(BASELINE).decode().splitlines()
|
||||
def cite(start, end=None):
|
||||
end = end or start
|
||||
return {'path': BASELINE, 'lines': [start, end],
|
||||
'text': '\n'.join(lines[start - 1:end]), 'baseline_sha256': BASE_HASH}
|
||||
def evidence(path, start, end):
|
||||
data = blob(root, ANCHOR, path)
|
||||
require(data == raw(path), 'stale source ' + path)
|
||||
return {'path': path, 'sha256': sha(data), 'anchor': ANCHOR,
|
||||
'lines': [start, end], 'text': '\n'.join(data.decode().splitlines()[start - 1:end])}
|
||||
def item(identity, start, end, note, owner, status='missing', source=None):
|
||||
return {'id': identity, 'authority': cite(start, end), 'status': status,
|
||||
'implementation': source or 'original conformance missing', 'owner': owner,
|
||||
'observation': note, 'gap': None if status == 'implemented' else '欠損: ' + note}
|
||||
# Only narrow storage facts are implemented; simulation/route completion never follows.
|
||||
rules = [
|
||||
item('state_fields', 138, 143, '原本3値と盾の明示値の検証・保持のみ。初期値と更新方針は未定。',
|
||||
'P18-01', 'implemented', evidence(STATE, 4, 34)),
|
||||
item('affection_max_invariant', 140, 140, '入力時の最大値一致検証のみ。通常操作の回復・更新は欠損。',
|
||||
'P18-01', 'partial', evidence(STATE, 20, 30)),
|
||||
item('snapshot_container', 138, 143, '専用状態と旧値の分離保存・復元。人物別ルート進行保存を意味しない。',
|
||||
'P18-01', 'partial', evidence(SERVICE, 423, 479)),
|
||||
item('identity_registration', 138, 138, 'Runtimeは登録済み人物・相互対応を検証。既存カタログのヒロインはアンリのみ。通常ルート入口ではない。',
|
||||
'P19-01', 'partial', evidence(RUNTIME, 6791, 6812)),
|
||||
item('legacy_event_ui', 154, 157, '既存UIには汎用関係イベントの確認/保留ラベルがある。原本の行動・決闘選択・自然ルート到達は欠損。',
|
||||
'P19-01', 'partial', evidence('scenes/main/main.gd', 98, 101)),
|
||||
]
|
||||
clauses = [
|
||||
('defense_reduction', 141, 141, 'P18-02'), ('post_break_metric', 142, 143, 'P18-02'),
|
||||
('barrier_block', 143, 143, 'P18-02'), ('coassignment_attack', 145, 145, 'P18-02'),
|
||||
('zero_break', 146, 146, 'P18-02'), ('contact_after_break', 147, 147, 'P18-02'),
|
||||
('threshold_route_loss', 148, 148, 'P18-03'), ('duel_types', 150, 151, 'P19-01'),
|
||||
('duel_win', 152, 152, 'P19-01'), ('duel_loss', 153, 153, 'P19-01'),
|
||||
('love_actions', 155, 155, 'P19-01'), ('ntr_actions', 156, 156, 'P19-01'),
|
||||
('corruption_actions', 157, 157, 'P19-01'), ('history_fields', 159, 159, 'P19-02'),
|
||||
('history_cycle_parentage', 160, 160, 'P19-02'), ('portrait_marks', 161, 161, 'P26-02'),
|
||||
('route_skills', 132, 132, 'P20-01'), ('departure', 135, 135, 'P19-02')]
|
||||
for identity, start, end, owner in clauses:
|
||||
rules.append(item(identity, start, end,
|
||||
'原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。', owner))
|
||||
for rule in rules:
|
||||
if rule['id'] in LEGACY_RANGES:
|
||||
rule.update(status='missing', implementation='original conformance missing; see legacy_evidence',
|
||||
legacy_classification='legacy_not_original', legacy_reason=LEGACY_REASON)
|
||||
rule['gap'] = '欠損: ' + rule['observation'] + ' ' + LEGACY_REASON
|
||||
rule['legacy_evidence'] = []
|
||||
for path, start, end in LEGACY_RANGES[rule['id']]:
|
||||
entry = evidence(path, start, end)
|
||||
entry['git_blob_oid'] = subprocess.check_output(
|
||||
['git','rev-parse',ANCHOR+':'+path],cwd=root).decode().strip()
|
||||
rule['legacy_evidence'].append(entry)
|
||||
# Read complete selected atomic records, not only their condition strings.
|
||||
atoms = decode(raw(PLAN + 'atomic_requirements.json'))['requirements']
|
||||
atoms = [x for x in atoms if set(x.get('source_group_ids', [])) & {'B-7.' + str(i) for i in range(1, 7)}]
|
||||
owners = {x['id'] for p in decode(raw(PLAN + 'work_packages.json')) for x in p.get('remaining_deliverables', [])}
|
||||
require(all(r['owner'] in owners for r in rules), 'unknown original owner')
|
||||
for key, name in PEOPLE:
|
||||
for route in ROUTES:
|
||||
require(any(x['id'] == 'AR.heroine.' + key + '.route.' + route and
|
||||
x['entity'] == {'kind': 'heroine', 'key': key, 'original_name': name} for x in atoms),
|
||||
'canonical atomic character/route missing')
|
||||
require(all(name in lines[117 + i] for i, (_, name) in enumerate(PEOPLE)), 'original character names')
|
||||
cells = []
|
||||
for i, (key, name) in enumerate(PEOPLE):
|
||||
for route, route_name in ROUTES.items():
|
||||
refs = {
|
||||
'entry_required_events': ['identity_registration', route + '_actions'],
|
||||
'state_conditions': ['state_fields', 'affection_max_invariant', 'defense_reduction',
|
||||
'post_break_metric', 'barrier_block', 'coassignment_attack', 'zero_break', 'contact_after_break'],
|
||||
'duel_effects': ['duel_types', 'duel_win', 'duel_loss'],
|
||||
'route_selection_effects': ['threshold_route_loss', route + '_actions', 'route_skills'],
|
||||
'interruption_cancellation': ['departure', 'threshold_route_loss', 'duel_loss'], 'save_handling': ['snapshot_container'],
|
||||
'history_marks': ['history_fields', 'history_cycle_parentage', 'portrait_marks'],
|
||||
'current_reachability': ['identity_registration', 'threshold_route_loss']}
|
||||
categories = {}
|
||||
for category in CATEGORIES:
|
||||
owner = {'entry_required_events': 'P26-01', 'state_conditions': 'P18-02',
|
||||
'duel_effects': 'P19-01', 'route_selection_effects': 'P26-02',
|
||||
'interruption_cancellation': 'P19-02', 'save_handling': 'P19-02',
|
||||
'history_marks': 'P19-02', 'current_reachability': 'P20-02'}[category]
|
||||
gap = item(key + '_' + route + '_' + category, 138, 161,
|
||||
'原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。', owner)
|
||||
gap['character_authority'] = cite(118 + i)
|
||||
categories[category] = {'common_rule_refs': refs[category], 'character_specific': gap}
|
||||
if category == 'interruption_cancellation':
|
||||
categories[category].update(route_termination_authorities=[cite(148),cite(153)],
|
||||
legacy_classification='legacy_not_original', legacy_reason=LEGACY_REASON,
|
||||
legacy_evidence=[e for r in rules if r['id']=='threshold_route_loss'
|
||||
for e in r['legacy_evidence'] if e['path']==SERVICE and e['lines']==[343,355]])
|
||||
|
||||
cells.append({'character_id': key, 'name': name, 'route_id': route, 'route': route_name,
|
||||
'natural_route_complete': False, 'categories': categories})
|
||||
return {'task_id': 'P19-03-TABLE', 'schema_version': 1,
|
||||
'identity_policy': '原本§6の名前とatomic entity.keyを監査IDに使用。実装IDを捏造しない。カタログにはheroine_anriのみ。OriginalRelationshipStateはsubject_idを保持し7名の列挙はしない。',
|
||||
'source_anchor': ANCHOR, 'common_rules': rules, 'cells': cells,
|
||||
'authority_snapshots': {p: {'sha256': sha(raw(p)), 'base_commit': BASE,
|
||||
'records': decode(raw(p)) if p.endswith('decisions.json') else atoms if p.endswith('atomic_requirements.json')
|
||||
else [x for x in decode(raw(p)) if x['id'] in ('P18', 'P19', 'P20', 'P26')]}
|
||||
for p in (PLAN + 'atomic_requirements.json', PLAN + 'work_packages.json', PLAN + 'decisions.json')},
|
||||
'catalog_evidence': evidence(CATALOG, 1, 32),
|
||||
'pending': {'D05': 'pending', 'D08': 'pending', 'thresholds': None, 'rates': None, 'initial_values': None},
|
||||
'route_support': {r: {'UI': '欠損: 原本行動・3種決闘・原本3軸/盾の通常操作なし。既存汎用関係UIを原本ルートとしない。',
|
||||
'Runtime': 'partial: 原本明示状態の登録・identity検証のみ。共通更新と通常ルート到達は欠損。',
|
||||
'save': 'partial: 専用状態/旧値コンテナ保存あり。人物固有進行・中断再開は欠損。',
|
||||
'Windows': '未受入: global same-Windows acceptanceはopen。文書単位のnative GUI/Windows実行は適用外。',
|
||||
'evidence_refs': ['legacy_event_ui', 'identity_registration', 'snapshot_container', 'state_fields'],
|
||||
'missing_mechanisms': [x[0] for x in clauses]} for r in ROUTES.values()},
|
||||
'acceptance': '7名×3ルートの到達表があり、未制作内容は欠損として残る。',
|
||||
'accounting': '14/88 unchanged; formal Runner validation, independent whole-unit Opus review and normal integration/final required; no game acceptance'}
|
||||
|
||||
|
||||
def verify(candidate, canonical, root=None):
|
||||
require(type(candidate) is dict, 'document must be an object')
|
||||
if root is not None:
|
||||
validate_legacy(root, candidate)
|
||||
# Exact canonical equality also rejects additions, type coercion, invented numbers,
|
||||
# owner/status promotion and unsupported completion, including nested metadata.
|
||||
require(json.dumps(candidate, ensure_ascii=False, sort_keys=True) ==
|
||||
json.dumps(canonical, ensure_ascii=False, sort_keys=True), 'table differs from pinned canonical audit')
|
||||
|
||||
|
||||
def verify_records(candidate, canonical, markdown_bytes):
|
||||
verify(candidate, canonical)
|
||||
require(markdown_bytes == markdown(canonical).encode(), 'Markdown drift')
|
||||
|
||||
|
||||
def markdown(d):
|
||||
lines = ['# P19-03 到達表', '', d['acceptance'], '', d['identity_policy'], '',
|
||||
'共通原本ルールと人物固有欠損を分離する。implementedは狭い保持処理だけで、自然ルート完成ではない。', '',
|
||||
'|人物ID|原名|ルート|現在の到達性|', '|---|---|---|---|']
|
||||
for c in d['cells']:
|
||||
lines.append('|%s|%s|%s|欠損・通常到達未証明|' % (c['character_id'], c['name'], c['route']))
|
||||
lines += ['', '## 共通原本ルール', '']
|
||||
for r in d['common_rules']:
|
||||
lines += ['### ' + r['id'], '', r['status'] + ' / owner: ' + r['owner'], '',
|
||||
r['observation'], '', '原本 %s:%s–%s' % (BASELINE, *r['authority']['lines']), '',
|
||||
'```text', r['authority']['text'], '```', '',
|
||||
'実装証拠: ' + json.dumps(r['implementation'], ensure_ascii=False, sort_keys=True), '']
|
||||
if 'legacy_evidence' in r:
|
||||
lines += ['旧実装: ' + r['legacy_classification'] + ' / ' + r['legacy_reason'], '',
|
||||
'旧証拠 (git_blob_oid: Git blob OID; sha256: file-bytes SHA-256): ' +
|
||||
json.dumps(r['legacy_evidence'], ensure_ascii=False, sort_keys=True), '']
|
||||
for c in d['cells']:
|
||||
lines += ['## ' + c['character_id'] + ' / ' + c['name'] + ' / ' + c['route'], '']
|
||||
for category, record in c['categories'].items():
|
||||
g = record['character_specific']
|
||||
lines += ['- ' + category + ': 共通 [' + ', '.join(record['common_rule_refs']) +
|
||||
'] / missing / ' + g['gap'] + ' / owner: ' + g['owner'] +
|
||||
' / 原本 ' + str(g['authority']['lines']) + '・人物 ' + str(g['character_authority']['lines'])]
|
||||
if category == 'interruption_cancellation':
|
||||
lines += [' 原本中断参照: ' + json.dumps(record['route_termination_authorities'], ensure_ascii=False),
|
||||
' 旧確定ロック legacy_not_original: ' + json.dumps(record['legacy_evidence'], ensure_ascii=False)]
|
||||
lines.append('')
|
||||
lines += ['## ルート別適用性', '']
|
||||
for route, support in d['route_support'].items():
|
||||
lines += ['### ' + route, '']
|
||||
lines += ['- ' + k + ': ' + v for k, v in support.items() if isinstance(v, str)]
|
||||
lines += ['- 欠損機構: ' + ', '.join(support['missing_mechanisms']), '']
|
||||
lines += ['D05/D08、閾値・率・初期値はpending。完全な出典本文・SHA・原子要件全レコードはJSONに保持する。', '', d['accounting'], '']
|
||||
return '\n'.join(lines)
|
||||
|
||||
|
||||
def main():
|
||||
p = argparse.ArgumentParser(description=__doc__)
|
||||
p.add_argument('--project-root', type=Path, required=True)
|
||||
mode = p.add_mutually_exclusive_group(required=True)
|
||||
mode.add_argument('--check', action='store_true')
|
||||
mode.add_argument('--write', action='store_true')
|
||||
mode.add_argument('--source-binding-only', action='store_true')
|
||||
args = p.parse_args()
|
||||
try:
|
||||
root = args.project_root.resolve()
|
||||
result = binding(root)
|
||||
if not args.source_binding_only:
|
||||
canonical = expected(root)
|
||||
validate_legacy(root, canonical)
|
||||
if args.write:
|
||||
(root / OUT / 'REACHABILITY_TABLE.json').write_text(json.dumps(canonical, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
|
||||
(root / OUT / 'REACHABILITY_TABLE.md').write_text(markdown(canonical), encoding='utf-8')
|
||||
else:
|
||||
validate_legacy(root, decode((root / OUT / 'REACHABILITY_TABLE.json').read_bytes()))
|
||||
verify_records(decode((root / OUT / 'REACHABILITY_TABLE.json').read_bytes()), canonical,
|
||||
(root / OUT / 'REACHABILITY_TABLE.md').read_bytes())
|
||||
print(json.dumps({'audit_integrity': 'pass', 'formal_acceptance': 'pending_runner_and_independent_review', **result}))
|
||||
return 0
|
||||
except (ValueError, OSError, KeyError, TypeError, subprocess.CalledProcessError) as e:
|
||||
print(json.dumps({'audit_integrity': 'fail', 'error': str(e)}))
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
+167
@@ -0,0 +1,167 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Meaningful in-memory controls; no product, Git or fixture writes."""
|
||||
import argparse
|
||||
import copy
|
||||
from pathlib import Path
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
import check_reachability_table as audit
|
||||
|
||||
ROOT = None
|
||||
|
||||
|
||||
class AuditTests(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.canonical = audit.expected(ROOT)
|
||||
|
||||
def reject(self, mutate):
|
||||
changed = copy.deepcopy(self.canonical)
|
||||
mutate(changed)
|
||||
with self.assertRaises(ValueError):
|
||||
audit.verify(changed, self.canonical)
|
||||
|
||||
def test_valid_implemented_partial_missing(self):
|
||||
# All three legitimate status classes must survive serialization and the
|
||||
# exact same verifier used by --check, without status promotion.
|
||||
import json
|
||||
value = audit.decode(json.dumps(self.canonical))
|
||||
self.assertEqual({r['status'] for r in value['common_rules']}, {'implemented', 'partial', 'missing'})
|
||||
audit.verify(value, self.canonical)
|
||||
|
||||
def test_independent_legacy_source_evidence(self):
|
||||
import subprocess
|
||||
document = audit.decode((ROOT / audit.OUT / 'REACHABILITY_TABLE.json').read_bytes())
|
||||
audit.validate_legacy(ROOT, document)
|
||||
for rule in document['common_rules']:
|
||||
for entry in rule.get('legacy_evidence', []):
|
||||
data = subprocess.check_output(['git', 'show', audit.ANCHOR + ':' + entry['path']], cwd=ROOT)
|
||||
self.assertEqual(data, (ROOT / entry['path']).read_bytes())
|
||||
self.assertEqual(entry['git_blob_oid'], subprocess.check_output(
|
||||
['git','hash-object','--stdin'], input=data, cwd=ROOT).decode().strip())
|
||||
start, end = entry['lines']
|
||||
self.assertEqual(entry['text'], '\n'.join(data.decode().splitlines()[start-1:end]))
|
||||
rules = {r['id']: r for r in document['common_rules']}
|
||||
self.assertIn('func restore_shield', rules['love_actions']['legacy_evidence'][0]['text'])
|
||||
self.assertIn('shield_broken', rules['zero_break']['legacy_evidence'][0]['text'])
|
||||
self.assertIn('EXCLUSIVE_LOCKED', rules['threshold_route_loss']['legacy_evidence'][1]['text'])
|
||||
|
||||
def test_legacy_evidence_required_independently(self):
|
||||
for identity in audit.LEGACY_RANGES:
|
||||
for mutation in ('drop', 'empty', 'absence', 'blob', 'text'):
|
||||
changed = copy.deepcopy(self.canonical)
|
||||
rule = next(r for r in changed['common_rules'] if r['id'] == identity)
|
||||
if mutation == 'drop':
|
||||
rule.pop('legacy_evidence')
|
||||
elif mutation == 'empty':
|
||||
rule['legacy_evidence'] = []
|
||||
elif mutation == 'absence':
|
||||
rule['implementation'] = 'not implemented'
|
||||
else:
|
||||
rule['legacy_evidence'][0]['git_blob_oid' if mutation == 'blob' else 'text'] = 'stale'
|
||||
with self.subTest(identity=identity, mutation=mutation), self.assertRaises(ValueError):
|
||||
audit.validate_legacy(ROOT, changed)
|
||||
|
||||
def test_exact_cell_product(self):
|
||||
mutations = {
|
||||
'missing': lambda d: d['cells'].pop(),
|
||||
'duplicate': lambda d: d['cells'].append(copy.deepcopy(d['cells'][0])),
|
||||
'wrong_character': lambda d: d['cells'][0].update(character_id='unregistered'),
|
||||
'wrong_route': lambda d: d['cells'][0].update(route='unregistered'),
|
||||
}
|
||||
for name, mutate in mutations.items():
|
||||
with self.subTest(name=name):
|
||||
self.reject(mutate)
|
||||
|
||||
def test_categories_and_citations(self):
|
||||
self.reject(lambda d: d['cells'][0]['categories'].pop('save_handling'))
|
||||
self.reject(lambda d: d['common_rules'][0].pop('authority'))
|
||||
self.reject(lambda d: d['cells'][0]['categories']['state_conditions']['character_specific'].pop('character_authority'))
|
||||
|
||||
def test_stale_record_evidence(self):
|
||||
for field in ('text', 'baseline_sha256'):
|
||||
with self.subTest(field=field):
|
||||
self.reject(lambda d: d['common_rules'][0]['authority'].update({field: 'stale'}))
|
||||
for field in ('text', 'sha256', 'anchor'):
|
||||
with self.subTest(field=field):
|
||||
self.reject(lambda d: d['common_rules'][0]['implementation'].update({field: 'stale'}))
|
||||
|
||||
def test_real_source_and_baseline_changes(self):
|
||||
original = Path.read_bytes
|
||||
for target in (audit.BASELINE, audit.STATE):
|
||||
def corrupt(path):
|
||||
value = original(path)
|
||||
return value + b'\nchanged' if path == ROOT / target else value
|
||||
with self.subTest(target=target), patch.object(Path, 'read_bytes', corrupt):
|
||||
with self.assertRaises(ValueError):
|
||||
audit.expected(ROOT)
|
||||
actual_blob = audit.blob
|
||||
def corrupt_blob(root, commit, path):
|
||||
value = actual_blob(root, commit, path)
|
||||
return value + b'\nchanged' if path == audit.STATE else value
|
||||
with patch.object(audit, 'blob', side_effect=corrupt_blob):
|
||||
with self.assertRaises(ValueError):
|
||||
audit.expected(ROOT)
|
||||
|
||||
def test_no_invented_values_or_completion(self):
|
||||
self.reject(lambda d: d['pending'].update(thresholds=50))
|
||||
self.reject(lambda d: d['common_rules'][5].update(status='implemented'))
|
||||
self.reject(lambda d: d['cells'][0].update(natural_route_complete=True))
|
||||
self.reject(lambda d: d['cells'][0]['categories']['entry_required_events']['character_specific'].update(status='implemented', gap=None))
|
||||
|
||||
def test_owner_and_status(self):
|
||||
self.reject(lambda d: d['common_rules'][0].update(owner='P99-01'))
|
||||
self.reject(lambda d: d['common_rules'][0].update(owner='P19-02'))
|
||||
self.reject(lambda d: d['common_rules'][0].update(status='complete'))
|
||||
|
||||
def test_json_and_types(self):
|
||||
for data in ('{', '{"x":1,"x":2}', '{"x":NaN}'):
|
||||
with self.subTest(data=data), self.assertRaises(ValueError):
|
||||
audit.decode(data)
|
||||
for value in ([], None, 'table'):
|
||||
with self.subTest(value=value), self.assertRaises(ValueError):
|
||||
audit.verify(value, self.canonical)
|
||||
self.reject(lambda d: d.update(cells={}))
|
||||
self.reject(lambda d: d.update(schema_version=True))
|
||||
|
||||
def test_markdown_drift(self):
|
||||
expected = audit.markdown(self.canonical).encode()
|
||||
audit.verify_records(self.canonical, self.canonical,
|
||||
(ROOT / audit.OUT / 'REACHABILITY_TABLE.md').read_bytes())
|
||||
with self.assertRaises(ValueError):
|
||||
audit.verify_records(self.canonical, self.canonical, expected + b'\nchanged')
|
||||
|
||||
def test_full_frozen_map_and_identities(self):
|
||||
audit.binding(ROOT) # Valid frozen-map control; no native execution.
|
||||
actual_selection = audit.selection(ROOT)
|
||||
for kind in ('missing', 'new', 'changed'):
|
||||
changed = copy.deepcopy(actual_selection)
|
||||
key = next(iter(changed))
|
||||
if kind == 'missing':
|
||||
del changed[key]
|
||||
elif kind == 'new':
|
||||
changed['scripts/invented.gd'] = {'bytes': 0, 'sha256': '0' * 64}
|
||||
else:
|
||||
changed[key]['sha256'] = '0' * 64
|
||||
with self.subTest(kind=kind), patch.object(audit, 'selection', return_value=changed):
|
||||
with self.assertRaises(ValueError):
|
||||
audit.binding(ROOT)
|
||||
original = Path.read_bytes
|
||||
pins = audit.decode(original(ROOT / audit.OUT / 'FROZEN_GAME_INPUT_PINS.json'))
|
||||
targets = [ROOT / audit.OUT / 'FROZEN_GAME_INPUT_PINS.json', ROOT / pins['marker_contract_path'],
|
||||
ROOT / pins['policy_path'], Path(pins['engine_path'])]
|
||||
for target in targets:
|
||||
def corrupt(path):
|
||||
value = original(path)
|
||||
return value + b'\nchanged' if path == target else value
|
||||
with self.subTest(target=str(target)), patch.object(Path, 'read_bytes', corrupt):
|
||||
with self.assertRaises(ValueError):
|
||||
audit.binding(ROOT)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--project-root', type=Path, required=True)
|
||||
args, rest = parser.parse_known_args()
|
||||
ROOT = args.project_root.resolve()
|
||||
unittest.main(argv=[__file__] + rest)
|
||||
-63
@@ -1,63 +0,0 @@
|
||||
# Actual Opus authorized non-UI continuation of the same repair4
|
||||
|
||||
Actual commander679a702635994176bef72423ebb989bb selected Codex6.1-sol. Existing GUI is terminal on Antigravity quota; no concurrent worker is active. Contract worker=agy remains original UI assignment; this recorded phase authorizes Codex implementation ONLY for the non-UI checker/static/test/doc files below. Do not launch AGY or repeat/replace GUI work. No task/state/spec/counter changes.
|
||||
|
||||
I authorize one code-only (non-UI) Codex continuation of the same repair4, on the same worktree and task, at exact HEAD 9641ed52def2ff8e5b0222449a4a83a1191e1d37. This does not add a task, worker registration, repair count, cap or spec change. The old GUI-only direction f8c30db is ended (Antigravity quota) and this replaces it only for the remaining non-UI work.
|
||||
|
||||
What I checked read-only:
|
||||
- The defects are real. tools/check_p24_operations_evidence.py:420-424 has the two count-bypass `pass` branches. :400-401 silently skips rows that are not dicts. :409/:413/:417 let a missing SHA, failures or passed field through. :69-73 lets the CANDIDATE_COMMIT/TARGET_HEAD env value take the place of the real git HEAD. :86-95 is a separate local roster that differs from tools/run_all_tests.py roster(root) at :27 (stdlib-only, with a __main__ guard at :314).
|
||||
- The unfinished GUI checker repair4/check_repair4_preservation.py exists but has not been run.
|
||||
- I could not find preserved-GUI-terminal-quota inside this worktree. It is the owner's root copy outside the worktree, so the bridge must check it before launch.
|
||||
|
||||
PRE-LAUNCH (bridge, read-only): record `git rev-parse HEAD` == 9641ed5…; confirm no live job; record the sha256 of the 4 protected files below and confirm they match the root preserved-GUI-terminal-quota copies. Abort on any mismatch.
|
||||
|
||||
PROTECTED, byte-identical, no edits (SHA guard checked before and after the run; any difference = reject, no submit):
|
||||
- scenes/main/main.gd
|
||||
- scenes/main/world_preview.gd
|
||||
- tools/regression/suite-policy.json
|
||||
- docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json
|
||||
Also leave unchanged: OWNER_REPAIR4_GUI_INSTRUCTION.md, OWNER_REPAIR4_SUPPLEMENT_CHECKER.md, root-current-main-reference-20261017/**, and all other scope files not named below.
|
||||
|
||||
ALLOWED EDITS:
|
||||
(a) tools/check_p24_operations_evidence.py, limited to supplement S1/S2 exactly as written in OWNER_REPAIR4_SUPPLEMENT_CHECKER.md:
|
||||
- Load the required suite set from tools/run_all_tests.py roster(root) with importlib, read-only. Remove the local roster or make it a thin wrapper.
|
||||
- Compare suite sets exactly. Reject: an empty or non-list suite list, non-dict rows, a missing path, unknown or duplicate suites, missing required suites, failures that are not int 0 (bool rejected), passed that is not True, and source_sha256 that is missing, not HEX64 or mismatched.
|
||||
- Top-level counts are an optional cross-check only.
|
||||
- Get the real HEAD from `git rev-parse HEAD` with cwd=repo root. If git fails, return "". The env value is only a cross-check, and a mismatch fails. Update the message at :477.
|
||||
- S4: no other guard is changed.
|
||||
(b) docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py: run it, and fix only real defects in it. It must stay read-only toward the protected files.
|
||||
(c) New stdlib test docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py: the 8 negative cases and the positive controls from S3, using temp dirs and a temp `git init` repo.
|
||||
(d) New docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/REPAIR4_CODE_PHASE_STATUS.md:
|
||||
- all 8 conditions marked SOURCE-READY or NOTRUN, each with its dependencies;
|
||||
- the S5 composition prerequisite (S/M/T/Q provenance; reuse the P23 composition functions and current-main run_all_tests source_refs/roster), listed as an unresolved Root dependency with every missing helper named;
|
||||
- S6: the 179 and other earlier passes marked stale for this source;
|
||||
- the GUI quota stop recorded honestly.
|
||||
(e) The SOURCE_READY_PRESERVATION_RESULT.json produced by (b).
|
||||
No other paths.
|
||||
|
||||
LOCAL TEST ARGV (run from the worktree root, these only):
|
||||
1. python3 -m py_compile tools/check_p24_operations_evidence.py tools/run_all_tests.py docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py
|
||||
2. python3 -c "import importlib.util as u;s=u.spec_from_file_location('c','tools/check_p24_operations_evidence.py');m=u.module_from_spec(s);s.loader.exec_module(m)"
|
||||
3. python3 docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py
|
||||
4. python3 docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py
|
||||
5. shasum -a 256 on the 4 protected files, matched against the pre-launch values.
|
||||
|
||||
Forbidden: Godot, engine/native/OS collector, full roster, run_all_tests main(), the full checker against any index, writing acceptance fixtures or index.json, network, commit/branch/push, agy CLI, manual DB/SQL, env relabeling.
|
||||
|
||||
RELEASE/SUBMIT: normal submit only if all 5 steps exit 0, all 4 protected SHAs are unchanged, git status shows changes only in the allowed paths, and every NOTRUN item is documented. Otherwise report the failure output and do not submit (the task stays repair_ready).
|
||||
|
||||
MANDATORY GATES THAT STILL APPLY:
|
||||
- Root S/M/T/Q composition in a genuine composed checkout
|
||||
- Root static/import checks and affected local UI tests in Godot
|
||||
- actual OS Japanese composition and scale evidence
|
||||
- the full required roster on the exact final source
|
||||
- tools/check_p24_operations_evidence.py --verify-only on the real index
|
||||
- a separate independent Claude review with runtime evidence
|
||||
- current-main integration and final validation
|
||||
- Windows same-candidate platform acceptance, still pending
|
||||
|
||||
The 8 conditions remain unmet and nothing counts as acceptance.
|
||||
|
||||
Read OWNER_REPAIR4_SUPPLEMENT_CHECKER.md and the actual current477-line preservation script. Existing4GUIfile working changes are protected, must remain byte-identical. Do not touch Root instruction/reference files. Do not rely on stale prompt source excerpts instead of actual current disk.
|
||||
|
||||
Use python -B where practical. py_compile is permitted by Opus; its small generated __pycache__ is ignored and not source. Do not add unlisted validation artifacts; put required local output facts and8conditions in REPAIR4_CODE_PHASE_STATUS.md. Root will inspect actual captured command exits before normal submit, not your self-report alone. Keep SOURCE-READY/NOTRUN honest.
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
# P24-02 repair4 — current same-session GUI work
|
||||
|
||||
This is the complete current instruction. Supersedes old repair3 patch messages and stale review panel. Work in this existing P24-02-implement workspace only. HEAD9641ed5, same registered task, repairs4/maxnull. The old repair3 output was already committed by Root; do not apply it again.
|
||||
|
||||
## Actual Opus repair direction f9560ec6130142749a929427f7a114c1
|
||||
|
||||
Repair4 (same task, same agy/Antigravity GUI semi-automatic worker via the existing UI packet; no new session, agent, provider, permission or cap change). Purpose: get the source ready for current-main reconciliation only. The latest validation failure (missing BUILD_OUTPUT_DIR/p24-operations-evidence/index.json) is the expected result while no actual run exists. Repair4 must not fabricate that index, add a pass template, or re-run the checker or full suite to make it go away.
|
||||
|
||||
SCOPE: original base 1a5abc65, allowed_paths, spec 738268b4 and all8 conditions stay unchanged. Do NOT merge or rebase whole main into the worker. Reconcile only the 4 conflict files. Use the exact main 51e8657 snapshots in root-current-main-reference-20261017/REFERENCE_MANIFEST.json and check their sha256/blob pins before use: main.gd 92677e4a/fff37f08, world_preview.gd 4bc49a19/fa32fe03, completion_marker_contracts.json 6900df60/2eecb803, suite-policy.json 7eb085d7/ad194ae4. Merge the worker's own P24 diff (1a5abc..9641ed5) onto each snapshot. Every other main change is left to Root composition. If a reconciled file needs a symbol that exists only outside allowed_paths on main, keep the main snapshot text as-is and record it as a Root-composition dependency. Do not stub it or copy that other file.
|
||||
|
||||
1) world_preview.gd: start from the main snapshot. Keep all accepted P23 code intact: LifeOverlay/_draw_life_overlay, the single coherent frame report, its getters and the strict guards. Re-apply the P24 click-control, placement/invalid-drop feedback and bubble render bindings on top, with no duplicated or shadowed funcs/vars/signals.
|
||||
2) main.gd: start from the main snapshot. Keep staff relation snapshot-v2, the save migration, the normal menu, the staff candidate/management panels, _on_snapshot_published and the dimension migration paths. Re-apply the P24 save-label modal/IME, pause/resume, event log, cut-in wiring and operations camera controls. Cut-in hooks attach only to existing signals/states. Ordinary NTR/duel/defense triggers stay explicit unmet dependencies on whole P18-01/02, P19-01 and P21-01. P18 265ce30/5f6bc11 is backend-only.
|
||||
3) completion_marker_contracts.json and suite-policy.json: keep every existing main entry byte-equivalent in meaning, then add only the P24 entries from the worker's diff. Do not regenerate, reorder, weaken or remove any roster, cleanup or completion authority.
|
||||
4) Add a static overlap/preservation check (inside the allowed p24-02 docs/tools paths, e.g. a mode in check_p24_operations_evidence.py or a separate docs script). It lists every func/signal/const/class_name and every JSON top-level/entry key found in (a) the main snapshot and (b) the 9641ed5 P24 side for all 4 files. It fails if any of them is missing or duplicated in the reconciled file. It also statically checks that UI actor bubbles still match the current relation schema fields. Save its output as SOURCE-READY evidence. It is not runtime proof.
|
||||
5) Do not run Godot, OS, import or full tests, and do not run the final checker in a loop. Root owns native/import/affected/full on the composed current-main tree.
|
||||
6) Write a p24-02/repair4 note: reconciliation map per file with pins, the preservation-check result, status SOURCE-READY/NOTRUN, and all8 conditions each still unmet with the exact missing proof/dependency. Windows subconditions stay individually unmet with no pass templates. Old legacy60 evidence is limited and not current acceptance. Formal 14/88 is unchanged and there is no partial credit.
|
||||
|
||||
After repair_ready, a recorded run decision is required before any worker starts.
|
||||
|
||||
## Actual Opus run direction f8c30db569474df482ae6ab16502ce61
|
||||
|
||||
P24-02 is repair_ready (repairs=4, max null). Submitted source 9641ed5 is unchanged and no worker is running. I checked the Root reference set in the workspace: all 4 current-main snapshots are there. That is 2 .gd files renamed to .gd.source.txt, completion_marker_contracts.json and suite-policy.json, plus REFERENCE_MANIFEST.json and the 2 all8/limited-evidence audit JSONs. This matches the owner's statement. The owner authorized only one route, so the run is GUI delivery only. Root gets a ui-packet and sends one complete file-based instruction, through the current UI input, to the existing idle Antigravity IDE session P24-02-implement. Do not use the agy CLI and do not start another worker, session or CLI. Do not change the provider, model, settings or permissions. The old unaccepted repair3 review panel is historical only; do not apply that patch again. Repair4 direction for the worker: (1) Reconcile the 4 files against the 9641ed5 disk state and the main snapshots: scenes/main/main.gd, scenes/main/world_preview.gd, completion_marker_contracts.json and tools/regression/suite-policy.json. Keep all 7 accepted P23 code items and the P24 own diff. Do not merge or rebase the whole of main. (2) In the JSON merges, keep every main snapshot entry body and every P24 added entry. Keep main's ordering, policies and scope. (3) Write a mechanical static preservation audit that uses class- or scope-qualified GDScript symbol identities. Then a legitimate _draw or _init in a different inner class is not flagged as a duplicate. Record the audit result. (4) Add a SOURCE-READY/NOTRUN gap note for all 8 conditions. (5) Static Python, check and diff validation only. No Godot, OS or full roster run. Edit only within allowed_paths. Do not change originalbase, allowed paths, spec, the 8 conditions or the old count. Deliver actual reconciled files, not an outline. This run grants no acceptance, approval, integration or budget change.
|
||||
|
||||
## Full pinned workspace materials
|
||||
|
||||
Read docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/REFERENCE_MANIFEST.json and its exact full snapshot paths. The two Godot source snapshots have .gd.source.txt suffix to prevent duplicate class import; bytes/SHA are unchanged. Read the all8 acceptance/gap and60 evidence SHA audit JSON files in that same directory. Keep this entire reference set immutable. Read immutable docs/spec/acceptance/P24-02-code-r01.json and relevant current source dependencies as needed. No size cap.
|
||||
|
||||
## Contract scope (unchanged)
|
||||
|
||||
[
|
||||
"scenes/main/main.gd",
|
||||
"scenes/main/world_preview.gd",
|
||||
"scripts/ui/event_log_dialog.gd",
|
||||
"scripts/ui/manual_save_slots_dialog.gd",
|
||||
"scripts/ui/operation_feedback.gd",
|
||||
"scripts/ui/operation_feedback.gd.uid",
|
||||
"scripts/ui/operations_camera_controls.gd",
|
||||
"scripts/ui/operations_camera_controls.gd.uid",
|
||||
"tests/ui/test_operations_notification.gd",
|
||||
"tests/ui/test_operations_notification.gd.uid",
|
||||
"tests/ui/fixtures/operations_os_observer.gd",
|
||||
"tests/ui/fixtures/operations_os_observer.gd.uid",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"tools/run_all_tests.py",
|
||||
"tools/regression/suite-policy.json",
|
||||
"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/**"
|
||||
]
|
||||
|
||||
## Required actual result
|
||||
|
||||
Implement the reconciled source files and a meaningful static preservation checker plus its real result, and all8 SOURCE-READY/NOTRUN note in the allowed p24-02 docs area. Root owns actual native/current-main composition, import, impact, OS, final full and acceptance. Do not run Godot/LSP/editor/OS/full/checker-loop, do not change project.godot/caches/player files/settings/permissions/billing or immutable references/spec. Do not commit/push/rebase/merge whole main. Do not claim missing upstream events or Windows as passed. Do not recreate already-complete P23 code or delete earlier strict tests. Compare GDScript qualified symbols and main JSON full entry values plus only P24 added entries, detect missing/duplicate definitions without confusing same method names in different inner classes. Run meaningful static Python check and git diff --check. Report exact changed paths, preservation result and remaining conditions after actually writing files.
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
# Actual recorded Opus JSON-order-only correction — same repair4
|
||||
|
||||
Actual commander2a2e28a5c7e641c99263ab9caba5a9e7 chose Codex6.1-sol. Prior Codex1cde6bdd phase is finished, GUI remains terminalquota, no competing worker. Do not repeat previous code implementation or old GUI.
|
||||
|
||||
Continue the SAME repair4 (no new task, no repair-counter change, no permission change). I checked the cause. In tools/regression/suite-policy.json, the new key "tests/ui/test_operations_notification.gd" is the third key (index 2) of suite_policies (line 18). In completion_marker_contracts.json, the P24-02 row is near the top of "rows" (line 34). check_repair4_preservation.py (lines 279-310, equals_main_plus_p24_only_additions_in_order) requires the main snapshot order with the P24-only additions appended at the end. Do not weaken the checker. INSTRUCTIONS: (0) Before any edit, record the sha256 of every protected file: scenes/main/main.gd, scenes/main/world_preview.gd, tools/check_p24_operations_evidence.py, the new 9-test script, repair4/check_repair4_preservation.py, the shared roster and all Root instruction/reference files. Do not run ps, and do not search outside the workspace. Trust ROOT_CODE_PHASE_PRELAUNCH_PROOF/VERIFIED_PRELAUNCH.json. (1) Edit only these two JSON files. In completion_marker_contracts.json, move only the new P24-02 marker row from its current index to the append position the checker expects, after all main rows. In suite-policy.json, move only the key tests/ui/test_operations_notification.gd and its object, unchanged, to the end of suite_policies. Change no values, no other keys or rows and no old main entries. Match the existing indentation and formatting, and change nothing else in those files. (2) Do a structural JSON comparison before and after. Each file must parse, and its parsed content must be identical apart from the position of the moved entry. That means every existing main entry and the P24 entry body are deep-equal, and the counts are unchanged (180 rows; the same policy key set). (3) Run py_compile on the touched and checker Python files with PYTHONPYCACHEPREFIX="$TMPDIR/p24-phase-pyc" set for that command only. The existing Runner Python 3.12 with the same task-local prefix is also acceptable. Do not mark the work blocked because of the cache location. Change no system settings or permissions. (4) Rerun check_repair4_preservation.py --write-evidence. It must report all pass, including equals_main_plus_p24_only_additions_in_order=true for both JSON files and the .gd results unchanged (279/279 and 179/180 with the one allowed bubble adapter). (5) Run git diff --check. Do not rerun the 9 tests if Root's workspace receipts show that their input/code hashes are unchanged and the earlier actual exit was 0; otherwise run them once. (6) Update only SOURCE_READY_PRESERVATION_RESULT.json (written by the checker) and REPAIR4_CODE_PHASE_STATUS.md. The status file documents the move-only fix, the structural-equality proof, the compile cache prefix, the 9-test reuse or rerun, and the before/after SHA guard. (7) Afterwards, recompute the protected SHAs; they must be byte-identical. Run no engine, OS, full or final checker. Do not create or edit the acceptance index. No commits. Do not relabel the earlier 179 result. Make the normal submission only if every check passes. These items stay pending: whole8, Root S/M/T/Q, native, current full, whole-unit review and Windows. If any check fails, stop and report the exact output without working around it.
|
||||
|
||||
Root bridge has completed current HEAD/no-competing-job/operation-lease preflight. Do NOT run ps or search outsideworkspace. Read ROOT_LOCAL_VALIDATION_R02_REUSE_RECEIPT.json for actual raw testcommand/event/exit0 and the exact3 input hashes. Read ROOT_CODE_PHASE_PRELAUNCH_PROOF/VERIFIED_PRELAUNCH.json for originalGUI copies. This correction explicitly may move only newP24 JSON entries, while retaining both .gd source bytes and all Python/helper/test code. No other Source-Ready claim than static/checker readiness; all8 andrealRootcomposition remain unmet.
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
# Actual Opus supplement — same active repair4 only
|
||||
|
||||
Actual commander run cc9bd84f926d4b11ac320de925832e43. This is not a new worker/run/repair count. Continue current recorded repair4 and add these acceptance-required checker fixes within existing allowed_paths.
|
||||
|
||||
WAIT. The existing GUI repair4 conversation (Opus 5.5 Medium, which received the f8c30db direction at 13:39) is still active: it shows Working/Cancel and is running 3-way reconciliation. The Runner reads repair_ready only because this is semi-automatic GUI mode. Do not issue run or request-repair, and do not add a worker, run or repair count. I read the checker and confirmed both defects in this checkout. Copy the supplement below into docs/plans/original-completion-2026-10-02/execution/p24-02/OWNER_REPAIR4_SUPPLEMENT_CHECKER.md and send it in the same active conversation.
|
||||
|
||||
--- SUPPLEMENTAL INSTRUCTION (repair4, same worker, within existing allowed_paths) ---
|
||||
S1 Count bypasses (tools/check_p24_operations_evidence.py:420-426): delete both `pass` branches, the ones that use len(seen_suites) and len(suite_entries). The roster check must compare actual suite sets and must not use counts.
|
||||
a) The required set is the shared authority tools/run_all_tests.py roster(root). Load it read-only with importlib.util.spec_from_file_location; the module has a __main__ guard at :314 and imports only stdlib. Remove or replace the divergent local get_required_suite_roster (:86-95), or make it a thin wrapper that delegates to roster(). Do not reimplement the roster.
|
||||
b) Reject the evidence if any of these hold: suite_entries is not a non-empty list; any row is not a dict, so stop silently skipping non-dict rows (:400-401); any row has no suite path; a suite path is not in the required set (unknown or invented); the same suite path appears more than once; any required suite is missing; a row's failures field is absent or is not int 0 (bool rejected); a row has passed absent or not True; source_sha256 is absent or not HEX64, or does not match the file on disk.
|
||||
c) The top-level total_suites/suites_count/failures fields are optional cross-checks at most. If present, they must equal len(required) and 0. They must never stand in for per-suite rows. Absent rows always fail.
|
||||
S2 get_actual_git_head (:68-83): run `git rev-parse HEAD` first, inside the repo root (cwd=repo root). If git fails, return "" so verification fails. CANDIDATE_COMMIT/TARGET_HEAD may only be a cross-check: if set and different from the real HEAD, fail verification with a clear mismatch error, and never use either value in place of the real HEAD. Update the error message at :477 to match.
|
||||
S3 Tests: add a stdlib-only Python test under docs/plans/original-completion-2026-10-02/execution/p24-02/ (allowed path), using a temp repo root/fixture tests dir and calling the checker functions directly. Negative cases: (1) a required suite missing and replaced by an invented name with equal or higher row count; (2) a required suite missing with duplicate rows padding the count; (3) an unknown extra suite; (4) a failed row, a row with passed absent, a row with failures absent; (5) source_sha256 absent or mismatched; (6) rows absent while full_roster counts are present; (7) the env SHA differs from the real git HEAD in a temp git repo; (8) git is unavailable and only the env SHA is set. Positive controls: an exact roster with all rows passing and correct SHAs, and a real HEAD whose env value agrees or is unset. Run only this test plus static/import checks of the two tools. No Godot, no full roster, no OS collector, no full checker loop, no final acceptance fixtures or index.
|
||||
S4 Keep every other guard unchanged: the 8 conditions, OS/process/PID checks, artifact hashes, current-profile checks, pending-template rejection. Do not rewrite unrelated code.
|
||||
S5 Composition prerequisite (document it, do not implement it): the submitted old-base S and the combined current-main T/Q differ outside the 4 allowed files, and the checker has no real S/M/T/Q Git-provenance contract. Record this in p24-02 docs as SOURCE-READY/NOTRUN, an unresolved Root prerequisite that must be settled before heavy final evidence. Plan: Root reuses the accepted P23 composition functions and current-main run_all_tests.source_refs/roster in the genuine composed checkout. Do not import helpers that don't exist on the worker's base. List every missing helper/API as an explicit Root composition dependency. Do not use env or receipt relabeling.
|
||||
S6 Earlier passes (the 179 and any others) do not apply to this changed source; mark them stale. Keep the same 4-file reconciliation, the static preservation audit and the note that the same 8 conditions are unmet. No commit, no Root source edits, no new workers.
|
||||
--- END ---
|
||||
|
||||
Root clarification: earlier P23 full179 remains valid for its original accepted d2581af/M5041b88/treea700519 source and already closed P23-03. It cannot be relabelled/reused as full regression for the new changed P24 source. Preserve all original proof bytes and closure records. No new whole-game or whole-unit acceptance here.
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
{
|
||||
"task": "P24-02",
|
||||
"head": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"checks_done_by_trusted_Root_bridge_not_repeated_by_sandbox_worker": true,
|
||||
"actual_no_other_Runner_job_at_prelaunch": [],
|
||||
"actual_terminal_GUI_quota": "Individual quota reached; Error ID b866fa14-cff8-4fc1-ac4f-fba529d47498-136; queued followup failed same quota Error ID ending143; no Working/Cancel, Send disabled, baseline refresh2026-10-17 18:39:56 JST.",
|
||||
"original_terminal_run": "261a974d4b6345419851bbba399cf1ae finished; no edits or local tests",
|
||||
"4protected_original_copies": [
|
||||
{
|
||||
"protected_path": "scenes/main/main.gd",
|
||||
"readable_original_copy": "docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/scenes/main/main.gd.source.txt",
|
||||
"expected_and_actual_sha256": "f71f8c15493d6b51002ee4afb41cc349efe77e860944c1f79a5b24f928ecbd24",
|
||||
"exact_original_copy_verified": true
|
||||
},
|
||||
{
|
||||
"protected_path": "scenes/main/world_preview.gd",
|
||||
"readable_original_copy": "docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/scenes/main/world_preview.gd.source.txt",
|
||||
"expected_and_actual_sha256": "8c2daa9e95d56e6e40bb2071b206693069cb7e4731b4d660d59d41c34cb43dfa",
|
||||
"exact_original_copy_verified": true
|
||||
},
|
||||
{
|
||||
"protected_path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"readable_original_copy": "docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"expected_and_actual_sha256": "1653c4beac791ec5aa0a6691275ecf5c798ffd689482747c739d7eb2ea5f87d1",
|
||||
"exact_original_copy_verified": true
|
||||
},
|
||||
{
|
||||
"protected_path": "tools/regression/suite-policy.json",
|
||||
"readable_original_copy": "docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/tools/regression/suite-policy.json",
|
||||
"expected_and_actual_sha256": "fa395a4d2a98bec607dfa1a030122efe62e9412fccf8dfba2e2db5579561a7b9",
|
||||
"exact_original_copy_verified": true
|
||||
}
|
||||
],
|
||||
"normal_lease": "Bridge acquires operation:P24-02 exclusively while executing Runner.llm. Check that proof; do not try ps from the sandbox. Your own run is necessarily live after Root pre-launch.",
|
||||
"sandbox_policy_unchanged": true,
|
||||
"instruction": "Do NOT search user folders or run ps; prelaunch/liveGUI checks belong to trusted bridge. You may rehash the exact four original copies supplied here and compare to actual working files if useful; no external path needed. Implement the allowed code phase and tests now. Root rechecks before/after.",
|
||||
"at_jst": "2026-10-17T13:54:04.253755+09:00"
|
||||
}
|
||||
-3788
File diff suppressed because it is too large
Load Diff
-3319
File diff suppressed because it is too large
Load Diff
-2323
File diff suppressed because it is too large
Load Diff
-473
@@ -1,473 +0,0 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"suite_policies": {
|
||||
"tests/s4/test_original_relationship_model.gd": {
|
||||
"source_sha256": "c74b243dbbb54dba9bbc165e29508cca910f0beb63e32d25ebbb8ea606dccce9",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/s4/test_original_relationship_runtime.gd": {
|
||||
"source_sha256": "c56bdb99dd43a4e7ceb3ca2861e8db39972c5c4e805126a77e2f7da32ca5bdc9",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_operations_notification.gd": {
|
||||
"source_sha256": "9c26386c529b8c8135639e8d0f0ed390da7139d64ff1e268975b05948cab9147",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": ["single"],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_selection_departure.gd": {
|
||||
"source_sha256": "3137f36f547514f25ce6ac775fa7a5141d12f83ca4b95da0be45fecfafe9d9b4",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": ["single"],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_anri_recruitment.gd": {
|
||||
"source_sha256": "74cfaf73ed01769c49498e5395fda009b70f2f6667f4f902abf4697f01f87962",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_event_log_ui.gd": {
|
||||
"source_sha256": "9b1d7cb112790bb58969338ab1dc0bbe2a1c26b4307c4bfcd37491cf950c557b",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_amelia_donations.gd": {
|
||||
"source_sha256": "1bd622a3d88374f01e3d8885a84a816572ed296928f6ce7e3f8134ab15f60793",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_fine_cleaning_effect.gd": {
|
||||
"source_sha256": "7c7df0bac1c072ed4423140e8afe431952ec2a47f76df7dbc24cab62283cae06",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/supply/test_normal_auto_purchase_chain.gd": {
|
||||
"source_sha256": "6916d644620c49a09ab110d98fe07477bb5bb9f96da3826a0be962610cc55256",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/supply/test_normal_supply_chain.gd": {
|
||||
"source_sha256": "eedbb301e68285bbd6f701cf7eec15537f116944115807e0d9133a4c2970bb1d",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_approved_free_unique_arrears_ui.gd": {
|
||||
"source_sha256": "ff684e2f227896c1b5df6026f130d45f4289fc6cae40989be51ddc95b2cf135b",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_business_management.gd": {
|
||||
"source_sha256": "2c76697f9a911e9dded63ebbbc2b82ee9e616777c50a637eebd91dc4932f85a5",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_chapel_gameplay.gd": {
|
||||
"source_sha256": "e1996d6bd6caf46bae7becf1de2514e91a6168a686e83563b00803ac71109735",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_cleaning_gameplay.gd": {
|
||||
"source_sha256": "38593cd17829611dd34561ec46a0d746492a6cffebc35a659d49fe69de4234ac",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_dashboard_coalescing.gd": {
|
||||
"source_sha256": "2f4bd8e9d43911067a7e82864454f6779ae92acc48e0b8d4932e5d963e0430ec",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_defense_management.gd": {
|
||||
"source_sha256": "e7debf5746e1ad5976b1afb1d2471c1c2317bcc406ed2716a2368bd4e06e0235",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_dimension_migration_ui.gd": {
|
||||
"source_sha256": "0f0cec88ea8bf5fccdcd5ade02fab70b7dc71135132048cd10db17ad9d964c0d",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_elevator_management.gd": {
|
||||
"source_sha256": "dff2d3f2a1cea84224aee8f70c4ad53d731df173bc7d16d7ec012c0d16c62e11",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_first_operating_day.gd": {
|
||||
"source_sha256": "fcba5cee4ea7b16340871d98634cef56d80ca2197b1b069d47ae6cf287693226",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_guest_decision_log.gd": {
|
||||
"source_sha256": "8532defab87c075ad3196b44af030cdab785abed365e25d5a56d2d42f115cf71",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_guest_observation.gd": {
|
||||
"source_sha256": "8f5af3d6ef367512b34d0cf35fd8c1d2848d020419dddfa234120206dbe4f6e4",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_layer_skin.gd": {
|
||||
"source_sha256": "aab6f0561e222f88681169a82b47631320495df4c359bcf79d2fb228c60ad83b",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"front-owner",
|
||||
"back-owner"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_main_audio_feedback.gd": {
|
||||
"source_sha256": "9bc9e13ef3498941b6e8566c0b7666c42e294b63e18ec0da2cfa1cda3e4617bd",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_main_dashboard.gd": {
|
||||
"source_sha256": "fa9ee0c4b9aee00a2be6d05a9dab7c0c3e8b0beb2b944257de1dc308bfc3cc20",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_original_build_pointer.gd": {
|
||||
"source_sha256": "a04a79c5e766659d10c4564d1f11c6554a27cb8af71431295e10bc4967012913",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_original_facility_controls.gd": {
|
||||
"source_sha256": "294b39808d3454f96555b981c8f822f17e1248afa803f7c0da74c35799ae55a1",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_rank_pointer.gd": {
|
||||
"source_sha256": "2c51510f80fb57068c6c06aa56566936685e679720b0fd853d8f814566e730f2",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_selection_autosave.gd": {
|
||||
"source_sha256": "1d7d267ef171041f77241c4c2f1a1bb55a46253f803d5c496507e934bc8fa815",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_selection_lifecycle.gd": {
|
||||
"source_sha256": "ed68b120f422e1b37b8cf0654b6d6605458fe01c7e5d84decc3ba6f4e9366c47",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"transition",
|
||||
"finish"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_staff_management.gd": {
|
||||
"source_sha256": "7e37dc47583325a564ef48de31596adeeccfb7151ac5fce952efc6873c8ab704",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"restored-transition",
|
||||
"finish"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_staff_rescue.gd": {
|
||||
"source_sha256": "928179383bda38adf9211065b644a37bed3f8128be42b7e7a0fba9a505a40b9e",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_staff_rest.gd": {
|
||||
"source_sha256": "712f2c30ec89da20835e54f2e83b22a358cc6fc05555147ce635ec2592ef75b5",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_stair_transport_details.gd": {
|
||||
"source_sha256": "3abd3655eecbefe1b7cd49e1b16c42f8161c86f20380c298ec6367b42d31555f",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_supply_auto_purchase_ui.gd": {
|
||||
"source_sha256": "ad3788ae4b3f17918be67cf06c4162635da1ecba1ee0a0465d10acc019f3e3ae",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_supply_management.gd": {
|
||||
"source_sha256": "ee96be8b31eb71e84ab813e427a28bcfb76de4a057bd964584a6a497382ea716",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_ui_audio_feedback.gd": {
|
||||
"source_sha256": "62c5c8080b1a05d243977a293a23ab216ef71de38fe46ca6b31c71e0af4555fe",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": true
|
||||
},
|
||||
"tests/ui/test_ui_presentation_audio_contract.gd": {
|
||||
"source_sha256": "9769b89b61630ddf2ef13a927f329ddaa30e04da77987e7a868d0490244d6a25",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"before-remount",
|
||||
"final"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_upkeep_closed_ui.gd": {
|
||||
"source_sha256": "915db12e539d98bfcb2cfc3712693ca7fca3ff459aaacba419faff04ac712868",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_upkeep_inspector.gd": {
|
||||
"source_sha256": "99895a24bcddc4c2e01d8960a2fd7eba05be237a64700d78879c68c1a0660f34",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_world_tree_rank.gd": {
|
||||
"source_sha256": "8e108e3ae63d1ee3971c7b236f50a673c407835f094de0d38a736c38261767aa",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_runtime_upkeep.gd": {
|
||||
"source_sha256": "eae48823d58d78c419d29728e33a5559fbe5131b49e33d04ca4e6fa3a721c29b",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/transport/test_runtime_transport_comparison.gd": {
|
||||
"source_sha256": "ba577397fa8db5a6cf92cfd398dd7a5ece49e6b59856f14772b67b51ddc0bde9",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/transport/test_transport_comparison.gd": {
|
||||
"source_sha256": "7e80e9ef80500278c56f0d1ada5c911f43e3c0a9bc370045fdbebd33c2f02fd5",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/supply/test_mimi_purchase_quote.gd": {
|
||||
"source_sha256": "01f7760cf0fed33fda6358bd407fc1441a198dce9f2713e49bfcc097ee8c8ada",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false,
|
||||
"standalone_ownership": {
|
||||
"Main_instantiated": false,
|
||||
"configure_audio_called": false,
|
||||
"UIAudio_owner_registered": false,
|
||||
"actual_parent": "SceneTree.root",
|
||||
"owned_supply_panel": "configure(runtime) then add_child; queue_free + await process_frame + is_instance_valid rejection",
|
||||
"autoload_Runtime_Economy_lifetime": "native strict diagnostics and whole profile capture remain mandatory; leak outcome unmeasured",
|
||||
"normal_human_viewport_or_OS": false
|
||||
},
|
||||
"source_only_ownership_review": true
|
||||
},
|
||||
"tests/transport/test_runtime_transport.gd": {
|
||||
"source_sha256": "ec6f8fa8e8f2a76a6f6214b4ee84861aba1bb13845a342c5126905b01f428a15",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_actor_selection.gd": {
|
||||
"source_sha256": "f37a0f4805adce4b538fccde1404c1a417f20639fddf36947f076d88409ba0a3",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"before-remount",
|
||||
"final"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_pending_service_pricing_report.gd": {
|
||||
"source_sha256": "50095c41fe76bac7bd9346ce97651d40610fa69b48c3b24f7acc5b371578e753",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_p08_normal_placement_ops.gd": {
|
||||
"source_sha256": "d3c246d34f8fd66f6ed237e42a86df89ebaf481bc9dee143b4de8d654ce0eb2e",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
}
|
||||
},
|
||||
"outside_routes": {
|
||||
"tests/supply/test_normal_auto_purchase_chain.gd": {
|
||||
"env": "THE_TREE_SUPPLY_EVIDENCE_DIR",
|
||||
"filename": "normal-play-report.json",
|
||||
"stdout_prefix": "NORMAL_AUTO_PURCHASE_REPORT ",
|
||||
"stdout_projection": "subset",
|
||||
"report_owner_source_sha256": "6916d644620c49a09ab110d98fe07477bb5bb9f96da3826a0be962610cc55256"
|
||||
},
|
||||
"tests/supply/test_normal_supply_chain.gd": {
|
||||
"env": "THE_TREE_SUPPLY_EVIDENCE_DIR",
|
||||
"filename": "normal-play-report.json",
|
||||
"stdout_prefix": "NORMAL_SUPPLY_REPORT ",
|
||||
"stdout_projection": "subset",
|
||||
"report_owner_source_sha256": "eedbb301e68285bbd6f701cf7eec15537f116944115807e0d9133a4c2970bb1d"
|
||||
},
|
||||
"tests/ui/test_first_operating_day.gd": {
|
||||
"env": "THE_TREE_FIRST_OPERATING_EVIDENCE_DIR",
|
||||
"filename": "operating-report.json",
|
||||
"stdout_prefix": "FIRST_OPERATING_DAY_REPORT ",
|
||||
"stdout_projection": "full",
|
||||
"report_owner_source_sha256": "fcba5cee4ea7b16340871d98634cef56d80ca2197b1b069d47ae6cf287693226"
|
||||
},
|
||||
"tests/ui/test_selection_autosave.gd": {
|
||||
"env": "THE_TREE_FIRST_OPERATING_EVIDENCE_DIR",
|
||||
"filename": "operating-report.json",
|
||||
"stdout_prefix": "FIRST_OPERATING_DAY_REPORT ",
|
||||
"stdout_projection": "full",
|
||||
"inherited_source": "tests/ui/test_first_operating_day.gd",
|
||||
"report_owner_source_sha256": "fcba5cee4ea7b16340871d98634cef56d80ca2197b1b069d47ae6cf287693226"
|
||||
}
|
||||
},
|
||||
"fixed_generated_report_routes": {
|
||||
"tests/mvp/test_runtime_upkeep.gd": [
|
||||
"artifacts/upkeep-2026-09-29/preclose-snapshot.txt",
|
||||
"artifacts/upkeep-2026-09-29/closed-snapshot.txt"
|
||||
],
|
||||
"tests/transport/test_runtime_transport_comparison.gd": [
|
||||
"artifacts/transport/runtime-comparison.json",
|
||||
"artifacts/transport/runtime-comparison-1-trace.json",
|
||||
"artifacts/transport/runtime-comparison-2-trace.json"
|
||||
],
|
||||
"tests/transport/test_transport_comparison.gd": [
|
||||
"artifacts/transport/path-comparison.json",
|
||||
"artifacts/transport/comparison-demand.json"
|
||||
]
|
||||
},
|
||||
"scope": "observed source/proof/IO contracts; no new gameplay assertions"
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"scope": "Reuse actual local9test command only; no whole-unit/full-roster acceptance. JSON append-position correction does not alter these checker/test/shared-roster code inputs.",
|
||||
"actual_run": "1cde6bdddd3a4d88818d1c38103aedb8",
|
||||
"actual_role": "implementer",
|
||||
"actual_service": "codex",
|
||||
"actual_model": "gpt-6.1-sol",
|
||||
"raw_provider_stdout_sha256": "97bc112da31cb41f938373fc623481d4e10555f2d328ef2dad7e9a326cbc46c1",
|
||||
"actual_command_event": {
|
||||
"id": "item_16",
|
||||
"type": "command_execution",
|
||||
"command": "/bin/zsh -lc 'python3 docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py'",
|
||||
"aggregated_output": "test_1_invented_replacement (__main__.CheckerTests) ... ok\ntest_2_duplicate_padding (__main__.CheckerTests) ... ok\ntest_3_unknown_extra (__main__.CheckerTests) ... ok\ntest_4_required_results (__main__.CheckerTests) ... ok\ntest_5_source_hash (__main__.CheckerTests) ... ok\ntest_6_missing_or_malformed_rows (__main__.CheckerTests) ... ok\ntest_7_env_mismatch_and_positive_head (__main__.CheckerTests) ... ERROR: CANDIDATE_COMMIT mismatch with real git HEAD 90f4d81f674f669c5ea6e8e537648b693ab5af5e\nERROR: TARGET_HEAD mismatch with real git HEAD 90f4d81f674f669c5ea6e8e537648b693ab5af5e\nERROR: TARGET_HEAD mismatch with real git HEAD 90f4d81f674f669c5ea6e8e537648b693ab5af5e\nok\ntest_8_git_unavailable_env_only (__main__.CheckerTests) ... ok\ntest_positive_roster (__main__.CheckerTests) ... ok\n\n----------------------------------------------------------------------\nRan 9 tests in 0.373s\n\nOK\n",
|
||||
"exit_code": 0,
|
||||
"status": "completed"
|
||||
},
|
||||
"dependency_file_sha256": {
|
||||
"tools/check_p24_operations_evidence.py": "3dc04b66ab07e2193595aff4ad63baf1ada732cee02c8b4d67298b933bd21487",
|
||||
"tools/run_all_tests.py": "1d56dc16ab34f5a8f77f3ed7e833fb6d9fe73aa37cf297a0597e41bfa9c9e4b4",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py": "e528dc2939d3561ac1d890d46caf29632316f4ed4aeb8f5efdaed59d130b9234"
|
||||
},
|
||||
"no_dependency_file_change_events_after_actual_test_pass": true
|
||||
}
|
||||
-100
File diff suppressed because one or more lines are too long
-31
@@ -1,31 +0,0 @@
|
||||
# Verified task-local zsh temporary transport
|
||||
|
||||
No policy/permission/source change. Previous JSON phase2cf378d ended before editing because a large zsh here-document tried /tmp, not existing task runtime. Root reproduced failure then success with the exact same saved sandbox, using TMPPREFIX pointed to existing allocated task tmp.
|
||||
|
||||
For EVERY shell command using a here-document, start it with:
|
||||
|
||||
TMPPREFIX=/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02/tmp/p24-zsh; export TMPPREFIX;
|
||||
|
||||
Then run the original command. Or use python -c instead of a here-document. Each shell invocation is independent, so prefix every long-heredoc command. For py_compile also prefix PYTHONPYCACHEPREFIX="$TMPDIR/p24-phase-pyc" as authorized by actual Opus. These paths are already writable under unchanged task sandbox. Do not search user folders, request permissions or stop the implementation solely because a transport preparation failed. Root pre-launch duties are already complete. Actual quality-check failure still must be recorded, never waived. Preserve the earlier failure and continue only this same recorded JSON-order correction.
|
||||
|
||||
{
|
||||
"same_saved_sandbox": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/2cf378d728f64bbca470f5603d3299dc/sandbox.sb",
|
||||
"sandbox_sha256": "8955b7a2a3601db1dd5c0cc3422dbf490b0463123eafab87d45d78a30d51cb07",
|
||||
"no_policy_or_permission_change": true,
|
||||
"runtime_tmp": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02/tmp",
|
||||
"source_changes": false,
|
||||
"probe_results": [
|
||||
{
|
||||
"name": "original",
|
||||
"exit_code": 1,
|
||||
"stdout": "",
|
||||
"stderr": "zsh:1: can't create temp file for here document: operation not permitted\n"
|
||||
},
|
||||
{
|
||||
"name": "task-local-zsh-temp",
|
||||
"exit_code": 0,
|
||||
"stdout": "P24_TEMP_TRANSPORT_OK\n",
|
||||
"stderr": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
{
|
||||
"contract_id": "P24-02",
|
||||
"title": "操作と通知の実装および証跡収集プロトコル",
|
||||
"worker": "agy",
|
||||
"base_commit": "1a5abc65163097d4b36a060d68f58c92093eb4e9",
|
||||
"spec_sha256": "738268b406e381ccab415b426d4a547b02e7cb2a481cefce65579a1e346834c7",
|
||||
"formal_acceptance_note": "Candidate source alone does not constitute acceptance completion. Native Godot execution has not been run by this worker. Root owns formal test execution, full regression, OS evidence generation, and final submission.",
|
||||
"implemented_paths": [
|
||||
"scenes/main/main.gd",
|
||||
"scenes/main/world_preview.gd",
|
||||
"scripts/ui/event_log_dialog.gd",
|
||||
"scripts/ui/manual_save_slots_dialog.gd",
|
||||
"scripts/ui/operation_feedback.gd",
|
||||
"scripts/ui/operation_feedback.gd.uid",
|
||||
"scripts/ui/operations_camera_controls.gd",
|
||||
"scripts/ui/operations_camera_controls.gd.uid",
|
||||
"tests/ui/test_operations_notification.gd",
|
||||
"tests/ui/test_operations_notification.gd.uid",
|
||||
"tests/ui/fixtures/operations_os_observer.gd",
|
||||
"tests/ui/fixtures/operations_os_observer.gd.uid",
|
||||
"tools/check_p24_operations_evidence.py"
|
||||
],
|
||||
"conditions_status": {
|
||||
"placement_and_invalid_drop": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "code_implemented_unverified_pending_root_execution",
|
||||
"details": "Grid snap, connection line warning, single-commit valid placement, rejection reason Japanese feedback without model/ledger corruption, click-based assignment alternative implemented in candidate code. Native Godot execution unverified, pending Root formal execution."
|
||||
},
|
||||
"modal_and_pause_resume": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "code_implemented_unverified_pending_root_execution",
|
||||
"details": "Modal open/close, focus management, modal_input_blocked suppressing behind-dialog input and assignment drops. Clock pause freezing advancement via real delta early-return; single resume continuing simulation. Pending commands and save identity intact on cancel/close. Native Godot execution unverified, pending Root formal execution."
|
||||
},
|
||||
"unit_bubbles": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "code_implemented_unverified_pending_root_execution",
|
||||
"details": "Unit overhead bubbles for Zzz (sleep/incapacitated/break), anger (strike/fleeing/abandoning/interrupted), heart (authoritative RelationshipState / RouteLock / love-shield). No unapproved loyalty/morale thresholds. Stale symbol removal logic implemented. Native Godot execution unverified, pending Root formal execution."
|
||||
},
|
||||
"event_log": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "code_implemented_unverified_pending_root_execution",
|
||||
"details": "Bounded recent 256 events, readable Japanese presentation, formatted amounts/times/reasons, duplicate event ID elimination. Reusing existing 256-entry stream contract. Native Godot execution unverified, pending Root formal execution."
|
||||
},
|
||||
"important_warning_cutin": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "partially_implemented_upstream_dependencies_pending",
|
||||
"details": "ImportantWarningCutinDialog connected to real DEFENSE_RAID_CREATED and RELATIONSHIP_SHIELD_CHANGED (shield=0, love-shield vanishing) domain events with stop/resume behavior. Generic INCIDENT_CREATED is not falsely treated as NTR. Duel occurrence triggers and full invasion upstream flow remain unimplemented upstream dependencies, explicitly documented as missing and not claimed complete. Native Godot execution unverified, pending Root formal execution."
|
||||
},
|
||||
"click_alternatives": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "code_implemented_unverified_pending_root_execution",
|
||||
"details": "OperationsCameraControls providing click equivalents for zoom in/out, pan up/down/left/right, reset view, grid toggle, layer toggle, and click-based staff assignment. Does not alter gameplay model. Manual P23 held gestures remain deferred. Native Godot execution unverified, pending Root formal execution."
|
||||
},
|
||||
"japanese_input_and_scale": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "code_implemented_unverified_pending_windows_and_root_execution",
|
||||
"details": "ManualSaveSlotsDialog LineEdit for editable Japanese save label (display_name metadata only), control char validation, default name fallback, cryptographic owned path (manual_ui_<hex32>) preservation, cancel discard semantics. Native Godot OS input handling (not browser). Same-Windows-release platform acceptance remains pending formal execution."
|
||||
},
|
||||
"final_validation_review": {
|
||||
"code_implemented": true,
|
||||
"formally_accepted": false,
|
||||
"status": "pending_root_full_roster_and_opus_review",
|
||||
"details": "Local unit suite (tests/ui/test_operations_notification.gd) with FixtureCleanup and OperationsOSObserver implemented and hashed. check_p24_operations_evidence.py strict verify-only checker implemented. Formal full regression, native OS verification, and independent separate Claude Opus review are owned by Root Runner and pending execution."
|
||||
}
|
||||
},
|
||||
"runner_verification_tasks": {
|
||||
"native_godot_test_suite": "Run tests/ui/test_operations_notification.gd under native Godot runner with isolated profile.",
|
||||
"evidence_checker": "tools/check_p24_operations_evidence.py --verify-only",
|
||||
"root_full_roster": "Root owns formal execution of required test roster on exact final game/source/settings.",
|
||||
"windows_release_acceptance": "Candidate Windows platform execution preserved for formal closure; not transferred from prior evidence.",
|
||||
"independent_opus_review": "Independent separate Claude review with actual runtime evidence (not pending templates alone) before formal submit."
|
||||
}
|
||||
}
|
||||
+1431
File diff suppressed because it is too large
Load Diff
+7
File diff suppressed because one or more lines are too long
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"scope": "Authoritative limited-case factual clarification after separate Opus review. Original primary files kept unchanged, no new gameplay/OS execution",
|
||||
"source": {
|
||||
"S": "fe44f550750acbf5c510346e7cacbea2ccbdd184",
|
||||
"M": "565fd805079d8c446f29e30c57979242561113ea",
|
||||
"Q": "42989fd90f5f83db86f846eb42b5cf2d847461a5",
|
||||
"T": "905d844d523529862259d1b7a210fd1e7964f054"
|
||||
},
|
||||
"actual_review_run": "b4160dbc2bca407598d2fc2e22bff24f",
|
||||
"actual_pause_seconds": 89.116049,
|
||||
"actual_clock_samples": 824,
|
||||
"sample_count_scope": "824 clock/paused-state samples, not 847 (which was sequence span); none of the per-sample rows contains a full-model digest",
|
||||
"model_identity_scope": {
|
||||
"checkpoints": {
|
||||
"paused_before_menu": 2254,
|
||||
"new_slot_dialog": 2565,
|
||||
"cancelled": 2797
|
||||
},
|
||||
"digest": "077b7b8106f2448586e2ca9617e7c5525f7a7f90a71d12928a089cbe7ef1d633",
|
||||
"binary_sha256": "7a166acfe98c39dc4432058b054e66aaa5f28485dc78ae9b406d8fa2b35204f3",
|
||||
"continuous_model_identity_not_proven": true
|
||||
},
|
||||
"focus_scope": {
|
||||
"root_viewport_focus_owner_unchanged": "/root/Main/@MarginContainer@13/@VBoxContainer@14/TopBar/@HBoxContainer@15/@Button@42",
|
||||
"dialog_label_focused_on_open": true,
|
||||
"dialog_label_unfocused_after_cancel": true,
|
||||
"restoration_mechanism_proven": false
|
||||
},
|
||||
"input_scope": {
|
||||
"actual_CUA_clicks": 7,
|
||||
"root_mouse_rows": 7,
|
||||
"embedded_popup_and_dialog_native_mouse_rows": false,
|
||||
"embedded_action_evidence": "Actual tool-time windows + actual production menu3/cancel callbacks, not a native-parent mouse ACK",
|
||||
"CUA_log": "exact semantic transcription after close, not a machine-emitted CUA log; first6 before hashes null; after hashes preserved; CUA screen byte files not in local material",
|
||||
"independent_pixels": "five actual viewport PNGs inspected by Opus, never claimed as CUA images"
|
||||
},
|
||||
"schema_scope": {
|
||||
"original8_denominator_unchanged": true,
|
||||
"whole_verify": "honest incomplete rejection at placement group, no modal coverage loop inside fullverify",
|
||||
"supported_record_primitives": "Root checked nonopaque fields/provenance/monotonic receipt range; later exact pointer probe documented separately",
|
||||
"correction_file": "SUPPLEMENT_ACTUAL_POINTER_PROBE.json"
|
||||
},
|
||||
"private_data_scope": "empty pending queue; fresh-profile manual package absent; no existing-save preservation or nonempty pending case inferred",
|
||||
"normal_exit": "owned syntax21759 and OS21770 exited0, all reader/source/default-player/cleanup guards0; both fresh profiles fully retained then cleaned",
|
||||
"remaining_original_conditions": "all8 unaccepted; whole formal review/full roster/normal integration-final/Windows and all unexecuted cases stay required",
|
||||
"original_formal_units": 14,
|
||||
"new_credit": 0,
|
||||
"at_unix_ns": 1792221809906511000
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
# 現在と次の成果単位(2026-10-17)
|
||||
|
||||
正式完了は14/88成果、30パッケージ。今回の限定ケースによる完了加算は0。
|
||||
|
||||
P24-02はin_progress、Runner提出fe44f550750acbf5c510346e7cacbea2ccbdd184、通常統合候補なし。実main565fd805との準備合成Q42989fd9/T905d844dで通常OS操作を採取した。Qは証拠採取用で、正式統合候補ではない。
|
||||
|
||||
通常メニューから別名保存ダイアログを開き、取消して再開し、通常ウィンドウ終了した。824回の時刻・停止サンプル(89.116049秒)で停止を確認し、3節目のモデルが一致した。独立Claude Opus5.5セッションb4160dbc2bca407598d2fc2e22bff24fはこの限定範囲でpass、critical/high/medium0。全8原条件のレビューではなく、フォーカス復元機構・既存保存・非空コマンド列の保全は証明していない。厳密な限界は同梱のAUTHORITATIVE_NARROW_CASE_CLARIFICATIONS.jsonを正とする。
|
||||
|
||||
P24残件は全8原条件、配置と無効ドロップ、確認・復元、IME、倍率、ダイアログ背後の有効対象、吹出し・ログ・代替操作、重要警告の自然発生、最終全回帰・正式独立レビュー・通常統合final・同一Windows等。重要警告はP18/P19/P21等の実装に依存するため、限定プローブだけを積み増さない。原条件を縮小しない。
|
||||
|
||||
次の優先候補はOpus実判断6004541957cd42cf9bae1868df1a31c8が選定したP04-01「同時発生の更新規約」。閉店・停電・破壊・退出・課金・交代・00:00決算の全7領域について、停止中課金0・二重精算0・孤立予約0を満たし、全15条件+EVの版付き証拠、必要検証、独立した全体レビュー、通常統合final、台帳反映まで必要。P06等の基盤で既存証拠が多い点を選定理由とする。
|
||||
|
||||
選定判断に含まれたaccd時点の不足推定を現状態へ読み替える。実Runner再確認ではP04提出は2dde7596、repair29、未稼働、worktree差分0。登録validationはpassでも正式レビュー275d1fd6はD05残4規則未確定などにより不合格。再修正や再試験はまだ起動していない。最新29の実差分と原条件をOpusへ提示し、既修正箇所を再実装せず、残4規則の必須性・具体的選択肢・独立して進める残修正を再判断中。既存2承認を維持し、未回答を承認扱いにしない。
|
||||
|
||||
古いP04文書の13/88や旧mainは作成時点の履歴であり、現時点の正式数・適用版として再利用しない。全条件が揃うまでP04も完了加算しない。
|
||||
|
||||
最新再判断ea12167c:raw結合・getter・HEAD fixture等は既に修正29までに是正済み。重複修正を起動しない。残る規則の具体的選択肢をユーザーへ提示した。回答後に破壊根拠pin/承認記録/現況説明を1回にまとめて通常修正し、必要な最終ゲートへ進む。回答を推定せず、記録のみによる完了加算もしない。
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"created_unix_ns": 1792222099990910000,
|
||||
"files": [
|
||||
{
|
||||
"file": "AUTHORITATIVE_NARROW_CASE_CLARIFICATIONS.json",
|
||||
"source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/coordinator-os-scenario-20261017-r01/AUTHORITATIVE_NARROW_CASE_CLARIFICATIONS.json",
|
||||
"sha256": "fd83e2edd4ac00bc9f8c568f6283ee47af43f91ef06336d36d775508a96682a5",
|
||||
"bytes": 2833
|
||||
},
|
||||
{
|
||||
"file": "ACTUAL_OPUS_LIMITED_REVIEW.json",
|
||||
"source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/coordinator-os-scenario-20261017-r01/ACTUAL_ONE_SCENARIO_INDEPENDENT_REVIEW_RESULT_MIRRORED_R02.json",
|
||||
"sha256": "f9feeb5b18d3e67c2b6bd72d130068e856c9145cde89951519169549c2985e16",
|
||||
"bytes": 141526
|
||||
},
|
||||
{
|
||||
"file": "ACTUAL_OPUS_NEXT_UNIT_SELECTION.json",
|
||||
"source": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/6004541957cd42cf9bae1868df1a31c8/result.json",
|
||||
"sha256": "777c7f73e43df8801adfc29b9b0facb0474dba79fc5e8f11883d79e6ab3a8c92",
|
||||
"bytes": 7523
|
||||
},
|
||||
{
|
||||
"file": "FRESH_BINDING_AND_SOURCE_APPLICABILITY.json",
|
||||
"source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/coordinator-os-scenario-20261017-r01/FRESH_BINDING_AND_SOURCE_APPLICABILITY.json",
|
||||
"sha256": "f01469d2d8a985750ca4103591067b63db7a319c015b493ad6635640247a3102",
|
||||
"bytes": 307105
|
||||
}
|
||||
],
|
||||
"raw_capture_preserved_at": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/P24-02/build/audit-support/p24-os-normal-r01/capture",
|
||||
"formal_credit": 0,
|
||||
"original_packages": 30,
|
||||
"original_units": 88,
|
||||
"original_complete": 14
|
||||
}
|
||||
+2844
File diff suppressed because it is too large
Load Diff
-21
@@ -1,21 +0,0 @@
|
||||
Owner-approved registered P24-02 repair3/3, exact existing W HEAD666c87bd. Earlier GUI messages were truncated input and are superseded. Apply only these two exact patches to scenes/main/main.gd; preserve all gameplay values/conditions and save semantics. Do not launch Godot, retry LSP, edit project.godot/caches/player data/settings/other sources, remove files, change permissions/billing, commit or push. Only git diff --check and git diff -- scenes/main/main.gd for static checks; Root owns native and OS validation. After editing report exact diff and that native/acceptance remain pending.
|
||||
|
||||
--- a/scenes/main/main.gd
|
||||
+++ b/scenes/main/main.gd
|
||||
@@ -793 +793 @@
|
||||
- load_menu.text = "読込 ▾"
|
||||
+ load_menu.text = "保存・読込 ▾"
|
||||
@@ -799,0 +800 @@
|
||||
+ load_menu.get_popup().add_item("新しい名前で別スロット保存",3)
|
||||
@@ -803 +804,2 @@
|
||||
- elif id == 2: _show_manual_load_slots())
|
||||
+ elif id == 2: _show_manual_load_slots()
|
||||
+ elif id == 3: _ensure_manual_save_slots().show_new_save(manual_save_path))
|
||||
|
||||
--- a/scenes/main/main.gd
|
||||
+++ b/scenes/main/main.gd
|
||||
@@ -3199,2 +3199,2 @@
|
||||
- show_warning_cutin(OperationFeedbackScript.CUTIN_INVASION, "重要警告:愛の盾消失", "愛の盾が消失しました。人物関係を確認してください。")
|
||||
-
|
||||
+ show_warning_cutin(OperationFeedbackScript.CUTIN_INVASION, "重要警告:NTR侵食開始", "愛の盾が破られ、NTR侵食が始まりました。人物関係を確認してください。")
|
||||
+
|
||||
-189
@@ -1,189 +0,0 @@
|
||||
# Repair4 JSON order correction — static phase ready
|
||||
|
||||
Task P24-02; commit `9641ed52def2ff8e5b0222449a4a83a1191e1d37`. Same repair4; no new task, permission change or commit. Root prelaunch proof trusted; no ps, external search, engine, OS, full or final checker executed. Root performs normal submission separately. This is static readiness only, never acceptance.
|
||||
|
||||
Only the P24 operations marker row and suite policy key/object were moved from index 2 to the end of their respective containers. Raw entry bodies retained verbatim; existing main entries and their order retained. Both JSON files parse. Before/after structural comparison passed: all values deep-equal, marker rows remain 180, suite policy key set unchanged (48). Only the specified entry position differs.
|
||||
|
||||
JSON SHA256 before → after:
|
||||
|
||||
- completion_marker_contracts.json: `1653c4beac791ec5aa0a6691275ecf5c798ffd689482747c739d7eb2ea5f87d1` → `1063e578eefe6da1b38c24f4c004669bcac67a21884636fb1b9c7e96e4ecf388`
|
||||
- suite-policy.json: `fa395a4d2a98bec607dfa1a030122efe62e9412fccf8dfba2e2db5579561a7b9` → `adc2fbac2463bfdb047bede0182c66083996b75d2bd542a3b8640672d7ca2400`
|
||||
|
||||
`PYTHONPYCACHEPREFIX="$TMPDIR/p24-phase-pyc" python3 -m py_compile` on tools/check_p24_operations_evidence.py, tools/run_all_tests.py, repair4/test_checker_roster_head.py and repair4/check_repair4_preservation.py: exit 0. Cache prefix applied to that command only; no system settings or permissions changed.
|
||||
|
||||
`check_repair4_preservation.py --write-evidence`: exit 0, SOURCE-READY, runtime NOTRUN, schema checks true, failures empty. Both JSON equals_main_plus_p24_only_additions_in_order=true. main.gd remains 279/279; world_preview.gd remains 179 required/180 reconciled with the one allowed bubble adapter; zero missing, duplicate, unexpected or body issues. `git diff --check`: exit 0.
|
||||
|
||||
9 tests reused without rerun: ROOT_LOCAL_VALIDATION_R02_REUSE_RECEIPT.json records actual run 1cde6bdddd3a4d88818d1c38103aedb8, completed exit 0, 9 tests OK. All three dependency SHA256 values match the unchanged files exactly. Earlier 179 result remains historical and is not relabelled.
|
||||
|
||||
Protected SHA256 guard: recorded before any edit, then recomputed after authorized writes; every file below is byte-identical. This includes all task Root instruction/reference/proof files, both GDScripts, all checker/test Python and shared roster. The identical before/after SHA256 is listed for each:
|
||||
|
||||
- `AGENTS.md`: `8d8dc40211390275f858f322743309a0663c4f2d859780a8b8a08cea1450e8b3`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/NEXT_CLOSURE.md`: `9301fa028052174ae9fa5acf006b50fd6c3f21fcbc6e04fc1a398efc7d9be1cb`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/OWNER_REPAIR4_CODE_ONLY_HANDOFF.md`: `940996894b2ea28cf46b992bd5c2719d4ef952452d0585396eae6664a63e6f53`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/OWNER_REPAIR4_GUI_INSTRUCTION.md`: `003724ef4a597298016a59f6198dec2ca3c94115c88afb7dd6cbd7478e0fe1ae`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/OWNER_REPAIR4_JSON_ORDER_CORRECTION.md`: `1e16de00c419467fdfa87b1bf28c004f579576a97cbb04fa5ac06070697532d5`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/OWNER_REPAIR4_SUPPLEMENT_CHECKER.md`: `1eeb4ac0d14347700a9d6e599ce61e36b3324f5fcc4385266aaf16a1c8ab80bb`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/VERIFIED_PRELAUNCH.json`: `c68f35352233d9adb91b1db203cc0e9d47db3f91ec103b9d37a9eeec578f9ba2`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json`: `1653c4beac791ec5aa0a6691275ecf5c798ffd689482747c739d7eb2ea5f87d1`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/scenes/main/main.gd.source.txt`: `f71f8c15493d6b51002ee4afb41cc349efe77e860944c1f79a5b24f928ecbd24`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/scenes/main/world_preview.gd.source.txt`: `8c2daa9e95d56e6e40bb2071b206693069cb7e4731b4d660d59d41c34cb43dfa`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/tools/regression/suite-policy.json`: `fa395a4d2a98bec607dfa1a030122efe62e9412fccf8dfba2e2db5579561a7b9`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_LOCAL_VALIDATION_R02_REUSE_RECEIPT.json`: `ded162f334d6d7a7422ee76d03e26d1544658a06242bc2e2f3f5c6913890d524`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_ZSH_TEMP_TRANSPORT_FIX.md`: `96f0620efdee9b073fcad279de243111a4d5266335d29a93acb19a5dc1b453b3`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/collector_protocol.json`: `bfe94a37304c54ac615bcbd6f938e79933730298fb1c00c6e7ce1922fda3aec2`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/owner-gui-direction-r04.txt`: `2936e33085ce4eae5f556401a55c781b8ac18208ef48f76cacda5faa97e26585`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py`: `909c8c283aca5ef6ad14485bea405e248280a1a63cb6f2fd3458b32a8632cee3`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/test_checker_roster_head.py`: `e528dc2939d3561ac1d890d46caf29632316f4ed4aeb8f5efdaed59d130b9234`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/P24_ALL8_CURRENT_ACCEPTANCE_AND_NEXT_WORK.json`: `5a7c01fc2d6d37046413fc1f81e89005da11616bd0b97c94e6ea1fe0b7668298`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/P24_EXISTING_LIMITED_EVIDENCE_LOCATION_AND_SHA_AUDIT.json`: `ada4a9d2cf612e7cb0b0528f4b4c09b61fb45d47411ed3e78726138d4d233c48`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/REFERENCE_MANIFEST.json`: `08ae7860410859e504bf74a9484d1003f3f8d5f0e6e057a6268a0742af590301`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json`: `6900df6014431ff160c0d18b0dfa65ef0a3fa78eaa08922eaa96de18d5b9fd8c`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/scenes/main/main.gd.source.txt`: `92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/scenes/main/world_preview.gd.source.txt`: `4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2`
|
||||
- `docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/tools/regression/suite-policy.json`: `7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f`
|
||||
- `scenes/main/main.gd`: `f71f8c15493d6b51002ee4afb41cc349efe77e860944c1f79a5b24f928ecbd24`
|
||||
- `scenes/main/world_preview.gd`: `8c2daa9e95d56e6e40bb2071b206693069cb7e4731b4d660d59d41c34cb43dfa`
|
||||
- `tools/check_p24_operations_evidence.py`: `3dc04b66ab07e2193595aff4ad63baf1ada732cee02c8b4d67298b933bd21487`
|
||||
- `tools/run_all_tests.py`: `1d56dc16ab34f5a8f77f3ed7e833fb6d9fe73aa37cf297a0597e41bfa9c9e4b4`
|
||||
|
||||
Pending: whole8, Root S/M/T/Q composition, native, current full, whole-unit independent review and Windows. No acceptance index created or edited. Earlier failed preparation and quality-check output is retained below as historical evidence; the authorized corrective checks above supersede only the static readiness result.
|
||||
|
||||
---
|
||||
|
||||
## Historical prior phase status (retained verbatim)
|
||||
|
||||
# Repair4 code-only phase — blocked, no submit
|
||||
|
||||
Task P24-02, actual HEAD `9641ed52def2ff8e5b0222449a4a83a1191e1d37`.
|
||||
The trusted Root bridge's VERIFIED_PRELAUNCH.json was read first. Its lease,
|
||||
original-GUI copies, no-competing-job check and quota record are the launch
|
||||
authority. No bridge duties were repeated. No acceptance is claimed.
|
||||
|
||||
## Code changes
|
||||
|
||||
The evidence checker delegates its required roster to the actual
|
||||
`tools/run_all_tests.py:roster(root)` through importlib, without executing main.
|
||||
It compares exact suite sets and rejects malformed/missing/unknown/duplicate
|
||||
rows, missing paths, nonzero or non-integer failures (including bool), missing
|
||||
or non-True passed, and missing/malformed/mismatched source hashes. Optional
|
||||
counts cannot replace rows and must agree exactly when present.
|
||||
HEAD comes from git in the repository root; both environment variables are
|
||||
cross-checks only. Git failure or either mismatch returns an empty value.
|
||||
The other condition, OS/PID, artifact, profile and pending-template guards
|
||||
were left unchanged. Isolated stdlib tests cover S3's eight negative groups
|
||||
and positive roster/HEAD controls; all temporary Git writes are confined to
|
||||
the disposable test repository.
|
||||
|
||||
The preservation script now emits the requested report on the authorized
|
||||
no-argument invocation, including failures. Its METRIC_IDS regex previously
|
||||
stopped at the type annotation's closing bracket in `Array[StringName]`;
|
||||
it now reads the assigned array. The real pinned source contains affection.
|
||||
No preservation rule or protected file was changed to make a check pass.
|
||||
|
||||
## Actual local command results
|
||||
|
||||
1. Exact authorized `python3 -m py_compile` for the four specified Python
|
||||
files: **exit 1**. Python 3.9 attempted to create its configured cache
|
||||
directory outside the workspace and raised:
|
||||
`PermissionError: [Errno 1] Operation not permitted: '/Users/korizatou114/Library/Caches/com.apple.python/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations'`.
|
||||
This was not rerun with an environment override or relabelled as passed.
|
||||
2. Exact authorized importlib import command: **exit 0**.
|
||||
3. Exact authorized `test_checker_roster_head.py`: **exit 0**, 9 tests OK.
|
||||
Expected mismatch diagnostics appeared for CANDIDATE_COMMIT/TARGET_HEAD.
|
||||
4. Exact authorized `check_repair4_preservation.py`: initially **exit 1**
|
||||
with two JSON preservation failures and the regex false negative.
|
||||
After fixing the regex, rerun **exit 1**, SOURCE-NOT-READY, runtime NOTRUN,
|
||||
schema checks true. Remaining failure output:
|
||||
|
||||
- `docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json: reconciled JSON != main snapshot + P24-only additions (value/order)`
|
||||
- `tools/regression/suite-policy.json: reconciled JSON != main snapshot + P24-only additions (value/order)`
|
||||
|
||||
Both GDScript checks have zero missing, duplicate, unexpected or lost-body
|
||||
items. JSON entry presence/duplicate checks also pass. The protected JSON
|
||||
files insert the P24 operations row/policy at position 2; the strict
|
||||
three-way expectation appends P24-only additions after main's entries.
|
||||
The contracts have 180 rows, first difference at index 2. Minimal concrete
|
||||
Root correction if retaining this strict order contract: relocate only
|
||||
`tests/ui/test_operations_notification.gd` to the end of `rows` and to the
|
||||
end of `suite_policies`, preserving its values and every main entry/order.
|
||||
These protected edits require a subsequent authorized Root phase. They
|
||||
were not performed here; the strict check and failure report are preserved.
|
||||
5. Exact authorized `shasum -a 256` on the four protected files: **exit 0**;
|
||||
all four match the pre-launch proof:
|
||||
|
||||
| File | SHA256 |
|
||||
| --- | --- |
|
||||
| scenes/main/main.gd | f71f8c15493d6b51002ee4afb41cc349efe77e860944c1f79a5b24f928ecbd24 |
|
||||
| scenes/main/world_preview.gd | 8c2daa9e95d56e6e40bb2071b206693069cb7e4731b4d660d59d41c34cb43dfa |
|
||||
| tools/regression/suite-policy.json | fa395a4d2a98bec607dfa1a030122efe62e9412fccf8dfba2e2db5579561a7b9 |
|
||||
| docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json | 1653c4beac791ec5aa0a6691275ecf5c798ffd689482747c739d7eb2ea5f87d1 |
|
||||
|
||||
Git status already contained four protected GUI modifications, Root
|
||||
instructions/reference/proof files and the unfinished repair4 script before
|
||||
this phase. Those were preserved. This phase's writes are confined to the
|
||||
five authorized paths: checker, preservation script, its result, stdlib test,
|
||||
and this status. The dirty preexisting worktree is not claimed to have only
|
||||
these five paths relative to HEAD. No commit, branch, push or submission was
|
||||
performed. Failed steps 1 and 4 prohibit normal submit; task stays repair_ready.
|
||||
|
||||
## All eight conditions remain unmet
|
||||
|
||||
| Frozen condition | Status | Remaining dependencies |
|
||||
| --- | --- | --- |
|
||||
| placement_and_invalid_drop | NOTRUN | Genuine composition; Root Godot/local tests and actual valid/invalid placement, model/ledger/selection preservation and click evidence. |
|
||||
| modal_and_pause_resume | NOTRUN | Composed runtime; actual modal focus/input isolation, pending command/save identity, pause freeze and exactly-once resume evidence. |
|
||||
| unit_bubbles | NOTRUN | Static schema now passes, but composed runtime must prove actual state/render binding, switching and removal. |
|
||||
| event_log | NOTRUN | Actual composed production event sequence, bounded log, Japanese values/time/reasons and pause/load deduplication evidence. |
|
||||
| important_warning_cutin | NOTRUN | Actual production invasion/duel/defense triggers and upstream/catalog/assets applicability; dismiss/stop/resume runtime evidence. Injected fixtures cannot establish production triggers. |
|
||||
| click_alternatives | NOTRUN | Composed navigation/assignment runtime evidence; accepted scales/bounds applicability. P23 held-gesture manual checks remain deferred, not waived. |
|
||||
| japanese_input_and_scale | NOTRUN | Actual OS Japanese composition/confirmation/cancel, persisted save label and invalid feedback, representative scales/focus/clipping; macOS development evidence and separate same-candidate Windows acceptance. |
|
||||
| final_validation_review | NOTRUN | All prior conditions; Root composition, static/import and affected Godot tests, exact-final full roster, real-index verify-only, independent Claude runtime review, current-main integration and final validation. |
|
||||
|
||||
SOURCE-READY describes only the narrow checker code/isolated test work, not
|
||||
these eight condition groups or the failed preservation gate.
|
||||
|
||||
## Unresolved Root S/M/T/Q prerequisite (S5)
|
||||
|
||||
The old-base submitted S differs from combined current-main T/Q outside the
|
||||
four reconciled files. A real externally bound submitted SHA (S), main context
|
||||
SHA (M), tested tree (T), tested commit (Q), complete blob bindings and clean
|
||||
genuine composed checkout are still required before heavy final evidence.
|
||||
The current P24 checker has no such Git-provenance contract. HEAD checking
|
||||
does not establish composition. No environment or receipt relabelling is a
|
||||
substitute.
|
||||
|
||||
Root must reuse/adapt the accepted P23 composition functions from current-main
|
||||
`tools/check_p23_life_observation_evidence.py`, absent entirely on this worker
|
||||
base. Explicit missing helper/API dependencies are `strict_json`,
|
||||
`marker_join`, `structural_equal`, `verify_marker_join`, `git_bytes`,
|
||||
`blob_oid`, `git_blob_stream`, `verify_composition`, `tested_checkout`,
|
||||
`root_context`, `input_map`, and `input_provenance`, plus the verified-view
|
||||
registry `_VERIFIED_VIEWS` and externally bound role/blob context. P23's
|
||||
marker join is P23-specific and must receive a reviewed P24 adaptation, not
|
||||
be imported unchanged as proof. Root must use current-main
|
||||
`tools/run_all_tests.py:source_refs` and `roster` on that genuine composed
|
||||
checkout for the complete source/settings/QA map and required suite set.
|
||||
The worker's shared roster delegation is implemented; composition is NOTRUN.
|
||||
No missing helper was stubbed or imported into this old-base worker.
|
||||
|
||||
The static report also names these concrete composition resources:
|
||||
`scenes/main/world_preview.gd`, `scripts/ui/event_log_dialog.gd`,
|
||||
`scripts/ui/manual_save_slots_dialog.gd`, and `scripts/ui/room_presentation.gd`
|
||||
(changed-on-main). Root must resolve their complete current-main context;
|
||||
this phase did not copy or edit them.
|
||||
|
||||
## Historical evidence and GUI stop (S6)
|
||||
|
||||
The GUI phase ended on the actual Antigravity individual quota, Error ID
|
||||
`b866fa14-cff8-4fc1-ac4f-fba529d47498-136`; queued followup failed at the same
|
||||
quota (ending 143). No replacement GUI worker or engine was launched.
|
||||
|
||||
The prior 179 passes, legacy 60 evidence, event-log evidence and every earlier
|
||||
pass are stale/inapplicable as acceptance or full regression for this changed
|
||||
P24 source. P23 full179 remains valid only for its original accepted
|
||||
d2581af/M5041b88/treea700519 source and closed P23-03. Original evidence and
|
||||
closure bytes remain unchanged. No old result was transferred to this source.
|
||||
No Godot, native/OS collector, full roster, run_all_tests main, full checker
|
||||
against an index, acceptance fixture/index, or independent review was run.
|
||||
All mandatory runtime, OS, review, integration and Windows gates remain
|
||||
NOTRUN/pending as listed above. Nothing here counts as acceptance.
|
||||
-1621
File diff suppressed because it is too large
Load Diff
-488
@@ -1,488 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""P24-02 repair4 static overlap/preservation check (SOURCE-READY evidence only).
|
||||
|
||||
This is NOT runtime, import, native, OS or acceptance proof. It only proves,
|
||||
statically and mechanically, that the four reconciled files contain:
|
||||
|
||||
* every scope-qualified GDScript symbol (class_name / class / func / signal /
|
||||
const / enum / class-body var) of the pinned current-main snapshot, and
|
||||
* every symbol the P24 worker diff (base 1a5abc6 -> 9641ed5) added,
|
||||
|
||||
each exactly once in its own scope (so a legitimate ``_init`` or ``_draw`` in a
|
||||
different inner class is never reported as a duplicate), that main's body lines
|
||||
and P24's added body lines survived, that both JSON files equal the exact
|
||||
3-way expectation "main snapshot + P24-only additions" (values and order), and
|
||||
that UI actor bubbles only read fields that exist in the current relation /
|
||||
Staff / Guest schema on main.
|
||||
|
||||
Usage (static, no Godot):
|
||||
python3 docs/plans/original-completion-2026-10-02/execution/p24-02/repair4/check_repair4_preservation.py \
|
||||
[--write-evidence]
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
from collections import Counter
|
||||
from pathlib import Path
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
ROOT = HERE.parents[5]
|
||||
REF_DIR = HERE.parent / "root-current-main-reference-20261017"
|
||||
MANIFEST = REF_DIR / "REFERENCE_MANIFEST.json"
|
||||
EVIDENCE = HERE / "SOURCE_READY_PRESERVATION_RESULT.json"
|
||||
|
||||
BASE = "1a5abc65163097d4b36a060d68f58c92093eb4e9"
|
||||
P24 = "9641ed52def2ff8e5b0222449a4a83a1191e1d37"
|
||||
MAIN = "51e8657bfbe24856186cc6530358c5459cf909b6"
|
||||
|
||||
# Explicit, reviewed repair4 deviations. Anything not listed here fails.
|
||||
REPAIR4_ADDED_SYMBOLS = {
|
||||
"scenes/main/world_preview.gd": {
|
||||
"world_preview.gd::func::_draw_actor_bubble":
|
||||
"P24 bubble binding re-expressed on main's P23 observation pipeline: "
|
||||
"bubbles are drawn per fitted actor row on the LifeOverlay canvas "
|
||||
"without mutating the observation report.",
|
||||
},
|
||||
}
|
||||
# P24-added body lines intentionally re-expressed (not dropped) in repair4.
|
||||
REPAIR4_REEXPRESSED_P24_LINES = {
|
||||
("scenes/main/world_preview.gd", "world_preview.gd::func::_draw_actors"):
|
||||
"main replaced immediate _draw_pixel_actor with observed rows; P24's inline "
|
||||
"bubble calls are re-bound through _draw_actor_bubble(row, canvas) in "
|
||||
"main's _draw_actors(canvas).",
|
||||
("scenes/main/world_preview.gd", "world_preview.gd::func::_draw_unit_bubble"):
|
||||
"same bubble geometry/glyphs, but draw calls go to the LifeOverlay canvas "
|
||||
"(canvas.draw_*) and follow the fitted row origin/scale.",
|
||||
}
|
||||
|
||||
failures: list[str] = []
|
||||
|
||||
|
||||
def fail(msg: str) -> None:
|
||||
failures.append(msg)
|
||||
|
||||
|
||||
def git_show(rev: str, path: str) -> str | None:
|
||||
try:
|
||||
return subprocess.run(["git", "show", f"{rev}:{path}"], cwd=ROOT, check=True,
|
||||
capture_output=True).stdout.decode("utf-8")
|
||||
except subprocess.CalledProcessError:
|
||||
return None
|
||||
|
||||
|
||||
def git_blob(data: bytes) -> str:
|
||||
return hashlib.sha1(b"blob %d\0" % len(data) + data).hexdigest()
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- GDScript
|
||||
DECL = [
|
||||
("class_name", re.compile(r"^class_name\s+(\w+)")),
|
||||
("class", re.compile(r"^class\s+(\w+)\b")),
|
||||
("func", re.compile(r"^(?:static\s+)?func\s+(\w+)\s*\(")),
|
||||
("signal", re.compile(r"^signal\s+(\w+)")),
|
||||
("const", re.compile(r"^const\s+(\w+)")),
|
||||
("enum", re.compile(r"^enum\s+(\w+)")),
|
||||
("var", re.compile(r"^(?:@\w+(?:\([^)]*\))?\s+)*(?:static\s+)?var\s+(\w+)")),
|
||||
]
|
||||
|
||||
|
||||
def indent_of(line: str) -> int:
|
||||
n = 0
|
||||
for ch in line:
|
||||
if ch == "\t":
|
||||
n += 1
|
||||
elif ch == " ":
|
||||
n += 0.25
|
||||
else:
|
||||
break
|
||||
return int(n)
|
||||
|
||||
|
||||
def gd_symbols(text: str, fname: str) -> list[dict]:
|
||||
"""Scope-qualified declarations with their body line ranges."""
|
||||
lines = text.split("\n")
|
||||
stack: list[tuple[int, str]] = [] # (class indent, qualified scope)
|
||||
out: list[dict] = []
|
||||
in_triple = False
|
||||
for i, raw in enumerate(lines):
|
||||
stripped = raw.strip()
|
||||
if raw.count('"""') % 2 == 1:
|
||||
in_triple = not in_triple
|
||||
continue
|
||||
if in_triple or not stripped or stripped.startswith("#"):
|
||||
continue
|
||||
ind = indent_of(raw)
|
||||
while stack and ind <= stack[-1][0]:
|
||||
stack.pop()
|
||||
scope = stack[-1][1] if stack else fname
|
||||
body_indent = stack[-1][0] + 1 if stack else 0
|
||||
if ind != body_indent:
|
||||
continue
|
||||
for kind, rx in DECL:
|
||||
m = rx.match(stripped)
|
||||
if m:
|
||||
out.append({"id": f"{scope}::{kind}::{m[1]}", "line": i, "indent": ind, "kind": kind})
|
||||
if kind == "class":
|
||||
stack.append((ind, f"{scope}.{m[1]}"))
|
||||
break
|
||||
# body = following lines until next line at indent <= decl indent (non-blank)
|
||||
for sym in out:
|
||||
start, ind = sym["line"], sym["indent"]
|
||||
end = start + 1
|
||||
while end < len(lines):
|
||||
s = lines[end]
|
||||
if s.strip() and not s.strip().startswith("#") and indent_of(s) <= ind:
|
||||
break
|
||||
end += 1
|
||||
sym["body"] = [ln.strip() for ln in lines[start:end] if ln.strip()]
|
||||
return out
|
||||
|
||||
|
||||
def by_id(syms: list[dict]) -> dict[str, dict]:
|
||||
return {s["id"]: s for s in syms}
|
||||
|
||||
|
||||
def check_gd(path: str, main_text: str, report: dict) -> None:
|
||||
fname = Path(path).name
|
||||
base_t, p24_t = git_show(BASE, path), git_show(P24, path)
|
||||
recon_t = (ROOT / path).read_text(encoding="utf-8")
|
||||
if base_t is None or p24_t is None:
|
||||
fail(f"{path}: pinned base/P24 revision unavailable")
|
||||
return
|
||||
base, p24, main, recon = (gd_symbols(t, fname) for t in (base_t, p24_t, main_text, recon_t))
|
||||
B, P, M, R = map(by_id, (base, p24, main, recon))
|
||||
counts = Counter(s["id"] for s in recon)
|
||||
dups = sorted(k for k, c in counts.items() if c > 1)
|
||||
p24_added = sorted(set(P) - set(B))
|
||||
required = sorted(set(M) | set(p24_added))
|
||||
missing = sorted(k for k in required if k not in R)
|
||||
allowed_new = REPAIR4_ADDED_SYMBOLS.get(path, {})
|
||||
unexpected = sorted(k for k in R if k not in required and k not in allowed_new)
|
||||
main_removed = sorted(set(B) - set(M))
|
||||
lost_p24_on_removed = [k for k in main_removed if k in P and P[k]["body"] != B[k]["body"]]
|
||||
for k in dups:
|
||||
fail(f"{path}: duplicate definition {k}")
|
||||
for k in missing:
|
||||
fail(f"{path}: missing symbol {k}")
|
||||
for k in unexpected:
|
||||
fail(f"{path}: unexpected symbol {k}")
|
||||
for k in lost_p24_on_removed:
|
||||
fail(f"{path}: P24 modified {k} but main removed it")
|
||||
# Body preservation (set semantics on stripped lines).
|
||||
body_issues = []
|
||||
for k, m in M.items():
|
||||
if k not in R:
|
||||
continue
|
||||
b_lines = set(B[k]["body"]) if k in B else set()
|
||||
p_lines = set(P[k]["body"]) if k in P else b_lines
|
||||
p24_removed = b_lines - p_lines
|
||||
need = set(m["body"]) - p24_removed
|
||||
lost = sorted(need - set(R[k]["body"]))
|
||||
if lost:
|
||||
body_issues.append({"symbol": k, "side": "main", "lost_lines": lost})
|
||||
fail(f"{path}: main body lines lost in {k}: {len(lost)}")
|
||||
reexpressed = []
|
||||
for k, p in P.items():
|
||||
b_lines = set(B[k]["body"]) if k in B else set()
|
||||
added = set(p["body"]) - b_lines
|
||||
if not added or k not in R:
|
||||
continue
|
||||
lost = sorted(added - set(R[k]["body"]))
|
||||
if not lost:
|
||||
continue
|
||||
reason = REPAIR4_REEXPRESSED_P24_LINES.get((path, k))
|
||||
if reason:
|
||||
reexpressed.append({"symbol": k, "lines": lost, "reason": reason})
|
||||
else:
|
||||
body_issues.append({"symbol": k, "side": "p24", "lost_lines": lost})
|
||||
fail(f"{path}: P24 added body lines lost in {k}: {len(lost)}")
|
||||
report[path] = {
|
||||
"kind": "gdscript",
|
||||
"main_symbols": sorted(M),
|
||||
"p24_side_symbols": sorted(P),
|
||||
"p24_added_symbols": p24_added,
|
||||
"main_removed_vs_base_untouched_by_p24": [k for k in main_removed if k not in lost_p24_on_removed],
|
||||
"required_count": len(required),
|
||||
"reconciled_symbol_count": len(recon),
|
||||
"missing": missing,
|
||||
"duplicates": dups,
|
||||
"unexpected": unexpected,
|
||||
"repair4_added_with_reason": {k: v for k, v in allowed_new.items() if k in R},
|
||||
"body_issues": body_issues,
|
||||
"p24_lines_reexpressed_with_reason": reexpressed,
|
||||
"conflict_markers": bool(re.search(r"^(<<<<<<<|>>>>>>>|\|\|\|\|\|\|\|) ", recon_t, re.M)),
|
||||
}
|
||||
if report[path]["conflict_markers"]:
|
||||
fail(f"{path}: conflict markers present")
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- JSON
|
||||
def load_json_strict(text: str, label: str):
|
||||
def hook(pairs):
|
||||
keys = [k for k, _ in pairs]
|
||||
d = Counter(keys)
|
||||
for k, c in d.items():
|
||||
if c > 1:
|
||||
fail(f"{label}: duplicate JSON key {k!r}")
|
||||
return dict(pairs)
|
||||
return json.loads(text, object_pairs_hook=hook)
|
||||
|
||||
|
||||
def row_key(row):
|
||||
return row.get("test") if isinstance(row, dict) else None
|
||||
|
||||
|
||||
def expect3(base, main, p24, path="$"):
|
||||
"""3-way expectation: main value, plus P24-only changes where main kept base."""
|
||||
if isinstance(main, dict) and isinstance(p24, dict) and isinstance(base, dict):
|
||||
out = {}
|
||||
for k in main:
|
||||
if k in p24 and k in base:
|
||||
out[k] = expect3(base[k], main[k], p24[k], f"{path}.{k}")
|
||||
elif k in p24 and k not in base and p24[k] != main[k]:
|
||||
fail(f"{path}.{k}: added by both main and P24 with different values")
|
||||
out[k] = main[k]
|
||||
else:
|
||||
out[k] = main[k]
|
||||
for k in p24:
|
||||
if k not in base and k not in main:
|
||||
out[k] = p24[k]
|
||||
elif k in base and k not in main and p24[k] != base[k]:
|
||||
fail(f"{path}.{k}: P24 changed a key main removed")
|
||||
return out
|
||||
if (isinstance(main, list) and isinstance(p24, list) and isinstance(base, list)
|
||||
and all(row_key(r) for r in main + p24 + base)):
|
||||
bk = {row_key(r): r for r in base}
|
||||
pk = {row_key(r): r for r in p24}
|
||||
out = []
|
||||
for r in main:
|
||||
k = row_key(r)
|
||||
out.append(expect3(bk[k], r, pk[k], f"{path}[{k}]") if k in bk and k in pk else r)
|
||||
main_keys = {row_key(r) for r in main}
|
||||
for r in p24:
|
||||
k = row_key(r)
|
||||
if k not in bk and k not in main_keys:
|
||||
out.append(r)
|
||||
return out
|
||||
if p24 != base and main == base:
|
||||
return p24
|
||||
if p24 != base and main != base and p24 != main:
|
||||
fail(f"{path}: both main and P24 changed scalar value")
|
||||
return main
|
||||
|
||||
|
||||
def ordered_equal(a, b):
|
||||
if isinstance(a, dict) and isinstance(b, dict):
|
||||
return list(a) == list(b) and all(ordered_equal(a[k], b[k]) for k in a)
|
||||
if isinstance(a, list) and isinstance(b, list):
|
||||
return len(a) == len(b) and all(ordered_equal(x, y) for x, y in zip(a, b))
|
||||
return type(a) is type(b) and a == b
|
||||
|
||||
|
||||
def json_entry_keys(obj) -> list[str]:
|
||||
keys = []
|
||||
for k, v in obj.items():
|
||||
keys.append(k)
|
||||
if isinstance(v, dict):
|
||||
keys += [f"{k}/{s}" for s in v]
|
||||
elif isinstance(v, list) and v and all(row_key(r) for r in v):
|
||||
keys += [f"{k}[{row_key(r)}]" for r in v]
|
||||
return keys
|
||||
|
||||
|
||||
def check_json(path: str, main_text: str, report: dict) -> None:
|
||||
base_t, p24_t = git_show(BASE, path), git_show(P24, path)
|
||||
recon_t = (ROOT / path).read_text(encoding="utf-8")
|
||||
if base_t is None or p24_t is None:
|
||||
fail(f"{path}: pinned base/P24 revision unavailable")
|
||||
return
|
||||
base, main, p24 = (load_json_strict(t, f"{path}@{r}") for t, r in
|
||||
((base_t, "base"), (main_text, "main"), (p24_t, "p24")))
|
||||
recon = load_json_strict(recon_t, f"{path}@reconciled")
|
||||
expected = expect3(base, main, p24)
|
||||
# Repair5 authority permits exactly this P24 source pin rebind; no schema,
|
||||
# cleanup policy, non-P24 row or ordered structure is changed.
|
||||
test = "tests/ui/test_operations_notification.gd"
|
||||
digest = hashlib.sha256((ROOT / test).read_bytes()).hexdigest()
|
||||
if path.endswith("completion_marker_contracts.json"):
|
||||
rows = [r for r in expected["rows"] if r["test"] == test]
|
||||
if len(rows) != 1:
|
||||
fail("exactly one P24 marker row required")
|
||||
else:
|
||||
rows[0]["source_sha256_at_schema_audit"] = digest
|
||||
elif path.endswith("suite-policy.json"):
|
||||
expected["suite_policies"][test]["source_sha256"] = digest
|
||||
ok = ordered_equal(recon, expected)
|
||||
if not ok:
|
||||
fail(f"{path}: reconciled JSON != main snapshot + P24-only additions (value/order)")
|
||||
mk, pk, bk, rk = map(json_entry_keys, (main, p24, base, recon))
|
||||
rc = Counter(rk)
|
||||
p24_added = [k for k in pk if k not in bk]
|
||||
missing = [k for k in list(dict.fromkeys(mk + p24_added)) if k not in rc]
|
||||
dups = sorted(k for k, c in rc.items() if c > 1)
|
||||
for k in missing:
|
||||
fail(f"{path}: missing JSON entry {k}")
|
||||
for k in dups:
|
||||
fail(f"{path}: duplicate JSON entry {k}")
|
||||
report[path] = {
|
||||
"kind": "json",
|
||||
"main_entry_keys": mk,
|
||||
"p24_side_entry_keys": pk,
|
||||
"p24_added_entry_keys": p24_added,
|
||||
"missing": missing,
|
||||
"duplicates": dups,
|
||||
"equals_main_plus_p24_only_additions_in_order": ok,
|
||||
"main_entries_value_identical": all(
|
||||
ordered_equal(recon.get(k), main[k]) for k in main if not isinstance(main[k], (dict, list))),
|
||||
}
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- schema
|
||||
def enum_members(text: str, enum: str) -> set[str]:
|
||||
m = re.search(r"enum\s+" + enum + r"\s*\{(.*?)\}", text, re.S)
|
||||
return set(re.findall(r"\b([A-Z_][A-Z0-9_]*)\b", m[1])) if m else set()
|
||||
|
||||
|
||||
def top_vars(text: str) -> set[str]:
|
||||
return set(re.findall(r"^var\s+(\w+)", text, re.M))
|
||||
|
||||
|
||||
def check_bubble_schema(report: dict) -> None:
|
||||
fb = (ROOT / "scripts/ui/operation_feedback.gd").read_text(encoding="utf-8")
|
||||
wp = (ROOT / "scenes/main/world_preview.gd").read_text(encoding="utf-8")
|
||||
srcs = {
|
||||
"relationship_state": "scripts/relationship/relationship_state.gd",
|
||||
"staff_runtime": "scripts/staff/staff_runtime.gd",
|
||||
"guest_runtime": "scripts/guest/guest_runtime.gd",
|
||||
"relationship_service": "scripts/relationship/relationship_service.gd",
|
||||
"staff_service": "scripts/staff/staff_service.gd",
|
||||
"guest_service": "scripts/guest/guest_service.gd",
|
||||
}
|
||||
main_src = {k: git_show(MAIN, p) for k, p in srcs.items()}
|
||||
if any(v is None for v in main_src.values()):
|
||||
fail("schema: main revision source unavailable")
|
||||
return
|
||||
rel_vars = top_vars(main_src["relationship_state"])
|
||||
metric_ids = set(re.findall(r'&"(\w+)"', re.search(r"const METRIC_IDS[^=]*=\s*\[(.*?)\]", main_src["relationship_state"], re.S)[1]))
|
||||
checks = []
|
||||
|
||||
def need(label, cond):
|
||||
checks.append({"check": label, "ok": bool(cond)})
|
||||
if not cond:
|
||||
fail(f"schema: {label}")
|
||||
|
||||
staff_used = set(re.findall(r"StaffRuntime\.State\.(\w+)", fb))
|
||||
guest_used = set(re.findall(r"GuestRuntime\.State\.(\w+)", fb))
|
||||
lock_used = set(re.findall(r"RelationshipState\.RouteLock\.(\w+)", fb))
|
||||
rel_fields = set(re.findall(r"relationship\.(\w+)", fb)) - {"get"}
|
||||
rel_fields |= set(re.findall(r'relationship\.get\(&"(\w+)"', fb))
|
||||
need(f"StaffRuntime.State members {sorted(staff_used)} exist on main",
|
||||
staff_used and staff_used <= enum_members(main_src["staff_runtime"], "State"))
|
||||
need(f"GuestRuntime.State members {sorted(guest_used)} exist on main",
|
||||
guest_used and guest_used <= enum_members(main_src["guest_runtime"], "State"))
|
||||
need(f"RelationshipState.RouteLock members {sorted(lock_used)} exist on main",
|
||||
lock_used and lock_used <= enum_members(main_src["relationship_state"], "RouteLock"))
|
||||
need(f"RelationshipState fields {sorted(rel_fields)} exist on main", rel_fields and rel_fields <= rel_vars)
|
||||
need("relationship metric 'affection' is a main METRIC_ID", "affection" in metric_ids)
|
||||
need("GuestRuntime.patience_remaining exists on main", "patience_remaining" in top_vars(main_src["guest_runtime"]))
|
||||
wp_rel = set(re.findall(r"rel_val\.(\w+)", wp))
|
||||
need(f"world_preview relation lookup fields {sorted(wp_rel)} exist on main", wp_rel and wp_rel <= rel_vars)
|
||||
for svc, meth in (("relationship_service", "get_relationships"), ("staff_service", "get_staff"),
|
||||
("guest_service", "get_guest")):
|
||||
need(f"main {svc}.{meth}() exists", re.search(r"^func\s+" + meth + r"\s*\(", main_src[svc], re.M))
|
||||
for k in ("relationship_state", "staff_runtime", "guest_runtime"):
|
||||
wt = (ROOT / srcs[k]).read_text(encoding="utf-8")
|
||||
need(f"worker {srcs[k]} identical to main (schema not diverged)", wt == main_src[k])
|
||||
report["bubble_relation_schema"] = {"checks": checks, "relationship_state_vars_main": sorted(rel_vars)}
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- deps
|
||||
def root_composition_dependencies(report: dict) -> None:
|
||||
ls_main = subprocess.run(["git", "ls-tree", "-r", "--name-only", MAIN], cwd=ROOT,
|
||||
capture_output=True, text=True).stdout.split("\n")
|
||||
main_files = set(filter(None, ls_main))
|
||||
main_classes: dict[str, str] = {}
|
||||
grep = subprocess.run(["git", "grep", "-h", "-E", r"^class_name\s+\w+", MAIN, "--", "*.gd"], cwd=ROOT,
|
||||
capture_output=True, text=True).stdout
|
||||
for m in re.finditer(r"class_name\s+(\w+)", grep):
|
||||
main_classes[m[1]] = "main"
|
||||
worker_classes = set()
|
||||
for p in ROOT.rglob("*.gd"):
|
||||
if ".godot" in p.parts:
|
||||
continue
|
||||
for m in re.finditer(r"^class_name\s+(\w+)", p.read_text(encoding="utf-8", errors="ignore"), re.M):
|
||||
worker_classes.add(m[1])
|
||||
deps = []
|
||||
for path in ("scenes/main/main.gd", "scenes/main/world_preview.gd"):
|
||||
text = (ROOT / path).read_text(encoding="utf-8")
|
||||
for res in sorted(set(re.findall(r'(?:pre)?load\("res://([^"]+)"\)', text))):
|
||||
in_worker = (ROOT / res).exists()
|
||||
in_main = res in main_files
|
||||
changed = None
|
||||
if in_worker and in_main:
|
||||
mt = git_show(MAIN, res)
|
||||
changed = mt is not None and mt != (ROOT / res).read_text(encoding="utf-8", errors="ignore")
|
||||
if (in_main and not in_worker) or changed:
|
||||
deps.append({"file": path, "resource": res, "kind": "main-only" if not in_worker else "changed-on-main"})
|
||||
words = set(re.findall(r"\b([A-Z]\w+)\b", text))
|
||||
for cls in sorted(words & (set(main_classes) - worker_classes)):
|
||||
deps.append({"file": path, "class_name": cls, "kind": "main-only class_name"})
|
||||
report["root_composition_dependencies"] = {
|
||||
"note": "Reconciled files keep main snapshot text; these symbols/resources resolve only on the "
|
||||
"composed current-main tree. Not stubbed, not copied (outside allowed_paths).",
|
||||
"items": deps,
|
||||
}
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- main
|
||||
def main() -> int:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--write-evidence", action="store_true")
|
||||
args = ap.parse_args()
|
||||
manifest = json.loads(MANIFEST.read_text(encoding="utf-8"))
|
||||
if (manifest["submitted"], manifest["main_reference"], manifest["registered_base_unchanged"]) != (P24, MAIN, BASE):
|
||||
fail("manifest revisions differ from pinned P24/main/base")
|
||||
report: dict = {"pins": []}
|
||||
files: dict = {}
|
||||
for entry in manifest["all4_current_main_files"]:
|
||||
data = (ROOT / entry["reference_path"]).read_bytes()
|
||||
sha, blob = hashlib.sha256(data).hexdigest(), git_blob(data)
|
||||
ok = sha == entry["sha256"] and blob == entry["main_blob"]
|
||||
live = git_show(MAIN, entry["path"])
|
||||
same_as_main_commit = live is not None and live.encode("utf-8") == data
|
||||
report["pins"].append({"path": entry["path"], "sha256": sha, "blob": blob, "pin_ok": ok,
|
||||
"snapshot_equals_main_commit_blob": same_as_main_commit})
|
||||
if not ok:
|
||||
fail(f"pin mismatch: {entry['path']}")
|
||||
files[entry["path"]] = data.decode("utf-8")
|
||||
results: dict = {}
|
||||
for path, text in files.items():
|
||||
(check_gd if path.endswith(".gd") else check_json)(path, text, results)
|
||||
report["files"] = results
|
||||
check_bubble_schema(report)
|
||||
root_composition_dependencies(report)
|
||||
report["status"] = "SOURCE-READY" if not failures else "SOURCE-NOT-READY"
|
||||
report["runtime_status"] = "NOTRUN"
|
||||
report["scope"] = ("Static source preservation only. Not Godot/import/native/OS/full-roster proof and "
|
||||
"not acceptance. Root owns current-main composition and all execution.")
|
||||
report["failures"] = failures
|
||||
if args.write_evidence:
|
||||
EVIDENCE.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
summary = {p: {k: (len(v) if isinstance(v, list) else v) for k, v in r.items()
|
||||
if k in ("missing", "duplicates", "unexpected", "required_count", "reconciled_symbol_count",
|
||||
"equals_main_plus_p24_only_additions_in_order", "body_issues")}
|
||||
for p, r in results.items()}
|
||||
print(json.dumps({"status": report["status"], "runtime_status": "NOTRUN", "files": summary,
|
||||
"schema_checks_ok": all(c["ok"] for c in report.get("bubble_relation_schema", {}).get("checks", [])),
|
||||
"root_composition_dependencies": len(report["root_composition_dependencies"]["items"]),
|
||||
"failures": failures}, ensure_ascii=False, indent=2))
|
||||
return 0 if not failures else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
-116
@@ -1,116 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Isolated checker tests; no acceptance index, engine, or full test execution."""
|
||||
import copy
|
||||
import importlib.util
|
||||
import os
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import subprocess
|
||||
import tempfile
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[6]
|
||||
spec = importlib.util.spec_from_file_location('checker', ROOT / 'tools/check_p24_operations_evidence.py')
|
||||
checker = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(checker)
|
||||
|
||||
|
||||
class CheckerTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.tmp = tempfile.TemporaryDirectory()
|
||||
self.addCleanup(self.tmp.cleanup)
|
||||
self.root = Path(self.tmp.name)
|
||||
(self.root / 'tools').mkdir()
|
||||
shutil.copyfile(ROOT / 'tools/run_all_tests.py', self.root / 'tools/run_all_tests.py')
|
||||
(self.root / 'tests').mkdir()
|
||||
for name in ('run_tests.gd', 'test_alpha.gd', 'test_beta.gd'):
|
||||
(self.root / 'tests' / name).write_text('# isolated fixture ' + name)
|
||||
self.rows = [dict(test=p, failures=0, passed=True,
|
||||
source_sha256=checker.compute_sha256(self.root / p))
|
||||
for p in checker.get_required_suite_roster(self.root)]
|
||||
|
||||
def validate(self, rows, **counts):
|
||||
data = dict(test_suite='tests/ui/test_operations_notification.gd', failures=0, checks=1,
|
||||
full_roster=dict(results=rows, **counts))
|
||||
# Repair5 deliberately resolves suite bytes from the verified T view,
|
||||
# never from cwd. This TEST-ONLY adapter supplies that isolated view.
|
||||
with patch.object(checker, 'VERIFIED_ROOT', self.root):
|
||||
return checker._validate_condition_artifact_content(
|
||||
'final_validation_review', data, 'json', self.root, {}, {})
|
||||
|
||||
def test_positive_roster(self):
|
||||
for counts in ({}, dict(total_suites=3, suites_count=3, failures=0)):
|
||||
self.assertEqual(self.validate(self.rows, **counts), (True, ''))
|
||||
|
||||
def test_1_invented_replacement(self):
|
||||
rows = copy.deepcopy(self.rows)
|
||||
rows[0]['test'] = 'tests/invented.gd'
|
||||
self.assertFalse(self.validate(rows)[0])
|
||||
self.assertFalse(self.validate(rows + [rows[0]])[0])
|
||||
|
||||
def test_2_duplicate_padding(self):
|
||||
self.assertFalse(self.validate(self.rows[1:] + [self.rows[1]])[0])
|
||||
|
||||
def test_3_unknown_extra(self):
|
||||
self.assertFalse(self.validate(self.rows + [dict(test='invented')])[0])
|
||||
|
||||
def test_4_required_results(self):
|
||||
for field, value in [('failures', 1), ('failures', False), ('failures', '0'),
|
||||
('passed', False), ('passed', 1), ('passed', None), ('failures', None)]:
|
||||
with self.subTest(field=field, value=value):
|
||||
rows = copy.deepcopy(self.rows)
|
||||
if value is None:
|
||||
del rows[0][field]
|
||||
else:
|
||||
rows[0][field] = value
|
||||
self.assertFalse(self.validate(rows)[0])
|
||||
|
||||
def test_5_source_hash(self):
|
||||
for value in (None, 'bad', '0' * 64, 42):
|
||||
with self.subTest(value=value):
|
||||
rows = copy.deepcopy(self.rows)
|
||||
if value is None:
|
||||
del rows[0]['source_sha256']
|
||||
else:
|
||||
rows[0]['source_sha256'] = value
|
||||
self.assertFalse(self.validate(rows)[0])
|
||||
|
||||
def test_6_missing_or_malformed_rows(self):
|
||||
for rows in (None, [], {}, 'missing', [None], [{}]):
|
||||
with self.subTest(rows=rows):
|
||||
self.assertFalse(self.validate(rows, total_suites=3, failures=0)[0])
|
||||
for counts in (dict(total_suites=4), dict(suites_count=True), dict(failures=None)):
|
||||
self.assertFalse(self.validate(self.rows, **counts)[0])
|
||||
|
||||
def init_repo(self):
|
||||
subprocess.run(['git', 'init', '-q', str(self.root)], check=True, capture_output=True)
|
||||
# Only the disposable repo is written; no workspace git mutation.
|
||||
subprocess.run(['git', '-c', 'user.name=Checker Test', '-c', 'user.email=checker@example.invalid',
|
||||
'-c', 'commit.gpgsign=false', 'commit', '--allow-empty', '-qm', 'fixture'],
|
||||
cwd=self.root, check=True, capture_output=True)
|
||||
return subprocess.run(['git', 'rev-parse', 'HEAD'], cwd=self.root,
|
||||
check=True, capture_output=True, text=True).stdout.strip()
|
||||
|
||||
def test_7_env_mismatch_and_positive_head(self):
|
||||
head = self.init_repo()
|
||||
with patch.dict(os.environ, {}, clear=True):
|
||||
self.assertEqual(checker.get_actual_git_head(self.root), head)
|
||||
for name in ('CANDIDATE_COMMIT', 'TARGET_HEAD'):
|
||||
with patch.dict(os.environ, {name: head}):
|
||||
self.assertEqual(checker.get_actual_git_head(self.root), head)
|
||||
with patch.dict(os.environ, {name: '1' * 40}):
|
||||
self.assertEqual(checker.get_actual_git_head(self.root), '')
|
||||
with patch.dict(os.environ, dict(CANDIDATE_COMMIT=head, TARGET_HEAD='1' * 40)):
|
||||
self.assertEqual(checker.get_actual_git_head(self.root), '')
|
||||
|
||||
def test_8_git_unavailable_env_only(self):
|
||||
with patch.dict(os.environ, {'CANDIDATE_COMMIT': '1' * 40}, clear=True):
|
||||
with patch('subprocess.run', side_effect=FileNotFoundError('git unavailable')):
|
||||
self.assertEqual(checker.get_actual_git_head(self.root), '')
|
||||
with patch('subprocess.run', return_value=subprocess.CompletedProcess([], 128, '', 'not a repo')):
|
||||
self.assertEqual(checker.get_actual_git_head(self.root), '')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(verbosity=2)
|
||||
-98
@@ -1,98 +0,0 @@
|
||||
{
|
||||
"plan_id": "P24-02",
|
||||
"title": "操作と通知",
|
||||
"state": "in_progress; existing Runner submitted, read-only acceptance re-audit started",
|
||||
"original_denominator": {
|
||||
"packages": 30,
|
||||
"units": 88,
|
||||
"completed": 14,
|
||||
"partial_credit": false
|
||||
},
|
||||
"source": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"current_main": "32c8d1ce4314f821fe2eb3713fe5c6309b98e4c3",
|
||||
"existing_project": "the-tree-p24-02-operations",
|
||||
"existing_worker_checkout": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"runner_repairs_used": 3,
|
||||
"max_repairs": null,
|
||||
"worker_registered": "agy (existing UI assignment retained; no new worker or model switch performed)",
|
||||
"spec_sha256": "7f4258ef94169c516b5cd1a49a96d0c41f306ca2a05203a8c2a6475b69a1a9ee",
|
||||
"actual_opus_selection": "docs/plans/original-completion-2026-10-02/execution/next-closure-after-p23-20261017/result.json",
|
||||
"all_eight_original_conditions": [
|
||||
{
|
||||
"condition_id": "placement_and_invalid_drop",
|
||||
"all_original_required_text": "Original grid snap and connection warnings; valid placement commits once, invalid placement/assignment explains the actual rejection, leaves model/ledger/selection intact, supports equivalent click-based operation.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "ordinary-controls-observations-r05.json; limited valid reception and overlap rejection, full model/selection preserved.",
|
||||
"missing_or_dependencies": "Invalid assignment/drop, real rejection call paths and equivalent click operations require exact final-source coverage."
|
||||
},
|
||||
{
|
||||
"condition_id": "modal_and_pause_resume",
|
||||
"all_original_required_text": "Modal open/cancel/confirm, input focus, pausing and resuming preserve pending commands and save identity. Behind-dialog input cannot accidentally build or change assignment. Actual pause freezes simulation and ordinary resume continues exactly once.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "ordinary-controls-observations-r05.json and ordinary-menu-os-observations-r02.json; limited modal open/cancel, IME focus, save/load.",
|
||||
"missing_or_dependencies": "All modal cancel/confirm, actual behind-dialog input limits, pending commands, actual pause freeze/resume once require mapped evidence."
|
||||
},
|
||||
{
|
||||
"condition_id": "unit_bubbles",
|
||||
"all_original_required_text": "Unit overhead Zzz, anger, heart correspond to actual existing state. Observe source/model/render bindings and switching/removal without stale symbols; do not invent gameplay thresholds or hidden approved values.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "Existing source bindings were retained by old 9641 candidate; no new whole-condition evidence inferred.",
|
||||
"missing_or_dependencies": "Real Zzz/anger/heart states, switching and removal without stale symbol; recheck current Runtime and draw source after integration conflicts resolved."
|
||||
},
|
||||
{
|
||||
"condition_id": "event_log",
|
||||
"all_original_required_text": "Actual production events reach bounded recent log in sequence, readable Japanese with correct amounts/time/reasons, no duplicate events across pause/load. Reuse accepted256-entry log only with matching source applicability.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "Existing local log34 and accepted P24-03 bounded256 evidence are candidates for exact applicability reuse.",
|
||||
"missing_or_dependencies": "Current production event sequence, readable time/amount/reason, pause/load no duplicate; current UI and Runtime source must match."
|
||||
},
|
||||
{
|
||||
"condition_id": "important_warning_cutin",
|
||||
"all_original_required_text": "Original important-warning UI for invasion start, duel, defense start is connected to actual existing signals/states with clear text, dismiss/stop/resume behavior; fixture-only signal injection is local testing, not proof ordinary production trigger. Missing upstream/catalog/assets remain explicit dependencies, do not claim complete.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "Prior limited shield-positive-to-zero warning text review; fixtures are local-only. P18 backend265ce30 integrated5f6bc11 is accepted backend only.",
|
||||
"missing_or_dependencies": "Actual ordinary NTR/duel/defense triggers still depend on whole P18-01/02, P19-01, P21-01 and required content; no synthetic signal pass or invented values. Read upstream-audit-r01 before choosing implementation."
|
||||
},
|
||||
{
|
||||
"condition_id": "click_alternatives",
|
||||
"all_original_required_text": "Provide/verify click equivalents for necessary pointer/drag/modifier navigation and assignment operations. Reuse existing step/zoom/bounds mechanisms and scales; presentation controls must not change gameplay model. Manual P23 held gestures remain deferred, not waived or relabeled.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "Actual normal menu save-label entrance and limited placement controls.",
|
||||
"missing_or_dependencies": "Map every required navigation/assignment equivalent. Preserve deferred P23 held gestures as unmet, not waived."
|
||||
},
|
||||
{
|
||||
"condition_id": "japanese_input_and_scale",
|
||||
"all_original_required_text": "Actual OS Japanese composition/confirmation/cancel, persisted display of valid Japanese text and clear invalid-input feedback, representative window/display scales with clipping/focus/modal inspection. Use existing save display_name metadata for an editable optional Japanese save label if a suitable text field is absent; retain existing default name, cryptographic owned path, old-save preservation and cancel semantics. Do not add new gameplay numbers or rename save paths to user text. Explicitly classify macOS current development verification and still-required same-Windows-release platform acceptance; do not transfer prior Windows evidence.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "ordinary-menu-os-observations-r02.json and preservation-r03: actual IME cancel/confirm, Japanese display_name, old4file content preservation, distinct PID snapshot equality for one construction scenario.",
|
||||
"missing_or_dependencies": "Invalid labels, every required scale/focus/clip/modal scenario, full applicable content and same-Windows candidate real-device conditions remain. Reuse only if exact relevant UI/input/source/settings/environment match."
|
||||
},
|
||||
{
|
||||
"condition_id": "final_validation_review",
|
||||
"all_original_required_text": "Static/import, local/affected tests first; batch related fixes then run required full roster on exact final game/source/settings. Exact version/source hashes/config/inputs/artifacts and condition status. Independent separate Claude review with actual runtime evidence (not pending templates alone), current-main integration and final validation. All required conditions/evidence must hold to close P24-02; no partial credit, no counts as acceptance.",
|
||||
"whole_condition_accepted": false,
|
||||
"existing_limited_evidence_candidate": "Submitted local-r06 3suites167checks, parse and limited independent delta review only; no whole8 acceptance.",
|
||||
"missing_or_dependencies": "Resolve actual four current-main merge conflicts retaining both accepted P23/source guards and existing P24 implementation; then static/local/impact, missing actual OS/upstream scenarios, exact final full once, registered validate, separate whole8 Opus review, normal prepare-integration/integration/final and ledger. Reuse matching current full only when all selected source/settings/input/engine pins truly match."
|
||||
}
|
||||
],
|
||||
"current_main_preflight": {
|
||||
"exit_code": 1,
|
||||
"conflict_paths": [
|
||||
"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"scenes/main/main.gd",
|
||||
"scenes/main/world_preview.gd",
|
||||
"tools/regression/suite-policy.json"
|
||||
],
|
||||
"not_an_integration_candidate": true,
|
||||
"not_tested_or_accepted": true
|
||||
},
|
||||
"registered_build_directory_currently_exists": false,
|
||||
"raw_proof_location_audit": "docs/plans/original-completion-2026-10-02/execution/next-closure-after-p23-20261017/P24_EXISTING_LIMITED_EVIDENCE_LOCATION_AND_SHA_AUDIT.json",
|
||||
"next_bounded_action": "Have the existing P24 commander inspect these actual eight-condition/source/conflict/proof facts and direct one legal same-task continuation. Root does not start a duplicate worker or force submitted to repair_pending. Missing local old proof must use exact archive restore if needed; no repeated full run just to replace available proof.",
|
||||
"P04_four_unapproved_rules": "Remain pending independent of P24; approved hold/reservation/18:00 rules unchanged.",
|
||||
"new_engine_runs": 0,
|
||||
"new_worker_runs": 0,
|
||||
"new_full_regression_runs": 0,
|
||||
"unit_accepted": false,
|
||||
"audited_at_jst": "2026-10-17T00:26:02.956343+09:00"
|
||||
}
|
||||
-491
@@ -1,491 +0,0 @@
|
||||
{
|
||||
"source": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"audited_at_jst": "2026-10-17T00:26:02.956343+09:00",
|
||||
"scope": "Read-only legacy proof availability/pins only; does not establish current main/source applicability or full P24 acceptance. No engine/OS/test started.",
|
||||
"total_references": 60,
|
||||
"local_matching": 60,
|
||||
"local_mismatching": 0,
|
||||
"local_unavailable": 0,
|
||||
"rows": [
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/submitted-local-r06.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06/local-ended.json",
|
||||
"expected_sha256": "a49a9229bc3bde09aebff72daafbfe99d159da9bf1dfc702b036640946654b64",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "a49a9229bc3bde09aebff72daafbfe99d159da9bf1dfc702b036640946654b64",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/submitted-local-r06.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06/runner-input.json",
|
||||
"expected_sha256": "577442ab27679b03c4c25a8b0d362aed871599d7c37675aaafd41fa80579dd70",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "577442ab27679b03c4c25a8b0d362aed871599d7c37675aaafd41fa80579dd70",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/started.json",
|
||||
"expected_sha256": "d40a0252aa547b049d30cdc9a15774131438b2535f808ead128f0f86f7bf5954",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "d40a0252aa547b049d30cdc9a15774131438b2535f808ead128f0f86f7bf5954",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/process-started.json",
|
||||
"expected_sha256": "5ba807e0ee65944815542648108322586f4730b074abebb0b117dd61071140b1",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "5ba807e0ee65944815542648108322586f4730b074abebb0b117dd61071140b1",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/ended.json",
|
||||
"expected_sha256": "0b188dcb42995ee09205f233116665cbf54f59a7d1e93f9d2aafc07779ae19a3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "0b188dcb42995ee09205f233116665cbf54f59a7d1e93f9d2aafc07779ae19a3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/events.jsonl",
|
||||
"expected_sha256": "efa3f0eca8bf0001edc89041d968a0fdf9f474ddd5a6803db2a138e4dfd53cc5",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "efa3f0eca8bf0001edc89041d968a0fdf9f474ddd5a6803db2a138e4dfd53cc5",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/passive_os.gd",
|
||||
"expected_sha256": "66e60f81f836fe648f9011660d0255f5c4b780bfdacc820829c90bb655022880",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "66e60f81f836fe648f9011660d0255f5c4b780bfdacc820829c90bb655022880",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/started.json",
|
||||
"expected_sha256": "64ad63ae5b4339cd639f2d22fa076caa7d8d3f9501337fadadc1d4dcfcbbe2d0",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "64ad63ae5b4339cd639f2d22fa076caa7d8d3f9501337fadadc1d4dcfcbbe2d0",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/process-started.json",
|
||||
"expected_sha256": "f116952d77720858065576f41df7116f384801e6c27acb6cf339a329589627b0",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "f116952d77720858065576f41df7116f384801e6c27acb6cf339a329589627b0",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/ended.json",
|
||||
"expected_sha256": "22d0ffd1ea18c06a46dc7aa977613385d3ae5f4a81dab9ed4650f9c10d044d68",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "22d0ffd1ea18c06a46dc7aa977613385d3ae5f4a81dab9ed4650f9c10d044d68",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/events.jsonl",
|
||||
"expected_sha256": "369eb5e182fcf5b21693380198df187654b508e288c08f6ecb0d3aa6af4ec0ca",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "369eb5e182fcf5b21693380198df187654b508e288c08f6ecb0d3aa6af4ec0ca",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os/saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7/manifest.json",
|
||||
"expected_sha256": "e8537a6f6cba53683cca36794adc08f7c5958b78ced74fa06e499a3f8c123e4a",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "e8537a6f6cba53683cca36794adc08f7c5958b78ced74fa06e499a3f8c123e4a",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os/saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7/world.bin",
|
||||
"expected_sha256": "0424074b51f327ffb3ce3dc8e92ccb2d9d04d657db6e1461cdb83541f1cc0bee",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "0424074b51f327ffb3ce3dc8e92ccb2d9d04d657db6e1461cdb83541f1cc0bee",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/started.json",
|
||||
"expected_sha256": "bc05d5ef0ec62a3fc46e5b957f3724ef95c339078bc02eee04b3c42632bbe1ab",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "bc05d5ef0ec62a3fc46e5b957f3724ef95c339078bc02eee04b3c42632bbe1ab",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/process-started.json",
|
||||
"expected_sha256": "d6d981e157cd7e68a08e9e0133f81faac4113a48d03e74deb04d380cb03e41b1",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "d6d981e157cd7e68a08e9e0133f81faac4113a48d03e74deb04d380cb03e41b1",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/ended.json",
|
||||
"expected_sha256": "bf42d9666d4fe27051403f7d00a96f17abaa1e9b551db9d13c49ee8f7130d5c6",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "bf42d9666d4fe27051403f7d00a96f17abaa1e9b551db9d13c49ee8f7130d5c6",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/events.jsonl",
|
||||
"expected_sha256": "104fb16b406dd123b77356ef98bd5a8f0bd595d660be0870c881cfbf30ce7302",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "104fb16b406dd123b77356ef98bd5a8f0bd595d660be0870c881cfbf30ce7302",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/passive_os.gd",
|
||||
"expected_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/preexisting-slot-before.json",
|
||||
"expected_sha256": "aed601473efa522c41e5ca8890c11f1eeb2b06e786fb76cba1e96263934efe82",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "aed601473efa522c41e5ca8890c11f1eeb2b06e786fb76cba1e96263934efe82",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/preexisting-slot-after.json",
|
||||
"expected_sha256": "efb7170f0579bed92a42ead7c03b70dfc37df1e55dde05a96ae67666c6e38063",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "efb7170f0579bed92a42ead7c03b70dfc37df1e55dde05a96ae67666c6e38063",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/started.json",
|
||||
"expected_sha256": "135b779ce605d491bc6110235e9827c4091fefe8b86a49222655b3b713adcad7",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "135b779ce605d491bc6110235e9827c4091fefe8b86a49222655b3b713adcad7",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/process-started.json",
|
||||
"expected_sha256": "e33badfd0b68ff97ce8459fed3a6a6d7275d938fbc1705c82cea94e7ded66314",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "e33badfd0b68ff97ce8459fed3a6a6d7275d938fbc1705c82cea94e7ded66314",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/ended.json",
|
||||
"expected_sha256": "353cfa8e5ea703cb777bf0796b8a0f2f7fa55a5a36b69585414d5e7a16fae94c",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "353cfa8e5ea703cb777bf0796b8a0f2f7fa55a5a36b69585414d5e7a16fae94c",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/events.jsonl",
|
||||
"expected_sha256": "2f93c17152ed41dbbbd7b70b79383591a02ef0f9939d03cf340665ed4ee70ef7",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "2f93c17152ed41dbbbd7b70b79383591a02ef0f9939d03cf340665ed4ee70ef7",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/passive_os.gd",
|
||||
"expected_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/snapshot-000.bin",
|
||||
"expected_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/loaded-stored-snapshot.bin",
|
||||
"expected_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui/manifest.json",
|
||||
"expected_sha256": "62d801bb42100ade11f3f4957bff85cac7fea573dcefea97faf3806c8a29c669",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "62d801bb42100ade11f3f4957bff85cac7fea573dcefea97faf3806c8a29c669",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui/world.bin",
|
||||
"expected_sha256": "da65a181c934bf8fe0a2969db5c074863b03cf2483f2b039e5dd588b809b80b3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "da65a181c934bf8fe0a2969db5c074863b03cf2483f2b039e5dd588b809b80b3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui_6789d75c74d103ad3912e8992a815680/manifest.json",
|
||||
"expected_sha256": "cd450b442c37d497735888f6b96076ba482dca72a420aed1cf6568eb3723824b",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "cd450b442c37d497735888f6b96076ba482dca72a420aed1cf6568eb3723824b",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui_6789d75c74d103ad3912e8992a815680/world.bin",
|
||||
"expected_sha256": "a0eb8af6fbb6abcdaea0375b4298164013229c3ba187a9d4c1e54d37ecb75202",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "a0eb8af6fbb6abcdaea0375b4298164013229c3ba187a9d4c1e54d37ecb75202",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/started.json",
|
||||
"expected_sha256": "64397b2e4b9cf67faf78bd02848492895111ac0b0b32c9d4fd629e481103b094",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "64397b2e4b9cf67faf78bd02848492895111ac0b0b32c9d4fd629e481103b094",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/process-started.json",
|
||||
"expected_sha256": "3b73172fa0124a5ef47f7004d5ae4144b057279b7246e8dd4eb84cc5a1097c17",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "3b73172fa0124a5ef47f7004d5ae4144b057279b7246e8dd4eb84cc5a1097c17",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ended.json",
|
||||
"expected_sha256": "9bbdf3d512b5f5ae4a8f9595da1cac52587a5f05009869ec7e0d7c8099c4ed8a",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "9bbdf3d512b5f5ae4a8f9595da1cac52587a5f05009869ec7e0d7c8099c4ed8a",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/events.jsonl",
|
||||
"expected_sha256": "f456f8013343264573c6cab8c7be99807210cb889a78f0a1db1461989d46a3dc",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "f456f8013343264573c6cab8c7be99807210cb889a78f0a1db1461989d46a3dc",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/passive_os.gd",
|
||||
"expected_sha256": "552f9bb40770f1a88bbfb41586782e4f8ba8dff29776336ab83ba64dbd2f4767",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "552f9bb40770f1a88bbfb41586782e4f8ba8dff29776336ab83ba64dbd2f4767",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-000.bin",
|
||||
"expected_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-001.bin",
|
||||
"expected_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-002.bin",
|
||||
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-003.bin",
|
||||
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-004.bin",
|
||||
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-005.bin",
|
||||
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-006.bin",
|
||||
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-007.bin",
|
||||
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-000.json",
|
||||
"expected_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-001.json",
|
||||
"expected_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-002.json",
|
||||
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-003.json",
|
||||
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-004.json",
|
||||
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-005.json",
|
||||
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-006.json",
|
||||
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-007.json",
|
||||
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-000.png",
|
||||
"expected_sha256": "4516abb706e829094c19632e6c8005ad68877c7856af4ccfdf346e98b8dabe95",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "4516abb706e829094c19632e6c8005ad68877c7856af4ccfdf346e98b8dabe95",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-001.png",
|
||||
"expected_sha256": "9d61efee38fee61447a3ae10e95e07381f9560254388cc4ce38a79f7a0a21e6d",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "9d61efee38fee61447a3ae10e95e07381f9560254388cc4ce38a79f7a0a21e6d",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-002.png",
|
||||
"expected_sha256": "4f53747098468b37bc23078d70d091a8b1d8c78ae44547476df70d40c153d03e",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "4f53747098468b37bc23078d70d091a8b1d8c78ae44547476df70d40c153d03e",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-003.png",
|
||||
"expected_sha256": "dd60776d2370d79814e874a3944f7bce9152d6d3640bee434c624940f6e000e8",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "dd60776d2370d79814e874a3944f7bce9152d6d3640bee434c624940f6e000e8",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-004.png",
|
||||
"expected_sha256": "e8c2b8027767cd26850f02a2d87d2e594bab4c3d6ebcc5f288ec6140f332146d",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "e8c2b8027767cd26850f02a2d87d2e594bab4c3d6ebcc5f288ec6140f332146d",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-005.png",
|
||||
"expected_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-006.png",
|
||||
"expected_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
|
||||
"sha_match": true
|
||||
},
|
||||
{
|
||||
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-007.png",
|
||||
"expected_sha256": "0854ba41fd73e5b092d71e7d11e99fe3efb7b25ee04c2b0c8750b5d9de6d84b3",
|
||||
"local_exists": true,
|
||||
"actual_sha256": "0854ba41fd73e5b092d71e7d11e99fe3efb7b25ee04c2b0c8750b5d9de6d84b3",
|
||||
"sha_match": true
|
||||
}
|
||||
]
|
||||
}
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"submitted": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"main_reference": "51e8657bfbe24856186cc6530358c5459cf909b6",
|
||||
"reference_only_not_product_edits": true,
|
||||
"registered_base_unchanged": "1a5abc65163097d4b36a060d68f58c92093eb4e9",
|
||||
"all4_current_main_files": [
|
||||
{
|
||||
"path": "scenes/main/main.gd",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/scenes/main/main.gd.source.txt",
|
||||
"sha256": "92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a",
|
||||
"main_blob": "fff37f082d750bb91c71f2aa54d168c9e2cb8fe7"
|
||||
},
|
||||
{
|
||||
"path": "scenes/main/world_preview.gd",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/scenes/main/world_preview.gd.source.txt",
|
||||
"sha256": "4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2",
|
||||
"main_blob": "fa32fe0344d20565b6d542da1256a94e8dee1845"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"sha256": "6900df6014431ff160c0d18b0dfa65ef0a3fa78eaa08922eaa96de18d5b9fd8c",
|
||||
"main_blob": "2eecb803f5eb6774ff38cd353de1f02847aeb0f9"
|
||||
},
|
||||
{
|
||||
"path": "tools/regression/suite-policy.json",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-current-main-reference-20261017/main-source/tools/regression/suite-policy.json",
|
||||
"sha256": "7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f",
|
||||
"main_blob": "ad194ae425fb8123fa191ed3635f404c098f692d"
|
||||
}
|
||||
],
|
||||
"instruction": "Root reference snapshots in allowed docs only. Do not copy arbitrary other current-main source or merge whole main into original-base worker; this would violate unchanged contract scope. Resolve all4 targeted content conflicts preserving source behavior from both branches, then Root builds exact combined current-main test composition. No product values/acceptance weakened.",
|
||||
"non_importing_reference_extensions": "Godot source snapshots are stored as .gd.source.txt to prevent duplicate class registration in later Godot imports; full source bytes and SHA pins unchanged."
|
||||
}
|
||||
-3777
File diff suppressed because it is too large
Load Diff
-3202
File diff suppressed because it is too large
Load Diff
-2232
File diff suppressed because it is too large
Load Diff
-466
@@ -1,466 +0,0 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"suite_policies": {
|
||||
"tests/s4/test_original_relationship_model.gd": {
|
||||
"source_sha256": "c74b243dbbb54dba9bbc165e29508cca910f0beb63e32d25ebbb8ea606dccce9",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/s4/test_original_relationship_runtime.gd": {
|
||||
"source_sha256": "c56bdb99dd43a4e7ceb3ca2861e8db39972c5c4e805126a77e2f7da32ca5bdc9",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_selection_departure.gd": {
|
||||
"source_sha256": "3137f36f547514f25ce6ac775fa7a5141d12f83ca4b95da0be45fecfafe9d9b4",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": ["single"],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_anri_recruitment.gd": {
|
||||
"source_sha256": "74cfaf73ed01769c49498e5395fda009b70f2f6667f4f902abf4697f01f87962",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_event_log_ui.gd": {
|
||||
"source_sha256": "9b1d7cb112790bb58969338ab1dc0bbe2a1c26b4307c4bfcd37491cf950c557b",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_amelia_donations.gd": {
|
||||
"source_sha256": "1bd622a3d88374f01e3d8885a84a816572ed296928f6ce7e3f8134ab15f60793",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_fine_cleaning_effect.gd": {
|
||||
"source_sha256": "7c7df0bac1c072ed4423140e8afe431952ec2a47f76df7dbc24cab62283cae06",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/supply/test_normal_auto_purchase_chain.gd": {
|
||||
"source_sha256": "6916d644620c49a09ab110d98fe07477bb5bb9f96da3826a0be962610cc55256",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/supply/test_normal_supply_chain.gd": {
|
||||
"source_sha256": "eedbb301e68285bbd6f701cf7eec15537f116944115807e0d9133a4c2970bb1d",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_approved_free_unique_arrears_ui.gd": {
|
||||
"source_sha256": "ff684e2f227896c1b5df6026f130d45f4289fc6cae40989be51ddc95b2cf135b",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_business_management.gd": {
|
||||
"source_sha256": "2c76697f9a911e9dded63ebbbc2b82ee9e616777c50a637eebd91dc4932f85a5",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_chapel_gameplay.gd": {
|
||||
"source_sha256": "e1996d6bd6caf46bae7becf1de2514e91a6168a686e83563b00803ac71109735",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_cleaning_gameplay.gd": {
|
||||
"source_sha256": "38593cd17829611dd34561ec46a0d746492a6cffebc35a659d49fe69de4234ac",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_dashboard_coalescing.gd": {
|
||||
"source_sha256": "2f4bd8e9d43911067a7e82864454f6779ae92acc48e0b8d4932e5d963e0430ec",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_defense_management.gd": {
|
||||
"source_sha256": "e7debf5746e1ad5976b1afb1d2471c1c2317bcc406ed2716a2368bd4e06e0235",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_dimension_migration_ui.gd": {
|
||||
"source_sha256": "0f0cec88ea8bf5fccdcd5ade02fab70b7dc71135132048cd10db17ad9d964c0d",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_elevator_management.gd": {
|
||||
"source_sha256": "dff2d3f2a1cea84224aee8f70c4ad53d731df173bc7d16d7ec012c0d16c62e11",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_first_operating_day.gd": {
|
||||
"source_sha256": "fcba5cee4ea7b16340871d98634cef56d80ca2197b1b069d47ae6cf287693226",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_guest_decision_log.gd": {
|
||||
"source_sha256": "8532defab87c075ad3196b44af030cdab785abed365e25d5a56d2d42f115cf71",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_guest_observation.gd": {
|
||||
"source_sha256": "8f5af3d6ef367512b34d0cf35fd8c1d2848d020419dddfa234120206dbe4f6e4",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_layer_skin.gd": {
|
||||
"source_sha256": "aab6f0561e222f88681169a82b47631320495df4c359bcf79d2fb228c60ad83b",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"front-owner",
|
||||
"back-owner"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_main_audio_feedback.gd": {
|
||||
"source_sha256": "9bc9e13ef3498941b6e8566c0b7666c42e294b63e18ec0da2cfa1cda3e4617bd",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_main_dashboard.gd": {
|
||||
"source_sha256": "fa9ee0c4b9aee00a2be6d05a9dab7c0c3e8b0beb2b944257de1dc308bfc3cc20",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_original_build_pointer.gd": {
|
||||
"source_sha256": "a04a79c5e766659d10c4564d1f11c6554a27cb8af71431295e10bc4967012913",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_original_facility_controls.gd": {
|
||||
"source_sha256": "294b39808d3454f96555b981c8f822f17e1248afa803f7c0da74c35799ae55a1",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_rank_pointer.gd": {
|
||||
"source_sha256": "2c51510f80fb57068c6c06aa56566936685e679720b0fd853d8f814566e730f2",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_selection_autosave.gd": {
|
||||
"source_sha256": "1d7d267ef171041f77241c4c2f1a1bb55a46253f803d5c496507e934bc8fa815",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_selection_lifecycle.gd": {
|
||||
"source_sha256": "ed68b120f422e1b37b8cf0654b6d6605458fe01c7e5d84decc3ba6f4e9366c47",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"transition",
|
||||
"finish"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_staff_management.gd": {
|
||||
"source_sha256": "7e37dc47583325a564ef48de31596adeeccfb7151ac5fce952efc6873c8ab704",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"restored-transition",
|
||||
"finish"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_staff_rescue.gd": {
|
||||
"source_sha256": "928179383bda38adf9211065b644a37bed3f8128be42b7e7a0fba9a505a40b9e",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_staff_rest.gd": {
|
||||
"source_sha256": "712f2c30ec89da20835e54f2e83b22a358cc6fc05555147ce635ec2592ef75b5",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_stair_transport_details.gd": {
|
||||
"source_sha256": "3abd3655eecbefe1b7cd49e1b16c42f8161c86f20380c298ec6367b42d31555f",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_supply_auto_purchase_ui.gd": {
|
||||
"source_sha256": "ad3788ae4b3f17918be67cf06c4162635da1ecba1ee0a0465d10acc019f3e3ae",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_supply_management.gd": {
|
||||
"source_sha256": "ee96be8b31eb71e84ab813e427a28bcfb76de4a057bd964584a6a497382ea716",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": true,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_ui_audio_feedback.gd": {
|
||||
"source_sha256": "62c5c8080b1a05d243977a293a23ab216ef71de38fe46ca6b31c71e0af4555fe",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": true
|
||||
},
|
||||
"tests/ui/test_ui_presentation_audio_contract.gd": {
|
||||
"source_sha256": "9769b89b61630ddf2ef13a927f329ddaa30e04da77987e7a868d0490244d6a25",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"before-remount",
|
||||
"final"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_upkeep_closed_ui.gd": {
|
||||
"source_sha256": "915db12e539d98bfcb2cfc3712693ca7fca3ff459aaacba419faff04ac712868",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_upkeep_inspector.gd": {
|
||||
"source_sha256": "99895a24bcddc4c2e01d8960a2fd7eba05be237a64700d78879c68c1a0660f34",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_world_tree_rank.gd": {
|
||||
"source_sha256": "8e108e3ae63d1ee3971c7b236f50a673c407835f094de0d38a736c38261767aa",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_runtime_upkeep.gd": {
|
||||
"source_sha256": "eae48823d58d78c419d29728e33a5559fbe5131b49e33d04ca4e6fa3a721c29b",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/transport/test_runtime_transport_comparison.gd": {
|
||||
"source_sha256": "ba577397fa8db5a6cf92cfd398dd7a5ece49e6b59856f14772b67b51ddc0bde9",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/transport/test_transport_comparison.gd": {
|
||||
"source_sha256": "7e80e9ef80500278c56f0d1ada5c911f43e3c0a9bc370045fdbebd33c2f02fd5",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/supply/test_mimi_purchase_quote.gd": {
|
||||
"source_sha256": "01f7760cf0fed33fda6358bd407fc1441a198dce9f2713e49bfcc097ee8c8ada",
|
||||
"ordinary_cleanup_prepared": false,
|
||||
"ordinary_control_labels": [],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false,
|
||||
"standalone_ownership": {
|
||||
"Main_instantiated": false,
|
||||
"configure_audio_called": false,
|
||||
"UIAudio_owner_registered": false,
|
||||
"actual_parent": "SceneTree.root",
|
||||
"owned_supply_panel": "configure(runtime) then add_child; queue_free + await process_frame + is_instance_valid rejection",
|
||||
"autoload_Runtime_Economy_lifetime": "native strict diagnostics and whole profile capture remain mandatory; leak outcome unmeasured",
|
||||
"normal_human_viewport_or_OS": false
|
||||
},
|
||||
"source_only_ownership_review": true
|
||||
},
|
||||
"tests/transport/test_runtime_transport.gd": {
|
||||
"source_sha256": "ec6f8fa8e8f2a76a6f6214b4ee84861aba1bb13845a342c5126905b01f428a15",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_actor_selection.gd": {
|
||||
"source_sha256": "f37a0f4805adce4b538fccde1404c1a417f20639fddf36947f076d88409ba0a3",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"before-remount",
|
||||
"final"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/mvp/test_pending_service_pricing_report.gd": {
|
||||
"source_sha256": "50095c41fe76bac7bd9346ce97651d40610fa69b48c3b24f7acc5b371578e753",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
},
|
||||
"tests/ui/test_p08_normal_placement_ops.gd": {
|
||||
"source_sha256": "d3c246d34f8fd66f6ed237e42a86df89ebaf481bc9dee143b4de8d654ce0eb2e",
|
||||
"ordinary_cleanup_prepared": true,
|
||||
"ordinary_control_labels": [
|
||||
"single"
|
||||
],
|
||||
"old_bounded_teardown": false,
|
||||
"new_audio_QA": false
|
||||
}
|
||||
},
|
||||
"outside_routes": {
|
||||
"tests/supply/test_normal_auto_purchase_chain.gd": {
|
||||
"env": "THE_TREE_SUPPLY_EVIDENCE_DIR",
|
||||
"filename": "normal-play-report.json",
|
||||
"stdout_prefix": "NORMAL_AUTO_PURCHASE_REPORT ",
|
||||
"stdout_projection": "subset",
|
||||
"report_owner_source_sha256": "6916d644620c49a09ab110d98fe07477bb5bb9f96da3826a0be962610cc55256"
|
||||
},
|
||||
"tests/supply/test_normal_supply_chain.gd": {
|
||||
"env": "THE_TREE_SUPPLY_EVIDENCE_DIR",
|
||||
"filename": "normal-play-report.json",
|
||||
"stdout_prefix": "NORMAL_SUPPLY_REPORT ",
|
||||
"stdout_projection": "subset",
|
||||
"report_owner_source_sha256": "eedbb301e68285bbd6f701cf7eec15537f116944115807e0d9133a4c2970bb1d"
|
||||
},
|
||||
"tests/ui/test_first_operating_day.gd": {
|
||||
"env": "THE_TREE_FIRST_OPERATING_EVIDENCE_DIR",
|
||||
"filename": "operating-report.json",
|
||||
"stdout_prefix": "FIRST_OPERATING_DAY_REPORT ",
|
||||
"stdout_projection": "full",
|
||||
"report_owner_source_sha256": "fcba5cee4ea7b16340871d98634cef56d80ca2197b1b069d47ae6cf287693226"
|
||||
},
|
||||
"tests/ui/test_selection_autosave.gd": {
|
||||
"env": "THE_TREE_FIRST_OPERATING_EVIDENCE_DIR",
|
||||
"filename": "operating-report.json",
|
||||
"stdout_prefix": "FIRST_OPERATING_DAY_REPORT ",
|
||||
"stdout_projection": "full",
|
||||
"inherited_source": "tests/ui/test_first_operating_day.gd",
|
||||
"report_owner_source_sha256": "fcba5cee4ea7b16340871d98634cef56d80ca2197b1b069d47ae6cf287693226"
|
||||
}
|
||||
},
|
||||
"fixed_generated_report_routes": {
|
||||
"tests/mvp/test_runtime_upkeep.gd": [
|
||||
"artifacts/upkeep-2026-09-29/preclose-snapshot.txt",
|
||||
"artifacts/upkeep-2026-09-29/closed-snapshot.txt"
|
||||
],
|
||||
"tests/transport/test_runtime_transport_comparison.gd": [
|
||||
"artifacts/transport/runtime-comparison.json",
|
||||
"artifacts/transport/runtime-comparison-1-trace.json",
|
||||
"artifacts/transport/runtime-comparison-2-trace.json"
|
||||
],
|
||||
"tests/transport/test_transport_comparison.gd": [
|
||||
"artifacts/transport/path-comparison.json",
|
||||
"artifacts/transport/comparison-demand.json"
|
||||
]
|
||||
},
|
||||
"scope": "observed source/proof/IO contracts; no new gameplay assertions"
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"actual_main": "54cade4181f6c3c4f5701ba54ac5fcbeca695945",
|
||||
"exact4_main_blobs": [
|
||||
{
|
||||
"path": "scenes/main/main.gd",
|
||||
"actual_main_blob": "fff37f082d750bb91c71f2aa54d168c9e2cb8fe7",
|
||||
"equals_already_reconciled_reference_blob": true
|
||||
},
|
||||
{
|
||||
"path": "scenes/main/world_preview.gd",
|
||||
"actual_main_blob": "fa32fe0344d20565b6d542da1256a94e8dee1845",
|
||||
"equals_already_reconciled_reference_blob": true
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"actual_main_blob": "2eecb803f5eb6774ff38cd353de1f02847aeb0f9",
|
||||
"equals_already_reconciled_reference_blob": true
|
||||
},
|
||||
{
|
||||
"path": "tools/regression/suite-policy.json",
|
||||
"actual_main_blob": "ad194ae425fb8123fa191ed3635f404c098f692d",
|
||||
"equals_already_reconciled_reference_blob": true
|
||||
}
|
||||
],
|
||||
"reason": "M54 is docs-only after original M51 reference; all four conflict-input blobs are genuinely identical. Future M changing any conflict-input blob needs new reconciliation proof, not automatic old-S overwrite."
|
||||
}
|
||||
-40
@@ -1,40 +0,0 @@
|
||||
{
|
||||
"source": "bd3a13405115fc9bf6c5acec55bcfef7dd15266a",
|
||||
"main": "54cade4181f6c3c4f5701ba54ac5fcbeca695945",
|
||||
"all_files_complete": true,
|
||||
"file_or_byte_cap": null,
|
||||
"reference_only_not_executable_snapshot_imports": true,
|
||||
"files": [
|
||||
{
|
||||
"path": "tools/check_p23_life_observation_evidence.py",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair5-context-20261017/main-reference/tools/check_p23_life_observation_evidence.py.source.txt",
|
||||
"sha256": "e41479ae51bccdfab3f31bd348794b441c2f341179bbe33222e2aacdf88f987f",
|
||||
"git_blob": "8a62d1e1070688ced445e48d49b831fc7e9cfea3"
|
||||
},
|
||||
{
|
||||
"path": "tools/run_p23_life_observation.py",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair5-context-20261017/main-reference/tools/run_p23_life_observation.py.source.txt",
|
||||
"sha256": "8dbd90e22f47912b3381b514398fe1fb2c403c97d8e3d0dd675e9c8db5b5d0d1",
|
||||
"git_blob": "0a255140d48e3cf194c1644948a0f1e1dc89a3ca"
|
||||
},
|
||||
{
|
||||
"path": "tools/run_all_tests.py",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair5-context-20261017/main-reference/tools/run_all_tests.py.source.txt",
|
||||
"sha256": "320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4",
|
||||
"git_blob": "502ad8c1f6ba371446ecfd8f37f0f9194cdb10ea"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair4-20261017/actual-limited-review/result.json",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair5-context-20261017/main-reference/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair4-20261017/actual-limited-review/result.json",
|
||||
"sha256": "ef17de03039bcd2b3d7a2851d26c0abdc163b32fef40048d933a693f1b49114f",
|
||||
"git_blob": "fec14229d322f4cbe9e27f2e02eb08f0e89bef31"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair4-20261017/CURRENT_ACCEPTANCE_AND_NEXT_BATCH.json",
|
||||
"reference_path": "docs/plans/original-completion-2026-10-02/execution/p24-02/root-repair5-context-20261017/main-reference/docs/plans/original-completion-2026-10-02/execution/p24-02/source-ready-repair4-20261017/CURRENT_ACCEPTANCE_AND_NEXT_BATCH.json",
|
||||
"sha256": "9c7892ce6ccd26d997e7a609be29ef8a12acb2fb7df75cf4def6f11a8a9157dc",
|
||||
"git_blob": "7a35430785c15b510dfe107c03807bf5c75951ba"
|
||||
}
|
||||
],
|
||||
"instruction": "P23 helper code is reference only; preserve exact generic Git/source provenance where applicable, do not copy P23 marker/acceptance identities as P24 evidence or import missing modules into old-base S."
|
||||
}
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
# Root operational facts for repair5
|
||||
|
||||
Actual source bd3a134, actual Main54cade4. The4conflict main blobs equal the original M51 snapshots, verified by Git and recorded in CURRENT_MAIN_RECONCILIATION_APPLICABILITY.json. Bind this reconciliation input provenance: a later M changing any of these4blobs must not silently reuse an old-S resolution and drop new Main code. Docs-only M updates may be applicable by exact relevant blob identity, with fresh genuine Q/M roles; do not relabel oldQ. Additional negative: newQ with currentM as parent but stale conflict S blobs dropping changed M hunk must fail against the reconciled-input binding.
|
||||
|
||||
Spec/source/marker/settings/fixture pins are Git file blobs. The engine executable is external and cannot have a Git blob ID; use a separately verified external engine fingerprint/actual started+ended runtime receipt binding and explicit same engine across actual inputs. Do not invent a path or require an external binary to be a repository blob. Source-only tests may use labelled TEST-ONLY data; no real index or acceptance is created. Actual Root capture will supply real engine path/SHA/version and OS platform. Existing P23 receipts are format references only, never P24 actual execution.
|
||||
|
||||
If adding a native UI test changes tests/ui/test_operations_notification.gd source, update only its own marker/policy source-authority SHA fields to the actual new test source after verifying unchanged marker schema/cleanup semantics. Keep all non-P24 entries and all existing safety rules. Do not leave a stale source pin, and do not lower marker expectations. The original registered scope already allows the two JSON files. Adjust local preservation/input checks for this explicit new-source SHA rebind; never claim unchanged old SHA.
|
||||
|
||||
Do not edit NEXT_CLOSURE.md or other Main progress/shared Root reference files; Main54 changed them and doing so adds unrelated merge conflicts. New status/docs/helpers/tests belong under source-ready-repair5-20261017 or another specifically directed p24-02 owned subdir. Keep renderer world_preview.gd unchanged unless Opus explicitly instructs a necessary fix. The new modal visibility callback is functional correctness, not a visual redesign.
|
||||
|
||||
Root bridge owns prelaunch HEAD/no competing worker/quota checks and exclusive lease. A restricted worker must not ps or search user folders. Task-local TMPPREFIX and PYTHONPYCACHEPREFIX are ordinary environment routing within already writable allocation; both solved real default temp/cache failures in the identical sandbox. No policy, permission, security or billing changes. Root can set these before the actual model process so every shell receives correct defaults. Native/Godot/OS/full executions remain Root-owned and not worker actions.
|
||||
-99
@@ -1,99 +0,0 @@
|
||||
{
|
||||
"plan_id": "P24-02",
|
||||
"unit_state": "in_progress",
|
||||
"runner_state": "submitted",
|
||||
"submitted_sha": "bd3a13405115fc9bf6c5acec55bcfef7dd15266a",
|
||||
"source_backup_remote_branch": "codex/p24-02-source-bd3a134",
|
||||
"same_existing_task": "the-tree-p24-02-operations/P24-02",
|
||||
"repair_count": 4,
|
||||
"max_repair_attempts": null,
|
||||
"actual_roles": "Opus5.5 commander; existing Antigravity IDE Opus5.5Medium GUI partial4file merge, then verified terminal quota; Opus-authorized Codex6.1-sol same-task nonUI continuation, no duplicateworker/registration/counterreset",
|
||||
"static_readiness": {
|
||||
"actual_compile_pass": true,
|
||||
"actual_preservation_pass": true,
|
||||
"actual_diff_check_pass": true,
|
||||
"meaningful_local_tests": 9,
|
||||
"local_tests_reused_only_with_3_input_hashes_and_actual_raw_exit0": true,
|
||||
"actual_source_and_JSON_move_guards_pass": true
|
||||
},
|
||||
"limited_independent_review": {
|
||||
"actual_Opus_run": "95cffd7b552a4939a4252349b3dfcfbd",
|
||||
"status": "pass",
|
||||
"critical_high_medium": 0,
|
||||
"low": 5,
|
||||
"original_unit_acceptance_ids": [],
|
||||
"scope": "Static source readiness only; not Core whole-unit review evidence."
|
||||
},
|
||||
"prepared_real_composition": {
|
||||
"scope": "Prospective real Git composed source, not a normal integration candidate or runtime evidence. Actual failed merge and stage1/2/3 are preserved; Root resolved only4 known conflicts by taking exact already-reconciled S blobs.",
|
||||
"submitted_sha": "bd3a13405115fc9bf6c5acec55bcfef7dd15266a",
|
||||
"main_context_sha": "51e8657bfbe24856186cc6530358c5459cf909b6",
|
||||
"prepared_tree": "a0667b90d13bd3ae8d8b8bdbc580192c2f90622f",
|
||||
"prepared_commit": "4bf9a1b80e1491d138954d218720b4bf6298d32a",
|
||||
"prepared_worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-root-composed-bd3a134-r01",
|
||||
"actual_parents": [
|
||||
"51e8657bfbe24856186cc6530358c5459cf909b6",
|
||||
"bd3a13405115fc9bf6c5acec55bcfef7dd15266a"
|
||||
],
|
||||
"actual_conflict_resolution_bindings": [
|
||||
{
|
||||
"path": "scenes/main/main.gd",
|
||||
"resolved_actual_sha256": "f71f8c15493d6b51002ee4afb41cc349efe77e860944c1f79a5b24f928ecbd24",
|
||||
"actual_S_blob": "a3bba86dd156437ce6b802bcb49597cb94a45312",
|
||||
"authority": "Exact submitted S content with actual static body/symbol/order preservation proofs; Root resolved index only, no authored source edits"
|
||||
},
|
||||
{
|
||||
"path": "scenes/main/world_preview.gd",
|
||||
"resolved_actual_sha256": "8c2daa9e95d56e6e40bb2071b206693069cb7e4731b4d660d59d41c34cb43dfa",
|
||||
"actual_S_blob": "26dd8d785f37f6c9142c80b7deaf8daecb0cebe6",
|
||||
"authority": "Exact submitted S content with actual static body/symbol/order preservation proofs; Root resolved index only, no authored source edits"
|
||||
},
|
||||
{
|
||||
"path": "tools/regression/suite-policy.json",
|
||||
"resolved_actual_sha256": "adc2fbac2463bfdb047bede0182c66083996b75d2bd542a3b8640672d7ca2400",
|
||||
"actual_S_blob": "de0ab07c83c144a6c469cfdcf52ad8bd6c0bd6fa",
|
||||
"authority": "Exact submitted S content with actual static body/symbol/order preservation proofs; Root resolved index only, no authored source edits"
|
||||
},
|
||||
{
|
||||
"path": "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
|
||||
"resolved_actual_sha256": "1063e578eefe6da1b38c24f4c004669bcac67a21884636fb1b9c7e96e4ecf388",
|
||||
"actual_S_blob": "68b8dc8324b7928164bddbcbb1dbb49fbeb25f89",
|
||||
"authority": "Exact submitted S content with actual static body/symbol/order preservation proofs; Root resolved index only, no authored source edits"
|
||||
}
|
||||
],
|
||||
"selected_source_files": 1368,
|
||||
"required_roster_size_NOT_EXECUTED": 180,
|
||||
"all_git_blob_bindings": 4835,
|
||||
"source_maps": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/.runtime/coordinator-resume-20261017-r01/prepared-bd3a134-source-maps",
|
||||
"historical_EOF_lint": {
|
||||
"exit_code": 2,
|
||||
"output": "docs/plans/original-completion-2026-10-02/execution/p24-02/ROOT_CODE_PHASE_PRELAUNCH_PROOF/original-GUI-copy/scenes/main/main.gd.source.txt:3319: new blank line at EOF.\nscenes/main/main.gd:3319: new blank line at EOF.\nscripts/ui/manual_save_slots_dialog.gd:219: new blank line at EOF.\n",
|
||||
"disposition": "Extra blank EOF lines inherited in actual source and exact preservation copy; retained byte-identically. Recorded source-style observations only, not an invented runtime/spec requirement and not claimed clean lint. Local repair4 actual delta git-diff-check passed. Not product behavior or a conflict marker."
|
||||
},
|
||||
"native_runs": 0,
|
||||
"full_runs": 0,
|
||||
"all8_original_P24_accepted": false,
|
||||
"normal_integration_candidate": false,
|
||||
"production_main_unchanged": true,
|
||||
"original_completed_units": 14,
|
||||
"at_jst": "2026-10-17T14:10:32.615822+09:00"
|
||||
},
|
||||
"first_next_required_batch": [
|
||||
"Implement strict same-root actual Git S/M/T/Q composition/source/input/roster binding, including deterministic4conflict resolution, using existing P23/shared helpers without relabeling tests.",
|
||||
"Replace artifact-ID count proxy with actual condition/provenance/content correspondence; one all-keys JSON plus irrelevant fillers must fail; genuine shared raw traces may be reused only with concrete scope bindings.",
|
||||
"Cover actual staff-panel click equivalent (direct handler call is not OS mapclick), defense modal visibility guard, actual bubble render/state transitions; investigate heart semantics/multiple-link order and per-frame relation scans without inventing gameplay thresholds.",
|
||||
"Treat preservation body-line set weakness and always-written evidence flag as recorded low hardening; do not claim stronger automatic proof than provided and preserve independent manual inspection scope.",
|
||||
"Batch required related fixes then actual import/local/impact, actual normalOS/scale/save evidence, exact final full once, whole8 formal independent review, normalintegration/final/ledger; Windows-specific conditions remain genuine actual-device requirements."
|
||||
],
|
||||
"all8_original_conditions_accepted": false,
|
||||
"new_native_runs": 0,
|
||||
"new_full_roster_runs": 0,
|
||||
"original_denominator": {
|
||||
"packages": 30,
|
||||
"units": 88,
|
||||
"completed": 14,
|
||||
"partial_credit": false
|
||||
},
|
||||
"no_source_code_adoption_on_main": true,
|
||||
"at_jst": "2026-10-17T14:21:51.543429+09:00"
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
{
|
||||
"task_id": "P24-02",
|
||||
"commit": "bd3a13405115fc9bf6c5acec55bcfef7dd15266a",
|
||||
"status": "pass",
|
||||
"summary": "Limited independent static review of the Q checkout (S=bd3a134 blobs composed onto M=51e8657). I used Read/Grep/Glob only and ran nothing. This is static source-readiness only: none of the 8 original P24 conditions is accepted, no acceptance_ids are added, and nothing here counts as Godot, native, OS, full-roster, Windows or whole-unit review evidence.\n\n(1) Reconciled files. world_preview.gd keeps the P23 LifeOverlay pipeline: _draw_contents/_build_life_observation, the overlay pass/serial report, the actor_drawings rows, aggregation and hidden filtering, and the cabin passengers. The single new adapter, _draw_actor_bubble(row, canvas), only reads state. It skips riding rows, looks up live Staff/Guest through get_staff/get_guest and RelationshipState through get_relationships, and never writes the observation or its rows. _draw_unit_bubble's fitted-row origin at+(-1p,-15p) works out to exactly P24's old center+(-9p, h/2-3wp-32p), so geometry, glyphs and colours are unchanged; only the target canvas is different. The 10 'reexpressed' _draw_actors lines are covered by main's _observe_actors/_draw_actors; staff queue placement survives at world_preview.gd:1433. The P24 additions in main.gd (modal guard, domain-event stream bind/unbind, cut-in, camera controls, click handler) match the GUI-copy bytes. Both JSON files are main's entries plus the P24 row/key appended at the end. No new production values were found.\n\n(2) check_p24_operations_evidence.py. The real HEAD now comes from git, and CANDIDATE_COMMIT/TARGET_HEAD are cross-checks only; git failure or a mismatch gives an empty result. The required suite set is loaded from the shared run_all_tests.roster. Suite sets must match exactly. Unknown or duplicate rows and non-dict rows are rejected, and every row needs a valid SHA that matches the file on disk, failures as an int equal to 0 (bool rejected), and passed=True. Optional counts must match exactly when present. The raw diff shows both old count-bypass `pass` branches removed, and the OS, receipt, PID, condition and Windows guards are untouched. The 9 stdlib tests include real positive controls (roster with and without counts, HEAD in a throwaway git repo) and meaningful negatives (invented replacement, duplicate padding, unknown extra rows, failures/passed type variants, SHA variants, malformed rows and counts, env mismatch, git unavailable).\n\n(3) check_repair4_preservation.py. It compares scope-qualified symbols across base, P24, main and the reconciled file, plus body lines per symbol, flags P24 edits to symbols main removed, and does a strict 3-way JSON comparison by value and order with duplicate-key detection. The METRIC_IDS regex fix correctly reads the assigned array past the Array[StringName] annotation. The bubble schema checks are pinned to M.\n\n(4) Docs. SOURCE_READY/NOTRUN status for all 8 conditions, the earlier failed py_compile and JSON-order runs, the GUI quota stop and the stale 179 run are all recorded honestly. The Root S/M/T/Q composition contract is still listed as an unresolved prerequisite, not as passed.\n\nI found no critical, high or medium defects. The low findings below are hardening items for the later required phases, which all remain mandatory: Root composition contract, import/impact, normal OS, exact final full roster, whole-8 independent review, normal integration and Windows.",
|
||||
"acceptance_ids": [],
|
||||
"findings": [
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "scenes/main/main.gd:985-987 connects world_preview.staff_assignment_clicked to assign_staff_by_click, but nothing in world_preview.gd emits that signal (it is only declared at world_preview.gd:6; _gui_input never emits it). This was already the case in P24 (no P24 _gui_input lines were lost) and is not a repair4 regression. A non-drag alternative already exists through the staff panel's facility_option and apply_button, so this is dead wiring rather than a missing feature. However, tests/ui/test_operations_notification.gd:110 calls assign_staff_by_click directly, so click_alternatives evidence must not treat that direct call as a real map-click path. Either emit the signal from the facility-click branch (respecting modal_input_blocked) or remove the connection."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "main.gd:3259 _update_modal_input_guard includes defense_manager in its dialog list, but _ensure_defense_manager (main.gd:3063-3089) never connects defense_manager.visibility_changed to the guard, unlike the other six dialogs. Opening or closing the defense dialog alone does not update world_preview.modal_input_blocked. AcceptDialog's exclusive default probably masks this, but modal_and_pause_resume runtime evidence should cover it or the connection should be added."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "check_repair4_preservation.py compares function bodies as sets of stripped lines (lines 176-203), so it cannot detect reordered statements or a dropped copy of a repeated line (for example a duplicate return/queue_redraw). REPAIR4_REEXPRESSED_P24_LINES also allows every lost P24 line in the two listed functions, not just specific lines. I checked the 19 enumerated lines by hand and they are legitimately re-expressed, but the guard is weaker than an ordered/multiset body check. Also, --write-evidence is parsed but has no effect: evidence is always written. This is documented in the status file."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "check_p24_operations_evidence.py: get_actual_git_head() resolves the repo from the checker's own location (parents[1]), while the roster, source_hashes and suite SHA checks use the current working directory (Path('.')). If it is run from another checkout, HEAD and source evidence come from different trees. The existing 'distinct artifacts' guard (lines 716-722) only counts IDs: one artifact containing every condition's keys plus 7 hash-valid filler artifacts would pass, because each condition needs only one artifact to validate. Neither problem is new to repair4 or a weakened guard, but both should be closed in the Root S/M/T/Q composition contract before the real index verify-only run."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"message": "Bubble coverage and semantics (already marked NOTRUN, recorded so they are not lost): (a) no local test exercises the new _draw_actor_bubble/_draw_unit_bubble render path; tests only call OperationFeedback.resolve_*_bubble. (b) _staff_relationship/_guest_relationship return the first RelationshipState involving the actor, so with several relationships the heart bubble depends on iteration order. (c) The inherited heart rule 'shield>0 or affection>0 or route-lock pending/locked' needs whole-8 review against 'no invented thresholds'. (d) Each frame scans every relationship for every drawn actor."
|
||||
}
|
||||
]
|
||||
}
|
||||
-2503
File diff suppressed because it is too large
Load Diff
-311
@@ -1,311 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Exact standard suites in one private source copy, with owned native evidence.
|
||||
|
||||
Completion schemas and test bodies are unchanged. Import and every script start
|
||||
in a fresh private startup profile before Godot creates logs/recovery locks;
|
||||
the unchanged Guard then selects a separate fresh runtime profile.
|
||||
"""
|
||||
import argparse, hashlib, importlib.util, json, os, re, shutil, subprocess, sys, time, uuid
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
sys.dont_write_bytecode = True
|
||||
HERE = Path(__file__).resolve().parent
|
||||
SUPPORT = HERE / 'regression'
|
||||
MIN_SPACE = 300 * 1024 * 1024
|
||||
|
||||
def module(name, path):
|
||||
spec = importlib.util.spec_from_file_location(name, path)
|
||||
value = importlib.util.module_from_spec(spec); spec.loader.exec_module(value); return value
|
||||
def sha(path): return hashlib.sha256(Path(path).read_bytes()).hexdigest()
|
||||
def read(path): return json.loads(Path(path).read_bytes())
|
||||
def require(ok, reason):
|
||||
if not ok: raise AssertionError(reason)
|
||||
def write(path, value):
|
||||
with Path(path).open('x', encoding='utf-8') as stream:
|
||||
stream.write(json.dumps(value, ensure_ascii=False, indent=2) + '\n')
|
||||
def now(): return datetime.now(timezone.utc).isoformat()
|
||||
def roster(root):
|
||||
return ['tests/run_tests.gd'] + sorted(str(p.relative_to(root)) for p in (root/'tests').rglob('test*.gd')
|
||||
if 'export' not in p.relative_to(root).parts and str(p.relative_to(root)) != 'tests/s0/test_kernel_and_save.gd')
|
||||
def inventory(base, stage=False):
|
||||
base = Path(base); result = {}
|
||||
if not base.exists(): return result
|
||||
require(base.is_dir() and not base.is_symlink(), 'ordinary inventory directory')
|
||||
for p in sorted(base.rglob('*')):
|
||||
rel = p.relative_to(base)
|
||||
if stage and '.godot' in rel.parts: continue
|
||||
require(not p.is_symlink(), 'symlink is not an ordinary source/proof/profile')
|
||||
if p.is_file(): result[rel.as_posix()] = {'bytes': p.stat().st_size, 'sha256': sha(p)}
|
||||
return result
|
||||
def source_refs(root):
|
||||
paths = [p for folder in ('autoload','scripts','scenes','data','tests','assets','tools')
|
||||
for p in (root/folder).rglob('*') if p.is_file() and p.name != '.DS_Store' and '__pycache__' not in p.parts]
|
||||
paths += [root/p for p in ('project.godot','export_presets.cfg','Makefile','AGENTS.md')]
|
||||
require(all(not p.is_symlink() for p in paths), 'source aliases refused')
|
||||
return {p.relative_to(root).as_posix(): {'path':str(p),'bytes':p.stat().st_size,'sha256':sha(p)} for p in sorted(paths)}
|
||||
def profile_path(name):
|
||||
require(re.fullmatch(r'TheTree-PCK-tests-[0-9a-f]{32}-[a-z0-9-]+', name) is not None, 'owned profile nonce')
|
||||
if sys.platform == 'darwin': return Path.home()/'Library/Application Support'/name
|
||||
if sys.platform.startswith('linux'): return Path(os.environ.get('XDG_DATA_HOME', str(Path.home()/'.local/share')))/name
|
||||
raise RuntimeError('profile platform requires a reviewed native runner; no Windows acceptance inference')
|
||||
def default_player(root):
|
||||
text = (root/'project.godot').read_text()
|
||||
require('config/name="The Tree"' in text and 'config/use_custom_user_dir=' not in text, 'canonical default profile source')
|
||||
if sys.platform == 'darwin': path = Path.home()/'Library/Application Support/Godot/app_userdata/The Tree'
|
||||
elif sys.platform.startswith('linux'): path = Path(os.environ.get('XDG_DATA_HOME', str(Path.home()/'.local/share')))/'godot/app_userdata/The Tree'
|
||||
else: raise RuntimeError('unreviewed default-profile platform')
|
||||
return {'path':str(path),'existed':path.exists(),'files':inventory(path),'logs_and_locks_included':True}
|
||||
def private_project(public_bytes, name):
|
||||
text = public_bytes.decode('utf-8')
|
||||
require(text.count('[application]\n\n') == 1 and 'config/use_custom_user_dir=' not in text
|
||||
and 'config/custom_user_dir_name=' not in text, 'canonical project has no private execution settings')
|
||||
addition = 'config/use_custom_user_dir=true\nconfig/custom_user_dir_name=' + json.dumps(name) + '\n'
|
||||
altered = text.replace('[application]\n\n', '[application]\n\n' + addition, 1).encode()
|
||||
require(altered.decode().replace(addition, '', 1).encode() == public_bytes, 'two private fields reverse to whole public bytes')
|
||||
return altered
|
||||
def fresh_environment(base): return {k:v for k,v in base.items() if not k.startswith('THE_TREE_')}
|
||||
def phase_policy(test, source, policies):
|
||||
value = policies.get(test, {'ordinary_cleanup_prepared':False,'ordinary_control_labels':[],
|
||||
'old_bounded_teardown':False,'new_audio_QA':False})
|
||||
if test in policies: require(value['source_sha256'] == sha(source), 'suite proof/IO policy source SHA changed')
|
||||
return dict(value, path=test, source_sha256=sha(source), candidate_source_sha256=sha(source))
|
||||
def dependency_paths(test, refs):
|
||||
"""Reviewed literal GDScript dependencies, including relative inherited QA."""
|
||||
pending=[test];seen=set()
|
||||
while pending:
|
||||
name=pending.pop()
|
||||
if name in seen:continue
|
||||
seen.add(name)
|
||||
text=Path(refs[name]['path']).read_text()
|
||||
for quoted in re.findall(r'[\"\']([^\"\']+\.gd)[\"\']',text):
|
||||
target=quoted[6:] if quoted.startswith('res://') else str(Path(name).parent/quoted)
|
||||
if target in refs and target not in seen:pending.append(target)
|
||||
return seen
|
||||
def policy_coverage(paths, refs, policy):
|
||||
for test in paths:
|
||||
dependencies=dependency_paths(test,refs);p=phase_policy(test,Path(refs[test]['path']),policy['suite_policies'])
|
||||
if 'tests/helpers/ui_audio_fixture_cleanup.gd' in dependencies:
|
||||
require(p['ordinary_cleanup_prepared'] and p['ordinary_control_labels'], 'unknown ordinary helper user requires exact reviewed policy '+test)
|
||||
if 'tests/helpers/ui_audio_teardown.gd' in dependencies:
|
||||
require(p['ordinary_cleanup_prepared'] or p['old_bounded_teardown'] or test=='tests/ui/test_ui_audio_feedback.gd', 'unknown bounded teardown user requires reviewed proof policy '+test)
|
||||
def copy_source(source,target):
|
||||
if sys.platform=='darwin':subprocess.run(['/bin/cp','-c',str(source),str(target)],check=True)
|
||||
else:shutil.copyfile(source,target)
|
||||
require(target.stat().st_ino!=Path(source).stat().st_ino or target.stat().st_dev!=Path(source).stat().st_dev,
|
||||
'private source is a separate inode; hardlinks refused')
|
||||
def profile_gate(path, report, name):
|
||||
value = read(report)
|
||||
require(value['verified'] is True and value['conditions'] == [True]*5 and value['conditions_checked'] == 5
|
||||
and value['fresh_before_parent_initialize'] is True and value['profile_writes_before_guard'] == 0
|
||||
and value['actual_user_data_dir'] == str(path) == value['expected_user_data_dir']
|
||||
and value['globalized_probe'] == str(path/'guard-probe') and value['custom_user_dir_name'] == name
|
||||
and value['project_settings_persisted'] is False, 'all five unchanged runtime Guard conditions')
|
||||
return {'report':value,'report_sha256':sha(report),'whole_files':inventory(path)}
|
||||
def process_gate(row, allowed):
|
||||
return (row.get('exit_code') == 0 and row.get('helper_exit_code') == 0 and row.get('timed_out') is False
|
||||
and row.get('error_lines') == allowed and row.get('owned_popen_ended') is True
|
||||
and row.get('old_helper_engine_ended') is True and row.get('start_receipt_written') is True
|
||||
and row.get('end_receipt_written') is True and row.get('lifecycle_error') is None
|
||||
and row.get('external_process_or_group_signals') == 0
|
||||
and row.get('adapter_owned_cleanup',{}).get('engine_ended') is True)
|
||||
def routed_report(directory, route, test, pid, raw, stage, source_sha):
|
||||
file = directory/route['filename']
|
||||
require(set(directory.iterdir()) == {file} and file.is_file() and not file.is_symlink() and file.stat().st_size>0,
|
||||
'exclusive fresh outside report file set')
|
||||
value = read(file); matches = [l[len(route['stdout_prefix']):] for l in raw.splitlines() if l.startswith(route['stdout_prefix'])]
|
||||
require(isinstance(value,dict) and value and len(matches)==1, 'whole report and unique actual stdout JSON')
|
||||
printed = json.loads(matches[0]); require(isinstance(printed,dict) and printed, 'nonempty printed report')
|
||||
require(value==printed if route['stdout_projection']=='full' else all(value.get(k)==v for k,v in printed.items()),
|
||||
'literal original report payload agreement')
|
||||
owner = route.get('inherited_source',test)
|
||||
require(sha(stage/test)==source_sha and sha(stage/owner)==route['report_owner_source_sha256'], 'actual report source provenance')
|
||||
return {'verified':True,'path':str(file),'bytes':file.stat().st_size,'sha256':sha(file),
|
||||
'actual_engine_pid':pid,'producer_test':test,'producer_source_sha256':source_sha,'report_owner_source':owner,
|
||||
'report_owner_source_sha256':sha(stage/owner),'payload_field_deletions':0,'whole_JSON':value}
|
||||
def declared_reports(stage, expected, previous, requested):
|
||||
actual = inventory(stage,stage=True)
|
||||
require(not set(requested)&(set(expected)|set(previous)), 'new reports cannot overwrite source/previous reports')
|
||||
require(set(actual)==set(expected)|set(previous)|set(requested), 'complete source/UID/generated report set')
|
||||
require({n:actual[n] for n in expected}==expected and {n:actual[n] for n in previous}==previous, 'all source and earlier report bytes exact')
|
||||
added = {n:actual[n] for n in requested}
|
||||
for name,pin in added.items():
|
||||
require(pin['bytes']>0, 'nonempty actual generated report')
|
||||
if name.endswith('.json'): read(stage/name)
|
||||
else: (stage/name).read_text()
|
||||
return added
|
||||
def totals(rows, paths):
|
||||
names=[r['test'] for r in rows]; missing=[r['test'] for r in rows if r.get('reported_checks') is None]
|
||||
remaining=[n for n in paths if n not in names]; available=sum(r.get('reported_checks') or 0 for r in rows)
|
||||
return {'actual_suites':len(rows),'missing_marker_paths':missing,'remaining_unexecuted_tests':remaining,
|
||||
'available_marker_checks':available,'actual_all_roster_checks':available if not missing and names==paths else None,
|
||||
'strict_accepted_checks':sum(r['reported_checks'] for r in rows if not r['failed'] and r.get('reported_checks') is not None)}
|
||||
|
||||
def execute_phase(engine, stage, out, phase, test, selected, expected, previous, policy, contracts, paths,
|
||||
public_project, protected_player, root, outer, markers, diagnostics, owners, audio):
|
||||
require(not outer.native.helper['live_engines'](), 'one owned native engine at a time')
|
||||
require(shutil.disk_usage(out).free>=MIN_SPACE, 'fresh phase disk admission')
|
||||
require(source_refs(root)==selected['root_before'] and default_player(root)==protected_player, 'entire current source/default profile unchanged before phase')
|
||||
require(inventory(stage,stage=True)==dict(expected,**previous), 'whole stage source/UID/report inventory before phase')
|
||||
env=fresh_environment(os.environ); startup_name='TheTree-PCK-tests-'+uuid.uuid4().hex+'-standard-startup-'+phase
|
||||
startup=profile_path(startup_name); require(not startup.exists(), 'fresh startup profile before native engine')
|
||||
write(out/(phase+'-startup-profile-before.json'), {'path':str(startup),'existed':False,'files':{},'before_native_spawn':True})
|
||||
private=private_project(public_project,startup_name); (stage/'project.godot').write_bytes(private)
|
||||
folder=out/phase; proof=None; evidence=None; runtime=None; runtime_report=None; script=None
|
||||
row={'phase':phase,'test':test,'passed':False,'failed':True,'validation_error':None,'profile_startup_name':startup_name,
|
||||
'private_project_sha256':hashlib.sha256(private).hexdigest(),'private_project_fields':2,'source_sha256':sha(stage/test) if test else None}
|
||||
try:
|
||||
if phase=='import': argv=[engine,'--headless','--path',str(stage),'--editor','--import','--quit','--verbose']
|
||||
else:
|
||||
name='TheTree-PCK-tests-'+uuid.uuid4().hex+'-standard-runtime-'+phase; runtime=profile_path(name)
|
||||
require(not runtime.exists(), 'fresh runtime profile before Guard')
|
||||
runtime_report=out/(phase+'-profile.json')
|
||||
env.update(THE_TREE_PACK_PROFILE_NAME=name,THE_TREE_PACK_PROFILE_EXPECTED=str(runtime),
|
||||
THE_TREE_PACK_PROFILE_REPORT=str(runtime_report),THE_TREE_FULL_PARSE_PATHS=str(out/'parse-paths.json'))
|
||||
if phase=='parse': script=out/'bootstrap/parse_full_dependencies.gd'
|
||||
else:
|
||||
script=out/'starters'/(phase+'.gd')
|
||||
script.write_text('extends '+json.dumps('res://'+test)+'\nconst Guard := preload('+json.dumps(str(out/'bootstrap/profile_guard.gd'))+')\nfunc _initialize() -> void:\n\tif not Guard.activate():\n\t\tquit(97)\n\t\treturn\n\tsuper._initialize()\n')
|
||||
p=phase_policy(test,stage/test,policy['suite_policies']); row['policy']=p
|
||||
route=policy['outside_routes'].get(test)
|
||||
if route:
|
||||
evidence=out/(phase+'-evidence'); evidence.mkdir(); env[route['env']]=str(evidence)
|
||||
if p['ordinary_cleanup_prepared'] or p['old_bounded_teardown'] or test=='tests/ui/test_ui_audio_feedback.gd':
|
||||
proof=out/(phase+'-teardown'); proof.mkdir()
|
||||
if p['ordinary_cleanup_prepared']:
|
||||
(proof/'owned-audio').mkdir(); env.update(THE_TREE_AUDIO_TEARDOWN_PROOF_DIR=str(proof/'owned-audio'),THE_TREE_AUDIO_FIXTURE_CONTROL_PROOF=str(proof/'control.json'))
|
||||
else: env['THE_TREE_AUDIO_TEARDOWN_PROOF_DIR']=str(proof)
|
||||
if test=='tests/ui/test_ui_audio_feedback.gd':
|
||||
audio_dir=out/(phase+'-audio-proof'); audio_dir.mkdir()
|
||||
env.update(THE_TREE_AUDIO_PROOF_REPORT=str(audio_dir/'actual-ogg-decode-player-state.json'),
|
||||
THE_TREE_AUDIO_COMMAND_PROOF_REPORT=str(audio_dir/'actual-command-result-buffer-proof.json'))
|
||||
argv=[engine,'--headless','--path',str(stage),'--script',str(script),'--verbose']
|
||||
logfile=folder/'engine-native.log'; require(logfile.is_absolute() and not logfile.exists(), 'fresh absolute native log')
|
||||
argv+=['--log-file',str(logfile)]; row.update(command=argv,logical_script='res://'+test if test else None,
|
||||
starter_sha256=sha(script) if script else None,controlled_environment={k:v for k,v in env.items() if k.startswith('THE_TREE_')})
|
||||
result,capture=outer.run_phase(argv,folder,180 if phase=='import' else selected['timeout'],env,
|
||||
now_fn=now,dump_fn=write,sha_fn=sha,live_engines_fn=outer.native.helper['live_engines'])
|
||||
row.update(native_process=result,outer_actual_capture=capture,actual_pid=result.get('pid') if result else None,
|
||||
engine_ended=capture['all_captured_ended'],exit_code=result.get('exit_code') if result else None)
|
||||
stdout=(folder/'stdout.log').read_text(); stderr=(folder/'stderr.log').read_text(); raw=stdout+stderr
|
||||
raw_file=out/(test.replace('/','__')+'.log') if test else folder/'combined-raw.log'; raw_file.write_text(raw)
|
||||
row.update(log=str(raw_file.relative_to(out)),log_sha256=sha(raw_file),raw_native_log={'path':str(logfile),'bytes':logfile.stat().st_size,'sha256':sha(logfile)})
|
||||
if test:
|
||||
parsed=markers.parse_raw(test,raw,contracts,row['source_sha256']); row.update(completion=parsed,
|
||||
reported_checks=parsed['checks'],reported_failures=parsed['failures'],completion_marker=parsed['marker'],collector_errors=parsed['errors'])
|
||||
review=diagnostics.review_streams(outer.native,{'stdout':stdout,'stderr':stderr,'native_file':logfile.read_text()},test,stage/test if test else None)
|
||||
row['finite_original_diagnostic_review']=review
|
||||
require(result and diagnostics.diagnostic_result_gate(result,review) and process_gate(result,review['allowed_e31_error_lines']) and capture['passed'], 'strict native/ownership/logger/finite diagnostics')
|
||||
if script: require(sha(script)==row['starter_sha256'], 'actual starter source remains exact')
|
||||
if runtime: row['actual_private_profile']=profile_gate(runtime,runtime_report,name)
|
||||
if phase=='parse':
|
||||
matches=re.findall(r'(?m)^FULL_DEPENDENCY_PARSE checks=([0-9]+) failures=([0-9]+)\n',raw)
|
||||
require(matches==[(str(len(paths)),'0')], 'unique actual all normal-context dependencies parsed')
|
||||
row['actual_parse_checks']=int(matches[0][0])
|
||||
if test:
|
||||
require(parsed['passed'] and sha(stage/test)==row['source_sha256'], 'exact original suite source/marker schema')
|
||||
if evidence: row['outside_report']=routed_report(evidence,route,test,row['actual_pid'],raw,stage,row['source_sha256'])
|
||||
if p['ordinary_cleanup_prepared']: row['ordinary_owner_pairs']=owners.ordinary_gate(proof,row['actual_pid'],out,p['ordinary_control_labels'])
|
||||
if p['old_bounded_teardown'] or test=='tests/ui/test_ui_audio_feedback.gd': row['old_bounded_proof']=audio.teardown_gate(proof,row['actual_pid'],out)
|
||||
if test=='tests/ui/test_ui_audio_feedback.gd':
|
||||
row['actual_command_evidence']=audio.command_gate(audio_dir/'actual-command-result-buffer-proof.json',audio_dir,row['actual_pid'])
|
||||
row['actual_ogg_evidence']=audio.ogg_gate(audio_dir/'actual-ogg-decode-player-state.json',row['actual_pid'],selected['map'])
|
||||
row['passed']=True; row['failed']=False
|
||||
except BaseException as caught: row['validation_error']=type(caught).__name__+': '+str(caught)
|
||||
finally:
|
||||
# run_phase owns cleanup before any receipts/guards. No discovered PID signals.
|
||||
(stage/'project.godot').write_bytes(public_project)
|
||||
row['whole_startup_profile_after']={'path':str(startup),'files':inventory(startup),'fresh_before_engine':True}
|
||||
if runtime is not None: row['whole_runtime_profile_after']={'path':str(runtime),'files':inventory(runtime)}
|
||||
try:
|
||||
requested=policy['fixed_generated_report_routes'].get(test,[]) if test else []
|
||||
generated=declared_reports(stage,expected,previous,requested); previous.update(generated)
|
||||
for name in generated:
|
||||
if name.endswith('-comparison.json'):
|
||||
value=read(stage/name)
|
||||
require(type(value.get('checks')) is int and value['checks']==row['reported_checks'] and value.get('failures')==0,
|
||||
'actual generated JSON report/marker agreement')
|
||||
row['generated_reports']={n:dict(pin,actual_engine_pid=row.get('actual_pid'),producer_test=test,
|
||||
producer_source_sha256=row['source_sha256'],payload_modified=False)for n,pin in generated.items()}
|
||||
row['source_sha256_end']=sha(stage/test) if test else None
|
||||
row['default_player_entire_profile_unchanged']=default_player(root)==protected_player
|
||||
require(row['default_player_entire_profile_unchanged'] and source_refs(root)==selected['root_before'], 'entire protected source/default player including logs/locks unchanged')
|
||||
except BaseException as caught:
|
||||
row['passed']=False;row['failed']=True;row['guard_error']=type(caught).__name__+': '+str(caught)
|
||||
write(out/(phase+'-receipt.json'),row)
|
||||
return row
|
||||
|
||||
def main(argv=None):
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--project-root',type=Path,default=HERE.parent); parser.add_argument('--output',type=Path)
|
||||
parser.add_argument('--godot',default='godot');parser.add_argument('--timeout',type=int,default=1200)
|
||||
parser.add_argument('--marker-contracts',type=Path);parser.add_argument('--source-input-refs',type=Path)
|
||||
parser.add_argument('--prepare-only',action='store_true');args=parser.parse_args(argv)
|
||||
root=args.project_root.resolve();out=(args.output or root/'artifacts'/('all-tests-'+uuid.uuid4().hex)).resolve();require(args.timeout>0,'positive timeout')
|
||||
root_before=source_refs(root); refs=read(args.source_input_refs) if args.source_input_refs else root_before
|
||||
require(set(refs)>=set(root_before), 'prospective source must retain every canonical source key')
|
||||
for n,pin in refs.items():
|
||||
path=Path(pin['path']);require(not path.is_symlink() and path.is_file() and path.stat().st_size==pin['bytes'] and sha(path)==pin['sha256'], 'exact selected source input '+n)
|
||||
require(refs['tools/run_all_tests.py']['sha256']==sha(Path(__file__)), 'actual public runner selected source exact')
|
||||
for file in SUPPORT.iterdir():
|
||||
if file.is_file(): require(refs['tools/regression/'+file.name]['sha256']==sha(file), 'actual support selected source exact '+file.name)
|
||||
paths=['tests/run_tests.gd']+sorted(n for n in refs if n.startswith('tests/') and n.endswith('.gd') and Path(n).name.startswith('test') and 'export'not in Path(n).parts and n!='tests/s0/test_kernel_and_save.gd')
|
||||
markers=module('standard_exact_markers',HERE/'strict_test_markers.py');contract_path=(args.marker_contracts or root/'docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json').resolve()
|
||||
contracts=markers.load_contracts(contract_path);require(len(set(paths))==len(paths) and all(n in contracts for n in paths),'unique reviewed roster/schema')
|
||||
policy=read(SUPPORT/'suite-policy.json')
|
||||
for test in set(policy['suite_policies'])&set(paths): phase_policy(test,Path(refs[test]['path']),policy['suite_policies'])
|
||||
policy_coverage(paths,refs,policy)
|
||||
parse_paths=['res://'+n for n in sorted(refs) if n.endswith('.gd')]
|
||||
if args.prepare_only:
|
||||
print(json.dumps({'source_files':len(refs),'suites':len(paths),'parse_paths':len(parse_paths),'future_native_phases':len(paths)+2,'actual_checks':None,'engines':0,'stages':0}));return 0
|
||||
outer=module('standard_exact_owned_outer',SUPPORT/'owned_outer.py');require(not outer.native.helper['live_engines'](),'another Godot owns CPU')
|
||||
engine=shutil.which(args.godot) if not Path(args.godot).is_absolute() else args.godot;require(engine,'native launcher exists')
|
||||
engine=str(Path(engine).resolve());require(shutil.disk_usage(out.parent).free>=MIN_SPACE,'fresh run disk admission')
|
||||
out.mkdir(parents=True,exist_ok=False);stage=out/'stage';stage.mkdir();(out/'starters').mkdir()
|
||||
(out/'bootstrap').mkdir()
|
||||
for name,pin in read(SUPPORT/'bootstrap-scripts.json').items():
|
||||
data=pin['text'].encode('utf-8');require(hashlib.sha256(data).hexdigest()==pin['sha256'], 'unchanged external bootstrap bytes')
|
||||
(out/'bootstrap'/name).write_bytes(data)
|
||||
protected=default_player(root);expected={n:{'bytes':p['bytes'],'sha256':p['sha256']}for n,p in refs.items()}
|
||||
selected={'root_before':root_before,'map':{n:p['sha256']for n,p in refs.items()},'timeout':args.timeout}
|
||||
for n,pin in refs.items():
|
||||
target=stage/n;target.parent.mkdir(parents=True,exist_ok=True)
|
||||
copy_source(Path(pin['path']),target)
|
||||
require(inventory(stage,stage=True)==expected,'one complete private CoW source copy')
|
||||
public=(stage/'project.godot').read_bytes();write(out/'parse-paths.json',parse_paths)
|
||||
run_id=uuid.uuid4().hex;input_receipt={'protocol':'guarded-standard-v1','run_id':run_id,'owner_runner_pid':os.getpid(),
|
||||
'project_root':str(root),'stage':str(stage),'roster':paths,'selected_source_map':selected['map'],
|
||||
'marker_contract_sha256':sha(contract_path),'runner_sha256':sha(Path(__file__)),'marker_module_sha256':sha(HERE/'strict_test_markers.py'),
|
||||
'engine':engine,'engine_sha256':sha(engine),'default_player_before':protected,'performance_is_not_maximum_scene_acceptance':True}
|
||||
write(out/'runner-input.json',input_receipt);write(out/'source-start.json',root_before)
|
||||
phases=[];rows=[];previous={};error=None;cleanup=[];cleanup_errors=[]
|
||||
diagnostics=module('standard_finite_diagnostics',SUPPORT/'diagnostic_gate.py')
|
||||
owners=module('standard_ordinary_proof_gate',SUPPORT/'ordinary_proof_gate.py');audio=module('standard_audio_proof_gate',SUPPORT/'audio_evidence_gate.py')
|
||||
try:
|
||||
for phase,test in [('import',None),('parse',None)]+[(str(i).zfill(3),n)for i,n in enumerate(paths)]:
|
||||
row=execute_phase(engine,stage,out,phase,test,selected,expected,previous,policy,contracts,parse_paths,
|
||||
public,protected,root,outer,markers,diagnostics,owners,audio);phases.append(row)
|
||||
if test:
|
||||
row['sequence']=len(rows);row['godot']=engine;rows.append(row)
|
||||
(out/'all-tests.json').write_text(json.dumps(rows,ensure_ascii=False,indent=2)+'\n')
|
||||
print(('PASS ' if row['passed'] else 'FAIL ')+test,flush=True)
|
||||
require(row['passed'],'first strict failed phase stops without retry: '+phase)
|
||||
except BaseException as caught: error=type(caught).__name__+': '+str(caught)
|
||||
finally:
|
||||
# Sweep actual factory objects before all fragile final receipt/guard writes.
|
||||
cleanup,cleanup_errors=outer.finish_captured(outer.OWNED)
|
||||
context=totals(rows,paths);guard_errors=[]
|
||||
try:
|
||||
require(source_refs(root)==root_before,'full canonical source unchanged at end')
|
||||
require(default_player(root)==protected,'full default player unchanged at end')
|
||||
require(inventory(stage,stage=True)==dict(expected,**previous),'whole stage/UID/report set at end')
|
||||
except BaseException as caught:guard_errors.append(type(caught).__name__+': '+str(caught))
|
||||
ended=bool(outer.OWNED) and all(r['engine_ended']is True for r in cleanup)
|
||||
passed=error is None and not cleanup_errors and not guard_errors and ended and len(phases)==len(paths)+2 and all(r['passed']for r in phases)
|
||||
write(out/'runner-ended.json',dict(context,protocol='guarded-standard-v1',run_id=run_id,owner_runner_pid=os.getpid(),
|
||||
passed=passed,engine_ended=ended,failed_suites=sum(r['failed']for r in rows),actual_captured_PIDs=[p.pid for p in outer.OWNED],
|
||||
final_owned_cleanup=cleanup,cleanup_errors=cleanup_errors,guard_errors=guard_errors,error=error,
|
||||
all_tests_sha256=sha(out/'all-tests.json') if (out/'all-tests.json').exists() else None,phases=phases,
|
||||
default_player_after=default_player(root),formal_acceptance=False,native_Windows='pending'))
|
||||
print(json.dumps(dict(context,passed=passed,error=error,cleanup_errors=cleanup_errors,guard_errors=guard_errors)),flush=True)
|
||||
return 0 if passed else 1
|
||||
if __name__=='__main__':raise SystemExit(main())
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user