P24-03: 選択と保存の受入
This commit is contained in:
@@ -2,6 +2,17 @@
|
||||
"schema_version": 1,
|
||||
"scope": "exact per-suite completion label/schema; all check counts from actual raw only",
|
||||
"rows": [
|
||||
{
|
||||
"test": "tests/ui/test_selection_departure.gd",
|
||||
"template": "Selection departure: <checks> checks, <failures> failures",
|
||||
"required": true,
|
||||
"fixed_check_count_used": false,
|
||||
"source_sha256_at_schema_audit": "b43f3fa05e5ab0320e94e317ae75e880746d8557a69ea43bb6a40e93827a4eaf",
|
||||
"authority": {
|
||||
"path": "docs/spec/acceptance/P24-03-code-r02.json",
|
||||
"scope": "new local suite source marker; actual execution pending"
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "tests/business/test_business_closure.gd",
|
||||
"template": "Business closure: <checks> checks, <failures> failures",
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"scope": "JSON numeric metadata type diagnostic only; no game acceptance",
|
||||
"actual_pid": 99508,
|
||||
"exit_code": 0,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/private/tmp/the-tree-p24-json-c200043b18364206b2ca6f61179c4d62",
|
||||
"--script",
|
||||
"/private/tmp/the-tree-p24-json-c200043b18364206b2ca6f61179c4d62/probe.gd",
|
||||
"--log-file",
|
||||
"/private/tmp/the-tree-p24-json-c200043b18364206b2ca6f61179c4d62/engine.log"
|
||||
],
|
||||
"raw": "Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org\n\n{\"engine_version\":{\"build\":\"official\",\"hash\":\"ed1daf0bf001b61586d9930840f2f1394092c079\",\"hex\":263938,\"major\":4,\"minor\":7,\"patch\":2,\"status\":\"stable\",\"string\":\"4.7.2-stable (official)\",\"timestamp\":0},\"is_float\":true,\"is_int\":false,\"profile\":\"/Users/korizatou114/Library/Application Support/TheTree-P24-JSON-5a698892c27c477f828a12f1841d8637\",\"version_value\":1.0}\n",
|
||||
"probe_sha256": "2b6cba8ceee004d1788f69ba27cba73ebcb049dcce418baa9048400969cd5d34",
|
||||
"finding": {
|
||||
"severity": "high",
|
||||
"file": "scenes/main/main.gd",
|
||||
"functions": [
|
||||
"_restore_interface_selection",
|
||||
"_restore_actor_interface_selection"
|
||||
],
|
||||
"candidate_observed": "not selection.get(\"version\", 0) is int",
|
||||
"impact": "SaveService._read_manifest JSON.parse_string produces 1.0 FLOAT, so normal version1 metadata will be silently rejected and valid selections lost.",
|
||||
"required_original_behavior": "accept numeric exact1 from normal JSON while rejecting bool/string/non1 version; preserve old optional metadata fallback",
|
||||
"acceptance_cases": [
|
||||
"normal saved JSON version1 decoded asfloat must restore map/staff/guest selection",
|
||||
"bool true version must not count asnumeric1",
|
||||
"1.5/string1/wrongtype safely ignored",
|
||||
"no changes to gameplay snapshot or SaveService format needed"
|
||||
]
|
||||
},
|
||||
"read_only_review_report": true,
|
||||
"root_product_source_edits": 0
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"source_map": {},
|
||||
"artifacts": {},
|
||||
"conditions": {
|
||||
"facility_lifecycle": {"status": "pending", "source_map": {}, "artifacts": []},
|
||||
"guest_lifecycle": {"status": "pending", "source_map": {}, "artifacts": []},
|
||||
"staff_lifecycle": {"status": "pending", "source_map": {}, "artifacts": []},
|
||||
"layer_and_values": {"status": "pending", "source_map": {}, "artifacts": []},
|
||||
"invalid_and_failed_load": {"status": "pending", "source_map": {}, "artifacts": []},
|
||||
"normal_os_input": {"status": "pending", "source_map": {}, "artifacts": []},
|
||||
"final_validation_review": {"status": "pending", "source_map": {}, "artifacts": []}
|
||||
},
|
||||
"formal_acceptance": false,
|
||||
"native_Windows": "pending"
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
# P24-03 code-role 提出
|
||||
|
||||
要件・受入ID: P24-03。基準commit: 286730f88ce430a1cbe1501d40361188f832d235。
|
||||
固定仕様: `docs/spec/acceptance/P24-03-code-r02.json`。
|
||||
提出状態は submitted。元88成果の1件の完了はRunnerと独立レビューが確定する。
|
||||
|
||||
## 変更と再利用
|
||||
|
||||
- Mainの施設・客・職員metadataのversion判定に数値型を要求。Godot JSONが返す数値1.0は互換性のため許可し、bool/string/非整数値を拒否。
|
||||
- 客panelの空選択時にOptionButtonを明示的に未選択にする。既存在館一覧・退館状態表示・履歴分離を維持。
|
||||
- 新局所suiteは実GuestServiceのLEAVING→despawn、一般職員remove、給与履歴保持、Unique拒否、UI収集時の全Runtime digest不変性、metadata型境界を確認する。関数呼出しはnative局所検証でありOS証拠には数えない。
|
||||
- 新suiteだけにpolicyとstrict markerを追加。既存suiteのSHA・assert・cleanup・marker条件は変更しない。
|
||||
- レイヤーは既存GameState snapshot、施設表示/地図強調は既存Main、職員一覧は既存service report、正式保存/失敗読込は既存契約を再利用。経済・Clock・人物・旧保存係数の変更なし。
|
||||
- 新検証器は読取専用。限定suite機能、見た目、素材、Runner操作、外部worktree入力は追加しない。
|
||||
|
||||
## 条件matrix(全項目未実行)
|
||||
|
||||
| condition ID | 根拠source / Runnerで必要な検証 | 状態 |
|
||||
| --- | --- | --- |
|
||||
| facility_lifecycle | test_selection_lifecycle + test_selection_departure、実撤去後ID/detail/highlight、別process有効施設復元 | pending |
|
||||
| guest_lifecycle | test_actor_selection + test_selection_departure、退館中表示・実despawn・履歴保持、別process画面値 | pending |
|
||||
| staff_lifecycle | test_actor_selection + test_selection_departure、一般職員remove・給与履歴・Unique拒否、別process画面値 | pending |
|
||||
| layer_and_values | test_selection_autosave + test_actor_selection + 新suite、正式GameState layer、UI収集時全Runtime不変、別process通常Main | pending |
|
||||
| invalid_and_failed_load | test_selection_lifecycle + test_actor_selection + 新suite、不在/不正型/過大ID/旧metadata/読込失敗時保持 | pending |
|
||||
| normal_os_input | 同候補sourceの通常Mainで施設/客/職員/レイヤー選択、正式保存、別PID再開、OS collector trace + PNG + log | pending |
|
||||
| final_validation_review | 最終候補全roster/import/全script parse、正式独立Claudeレビュー、別Windows条件 | pending |
|
||||
|
||||
## Runner実行計画
|
||||
|
||||
作成者は試験を実行していない。局所4suiteを確認した後、影響範囲(guest observation、staff management、layer skin、save/recovery)と最終候補の全回帰を正式実行する。全回帰には既存 `tools/run_all_tests.py` を指定なしで使用し、新suiteを含む全rosterとparse範囲を維持する。新suiteのcontrol labelはsingleであり、Runnerが渡すcontrol.jsonへ既存ordinary cleanupを出力する。
|
||||
|
||||
通常OS確認はRunnerが所有する新規profileで行う。個人profileや外部PIDを操作しない。Producerとconsumerの通常Main・同じ保存を保持し、別PIDで復元を観察する。OS未実行やWindows未実行は提出を妨げないが受入済みにはしない。修正後は同候補sourceの証拠を再取得し、過去結果を転用しない。
|
||||
|
||||
## 証拠index protocol v1
|
||||
|
||||
Runnerが `BUILD_OUTPUT_DIR/p24-evidence/index.json` を作成する。検証は `python3 tools/check_p24_selection_evidence.py --verify-only`。検証器は証拠を生成せず、欠損/pending/候補違い/失敗を非0で返す。通過も `formal_acceptance=false`。
|
||||
|
||||
indexのキー:
|
||||
|
||||
- `schema_version`: 1。
|
||||
- `source_map`: `tools/run_all_tests.py` のsource_refsに含まれる**全source**について相対repo path→raw bytes SHA256。各条件・cross-process観察・OS collector・レビューでも同じmapを保持する。
|
||||
- `artifacts`: artifact名→`{path,sha256}`。pathはp24-evidence内相対path。空ファイル・symlink・上位参照は禁止。Runnerは元の正式証拠を変更せずコピーして登録する。
|
||||
- `conditions`: 上表の全ID→`{status:"executed",source_map,artifacts:[artifact名,...]}`。未実行はpending。局所条件には検証器指定の実suite raw logを含める。
|
||||
- `native`: `{suites:["tests/ui/test_actor_selection.gd","tests/ui/test_selection_lifecycle.gd","tests/ui/test_selection_autosave.gd","tests/ui/test_selection_departure.gd"]}`。全回帰内の実行と照合する。
|
||||
- `full_regression`: `{input,ended,rows,logs}`。input/ended/rowsはrunner-input.json、runner-ended.json、all-tests.jsonのartifact名。logsは全rosterのsuite path→元の実raw logのartifact名。所有PID・source・run_id・全roster・marker・全phaseを突合する。
|
||||
- `cross_process`: `{producer,consumer,manifest,world}`。正式保存のmanifest.json/world.binと両観察JSONのartifact名。観察JSONは `{source_map,scene:"res://scenes/main/main.tscn",pid,manifest_sha256,world_sha256,log,observation}`。両processで同一save SHA・別PIDが必要。
|
||||
- `observation`: `{interface_selection,layer,facility,guest,staff}`。interface_selectionは正式manifestの値、layerはGameStateの値。各対象は `{id,model_values,screen_values}`。facilityにはhighlight_idも必要。model_values/screen_valuesは空でない同形辞書で、実model値と画面に実表示された値を独立に収集する。表示のname/金額/状態/need等を単なるID確認に置き換えない。
|
||||
- cross-process `log` は通常Mainの実行・観察を採取したcollector raw logのartifact名。`P24_PROCESS pid=<実PID> scene=res://scenes/main/main.tscn` および `P24_OBSERVATION <observationをsort_keys=True,ensure_ascii=Falseのjson.dumpsで表現>` を収録する。作成者はこのログを生成していない。Runner collectorが実processと実画面を確認して収録する必要がある。
|
||||
- `os_input`: OS collector JSONのartifact名。JSONは `{source_map,collector,events}`。collectorはmacOS-CGEventTapまたはWindows-RawInput。各eventは `{action,pid,monotonic_ns,native_type,injected:false,screenshot,raw_trace}`。actionはselect_facility/select_guest/select_staff/select_layer/save/resumeを全て含む。native_typeはmouseDown/keyDown。PNGとcollectorの生trace(eventのsort_keys=True,ensure_ascii=False JSON行)を登録する。pressed.emit、関数呼出し、注入イベント、自己申告trueだけをOS証拠にしない。
|
||||
- `independent_review`: 最終別セッションClaudeレビューJSONのartifact名。`{source_map,reviewer:"Claude",independent_session,verdict:"pass",condition_ids:[全ID]}`。Runnerは実レビューと突合して保存する。コード作者の自己承認で代用しない。
|
||||
|
||||
このprotocolは証拠の整合性を検査する。artifactが実観察/正式レビュー由来であることの責任と元成果の判断はRunnerにあり、任意JSONやログを捏造して正式証拠に扱うことはできない。Windows結果は別に保存し、Mac結果から推測しない。
|
||||
Reference in New Issue
Block a user