docs: freeze P05-02 funds contract and decision provenance
This commit is contained in:
@@ -56,6 +56,50 @@
|
|||||||
"origin": "user_reply_in_conversation「従業員用を裏層に別で作って」",
|
"origin": "user_reply_in_conversation「従業員用を裏層に別で作って」",
|
||||||
"approved_at_jst": "2026-10-20",
|
"approved_at_jst": "2026-10-20",
|
||||||
"values_note": "業務用の数値はユーザー指定がなくA07と同値を適用。"
|
"values_note": "業務用の数値はユーザー指定がなくA07と同値を適用。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "A09",
|
||||||
|
"title": "費用の支払元",
|
||||||
|
"decision": "維持費・仕入れ・人件費・返済・利息・税は表金から払い、不足を裏金で補う。",
|
||||||
|
"origin": "user_selected_answer_label_verified_in_claude_desktop",
|
||||||
|
"approved_at_jst": "2026-10-23",
|
||||||
|
"selected_label": "Front, hidden fills gap (Recommended)",
|
||||||
|
"reference": "execution/p05-02/SPEC.md",
|
||||||
|
"provenance_reference": "execution/p05-02/PROVENANCE.json",
|
||||||
|
"implementation_note": "日次義務の不足は滞納繰越、資金不足の操作時仕入れ/返済は拒否する区別は、既存挙動とOpusの解釈。全費目の繰越を追加の人間承認とは主張しない。SPEC §3.3。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "A10",
|
||||||
|
"title": "世界樹ランク税の初期試験値",
|
||||||
|
"decision": "世界樹ランク税は、その日の売上の10%。初期試験値として適用する。",
|
||||||
|
"origin": "user_selected_answer_label_verified_in_claude_desktop",
|
||||||
|
"approved_at_jst": "2026-10-23",
|
||||||
|
"selected_label": "10% of daily sales (Recommended)",
|
||||||
|
"reference": "execution/p05-02/SPEC.md",
|
||||||
|
"provenance_reference": "execution/p05-02/PROVENANCE.json",
|
||||||
|
"implementation_note": "表裏売上合計・00:00計上は提示された説明と原要件、整数切り捨てはOpusの仕様選択。SPEC §3.4。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "A11",
|
||||||
|
"title": "闇銀行利息の初期試験値",
|
||||||
|
"decision": "借入残高に対して日利1%。元本は売上に含めない。",
|
||||||
|
"origin": "user_selected_answer_label_verified_in_claude_desktop",
|
||||||
|
"approved_at_jst": "2026-10-23",
|
||||||
|
"selected_label": "1% per day on balance (Recommended)",
|
||||||
|
"reference": "execution/p05-02/SPEC.md",
|
||||||
|
"provenance_reference": "execution/p05-02/PROVENANCE.json",
|
||||||
|
"implementation_note": "00:00計上と整数切り捨てはOpusが記録した選択肢説明。Rootが直接確認したのは質問と選択ラベル。SPEC §3.5。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "A12",
|
||||||
|
"title": "旧セーブの資金区分移行",
|
||||||
|
"decision": "旧セーブの所持金は全額を表金とし、裏金は0から始める。",
|
||||||
|
"origin": "user_selected_answer_label_verified_in_claude_desktop",
|
||||||
|
"approved_at_jst": "2026-10-23",
|
||||||
|
"selected_label": "All to front funds (Recommended)",
|
||||||
|
"reference": "execution/p05-02/SPEC.md",
|
||||||
|
"provenance_reference": "execution/p05-02/PROVENANCE.json",
|
||||||
|
"implementation_note": "帳簿履歴を保持。口座欠如による移行判定と5空口座追加はOpusの実装仕様。F8は他の帳簿フィールドbyte不変を必須とする。SPEC §3.8。"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"pending": [
|
"pending": [
|
||||||
@@ -86,7 +130,7 @@
|
|||||||
{
|
{
|
||||||
"id": "D04",
|
"id": "D04",
|
||||||
"title": "未指定の経済と行動係数",
|
"title": "未指定の経済と行動係数",
|
||||||
"details": "税・利息・マナ・天候・環境・役割・成長等の必須値。A01〜A05は決定済み。",
|
"details": "税・利息・マナ・天候・環境・役割・成長等の必須値のうち未確定部分。A01〜A12の決定範囲はconfirmedと各仕様を参照。A10・A11は初期試験値であり、その他の未確定値を補完しない。",
|
||||||
"needed_at": "各機能の本番値固定",
|
"needed_at": "各機能の本番値固定",
|
||||||
"independent_work": "原本明示値、契約、候補比較を先行する。",
|
"independent_work": "原本明示値、契約、候補比較を先行する。",
|
||||||
"kind": "required_per_feature"
|
"kind": "required_per_feature"
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
{
|
||||||
|
"at": 1792736492.9881642,
|
||||||
|
"by": "Claude Opus 5.5 Desktop (local_a7f85421-3eed-4482-8030-c0dca669573a), the commander that asked the questions",
|
||||||
|
"feature_priority_user_message": {
|
||||||
|
"text_verbatim": "開発作業止めないで。\n\n\nそれと、動作速度の試験と軽量化の作業は後ろ回しにして。理由はUIやアセット含めて入れ替える予定なので、現状のモック版を計画目標に置いてないので。\n\nまずゲームとしての機能実装完了を優先して",
|
||||||
|
"position": "the user turn right after the assistant reply that listed the disk-space candidates (OPT_94F9344_SPACE_CANDIDATES.md, user request 「空きを作る候補(保持している証拠を消さない範囲)を、大きさと一緒に一覧にしてください。削除はまだしないでください。」); before the AskUserQuestion below",
|
||||||
|
"applied_as": "P28 deferred (commander_proposal event 23, action wait); features first (feature-priority-r01/PLAN.md). The reading that UI and asset polish packages also move later is the commander interpretation of the stated reason, not a separate user statement."
|
||||||
|
},
|
||||||
|
"questions_as_presented": {
|
||||||
|
"tool": "AskUserQuestion, one call with four questions, in the assistant turn that followed the feature-priority message",
|
||||||
|
"language": "English (the user then asked 「日本で回答してよ」 as a mid-turn message, right after the answers)",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"id": "A09",
|
||||||
|
"header": "Payment",
|
||||||
|
"question": "P05-02: Which fund should expenses (upkeep, supplies, wages, repayment, interest, tax) be paid from?",
|
||||||
|
"options": [
|
||||||
|
[
|
||||||
|
"Front, hidden fills gap (Recommended)",
|
||||||
|
"Pay from front funds first, and cover any shortfall from hidden funds. If both are short, the unpaid amount carries over to the next day, the same as upkeep (A01)."
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Front funds only",
|
||||||
|
"Hidden funds are never used to pay expenses. Any shortfall carries over to the next day as unpaid."
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Split by expense",
|
||||||
|
"Loan repayment and interest come from hidden funds; all other expenses come from front funds."
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"selected_label": "Front, hidden fills gap (Recommended)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "A10",
|
||||||
|
"header": "Rank tax",
|
||||||
|
"question": "P05-02: How should the World Tree rank tax be calculated?",
|
||||||
|
"options": [
|
||||||
|
[
|
||||||
|
"10% of daily sales (Recommended)",
|
||||||
|
"Tax is 10% of that day's sales (front + hidden) and is recorded at 00:00. Initial test value, to be adjusted later."
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Flat amount per rank",
|
||||||
|
"A flat amount per rank, recorded at 00:00. The amounts are decided in a separate step."
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Mechanism only for now (0)",
|
||||||
|
"Build the tax ledger entry and its display, with the value left at 0 (unset) for now."
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"selected_label": "10% of daily sales (Recommended)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "A11",
|
||||||
|
"header": "Interest",
|
||||||
|
"question": "P05-02: What interest should the dark bank's loans carry?",
|
||||||
|
"options": [
|
||||||
|
[
|
||||||
|
"1% per day on balance (Recommended)",
|
||||||
|
"1% of the outstanding loan balance, recorded at 00:00 each day (whole numbers, rounded down). Initial test value. Principal is not counted as sales."
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"10% fee when borrowing",
|
||||||
|
"10% of the loan amount is charged once, at the time of borrowing, with no daily interest."
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Mechanism only for now (0)",
|
||||||
|
"Build the interest ledger entry and its display, with the value left at 0 (unset) for now."
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"selected_label": "1% per day on balance (Recommended)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "A12",
|
||||||
|
"header": "Old saves",
|
||||||
|
"question": "P05-02: How should the gold held in old saves be handled?",
|
||||||
|
"options": [
|
||||||
|
[
|
||||||
|
"All to front funds (Recommended)",
|
||||||
|
"When an old save is loaded, all of its cash becomes front funds and hidden funds start from 0. Ledger history is kept as is."
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Do not load old saves",
|
||||||
|
"Old saves made before the funds were split are rejected, leaving their contents unchanged; only new games are supported."
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"selected_label": "All to front funds (Recommended)"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"answer_returned_by_the_tool": "all four selected labels as above (the tool result lists question text and selected label only)"
|
||||||
|
},
|
||||||
|
"what_counts_as_user_decision": {
|
||||||
|
"root_verified": "the four question texts and the selected labels (rendered in the app)",
|
||||||
|
"presented_but_not_root_verified": "the option descriptions above, copied from the tool call. The user selected an option that carried this description, but the description is not raised to a new or wider human approval beyond the label and the core of the option (A09 front first, hidden covers the gap; A10 10% of daily sales at 00:00; A11 1% per day on the outstanding balance; A12 all cash to front funds).",
|
||||||
|
"opus_spec_choices": [
|
||||||
|
"A10 rounding down (the description does not say it; chosen to match the existing integer handling and A11)",
|
||||||
|
"A09 carry-over applied to the 00:00 obligations (wages and upkeep already have arrears; tax and interest get payable accounts)",
|
||||||
|
"A09 operation-time payments (manual and automatic purchases, repayment) keep the existing refusal when front + hidden cannot pay; nothing is carried for a refused command",
|
||||||
|
"A09 not applied to construction, fines, events, staff signing and defense skills (front funds only, as before)",
|
||||||
|
"A12 detection by the absence of BACK_CASH, without a Runtime snapshot version change"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"a09_split": {
|
||||||
|
"user_answer_scope": "Front, hidden fills gap (Recommended): pay from front funds first and cover the shortfall from hidden funds",
|
||||||
|
"presented_option_text_about_shortfall": "If both are short, the unpaid amount carries over to the next day, the same as upkeep (A01).",
|
||||||
|
"existing_code_at_base_dda3eed": [
|
||||||
|
"autoload/simulation_runtime.gd repay_loan_principal rejects an amount above the available Gold before posting",
|
||||||
|
"scripts/supply/supply_management_service.gd purchase quotes INSUFFICIENT_FUNDS and refuses the purchase before stock or posting",
|
||||||
|
"payroll and upkeep settlement pay what the cash allows and keep the rest as arrears (A01 for upkeep)"
|
||||||
|
],
|
||||||
|
"commander_interpretation": "the carry-over is for the 00:00 obligations; a user command that front + hidden cannot pay is refused as before (SPEC §3.3)"
|
||||||
|
},
|
||||||
|
"original_credit": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
# P05-02 全費目と資金区分 仕様(登録版 r01)
|
||||||
|
|
||||||
|
- 状態: RootがOpusの登録候補r02を採用し、登録資料としてmainに固定する。登録・下書き試験は実装受入ではない。原本の加算はwhole-unitのfinalの後だけ。出典は同フォルダのPROVENANCE.json。
|
||||||
|
- 前提: P04 は正式完了(b1810ff4)、P05-01 は正式受入済み。ユーザーの発言(2026-10-23)「開発作業止めないで。」「動作速度の試験と軽量化の作業は後ろ回しにして。理由はUIやアセット含めて入れ替える予定なので、現状のモック版を計画目標に置いてないので。」「まずゲームとしての機能実装完了を優先して」により、機能の実装を性能(P28)より先にする(`feature-priority-r01/PLAN.md`。会話の位置と原文は同じフォルダの `PROVENANCE.json`)。
|
||||||
|
|
||||||
|
## 1. 原本の条件(変えない)
|
||||||
|
|
||||||
|
- work: 表金・裏金、維持費未払い、仕入れ、人件費、元本、利息、税を帳簿へ接続する。
|
||||||
|
- acceptance: 3営業日で資金増減と台帳が一致し、借入元本を売上に含めない。
|
||||||
|
- 原子要件(`atomic_requirements.json`、P05): 表金と裏金を分けて保持する(`AR.economy.front_gold_account`・`back_gold_account`)、表のサービスで表資金・裏のサービスで裏資金を得る(`front_gold`・`back_gold`)、飲食・宿泊は表の収益(`income_food`・`income_lodging`)、成人施設・カジノ・脅迫金・ユニット売却は裏の収益(`income_adult`・`income_casino`・`income_blackmail`・`income_trade`)、仕入れ・人件費・維持費・借金返済・世界樹ランク税を経費に記帳(`expense_*`)、日次決算で表裏の売上から全対象経費を引く(`settlement_calculation`)、00:00 の決算レポート(`midnight_report`)、維持費の A01・A02(`upkeep.*`)。
|
||||||
|
- P28 の横断条件6件と同じ形の横断条件(原本条件と UI 操作の一致 / Runtime の実利用・会計・行動へ接続 / 途中保存・再起動で再現 / 異常・境界・中断 / 関連回帰 PASS / 要件別ログとソースハッシュ)を、この単位の範囲で適用する。
|
||||||
|
|
||||||
|
## 2. 決定(捏造しない)
|
||||||
|
|
||||||
|
- 既存: A01(維持費は保有時間で日額按分、00:00 精算、不足は翌日へ繰越)、A02(維持費の初期試験値)。
|
||||||
|
- 今回のユーザーの決定(2026-10-23、`feature-priority-r01/DECISIONS_P05_02.json`):
|
||||||
|
- A09: 維持費・仕入れ・人件費・借入返済・利息・税は表金から払い、足りない分を裏金で補う。Rootが直接確認した回答は「Front, hidden fills gap (Recommended)」。この回答だけから、両資金が不足した場合の全費目の繰越までをユーザー決定とはしない。§3.3 の日次滞納と操作時拒否の区別は、既存挙動とOpusの仕様案に由来する。
|
||||||
|
- A10: 世界樹ランク税は、その日の売上(表+裏)の10%を00:00に経費として計上する(初期試験値)。
|
||||||
|
- A11: 闇銀行の利息は、借入残高の日利1%を毎日00:00に計上する(整数・切り捨て、初期試験値)。元本は売上に含めない。
|
||||||
|
- A12: 表裏に分ける前の旧セーブは、所持金の全額を表金にし、裏金は0から始める。帳簿の履歴はそのまま。
|
||||||
|
- 出典区分: Rootが直接確認したのは4質問と選択回答のラベル。A10の「10% of daily sales (Recommended)」、A11の「1% per day on balance (Recommended)」、A12の「All to front funds (Recommended)」。選択肢の説明文は、質問をした Opus の道具の呼出しから写して `PROVENANCE.json` に置く(Root は未確認)。説明文は、ラベルと選択肢の中心(A09 表金から先・不足を裏金で補う、A10 その日の売上の10%を00:00、A11 借入残高の日利1%、A12 所持金の全額を表金)を超える新しい人間の承認としない。精算時点・整数切り捨て・帳簿履歴保持などの詳細はOpusの登録仕様案および原要件に由来し、未確認の人間発言として追加しない。根拠は Root の `p05-02-owner-registration-draft-r01/SOURCE_RECONCILIATION.json` と、このフォルダの `PROVENANCE.json`。
|
||||||
|
- まだ決めていないもの(この単位では作らない): ランクごとの税の差、借入の上限・期限・滞納から脅威(P05-03)、カジノ・脅迫金の発生源(後の単位)、D05 のうち下の §3.6 以外の同時発生。
|
||||||
|
|
||||||
|
## 3. 範囲
|
||||||
|
|
||||||
|
### 3.1 口座
|
||||||
|
|
||||||
|
- 表金は既存の `PLAYER_CASH`(意味を変えない。`gold` の資源は今までどおり表金を映す)。裏金は新しい口座 `BACK_CASH`(負を許さない)。
|
||||||
|
- 税と利息は、維持費と同じく「計上(経費 → 未払金)」と「支払(未払金 → 資金)」の2つの記帳にする。未払金の口座に残った額が滞納。
|
||||||
|
|
||||||
|
### 3.2 収入の振り分け
|
||||||
|
|
||||||
|
- 施設の売上は今までどおり施設の売上の口座に入り、その後の移し替え(`SERVICE_CASH_SWEEP`)の行き先を、施設の定義の札で決める: `restricted_service` か `adult_only` があれば `BACK_CASH`、それ以外は `PLAYER_CASH`。今の定義では `adult_private_room`・`black_market`(`trade`)・`vip_private_salon` が裏。
|
||||||
|
- カジノと脅迫金は今のゲームに発生源が無い。同じ札の規則で裏に入ることを試験で固定し、発生源は後の単位で作る(開示)。
|
||||||
|
|
||||||
|
### 3.3 支払の規則(A09)
|
||||||
|
|
||||||
|
- 00:00 の精算の支払(維持費、人件費、税、利息): その日に払う額の合計(滞納を含む)のうち表金で足りない分だけを、精算の前に裏金から表金へ補填する(区分 `BACK_FUND_TOP_UP`、売上でも経費でもない記帳)。その後の支払は今までどおり表金から行う。両方で足りない分は、それぞれの滞納として翌日へ繰り越す(維持費と人件費は既存の滞納の仕組み、税と利息は未払金の口座)。締めが 06:00 の旧暦の 00:00 の維持費の精算にも同じ補填を行う。
|
||||||
|
- 操作の時の支払(仕入れの手動と自動、借入の返済): 表金+裏金が足りれば、表金で足りない分を裏金から補填して表金から払う。返済は補填と支払を1つの取引にする。仕入れは、記帳が1つの領収の形を保つため、補填を直前の別の取引にし、仕入れが失敗した場合は両方を取り消す。足りなければ今までどおり拒否し、Gold と在庫を変えない。見積の「払える額」は表金+裏金。
|
||||||
|
- それ以外の支払(建設、罰金、event、雇用の契約金、防衛の技能、event の預り金)は今までどおり表金だけ(A09 の対象外。開示)。
|
||||||
|
- 出どころの区分: 「表金から先に払い、足りない分を裏金で補う」はユーザーの回答(A09 のラベル)。両方で足りない場合に、00:00 の義務は滞納として繰り越し、操作の時の支払は拒否する、という区別は、ユーザーの決定ではなく、既存のコード(base `dda3eed` の返済と仕入れは払えない額を拒否する。人件費と維持費は払える分を払い残りを滞納にする)と、それに合わせた Opus の解釈(拒否した操作には繰り越すものが無い)による。
|
||||||
|
|
||||||
|
### 3.4 世界樹ランク税(A10)
|
||||||
|
|
||||||
|
- 第 d 日の 00:00 の精算で、税 = floor(売上_d × 10 / 100)。売上_d は日次決算の売上(表+裏、既存の返金の相殺の後)。0 なら記帳しない。
|
||||||
|
- 区分は `RANK_TAX`、決算の `taxes_and_interest` に入れる。第 d 日の決算に入り、第 d+1 日に二重に数えない。
|
||||||
|
|
||||||
|
### 3.5 闇銀行の利息(A11)
|
||||||
|
|
||||||
|
- 毎日 00:00 に、利息 = floor(借入残高 × 1 / 100)。借入残高は、その時点の全ての借入の元本の合計(`LOAN_PRINCIPAL_BORROWED` − `LOAN_PRINCIPAL_REPAID`)。0 なら記帳しない。
|
||||||
|
- 区分は `LOAN_INTEREST`、決算の `taxes_and_interest`。元本の出入り(`financing_principal_*`)は今までどおり売上と経費に入れない。
|
||||||
|
|
||||||
|
### 3.6 00:00 の順序
|
||||||
|
|
||||||
|
- 00:00 の日次の締めの中で、補填 → 人件費 → 維持費(既存の順序)→ 税 → 利息。税と利息は、それぞれの未払金の口座に古い滞納が残っていれば、新しい額より先にそれを払う。
|
||||||
|
- 途中保存・再開・同じ分の再試行で、税と利息を二重に計上・支払しない(日ごとの冪等の key)。
|
||||||
|
|
||||||
|
### 3.7 決算とレポート
|
||||||
|
|
||||||
|
- 日次決算に、売上の内訳(表・裏)、税・利息、税と利息の滞納を足す。利益の式(売上 − 全対象経費)と、3回連続の赤字で終了の規則は変えない。
|
||||||
|
|
||||||
|
### 3.8 保存(A12)
|
||||||
|
|
||||||
|
- 資金の口座(`BACK_CASH`、税と利息の経費と未払金)は帳簿の snapshot の中にあるので、Runtime の snapshot の版は上げない(版 15 はミミの購入の履歴と一致させて検査しているため、版の組を増やさない)。旧セーブは `BACK_CASH` が無いことで判定し、他の資金の口座も無いことを確かめてから、それらを 0 で作る(A12。`PLAYER_CASH` と帳簿の履歴はそのまま)。一部だけがある、または性質の違う口座は拒否し、読込の前の状態を保つ。
|
||||||
|
- 日次の決算の精算の報告(`settlement`)に、帳簿だけから求める資金の報告 `funds`(表裏の売上、補填、税・利息とその支払、税・利息の滞納)を足す。決算の区分(`category_totals`)の形は変えず、税と利息は既存の `taxes_and_interest` に入れる。読込の時は `funds` を帳簿から求め直して一致を確かめ、滞納の合計(`arrears_total`)は人件費・維持費・税・利息の滞納の和と照合する。分ける前に確定した日は `funds` を持たない(その日に資金の記帳が無いことを確かめる)。
|
||||||
|
|
||||||
|
### 3.9 表示
|
||||||
|
|
||||||
|
- 帳簿の画面と日次のレポートに、表金・裏金の残高、表裏の売上、税、利息、滞納を出す。今の UI は後で入れ替えるので、見た目は今の部品のまま、通常の操作で読めることだけを求める。
|
||||||
|
|
||||||
|
## 4. 受入条件(全て必須。部分点なし)
|
||||||
|
|
||||||
|
| ID | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| P05-02-F1 | 表金と裏金が別の口座で、裏の札の施設の売上だけが裏金に入る(表・裏の施設を各1つ以上で確かめる) |
|
||||||
|
| P05-02-F2 | A09 の支払の規則(00:00 の精算、操作の時、対象外の支払が今までどおり)。境界: 表金だけで足りる、裏金で補う、両方で足りず滞納、滞納の翌日の支払 |
|
||||||
|
| P05-02-F3 | A10 の税の値・切り捨て・時点・決算の区分・滞納 |
|
||||||
|
| P05-02-F4 | A11 の利息の値・時点・借入の後と返済の後の残高・元本が売上に入らない |
|
||||||
|
| P05-02-F5 | 3営業日の照合: 表金・裏金それぞれの日ごとの増減が帳簿の合計と一致し、決算の全ての区分が帳簿と一致し、元本が売上に入らない |
|
||||||
|
| P05-02-F6 | 途中保存・00:00 の前後の保存・別の process での再開で、税・利息・振り分けが二重にならず同じ結果。旧 snapshot の移行(A12)と不正値の拒否 |
|
||||||
|
| P05-02-F7 | 帳簿の画面と日次のレポートで、表金・裏金・表裏の売上・税・利息・滞納が読める(通常の操作で開く) |
|
||||||
|
| P05-02-F8 | 関連の回帰と最終Sの全 roster が PASS。既存試験の期待値変更はA09・A10・A11の承認済み差、または§3.8のA12旧セーブ移行の差だけに限定し、全件を EXPECTATION_CHANGES.json に変更前後の値・計算または構造差・根拠つきで一覧化する。A12は旧セーブへの5口座(BACK_CASH、LOAN_INTEREST_EXPENSE、LOAN_INTEREST_PAYABLE、RANK_TAX_EXPENSE、RANK_TAX_PAYABLE)の追加だけとし、残高・既存口座・取引履歴・その他の帳簿フィールドの不変をbyte比較で確認する。元の失敗を保存し、未解決の試験を除外してPASSにしない |
|
||||||
|
|
||||||
|
## 5. 変更してよいパス(候補)
|
||||||
|
|
||||||
|
- `autoload/simulation_runtime.gd`
|
||||||
|
- `scripts/economy/facility_upkeep_settlement.gd`(払う額の見込みの純粋な関数)、`scripts/economy/finance_policy.gd`(新規、口座・税率・利率・裏の札)と `.uid`
|
||||||
|
- `scripts/supply/supply_management_service.gd`(見積の払える額と、仕入れの前の補填)
|
||||||
|
- `scripts/ui/operating_ledger_panel.gd`
|
||||||
|
- `tests/economy/test_p05_funds_runtime.gd`(新規)と `.uid`
|
||||||
|
- `tests/**` のうち既存の試験の期待値の更新(§4 F8 の規則の範囲だけ。一覧 `execution/p05-02/EXPECTATION_CHANGES.json` が必須)
|
||||||
|
- `tools/run_p05_funds_tests.py`(新規、既存の guarded runner の protocol を使う)、`tools/regression/suite-policy.json`
|
||||||
|
- `docs/plans/original-completion-2026-10-02/execution/p05-02/**`、`docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json`
|
||||||
|
|
||||||
|
## 6. 検証
|
||||||
|
|
||||||
|
- 登録の validation `p05-funds`: `tools/run_p05_funds_tests.py --output {build_dir}/p05-funds-evidence`(検証だけ。収集は Root の役割の native で `--collect`)。roster は8本: 新しい `tests/economy/test_p05_funds_runtime.gd` と、関連の `tests/mvp/test_original_midnight_settlement.gd`、`tests/mvp/test_runtime_operations_integration.gd`、`tests/s2/test_runtime_operations_cycle.gd`、`tests/s6/test_runtime_save_lifecycle.gd`、`tests/s6/test_runtime_snapshot_serialization.gd`、`tests/supply/test_supply_management_service.gd`、`tests/ui/test_upkeep_closed_ui.gd`。runner は P18 の guarded runner と同じ protocol(roster・名前・数を roster から求める点だけが違う)。
|
||||||
|
- `tests/mvp/test_runtime_upkeep.gd` は source の中に報告のファイルを生成する suite(`suite-policy.json` の `fixed_generated_report_routes`)で、狭い roster の規則(生成物なし)に合わないので入れない。維持費を裏金で補う場面は新しい suite に入れ、`test_runtime_upkeep.gd` は最終の全 roster で確かめる。`tests/ui/test_business_management.gd` は古い有界の音声の後始末(`old_bounded_teardown`)の suite で、その証明は置き直した証拠では照合できない(証明が元の絶対パスを持つ)ので、狭い roster に入れず最終の全 roster で確かめる。帳簿の画面の新しい表示(F7)は、新しい suite が実際の `OperatingLedgerPanel` に4日分の帳簿を読ませて確かめる。
|
||||||
|
- F6 の別の process での再開: 下書きの新しい suite は、同じ process での snapshot の保存と読み直し、セーブファイルへの書き出しと読み直し(`save_to_path`・`load_from_path`)までを確かめている。別の process での再開(書き手の process が書いたセーブファイルを、別の process の読み手が読んで同じ結果になること)は、まだ実装していない。登録の後に `tools/run_p05_funds_tests.py` と `tests/**` の範囲で、書き手と読み手の2つの段として足す。実装できない場合は F6 を満たさないものとして扱い、範囲を狭めない。
|
||||||
|
- final の前に、最終の S で全 roster を1回(重複の全回帰はしない)。
|
||||||
|
- 独立レビュー: 実装担当とは別の新しい Opus が、原 work・原 acceptance・横断条件・U1/U2 を whole-unit で判定する。
|
||||||
|
|
||||||
|
## 7. 開示(U1)
|
||||||
|
|
||||||
|
- カジノと脅迫金の発生源は無い(規則だけを固定)。ランクごとの税の差は作らない(A10 は一律10%の試験値)。借入の上限・期限・滞納から脅威、金庫の上限は P05-03。建設・罰金などは表金だけで払う(A09 の対象外)。UI は今の部品のままで、完成の見た目ではない。Windows 実機は後。
|
||||||
|
|
||||||
|
## 8. 登録の前の下書き(正式の証拠ではない)
|
||||||
|
|
||||||
|
- 下書きの作業ツリーと状態: `p05-02-registration-proposal-r01/DRAFT_STATUS.md`、全試験の直接の実行の診断 `p05-02-registration-proposal-r01/DIAGNOSTIC_SWEEP_R01.json`(今回の変更で期待値が変わったのは `tests/business/test_required_kitchen.gd` の A12 だけ。他の 0 以外は base `dda3eed` でも同じ)。
|
||||||
|
- 下書きでの guarded の収集(`local-collection-failures/`): r01 は import の段で停止(新しい suite の `.uid` が無かった)。r02 と r03 は 10 本の収集は成功したが、runner の自己検証が失敗した(r02 は P18 の数 7 が残っていた、r03 は報告を生成する suite が roster にあった)。いずれも正式の合格ではなく、失敗の出力を保持する。
|
||||||
|
- 登録の後は、下書きの成果を SHA の一致で W に引き継ぎ、W で局所の確認と通常の owner submit を行う。下書きでの実行は数えない。
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
"passed": true
|
"passed": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "all8_confirmed_decisions",
|
"name": "all12_confirmed_decisions",
|
||||||
"passed": true
|
"passed": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -238,7 +238,7 @@
|
|||||||
"build_atomic_requirements.py": "6d6ea9e4216372dbd0f9fed3f885a4481b21a3f539a26f64cf98a6830af984c5",
|
"build_atomic_requirements.py": "6d6ea9e4216372dbd0f9fed3f885a4481b21a3f539a26f64cf98a6830af984c5",
|
||||||
"build_facility_value_contracts.py": "35027b23ce75ce9e4e0cdfc5132fd2eb771ba9f598d97750d7ecf9ecb257f769",
|
"build_facility_value_contracts.py": "35027b23ce75ce9e4e0cdfc5132fd2eb771ba9f598d97750d7ecf9ecb257f769",
|
||||||
"current_evidence_links.json": "db1837bcc8497201134297e312f4b266a297102285307ec3075d4e23632e26c2",
|
"current_evidence_links.json": "db1837bcc8497201134297e312f4b266a297102285307ec3075d4e23632e26c2",
|
||||||
"decisions.json": "8b7dba984d5b1cc0091e8faf8fddb2ab357dd79f1bd093eba46c23c2f62a068c",
|
"decisions.json": "6566a460e310d8fd51c807c31d1e26f442ecb68f39a92db9ae4011fe3910e706",
|
||||||
"facility_value_contracts.json": "447388ba03a29bfac25f2bcd068665aedbb07ba7641ce86f2db93d44f4c9f326",
|
"facility_value_contracts.json": "447388ba03a29bfac25f2bcd068665aedbb07ba7641ce86f2db93d44f4c9f326",
|
||||||
"facility_value_contracts_validation.json": "bf490a9ca585c48fc318e76c4a069ef244827d828d46e6415399f7710590dd16",
|
"facility_value_contracts_validation.json": "bf490a9ca585c48fc318e76c4a069ef244827d828d46e6415399f7710590dd16",
|
||||||
"performance_audit.json": "0b630b15a392c3e0366f1362bfe4ddacb968f915f54549f82e4d6fa315384762",
|
"performance_audit.json": "0b630b15a392c3e0366f1362bfe4ddacb968f915f54549f82e4d6fa315384762",
|
||||||
@@ -251,7 +251,7 @@
|
|||||||
"source_atomic_coverage.json": "2ab7b9e6a2536ef248d4f7ccd695bf75a082b47018aca7a5a1b6b706fe1907bc",
|
"source_atomic_coverage.json": "2ab7b9e6a2536ef248d4f7ccd695bf75a082b47018aca7a5a1b6b706fe1907bc",
|
||||||
"validate_atomic_requirements.py": "5b2d0b7d72cb124830fbb0a12d1434e6db698148cc5263d33fd5bd7c2953a1e0",
|
"validate_atomic_requirements.py": "5b2d0b7d72cb124830fbb0a12d1434e6db698148cc5263d33fd5bd7c2953a1e0",
|
||||||
"validate_facility_value_contracts.py": "91640e2a76cd6cc9186f7b85c0bf379b24b6cac0d48962815235ee628e7ae43e",
|
"validate_facility_value_contracts.py": "91640e2a76cd6cc9186f7b85c0bf379b24b6cac0d48962815235ee628e7ae43e",
|
||||||
"validate_plan.py": "4973d3c2797289d266f5c6e7c36f3d2c31931b23a1022eab3d94328267bcc1b4",
|
"validate_plan.py": "dc65987db520df75a9b90037eae82819ba4c8863354340681092703454cdfb31",
|
||||||
"validator_update_checks.json": "f997d0f3de2cea29550840b1d5cb23647d64f81329de46758551e2b6c8fecc27",
|
"validator_update_checks.json": "f997d0f3de2cea29550840b1d5cb23647d64f81329de46758551e2b6c8fecc27",
|
||||||
"work_packages.json": "445870757a77382bb8591ac4f333838a4db45203e02f131b497ca86d2cbe3dfa"
|
"work_packages.json": "445870757a77382bb8591ac4f333838a4db45203e02f131b497ca86d2cbe3dfa"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ def main():
|
|||||||
pending = {d["id"] for d in decisions["pending"]}
|
pending = {d["id"] for d in decisions["pending"]}
|
||||||
check("all10_pending_decision_groups", pending == {f"D{i:02d}" for i in range(1, 11)})
|
check("all10_pending_decision_groups", pending == {f"D{i:02d}" for i in range(1, 11)})
|
||||||
check("known_decision_references", all(set(p["decisions"]) <= pending for p in packages))
|
check("known_decision_references", all(set(p["decisions"]) <= pending for p in packages))
|
||||||
check("all8_confirmed_decisions", {d["id"] for d in decisions["confirmed"]} == {f"A{i:02d}" for i in range(1, 9)})
|
check("all12_confirmed_decisions", {d["id"] for d in decisions["confirmed"]} == {f"A{i:02d}" for i in range(1, 13)})
|
||||||
check("confirmed_decision_references_exist", all((PLAN / d["reference"]).is_file() for d in decisions["confirmed"] if "reference" in d))
|
check("confirmed_decision_references_exist", all((PLAN / d["reference"]).is_file() for d in decisions["confirmed"] if "reference" in d))
|
||||||
state_counts = dict(collections.Counter(p["state"] for p in packages))
|
state_counts = dict(collections.Counter(p["state"] for p in packages))
|
||||||
check("valid_package_states", all(p["state"] in states for p in packages))
|
check("valid_package_states", all(p["state"] in states for p in packages))
|
||||||
|
|||||||
Reference in New Issue
Block a user