P16-01-DISMISS: 一般従業員の通常操作での解雇(退職金を含む。P16-01 の補助の作業。原単位への加算 0)

This commit is contained in:
Agent Control Runner
2026-10-25 17:01:25 +09:00
parent a073ccb59b
commit f5fe219674
4 changed files with 252 additions and 57 deletions
@@ -3997,7 +3997,7 @@
"template": "PASS: <checks> checks",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "e325c7ac24f979bc8ac3f4222279c317b2603ef20cae046475647dd90d423123",
"source_sha256_at_schema_audit": "f1f77bfd6320a3c8e0851915b150e95fc40f4a352876358393572a6d3f7c79ce",
"authority": {
"path": "docs/plans/original-completion-2026-10-02/execution/p16-01-dismiss/SPEC.md",
"scope": "new P16-01-DISMISS suite marker; native execution pending"
@@ -1,4 +1,4 @@
# P16-01-DISMISS 実装の記録(実 Opus の実装担当、2026-10-24、修正 1 は 2026-10-25)
# P16-01-DISMISS 実装の記録(実 Opus の実装担当、2026-10-24、修正 1 と修正 2 は 2026-10-25)
- 仕様: 同じフォルダの `SPEC.md`(登録版 r04。main `0b59d7c` に固定。ファイルの SHA-256 は `b4cc31c0…5f77`、Runner の `spec_sha256` は `14efffd9…e6b`)。出典は `PROVENANCE.json`。
- 原本への加算は 0。原単位 P16-01・P16-03、`AR.staff.dismissal_severance` の package P05 の原 work・原 AC は閉じない(SPEC §8)。
@@ -16,6 +16,15 @@
- medium と low: 条文が明示する確かめ方を代用していた所がある(同じ process の読み込み、通勤の昇降機、拒否の行の画面、bytes の比べ、別の process の境目など)。条文どおりの試験を足した(§7)。
- 新しい拒否や、R9 に似た境界は足していない。受入の条件も削っていない。
### 修正 2 の経過(S `a073ccb` → 修正の後の S)
- S `a073ccb` は、新しい fresh な別の実 reviewer の判定で changes_requested になった(medium 1・low 3。`p16-01-dismiss-independent-review-a073ccb-r01/DESKTOP_RESULT.json`)。F1〜F8 と F10 は満たし、F9 を満たさないという判定。結果・配送・transcript は書き換えずに残している。
- 所見と直し(製品のファイルは変えていない。試験と記録だけ):
- medium(F9・§4.3 の通常の入力): S `a073ccb` の画面の試験は、Main のキーの処理を直接呼び、ボタンの `pressed` の信号を直接出していた。viewport の入力の経路で、解雇と確定のボタンに届くことを確かめていなかった。画面の試験を viewport の入力に置き換えた(§4・§7)。
- low(§4.1 (d)): 試験で失敗を起こしていなかった2つの巻き戻しの枝を、開示した fixture で起こした。記録の「起こせない」という理由は、`remove_staff` の枝について正しくなかったので直した(§1)。
- low(§4.3): 裏金からの補填の文と、命令の中で取り消す救護の文を、画面で確かめた(§7)。
- low(後続のスクリプトの1回目の元の bytes の欠落): 管理の記録の欠落として残す。この W の中で直すものは無い。
## 1. 命令と判定の順(SPEC §4.1)
- `SimulationRuntime` に通常の command `dismiss_staff`(payload `staff_id`)を足した(`_execute_dismiss_staff`)。
@@ -41,7 +50,12 @@
- `remove_staff` が予約を解けない時 `RESERVATION_RELEASE_FAILED`(R3 の最後の守り)
- 退職金を記帳できない時 `SEVERANCE_POST_FAILED`
- 救護の作業を取り消せない時 `RESCUE_CLEANUP_FAILED`
- 退職金と救護の2つは、試験で失敗を起こし、5.c の比べ方で何も変わらないことを確かめる。座席と `remove_staff` の2つは、試験で失敗を起こしていない(前もった判定と公開の照合の形で、今の試験の組み立てからは起こせない守り)。
- 4つとも、試験で失敗を起こし、5.c の比べ方で何も変わらないことを確かめる(修正 2 で座席と `remove_staff` の2つを足した。§7)。
- 退職金: 記帳の key を先に使う(開示した fixture)。乗ったままの組の段でも起こし、座席を解いた後の path と昇降機の巻き戻しを確かめる。
- 救護の後始末: 迎えの作業に無い予約の ID を持たせる(開示した fixture)。
- `remove_staff`: 在庫の解放の操作 ID(`staff.task.release.<作業>.<予約>`)を、先に別の予約の操作で束縛する(開示した fixture)。前もった判定(予約が無い・消費済み)は通るが、在庫が `IDEMPOTENCY_CONFLICT` で解放を拒む。修正 1 の記録の「試験の組み立てからは起こせない」は、この枝について誤りだった。
- 座席: 運搬者の Path の乗車の要求を、公開の `PathService.complete_elevator_request` で先に終える(開示した fixture)。この状態は保存の照合が拒む形で、通常のゲームの状態からは起きない。
- 巻き戻しの関数 `_rollback_staff_dismissal` の戻り値は使っていない。既存の雇用の巻き戻し(`_rollback_staff_candidate_hire`)と同じ形のまま。
- 画面と試験のための読むだけの関数 `get_staff_dismissal_preview(staff_id)`。返すのは、解雇できるか・理由・退職金・未払い・開き直す作業・命令の中で取り消す救護の作業と役(運搬者か患者か)・表金・資金の合計。
- 運営の終了の後は、理由を `BANKRUPT` にする(R5。命令は受付の前に拒まれる)。
- `get_staff_management_report` の各行に `dismissal` として載る。
@@ -93,9 +107,17 @@
- 結果として、払った退職金・補填・保持した未払い・開き直した作業・取り消した救護、または拒否の理由(押した後に資金が減って拒まれた場合を含む)を出し、名簿と選択を更新する。
- 解雇の受理を待つ間は、その職員の配属の変更とドラッグを止める。
- `Main` の職員の管理の画面は、今の部品と送り手(`_audio_feedback.submit_command`)のままで使えるので、`scenes/main/main.gd` は変えていない。UI は今の部品のままで、完成の見た目ではない。
- 入力の経路(F9 の開示): 試験は本物の Main と Runtime を使う。Main のキーの処理(`_unhandled_key_input`)と、画面のボタンの `pressed` の信号で操作し、他の Main の suite と同じ形で通常の入口を通す。
- viewport や OS の入力イベントは通していない。headless の診断では、`push_input` と `Input.parse_input_event` の形を1回ずつ試したが、ボタンは反応しなかった。これは headless の診断の結果で、実機の OS 入力を試して失敗した証拠ではない。
- Windows の実機・IME・OS の倍率・同じ候補での実機の受入は、未達のまま残す。
- 入力の経路(F9、修正 2): 試験は本物の Main と Runtime を使い、viewport の入力で操作する。
- キー(雇用の候補を開く H)は `root.push_input` の `InputEventKey`。
- ボタン(候補の雇用・「雇用済み」・名簿の行・「解雇する…」・「やめる」・「解雇を確定」・締めの後に戻る「従業員」)は、全 roster で PASS している `tests/ui/test_business_management.gd` の `_click_principal_button` と同じ形で押す。ScrollContainer で見える位置へ送り、マウスの移動、押しと離しを viewport の local の座標で送り、各フレームを待つ。
- 拒否の行では、無効のボタンを viewport の入力で押しても命令を送らず、snapshot の全体の bytes が同じことを確かめる。
- 時計が動いている時の押し方: 離す瞬間だけ時計を動かし、すぐ止める。命令は次の分の処理になり、フレームが分を進めない(1分は実時間 1/6 秒なので、フレームを待つ間に時計を動かしたままにすると、確かめる前に分が進む)。
- 修正 1 の headless の診断でボタンが反応しなかった原因(修正 2 の局所の診断で確かめた。正式の証拠ではない):
- Main は基準の大きさ 1440×810 から縮めて表示される(窓 1280×720 で倍率 0.889)。修正 1 の診断は `push_input` に local の座標を指定せず(もう1つの形の `Input.parse_input_event` も窓の座標)、押した位置が約 1.125 倍ずれてボタンから外れていた。
- 名簿の行は `refresh` で作り直される。そのフレームに足した部品では `ScrollContainer.ensure_control_visible` がスクロールしないので、1フレーム待ってから見える位置へ送る。
- 0 時の締めの後、Main は側面の panel を帳簿に切り替え、職員の画面を含む部分を隠す(今の `_on_snapshot_published` の動き)。試験は、プレイヤーと同じく「従業員」のボタンで戻る。
- どれも試験の押し方の問題で、画面の部品や配置は変えていない。
- これは viewport の入力で、OS の入力ではない。Windows の実機・IME・OS の倍率・同じ候補での実機の受入は、SPEC §10「Windows 実機は後」の後続の条件として、実施しておらず未達のまま残す。
## 5. 予約の操作 ID(修正 1、A5・F7)
@@ -129,6 +151,11 @@
- 保持した未払い(本物の 0 時の締めで資金が足りず、日給が未払いになる)も、押す前と結果で確かめる。
- 押した後の拒否の理由も確かめる。
- 画面の比べは全て `var_to_bytes`。
- 修正 2 で変えた・足した場面:
- Main の画面の場面を、viewport の入力で操作する形に置き換えた(§4)。`Button.pressed.emit()` と `_unhandled_key_input` の直接の呼び出しは、この suite から無くした。
- Main の画面で、裏金からの補填(表金 G100・退職金 G300・補填 G200)の押す前と結果の文を確かめる。資金の fixture は、解雇の後に元の残高に戻る形にした。
- Main の画面で、救護室へ歩いて運ぶ搬送の段に、患者と運搬者の押す前の文と、運搬者の結果の文(取り消した救護)を確かめる。
- 巻き戻しの枝(`_test_rollback_branches`): `remove_staff` の予約の解放の失敗、乗ったままの組の座席の解放の失敗、乗ったままの組で座席を解いた後の退職金の記帳の失敗。どれも 5.c と 5.d の比べ方で、組が乗ったままであることも確かめる。
- 再開の2段 `tests/staff/test_general_dismissal_restart_1_write.gd`(唯一の生成ファイルは `artifacts/p16-01-dismiss/restart-handoff.json`)と `..._2_read.gd`。
- 帳簿の6つの保存点を読む。
- 次の命令の境目の保存を読む。修正 1 で、A6 の迎え・A6 と A7 の乗ったままの組・A8 の CONTINUE_WITHOUT を足した。