MAS-066: 配当ミックス最適化(役員報酬 + 賞与 + 配当の 3 軸最適化)
概要
| 項目 | 内容 |
|---|---|
| 案件 ID | MAS-066 |
| 案件名 | 配当ミックス最適化(役員報酬 + 賞与 + 配当の 3 軸最適化) |
| カテゴリ | シミュレーション・税務 |
| 優先度 | P3 ★★(MAS-057 Phase 3 完了後の高所得帯向け拡張・年収 1,500 万超ゾーンで効果大) |
| 所要時間 | 約 1.5 ヶ月(週 10h 前提) |
| 対象ファイル(新規) | 400_domain/449_dividend_mix_optimizer.js(純粋関数・配当所得計算 + 配当控除 + 3 軸最適化スキャン・約 300 行) |
| 対象ファイル(変更) | 000_infra/002_constants.js(Constants.DIVIDEND_TAX_BRACKETS 新設)/ 300_ui/302_spa_bridge.js(配当軸の bootstrap + 計算 API 追加)/ MAS-057 cockpit UI 拡張(配当年額の 4 つ目ドロップダウン追加 OR 別 cockpit) |
| 新規シート | なし(既存 03_sys_params にキー追加のみ) |
新規 03_sys_params キー | F66_DIVIDEND_TAX_MODE(default combined・上場/総合課税)/ F66_DISTRIBUTABLE_AMOUNT_BUFFER(default 0.20・分配可能額の 20% を安全余力として確保)/ F66_MIN_OFFICER_COMP_FOR_INSURANCE(default 80,000 = 月 8 万円・国民健康保険最低保険料境界)/ F66_DIVIDEND_DECISION_FREQUENCY(default annual・配当決議頻度)の計 4 キー(v1.1 で F66_UI_INTEGRATION_MODE を削除・案 A 確定により切替フラグ不要) |
| 前提案件 | MAS-057 Phase 1/1.5/2/3(✅ 完了)/ MAS-058 v1.2(✅ Domain 実装完了・配当併用時の必要年商再計算は v2 で対応検討)/ MAS-061 v1.1(✅ 配当ミックス連携済) |
| 後続連携 | MAS-061 v1.2(配当 vs 役員報酬節税効果スコアを 40_KPIMonthly に追加)/ MAS-058 v2(dividendMixRatio を input に追加して必要年商再計算)/ MAS-067 マルチイヤー(各年で配当ドロップダウン追加・任意有効化) |
| 吸収・再定義対象 | なし(MAS-057 給与系のみ + MAS-066 配当軸のスコープ分離) |
目的
MAS-057 Phase 3 実装完了後の振り返りで「MAS-057 / MAS-058 は給与系(報酬 + 賞与)のみで配当を扱っていない・特に高所得帯で配当ミックスが手取り最大化に有利」気付きから派生した案件。
BRD §3.2 デッドヒート 3 ルート(A 役員報酬 / B 賞与 / C 株式配当・v2.1 で拡張済)を完成させ、年収帯別の最適配分曲線を提供する。配当は社保ゼロ + 配当控除(10% / 12.8%)の特性を持つが、法人税後利益から支払(損金 NG)+ 会社法 461 条の分配可能額制約 + 株主総会決議事務工数を伴うため、年収 1,500 万超のゾーンで社保頭打ち + 個人累進高税率の組合せにより役員報酬代替手段として有利になる。
齋藤 Baseline の現フェーズ(年収 600-1,000 万帯)では優先度低・将来課題(BRD §8)。実装は MAS-057 Step 6(3 区分テーブル)+ MAS-058 Step 5(UI/SPA 連携)完了後の UI フレーム安定後を推奨。
現在のコード
本案件は MAS-057 Phase 1/1.5 で確立した PersonalTaxEngine を順呼び出して、配当所得を総合課税で算入した状態の税額差分を算出するアグリゲータ。新規ロジックは配当税制パラメータ管理 + 配当控除算出 + 3 軸最適化スキャン + 分配可能額バリデーションのみ。
MAS-057 Phase 1(✅ 完了)の利用関数
| 関数 | 定義ファイル | 用途 |
|---|---|---|
PersonalTaxEngine.calcIncomeTax(taxableIncome) | 400_domain/442_social_insurance_tier_engine.js:280 | 個人所得税(累進・1000/100 円 floor) |
PersonalTaxEngine.calcResidentTax(taxableIncome) | 同:306 | 住民税 10% |
Constants.INCOME_TAX_BRACKETS.brackets | 000_infra/002_constants.js | 個人所得税ブラケット(5-45%) |
Constants.TAX_RATES.brackets | 同:22 | 法人税累進(軽減 15% / 標準 23.2%) |
Constants.getParam(key, default) | 同:167 | F66_* パラメータ取得 |
既存定数の構造(拡張時の参考)
Constants.INCOME_TAX_BRACKETS は { brackets: [{ upTo, rate, deduction }, ...] } 形式。本案件で新設する Constants.DIVIDEND_TAX_BRACKETS も同パターンで設計(並列対称性・failure_patterns #25 遵守)。
MAS-061 Cash ETR(v1.1・本案件と相互参照)
MAS-061 v1.1 の §6-3「合法節税優先順位サジェスト」連携策テーブルに 配当ミックス最適化(MAS-066 起票) が追加済(PR #382 で対応)。MAS-141 が共済 2 種、MAS-066 が配当ミックスの役割分担で、両者の simulateScan 結果を MAS-061 が統合スコアリングする設計。
MAS-057 Phase 3 SPA 基盤の流用
webapp_client/scripts/sync-engines.mjs(PR #379 で確立)が 400_domain/{442,443,444,445}*.js を webapp_client/src/engines/ にコピー + window 露出する仕組み。本案件で 449 を sync 対象に追加するだけで MAS-066 ドメインエンジンも同じ SSoT 共有方式が適用される(TypeScript 複製ゼロ)。
UI 統合方式は人間検討事項 #1 で要判断(案 A: MAS-057 cockpit に 4 つ目ドロップダウン追加 / 案 B: MAS-066 独立 cockpit 新設)。
修正方針
Step 1: 配当税制パラメータの整備
Constants.DIVIDEND_TAX_BRACKETS を新設(000_infra/002_constants.js・既存 INCOME_TAX_BRACKETS 直後に追加):
// Constants.DIVIDEND_TAX_BRACKETS (本案件で新設・2026 年税制対応)
Constants.DIVIDEND_TAX_BRACKETS = {
// 上場株式配当(申告分離課税の場合・一律 20.315%)
listed_separated: {
rate: 0.20315, // 所得税 15.315% + 住民税 5%
incomeTaxRate: 0.15315,
residentTaxRate: 0.05,
},
// 上場株式配当(総合課税の場合・配当控除あり)
listed_combined: {
creditRate: 0.10, // 課税所得 1,000 万以下: 配当所得 × 10%
creditRateOver1000: 0.05, // 1,000 万超部分: 5%(配当控除半減)
residentTaxCreditRate: 0.028, // 住民税側配当控除 2.8% (1,000 万超は 1.4%)
residentTaxCreditRateOver1000: 0.014,
},
// 非上場株式配当(総合課税のみ・配当控除あり)
unlisted_combined: {
creditRate: 0.10,
creditRateOver1000: 0.05,
residentTaxCreditRate: 0.028,
residentTaxCreditRateOver1000: 0.014,
minorityShareholderThreshold: 100000, // 10 万円以下は申告不要可(少額配当・非上場)
},
};
法令変更時の年次更新フロー(注意事項 #11 と整合): 毎年 3 月税制改正後に 002_constants.js を直接編集して更新。03_sys_params の F66_* キーは default 上書き用で、税制本体は Constants 一元管理。
Step 2: 配当所得計算 + 配当控除エンジン
// 400_domain/449_dividend_mix_optimizer.js (純粋関数 + IIFE 名前空間)
var DividendMixOptimizer = (function () {
/**
* @param {Object} input
* @param {number} input.dividendAmount 配当年額(円)
* @param {number} input.salaryIncome 給与収入額(年額・給与所得控除前)
* @param {number} input.dividendIncome 配当収入額(同 input.dividendAmount と等価・将来名称統一)
* v1.1: input を「課税所得」から「収入」に変更(Gemini レビュー Major 2 反映)
* 基礎控除の逓減(合計所得 2,400 万超で逓減・3,000 万超で消失)に対応するため、
* 課税所得を内部で再計算する必要がある
* @param {string} input.dividendType 'listed_combined' / 'listed_separated' / 'unlisted_combined'
* @returns {{ incomeTax, residentTax, dividendCredit, netDividend }}
*/
function calcDividendTax(input) {
var bracket = Constants.DIVIDEND_TAX_BRACKETS[input.dividendType];
if (!bracket) throw new Error('Unknown dividendType: ' + input.dividendType);
if (input.dividendType === 'listed_separated') {
// 申告分離課税: 一律 20.315%(給与所得とは合算しない)
var incomeTax = input.dividendAmount * bracket.incomeTaxRate;
var residentTax = input.dividendAmount * bracket.residentTaxRate;
return {
incomeTax: incomeTax,
residentTax: residentTax,
dividendCredit: 0,
netDividend: input.dividendAmount - incomeTax - residentTax,
};
}
// 総合課税: 累進 + 配当控除(v1.1 で総所得ベース再計算に修正・Gemini レビュー Major 2 反映)
// ① 給与所得 = 給与収入 − 給与所得控除(年収 850 万超は 195 万円固定)
var salaryIncomeAfterDeduction = _calcSalaryIncomeAfterDeduction_(input.salaryIncome);
// ② 合計所得金額 = 給与所得 + 配当所得(総合課税)
var totalIncome = salaryIncomeAfterDeduction + input.dividendAmount;
// ③ 基礎控除(合計所得 2,400 万以下: 48 万 / 2,400-2,450 万: 32 万 / 2,450-2,500 万: 16 万 / 2,500 万超: 0)
var basicDeduction = _calcBasicDeduction_(totalIncome);
// ④ 課税所得 = 合計所得 − 基礎控除 − 社保控除 − 他控除
var totalTaxable = Math.max(0, totalIncome - basicDeduction - (input.otherDeductions || 0));
var grossIncomeTax = PersonalTaxEngine.calcIncomeTax(totalTaxable);
var dividendCredit = _calcDividendCredit_(input.dividendAmount, totalTaxable, bracket);
var incomeTax = Math.max(0, grossIncomeTax - dividendCredit);
var grossResidentTax = totalTaxable * 0.10;
var residentCredit = _calcResidentDividendCredit_(input.dividendAmount, totalTaxable, bracket);
var residentTax = Math.max(0, grossResidentTax - residentCredit);
var taxOnDividend = (incomeTax + residentTax) * (input.dividendAmount / totalTaxable);
return {
incomeTax: incomeTax,
residentTax: residentTax,
dividendCredit: dividendCredit,
netDividend: input.dividendAmount - taxOnDividend,
};
}
return { calcDividendTax: calcDividendTax /* 他 */ };
})();
配当控除のブラケット境界処理: 課税所得 1,000 万を跨ぐ場合は、1,000 万までは 10% / 1,000 万超部分は 5% で按分計算(spec エッジケース #5 で網羅)。
【v1.2 追記】配当は離散イベント・月按分しない:
配当は株主総会決議で確定する金額であり離散イベントとして扱う。MAS-066 PR (#402) 実装では dividendAnnual 入力額を Y1 短縮事業年度でも按分せずそのまま使う。
設計理由:
- 入力 50 万 → 法人留保からきっかり 50 万減るのが直観的
- 会社法 461 条の分配可能額もこの設計と整合 (決議額 = 計上額)
- 配当は給与・固定費・法人保険料等のように毎月発生する支出ではない
他の年額項目との非対称性: cockpit の他の年額項目 (給与・固定費・法人保険料等) は monthFactor で按分するが、配当のみ按分しない。webapp_client/src/cockpit/calc.ts の computeYearlyBreakdown で配当処理時のみ dividendIncome = dividendAnnual (按分式 × monthFactor を適用しない) で実装されている。
Step 3: 3 軸最適化スキャン(A + B + C)
齋藤 Baseline + 高所得帯(年収 1,500 万)で 3 軸スキャン:
| 軸 | 範囲 | 刻み | パラメータ |
|---|---|---|---|
| 役員月額(A) | 25-100 万 | 5 万 | 16 段階 |
| 賞与年額(B) | 0-300 万 | 50 万 | 7 段階 |
| 配当年額(C・新規) | 0-500 万 | 50 万 | 11 段階 |
総組合せ: 16 × 7 × 11 = 1,232 セル。スキャン結果を「総報酬合計」「世帯純資産」「税負担合計」「社保負担合計」「配当ミックス比率」の 5 軸で評価し、パレート最適解を強調表示。
GAS 6 分制限への対応: simulateScan は純粋 JS 計算のみで 1 セル 1ms 想定 → 1,232 セル × 1ms = 1.3 秒で完走可能(クライアント側計算で実装する場合は更に高速)。
Step 4: 分配可能額制約バリデーション(会社法 461 条準拠)
// v1.1 追記 (Gemini レビュー Minor 反映)・v1.2 で取得元を訂正: BS データ取得経路
//
// validateDistributableAmount が要求する以下のフィールドは UI 層 / SPA bridge で
// 既存 BS シートから抽出して input に詰める前処理が必要。
//
// **【v1.2 訂正】v1.1 では `91_fs_bs` から抽出するとしていたが事実誤り**:
// `91_fs_bs` は決算 B/S で**動的生成タブ**であり、行/列構造が決算実行時に書き換わる。
// 正しい取得元は **`71_bs` (DDL 管理対象・行=科目/列=月の安定構造)**。
//
// | フィールド | 取得元 (v1.2 訂正) | 抽出方法 |
// |---|---|---|
// | retainedEarnings (利益剰余金) | **`71_bs`** (DDL 管理対象・行=科目/列=月の安定構造) | `BalanceSheetReader.getRetainedEarnings(fiscalYear)` (新設・別 PR) |
// | capitalSurplusOther (その他資本剰余金) | **`71_bs`** | 同上 |
// | treasuryStock (自己株式) | **`71_bs`** | 同上・通常は 0 |
// | previousDividends (既配当額) | `42_trn_journal` (配当決議仕訳) | `JournalRepository.findByAccountId('未払配当金')` |
// | fiscalYearCount (会計年度カウント) | `100_config/101_sys_config.js` | 設立日 + 会計期間で算出 |
//
// **【v1.2 実装スコープ判断】F-66 PR #402 では `validateDistributableAmount` を
// 純粋関数のみ実装** (input は呼び出し側が手で詰める)。`BalanceSheetReader` 新設は
// **F-66 マージ後の追加開発案件**として残置。F-66 cockpit UI 上は配当ドロップダウンを
// 提供するのみで、分配可能額の自動 BS 検証は将来 PR で追加予定。
function validateDistributableAmount(input) {
var distributable = input.retainedEarnings + input.capitalSurplusOther
- input.treasuryStock - input.previousDividends;
var safetyBuffer = Constants.getParam('F66_DISTRIBUTABLE_AMOUNT_BUFFER', 0.20);
var maxAllowed = distributable * (1 - safetyBuffer);
if (input.fiscalYearCount < 1) {
return { valid: false, reason: '1 期目決算前は配当不可', maxAllowed: 0 };
}
if (input.dividendAmount > maxAllowed) {
return { valid: false, reason: '分配可能額超過(安全余力 20% 控除後)', maxAllowed: maxAllowed };
}
return { valid: true, maxAllowed: maxAllowed };
}
分配可能額の計算(簡易版)
分配可能額 = その他資本剰余金 + その他利益剰余金 − 自己株式 − 既配当額 − 法務省令で定める額
bizlp 適用シナリオ:
- 1 期目(2025-11 〜 2026-07 想定): 決算確定までは配当決議不可
- 2 期目(2026-08 〜 2027-07): 1 期目利益剰余金確定後・初の配当検討可
F66_DISTRIBUTABLE_AMOUNT_BUFFER(default 20%)で安全余力を確保。実値は顧問税理士相談で確定(人間検討事項 #3)。
Step 5: UI 統合(要判断・人間検討事項 #1)
案 A: MAS-057 cockpit に 4 つ目ドロップダウン追加(spec 推奨・実装容易)
webapp_client/src/cockpit/CompensationDropdowns.tsx に「配当年額」ドロップダウン追加(既存 3 ドロップダウン: 役員報酬月額 / 賞与年額 / 社宅 / 共済 と並列)。webapp_client/src/cockpit/calc.ts に calcDividendTax を組込。v1.1 で本案を確定採用(F66_UI_INTEGRATION_MODE フラグは削除・Gemini レビュー Major 1 反映)。
Pros: 実装容易・SSoT 維持・MAS-057 cockpit のサンキー / 3 区分テーブルで配当軸も統一表示 Cons: MAS-057 Phase 3 実装に手戻り発生・配当 disabled 時の表示制御が必要
案 B: MAS-066 独立 cockpit 新設
v1.1 で本案は不採用(Gemini レビュー Major 1 反映・案 A 確定)。将来的に MAS-066 専用 UI が必要になった場合は本案を再検討(人間検討事項として残置)。templates/dividend_cockpit.html + webapp_client/src/dividend/*.tsx(5 React コンポーネント)。MAS-067 マルチイヤー cockpit と同様の独立 cockpit 構造(?view=dividend_spa)。
Pros: MAS-057 cockpit に手戻りなし・MAS-066 専用の高所得帯向け UI に特化可能 Cons: 実装規模大・3 cockpit(MAS-057/MAS-066/MAS-067)の運用負荷増
v1.1 で案 A 確定(Gemini レビュー Major 1 反映・実装プロンプトの分岐を削除し単一仕様化)。F66_UI_INTEGRATION_MODE フラグは廃止。
Step 6: MAS-061 Cash ETR 連携 + MAS-058 v2 拡張 + MAS-067 連携
MAS-061 連携(v1.1 で対応済)
MAS-061 v1.1(PR #382)の節税優先順位サジェストに MAS-066 simulateScan 結果を統合する API:
// 連携 API (F-61 から呼出される)
function getDividendMixOptimization(input) {
var scan = DividendMixOptimizer.simulateScan(input);
return {
bestMix: scan.paretoOptimal[0],
marginalEffect: scan.marginalEffect,
risks: ['1 期目決算前は配当不可', '会社法 461 条分配可能額制約'],
};
}
MAS-058 v2 拡張(別 PR・MAS-058 v2 起票後)
MAS-058 v2 で dividendMixRatio を solveRequiredRevenue の input に追加し、配当併用時の必要年商再計算を実装。MAS-058 spec の労働分配率制約(≤ 65%)の分子は役員報酬のみ → 配当併用で分子が減り粗利要件が緩む効果を反映。
MAS-067 マルチイヤー連携
MAS-067 spec v1.0(PR #386)の F67_DIVIDEND_INTEGRATION_ENABLED フラグで配当軸を任意有効化。MAS-066 仕様書完成後の MAS-067 Phase B 以降で本格統合。
影響範囲
| 対象 | 種別 | 変更内容 | リスク |
|---|---|---|---|
400_domain/449_dividend_mix_optimizer.js | 追加 | DividendMixOptimizer 名前空間(calcDividendTax / simulateScan / validateDistributableAmount + 内部ヘルパ群・約 300 行) | MAS-057 PersonalTaxEngine 呼出のみ・既存ロジックへの影響なし |
000_infra/002_constants.js | 変更 | Constants.DIVIDEND_TAX_BRACKETS 新設(既存 INCOME_TAX_BRACKETS 直後に追加) | 既存定数に影響なし |
webapp_client/src/cockpit/CompensationDropdowns.tsx | 変更(案 A) | 配当年額ドロップダウン追加 | MAS-057 Phase 3 実装に手戻り |
webapp_client/src/cockpit/calc.ts | 変更(案 A) | 配当計算ロジック追加 | 同上 |
templates/dividend_cockpit.html + webapp_client/src/dividend/*.tsx | 追加(案 B) | MAS-066 独立 cockpit | MAS-057 cockpit と並列稼働 |
webapp_client/scripts/sync-engines.mjs | 変更 | sync 対象に 449 追加(既存 442-445 と並列) | 既存 sync に影響なし |
300_ui/302_spa_bridge.js | 変更 | bootstrap に F66_* キー追加 + runDividendMixSimulation 関数追加 + getDividendMixOptimization(MAS-061 連携 API)追加 | 既存 SPA bridge に影響なし |
03_sys_params | 変更 | F66_* 5 キー追加 | default 動作・シード未実行でも動作 |
8XX_migration_f66_dividend_seed.js | 追加(任意) | F66_* キーシーダー(MAS-232 / MAS-057 Phase 3 同パターン) | optional |
900_test/901_test_runner.js | 変更 | F66-01〜F66-15 単体テスト追加(配当税計算 + 分配可能額検証 + 3 軸スキャン) | 既存テストへの影響なし |
| MAS-057 Phase 3 cockpit(案 A 採用時) | 変更 | 4 つ目ドロップダウン追加 | 既存 3 ドロップダウンの UI レイアウト調整必要 |
| MAS-058 RequiredRevenueSolver | 変更なし(v1) | MAS-058 v2 で dividendMixRatio 追加(別 PR) | 別案件として切出 |
| MAS-061 Cash ETR | 連携拡張 | getDividendMixOptimization() API 呼出(v1.2 で対応) | MAS-061 既存ロジック変更不要 |
| MAS-067 マルチイヤー | 連携拡張 | F67_DIVIDEND_INTEGRATION_ENABLED で切替(MAS-067 Phase B 以降) | MAS-067 既存ロジック変更不要 |
| appsscript.json | 変更なし | OAuth スコープ追加不要 | failure_patterns #26 遵守 |
注意事項
会社法 461 条の分配可能額制約: 1 期目決算前は配当決議不可。分配可能額の 20% は安全余力として確保(
F66_DISTRIBUTABLE_AMOUNT_BUFFER)。実値は顧問税理士相談で確定。違反時はvalidateDistributableAmountがエラー返却し UI で「配当決議不可」警告。株主総会決議の事務工数: 通常 1-2 時間 + 議事録作成。bizlp は一人法人なので手続き簡略化可だが記録は必須(税務調査時の証拠)。spec 内では事務工数は計算範囲外(人間判断・運用ガイドで対応)。
配当源泉徴収(20.42%): 支払時に源泉徴収・確定申告で精算。spec の
calcDividendTaxは確定申告後の実効税率を返却。源泉徴収のキャッシュフロー影響は別途_computeDividendCashFlow_ヘルパで算出。配当所得の住民税申告不要制度: 2024 年改正で原則廃止(所得税と住民税は同一申告必須)。spec はこの改正後ルール準拠で実装。
F66_DIVIDEND_TAX_MODEで旧ルール(住民税申告不要)への切替は提供しない。配当ミックスの「最低限の社保」確保戦略: 役員報酬を月 8 万円未満にすると国民健康保険 + 国民年金へ強制切替(厚生年金資格喪失)。
F66_MIN_OFFICER_COMP_FOR_INSURANCE(default 80,000)で警告閾値を管理。エッジケース #3 で対応。事前確定届出給与(賞与)と配当決議のタイミング相互制約: 賞与届出(株主総会決議日から 1 ヶ月以内)と配当決議(株主総会で同時決定可)のスケジュール調整必要。spec は
F66_DIVIDEND_DECISION_FREQUENCY = annualを default とし、四半期配当等の頻度変更は v2 で対応。failure_patterns #18-#20 遵守(命名造語禁止): 関数名(
calcDividendTax/simulateScan/validateDistributableAmount/DividendMixOptimizer)は既存命名規則と整合(動詞 + 目的語)。「Dividend」は業界標準英語で新語ではない。Read で既存ファイルに同名関数なきこと裏取り。failure_patterns #25 遵守(並列実装対称性): MAS-057 / MAS-058 / MAS-141 と純粋関数 + Constants.getParam パターンで対称。
Constants.DIVIDEND_TAX_BRACKETSはConstants.INCOME_TAX_BRACKETSと同形式({ brackets: [...] })。failure_patterns #26 遵守(oauthScopes):
appsscript.jsonは変更なし。failure_patterns #29 遵守(V8→Java Infinity null・v1.1 で対策方針を境界処理に修正・Gemini レビュー Critical 2 反映 / v1.2 で
_scrubInfinityForJSON_の出自を訂正): ❌ NG(v1.0 案)「Constants.DIVIDEND_TAX_BRACKETSに Infinity を含めない(Number.MAX_SAFE_INTEGER使用)」 → 既存Constants.INCOME_TAX_BRACKETS/TAX_RATESはupTo: Infinityを使用しており、本案件だけ別形式にすると failure_patterns #25(並列実装対称性漏れ)違反。✅ 採用方式(v1.1):Constants.DIVIDEND_TAX_BRACKETSも既存定数と完全に同形式でupTo: Infinityを使用。Infinity → null 化の境界問題は300_ui/302_spa_bridge.jsの_scrubInfinityForJSON_(value)純粋ヘルパでrunDividendMixSimulationがクライアントへ返す直前に置換する。サーバー側ロジック(DividendMixOptimizer)は Infinity のまま動作。
【v1.2 訂正】_scrubInfinityForJSON_の出自: v1.1 では「MAS-067 v1.1 で確立した同パターン」と参照していたが、MAS-067 v1.1 PR (#388) では具体的な汎用ヘルパとしては未実装で、300_ui/302_spa_bridge.js内の_buildF57CockpitBootstrap_でインライン.map()置換していただけだった。汎用ヘルパとして_scrubInfinityForJSON_(value)が初実装されたのは MAS-066 PR (#402) で、300_ui/302_spa_bridge.js末尾に再帰的に array / object をスキャンして Infinity / -Infinity / NaN をNumber.MAX_SAFE_INTEGER/-Number.MAX_SAFE_INTEGER/nullに置換する純粋関数として追加された。_buildF57CockpitBootstrap_の既存インライン置換は本 PR では触っていない (将来リファクタ候補・統一化予定)。税理士・公認会計士の個別助言代替不可: 全画面で常時表示の Disclaimer 必須(MAS-058 / MAS-061 / MAS-067 と同パターン)。「本提案は税理士・公認会計士の個別助言に代わるものではありません」を画面下部固定。
租税回避行為(法人税法 132 条)警告: 同族会社の行為計算否認規定に該当しうる手法(過大配当による役員報酬不当圧縮等)は提案しない。spec 内で「経済合理性のない配当ミックス」は警告表示。MAS-061 v1.1 のガードレールと整合。
法令変更時の年次更新フロー: 配当税率は 2024 年改正で住民税申告不要制度廃止 → 今後も改正可能性あり。
Constants.DIVIDEND_TAX_BRACKETSの年次更新フロー(毎年 3 月税制改正後に002_constants.jsを直接編集)を spec で明示。「税引後キャッシュ最大化」の評価軸: 単純な税額削減額ではなく、「(税額削減 - キャッシュアウト) + 退職時受取の現在価値」 で評価するのが本質。spec v1 では現在価値割引なしの単純差分を採用、v2 で NPV ベース評価を検討(MAS-141 spec の注意事項 #13 と同パターン)。
エッジケース
実装時に必ず以下 15 件を単体テストでカバーする。
| # | 条件 | 検知方法 | 期待される挙動 | ログ出力 |
|---|---|---|---|---|
| 1 | 1 期目決算前(fiscalYearCount < 1) | validateDistributableAmount | 配当不可エラー + UI で「決算後に再試行」案内 | ERROR |
| 2 | 分配可能額 < 入力配当額 | 同上 | エラー + maxAllowed を案内 | ERROR |
| 3 | 役員報酬 < 月 8 万円(厚年資格喪失境界) | monthlyOfficerComp < F66_MIN_OFFICER_COMP_FOR_INSURANCE | 警告 + 国民健康保険シミュレーション併記 | WARN |
| 4 | 配当年額 = 0 | dividendAmount === 0 | MAS-057 と完全同等の出力(A + B のみ・配当税ゼロ) | なし |
| 5 | 配当年額が個人課税所得を 1,000 万超に押し上げ | totalTaxable > 10000000 | 配当控除率が 10% → 5% に半減・按分計算 | INFO |
| 6 | 上場 vs 非上場の判定 | F66_DIVIDEND_TAX_MODE で分岐 | listed_combined / listed_separated / unlisted_combined を切替 | なし |
| 7 | 配当源泉徴収後の手取り計算 | _computeDividendCashFlow_ | 20.42% 源泉 → 確定申告で精算(住民税含む) | なし |
| 8 | 申告分離課税で給与所得と合算しないケース | dividendType === 'listed_separated' | 配当所得を給与所得に加算せず一律 20.315% で計算 | なし |
| 9 | 非上場少額配当(10 万円以下) | dividendAmount < bracket.minorityShareholderThreshold | 申告不要可(spec は申告するケースで計算・申告不要選択は v2 で対応) | INFO |
| 10 | スキャン結果が膨大(1,232 セル) | simulateScan の inner loop | GAS 6 分制限内で完走(純粋 JS 計算で 1.3 秒想定) | なし |
| 11 | パレート最適解が複数存在 | 同一の世帯純資産で複数組合せ | 全パレート解を強調表示 + ユーザー選択 | なし |
| 12 | 配当 + 賞与の組合せが税務否認リスク域 | bonusRatio > 0.40 && dividendRatio > 0.30 | 「税務否認リスク高」赤枠警告(MAS-057 注意事項 #15 と整合) | WARN |
| 13 | MAS-058 連動時に必要年商が配当併用で不足 | MAS-058 v2 連携時 | 「Healthy 達成困難」警告 + サジェスト | WARN |
| 14 | 03_sys_params の F66_* キーが範囲外(負値・100% 超) | 起動時バリデーション | default で上書き + WARN ログ | WARN |
| 15 | MAS-066 配当エンジンを呼び出した MAS-067 各年で分配可能額不足 | MAS-067 連携時 | 該当年で 🔴 + 「会社法 461 条違反」警告 | ERROR |
実データ検証
1. 齋藤 Baseline 拡張版(年商 5,000 万 + 役員報酬 1,000 万 + 配当 500 万)
実装完了後に以下を 901_test_runner.js で自動検証し、±5% 以内で一致を合格基準とする:
| シナリオ | 役員報酬 | 賞与 | 配当 | 個人税 + 社保 | 法人税 | 世帯純資産 |
|---|---|---|---|---|---|---|
| 全額役員報酬(A) | 1,500 万 | 0 | 0 | 約 480 万 | 約 700 万 | 約 1,820 万 |
| 配当ミックス(A+C) | 1,000 万 | 0 | 500 万 | 約 350 万 | 約 850 万 | 約 1,800 万 |
| 配当 + 賞与併用(A+B+C) | 800 万 | 200 万 | 500 万 | 約 320 万 | 約 850 万 | 約 1,830 万 ★最大 |
2. 配当控除のブラケット境界検証
| ケース | 給与所得 | 配当 | 課税所得合計 | 配当控除率 | 配当控除額 |
|---|---|---|---|---|---|
| 1,000 万以下 | 800 万 | 100 万 | 900 万 | 10% | 10 万 |
| 境界跨ぎ | 950 万 | 100 万 | 1,050 万 | 10% × 50 万 + 5% × 50 万 | 7.5 万 |
| 1,000 万超 | 1,200 万 | 100 万 | 1,300 万 | 5% | 5 万 |
3 ケースを単体テスト F66-04〜F66-06 で検証。
3. 分配可能額バリデーションの境界検証
- 1 期目(
fiscalYearCount = 0)→ 配当不可 - 2 期目期首(
fiscalYearCount = 1)+ 利益剰余金 1,000 万 + 安全余力 20% → maxAllowed = 800 万 - 配当 850 万入力 → エラー「分配可能額超過」
- 配当 800 万入力 → OK
4. MAS-057 PersonalTaxEngine との数値整合
calcDividendTax 内で呼び出した PersonalTaxEngine.calcIncomeTax / calcResidentTax の戻り値を MAS-057 単体テストの期待値と照合し、±1 円一致を合格基準とする(同一ライブラリ呼出のため)。
5. エッジケース検証(単体テスト F66-01〜F66-15)
エッジケースセクションの 15 項目それぞれを 1 テストケースとして 901_test_runner.js に追加。
関連ドキュメント
| カテゴリ | ドキュメント | 関係 |
|---|---|---|
| BRD(最重要) | brd_solo_ceo_financial_navigator.md §3.2 / §4.2 / §5.1 / §8 | 3 ルート拡張 + シナリオ E + MAS-066 スコープ明記(v2.1) |
| MAS-057 Solo-CEO Cockpit | dev_mas-057_solo_ceo_cockpit.md v2.0 | 給与系最適化(A + B)の SSoT・案 A 採用時の UI 拡張対象 |
| MAS-058 必要年商シミュレーター | dev_mas-058_required_revenue_solver.md v1.2 | 配当ミックス前提の必要年商再計算(v2 で dividendMixRatio 追加) |
| MAS-061 Cash ETR | dev_mas-061_cash_etr_tracking.md v1.1 | 節税優先順位サジェストに MAS-066 統合済 |
| MAS-067 マルチイヤー計画 | dev_mas-067_multiyear_planning_workspace.md v1.0 | 各年で配当ドロップダウン追加(任意有効化) |
| MAS-059 成長計画ワークスペース | dev_mas-059_growth_planning_workspace.md | AI 自動オーケストレーション・MAS-066 とは別物 |
| MAS-141 節税共済シミュレーター | dev_mas-141_tax_saving_simulator.md | 限界節税効率算出ロジックの構造類似性・配当を扱わないため重複なし |
| MAS-232 Sidebar SPA | dev_mas-232_sidebar_spa.md v1.4 | SPA 基盤・案 B 採用時に dividend_spa entry 追加 |
| 財務評価指標ガイド | financial_metrics_guide.md | 個人/法人/合計 3 区分 + フロー × ストック評価軸 |
| task_F-66.md(手動骨格) | tasks/prompts/task_F-66.md | 本仕様書を生成した手動骨格プロンプト(PR #383) |
| task_F-66.gemini.md(Gemini 版) | tasks/prompts/task_F-66.gemini.md | Gemini 3 Pro Preview + Deep Think の代替プロンプト案(PR #385) |
| Gemini レビュー結果(v1.1 反映元) | tasks/reviews/2026-04-27T11-48-58_gemini_review_f-66.md | scripts/4_review_specs_by_gemini.js で実施。WAIT 判定 + 5 件指摘 (Critical 2 + Major 2 + Minor 1)。Critical 1 は事実誤認 (MAS-057 Phase 3 完了済) のため反証・他 4 件を v1.1 で反映 |
| failure_patterns | failure_patterns.md | 特に #18-#20 / #25 / #26 / #29 / #31 |
| dev_spec_prompt_template | dev_spec_prompt_template.md v1.10 | Phase 1-A-pre 番号衝突チェック適用済 |
| PRD | prd.md | Human-in-the-Loop 原則 + Disclaimer |
| CLAUDE.md | CLAUDE.md | プロジェクトルール |
人間が検討すべき事項
UI 統合 vs 分離: ✅ v1.1 で解決済(Gemini レビュー Major 1 反映・案 A「MAS-057 cockpit 拡張」に確定・
F66_UI_INTEGRATION_MODEフラグ廃止)。将来的に MAS-066 専用 UI が必要になった場合の再検討余地のみ残置(v2 候補)。配当税制 default モード: 上場(
listed_combined)vs 非上場(unlisted_combined)vs 申告分離(listed_separated)。bizlp は非上場法人なのでunlisted_combinedが現実的だが、商用化時の顧客は上場法人ケースもあり得る。分配可能額の安全余力: default 20% の妥当性(顧問税理士相談必須)。SBI 証券等の実務目安では 10-30% が一般的。
国民健康保険切替の閾値: 役員報酬月 8 万円境界の精度(実額確認必要)。社労士相談で実値確定。
bizlp の配当ミックス導入時期: 1 期目決算後(2026-08 〜 想定)の運用開始判断。決算確定後に MAS-066 仕様書 v1.0 → 実装着手の流れ。
株主総会決議事務の自動化: GAS で議事録テンプレ自動生成するか(v2 候補)。一人法人なので手続き簡略化可だが記録自動化の価値あり。
MAS-058 v2 拡張のタイミング: MAS-066 実装と同時 or 別 PR。spec は別 PR 推奨(MAS-066 単体で完結 → MAS-058 v2 で連携追加)。
MAS-061 v1.2 連携実装のタイミング: MAS-066 仕様書完了後すぐ or MAS-066 実装後。MAS-061 v1.1 で API 連携の設計は済んでいるため、MAS-066 実装後の別 PR で対応推奨。
税理士レビュー必須項目の整理: spec 内に「税理士確認待ち」マーカーを設置する基準(注意事項 #1 / #11、人間検討事項 #3 / #4 等)。
顧客向けサービス化時の汎用化: bizlp 自身の運用を経て商用化時に顧客向けテンプレ化(PH-4)。上場 / 非上場の切替 UI、複数株主向けの按分計算等、商用化時の拡張余地。
配当 + 共済(MAS-141)の複合節税シミュレーション: MAS-066 と MAS-141 を統合した「節税策横断的最適化」(v3 候補)。両者の限界節税効率を統一スコアで比較する設計。
配当決議頻度の拡張:
F66_DIVIDEND_DECISION_FREQUENCY = annualを default としたが、四半期配当(quarterly)や月次配当(monthly・米国 REIT 型)への拡張を v2 で検討。
実装プロンプト(Claude Code 用)
Claude Opus 4.7(1M context)推奨。MAS-057 PersonalTaxEngine 結合 + 配当税制 + 会社法 461 条準拠 + 3 軸最適化アルゴリズム(1,232 セル)の複合判断。
## 案件
MAS-066 — 配当ミックス最適化(役員報酬 + 賞与 + 配当の 3 軸最適化)
## 事前調査(必ず Read する)
1. `docs/dev/dev_mas-066_dividend_mix_optimizer.md` 全文(本仕様書)
2. `docs/brd_solo_ceo_financial_navigator.md` §3.2 / §4.2 / §5.1 / §8(v2.1 改訂内容)
3. `tasks/prompts/task_F-66.md`(手動骨格プロンプト・PR #383)
4. `tasks/prompts/task_F-66.gemini.md`(Gemini 版・PR #385・補完視点)
5. `400_domain/442_social_insurance_tier_engine.js` 全文
— PersonalTaxEngine.calcIncomeTax/calcResidentTax の関数シグネチャ確認
6. `docs/dev/dev_mas-057_solo_ceo_cockpit.md` v2.0(案 A 採用時の UI 拡張対象)
7. `docs/dev/dev_mas-058_required_revenue_solver.md` v1.2(純粋関数 + Constants.getParam パターン手本)
8. `docs/dev/dev_mas-061_cash_etr_tracking.md` v1.1(連携策テーブル)
9. `docs/dev/dev_mas-067_multiyear_planning_workspace.md` v1.0(MAS-067 Phase B 以降の連携先)
10. `000_infra/002_constants.js` — Constants.INCOME_TAX_BRACKETS / TAX_RATES.brackets / getParam
11. `webapp_client/src/cockpit/CompensationDropdowns.tsx`(案 A 採用時の改修対象)
12. `webapp_client/scripts/sync-engines.mjs`(449 を sync 対象に追加)
13. `docs/_internal/failure_patterns.md` #18-#20 / #25 / #26 / #29 / #31
## 実装対象
1. `400_domain/449_dividend_mix_optimizer.js` 新規(IIFE 名前空間 DividendMixOptimizer):
- calcDividendTax(input) — 配当税計算 + 配当控除
- simulateScan(input, options) — 3 軸スキャン(1,232 セル)
- validateDistributableAmount(input) — 会社法 461 条準拠
- getDividendMixOptimization(input) — MAS-061 連携 API
- 内部ヘルパ: _loadParamsFromSysParams_ / _calcDividendCredit_ /
_calcResidentDividendCredit_ / _computeDividendCashFlow_
2. `000_infra/002_constants.js` 拡張:
- Constants.DIVIDEND_TAX_BRACKETS 新設(既存 INCOME_TAX_BRACKETS 直後)
3. UI 統合 (v1.1 で案 A 確定・案 B 廃止・Gemini レビュー Major 1 反映):
- webapp_client/src/cockpit/CompensationDropdowns.tsx に
配当年額ドロップダウン追加 (既存 3 ドロップダウンと並列で 4 つ目)
- webapp_client/src/cockpit/calc.ts に calcDividendTax を組込
4. webapp_client/scripts/sync-engines.mjs 拡張(449 を sync 対象に追加)
5. 300_ui/302_spa_bridge.js 拡張:
- bootstrap に F66_* キー追加
- runDividendMixSimulation 関数追加
- getDividendMixOptimization 関数追加(MAS-061 連携)
6. 03_sys_params の F66_* 5 キー追加
7. 8XX_migration_f66_dividend_seed.js 新規(任意・番号は `ls 800_ops/` で次番取得):
- F66_* キーシーダー(MAS-232 / MAS-057 Phase 3 同パターン)
8. 900_test/901_test_runner.js に F66-01〜F66-15 単体テスト
## 動作確認
1. 齋藤 Baseline 拡張版(年商 5,000 万 + 配当 500 万)で 3 シナリオの世帯純資産 ±5% 一致
2. 配当控除のブラケット境界検証(1,000 万跨ぎの按分計算)
3. 分配可能額バリデーションの境界検証(1 期目不可・分配超過エラー)
4. MAS-057 PersonalTaxEngine との数値整合 ±1 円一致
5. 3 軸スキャン(1,232 セル)が GAS 6 分制限内で完走
6. エッジケース 15 項目すべて想定通り
## デプロイ
1. dev で push:dev → メニュー or MAS-057 cockpit から配当軸シミュレーション実行
2. Go なら push:prod
3. コミット: feat(MAS-066): 配当ミックス最適化 (3 軸スキャン + 会社法 461 条準拠 + MAS-061 連携)
## failure_patterns チェック
- #18-#20: DividendMixOptimizer / calcDividendTax / simulateScan を Read で裏取り
- #25: MAS-057 / MAS-058 / MAS-141 と純粋関数 + Constants.getParam パターン対称
- #26: appsscript.json は変更なし
- #29: Constants.DIVIDEND_TAX_BRACKETS は既存 INCOME_TAX_BRACKETS と同形式 (Infinity 使用) で
整合性を維持 (v1.1・Gemini レビュー Critical 2 反映・定数 mutate 禁止)。
Infinity null 化対策は 300_ui/302_spa_bridge.js の _scrubInfinityForJSON_(dto)
境界処理 (MAS-067 v1.1 と同パターン) でクライアント送信直前に置換
- #31: 本仕様書起票時に Phase 1-A-pre 適用済(MAS-066 が次空き番号確認)
推奨実行モデル
| 工程 | 推奨モデル | 根拠 |
|---|---|---|
| Phase 1 Constants.DIVIDEND_TAX_BRACKETS 整備 + calcDividendTax | Claude Opus 4.7 (1M context) | 配当控除の所得帯別ルール + MAS-057 PersonalTaxEngine 統合の複合判断 |
| Phase 2 simulateScan 3 軸最適化(1,232 セル) | Claude Opus 4.7 (1M context) | 3 次元探索アルゴリズム + パレート最適解 |
| Phase 3 validateDistributableAmount 会社法 461 条準拠 | Claude Sonnet 4.6 | 法令準拠の検証ロジック |
| Phase 4 UI 統合(案 A or 案 B) | Claude Opus 4.7 (1M context) | MAS-057 cockpit 拡張の手戻りリスク判断 |
| Phase 5 MAS-061 / MAS-058 / MAS-067 連携 | Claude Sonnet 4.6 | 既存 API 呼出 |
| 単体テスト F66-01〜F66-15 | Claude Sonnet 4.6 | パターン化された期待値検証 |
| マイグレーション 8XX_migration_f66_dividend_seed(任意) | Claude Haiku 4.5 | 800_ops 既存パターン流用 |
| 仕様書レビュー | Gemini 3 Pro Preview + Deep Think | 第三者税務妥当性検証 + 2024 年改正反映確認 |
変更履歴
| 日時 | バージョン | 変更内容 |
|---|---|---|
| 2026-04-28 | v1.2 (実装完了反映・PR #402) | MAS-066 配当ミックス最適化エンジンを main 側 PR #402 (commit 09a0474・7 コミット = feat × 2 + fix × 3 + build × 2) で実装完了。動作確認: dev Deployed @115・F66-01〜F66-15 全 PASS。実装完了スコープ: (1) 400_domain/449_dividend_mix_optimizer.js 新設 (615 行・DividendMixOptimizer 名前空間) / (2) 000_infra/002_constants.js に DIVIDEND_TAX_BRACKETS 追加 (3 種・listed_combined / listed_separated / unlisted_combined) / (3) 300_ui/302_spa_bridge.js に bootstrap 配信 + _scrubInfinityForJSON_(value) 汎用ヘルパを末尾に新設 / (4) 400_domain/445_required_revenue_solver.js の _computePLSnapshot_ に dividendAmount input 追加・corporateRetainedAfterDividend = netProfit - dividendAmount で retentionRate / runwayMonths を再計算 / (5) webapp_client/src/cockpit/CompensationDropdowns.tsx に「配当年額」ドロップダウン追加・webapp_client/src/cockpit/calc.ts に calcDividendTax 組込 / (6) webapp_client/src/cockpit/RequiredRevenuePanel.tsx に panel-local の desiredDividendAnnual ドロップダウン追加 / (7) 800_ops/815_migration_f66_dividend_seed.js 新設 (F66_* キー seed) / (8) 900_test/901_test_runner.js に F66-01〜F66-15 単体テスト 15 件追加 / (9) webapp_client/scripts/sync-engines.mjs に 449 を追加 + webapp_client/src/cockpit-main.tsx に副作用 import を追加 (実装中の bug fix・commit 41305ea)。spec 訂正項目: (a) _scrubInfinityForJSON_ の出自訂正 (注意事項 #10): v1.1 で「MAS-067 v1.1 で確立した同パターン」と参照していたが、MAS-067 v1.1 PR (#388) では汎用ヘルパとしては未実装で _buildF57CockpitBootstrap_ のインライン置換のみだった。汎用ヘルパとして初実装されたのは MAS-066 PR #402 であることを明記。(b) Step 4 BS 取得経路訂正: v1.1 で 91_fs_bs (DDL 外・動的生成) としていたが事実誤り。正しくは 71_bs (DDL 管理対象・行=科目/列=月の安定構造)。BalanceSheetReader 新設は MAS-066 PR ではスコープ外でマージ後の追加開発案件として残置 (純粋関数のみ実装し input は呼び出し側が手で詰める設計)。(c) 配当の月按分仕様明記: 配当は離散イベント (株主総会決議で確定する金額) のため Y1 短縮事業年度でも入力額そのまま (按分しない)。給与・固定費・法人保険料等の monthFactor 按分とは非対称。(d) CockpitInputs / YearlyBreakdown 拡張: dividendAnnual: number (default 0) + `dividendType: 'listed_combined' |
| 2026-04-27 | v1.1 (Gemini レビュー WAIT → GO 反映) | scripts/4_review_specs_by_gemini.js で Gemini 3 Pro Preview + Deep Think レビューを実施し WAIT 判定 + 5 件指摘 (Critical 2 + Major 2 + Minor 1) を分析。レビュー結果: tasks/reviews/2026-04-27T11-48-58_gemini_review_f-66.md (3,005 文字)。Critical 1 (前提案件ステータス誤認) は事実誤認のため反証: Gemini は「MAS-057 Phase 3 未着手」と判断したが、実際は PR #379 (commit c27b0a5・2026-04-27) で main マージ済。MAS-066 spec の前提案件「MAS-057 Phase 1/1.5/2/3(✅ 完了)」は正しい。誤認の根拠は TODO_future.md MAS-057 行内の概要本文に古い記述「Phase 2-3 未着手」が残存していたため (ステータス列・冒頭進捗欄は最新 v2.0 反映済) → 別 PR で TODO 整理予定。Critical 2 (Infinity 非対称性) ✅修正: 注意事項 #10 の「Constants.DIVIDEND_TAX_BRACKETS に Infinity 含めない (Number.MAX_SAFE_INTEGER 使用)」アプローチを撤回。既存の INCOME_TAX_BRACKETS / TAX_RATES は upTo: Infinity を使用しており、本案件だけ別形式にすると failure_patterns #25 (並列実装対称性漏れ) 違反。✅ 採用方式: 既存定数と完全に同形式 (upTo: Infinity) を維持 + Infinity null 化対策は 300_ui/302_spa_bridge.js の _scrubInfinityForJSON_(dto) 境界処理 (MAS-067 v1.1 で確立した同パターン) で runDividendMixSimulation がクライアントへ返す直前に置換。Major 1 (UI 統合 A/B 並列残置) ✅修正: 案 A (MAS-057 cockpit に 4 つ目ドロップダウン追加) に確定し、F66_UI_INTEGRATION_MODE キー削除 (5 キー → 4 キー)。Step 5 / 影響範囲 / 人間検討事項 / 実装プロンプトの分岐記述を全て削除し単一仕様化。Major 2 (基礎控除逓減ロジック欠如) ✅修正: calcDividendTax の input 仕様を「課税所得 (taxableIncomeOther)」から「給与収入額 (salaryIncome) + 配当収入額」に変更し、内部で総合課税ロジック (給与所得控除 + 基礎控除逓減 (合計所得 2,400 万超で逓減・3,000 万超で消失) + 社保控除) を再計算する設計に修正。_calcSalaryIncomeAfterDeduction_ / _calcBasicDeduction_ 内部ヘルパ追加。Minor (BS データ取得経路) ✅対応: Step 4 validateDistributableAmount 直前に BS データ取得経路マッピング表追加 (retainedEarnings / capitalSurplusOther / treasuryStock / previousDividends / fiscalYearCount の各取得元 + BalanceSheetReader を 600_report 層に新設する設計)。合格判定: WAIT → GO に昇格 (Critical 1 反証 + 残り 4 件全て修正完了)。「失敗 → 教訓 → プロセス改善 → 品質保証」の閉ループ運用 が scripts/4_review_specs_by_gemini.js で機能することを実証 (MAS-067 v1.1 PR #388 に続く 2 例目)。docs-only PR で prod 自動デプロイへの影響なし。 |
| 2026-04-27 | v1.0 (仕様書完了) | 初版作成。task_F-66.md(PR #383 で起草・手動骨格 416 行)+ task_F-66.gemini.md(PR #385 で生成・Gemini 3 Pro Preview + Deep Think 5,185 文字)の 2 つの input を統合し、Claude Opus 4.7 (1M context) で本体起草。14 セクション全網羅: 概要 + 目的 + 現在のコード(MAS-057 PersonalTaxEngine 利用関数 + 既存定数構造 + MAS-061 v1.1 相互参照 + MAS-057 Phase 3 SPA 基盤の流用)+ 修正方針 6 Step(Step 1 配当税制パラメータ整備 / Step 2 calcDividendTax + 配当控除 / Step 3 3 軸最適化スキャン 1,232 セル / Step 4 分配可能額バリデーション会社法 461 条準拠 / Step 5 UI 統合案 A vs 案 B / Step 6 MAS-061/MAS-058/MAS-067 連携)+ 影響範囲(新規 1+任意 1 / 変更 6 / 変更なし 4)+ 注意事項 14 件(会社法 461 条 / 株主総会決議事務 / 配当源泉徴収 20.42% / 2024 年住民税申告不要制度廃止 / 国民健康保険切替境界 / 事前確定届出給与との相互制約 / failure_patterns #18-20/25/26/29 / Disclaimer / 法人税法 132 条 / 法令変更年次更新 / NPV 評価軸)+ エッジケース 15 件(1 期目決算前 / 分配可能額超過 / 厚年資格喪失境界 / 配当ゼロ / 1,000 万境界跨ぎ / 上場 vs 非上場 / 源泉徴収 / 申告分離 / 少額配当 / スキャン計算量 / パレート複数解 / 税務否認リスク / MAS-058 連動不足 / 03_sys_params 範囲外 / MAS-067 各年連携)+ 実データ検証 5 本(齋藤拡張版 3 シナリオ / 配当控除境界 3 ケース / 分配可能額バリデーション境界 / MAS-057 数値整合 / F66-01〜F66-15)+ 関連ドキュメント 15 件(BRD / MAS-057/MAS-058/MAS-061/MAS-067/MAS-059/MAS-141/MAS-232 + 財務評価指標ガイド + task_F-66.md/.gemini.md + failure_patterns + dev_spec_prompt_template + PRD + CLAUDE.md)+ 人間検討事項 12 件(UI 統合方式 / 配当税制 default / 安全余力 / 国保切替閾値 / 導入時期 / 株主総会自動化 / MAS-058 v2 タイミング / MAS-061 v1.2 タイミング / 税理士レビュー / 顧客向け汎用化 / 配当 + 共済複合 / 配当決議頻度)+ 実装プロンプト(Claude Opus 4.7 向け・事前調査 13 / 実装対象 8 / 動作確認 6 / failure_patterns チェック 5)+ 推奨実行モデル(Phase 1-5 + テスト + マイグレーション + レビュー)。failure_patterns #31 対策の継続適用: MAS-067 v1.0(PR #386)に続き、本案件起票時にも Phase 1-A-pre(番号衝突チェック・dev_spec_prompt_template v1.10)を適用済(MAS-066 は PR #382 で起票時に確認)。実装着手は MAS-057 Step 6(3 区分テーブル)+ MAS-058 Step 5(UI/SPA 連携)完了後を推奨(UI フレーム安定後に配当軸を追加)。今回のセッションで Gemini Deep Think レビュー(scripts/4_review_specs_by_gemini.js)は実施せず(任意・別 PR で実施可能)。docs-only PR で prod 自動デプロイへの影響なし。 |