MAS-363: 財務健全性信号機判定(5 段階・U字型非対称リスクモデル)
概要
| 項目 | 内容 |
|---|---|
| 案件 ID | MAS-363 |
| カテゴリ | FP&A / 健全性診断 |
| Phase | Phase 2 |
| 優先度 | P2 (★★) |
| 所要時間 | 6-8 時間 (実装 + テスト + UI 統合) |
| 対象ファイル | 600_report/613_health_diagnostic.js (新規)、600_report/609_datamart_kpi.js (信号機列の追加)、100_config/101_sys_config.js (03_sys_params パラメータ追加)、docs/spec/spec_bs.md §9 (仕様参照) |
| 前提案件 | MAS-008 (Cash Runway) — cashEnd / cfOp の月次配列を再利用 |
| 後続案件 | MAS-067 マルチイヤー計画ワークスペースとの連携、MAS-058 必要年商シミュレーターへの健全性制約フィード |
目的
docs/spec/spec_bs.md §9 で確定した「財務健全性信号機判定」仕様を実装する。一人法人 IT/コンサル業向けに 5 段階信号機 (🔴 危険 / 🟠 警告 / 🟡 注意 / 🟢 健全 / 🔵 過剰) で 5 指標 (現預金比率・自己資本比率・流動比率・固定比率・ランウェイ) を判定し、KPI ダッシュボード (93_kpi_dashboard) または専用タブに月次の信号機ステータスを出力する。
MAS-008 の単一指標ランウェイ判定(赤/黄の 2 段階)から、5 指標 × 5 段階の総合健全性ダッシュボードへの昇格。
仕様参照
実装の閾値・ロジック・UI 出力ガイドラインは docs/spec/spec_bs.md §9 が唯一のソース・オブ・トゥルース。本 dev spec は実装手順のみを記述する。
| spec_bs.md §9 参照 | 内容 |
|---|---|
| §9.1 | 設計思想(U字型非対称リスクモデル) |
| §9.2 | 5 段階閾値マトリックス |
| §9.3 | 補助ロジック(Tax-Adjusted Cash・MVS 監査) |
| §9.4 | 総合判定ロジック |
| §9.5 | メッセージ設計指針 |
| §9.6 | 03_sys_params パラメータ化対象 |
実装方針
Step 1: 健全性診断モジュールの新設 (613_health_diagnostic.js)
600_report/613_health_diagnostic.js
├ calcCashRatioMonths_(ctx) # 現預金比率(対月商倍率)
├ calcEquityRatio_(ctx) # 自己資本比率
├ calcCurrentRatio_(ctx) # 流動比率
├ calcFixedRatio_(ctx) # 固定比率
├ calcRunway_(ctx) # ランウェイ(既存 605 を再利用)
├ calcTaxAdjustedCash_(ctx) # 実質現預金(納税予測控除後)
├ checkMvsAudit_(ctx) # MVS(最低役員報酬)監査
├ classifySignal_(value, thresholds) # 値→信号機 5 段階分類
├ judgeOverallHealth_(signals) # 5 指標 → 総合判定
└ buildHealthDiagnosticOutput_(ctx) # 出力配列構築
入力: ctx.cashEnd[] / ctx.cfOp[] (605 から)、71_bs の月次残高 (604 から)、62_pl 月次売上 (603 から)
出力: 月次の信号機絵文字 + 数値 + 総合判定 + アクション提案メッセージ
Step 2: KPI ダッシュボード (609_datamart_kpi.js) への統合
93_kpi_dashboard タブに以下のセクションを追加:
🚦 財務健全性信号機 (B/S spec §9)
現預金比率(対月商) 2.8 ヶ月 🟢 健全
自己資本比率 78% 🟢 健全
流動比率 420% 🟢 健全
固定比率 12% 🟢 健全
ランウェイ 22 ヶ月 🔵 過剰 ← MAS-363 で追加
─────────────────────────────────
📊 総合判定 🔵 成長加速推奨
💡 提案: 18 ヶ月超のランウェイ保有は資金過剰保蔵を示唆。外注化・生産性投資の検討を推奨。
Step 3: 03_sys_params パラメータ追加
100_config/101_sys_config.js に以下のキーを追加(spec_bs.md §9.6 参照):
// 現預金比率(対月商)
HEALTH_CASH_RATIO_DANGER_MONTHS: 1.0,
HEALTH_CASH_RATIO_WARNING_MONTHS: 1.5,
HEALTH_CASH_RATIO_CAUTION_MONTHS: 2.5,
HEALTH_CASH_RATIO_HEALTHY_MIN_MONTHS: 2.5,
HEALTH_CASH_RATIO_EXCESSIVE_MONTHS: 6.0,
// 自己資本比率(%)
HEALTH_EQUITY_RATIO_DANGER: 15,
HEALTH_EQUITY_RATIO_WARNING: 30,
HEALTH_EQUITY_RATIO_CAUTION: 55,
HEALTH_EQUITY_RATIO_EXCESSIVE: 95,
// 流動比率(%)
HEALTH_CURRENT_RATIO_DANGER: 150,
HEALTH_CURRENT_RATIO_WARNING: 250,
HEALTH_CURRENT_RATIO_CAUTION: 500,
HEALTH_CURRENT_RATIO_EXCESSIVE: 1000,
// 固定比率(%)— 「>X」が悪化方向、「<5」が過剰判定
HEALTH_FIXED_RATIO_DANGER: 100,
HEALTH_FIXED_RATIO_WARNING: 70,
HEALTH_FIXED_RATIO_CAUTION: 50,
HEALTH_FIXED_RATIO_UNDERINVEST: 5,
// ランウェイ(ヶ月)
HEALTH_RUNWAY_DANGER_MONTHS: 3,
HEALTH_RUNWAY_WARNING_MONTHS: 6,
HEALTH_RUNWAY_CAUTION_MONTHS: 12,
HEALTH_RUNWAY_HEALTHY_MIN_MONTHS: 12,
HEALTH_RUNWAY_EXCESSIVE_MONTHS: 18,
// 補助ロジック
HEALTH_TAX_RESERVE_RATE: 0.30, // 法人税概算控除率
HEALTH_MVS_MONTHLY_JPY: 300000, // MVS 月額基準
Step 4: 総合判定ロジック
spec_bs.md §9.4 の通り、以下の優先順位で総合判定を行う:
function judgeOverallHealth_(signals) {
// signals = { cashRatio: 'healthy', equity: 'excessive', currentRatio: ..., fixedRatio: ..., runway: 'excessive' }
const counts = countByLevel_(signals);
if (counts.danger >= 1) return { level: 'danger', msg: '即時対応' };
if (counts.warning >= 2) return { level: 'warning', msg: '要改善 (3 ヶ月以内に経営戦略見直し)' };
if (counts.caution >= 3) return { level: 'caution', msg: '要監視 (月次モニタリング強化)' };
if (counts.excessive >= 2) return { level: 'excessive', msg: '成長加速推奨' };
if (counts.healthy >= 3 && counts.danger === 0 && counts.warning === 0)
return { level: 'healthy', msg: '健全 (現状維持)' };
return { level: 'caution', msg: '混在 (個別指標の改善検討)' };
}
Step 5: メッセージ生成(buildActionMessage_)
spec_bs.md §9.5 の「称賛 → 機会損失指摘 → 具体提案」3 段構成に従い、🔵 過剰検知時のテンプレートを実装。複数指標のコンテキストを踏まえた条件分岐:
| 検知パターン | 提案メッセージ |
|---|---|
| ランウェイ🔵 + 固定比率🔵 | 外注化(時間の買い戻し)+ PC・作業環境への投資 |
| ランウェイ🔵 + 自己資本比率🔵 | マーケ・営業投資 + 配当検討(株主=本人なので個人課税最適化込み) |
| 現預金比率🔵 単独 | 余剰現金の中長期金融資産運用 or 共済(経営セーフティ・小規模企業)への振替 |
エッジケース
| ケース | 条件 | 処理 |
|---|---|---|
| 月商ゼロ月 | 売上 = 0(休業月等) | 現預金比率の判定をスキップ(ゼロ除算回避) |
| 純資産マイナス | 累積赤字で純資産 < 0 | 自己資本比率は 0% 表示、固定比率は判定不能フラグ |
| バーンレート 0 or 正 | 黒字定常で営業 CF > 0 | ランウェイは「∞」表示、🟢 健全扱い |
| 設立初年度 | 当期売上のみで月商計算が不安定 | 直近 3 ヶ月平均 or 当期累計 ÷ 経過月数で代用 |
| 役員報酬未設定月 | 創業直後で報酬 = 0 | MVS 監査をスキップ |
| 期末月の納税予測 | 未払法人税等が既に計上済み | Tax-Adjusted Cash の二重控除を防止 |
注意事項
- spec_bs.md §9 を唯一の真実とする: 閾値変更は spec 側で実施し、本 dev spec は追従するのみ。
03_sys_params値も spec の §9.6 と一致させる - 指標値の Total 列は独自再計算: KPI ダッシュボードの Total 列は単純合算ではなく、年度末時点 or 加重平均で算出(MAS-008 の
filterValues規約を踏襲) - 絵文字の互換性: 🔵 (U+1F535) は GAS の
setNumberFormat経由で扱う際にエスケープが必要なケースあり。609_datamart_kpi.jsの既存パターンに従う - シナリオ別判定:
isActualOnlyフラグで実績 vs 予測を切り替え、予測月は健全性を「予測」マークで表示 - テスト:
900_test/にtest_health_diagnostic_*を追加(5 指標 × 5 段階 × エッジケース)
実装後の検証項目
- 5 指標が
93_kpi_dashboardに正しく表示される - 信号機絵文字が条件付き書式なしでも視認可能
- Tax-Adjusted Cash の控除が決算月直後で正しく機能(過剰な危険判定が出ない)
- MVS 監査が役員報酬月額 < 30 万円のケースで「注意」上書きを発動
- 総合判定の優先順位(🔴 > 🟠 > 🟡 > 🔵 > 🟢)が仕様通り
- アクション提案メッセージが過剰検知パターン別に切り替わる
関連ドキュメント
- 仕様:
docs/spec/spec_bs.md§9(信号機判定の唯一のソース) - 親案件:
docs/dev/dev_mas-008_cash_runway.md(ランウェイ単体の実装、本案件はその拡張) - 関連:
docs/dev/dev_mas-003_kpi_dashboard.md(KPI ダッシュボード基盤) - 連携先:
docs/brd_solo_ceo_financial_navigator.md§5 軸ステージ準備度モデル(MAS-067 マルチイヤー計画から本判定を呼び出し)
推奨実行モデル
Sonnet(仕様が spec_bs.md §9 で確定済みのため、実装は機械的。ただし KPI ダッシュボードの既存数式パターンとの整合性確認に注意)