Pin P24 old-slot preservation and exact restored snapshot evidence
This commit is contained in:
+34
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"candidate": "0084760ee05a97adfcbd783a71161491f3629918",
|
||||||
|
"packet_guard_bytes": 348274,
|
||||||
|
"unchanged_limit": 500000,
|
||||||
|
"source_context_sha256": "1afe8f9f3b639e25365d6b3525f2508a55ec1400d64223b9bf1d6dad04475cca",
|
||||||
|
"dependency_context": {
|
||||||
|
"scripts/relationship/relationship_state.gd": {
|
||||||
|
"whole_source_sha256": "14551398f31ecd899e43a3d07b165d4884e54e83983e433c6de57e3e6a18d083",
|
||||||
|
"unchanged_from_base": true,
|
||||||
|
"whole_file_included": true,
|
||||||
|
"complete_methods": []
|
||||||
|
},
|
||||||
|
"scripts/staff/staff_service.gd": {
|
||||||
|
"whole_source_sha256": "355ad5c3c9f85dc4d4ffc3bc4293e36f81078c403d1662512a735b2c8d815fb3",
|
||||||
|
"unchanged_from_base": true,
|
||||||
|
"whole_file_included": false,
|
||||||
|
"complete_methods": [
|
||||||
|
"remove_staff",
|
||||||
|
"retire_staff"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"scripts/guest/guest_service.gd": {
|
||||||
|
"whole_source_sha256": "56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e",
|
||||||
|
"unchanged_from_base": true,
|
||||||
|
"whole_file_included": false,
|
||||||
|
"complete_methods": [
|
||||||
|
"despawn_guest"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"review_findings_closed": false,
|
||||||
|
"new_product_changes": false,
|
||||||
|
"new_LLM_calls": 0
|
||||||
|
}
|
||||||
@@ -89,6 +89,29 @@ def runtime_context(git, repo, revision):
|
|||||||
return context, proof
|
return context, proof
|
||||||
|
|
||||||
|
|
||||||
|
def unchanged_dependency_context(repo, revision):
|
||||||
|
selected = {
|
||||||
|
'scripts/relationship/relationship_state.gd': None,
|
||||||
|
'scripts/staff/staff_service.gd': ['remove_staff', 'retire_staff'],
|
||||||
|
'scripts/guest/guest_service.gd': ['despawn_guest'],
|
||||||
|
}
|
||||||
|
result = {}
|
||||||
|
for path, names in selected.items():
|
||||||
|
full = source(repo, revision, path)
|
||||||
|
assert full == source(repo, BASE, path), 'relationship dependency changed; review complete delta first'
|
||||||
|
entry = {'path': path, 'revision': revision, 'whole_source_sha256': sha(full),
|
||||||
|
'unchanged_from_base': True, 'whole_file_included': names is None}
|
||||||
|
if names is None:
|
||||||
|
entry['source'] = full
|
||||||
|
else:
|
||||||
|
lines, _, methods = method_ranges(full)
|
||||||
|
assert all(name in methods for name in names), 'required dependency method absent'
|
||||||
|
entry['complete_methods'] = {name: ''.join(lines[methods[name][0]:methods[name][1]]) for name in names}
|
||||||
|
entry['omitted_scope'] = 'Other unchanged methods; not entire service review'
|
||||||
|
result[path] = entry
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def packet(runner, task_id, revision, original_packet):
|
def packet(runner, task_id, revision, original_packet):
|
||||||
from runner.core import git, allowed, secret_path, read_json, CONTROL, require
|
from runner.core import git, allowed, secret_path, read_json, CONTROL, require
|
||||||
task = runner.task(task_id)
|
task = runner.task(task_id)
|
||||||
@@ -120,6 +143,7 @@ def packet(runner, task_id, revision, original_packet):
|
|||||||
body['sources'][MARKERS] = json.dumps(reduced, ensure_ascii=False, indent=2)
|
body['sources'][MARKERS] = json.dumps(reduced, ensure_ascii=False, indent=2)
|
||||||
body['immutable_identity_catalog'] = {p: source(runner.repo, revision, p)
|
body['immutable_identity_catalog'] = {p: source(runner.repo, revision, p)
|
||||||
for p in ['data/characters/mvp_unique_characters.json']}
|
for p in ['data/characters/mvp_unique_characters.json']}
|
||||||
|
body['immutable_relationship_dependencies'] = unchanged_dependency_context(runner.repo, revision)
|
||||||
body['tests'] = [read_json(row[0]) for row in runner.db.execute(
|
body['tests'] = [read_json(row[0]) for row in runner.db.execute(
|
||||||
"SELECT artifact FROM evidence WHERE task_id=? AND kind='validation' AND commit_sha=? AND passed=1",
|
"SELECT artifact FROM evidence WHERE task_id=? AND kind='validation' AND commit_sha=? AND passed=1",
|
||||||
(task_id, revision))]
|
(task_id, revision))]
|
||||||
|
|||||||
+4
-2
@@ -10,11 +10,13 @@
|
|||||||
| event_log | 9641局所34PASS。既完了P24-03のログ256件は一致する範囲で再利用。自然event順序/時刻/理由/保存再開重複の通し証拠を追加。 |
|
| event_log | 9641局所34PASS。既完了P24-03のログ256件は一致する範囲で再利用。自然event順序/時刻/理由/保存再開重複の通し証拠を追加。 |
|
||||||
| important_warning_cutin | 原本通り盾positive→0でNTR侵食開始の表示文へ修正し独立限定reviewPASS。自然生成のP18-01/02、3決闘/結果保存P19-01、自然防衛P21-01が依存。synthetic signalは通常実証に替えない。 |
|
| important_warning_cutin | 原本通り盾positive→0でNTR侵食開始の表示文へ修正し独立限定reviewPASS。自然生成のP18-01/02、3決闘/結果保存P19-01、自然防衛P21-01が依存。synthetic signalは通常実証に替えない。 |
|
||||||
| click_alternatives | 新規保存名のclick入口は実Mac通常menuで確認。必要な全navigation/assignment代替を現候補で照合。P23手動Ctrl-wheel/左保持dragは後回しのまま免除なし。 |
|
| click_alternatives | 新規保存名のclick入口は実Mac通常menuで確認。必要な全navigation/assignment代替を現候補で照合。P23手動Ctrl-wheel/左保持dragは後回しのまま免除なし。 |
|
||||||
| japanese_input_and_scale | 9641の実OSmenu→IME未確定/取消/確定→テスト表示名別slot保存→別PID33760/34817通常id2読込を取得。既存slot保全OS前後hash、invalid label feedback、全倍率/clip/focus、同一Windows配布版実機は未達。 |
|
| japanese_input_and_scale | 9641の実OSmenu→IME未確定/取消/確定→テスト表示名別slot保存→別PID33760/34817通常id2読込を取得。追加単一受付工事scenarioの旧4files OS前後hashは一致し限定review済み。全旧形式/全内容保存、invalid label feedback、全倍率/clip/focus、同一Windows配布版実機は未達。 |
|
||||||
| final_validation_review | 9641のimport/全GDparse/局所3 167、source/player/cleanup違反0、別Opus5.5限定差分PASS。関連依存をまとめた正確な最終候補の必須全roster、全8条件正式独立review、現在main統合/最終照合は未達。 |
|
| final_validation_review | 9641のimport/全GDparse/局所3 167、source/player/cleanup違反0、別Opus5.5限定差分PASS。関連依存をまとめた正確な最終候補の必須全roster、全8条件正式独立review、現在main統合/最終照合は未達。 |
|
||||||
|
|
||||||
証拠はnative-os-input-r01/submitted-local-r06.json、ordinary-menu-os-observations-r02.json、independent-delta-review-r02.json。各々候補/実PID/raw artifact SHA/適用範囲を保持。OS runは空の開始世界で、全world復元一致や既存slot保全の実証を主張しない。今回Main変更に対して局所3を実行し、旧7証拠の自動継承や重複全回帰は行っていない。
|
証拠はnative-os-input-r01/submitted-local-r06.json、ordinary-menu-os-observations-r02.json、independent-delta-review-r02.json。各々候補/実PID/raw artifact SHA/適用範囲を保持。初回OS runは空の開始世界。追補r03では通常配置した受付工事70percent/min444を保存し、旧manual_ui4files全内容保全と別PID39701→40866の復元直後全snapshot118528B一致を取得。資料補完後r04限定OpusreviewPASS。全game内容/保存移行や完了通知後状態の一致は主張しない。今回Main変更に対して局所3を実行し、旧7証拠の自動継承や重複全回帰は行っていない。
|
||||||
|
|
||||||
次に閉じる依存1件はP18-01「関係モデルと保存」。自然NTR警告受入に直接必要で、現候補0084760eは実native7/843・parse308・正式verify-onlyPASSまで進んでいるが別Opusreviewはchanges_requested。原本3値/盾max専用backend、旧関係保存保全、Runtime/読取projection、試験review統合の4 backend条件を固定。全P18-01には通常UI/全人物/必要本番初期値承認も必要。レビュー指摘の旧alias変更、退店客persistent参照/旧型互換、UNIQUE保全、候補catalog参照とRuntime負例を解消する修正案を別途準備済み。P18のみ追加1回の回答待ちで、P24許可を転用しない。回答待ちにP24の受入証拠照合を継続する。
|
次に閉じる依存1件はP18-01「関係モデルと保存」。自然NTR警告受入に直接必要で、現候補0084760eは実native7/843・parse308・正式verify-onlyPASSまで進んでいるが別Opusreviewはchanges_requested。原本3値/盾max専用backend、旧関係保存保全、Runtime/読取projection、試験review統合の4 backend条件を固定。全P18-01には通常UI/全人物/必要本番初期値承認も必要。レビュー指摘の旧alias変更、退店客persistent参照/旧型互換、UNIQUE保全、候補catalog参照とRuntime負例を解消する修正案を別途準備済み。P18のみ追加1回の回答待ちで、P24許可を転用しない。回答待ちにP24の受入証拠照合を継続する。
|
||||||
|
|
||||||
対象外の改善は独立レビューfindingsに記録。旧commentのvanishing表現などは現許可差分へ混ぜず、通常入力feedback/保存破損等の必須性を優先する。未確定の関係値・数値・仕様は作らない。
|
対象外の改善は独立レビューfindingsに記録。旧commentのvanishing表現などは現許可差分へ混ぜず、通常入力feedback/保存破損等の必須性を優先する。未確定の関係値・数値・仕様は作らない。
|
||||||
|
|
||||||
|
追補証拠: native-os-input-r01/ordinary-save-preservation-observations-r03.json、preservation-provenance-supplement-r04.json、independent-preservation-evidence-review-r04.json。最初の資料不足reviewを保持し、既存dataの補完で解消。menu/pointer/resumeはCUA観測の適用限界を保持、単位全受入には未転用。
|
||||||
|
|||||||
@@ -19,3 +19,5 @@ Claude Opus5.5の記録済み判断で、同じ登録タスク/既存worktreeを
|
|||||||
追補r06: P24だけ追加1回の直接許可を受け、同一GUI担当Opus5.5 Medium/修正3/3で通常新規保存入口と原本NTR警告文を修正、Runner提出9641ed52へ固定。実import/全GDparse/局所3 167 PASS、通常menu→実IME未確定/取消/確定→表示名テストの別slot保存→別PID33760→34817通常読込を取得、source/player/cleanup違反0。独立差分reviewは実行中、全8条件・上流自然生成・最終full・全条件review・統合・Windowsは未了。旧「追加許可待ち」「入口未実装」はこの候補について解消。P18backend0084760eは実7/843/parse308と正式verify PASSだが独立review changes_requested、修正案は別許可待ち。
|
追補r06: P24だけ追加1回の直接許可を受け、同一GUI担当Opus5.5 Medium/修正3/3で通常新規保存入口と原本NTR警告文を修正、Runner提出9641ed52へ固定。実import/全GDparse/局所3 167 PASS、通常menu→実IME未確定/取消/確定→表示名テストの別slot保存→別PID33760→34817通常読込を取得、source/player/cleanup違反0。独立差分reviewは実行中、全8条件・上流自然生成・最終full・全条件review・統合・Windowsは未了。旧「追加許可待ち」「入口未実装」はこの候補について解消。P18backend0084760eは実7/843/parse308と正式verify PASSだが独立review changes_requested、修正案は別許可待ち。
|
||||||
|
|
||||||
限定差分の別Opus5.5 reviewはPASS(実argv検証)。全条件正式reviewには未代替。レビュー残件に既存manual_uiの前後hash、全world digest、実NTR文言/実発生、invalid label feedbackとDELを記録。今回consumerはid2の通常一覧から選択。
|
限定差分の別Opus5.5 reviewはPASS(実argv検証)。全条件正式reviewには未代替。レビュー残件に既存manual_uiの前後hash、全world digest、実NTR文言/実発生、invalid label feedbackとDELを記録。今回consumerはid2の通常一覧から選択。
|
||||||
|
|
||||||
|
追補r07(コード候補不変9641ed52): 実配置受付の工事70percent/min444を通常quick save→通常別名slot、既存manual_ui全4filesの内容保全、別PID39701→40866の復元直後全snapshot118528B byte一致を取得。通常再開で工事完成をCUA観測、後者の独立正式pointer/resumeは未達として保持。最初のOpus reviewは採取provenance資料不足でchanges_requested、実行済みRoot before/after全文/方法/日時とnative tick、全4live rehashを補い再review限定PASS、新engine再実行0。全88正式完了増加0。
|
||||||
|
|||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||||
|
"scope": "Limited new preservation/full-restored-snapshot scenario evidence review; not formal whole-unit acceptance",
|
||||||
|
"result": {
|
||||||
|
"status": "changes_requested",
|
||||||
|
"summary": "Limited review of one native macOS producer→consumer run on 9641ed5. Adequately shown: different processes (PIDs 39701 and 40866, recorded at launch and per observer row), the same recorder hash in both runs, and the controller guards (exact commit, clean tree, source/stage/default-player unchanged, exit 0, no ERROR in the log). Full restore equality at snapshot_published before the ordinary SAVE_LOADED event is also adequately shown: the snapshot the observer built at the publish and the snapshot read back from disk are byte-identical (SHA b242cc87…, 118528 bytes, both pinned), the only capture was index 0, and a fresh process can only match the minute-444 save if the restore really happened. This holds for that phase only, not after the event. NOT adequately shown: preservation of ALL FOUR old slot files. Only manifest.json and world.bin are re-hashed on the live manual_ui path. journal.log and thumbnail.png rely only on preexisting-slot-before/after.json, which neither shown controller nor the observer writes. Their method, author and timing relative to the named-slot save are not shown, and their size difference (1472 vs 762 bytes) is unexplained. Menu ids 3/2 and the resume results (clock 444→531, reception finished, gold 4500/material 42) are CUA observations only, with no pinned captures. The restore-equality and different-process parts would pass alone; the ALL4 claim does not.",
|
||||||
|
"findings": [
|
||||||
|
"PASS-LIMITED: Restore equality is shown at the right phase. The observer calls runtime.create_snapshot() when snapshot_published fires. When the recovery completes, it compares that snapshot with the disk read from inspect_snapshot using == and compares SHA-256 of both serialized byte forms. snapshot-000.bin and loaded-stored-snapshot.bin are pinned with identical SHA b242cc87… / 118528 bytes. snapshot_index 0 and a fresh process mean equality is only possible after the restore. Valid only before the SAVE_LOADED completion event, as stated; not post-event equivalence.",
|
||||||
|
"PASS-LIMITED: Different processes. PIDs 39701 and 40866 come from each controller's Popen; the observer also logs its own process id per row. The consumer reused the producer's profile and required it to exist.",
|
||||||
|
"PASS-LIMITED: Guards. Each controller checks the exact candidate commit, a clean tree, tested stage source hashes, and no other running engine. Afterwards it checks source refs, the stage inventory and the default player are unchanged and restores project.godot. A run passes only with exit 0 and no ERROR/SCRIPT ERROR in the native log. ended.json is hash-pinned, but its contents were not supplied, so passed=true and empty guard_errors are taken from the summary.",
|
||||||
|
"GAP (blocking ALL4): Only manifest.json (62d801bb…) and world.bin (da65a181…) are re-hashed on the live saves/manual_ui path. journal.log (1ba101ad…) and thumbnail.png (17b547b7…) have no live re-hash pins and rely only on preexisting-slot-before/after.json.",
|
||||||
|
"GAP (blocking ALL4): Neither the producer nor the consumer controller, nor passive_os.gd, writes preexisting-slot-before.json or preexisting-slot-after.json. Their author, method and timing are unproven. The before capture must fall after the quick save and before the named-slot (menu id3) save. Its 1472 bytes vs the after file's 762 bytes is unexplained. Supply both files' contents and the capture method, with timing tied to the events.jsonl ticks.",
|
||||||
|
"SCOPE NOTE: The producer required a fresh, empty profile (require not profile.exists(); mkdir). So the 'preexisting' manual_ui slot was created by the same run's quick save. It existed before the named save, not across sessions.",
|
||||||
|
"OBSERVER LIMIT: Menu ids id3/id2, the 'preservation-r03' name entry and the confirm-read are not proven by pinned data. The observer logs _input keys and mouse buttons and dialog/label state (contents not supplied), but not PopupMenu item ids. It may not see clicks inside popup subwindows. These rest on CUA observation.",
|
||||||
|
"OBSERVER LIMIT: Resume results (clock 444→531, reception 70%→completed, gold 4500/material 42) are CUA-only. Only snapshot-000 is pinned; later snapshot_published captures were not supplied.",
|
||||||
|
"MINOR: The observer is not perfectly passive. Connecting to snapshot_published makes _publish_snapshot emit the signal, which it otherwise skips, and the handler adds a create_snapshot() call. This is likely harmless for state but does change the code path.",
|
||||||
|
"NOT CLAIMED/NOT ACCEPTED: whole P24/P24-02, all content, Windows/other platforms, post-event equivalence, repeated full roster."
|
||||||
|
],
|
||||||
|
"whole_unit_accepted": false
|
||||||
|
},
|
||||||
|
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/3b4f57954a9d44b299c47feb4b024139",
|
||||||
|
"model": "claude-opus-5-5",
|
||||||
|
"formal_runner_review": false,
|
||||||
|
"whole_unit_accepted": false,
|
||||||
|
"input_proof_sha256": "024a2cb0aba292037f281a3eea43b5eac95d773fa0517e77b32b08ef5084e7c1"
|
||||||
|
}
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||||
|
"scope": "Limited new preservation/full-restored-snapshot scenario evidence review; not formal whole-unit acceptance",
|
||||||
|
"result": {
|
||||||
|
"status": "passed",
|
||||||
|
"summary": "Limited pass for one native macOS run on 9641ed5: a producer (PID 39701) and a separate consumer (PID 40866). The new data fixes the blocking ALL4 gap from the previous review. Both root captures are now supplied in full. They hash all four files in saves/manual_ui and get identical maps: journal.log 35 B 1ba101ad…, world.bin 12258 B da65a181…, manifest.json 650 B 62d801bb…, thumbnail.png 30080 B 17b547b7…. Each capture lists exactly these four files, so the directory had no extra files at either time. The capture times fit the engine's own records. The slot manifest says it was created at 06:48:59 UTC, which matches the quick save at tick 103791. The dialog's default label shows 15:49:43 JST (06:49:43 UTC), which matches tick 148216. From that, the named save at tick 175078 works out to about 06:50:10 UTC. The before capture was created at 06:49:14, after the quick save and before the dialog opened. The after capture was created at 06:50:27, after the named save finished. The named save wrote to the new path manual_ui_6789…, and the live re-hash at 06:58:05 still matches all four files. The JSON files differ in size (1472 vs 762 bytes) only because the before file also embeds the manifest. A sanity check also holds: the 35-byte journal.log is exactly \"save_completed 2026-10-13T06:48:59\\n\". Restore equality still passes, at the snapshot_published phase before SAVE_LOADED only (snapshot-000 equals loaded-stored-snapshot, b242cc87…, 118528 B). The different-process proof and the guards still pass, and both full ended.json files now show passed=true with no guard, cleanup or other errors. Menu ids, the reception and gold results, and pointer/resume remain unpinned CUA observations only. whole_unit_accepted=false.",
|
||||||
|
"findings": [
|
||||||
|
"PASS-LIMITED (ALL4 preservation, previous blocker fixed): The before and after captures each list exactly the same four files with identical bytes and SHA-256. The live re-hash at 06:58:05 UTC matches all four. The live manifest.json and world.bin pins in the evidence list agree. 'Preserved' here means the contents are byte-identical. The per-file mtimes/inodes in manual_ui were not supplied, so a rewrite with identical bytes cannot be ruled out. This does not affect the content-preservation claim.",
|
||||||
|
"PASS-LIMITED (capture timing): The before capture (created 06:49:14.08 UTC) falls between the quick save (manifest created_at 06:48:59 UTC, tick 103791) and the dialog opening (tick 148216, default label 15:49:43 JST, which is 06:49:43 UTC). The after capture (created 06:50:27.03 UTC) falls after the named save at tick 175078, which works out to about 06:50:10 UTC. It also falls after the dialog closed and save_path switched to manual_ui_6789… at tick 175108. The order is consistent to within about 1 s, the precision of the manifest timestamp.",
|
||||||
|
"PASS-LIMITED (capture author and method): Root wrote the captures with Python hashing (rglob, then sha256 of read_bytes). The engine controller did not write them, and no engine process could write to the artifacts dir. The weak point is that the same coordinator who makes the claim also wrote the captures. Their trustworthiness rests on the two file hashes (aed60147…, efb7170f…), the creation times, and how well they match the engine's own ticks and manifest. Nobody else re-ran the capture.",
|
||||||
|
"PASS-LIMITED (size difference explained): The before JSON embeds the full saved manifest. The after JSON has only the path, the file map and an equality flag. The extra manifest is a plausible size for the 710-byte difference. The four-file maps are identical. The embedded manifest is internally consistent with the slot: save_id manual_ui, minute 444, display_name 手動保存, and a created time that matches the 35-byte journal content.",
|
||||||
|
"PASS-LIMITED (restore equality, unchanged): The capture at snapshot index 0 (tick 50749, minute 444) equals the snapshot read back from disk, by == and by SHA. This holds only at snapshot_published, before the ordinary SAVE_LOADED completion event, and does not show post-event equivalence. Minor: the consumer's operation was recorded as 'recovery' (recovery_mode=true), not 'load'. The safety report shows no automatic or forbidden repairs, so equality is not affected. It does mean the ordinary read went through the recovery entry point.",
|
||||||
|
"PASS-LIMITED (different processes and guards): PID 39701 and PID 40866 each came from their own Popen, and the observer logged the same PID in every row. Both ended.json files show passed=true, exit 0, no guard, cleanup or other errors, owned-cleanup only, and zero foreign signals. The source, stage and default-player guards ran after each run. The consumer reused the producer's profile.",
|
||||||
|
"SCOPE: The 'preexisting' slot was created by this same producer session's ordinary quick save, before the named save. It did not survive across sessions or come from an import.",
|
||||||
|
"SUPPORTED BUT NOT PROVEN (producer named-save dialog): The observer's state rows show the dialog visible with the label focused. The label text goes from the default to 'preserv' to 'preservation-r03'. Then the label loses focus, the save completes at tick 175078, and the dialog closes. That backs up the named-save flow, but not the menu item id3 specifically. The contents of the new manifest (cd450b44…) were not supplied, so display_name=preservation-r03 on disk is not checked.",
|
||||||
|
"OBSERVER LIMIT (resume): events.jsonl (pinned) now shows 88 snapshot_published captures, minutes 444 through 531, contiguous, with a 35 s gap after the restore that fits a pause and then resume. That supports clock progress 444→531 in the consumer. Reception reaching completion and gold 4500/material 42 are not shown by any supplied capture contents. Snapshots 001–087 are listed only by hash in the log, not as pinned evidence files. These remain CUA-only.",
|
||||||
|
"OBSERVER LIMIT (menus and pointer): The consumer's menu id2, the list/select of the named slot, the confirm-read, and pointer/resume input are unpinned native CUA observations. The observer does not log PopupMenu item ids. These are not accepted as pointer/resume conditions.",
|
||||||
|
"MINOR (observer not fully passive, unchanged): Connecting to snapshot_published makes the signal emit when it otherwise would not, and the handler adds a create_snapshot() call. This is a read-only path, but it is a different code path from an unobserved run.",
|
||||||
|
"NOT CLAIMED/NOT ACCEPTED: whole P24/P24-02, all content, Windows or other platforms, post-event equivalence, a repeated full roster, standalone pointer/resume or menu-id acceptance."
|
||||||
|
],
|
||||||
|
"whole_unit_accepted": false
|
||||||
|
},
|
||||||
|
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/3b30533319954ada9252809c552dbc5b",
|
||||||
|
"model": "claude-opus-5-5",
|
||||||
|
"formal_runner_review": false,
|
||||||
|
"whole_unit_accepted": false,
|
||||||
|
"supplement_sha256": "a7aa38caec8b6968c9bde7ddbcd359ea1ca4cc4ec6108e6e02ec04796dbce1f9",
|
||||||
|
"input_proof_sha256": "024a2cb0aba292037f281a3eea43b5eac95d773fa0517e77b32b08ef5084e7c1"
|
||||||
|
}
|
||||||
+191
@@ -0,0 +1,191 @@
|
|||||||
|
{
|
||||||
|
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||||
|
"scope": "One actual normal play placement/construction old-slot preservation and distinct-process restore; not whole P24/P02/all-world-content acceptance",
|
||||||
|
"actual_pids": [
|
||||||
|
39701,
|
||||||
|
40866
|
||||||
|
],
|
||||||
|
"preexisting_old_slot_present": true,
|
||||||
|
"old_package_files": {
|
||||||
|
"journal.log": {
|
||||||
|
"bytes": 35,
|
||||||
|
"sha256": "1ba101ad14aee2eb7dc199ed3eefee28758914cf9342312f37ad0e8e2e9bc088"
|
||||||
|
},
|
||||||
|
"world.bin": {
|
||||||
|
"bytes": 12258,
|
||||||
|
"sha256": "da65a181c934bf8fe0a2969db5c074863b03cf2483f2b039e5dd588b809b80b3"
|
||||||
|
},
|
||||||
|
"manifest.json": {
|
||||||
|
"bytes": 650,
|
||||||
|
"sha256": "62d801bb42100ade11f3f4957bff85cac7fea573dcefea97faf3806c8a29c669"
|
||||||
|
},
|
||||||
|
"thumbnail.png": {
|
||||||
|
"bytes": 30080,
|
||||||
|
"sha256": "17b547b7e6bdb8fb987f6ba1b8feb15a800cc0f4eb717773afe067ae732ced55"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"all_old_package_files_byte_identical_after_save_and_consumer": true,
|
||||||
|
"saved_minute": 444,
|
||||||
|
"normal_actions": "Choose reception from opening guidance, place through map click, advance/pause until70percent, ordinary quick save to manual_ui, ordinary menu id3 named-slot save, exit producer, new process menu id2 list/select named slot/confirm read, ordinary resume/pause to complete reception",
|
||||||
|
"display_name": "preservation-r03",
|
||||||
|
"new_save_path": "user://saves/manual_ui_6789d75c74d103ad3912e8992a815680",
|
||||||
|
"full_restored_snapshot_equality": {
|
||||||
|
"code": "OK",
|
||||||
|
"disk_read_only_ok": true,
|
||||||
|
"latest_published_full_snapshot_semantic_equal": true,
|
||||||
|
"observed_full_snapshot_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
|
||||||
|
"observer_reads_only": true,
|
||||||
|
"ok": true,
|
||||||
|
"operation": "recovery",
|
||||||
|
"path": "user://saves/manual_ui_6789d75c74d103ad3912e8992a815680",
|
||||||
|
"restore_safety_report": {
|
||||||
|
"automatic_repairs_applied": false,
|
||||||
|
"content_filter": {
|
||||||
|
"current_before_load": {
|
||||||
|
"disabled_content_tags": [],
|
||||||
|
"filter_mode": "NONE",
|
||||||
|
"maximum_content_rating": "GENERAL"
|
||||||
|
},
|
||||||
|
"effective_profile": {
|
||||||
|
"disabled_content_tags": [],
|
||||||
|
"filter_mode": "NONE",
|
||||||
|
"maximum_content_rating": "GENERAL"
|
||||||
|
},
|
||||||
|
"saved_profile": {
|
||||||
|
"disabled_content_tags": [],
|
||||||
|
"filter_mode": "NONE",
|
||||||
|
"maximum_content_rating": "GENERAL"
|
||||||
|
},
|
||||||
|
"saved_profile_was_weaker": false,
|
||||||
|
"strict_profile_preserved": true
|
||||||
|
},
|
||||||
|
"forbidden_repair_categories": [
|
||||||
|
"synthesize_gold",
|
||||||
|
"delete_facilities",
|
||||||
|
"rewrite_ledger",
|
||||||
|
"guess_route_locks"
|
||||||
|
],
|
||||||
|
"forbidden_repairs_applied": false,
|
||||||
|
"recovery_mode": true,
|
||||||
|
"repair_policy": "WHITELISTED_AUTHORITATIVE_ONLY",
|
||||||
|
"repairs": {
|
||||||
|
"orphan_event_locks": {
|
||||||
|
"automatic_repairs_applied": false,
|
||||||
|
"reason": "NONE",
|
||||||
|
"released_actor_ids": [],
|
||||||
|
"released_foreground_instance_id": ""
|
||||||
|
},
|
||||||
|
"orphan_tasks": {
|
||||||
|
"automatic_repairs_applied": false,
|
||||||
|
"release_failed_task_ids": [],
|
||||||
|
"released_reservation_ids": [],
|
||||||
|
"released_staff_ids": [],
|
||||||
|
"reopened_task_ids": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"report_version": 1
|
||||||
|
},
|
||||||
|
"snapshot_index": 0,
|
||||||
|
"stored_full_snapshot_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d"
|
||||||
|
},
|
||||||
|
"equality_phase": "Runtime snapshot_published at end of restore before the ordinary SAVE_LOADED completion event; not post-event equivalence",
|
||||||
|
"byte_comparison_passed": true,
|
||||||
|
"observed_resume": "Clock444→531, reception70percent→completed, original cost retained gold4500/material42; native CUA observation",
|
||||||
|
"all_gameplay_sources_unchanged": true,
|
||||||
|
"default_player_guards_passed": true,
|
||||||
|
"whole_unit_accepted": false,
|
||||||
|
"windows_same_candidate": false,
|
||||||
|
"full_roster_repeated": false,
|
||||||
|
"evidence": [
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/started.json",
|
||||||
|
"sha256": "bc05d5ef0ec62a3fc46e5b957f3724ef95c339078bc02eee04b3c42632bbe1ab",
|
||||||
|
"bytes": 726638
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/process-started.json",
|
||||||
|
"sha256": "d6d981e157cd7e68a08e9e0133f81faac4113a48d03e74deb04d380cb03e41b1",
|
||||||
|
"bytes": 727114
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/ended.json",
|
||||||
|
"sha256": "bf42d9666d4fe27051403f7d00a96f17abaa1e9b551db9d13c49ee8f7130d5c6",
|
||||||
|
"bytes": 727662
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/events.jsonl",
|
||||||
|
"sha256": "104fb16b406dd123b77356ef98bd5a8f0bd595d660be0870c881cfbf30ce7302",
|
||||||
|
"bytes": 27456
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/passive_os.gd",
|
||||||
|
"sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
|
||||||
|
"bytes": 5454
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/preexisting-slot-before.json",
|
||||||
|
"sha256": "aed601473efa522c41e5ca8890c11f1eeb2b06e786fb76cba1e96263934efe82",
|
||||||
|
"bytes": 1472
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/preexisting-slot-after.json",
|
||||||
|
"sha256": "efb7170f0579bed92a42ead7c03b70dfc37df1e55dde05a96ae67666c6e38063",
|
||||||
|
"bytes": 762
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/started.json",
|
||||||
|
"sha256": "135b779ce605d491bc6110235e9827c4091fefe8b86a49222655b3b713adcad7",
|
||||||
|
"bytes": 726638
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/process-started.json",
|
||||||
|
"sha256": "e33badfd0b68ff97ce8459fed3a6a6d7275d938fbc1705c82cea94e7ded66314",
|
||||||
|
"bytes": 727123
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/ended.json",
|
||||||
|
"sha256": "353cfa8e5ea703cb777bf0796b8a0f2f7fa55a5a36b69585414d5e7a16fae94c",
|
||||||
|
"bytes": 727662
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/events.jsonl",
|
||||||
|
"sha256": "2f93c17152ed41dbbbd7b70b79383591a02ef0f9939d03cf340665ed4ee70ef7",
|
||||||
|
"bytes": 25730
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/passive_os.gd",
|
||||||
|
"sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
|
||||||
|
"bytes": 5454
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/snapshot-000.bin",
|
||||||
|
"sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
|
||||||
|
"bytes": 118528
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/loaded-stored-snapshot.bin",
|
||||||
|
"sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
|
||||||
|
"bytes": 118528
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui/manifest.json",
|
||||||
|
"sha256": "62d801bb42100ade11f3f4957bff85cac7fea573dcefea97faf3806c8a29c669",
|
||||||
|
"bytes": 650
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui/world.bin",
|
||||||
|
"sha256": "da65a181c934bf8fe0a2969db5c074863b03cf2483f2b039e5dd588b809b80b3",
|
||||||
|
"bytes": 12258
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui_6789d75c74d103ad3912e8992a815680/manifest.json",
|
||||||
|
"sha256": "cd450b442c37d497735888f6b96076ba482dca72a420aed1cf6568eb3723824b",
|
||||||
|
"bytes": 687
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui_6789d75c74d103ad3912e8992a815680/world.bin",
|
||||||
|
"sha256": "a0eb8af6fbb6abcdaea0375b4298164013229c3ba187a9d4c1e54d37ecb75202",
|
||||||
|
"bytes": 12466
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+95
@@ -0,0 +1,95 @@
|
|||||||
|
extends SceneTree
|
||||||
|
var main: Control
|
||||||
|
var observer: Node
|
||||||
|
func _initialize() -> void:
|
||||||
|
call_deferred("_start")
|
||||||
|
func _start() -> void:
|
||||||
|
var scene: PackedScene = load("res://scenes/main/main.tscn")
|
||||||
|
main = scene.instantiate()
|
||||||
|
root.add_child(main)
|
||||||
|
observer = PassiveRecorder.new()
|
||||||
|
observer.main = main
|
||||||
|
observer.out_dir = OS.get_environment("P24_OS_OUTPUT")
|
||||||
|
root.add_child(observer)
|
||||||
|
root.title = "The Tree P24-02 OS candidate 9641ed5"
|
||||||
|
|
||||||
|
class PassiveRecorder extends Node:
|
||||||
|
var main: Control
|
||||||
|
var out_dir: String
|
||||||
|
var log: FileAccess
|
||||||
|
var previous: Dictionary = {}
|
||||||
|
var elapsed := 0.0
|
||||||
|
var rows := 0
|
||||||
|
var runtime: Node
|
||||||
|
var snapshot_count := 0
|
||||||
|
var latest_restore_snapshot: Dictionary = {}
|
||||||
|
func _ready() -> void:
|
||||||
|
log = FileAccess.open(out_dir.path_join("events.jsonl"), FileAccess.WRITE)
|
||||||
|
runtime = main.get_node("/root/SimulationRuntime")
|
||||||
|
runtime.snapshot_published.connect(_on_snapshot_published)
|
||||||
|
runtime.save_operation_completed.connect(_on_save_completed)
|
||||||
|
emit_record("started", {"pid": OS.get_process_id(), "platform": OS.get_name(), "candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37", "source": "passive_root_normal_menu_observation_not_whole_acceptance"})
|
||||||
|
func _sha(data: PackedByteArray) -> String:
|
||||||
|
var context := HashingContext.new()
|
||||||
|
context.start(HashingContext.HASH_SHA256)
|
||||||
|
context.update(data)
|
||||||
|
return context.finish().hex_encode()
|
||||||
|
func _on_snapshot_published(_view: Dictionary, _digest: String) -> void:
|
||||||
|
if snapshot_count >= 200:
|
||||||
|
return
|
||||||
|
latest_restore_snapshot = runtime.create_snapshot()
|
||||||
|
var data := var_to_bytes(latest_restore_snapshot)
|
||||||
|
var filename := "snapshot-%03d.bin" % snapshot_count
|
||||||
|
var file := FileAccess.open(out_dir.path_join(filename), FileAccess.WRITE)
|
||||||
|
file.store_buffer(data)
|
||||||
|
file.close()
|
||||||
|
emit_record("snapshot_published_capture", {"filename": filename, "sha256": _sha(data), "absolute_minute": latest_restore_snapshot[&"clock"][&"absolute_minute"], "observer_reads_only": true})
|
||||||
|
snapshot_count += 1
|
||||||
|
func _on_save_completed(result: Dictionary) -> void:
|
||||||
|
var path: String = str(result.get(&"save_path", ""))
|
||||||
|
var operation: String = str(result.get(&"operation", ""))
|
||||||
|
var receipt := {"path": path, "operation": operation, "ok": bool(result.get(&"ok", false)), "code": str(result.get(&"code", "")), "observer_reads_only": true}
|
||||||
|
if bool(result.get(&"ok", false)) and operation in ["load", "recovery", "recovery_candidate"]:
|
||||||
|
var disk := SaveService.inspect_snapshot(path)
|
||||||
|
var stored: Dictionary = disk.get(&"snapshot", {})
|
||||||
|
var observed := var_to_bytes(latest_restore_snapshot)
|
||||||
|
var expected := var_to_bytes(stored)
|
||||||
|
receipt["disk_read_only_ok"] = bool(disk.get(&"ok", false))
|
||||||
|
receipt["latest_published_full_snapshot_semantic_equal"] = latest_restore_snapshot == stored
|
||||||
|
receipt["observed_full_snapshot_sha256"] = _sha(observed)
|
||||||
|
receipt["stored_full_snapshot_sha256"] = _sha(expected)
|
||||||
|
receipt["snapshot_index"] = snapshot_count - 1
|
||||||
|
var file := FileAccess.open(out_dir.path_join("loaded-stored-snapshot.bin"), FileAccess.WRITE)
|
||||||
|
file.store_buffer(expected)
|
||||||
|
file.close()
|
||||||
|
receipt["restore_safety_report"] = result.get(&"restore_safety_report", {})
|
||||||
|
emit_record("save_operation_completed", receipt)
|
||||||
|
func emit_record(kind: String, value: Dictionary) -> void:
|
||||||
|
if rows >= 10000 or log == null:
|
||||||
|
return
|
||||||
|
var record := {"kind": kind, "pid": OS.get_process_id(), "ticks_msec": Time.get_ticks_msec(), "value": value}
|
||||||
|
log.store_line(JSON.stringify(record))
|
||||||
|
log.flush()
|
||||||
|
rows += 1
|
||||||
|
func _input(event: InputEvent) -> void:
|
||||||
|
if event is InputEventKey:
|
||||||
|
emit_record("key", {"keycode": event.keycode, "physical_keycode": event.physical_keycode, "unicode": event.unicode, "pressed": event.pressed, "echo": event.echo, "shift": event.shift_pressed, "ctrl": event.ctrl_pressed, "alt": event.alt_pressed, "meta": event.meta_pressed})
|
||||||
|
elif event is InputEventMouseButton:
|
||||||
|
emit_record("mouse_button", {"button": event.button_index, "pressed": event.pressed, "position": [event.position.x, event.position.y]})
|
||||||
|
func _process(delta: float) -> void:
|
||||||
|
elapsed += delta
|
||||||
|
if elapsed < 0.1:
|
||||||
|
return
|
||||||
|
elapsed = 0.0
|
||||||
|
var dialog: Variant = main.get("manual_save_slots_dialog")
|
||||||
|
var label: Variant = dialog.get("_label_edit") if dialog != null else null
|
||||||
|
var focus: Control = get_viewport().gui_get_focus_owner()
|
||||||
|
var window: Window = get_tree().root
|
||||||
|
var state := {"ime_text": DisplayServer.ime_get_text(), "ime_selection": [DisplayServer.ime_get_selection().x, DisplayServer.ime_get_selection().y], "label_text": String(label.text) if label != null else "", "label_rect": [label.get_global_rect().position.x, label.get_global_rect().position.y, label.size.x, label.size.y] if label != null else [], "label_focused": label.has_focus() if label != null else false, "dialog_visible": dialog.visible if dialog != null else false, "window_size": [window.size.x, window.size.y], "window_position": [window.position.x, window.position.y], "content_scale_factor": window.content_scale_factor, "screen_scale": DisplayServer.screen_get_scale(window.current_screen), "focus_name": String(focus.name) if focus != null else "", "save_path": String(main.get("manual_save_path")), "modal_input_blocked": bool(main.get("world_preview").get("modal_input_blocked"))}
|
||||||
|
if state != previous:
|
||||||
|
emit_record("state", state)
|
||||||
|
previous = state.duplicate(true)
|
||||||
|
func _exit_tree() -> void:
|
||||||
|
if log != null:
|
||||||
|
emit_record("observer_exit", {"rows": rows})
|
||||||
|
log.close()
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||||
|
"review_model_argv_verified": "claude-opus-5-5",
|
||||||
|
"limited_supported": [
|
||||||
|
"All4 preexisting manual_ui files byte-content preserved across named-slot save",
|
||||||
|
"Complete restored snapshot bytes equal stored before SAVE_LOADED completion event",
|
||||||
|
"Distinct producer/consumer and actual exit/source/default-player/cleanup guard checks"
|
||||||
|
],
|
||||||
|
"still_unaccepted": [
|
||||||
|
"All P24 unit conditions",
|
||||||
|
"Menu item ids and pointer/resume as separately pinned formal UI evidence",
|
||||||
|
"Post-load event equivalence and all-content save migration",
|
||||||
|
"Same Windows release device",
|
||||||
|
"Required final full roster, whole-unit independent review, integration/final"
|
||||||
|
],
|
||||||
|
"review_text_correction": "Reviewer said no engine process could write artifacts dir. This is inaccurate: the Root-launched observer deliberately writes events and snapshot artifacts inside its OUT directory. No filesystem/security isolation of this native observer is claimed. This correction does not assert an acceptance or change any hashes.",
|
||||||
|
"proof_sha256": "024a2cb0aba292037f281a3eea43b5eac95d773fa0517e77b32b08ef5084e7c1",
|
||||||
|
"supplement_sha256": "a7aa38caec8b6968c9bde7ddbcd359ea1ca4cc4ec6108e6e02ec04796dbce1f9",
|
||||||
|
"review_sha256": "9baa6ec7f457f6532f5f9c0fc32f9fdc2f8440918ca1944f092fca087395987b",
|
||||||
|
"new_formally_completed_delivery_units": 0,
|
||||||
|
"new_product_changes": 0,
|
||||||
|
"repeated_full_regression": 0
|
||||||
|
}
|
||||||
+1410
File diff suppressed because it is too large
Load Diff
+37
@@ -0,0 +1,37 @@
|
|||||||
|
import os,sys,uuid,json,hashlib,importlib.util,subprocess,time
|
||||||
|
from pathlib import Path
|
||||||
|
sys.dont_write_bytecode=True
|
||||||
|
R=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement')
|
||||||
|
A=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02')
|
||||||
|
OUT=A/'p24-02-native-os-preservation-consumer-r03';stage=A/'p24-02-local-native-preflight-r06/stage'
|
||||||
|
s=importlib.util.spec_from_file_location('p24_os_runner',R/'tools/run_all_tests.py');r=importlib.util.module_from_spec(s);s.loader.exec_module(r)
|
||||||
|
outer=r.module('p24_os_owned',R/'tools/regression/owned_outer.py');r.require(not outer.native.helper['live_engines'](),'external engine present')
|
||||||
|
r.require(r.read(stage.parent/'local-ended.json')['passed'],'affected local3 passed before OS')
|
||||||
|
r.require(subprocess.check_output(['git','rev-parse','HEAD'],cwd=R,text=True).strip()=='9641ed52def2ff8e5b0222449a4a83a1191e1d37','exact immutable candidate')
|
||||||
|
r.require(not subprocess.check_output(['git','status','--porcelain'],cwd=R,text=True),'candidate clean')
|
||||||
|
refs=r.source_refs(R);before=r.inventory(stage,stage=True);protected=r.default_player(R);public=(stage/'project.godot').read_bytes()
|
||||||
|
for n,pin in refs.items():r.require(r.sha(stage/n)==pin['sha256'],'tested stage source exact '+n)
|
||||||
|
profile=Path('/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os');profile_name=profile.name;r.require(profile.exists(),"actual producer owned profile exists")
|
||||||
|
r.require(__import__('shutil').disk_usage(OUT).free>=500*1024*1024,'disk admission')
|
||||||
|
base={'candidate':'9641ed52def2ff8e5b0222449a4a83a1191e1d37','source_map':{n:v['sha256'] for n,v in refs.items()},'stage':str(stage),'profile':str(profile),'owner_pid':os.getpid(),'default_before':protected,'source_before':refs,'formal_acceptance':False,'no_injected_gameplay_or_input':True,'controller_sha256':r.sha(Path(__file__)),'recorder_sha256':r.sha(OUT/'passive_os.gd')}
|
||||||
|
r.write(OUT/'started.json',base);error=None;children=[];rows=[]
|
||||||
|
try:
|
||||||
|
(stage/'project.godot').write_bytes(r.private_project(public,profile_name));env=r.fresh_environment(dict(os.environ));env['P24_OS_OUTPUT']=str(OUT)
|
||||||
|
argv=['/Applications/Godot.app/Contents/MacOS/Godot','--path',str(stage),'--script',str(OUT/'passive_os.gd')]
|
||||||
|
with (OUT/'engine-native.log').open('w') as log:
|
||||||
|
p=subprocess.Popen(argv,cwd=stage,env=env,stdout=log,stderr=subprocess.STDOUT);children.append(p)
|
||||||
|
r.write(OUT/'process-started.json',dict(base,actual_pid=p.pid,command=argv,monotonic_ns=time.monotonic_ns()))
|
||||||
|
print(json.dumps({'actual_pid':p.pid,'profile':str(profile),'events':str(OUT/'events.jsonl')}),flush=True)
|
||||||
|
p.wait(timeout=900)
|
||||||
|
r.require(p.returncode==0,'ordinary native exit0');raw=(OUT/'engine-native.log').read_text();r.require('ERROR:' not in raw and 'SCRIPT ERROR:' not in raw,'native diagnostics failed')
|
||||||
|
rows.append({'actual_pid':p.pid,'exit_code':p.returncode,'engine_ended':True,'log_sha256':r.sha(OUT/'engine-native.log')})
|
||||||
|
except BaseException as e:error=type(e).__name__+': '+str(e)
|
||||||
|
finally:
|
||||||
|
cleanup,cleanup_errors=outer.finish_captured(children);(stage/'project.godot').write_bytes(public)
|
||||||
|
guards=[]
|
||||||
|
try:
|
||||||
|
r.require(r.source_refs(R)==refs,'candidate whole source unchanged');r.require(r.inventory(stage,stage=True)==before,'whole stage source unchanged');r.require(r.default_player(R)==protected,'default player unchanged')
|
||||||
|
except BaseException as e:guards.append(type(e).__name__+': '+str(e))
|
||||||
|
r.write(OUT/'ended.json',dict(base,rows=rows,error=error,guard_errors=guards,cleanup_errors=cleanup_errors,owned_cleanup=cleanup,passed=not(error or guards or cleanup_errors) and len(rows)==1,formal_acceptance=False))
|
||||||
|
print(json.dumps({'ended':True,'error':error,'guards':guards,'rows':rows}),flush=True)
|
||||||
|
sys.exit(1 if error or guards or cleanup_errors else 0)
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
import os,sys,uuid,json,hashlib,importlib.util,subprocess,time
|
||||||
|
from pathlib import Path
|
||||||
|
sys.dont_write_bytecode=True
|
||||||
|
R=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement')
|
||||||
|
A=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02')
|
||||||
|
OUT=A/'p24-02-native-os-preservation-r03';stage=A/'p24-02-local-native-preflight-r06/stage'
|
||||||
|
s=importlib.util.spec_from_file_location('p24_os_runner',R/'tools/run_all_tests.py');r=importlib.util.module_from_spec(s);s.loader.exec_module(r)
|
||||||
|
outer=r.module('p24_os_owned',R/'tools/regression/owned_outer.py');r.require(not outer.native.helper['live_engines'](),'external engine present')
|
||||||
|
r.require(r.read(stage.parent/'local-ended.json')['passed'],'affected local3 passed before OS')
|
||||||
|
r.require(subprocess.check_output(['git','rev-parse','HEAD'],cwd=R,text=True).strip()=='9641ed52def2ff8e5b0222449a4a83a1191e1d37','exact immutable candidate')
|
||||||
|
r.require(not subprocess.check_output(['git','status','--porcelain'],cwd=R,text=True),'candidate clean')
|
||||||
|
refs=r.source_refs(R);before=r.inventory(stage,stage=True);protected=r.default_player(R);public=(stage/'project.godot').read_bytes()
|
||||||
|
for n,pin in refs.items():r.require(r.sha(stage/n)==pin['sha256'],'tested stage source exact '+n)
|
||||||
|
nonce=uuid.uuid4().hex;profile_name='TheTree-PCK-tests-'+nonce+'-p24-02-os';profile=r.profile_path(profile_name);r.require(not profile.exists(),'fresh private profile');profile.mkdir()
|
||||||
|
r.require(__import__('shutil').disk_usage(OUT).free>=500*1024*1024,'disk admission')
|
||||||
|
base={'candidate':'9641ed52def2ff8e5b0222449a4a83a1191e1d37','source_map':{n:v['sha256'] for n,v in refs.items()},'stage':str(stage),'profile':str(profile),'owner_pid':os.getpid(),'default_before':protected,'source_before':refs,'formal_acceptance':False,'no_injected_gameplay_or_input':True,'controller_sha256':r.sha(Path(__file__)),'recorder_sha256':r.sha(OUT/'passive_os.gd')}
|
||||||
|
r.write(OUT/'started.json',base);error=None;children=[];rows=[]
|
||||||
|
try:
|
||||||
|
(stage/'project.godot').write_bytes(r.private_project(public,profile_name));env=r.fresh_environment(dict(os.environ));env['P24_OS_OUTPUT']=str(OUT)
|
||||||
|
argv=['/Applications/Godot.app/Contents/MacOS/Godot','--path',str(stage),'--script',str(OUT/'passive_os.gd')]
|
||||||
|
with (OUT/'engine-native.log').open('w') as log:
|
||||||
|
p=subprocess.Popen(argv,cwd=stage,env=env,stdout=log,stderr=subprocess.STDOUT);children.append(p)
|
||||||
|
r.write(OUT/'process-started.json',dict(base,actual_pid=p.pid,command=argv,monotonic_ns=time.monotonic_ns()))
|
||||||
|
print(json.dumps({'actual_pid':p.pid,'profile':str(profile),'events':str(OUT/'events.jsonl')}),flush=True)
|
||||||
|
p.wait(timeout=900)
|
||||||
|
r.require(p.returncode==0,'ordinary native exit0');raw=(OUT/'engine-native.log').read_text();r.require('ERROR:' not in raw and 'SCRIPT ERROR:' not in raw,'native diagnostics failed')
|
||||||
|
rows.append({'actual_pid':p.pid,'exit_code':p.returncode,'engine_ended':True,'log_sha256':r.sha(OUT/'engine-native.log')})
|
||||||
|
except BaseException as e:error=type(e).__name__+': '+str(e)
|
||||||
|
finally:
|
||||||
|
cleanup,cleanup_errors=outer.finish_captured(children);(stage/'project.godot').write_bytes(public)
|
||||||
|
guards=[]
|
||||||
|
try:
|
||||||
|
r.require(r.source_refs(R)==refs,'candidate whole source unchanged');r.require(r.inventory(stage,stage=True)==before,'whole stage source unchanged');r.require(r.default_player(R)==protected,'default player unchanged')
|
||||||
|
except BaseException as e:guards.append(type(e).__name__+': '+str(e))
|
||||||
|
r.write(OUT/'ended.json',dict(base,rows=rows,error=error,guard_errors=guards,cleanup_errors=cleanup_errors,owned_cleanup=cleanup,passed=not(error or guards or cleanup_errors) and len(rows)==1,formal_acceptance=False))
|
||||||
|
print(json.dumps({'ended':True,'error':error,'guards':guards,'rows':rows}),flush=True)
|
||||||
|
sys.exit(1 if error or guards or cleanup_errors else 0)
|
||||||
@@ -254,6 +254,6 @@
|
|||||||
"validate_facility_value_contracts.py": "91640e2a76cd6cc9186f7b85c0bf379b24b6cac0d48962815235ee628e7ae43e",
|
"validate_facility_value_contracts.py": "91640e2a76cd6cc9186f7b85c0bf379b24b6cac0d48962815235ee628e7ae43e",
|
||||||
"validate_plan.py": "23678227d9b3c556f1bd903f4b5b3147c4a82ce5085e10055481026803451b80",
|
"validate_plan.py": "23678227d9b3c556f1bd903f4b5b3147c4a82ce5085e10055481026803451b80",
|
||||||
"validator_update_checks.json": "f997d0f3de2cea29550840b1d5cb23647d64f81329de46758551e2b6c8fecc27",
|
"validator_update_checks.json": "f997d0f3de2cea29550840b1d5cb23647d64f81329de46758551e2b6c8fecc27",
|
||||||
"work_packages.json": "5999f92af75ba552a5ab8021dad9fc9160dc38ca8f4fd7ef569a7307061644f1"
|
"work_packages.json": "05336558dcea0bcf95675cf51cf78642c2480271859c92bbb476c6c1e2153999"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8542,6 +8542,12 @@
|
|||||||
"sha256_at_integration": "bed152ea2d9839a90ee48c611834752a7089c89aabe4dec9e4f52ba68e47c4c0",
|
"sha256_at_integration": "bed152ea2d9839a90ee48c611834752a7089c89aabe4dec9e4f52ba68e47c4c0",
|
||||||
"scope": "Actual separate Opus review changes_requested; only P18-C-1 met",
|
"scope": "Actual separate Opus review changes_requested; only P18-C-1 met",
|
||||||
"current_game_acceptance_inferred": false
|
"current_game_acceptance_inferred": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/plans/original-completion-2026-10-02/execution/p18-01-contract-r01/review-context-dependencies-r02.json",
|
||||||
|
"sha256_at_integration": "740d560af709c5367c364357cc347191235015922b6ed1980010988fe221b25f",
|
||||||
|
"scope": "No LLM/product changes: whole unchanged legacy state + complete remove/retire/despawn dependency context pinned; review guard348274<500000; findings unclosed",
|
||||||
|
"current_game_acceptance_inferred": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"updated_at_jst": "2026-10-13T15:41:12.706527+09:00",
|
"updated_at_jst": "2026-10-13T15:41:12.706527+09:00",
|
||||||
@@ -15684,7 +15690,7 @@
|
|||||||
},
|
},
|
||||||
"legacy_state": "in_progress",
|
"legacy_state": "in_progress",
|
||||||
"state_scope": "package-level; completed means whole package accepted; partial implementation is not completion",
|
"state_scope": "package-level; completed means whole package accepted; partial implementation is not completion",
|
||||||
"current_summary": "P24-03正式完了済み。P24-02は追加repair1の直接許可を反映、repairs3/3で固定9641ed52。通常新規保存入口と原本NTR警告文を実装。全GDparse/局所3 167PASS、通常メニュー実IME取消確定→日本語名保存→別PID33760→34817通常読込、保全違反0。限定差分独立Opus review PASS(全条件正式reviewの代用なし)。全8受入/上流実生成/最終full/統合/Windows未了。",
|
"current_summary": "P24-03正式完了済み。P24-02固定9641ed52/修正3/3の局所3 167・通常menu実IME保存別PID読込証拠を保持。追加通常playの受付工事70percent/min444を旧slotへ保存し別名保存、旧4files全byte保全、別PID39701→40866復元直後全snapshot118528B一致を証明。資料補完後の別Opus限定reviewPASS。全8/上流/最終full/正式review/統合/Windows未了。",
|
||||||
"remaining_deliverables": [
|
"remaining_deliverables": [
|
||||||
{
|
{
|
||||||
"id": "P24-01",
|
"id": "P24-01",
|
||||||
@@ -15785,16 +15791,40 @@
|
|||||||
"sha256_at_integration": "399c5de44b08da76c41262115d0dd43c66b97b5256c5d5c46533f2b30d7d01da",
|
"sha256_at_integration": "399c5de44b08da76c41262115d0dd43c66b97b5256c5d5c46533f2b30d7d01da",
|
||||||
"scope": "Separate real Opus5.5 limited third-repair delta PASS; whole8/formal Runner review false",
|
"scope": "Separate real Opus5.5 limited third-repair delta PASS; whole8/formal Runner review false",
|
||||||
"current_game_acceptance_inferred": false
|
"current_game_acceptance_inferred": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
|
||||||
|
"sha256_at_integration": "024a2cb0aba292037f281a3eea43b5eac95d773fa0517e77b32b08ef5084e7c1",
|
||||||
|
"scope": "Exact9641ed52 normal placement/construction and Root-verified4file preservation/full restored snapshot bytes; scenario/phase limited",
|
||||||
|
"current_game_acceptance_inferred": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/preservation-provenance-supplement-r04.json",
|
||||||
|
"sha256_at_integration": "a7aa38caec8b6968c9bde7ddbcd359ea1ca4cc4ec6108e6e02ec04796dbce1f9",
|
||||||
|
"scope": "Actual retained full before/after captures, all4 live rehash, file metadata/native tick ordering; no new engines",
|
||||||
|
"current_game_acceptance_inferred": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/independent-preservation-evidence-review-r04.json",
|
||||||
|
"sha256_at_integration": "9baa6ec7f457f6532f5f9c0fc32f9fdc2f8440918ca1944f092fca087395987b",
|
||||||
|
"scope": "Separate actual Opus5.5 limited evidence pass after supplemental data; first rejection preserved",
|
||||||
|
"current_game_acceptance_inferred": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/preservation-evidence-disposition-r04.json",
|
||||||
|
"sha256_at_integration": "93d68e05efcec1ccfbb90364715b9593677c9236fde0ced9081daee8f637d3ef",
|
||||||
|
"scope": "Root limitation and reviewer inaccurate isolation-claim correction; no whole-unit acceptance",
|
||||||
|
"current_game_acceptance_inferred": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"updated_at_jst": "2026-10-13T15:41:12.706527+09:00",
|
"updated_at_jst": "2026-10-13T16:01:11.405642+09:00",
|
||||||
"progress_summary": "P24-03正式完了済み。P24-02は追加repair1の直接許可を反映、repairs3/3で固定9641ed52。通常新規保存入口と原本NTR警告文を実装。全GDparse/局所3 167PASS、通常メニュー実IME取消確定→日本語名保存→別PID33760→34817通常読込、保全違反0。限定差分独立Opus review PASS(全条件正式reviewの代用なし)。全8受入/上流実生成/最終full/統合/Windows未了。",
|
"progress_summary": "P24-03正式完了済み。P24-02固定9641ed52/修正3/3の局所3 167・通常menu実IME保存別PID読込証拠を保持。追加通常playの受付工事70percent/min444を旧slotへ保存し別名保存、旧4files全byte保全、別PID39701→40866復元直後全snapshot118528B一致を証明。資料補完後の別Opus限定reviewPASS。全8/上流/最終full/正式review/統合/Windows未了。",
|
||||||
"remaining_gaps": [
|
"remaining_gaps": [
|
||||||
"固定9641ed52で全GDparse/局所3 167、通常menu実IME未確定/取消/確定/日本語表示名保存/別PID通常読込を取得。全世界状態一致、無効入力feedback、表示倍率の全適用条件は残る。古い666c証拠は自動転用せずsource/config/input適用を照合。",
|
"固定9641ed52の局所3/167、通常menu実IME取消確定・保存・別PID読込を保持。追加受付工事の実playで旧slot4files全内容保全と復元直後全snapshot byte一致を取得、別Opus資料補完reviewPASS。これは単一scenario/復元直後phaseのみ。全人物・関係・eventの保存移行/再開とpost-event重複、invalid feedback、倍率の全条件は残る。",
|
||||||
"原本通りNTR開始警告文へ復旧済み。自然NTR生成はP18-01/02、3決闘と結果保存はP19-01、自然防衛はP21-01の受入が必要。fixture注入を通常実証に替えない。",
|
"原本通りNTR開始警告文へ復旧済み。自然NTR生成はP18-01/02、3決闘と結果保存はP19-01、自然防衛はP21-01の受入が必要。fixture注入を通常実証に替えない。",
|
||||||
"配置/無効drop、モーダル停止再開、実状態フキダシ、ログ順序/再開重複、重要警告、click代替、IME/倍率、最終検証reviewの全8条件を候補版付きで揃える。",
|
"配置/無効drop、モーダル停止再開、実状態フキダシ、ログ順序/再開重複、重要警告、click代替、IME/倍率、最終検証reviewの全8条件を候補版付きで揃える。",
|
||||||
"最終版の必須全回帰・全条件独立Opusレビュー・現在main統合/最終検証・同一Windows配布版実機未了。今回差分reviewは全条件reviewの代用ではない。",
|
"最終版の必須全回帰・全条件独立Opusレビュー・現在main統合/最終検証・同一Windows配布版実機未了。今回差分reviewは全条件reviewの代用ではない。",
|
||||||
"限定差分独立reviewはPASS。追加観測残件: 既存manual_uiの前後hash、全world digest復元一致、invalid label表示とDEL扱い、実盾0/NTR文言、通常id3の自動試験。後2つの提案は承認済み範囲内で必要性を判断し、新仕様/未知値を作らない。"
|
"限定差分独立reviewはPASS。追加観測残件: 単一受付scenarioの旧4files保全/全snapshot一致は限定独立review済み。残る全内容保存移行とpost-event照合、invalid label表示とDEL扱い、実盾0/NTR文言、通常id3の自動試験。後2つの提案は承認済み範囲内で必要性を判断し、新仕様/未知値を作らない。"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user