MAS-141: 節税・共済効果シミュレーター(小規模企業共済 + 経営セーフティ共済)
概要
| 項目 | 内容 |
|---|---|
| 案件 ID | MAS-141 |
| 案件名 | 節税・共済効果シミュレーター(小規模企業共済 + 経営セーフティ共済・D.8 派生) |
| カテゴリ | シミュレーション・節税 |
| 優先度 | P1.5 ★★★(一人法人の最重要節税手段の定量化・MAS-057 BRD 必須サブコンポーネント) |
| 所要時間 | 約 1.0 ヶ月(週 10h 前提) |
| 実装ステータス | 📝 仕様書段階・実装未着手 (2026-04-28 監査時点) |
| 対象ファイル(新規) | 400_domain/451_tax_saving_simulator.js(純粋関数・TaxSavingSimulator 名前空間) |
| 対象ファイル(変更) | 000_infra/002_constants.js(MENU_DEFINITION 追加)/ 300_ui/301_ui_assist.js(サイドバーエントリ追加) |
| 新規シート | なし(既存 03_sys_params にキー追加のみ) |
新規 03_sys_params キー | S69_KYOSAI_PERSONAL_MIN_MONTHLY(default 1,000 = 月 1 千円)/ S69_KYOSAI_PERSONAL_MAX_MONTHLY(default 70,000 = 月 7 万)/ S69_KYOSAI_PERSONAL_STEP(default 1,000 = 千円刻み)/ S69_KYOSAI_BIZ_MIN_MONTHLY(default 5,000 = 月 5 千円)/ S69_KYOSAI_BIZ_MAX_MONTHLY(default 200,000 = 月 20 万)/ S69_KYOSAI_BIZ_TOTAL_CAP(default 8,000,000 = 積立上限 800 万)/ S69_BIZ_REJOIN_RESTRICTION_YEARS(default 2 = 2024-10 改正の解約後再加入制限)/ S69_DEFAULT_RECOMMENDATION_MODE(default balanced)の計 8 キー |
| 前提案件 | MAS-057 Phase 1/1.5(✅ 完了・PersonalTaxEngine 利用)/ Constants.TAX_RATES(既存・法人税ブラケット)/ Constants.INCOME_TAX_BRACKETS(MAS-057 Phase 1 で新設済) |
| 後続連携 | MAS-061 Cash ETR(合法節税優先順位サジェストに統合)/ MAS-058 必要年商シミュレーター(共済掛金を固定費に算入してリトライ)/ MAS-056 対話 UI(Tool 登録) |
| 吸収・再定義対象 | なし(個別節税案件 MAS-041 繰越欠損金 / MAS-049 賃上げ税制と並列の独立領域) |
目的
1 人法人の最重要節税手段を定量化し、最適掛金設定を支援する。
小規模企業共済(掛金上限月 7 万円・年 84 万円・全額所得控除)と経営セーフティ共済(月 20 万円・年 240 万円・全額損金算入・積立上限 800 万円)を対象に、想定当期利益・役員報酬・掛金から法人税・所得税の軽減額を計算する。掛金 0 〜上限のスキャンで「限界節税額」一覧を提示し、ユーザーが手元資金の最大化と現預金拘束のトレードオフを即座に判断できる。
MAS-041(繰越欠損金)/ MAS-049(賃上げ税制)は法人税額控除、本案件は役員個人の所得控除を含む複合節税シミュレーションで、より包括的な「税引後キャッシュ最大化」を扱う。MAS-057 BRD §6 UX 戦略の「共済積立額スライダー」を実装する基盤となる。
現在のコード
本案件は MAS-057 Phase 1/1.5 で確立した PersonalTaxEngine を順呼び出して、共済掛金を所得控除(個人)/ 損金算入(法人)に算入した状態の税額差分を算出するアグリゲータ。新規ロジックは共済 2 種の制度パラメータ管理 + スキャン + 出口リスク警告のみ。
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 | S69_* パラメータ取得 |
法定実効税率(既存・本案件で参照)
法人税合算実効税率は約 34%(軽減区分は約 22%)。本案件は実際の課税所得ベースで Constants.TAX_RATES を順呼び出して個別計算する(平均実効税率近似ではなく累進ベース正確算出)。
MAS-061 Cash ETR(仕様書完了・本案件と相互参照)
MAS-061 の「合法節税優先順位サジェスト」が本案件の simulateScan 結果を呼び出して優先順位リストに統合。MAS-141 が共済 2 種の効果を spec の責任範囲、MAS-061 が複数節税策の統合スコアリング という役割分担。
修正方針
Step 1 — 共済 2 種の制度パラメータ集中管理
| 制度 | 掛金範囲 | 上限 | 損金/控除区分 | 解約時税務 |
|---|---|---|---|---|
| 小規模企業共済 | 月 1,000 〜 70,000 円(千円刻み) | 年 84 万 | 個人所得控除(全額・所得税 + 住民税) | 退職所得 or 一時所得(受取時課税) |
| 経営セーフティ共済 | 月 5,000 〜 200,000 円(5,000 円刻み) | 年 240 万 / 積立 800 万 | 法人損金算入(全額・法人税) | 解約手当金が益金算入(出口リスク) |
2024-10 改正の重要ポイント: 経営セーフティ共済を解約後 2 年以内に再加入した場合は損金算入不可(S69_BIZ_REJOIN_RESTRICTION_YEARS = 2)。spec 上で警告表示必須。
// 03_sys_params 経由で読込(年次更新時に変更可能)
var KYOSAI_PERSONAL = {
minMonthly: Constants.getParam('S69_KYOSAI_PERSONAL_MIN_MONTHLY', 1000),
maxMonthly: Constants.getParam('S69_KYOSAI_PERSONAL_MAX_MONTHLY', 70000),
step: Constants.getParam('S69_KYOSAI_PERSONAL_STEP', 1000),
};
var KYOSAI_BIZ = {
minMonthly: Constants.getParam('S69_KYOSAI_BIZ_MIN_MONTHLY', 5000),
maxMonthly: Constants.getParam('S69_KYOSAI_BIZ_MAX_MONTHLY', 200000),
totalCap: Constants.getParam('S69_KYOSAI_BIZ_TOTAL_CAP', 8000000),
};
Step 2 — 単点シミュレーション(指定掛金での税額差分)
// 400_domain/451_tax_saving_simulator.js (純粋関数 + IIFE 名前空間)
var TaxSavingSimulator = (function () {
/**
* @param {Object} input
* @param {number} input.corporateTaxablePretax 共済掛金算入前の法人税課税所得
* @param {number} input.officerCompAnnual 役員報酬年額
* @param {number} input.kyosaiPersonalMonthly 小規模企業共済の月額掛金
* @param {number} input.kyosaiBizMonthly 経営セーフティ共済の月額掛金
* @param {number} input.kyosaiBizCumulative 経営セーフティ共済 既積立額
* @param {boolean} [input.isOver40] 40 歳以上(介護保険料)
* @returns {{
* corporateTaxBefore, corporateTaxAfter, corporateTaxSaving,
* personalTaxBefore, personalTaxAfter, personalTaxSaving,
* totalSaving, netCashBefore, netCashAfter,
* warnings: Array<string>
* }}
*/
function simulatePoint(input) {
var p = _loadParams_();
// (a) 入力バリデーション + 上限到達チェック
var warnings = [];
var bizMonthly = _clampBizMonthly_(input.kyosaiBizMonthly, input.kyosaiBizCumulative, p, warnings);
var personalMonthly = _clampPersonalMonthly_(input.kyosaiPersonalMonthly, p, warnings);
// (b) 法人税: セーフティ共済を損金算入した場合の課税所得差分
var bizAnnual = bizMonthly * 12;
var corporateTaxableAfter = input.corporateTaxablePretax - bizAnnual;
var corporateTaxBefore = _calcCorporateTax_(input.corporateTaxablePretax);
var corporateTaxAfter = _calcCorporateTax_(corporateTaxableAfter);
var corporateTaxSaving = corporateTaxBefore - corporateTaxAfter;
// (c) 個人税: 小規模企業共済を所得控除に算入した場合の差分
var personalAnnual = personalMonthly * 12;
var taxableIncomeBefore = _calcTaxableIncomeFromGrossComp_(input.officerCompAnnual, input.isOver40);
var taxableIncomeAfter = taxableIncomeBefore - personalAnnual;
var personalTaxBefore = PersonalTaxEngine.calcIncomeTax(taxableIncomeBefore) +
PersonalTaxEngine.calcResidentTax(taxableIncomeBefore);
var personalTaxAfter = PersonalTaxEngine.calcIncomeTax(taxableIncomeAfter) +
PersonalTaxEngine.calcResidentTax(taxableIncomeAfter);
var personalTaxSaving = personalTaxBefore - personalTaxAfter;
return {
corporateTaxBefore: corporateTaxBefore,
corporateTaxAfter: corporateTaxAfter,
corporateTaxSaving: corporateTaxSaving,
personalTaxBefore: personalTaxBefore,
personalTaxAfter: personalTaxAfter,
personalTaxSaving: personalTaxSaving,
totalSaving: corporateTaxSaving + personalTaxSaving,
netCashBefore: -bizAnnual - personalAnnual + 0,
netCashAfter: -bizAnnual - personalAnnual + (corporateTaxSaving + personalTaxSaving),
warnings: warnings,
};
}
return { simulatePoint: simulatePoint /* 他 */ };
})();
Step 3 — スキャンシミュレーション(掛金 0 〜上限の限界節税額一覧)
function simulateScan(input, options) {
var p = _loadParams_();
var bizSteps = _generateSteps_(p.bizMin, p.bizMax, p.bizStep); // 例: 0, 5000, 10000, ..., 200000
var personalSteps = _generateSteps_(p.personalMin, p.personalMax, p.personalStep); // 例: 0, 1000, ..., 70000
var results = [];
for (var i = 0; i < bizSteps.length; i++) {
for (var j = 0; j < personalSteps.length; j++) {
var single = simulatePoint(_extend_(input, {
kyosaiBizMonthly: bizSteps[i],
kyosaiPersonalMonthly: personalSteps[j],
}));
results.push({
bizMonthly: bizSteps[i],
personalMonthly: personalSteps[j],
totalSaving: single.totalSaving,
netCashEffect: single.netCashAfter, // 共済掛金支出 - 節税額 = 実質キャッシュアウト
warnings: single.warnings,
});
}
}
// 「限界節税額」=「掛金 1 円増やしたときの節税効果」
var marginalEffect = _calcMarginalEffect_(results);
return { scan: results, marginalEffect: marginalEffect };
}
スキャン結果の出力先: 98_sim_tax_saving(DDL 外・動的生成)に表形式で書出し。ヒートマップ的に視認しやすい配置(行 = セーフティ掛金 / 列 = 小規模共済掛金 / セル = 総節税額)。
Step 4 — 限界節税額の算出(最適掛金設定の判断材料)
marginalEffect = 「掛金 1 円増やしたときの節税効果」。これが 0.40 を下回ったら効率低下(個人累進税率が下がるブラケット境界・法人軽減税率と標準税率の境界 等)。UI 上で限界節税効率の落ち込みポイントを視覚的にハイライト。
例: 役員報酬 600 万 + 想定法人課税所得 800 万のケース:
- 小規模共済 月 0 → 月 1 万: 限界節税効率 0.42(個人 23% + 住民 10% = 33% × 控除)
- 小規模共済 月 7 万: 限界節税効率 0.40 程度(同ブラケット内)
- セーフティ共済 月 0 → 月 5 万: 限界節税効率 0.34(軽減 15% + 地方 7% = 22%)
- セーフティ共済 月 20 万: 限界節税効率 0.34(800 万境界以下なら同水準)
- セーフティ共済 月 33.3 万(年 400 万): 軽減税率境界突破で限界効率 0.40 へジャンプ
Step 5 — 出口リスク警告(解約時税務)
| 制度 | 出口課税 | spec 上の警告タイミング |
|---|---|---|
| 小規模企業共済 | 退職所得 / 一時所得(一括受取は退職所得控除有利) | 「20 年加入 + 一括受取で X 円控除」算出案内 |
| 経営セーフティ共済 | 解約手当金が益金算入 | スキャン時に「将来解約時に法人税課税が戻ってくる(節税ではなく課税繰延)」明示 |
2024-10 改正の重要警告: 経営セーフティ共済を 解約後 2 年以内に再加入した場合は損金算入不可(S69_BIZ_REJOIN_RESTRICTION_YEARS)。spec 上で「過去 2 年以内に解約していないか」のチェックボックスを入力 UI に必須配置。チェック時は警告表示 + シミュレーション結果に「再加入制限該当: 損金算入不可」コメント追加。
Step 6 — メニュー統合 + サイドバー連携
000_infra/002_constants.js の MENU_DEFINITION:
📊 マート更新 カテゴリに追加:
{ label: '💰 共済節税シミュレーション (MAS-141)', funcName: 'openTaxSavingSimulator', description: '小規模企業共済 + 経営セーフティ共済の節税効果スキャン (MAS-141)' },
300_ui/301_ui_assist.js のサイドバーエントリ:
サイドバー UI に「共済シミュレーション」タブを追加。入力フォーム(想定法人課税所得・役員報酬・既積立額・40 歳以上フラグ・再加入制限チェック)→ simulateScan 呼出 → 結果ヒートマップ表示。
影響範囲
| 対象 | 種別 | 変更内容 | リスク |
|---|---|---|---|
400_domain/451_tax_saving_simulator.js | 追加 | TaxSavingSimulator.simulatePoint() + simulateScan() + 内部ヘルパ群(純粋関数・約 250 行) | MAS-057 エンジン呼出のみ・既存ロジックへの影響なし |
000_infra/002_constants.js | 変更 | MENU_DEFINITION の 📊 マート更新 カテゴリに 1 行追加 | 既存メニューに影響なし |
300_ui/301_ui_assist.js | 変更 | サイドバーに「共済シミュレーション」タブ追加 | 既存タブに影響なし |
03_sys_params | 変更 | 8 キー追加(S69_*)。Constants.getParam 経由で読込・default fallback あり | シード未実行でも default 値で動作 |
98_sim_tax_saving(新設・DDL 外) | 追加 | 実行時に動的生成・スキャン結果を書き出す出力シート | 既存シートに影響なし |
8XX_migration_s69_sys_params.js | 追加(任意) | S69_* キーのシーダー(MAS-232 Stage 2 の 813 と同パターン) | シード未実行でも default で動作するため optional |
900_test/901_test_runner.js | 変更 | MAS-141 単体テスト S69-01〜S69-13 追加 | 既存テストへの影響なし |
| MAS-061 Cash ETR | 連携拡張 | simulateScan 結果を合法節税優先順位サジェストに統合 | MAS-061 既存ロジック変更不要 |
| MAS-057 PersonalTaxEngine | 変更なし(並行稼働) | MAS-057 側のエンジンには手を入れない・MAS-141 は純粋呼出側 | failure_patterns #25 遵守 |
| appsscript.json | 変更なし | OAuth スコープ追加不要 | failure_patterns #26 遵守 |
注意事項
2024-10 改正の解約後再加入制限: 経営セーフティ共済を解約後 2 年以内に再加入した場合は損金算入不可。spec 上で「過去 2 年以内に解約していないか」の UI チェックボックスを必須配置。チェック時は損金算入不可フラグで再計算 + 警告表示。
S69_BIZ_REJOIN_RESTRICTION_YEARSで年数管理。解約時益金算入リスク(経営セーフティ共済): 解約手当金は法人の益金として課税対象。spec は「節税ではなく課税繰延」を明示し、UI 上で「将来の解約時に法人税課税が戻る」コメント自動付加。MAS-058 連携時は将来年度の課税所得増を見込む warning。
小規模企業共済の出口課税最適化: 一括受取(退職所得)vs 分割受取(雑所得)で税負担が大きく変わる。spec v1 では一括受取(退職所得控除有利)を default 算出。分割受取の選択肢は v2 で追加。20 年加入で退職所得控除 800 万を案内コメントで提示。
個人所得税ブラケットの境界効果: 課税所得が 195 万 / 330 万 / 695 万 / 900 万 / 1,800 万 / 4,000 万のブラケット境界で限界節税効率が変化。
PersonalTaxEngine.calcIncomeTaxの累進計算結果をそのまま使い、spec 内で再計算しない(DRY 原則)。法人税軽減税率の 800 万境界: 法人課税所得 800 万以下は 15% / 超は 23.2%(地方税合算で実効率 22% / 34%)。セーフティ共済掛金で 800 万を切るかどうかが大きな分岐点。スキャン結果でこの境界を視覚的にハイライト。
掛金支払のキャッシュフロー影響: 共済掛金は実支払が発生する(節税ではなく現預金の制度内拘束)。
netCashEffectフィールドで「掛金支払 - 節税額」= 実質キャッシュアウトを併記し、UI 上で「キャッシュは X 円減るが税負担は Y 円減る」を明示。failure_patterns #25 遵守(並列実装対称性): MAS-057
SocialInsuranceTierEngine/ MAS-058RequiredRevenueSolverと純粋関数 + Constants.getParam パターンで対称。simulatePoint/simulateScanは MAS-057 既存メソッド命名と整合(動詞 + 目的語)。failure_patterns #18-#20 遵守(命名造語禁止): 関数名
simulatePoint/simulateScan/TaxSavingSimulatorは既存命名と整合。「共済」「Kyosai」を変数名に使うが、これは制度名(既存業界用語)で新語ではない。Read で既存ファイルに同名関数がないことを着手時に裏取り。failure_patterns #26 遵守:
appsscript.jsonの OAuth スコープは変更不要(既存スコープ内で完結)。法令変更時の年次更新フロー: 共済掛金上限は法令で変動可能性あり(2025/2026 改正動向は要 watch)。
03_sys_paramsの S69_* キーを年次更新するだけで対応できる構造を維持。Constants直接書き換えは禁止(テナント別オーバーライドを将来許可するため)。小規模企業共済加入資格の制約: 個人事業主または小規模企業の役員のみ加入可能(従業員 20 名以下の業種制限あり)。spec は加入資格 OK 前提(一人法人前提)。商用化時の加入資格チェックロジックは v2 で追加。
MAS-061 Cash ETR 統合時の優先順位ロジック: MAS-061 が複数節税策を統合スコアリングする際、本案件の
simulateScan結果から 限界節税効率の高い掛金 + 残予算 をサジェスト候補として渡す。MAS-061 spec の「節税優先順位サジェスト」アルゴリズムと整合。「税引後キャッシュ最大化」の評価軸: 単純な税額削減額ではなく、「(税額削減 - 掛金支払) + 退職時受取の現在価値」 で評価するのが本質。spec v1 では現在価値割引なしの単純差分を採用、v2 で NPV ベース評価を検討(
F58_NPV_DISCOUNT_RATEキーで割引率管理)。
エッジケース
| # | 条件 | 期待される挙動 | 理由・ログ出力 |
|---|---|---|---|
| 1 | 法人課税所得 ≤ 0(赤字法人) | セーフティ共済の節税効果ゼロ + 「赤字期は損金算入してもキャッシュ流出のみ」警告 | 赤字期は将来の繰越欠損金活用と MAS-041 連携検討のサジェスト |
| 2 | 役員報酬 0(個人税ゼロ) | 小規模共済の節税効果ゼロ + 「個人収入ゼロでは所得控除メリットなし」警告 | 役員給与なしの起業初期パターン |
| 3 | セーフティ共済 既積立 ≥ 800 万 | 月額掛金 = 0 にクランプ + 「積立上限到達」警告 | 上限超過の物理的不可能性を ガード |
| 4 | セーフティ共済 残予算 < 月額入力値 | 月額を残予算 ÷ 12 にクランプ + 警告 | 期途中の上限到達への対応 |
| 5 | 過去 2 年以内に解約済(チェックボックス ON) | セーフティ共済の損金算入不可で再計算 + 「再加入制限該当」警告 | 2024-10 改正対応 |
| 6 | 課税所得が法人税軽減税率境界を跨ぐ | スキャン結果で境界点を視覚的にハイライト | 限界節税効率のジャンプを UI で明示 |
| 7 | 課税所得が個人累進ブラケット境界を跨ぐ | 同上(個人税側) | 限界節税効率の段階変化を UI で明示 |
| 8 | 40 歳以上フラグ ON | 介護保険料が個人税計算に反映(MAS-057 既存ロジック) | MAS-057 注意事項と整合 |
| 9 | 03_sys_params の S69_* キーが範囲外 | 起動時バリデーション: 範囲外なら default で上書き + WARN ログ | ユーザー誤設定対策 |
| 10 | 個人税課税所得が 1,000 円未満(floor 丸め) | MAS-057 既存 PersonalTaxEngine の floor ロジックを流用 | MAS-057 spec v1.7 準拠 |
| 11 | スキャン結果が膨大(71 × 41 = 2,911 セル) | GAS 6 分制限を超えないよう simulatePoint の inner loop を最適化(pure JS 計算のみで 1 回 1ms 想定) | 計算量見積もり |
| 12 | MAS-058 必要年商連動時に共済掛金が固定費に追加 | MAS-058 solveRequiredRevenue の fixedCostAnnual に共済掛金合計を加算してリトライ | MAS-058 注意事項 #2 の単調性前提と整合 |
| 13 | MAS-061 Cash ETR 統合時に重複算入 | MAS-061 側で「MAS-141 節税策は所得控除/損金算入」、MAS-049 は「税額控除」と種別分けし二重カウント回避 | MAS-061 spec の優先順位アルゴリズム整合 |
実データ検証
1. 齋藤 Baseline での期待値(役員報酬 600 万 / 想定法人課税所得 800 万 / 40 歳未満)
実装完了後に以下を 901_test_runner.js で自動検証し、±5% 以内で一致を合格基準とする。
| 共済掛金パターン | 法人税節税 | 個人税節税 | 合計節税 | 実質キャッシュアウト |
|---|---|---|---|---|
| 小規模 0 / セーフティ 0 | 0 | 0 | 0 | 0 |
| 小規模 月 7 万 / セーフティ 0 | 0 | 約 28 万(84 万 × 33%) | 約 28 万 | 84 - 28 = 約 56 万 |
| 小規模 0 / セーフティ 月 20 万 | 約 53 万(240 万 × 22%) | 0 | 約 53 万 | 240 - 53 = 約 187 万 |
| 小規模 月 7 万 / セーフティ 月 20 万 | 約 53 万 | 約 28 万 | 約 81 万 | 324 - 81 = 約 243 万 |
2. 限界節税効率の境界点検証
役員報酬 1,200 万(個人課税所得 約 900 万・税率 23%)→ 小規模共済 7 万まで限界効率 33% で一定。役員報酬 1,800 万(個人課税所得 約 1,500 万・税率 33%)→ 限界効率 43% にジャンプ。これらの境界が spec の _calcMarginalEffect_ 出力で正確にトラックされることを単体テスト S69-06/S69-07 で検証。
3. 法人税軽減税率境界(800 万)の検証
想定法人課税所得 1,000 万 + セーフティ共済 月 17 万(年 204 万)→ 課税所得 796 万に圧縮 → 軽減税率適用で節税効果ジャンプ。スキャン結果のヒートマップでこの境界が視認できることを実機確認。
4. MAS-057 PersonalTaxEngine との数値整合
MAS-141 が呼び出した calcIncomeTax / calcResidentTax の戻り値を MAS-057 単体テストの期待値と照合し、±1 円一致を合格基準とする(spec 同一ライブラリ呼出のため)。
5. エッジケース検証(単体テスト S69-01〜S69-13)
エッジケースセクションの 13 項目それぞれを 1 テストケースとして 901_test_runner.js に追加。
関連ドキュメント
| カテゴリ | ドキュメント | 関係 |
|---|---|---|
| MAS-057 Solo-CEO Cockpit BRD | brd_solo_ceo_financial_navigator.md §4.3 | 「共済積立額スライダー」の実装基盤として MAS-141 を位置付け |
| MAS-057 Solo-CEO Cockpit | dev_mas-057_solo_ceo_cockpit.md | PersonalTaxEngine.calcIncomeTax/calcResidentTax を直接呼出 |
| MAS-058 必要年商シミュレーター | dev_mas-058_required_revenue_solver.md | 共済掛金を固定費に算入してリトライ可能性 |
| MAS-056 意思決定対話 UI | dev_mas-056_conversational_scenario_ui.md | Phase 2+ で Tool 登録(「セーフティ共済 月 20 万入れたら?」) |
| MAS-061 Cash ETR トラッキング | dev_mas-061_cash_etr_tracking.md | 合法節税優先順位サジェストに simulateScan 結果を統合 |
| MAS-049 賃上げ税制 | dev_mas-049_wage_increase_tax_credit_simulator.md | 並列の独立節税案件(税額控除軸) |
| MAS-041 繰越欠損金 | dev_mas-041_loss_carryforward.md | 並列の独立節税案件(過去欠損金活用軸) |
| MAS-059 意思決定ツリー | dev_mas-059_growth_planning_workspace.md | MAS-059 が MAS-141 を Tool として呼出 |
| R&D 税制試算 SSoT | rd_tax_credit_estimation_2026.md | 共済 + R&D 税制 + 賃上げの複合シミュレーション参考 |
| PRD プロダクトポリシー | prd.md | Human-in-the-Loop 原則 + 税理士助言代替不可 Disclaimer |
| 失敗パターン | failure_patterns.md | 特に #18-#20(命名造語)/ #25(並列実装対称性)/ #26(oauthScopes) |
| CLAUDE.md | CLAUDE.md | プロジェクトルール・GAS ファイル番号体系・コーディング規約 |
人間が検討すべき事項
小規模企業共済の出口受取方式 default: 一括受取(退職所得・spec 採用)vs 分割受取(雑所得)。20 年加入後の試算で一括受取が有利だが、ユーザー意向で切替可能にするか。
限界節税効率 0.40 の閾値妥当性: 個人 33% + 法人 22% を境にする数値だが、住民税均等割や事業税の細部で異なる。現行 spec はざっくり 0.40 採用、業界税理士レビューで再評価。
掛金スキャン粒度: 千円刻み(小規模共済)/ 5,000 円刻み(セーフティ共済)の現行設定で 71 × 41 = 2,911 セル。GAS 6 分制限と UI 視認性のバランス。粗くするか / 動的にスキャン範囲を絞るか。
2024-10 改正の解約後再加入制限の警告 UI: チェックボックスでの自己申告のみで OK か / 過去解約履歴を別マスタで管理するか。商用化時のテナント別履歴管理が必要になる可能性。
NPV ベース評価への拡張(v2 候補): 現在価値割引率(
F58_NPV_DISCOUNT_RATE)の default 値(5% / 3% / 0%)。共済 20 年積立の長期評価で大きな差が出る。MAS-058 と共有定数化する設計。MAS-058 必要年商連動の実装タイミング: MAS-058 spec で共済掛金を固定費に算入するロジックは v2 候補。MAS-141 単体実装後に MAS-058 連携を別 PR で追加するか、同時実装するか。
MAS-061 Cash ETR 優先順位サジェストへの統合タイミング: MAS-061 実装と本案件実装の前後関係。本案件先行 → MAS-061 が MAS-141 結果を呼出する形が筋。
MAS-056 対話 UI Tool 登録タイミング: MAS-056 Phase 2 で Tool 登録するか、Phase 3 で個人 B/S 統合と合わせて統合するか。MAS-058 注意事項 #5 と同じ判断軸。
業務委託・アルバイト等への加入資格チェック: 商用化時のマルチテナント対応で「小規模企業共済加入資格 OK ですか?」を初期セットアップウィザードで確認するか、運用前提として spec 外とするか。
共済以外の節税策(iDeCo / NISA / ふるさと納税)の追加判断: spec v1 は共済 2 種のみ、v2 で iDeCo(月 6.8 万・全額所得控除)/ NISA / ふるさと納税の併設検討。一人法人の最重要節税は共済 2 種で完結するため v1 はスコープ絞り推奨。
税率パラメータの年次更新運用: 法人税・個人税ブラケットは年次税制改正で変動。
Constants.TAX_RATES/Constants.INCOME_TAX_BRACKETSの更新フロー(毎年 3 月税制改正後に直接更新)を spec で明示。
実装プロンプト(Claude Code 用)
Claude Sonnet 4.6 推奨。MAS-057 エンジン結合 + スキャンアルゴリズム + 出口リスク警告の中難易度。
## 案件
MAS-141 — 節税・共済効果シミュレーター(小規模企業共済 + 経営セーフティ共済)
## 事前調査(必ず Read する)
1. `docs/dev/dev_mas-141_tax_saving_simulator.md` 全文(本仕様書)
2. `docs/brd_solo_ceo_financial_navigator.md` §4.3(共済積立額スライダー)
3. `400_domain/442_social_insurance_tier_engine.js` 全文
— PersonalTaxEngine.calcIncomeTax/calcResidentTax の関数シグネチャ確認
4. `docs/dev/dev_mas-057_solo_ceo_cockpit.md` §実データ検証(数値整合)
5. `docs/dev/dev_mas-058_required_revenue_solver.md` 純粋関数 + Constants.getParam パターン手本
6. `docs/dev/dev_mas-061_cash_etr_tracking.md` 統合先のサジェストアルゴリズム
7. `000_infra/002_constants.js` — Constants.TAX_RATES.brackets / INCOME_TAX_BRACKETS / getParam
8. `300_ui/301_ui_assist.js` サイドバー実装パターン
9. `docs/_internal/failure_patterns.md` #18-#20 / #25 / #26
## 実装対象
1. `400_domain/451_tax_saving_simulator.js` 新規(IIFE 名前空間 TaxSavingSimulator):
- simulatePoint(input) — 単点シミュレーション
- simulateScan(input, options) — スキャン(71 × 41 セル)
- 内部ヘルパ: _loadParams_ / _clampBizMonthly_ / _clampPersonalMonthly_ /
_calcCorporateTax_ / _calcTaxableIncomeFromGrossComp_ / _calcMarginalEffect_
2. `000_infra/002_constants.js` の MENU_DEFINITION:
- 「📊 マート更新」カテゴリに「💰 共済節税シミュレーション (MAS-141)」追加
3. `300_ui/301_ui_assist.js` 拡張:
- サイドバーに「共済シミュレーション」タブ追加
- 入力フォーム + ヒートマップ表示
4. `03_sys_params` の 8 キー追加(default は Constants.getParam の第 2 引数)
5. `8XX_migration_s69_sys_params.js` 新規(任意・番号は `ls 800_ops/` で次番取得):
- S69_* キーのシーダー(MAS-232 Stage 2 の 813 と同パターン)
6. `900_test/901_test_runner.js` に S69-01〜S69-13 単体テスト
## 動作確認
1. 齋藤 Baseline 4 ケース(共済 0/0, 7/0, 0/20, 7/20)の合計節税 ±5% 一致
2. 限界節税効率の境界点検出(役員報酬 1,200 万 → 1,800 万)
3. 法人税軽減税率 800 万境界のヒートマップ表示
4. MAS-057 PersonalTaxEngine との数値整合 ±1 円一致
5. エッジケース 13 項目すべて想定通り
## デプロイ
1. dev で push:dev → メニュー「💰 共済節税シミュレーション」実行 → 98_sim_tax_saving 確認
2. Go なら push:prod
3. コミット: feat(MAS-141): 節税・共済効果シミュレーター (小規模 + セーフティ + 限界節税効率)
## failure_patterns チェック
- #18-#20: TaxSavingSimulator / simulatePoint / simulateScan を Read で裏取り
- #25: MAS-057 PersonalTaxEngine と純粋関数 + Constants.getParam パターン対称
- #26: appsscript.json は変更なし
推奨実行モデル
| 工程 | 推奨モデル | 根拠 |
|---|---|---|
| Phase 1 TaxSavingSimulator コア(simulatePoint) | Claude Sonnet 4.6 | MAS-058 純粋関数パターン適用・中程度の判断 |
| Phase 2 simulateScan(71 × 41 ヒートマップ)+ 限界節税効率 | Claude Sonnet 4.6 | スキャンアルゴリズム + 境界点検出 |
| Phase 3 サイドバー UI 統合 | Claude Sonnet 4.6 | 既存 UxAssist パターン流用 |
| Phase 4 MAS-061 Cash ETR 統合 | Claude Opus 4.7 (1M context) | 多策統合スコアリングの判断 |
| Phase 5 MAS-058 連携(共済掛金を固定費算入) | Claude Opus 4.7 (1M context) | MAS-058 単調性前提との整合判断 |
| 単体テスト実装(S69-01〜S69-13) | Claude Haiku 4.5 | パターン化された期待値検証 |
| 仕様書レビュー | Gemini 3 Pro Preview + Deep Think | 第三者視点での税務妥当性 + 2024-10 改正反映確認 |
変更履歴
| 日時 | バージョン | 変更内容 |
|---|---|---|
| 2026-04-30 | v1.1 (ファイル名 + 内部参照を MAS-141 に整合化) | 2026-04-30 セッションで legacy prefix MAS-141 から MAS- prefix への整合作業を実施。変更内容: (1) ファイル名 dev_mas-141_tax_saving_simulator.md → dev_mas-141_tax_saving_simulator.md にリネーム / (2) Constants.MENU_DEFINITION の label / description 内の (S-69) → (MAS-141) に更新 / (3) 関連ドキュメントセクションの自己参照パスを更新 / (4) 他 spec (dev_F-66_* / dev_F-67_* / dev_N-42_* / financial_metrics_guide.md) からの引用パスを一括置換 / (5) docs/_config.json nav エントリの file 欄を更新 / (6) id_mapping_table.csv の source_file カラムを更新。aliases ["S-069", "S-69"] はマッピング保持のため維持 (frontmatter)。変更履歴の旧 entry の "S-69" 表記は履歴用に維持 (時系列の事実保全)。実装内容には変更なし (v1.0 仕様書完了状態を維持)。docs-only PR で prod 自動デプロイへの影響なし。今後の参照は dev_mas-141_*.md で統一。 |
| 2026-04-27 | v0.1 (骨組み) | 初版骨組み作成。全セクション見出し + 概要テーブルのみ。ai_agent_tips.md §6 の章単位生成方針を準用。 |
| 2026-04-27 | v0.2 (本体) | 現在のコード(MAS-057 PersonalTaxEngine 関数 + Constants.TAX_RATES + 法定実効税率参照 + MAS-061 連携)+ 修正方針 6 Step 本文(共済 2 種制度パラメータ集中管理 / 単点シミュレーション / スキャンシミュレーション 71×41 / 限界節税効率 / 出口リスク警告 / メニュー + サイドバー統合)。JavaScript 疑似コードで TaxSavingSimulator の simulatePoint / simulateScan を提示。 |
| 2026-04-27 | v0.3 (堅牢化) | 影響範囲テーブル(新規 2 / 変更 4 / 変更なし 2)+ 注意事項 13 項目(2024-10 改正の解約後再加入制限 / 解約時益金算入リスク / 出口課税最適化 / 個人累進ブラケット境界 / 法人税軽減税率 800 万境界 / キャッシュフロー影響 / failure_patterns #25/#26 / 法令変更年次更新 / 加入資格 / MAS-061 統合優先順位 / 税引後キャッシュ最大化評価軸)+ エッジケース 13 パターン(赤字法人 / 役員報酬ゼロ / 積立上限到達 / 残予算不足 / 過去 2 年解約 / 軽減税率境界 / 個人累進境界 / 40 歳以上 / 03_sys_params 範囲外 / 1000 円 floor / スキャン計算量 / MAS-058 連動 / MAS-061 二重カウント回避)+ 実データ検証 5 本(齋藤 Baseline 4 ケース / 限界節税効率境界 / 軽減税率境界 / MAS-057 数値整合 / S69-01〜S69-13)。 |
| 2026-04-27 | v1.0 (仕様書完了) | 関連ドキュメント 12 件(MAS-057 BRD / MAS-057 / MAS-058 / MAS-056 / MAS-061 / MAS-049 / MAS-041 / MAS-059 / R&D 税制 SSoT / PRD / failure_patterns / CLAUDE.md)+ 人間検討事項 11 項目(出口受取方式 / 限界効率閾値 / スキャン粒度 / 2024-10 改正 UI / NPV 拡張 / MAS-058 連携時期 / MAS-061 統合時期 / MAS-056 Tool 登録時期 / 加入資格チェック / 他節税策追加 / 税率年次更新)+ 実装プロンプト(Claude Sonnet 4.6 向け・事前調査 9 / 実装対象 6 / 動作確認 5 / failure_patterns チェック)+ 推奨実行モデル(Phase 1-5 + テスト + レビュー)。仕様書完了(v1.0)として昇格。前提案件 MAS-057 Phase 1/1.5 揃っているため即時着手可能。MAS-061 Cash ETR / MAS-058 連携は本案件実装後に別 PR で追加。 |