P04-01: 同時発生の更新規約

This commit is contained in:
Agent Control Runner
2026-10-16 03:20:25 +09:00
parent 64617018ed
commit dd20d5b96c
3 changed files with 87 additions and 5 deletions
@@ -96,3 +96,78 @@ approved-shift-current-r01.gdの1080系列を結合する必要がある。
独立whole review→prepare-integration/final。全case収集前のwhole合格はない。
S1準備に移行、A未検証。repair8はs1/の3ファイルによるコード準備のみ。未実測・原P04 whole未達。
## repair9 — S1 code-ready / submitted
今回の限定修正は完了。上記repair7の未完一覧は履歴であり、今回のS1実装をblockedとはしない。
原P04 whole未達・修正版native未実測。git書込み・Runner操作・engine起動なし。
原因はfixtureのint(String)=0の読み違い。InventoryReservation.create_snapshot()は
stateをACTIVE/RELEASED等の文字列名で保存するが、旧probe:150はint()で比較し、
RELEASEDもACTIVE=0として双方向照合していた。productは不変。
s1/p04_s1_ev_power_probe.gdのsafety():144にstates_knownを追加し、旧150
(修正後151–155)をString化・enum名存在確認・ACTIVE名比較へ変更した。
修正後165の既存孤立outcomeにstates_knownをANDし、不明状態なら明示的に失敗する。
既知状態のcheck数は各case 3のまま。不明状態も6 checksの既存枠内で失敗する。
staff状態の119、purpose==staff_task、8境界、双方向照合、孤立0、ledger・到着・
remaining_minutesは維持。非ACTIVE履歴もsnapshot/rawから削除・除外しない。
wrapperに予約state判定の説明はなくコード変更不要。S1_ROOT_RUN.mdに型の説明と
Root用fresh r02 plan/outputを反映した。
### 直接読んだ根拠(絶対path)
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-whole-closure-r01/ROOT_S1_NATIVE_R01_RESULT.json
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/raw/writer-landing-observations.json
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/raw/writer-landing-observations.var
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/raw/writer-no-safe-landing-observations.json
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/raw/writer-no-safe-landing-observations.var
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/raw/writer.json
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/writer/stderr.log
- /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/execution.json
指定の /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/raw/writer/stderr.log と
/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/raw/writer/execution.json はFileNotFoundError。
/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/writer/execution.json も存在しない。
上記実在stderrとrun全体executionを代わりに直接確認した。欠落pathを読了とはしない。
.varは全bytes読取りのみで、engineによるtyped復号・JSONとの型付き一致検証は未実施。
### rawからの手照合(オーナー提示値と区別)
以下は提示値の転記ではなく、閲覧用JSONの予約・task行を直接読み、両方向を照合した値。
全行のreservation_idはreservation_00000001、requester/task_idはs1_rescue_with_tool。
ACTIVE行ではtask.reservation_idsに同IDがあり、RELEASED行ではidsが空なので、
有効予約→taskとtask.ids→有効予約の欠落数はいずれも0。
|case|境界 minute|予約state / task state|孤立(両方向合計)|
|---|---|---|---|
|landing|boarded 779|ACTIVE / MOVING|0|
|landing|stopped 781|RELEASED / CANCELLED|0|
|landing|held_after 801|RELEASED / CANCELLED|0|
|landing|final 802|RELEASED / CANCELLED|0|
|no-safe-landing|boarded 779|ACTIVE / MOVING|0|
|no-safe-landing|stopped 781|ACTIVE / MOVING|0|
|no-safe-landing|held_after 801|ACTIVE / MOVING|0|
|no-safe-landing|final 847|RELEASED / CANCELLED|0|
両caseで予約時761はACTIVE、搭乗779もACTIVE。landingのterminal_atは780、
no-safe-landingは815。landingという観測キー自体はminute801であり、780は解放時点。
ledger配列長のheld_after−reserve_exhausted_before_tickは各0。
到着はboardedのrequest_id末尾000002(medic)/000003(patient)とshaft stopsで絞ると各1回。
medicには先行request末尾000001の到着もあるが対象requestではない。
remaining_minutesはlanding 0→0、no-safe-landing 4→4。
Writer receiptからPID59355、6 checks / 2 failures、旧orphansはlanding 3、no-safe-landing 1。
これら直接確認値はオーナー提示値に一致する。未知の予約stateは観測JSONにない。
修正後の8境界孤立0は既存rawの再解釈であり、修正版native成功を意味しない。
### 静的検証
run_s1_native.pyのpy_compileはexit0(pycacheはtask build/s1-repair9-python-cache)。
既定製品rootのcheck-onlyはtools/run_all_tests.pyのPermissionErrorでexit2。
checkoutを--project-root指定したcheck-onlyはexit0、engine0、source1300、fixed pins16。
cache receiptはPermissionErrorをcache_accessへ記録。製品1338件やnative開始条件の証明ではない。
最終説明更新後のplanはtask build/p04-s1-repair9-worker-final-plan.json、
output指定はtask build/p04-s1-repair9-worker-unused(native未使用)。
Rootは既定製品rootで独自fresh r02 plan/outputを用いnativeを1回実行し、
Writer6 checks全PASSとdistinct Readerの14正式slot復元を確認する。worker planは転用しない。
同版missing-index whole validateは再実行しない。S2/S3/collector/Aは今回扱わない。
D05の採用済み2承認は維持し、それ以外の未確定事項と混同しない。
@@ -3,6 +3,8 @@
S1コード準備完了・未実測・原P04 whole未達。D05 pending、A未検証。
engine起動・全回帰・コミットはworkerでは実施しない。
assertは各caseの停止中の課金行0、予約の孤立0、到着1回だけ。
予約snapshotのstateは文字列名として検査し、未知の名前は孤立checkを失敗にする。
ACTIVEのstaff_task予約とtask.reservation_idsを双方向照合する。非ACTIVEの履歴もrawには保持する。
費用帰属、金額、EV停止規則を決めない。remaining_minutes保持は生観測として保存する。
## Rootが実行するコマンド
@@ -13,8 +15,8 @@ Rootは先に空き容量・他のengine・終了済cacheへのアクセスを
```sh
export PYTHONPYCACHEPREFIX='/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/s1-python-cache'
python3 '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s1/run_s1_native.py' --check-only --plan '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-root-plan-r01.json' --output '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01'
python3 '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s1/run_s1_native.py' --plan '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-root-plan-r01.json' --output '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01'
python3 '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s1/run_s1_native.py' --check-only --plan '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-root-plan-r02.json' --output '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r02'
python3 '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s1/run_s1_native.py' --plan '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-root-plan-r02.json' --output '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r02'
```
既定の製品sourceは
@@ -48,7 +50,7 @@ strict phase失敗またはguard失敗は1、native開始前の入力・資源
## 出力とraw一覧
出力root:
`/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r01/`
`/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/p04-s1-native-r02/`
- source_before.json、source_after.json、selected-source-map.json、runner-input.json
- runner-started.json、runner-ended.json、execution.json、PID-set.json、outer-owned-finally.json、raw-inventory.json
@@ -141,13 +141,18 @@ func safety(row: Dictionary) -> void:
var charge_rows: int = row[&"held_after"][&"ledger"].size() - row[&"reserve_exhausted_before_tick"][&"ledger"].size()
outcome(charge_rows == 0, "停止中の課金行0")
var orphans := 0
var states_known := true
# Check each observed boundary, both directions, using actual task ownership.
for point_name: StringName in [&"boarded", &"stopped", &"held_after", &"final"]:
var point: Dictionary = row[point_name]
var tasks: Array = point[&"snapshot"][&"systems"][&"runtime"][&"staff"][&"tasks"]
var active: Dictionary = {}
for reservation: Dictionary in point[&"reservations"]:
if int(reservation[&"state"]) != InventoryReservation.State.ACTIVE: continue
var state_name := String(reservation[&"state"])
if InventoryReservation.State.keys().find(state_name) < 0:
states_known = false
continue
if state_name != InventoryReservation.State.keys()[InventoryReservation.State.ACTIVE]: continue
if String(reservation[&"purpose"]) != "staff_task": continue
active[String(reservation[&"reservation_id"])] = reservation
var linked := false
@@ -157,7 +162,7 @@ func safety(row: Dictionary) -> void:
for task: Dictionary in tasks:
for id: Variant in task[&"reservation_ids"]:
if not active.has(String(id)): orphans += 1
outcome(orphans == 0, "予約の孤立0")
outcome(orphans == 0 and states_known, "予約の孤立0" if states_known else "予約の不明状態")
var counts := {&"staff:medic": 0, &"staff:patient": 0}
var stops: Array = row[&"boarded"][&"elevator_report"][&"shafts"][0][&"stops"]
var requests: Dictionary = {}