Record P24 approved repair and normal OS evidence; preserve P18 review gaps
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
# P24-02 現在候補と次の依存成果単位
|
||||
|
||||
候補9641ed52def2ff8e5b0222449a4a83a1191e1d37、修正3/3。同一GUI担当の追加修正を通常Runnerで提出。原成果単位の受入条件はdocs/spec/acceptance/P24-02-code-r01.jsonの全8件を保持。30パッケージ/88成果単位・部分点なし、今回の新規正式完了0。製品main未採用。
|
||||
|
||||
| 条件ID | 現証拠と不足・依存 |
|
||||
|---|---|
|
||||
| placement_and_invalid_drop | 既存666cの原本配置/スタッフ局所証拠はsource/config/input一致を確認した範囲のみ再利用。通常有効1回、無効説明・台帳/選択保全とclick代替の現候補証拠を揃える。 |
|
||||
| modal_and_pause_resume | 9641の操作通知局所58PASSと実OS保存dialogのblock解除を取得。全modal取消確定/背後操作/保留command/実時間停止再開を条件別に照合。 |
|
||||
| unit_bubbles | 666cからproduct bindingは今回未変更。全対象実状態/切替/除去の現候補適用根拠を追加、fixtureのみで完了にしない。 |
|
||||
| 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は通常実証に替えない。 |
|
||||
| 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配布版実機は未達。 |
|
||||
| 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証拠の自動継承や重複全回帰は行っていない。
|
||||
|
||||
次に閉じる依存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/保存破損等の必須性を優先する。未確定の関係値・数値・仕様は作らない。
|
||||
@@ -15,3 +15,7 @@ Claude Opus5.5の記録済み判断で、同じ登録タスク/既存worktreeを
|
||||
追補r05: 状態遷移履歴を整合させた新候補はimport/全GD parse/局所・影響7スイート477checks PASS、source/player/cleanup違反0。通常Runner submitで666c87bd7d7c961ae6d7d2ad8d52d6456c31015bに固定。提出後1313全source map差0とcleanを確認し局所証拠の適用を固定。候補branch codex/p24-02-operations-candidate-r03へpush済み、製品mainには未統合。全8通常実証/上流NTR・決闘/最終full/別Opus review/統合・最終は未了で、P24-02正式完了には数えない。
|
||||
|
||||
実OS追補: 固定666c87bdの実IME未確定・取消・確定、表示名テストの所有暗号slot保存、別PID80764→83514の通常一覧/通常読込を[限定観測記録](native-os-input-r01/observations.json)へ固定。dialog活性化は診断F8であり通常入口不足は未受入。3行差分案とP24-02追加repair1の回答待ち。全世界状態再開/実NTR・決闘/最終full/review/Windowsは未了のまま。
|
||||
|
||||
追補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の通常一覧から選択。
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"review_scope": "Independent read-only review ONLY of owner-approved third repair delta; never whole P24 acceptance or Runner formal review substitution",
|
||||
"result": {
|
||||
"status": "passed",
|
||||
"summary": "I reviewed only the third-repair delta at 9641ed52 (scenes/main/main.gd plus the owner direction file), without tool use. This review does not accept P24-02 as a whole: the eight P24 conditions, the ordinary upstream NTR/duel/defense flow, the full roster review, final integration and Windows all remain incomplete.\n\nVerdict: the limited delta is correct. The OS evidence supports the menu-to-IME-to-save-to-load path. No problem was found that blocks it. The gaps listed in the findings are things not yet proven and are not defects in the delta.\n\nSource correctness: The applied diff matches owner-direction r04. That file also contains a blank-line-for-blank-line hunk that changes nothing, so its absence from the actual diff is harmless. The `id_pressed` lambda still closes on its last branch, the same pattern as before. The new id 3 calls `_ensure_manual_save_slots().show_new_save(manual_save_path)`. That dialog is added to the tree before it is returned, so its `_ready` controls exist when `show_new_save` runs. No gameplay values, conditions or save logic changed.\n\nOrdinary menu reachability: The menu label is now 「保存・読込 ▾」 and item 3 「新しい名前で別スロット保存」 sits in the existing bottom-bar MenuButton. The OS run reached it with native mouse clicks only, with no F8 or controller entry.\n\nIds 0/1/2: unchanged. They still call `_load_manual`, `_preview_dimension_migration` and `_show_manual_load_slots`.\n\nOld-save preservation (from the code): The new slot path is `manual_ui_` plus 32 hex characters from OS crypto. Freshness is checked three times: when the dialog opens, when the player confirms, and again in `_save_new_manual_slot`, which also requires the same folder as the current save. `save_to_path` only writes the new path, and `manual_save_path` switches to it only after a successful save. So the original package is never written by this path.\n\nOptional Japanese display_name: The name box accepts Japanese, holds at most 60 characters, and rejects control characters. A blank or space-only name falls back to the default name.\n\nNTR wording: The heading and message now say 「NTR侵食開始」 and 「愛の盾が破られ、NTR侵食が始まりました」. This matches original §7.2 (耐久値0でブレイクし、NTR侵食が始まる). It also stops confusing the break with 「消滅」, which in §7.3-4 happens only at 陥落確定. The trigger condition (old>0, new==0) is unchanged.\n\nOS evidence: Two separate processes ran (PIDs 33760 and 34817). Events show IME composition 「テスト」, a cancel that left both the composition and the field empty, then a commit that put 「テスト」 in the field. The saved manifest has display_name 「テスト」 and save_id manual_ui_5e9f8ca3662a2ddf42984ba1403675a7, which fits the owned-name pattern. The second process reported that slot as its save path with the dialog closed. Evidence limits are stated in the findings.",
|
||||
"findings": [
|
||||
"Not proven, not blocking: old-save preservation rests on the code only. The OS evidence has no before/after hash of a pre-existing `user://saves/manual_ui` package, and nothing shows such a package existed when the run started. To prove it in the OS run, record the manifest.json and world.bin hashes of manual_ui before and after the new-slot save.",
|
||||
"Not proven: the saved state is trivial (day 1, absolute_minute 360, a fresh opening world), and whole_world_equality_proven=false. The second process loaded the slot, but nothing shows its world digest equals checksum_world 99e450e0…. The evidence also does not say whether that load went through id 2 (choosing the slot) or id 0.",
|
||||
"Test gap: tests/ui/test_operations_notification.gd fires a synthetic RELATIONSHIP_SHIELD_CHANGED event with old_value/new_value and checks only that the cut-in becomes visible. It never checks the new heading or message text, and none of the shown code proves that the real relationship service publishes those payload keys. Add an assertion on the cut-in text, and one upstream test where a real shield reaches 0, as part of the still-pending NTR acceptance work.",
|
||||
"Test gap: no automated test selects SaveLoadMenu id 3 through `get_popup().id_pressed`. The test calls `_ensure_manual_save_slots()` directly, so only the manual OS run covers the menu entry. Consider adding a headless test that triggers id 3 and checks that the dialog is in new-save mode.",
|
||||
"Minor, not blocking: the comment above the cut-in (`# Existing love-shield vanishing transition`) still says 'vanishing', which no longer matches the corrected 'break → NTR侵食開始' wording. Consider rewording it in a later approved repair, since owner-direction r04 limits this repair to its exact patch.",
|
||||
"Minor, outside this delta: in ManualSaveSlotsDialog, the error branch of `_confirm_choice` sets an error message, but Godot hides the dialog when OK is pressed, so the player never sees it. That branch also returns without `_clear_choice`. It is reachable only if the field text is set by code, because `text_changed` already disables OK. `is_valid_label_text` also lets DEL (0x7F) through.",
|
||||
"Scope limits: the OS evidence comes only from macOS with Retina scaling (screen_scale 2.0) and does not prove the Windows build; full_regression=false; the local result (3 suites / 167 checks) was reviewed by hash only, not by its contents. This review does not replace the Runner's formal review and does not accept the original unit or P24-02 as a whole."
|
||||
],
|
||||
"whole_unit_accepted": false
|
||||
},
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p24-02-operations/runs/ae7e8b1892ca49fa8d64d5cf01cdf042",
|
||||
"model": "claude-opus-5-5",
|
||||
"formal_runner_review": false,
|
||||
"whole_unit_accepted": false,
|
||||
"actual_argv_model_verified": true,
|
||||
"evidence_annotation_after_review": "Consumer id2 observed menu clarified; no source or raw evidence changed. Pre-existing-slot OS preservation remains false."
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
import importlib.util,hashlib,json,os,shutil,sys,uuid
|
||||
from pathlib import Path
|
||||
sys.dont_write_bytecode=True
|
||||
ROOT=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement')
|
||||
OUT=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06')
|
||||
spec=importlib.util.spec_from_file_location('p24_existing_native_runner',ROOT/'tools/run_all_tests.py');r=importlib.util.module_from_spec(spec);spec.loader.exec_module(r)
|
||||
paths=['tests/ui/test_operations_notification.gd','tests/ui/test_event_log_ui.gd','tests/ui/test_selection_autosave.gd']
|
||||
import subprocess
|
||||
candidate=subprocess.check_output(['git','rev-parse','HEAD'],cwd=ROOT,text=True).strip()
|
||||
r.require(len(sys.argv)==2 and candidate==sys.argv[1], 'exact expected submitted commit')
|
||||
dirty_status=subprocess.check_output(['git','status','--porcelain'],cwd=ROOT,text=True)
|
||||
r.require(not dirty_status, 'submitted candidate clean')
|
||||
# Preflight only: exact source map and ordinary guards remain; no submitted-version acceptance.
|
||||
|
||||
refs=r.source_refs(ROOT);before=refs;expected={n:{'bytes':v['bytes'],'sha256':v['sha256']} for n,v in refs.items()};policy=r.read(ROOT/'tools/regression/suite-policy.json');r.policy_coverage(paths,refs,policy)
|
||||
markers=r.module('p24_local_markers',ROOT/'tools/strict_test_markers.py');cp=ROOT/'docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json';contracts=markers.load_contracts(cp)
|
||||
outer=r.module('p24_local_owned_outer',ROOT/'tools/regression/owned_outer.py');r.require(not outer.native.helper['live_engines'](),'another Godot is live');r.require(shutil.disk_usage(OUT.parent).free>=500*1024*1024,'local admission free>=500MiB')
|
||||
OUT.mkdir(parents=True,exist_ok=False);stage=OUT/'stage';stage.mkdir();(OUT/'starters').mkdir();(OUT/'bootstrap').mkdir()
|
||||
for n,pin in r.read(ROOT/'tools/regression/bootstrap-scripts.json').items():
|
||||
data=pin['text'].encode();r.require(hashlib.sha256(data).hexdigest()==pin['sha256'],'bootstrap exact');(OUT/'bootstrap'/n).write_bytes(data)
|
||||
for n,pin in refs.items():
|
||||
target=stage/n;target.parent.mkdir(parents=True,exist_ok=True);r.copy_source(Path(pin['path']),target)
|
||||
r.require(r.inventory(stage,stage=True)==expected,'whole separate CoW stage exact')
|
||||
protected=r.default_player(ROOT);public=(stage/'project.godot').read_bytes();parse=['res://'+n for n in sorted(refs) if n.endswith('.gd')];r.write(OUT/'parse-paths.json',parse)
|
||||
selected={'root_before':before,'map':{n:p['sha256'] for n,p in refs.items()},'timeout':300};engine='/Applications/Godot.app/Contents/MacOS/Godot'
|
||||
r.write(OUT/'runner-input.json',{'protocol':'guarded-operations-local-v1','full_regression':False,'source_commit':candidate,'source_state':'exact submitted local affected verification; not whole-unit acceptance','dirty_status':dirty_status,'selected_source_map':selected['map'],'roster':paths,'full_roster':r.roster(ROOT),'owner_runner_pid':os.getpid(),'stage':str(stage),'default_player_before':protected,'engine':engine,'engine_sha256':r.sha(engine),'marker_contract_sha256':r.sha(cp),'execution_controller_sha256':r.sha(Path(__file__)),'existing_phase_controller_sha256':r.sha(ROOT/'tools/run_all_tests.py')})
|
||||
diagnostics=r.module('p24_local_diagnostics',ROOT/'tools/regression/diagnostic_gate.py');owners=r.module('p24_local_owners',ROOT/'tools/regression/ordinary_proof_gate.py');audio=r.module('p24_local_audio',ROOT/'tools/regression/audio_evidence_gate.py')
|
||||
rows=[];phases=[];previous={};error=None
|
||||
try:
|
||||
for label,test in [('import',None),('parse',None)]+[(str(i).zfill(3),n)for i,n in enumerate(paths)]:
|
||||
row=r.execute_phase(engine,stage,OUT,label,test,selected,expected,previous,policy,contracts,parse,public,protected,ROOT,outer,markers,diagnostics,owners,audio);phases.append(row)
|
||||
if test:rows.append(row)
|
||||
print(json.dumps({'phase':label,'test':test,'passed':row['passed'],'actual_pid':row.get('actual_pid'),'checks':row.get('reported_checks'),'error':row.get('validation_error') or row.get('guard_error')},ensure_ascii=False),flush=True)
|
||||
r.require(row['passed'],'first local phase failure; no retry')
|
||||
except BaseException as e:error=type(e).__name__+': '+str(e)
|
||||
finally:cleanup,cleanup_errors=outer.finish_captured(outer.OWNED)
|
||||
guards=[]
|
||||
try:
|
||||
r.require(r.source_refs(ROOT)==before,'whole source unchanged');r.require(r.default_player(ROOT)==protected,'default player unchanged');r.require(r.inventory(stage,stage=True)==dict(expected,**previous),'whole stage and generated file set exact')
|
||||
except BaseException as e:guards.append(type(e).__name__+': '+str(e))
|
||||
passed=not error and not guards and not cleanup_errors and len(phases)==len(paths)+2 and all(x['passed'] for x in phases)
|
||||
r.write(OUT/'local-ended.json',{'protocol':'guarded-operations-local-v1','full_regression':False,'passed':passed,'error':error,'guard_errors':guards,'cleanup_errors':cleanup_errors,'final_owned_cleanup':cleanup,'actual_captured_pids':[p.pid for p in outer.OWNED],'phases':phases,'rows':rows,'original_unit_accepted':False,'preflight_only':True,'OS_input_executed':False,'cross_process_executed':False,'independent_review_executed':False})
|
||||
print(json.dumps({'selected_local_passed':passed,'executed_suites':len(rows),'planned_local_suites':len(paths),'error':error,'guard_errors':guards,'cleanup_errors':cleanup_errors,'full_regression':False}),flush=True)
|
||||
sys.exit(0 if passed else 1)
|
||||
+233
@@ -0,0 +1,233 @@
|
||||
{
|
||||
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"scope": "Actual ordinary menu + OS IME cancel/confirm + Japanese display_name save + distinct-process ordinary load; not whole P24 acceptance",
|
||||
"actual_pids": [
|
||||
33760,
|
||||
34817
|
||||
],
|
||||
"normal_entry_observed": "SaveLoadMenu → 新しい名前で別スロット保存; native CUA coordinate clicks, no F8/controller entry",
|
||||
"passive_recorder_has_no_dialog_entry_or_gameplay_injection": true,
|
||||
"ime_preedit_event": {
|
||||
"kind": "state",
|
||||
"pid": 33760,
|
||||
"ticks_msec": 88102,
|
||||
"value": {
|
||||
"content_scale_factor": 1.0,
|
||||
"dialog_visible": true,
|
||||
"focus_name": "",
|
||||
"ime_selection": [
|
||||
3,
|
||||
0
|
||||
],
|
||||
"ime_text": "テスト",
|
||||
"label_focused": true,
|
||||
"label_rect": [
|
||||
8.0,
|
||||
87.0,
|
||||
504.0,
|
||||
32.0
|
||||
],
|
||||
"label_text": "",
|
||||
"modal_input_blocked": true,
|
||||
"save_path": "user://saves/manual_ui",
|
||||
"screen_scale": 2.0,
|
||||
"window_position": [
|
||||
1664,
|
||||
574
|
||||
],
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
]
|
||||
}
|
||||
},
|
||||
"ime_cancel_event": {
|
||||
"kind": "state",
|
||||
"pid": 33760,
|
||||
"ticks_msec": 128480,
|
||||
"value": {
|
||||
"content_scale_factor": 1.0,
|
||||
"dialog_visible": true,
|
||||
"focus_name": "",
|
||||
"ime_selection": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"ime_text": "",
|
||||
"label_focused": true,
|
||||
"label_rect": [
|
||||
8.0,
|
||||
87.0,
|
||||
504.0,
|
||||
32.0
|
||||
],
|
||||
"label_text": "",
|
||||
"modal_input_blocked": true,
|
||||
"save_path": "user://saves/manual_ui",
|
||||
"screen_scale": 2.0,
|
||||
"window_position": [
|
||||
1664,
|
||||
574
|
||||
],
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
]
|
||||
}
|
||||
},
|
||||
"ime_commit_event": {
|
||||
"kind": "state",
|
||||
"pid": 33760,
|
||||
"ticks_msec": 140213,
|
||||
"value": {
|
||||
"content_scale_factor": 1.0,
|
||||
"dialog_visible": true,
|
||||
"focus_name": "",
|
||||
"ime_selection": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"ime_text": "",
|
||||
"label_focused": true,
|
||||
"label_rect": [
|
||||
8.0,
|
||||
87.0,
|
||||
504.0,
|
||||
32.0
|
||||
],
|
||||
"label_text": "テスト",
|
||||
"modal_input_blocked": true,
|
||||
"save_path": "user://saves/manual_ui",
|
||||
"screen_scale": 2.0,
|
||||
"window_position": [
|
||||
1664,
|
||||
574
|
||||
],
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
]
|
||||
}
|
||||
},
|
||||
"consumer_loaded_event": {
|
||||
"kind": "state",
|
||||
"pid": 34817,
|
||||
"ticks_msec": 62760,
|
||||
"value": {
|
||||
"content_scale_factor": 1.0,
|
||||
"dialog_visible": false,
|
||||
"focus_name": "",
|
||||
"ime_selection": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"ime_text": "",
|
||||
"label_focused": false,
|
||||
"label_rect": [
|
||||
8.0,
|
||||
8.0,
|
||||
460.0,
|
||||
32.0
|
||||
],
|
||||
"label_text": "",
|
||||
"modal_input_blocked": false,
|
||||
"save_path": "user://saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7",
|
||||
"screen_scale": 2.0,
|
||||
"window_position": [
|
||||
1664,
|
||||
574
|
||||
],
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
]
|
||||
}
|
||||
},
|
||||
"profile": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os",
|
||||
"save_path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os/saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7",
|
||||
"saved_manifest": {
|
||||
"absolute_minute": 360,
|
||||
"checkpoint_reason": "manual",
|
||||
"checksum_world": "99e450e0dc232d885539636cadd29338e7b3634c42d296cf8fea7c1f0767b9e0",
|
||||
"content_pack_ids": [],
|
||||
"created_at_real": "2026-10-13T06:35:55",
|
||||
"day": 1,
|
||||
"display_name": "テスト",
|
||||
"enabled_filter_profile": "default",
|
||||
"format_version": 1,
|
||||
"game_version": "0.1.0",
|
||||
"interface_selection": {
|
||||
"guest_open": false,
|
||||
"id": "",
|
||||
"kind": "",
|
||||
"product_open": false,
|
||||
"product_tab": "purchase",
|
||||
"staff_id": "",
|
||||
"staff_open": false,
|
||||
"version": 1
|
||||
},
|
||||
"save_id": "manual_ui_5e9f8ca3662a2ddf42984ba1403675a7",
|
||||
"seed": 20260827,
|
||||
"uncompressed_size": 80292,
|
||||
"updated_at_real": "2026-10-13T06:35:55"
|
||||
},
|
||||
"evidence": [
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/started.json",
|
||||
"sha256": "d40a0252aa547b049d30cdc9a15774131438b2535f808ead128f0f86f7bf5954"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/process-started.json",
|
||||
"sha256": "5ba807e0ee65944815542648108322586f4730b074abebb0b117dd61071140b1"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/ended.json",
|
||||
"sha256": "0b188dcb42995ee09205f233116665cbf54f59a7d1e93f9d2aafc07779ae19a3"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/events.jsonl",
|
||||
"sha256": "efa3f0eca8bf0001edc89041d968a0fdf9f474ddd5a6803db2a138e4dfd53cc5"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/passive_os.gd",
|
||||
"sha256": "66e60f81f836fe648f9011660d0255f5c4b780bfdacc820829c90bb655022880"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/started.json",
|
||||
"sha256": "64ad63ae5b4339cd639f2d22fa076caa7d8d3f9501337fadadc1d4dcfcbbe2d0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/process-started.json",
|
||||
"sha256": "f116952d77720858065576f41df7116f384801e6c27acb6cf339a329589627b0"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/ended.json",
|
||||
"sha256": "22d0ffd1ea18c06a46dc7aa977613385d3ae5f4a81dab9ed4650f9c10d044d68"
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/events.jsonl",
|
||||
"sha256": "369eb5e182fcf5b21693380198df187654b508e288c08f6ecb0d3aa6af4ec0ca"
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os/saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7/manifest.json",
|
||||
"sha256": "e8537a6f6cba53683cca36794adc08f7c5958b78ced74fa06e499a3f8c123e4a"
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os/saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7/world.bin",
|
||||
"sha256": "0424074b51f327ffb3ce3dc8e92ccb2d9d04d657db6e1461cdb83541f1cc0bee"
|
||||
}
|
||||
],
|
||||
"whole_world_equality_proven": false,
|
||||
"windows_same_distribution_proven": false,
|
||||
"full_regression": false,
|
||||
"independent_review": false,
|
||||
"original_unit_accepted": false,
|
||||
"local_affected_result": {
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06/local-ended.json",
|
||||
"sha256": "a49a9229bc3bde09aebff72daafbfe99d159da9bf1dfc702b036640946654b64",
|
||||
"suites": 3,
|
||||
"checks": 167
|
||||
},
|
||||
"observed_consumer_menu": "保存・読込 → 保存スロットを選んで読込 (id2), list displayed1.テスト → 選んで読込; native CUA clicks",
|
||||
"preexisting_manual_ui_preservation_OS_proven": false
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"source": "Direct human reply to question call_b952d3898d2b4870bf6f46ec5000086d item0",
|
||||
"answer": "P24-02の追加1回を許可する",
|
||||
"task": "P24-02",
|
||||
"project": "the-tree-p24-02-operations",
|
||||
"scope": "Only this task max_repair_attempts2→3; retain repairs2; add ordinary Japanese save-label entry preserving quick save, random-owned paths and old saves. No RP24/P18/cost/rights/global cap authorization.",
|
||||
"previous_cap": 2,
|
||||
"new_cap": 3,
|
||||
"repairs": 2,
|
||||
"state": "submitted",
|
||||
"candidate": "666c87bd7d7c961ae6d7d2ad8d52d6456c31015b",
|
||||
"global_policy_unchanged": true
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
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
|
||||
func _ready() -> void:
|
||||
log = FileAccess.open(out_dir.path_join("events.jsonl"), FileAccess.WRITE)
|
||||
emit_record("started", {"pid": OS.get_process_id(), "platform": OS.get_name(), "candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37", "source": "passive_root_normal_menu_observation_not_whole_acceptance"})
|
||||
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()
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"task": "P24-02",
|
||||
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"previous_candidate": "666c87bd7d7c961ae6d7d2ad8d52d6456c31015b",
|
||||
"repairs": 3,
|
||||
"maximum": 3,
|
||||
"GUI_worker_observed_model": "Claude Opus 5.5 Medium",
|
||||
"normal_Runner_submit": true,
|
||||
"source_delta": "5 insertions/3 deletions main.gd; coordinator instructions retained in allowed docs",
|
||||
"original_unit_accepted": false
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"candidate": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"source_files": 1313,
|
||||
"local_suites": 3,
|
||||
"local_checks": 167,
|
||||
"parse_passed": true,
|
||||
"passed": true,
|
||||
"actual_pids": [
|
||||
33175,
|
||||
33269,
|
||||
33318,
|
||||
33335,
|
||||
33360
|
||||
],
|
||||
"guard_errors": [],
|
||||
"cleanup_errors": [],
|
||||
"evidence": [
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06/local-ended.json",
|
||||
"sha256_at_integration": "a49a9229bc3bde09aebff72daafbfe99d159da9bf1dfc702b036640946654b64",
|
||||
"scope": "exact candidate local affected execution",
|
||||
"current_game_acceptance_inferred": false
|
||||
},
|
||||
{
|
||||
"path": "artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06/runner-input.json",
|
||||
"sha256_at_integration": "577442ab27679b03c4c25a8b0d362aed871599d7c37675aaafd41fa80579dd70",
|
||||
"scope": "whole source map and candidate environment",
|
||||
"current_game_acceptance_inferred": false
|
||||
}
|
||||
],
|
||||
"whole_unit_accepted": false,
|
||||
"full_regression": false
|
||||
}
|
||||
+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-ime-normal-consumer-r02';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-393c3655f3e84483b9c24fd5d2955dd2-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-ime-normal-r02';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)
|
||||
Reference in New Issue
Block a user