MAS-072: 企業価値(時価評価額)スコアボード機能(3 評価手法統合・MAS-057 cockpit 拡張)
概要
| 項目 | 内容 |
|---|---|
| 案件 ID | MAS-072 |
| 案件名 | 企業価値(時価評価額)スコアボード機能(3 評価手法統合・MAS-057 cockpit 拡張) |
| カテゴリ | KPI ダッシュボード / 企業価値経営 / 役員報酬戦略連動 |
| Phase | P2 |
| 優先度 | ★★ |
| 所要時間 | 約 2 週間(Phase 1 計算エンジン 3 日 + Phase 2 React Panel 5 日 + Phase 3 cockpit 統合 + テスト 2 日・週 10h 前提) |
| 対象ファイル(新規) | 400_domain/455_valuation_engine.js(純粋関数・IIFE 名前空間 ValuationEngine・3 評価手法 calc{Management/Accumulation/TaxValuation}Score を対称関数化・約 250 行)/ webapp_client/src/cockpit/ValuationScoreboard.tsx(React 独立パネル・MAS-071 4 アプローチ比較棒グラフ直下・約 400 行) |
| 対象ファイル(変更) | 000_infra/002_constants.js(Constants.MAS072_DEFAULTS 新設・EBITDA マルチプル default 等)/ 300_ui/302_spa_bridge.js(bootstrap に MAS072_* キー追加 + runValuationScoreboardCalc 関数追加)/ webapp_client/scripts/sync-engines.mjs(455 を sync 対象に追加・failure_patterns #33 対策)/ webapp_client/src/cockpit-main.tsx(import './engines/455_valuation_engine.js' を副作用 import 追加・failure_patterns #33 対策) |
| 新規シート | なし(既存 03_sys_params にキー追加のみ) |
新規 03_sys_params キー | MAS072_EBITDA_MULTIPLE_DEFAULT(default 5・EBITDA マルチプル倍率 default)/ MAS072_EBITDA_MULTIPLE_MIN(default 3・UI スライダー下限)/ MAS072_EBITDA_MULTIPLE_MAX(default 10・UI スライダー上限)/ MAS072_BADGE_THRESHOLD_GROWTH(default 30000000・🌱→🚀 閾値)/ MAS072_BADGE_THRESHOLD_TOP(default 100000000・🚀→🏆 閾値)/ MAS072_OFFBALANCE_DEFAULT(default 0・簿外資産 default)/ MAS072_NET_ASSETS_DEFAULT(default 0・帳簿純資産 default)の計 7 キー |
| 前提案件 | MAS-057 Phase 3(✅ 完了 PR #379・SPA 基盤・cockpit ドロップダウン群 + sync-engines.mjs 確立)/ MAS-071(Draft・理論報酬 TC 供給元・本案件と同 PR or 直後 PR で実装予定)/ MAS-141(Draft・経営セーフティ共済 簿外資産 連携元) |
| 後続案件 | 価値ベース KPI ダッシュボード v2(時系列推移グラフ + 期末スナップショット保存・MAS-067 マルチイヤー連携)/ MAS-066 配偶者株主評価ロジック連携(v2 候補) |
| 吸収・再定義対象 | なし(MAS-057 給与系 + MAS-071 報酬戦略 + MAS-072 「企業価値 KPI 視点」のスコープ分離) |
目的
bizlp Solo-CEO(一人社長)が自社の経営の通信簿として企業価値(時価評価額)をリアルタイムに把握し、企業価値向上を数値目標として追えるようにする。本案件はバイアウト(M&A 売却)目的ではなく、KPI(経営指標)として位置付ける。
MAS-057 cockpit と MAS-071 役員報酬シミュレータが「役員報酬の最適化(手取り最大化・税務調査防衛)」を提供したのに対し、MAS-072 は 役員報酬の設定が企業価値(株式価値)にどう影響するか(あるいは正常化調整によって影響しないか)を 3 評価手法で多角的に可視化することで、Solo-CEO が「報酬を上げて手取りを増やすべきか」「報酬を抑えて法人内に蓄積すべきか」「税務評価への影響はどうか」の意思決定軸を数値で確認できるようにする。
特に EBITDA マルチプル法による経営力スコアは、役員報酬を理論報酬額(市場相場)で正常化調整することで「役員報酬を恣意的に下げて見かけの利益を作っても企業価値は変わらない(ごまかせない)」ことを学習させる教育的 UX を提供する。これは中小企業の M&A 現場で標準的に行われる正常化調整(normalization adjustment)を Solo-CEO に体感させ、**「正しい財務的判断(経営力 vs 蓄積 vs 税務)」**を支援する点が他社 SaaS にない差別化機能。
現在のコード
本案件は MAS-057 cockpit の既存ドロップダウン入力(OP_pre / C / D&A)と MAS-071 理論報酬計算(TC)を順呼び出しして 3 評価手法を算出する純粋集約関数。新規ロジックは EBITDA 正常化調整 + マルチプル法による株式価値計算 + 時価純資産法ベース蓄積スコア + 財産評価基本通達簡易版による税務評価スコアのみ。
MAS-057 Phase 3(✅ 完了)の利用入力
| 入力源 | 供給元 | 本案件での用途 |
|---|---|---|
OP_pre(役員報酬控除前 営業利益) | MAS-057 cockpit AssumptionsBar + CompensationDropdowns(webapp_client/src/cockpit/AssumptionsBar.tsx) | 3 スコア全ての基礎数値 |
C(実際の役員報酬・年額) | MAS-057 cockpit CompensationDropdowns(webapp_client/src/cockpit/CompensationDropdowns.tsx) | 蓄積スコア + 税務評価スコアの計算 + 経営力スコアの正常化調整対象 |
D&A(減価償却費・年額) | MAS-057 cockpit AssumptionsBar(既存ドロップダウン or 数値入力) | 経営力スコア(EBITDA = OP_pre - TC + D&A) |
Constants.getParam('MAS072_*') | 000_infra/002_constants.js:167(既存 getParam) | EBITDA マルチプル等の運用パラメータ |
MAS-071 連携(同 PR or 直後 PR 完了前提)の利用入力
| 入力源 | 供給元 | 本案件での用途 |
|---|---|---|
TC(理論報酬額・稼働率 × 市場価値積算) | MAS-071 CompensationStrategyEngine.calcTheoreticalCompensation(input)(400_domain/454_compensation_strategy_engine.js) | 経営力スコアの 正常化調整値(役員報酬を市場相場に置換) |
裏取り原則(failure_patterns #18-#20): 上記の関数シグネチャ・行番号は MAS-057 spec / MAS-071 spec から転記しており、実装着手前に Read で再確認すること。CompensationStrategyEngine.calcTheoreticalCompensation は MAS-071 PR で実装される予定であり、MAS-072 の単体動作のためにはフォールバック(input.theoreticalCompensation || input.actualCompensation)を実装する。
MAS-067 / MAS-141 連携(後続)の利用入力
| 入力源 | 供給元 | 本案件での用途 |
|---|---|---|
NetAssets(帳簿純資産) | MAS-067 initialBS の equity 引継機能 / フォールバック: MAS-057 法人期首預金残高(Step 6.14) | 蓄積スコア + 経営力スコア + 税務評価スコアの基礎値 |
OffBalanceAssets(簿外資産・経営セーフティ共済解約返戻金) | MAS-141 SafetyKyosaiEngine 積立累計(400_domain/451_tax_saving_simulator.js・実装予定) | 蓄積スコア + 経営力スコアの加算項 |
連携先 spec が未実装のため、v1 では手動入力フォールバック(panel-local の number 入力で NetAssets / OffBalanceAssets を直接設定可)を実装し、MAS-067 / MAS-141 完了後に PR で自動連携を追加する段階導入方式を採用する。
MAS-057 Phase 3 SPA 基盤の流用(failure_patterns #33 対策)
webapp_client/scripts/sync-engines.mjs(PR #379 で確立)が 400_domain/{442,443,444,445,449,451,454}_*.js を webapp_client/src/engines/ にコピー + window 露出する仕組み。本案件で 455 を sync 対象に追加 + webapp_client/src/cockpit-main.tsx に import './engines/455_valuation_engine.js' を副作用 import 追加することで MAS-072 ドメインエンジンも同じ SSoT 共有方式が適用される(TypeScript 複製ゼロ)。
failure_patterns #33 (MAS-066 PR #402 で発覚) 必須チェック: sync-engines.mjs への追加だけでは Vite が tree-shaking で除外する。必ず cockpit-main.tsx に副作用 import を追加すること。MAS-066 / MAS-071 では同問題で同様 fix された前例あり。
MAS-071 配置原則の準拠
MAS-071 spec(v0.1)で確立した cockpit 配置原則「現状把握↑ vs 目標逆算↓」の 目標逆算レイヤーの最下部(MAS-058 健全性診断 → MAS-071 4 アプローチ → MAS-072 企業価値スコアボード)に本パネル ValuationScoreboard.tsx を配置する。理由: 企業価値スコアボードは「3 つの異なる評価軸で目標値を設定する KPI」性質を持ち、MAS-071 の役員報酬戦略の結果を即座に企業価値で評価できる位置に並ぶのが概念的に自然(役員報酬ドロップダウン → 4 アプローチ比較 → 3 スコア比較のスクロール 1 画面)。
修正方針
Step 1: 計算エンジン Pure Function の新設(Phase 1)
400_domain/455_valuation_engine.js を新規作成。IIFE + グローバル変数宣言パターン(既存 442〜454 と並列対称・MAS-057 注意事項 #14 (b) 採用方式)。
// 400_domain/455_valuation_engine.js (純粋関数 + IIFE 名前空間)
var ValuationEngine = (function () {
/**
* @param {Object} input
* @param {number} input.opPre 役員報酬控除前 営業利益(年額)
* @param {number} input.actualCompensation 実際の役員報酬 C(年額)
* @param {number} input.theoreticalComp 理論報酬額 TC(MAS-071 から取得)
* @param {number} input.depreciation 減価償却費 D&A(年額)
* @param {number} input.netAssets 帳簿純資産(負値も許容・債務超過)
* @param {number} input.offBalanceAssets 簿外資産(経営セーフティ共済解約返戻金等)
* @param {number} input.multiple EBITDA マルチプル倍率(default 5)
* @returns {{ managementScore, accumulationScore, taxValuationScore, normalizedEbitda, ev }}
*/
function calcAllScores(input) {
var normalizedEbitda = _calcNormalizedEbitda_(input);
var ev = _calcEnterpriseValue_(normalizedEbitda, input.multiple);
return {
managementScore: calcManagementScore(input, ev),
accumulationScore: calcAccumulationScore(input),
taxValuationScore: calcTaxValuationScore(input),
normalizedEbitda: normalizedEbitda,
ev: ev,
};
}
/** 経営力スコア = EV + NetAssets + OffBalanceAssets(EBITDA マルチプル法ベース) */
function calcManagementScore(input, ev) {
var v = ev + input.netAssets + input.offBalanceAssets;
return Number.isFinite(v) ? v : 0;
}
/** 蓄積スコア = NetAssets + OffBalanceAssets(時価純資産法ベース) */
function calcAccumulationScore(input) {
var v = input.netAssets + input.offBalanceAssets;
return Number.isFinite(v) ? v : 0;
}
/** 税務評価スコア = (OP_pre - C) × 0.5 + NetAssets × 0.5(財産評価基本通達 簡易版・参考値) */
function calcTaxValuationScore(input) {
var v = (input.opPre - input.actualCompensation) * 0.5 + input.netAssets * 0.5;
return Number.isFinite(v) ? v : 0;
}
// 内部ヘルパ(末尾 _ で private 化・failure_patterns #28 遵守)
function _calcNormalizedEbitda_(input) {
// 調整 EBITDA = OP_pre - TC + D&A(役員報酬を理論値で正常化調整)
var v = input.opPre - input.theoreticalComp + input.depreciation;
return Number.isFinite(v) ? v : 0;
}
function _calcEnterpriseValue_(normalizedEbitda, multiple) {
var raw = normalizedEbitda * multiple;
if (!Number.isFinite(raw)) return 0;
return Math.max(0, raw);
}
return {
calcAllScores: calcAllScores,
calcManagementScore: calcManagementScore,
calcAccumulationScore: calcAccumulationScore,
calcTaxValuationScore: calcTaxValuationScore,
};
})();
// failure_patterns #14 (b) window 露出(sync-engines.mjs が末尾に自動付与)
if (typeof window !== 'undefined') {
window.ValuationEngine = ValuationEngine;
}
3 スコアの対称な引数構造(failure_patterns #25 対策)
calcManagementScore(input, ev) のみ第二引数に ev を取るが、これは内部ヘルパで生成した正常化 EBITDA × マルチプルを再利用するための最適化。calcAccumulationScore(input) / calcTaxValuationScore(input) は input 単独で完結する純粋関数として対称実装する。戻り値型は全て number(Number.isFinite ガード経由)で揃える。
Step 2: React Panel UI の新設(Phase 2)
webapp_client/src/cockpit/ValuationScoreboard.tsx を新規作成。
コンポーネント構造
// ValuationScoreboard.tsx の主要セクション(上から順に表示)
// ─────────────────────────────────────────────
// ① ヘッダー(「あなたの会社の通信簿(KPI)」+ Disclaimer 常時表示)
// ② メインスコア表示(3 列グリッド・大型数値 + 直近変動 Δ アニメーション)
// 🏆 経営力スコア / 💰 蓄積スコア / 📋 税務評価スコア
// ③ EBITDA マルチプルスライダー(3-10 倍・default 5)
// ④ 簿外資産入力(手動 or MAS-141 自動連携)+ 帳簿純資産入力
// ⑤ スコア帯バッジ表示(🌱 新興 / 🚀 成長 / 🏆 一流)
// ⑥ 役員報酬感度ミニグラフ(C を変動させたときの 3 スコアの動きを併置・教育的 UX)
// ⑦ 正常化調整解説ツールチップ(?アイコン hover で展開)
// ⑧ Disclaimer(バイアウト価格との乖離可能性 + KPI 用途限定)
リアルタイム再計算とアニメーション
cockpit 既存の useMemo パターン(MAS-058 / MAS-066 で確立)を流用。OP_pre / C / D&A / TC / Multiple のいずれかが変更されると useMemo が再評価され、ValuationEngine.calcAllScores を呼出して 3 スコアを更新。直近変動 Δ は useRef で前回値を保持し Δ = 今回値 - 前回値 を緑↑赤↓のアニメーションで表示(CSS transition or framer-motion を採用・MAS-058 RequiredRevenuePanel と同パターン)。
ゲーミフィケーション要素
// スコア帯別バッジ(経営力スコア基準・閾値は Constants.getParam で運用上書き可)
function getBadge(managementScore: number, params: ValuationParams): { emoji: string; label: string } {
if (managementScore < params.badgeThresholdGrowth) return { emoji: '🌱', label: '新興' };
if (managementScore < params.badgeThresholdTop) return { emoji: '🚀', label: '成長' };
return { emoji: '🏆', label: '一流' };
}
「現在のあなたの企業価値は 〇〇円 です」のメイン数値表示は、桁数に応じて自動で「万円」「億円」単位を切り替え(formatCurrency(value, { autoUnit: true })・MAS-058 で確立済の formatJPY ヘルパを流用検討)。
正常化調整の解説 UI(教育的 UX の核心)
3 スコアの説明ツールチップ:
| スコア | ツールチップ文言 |
|---|---|
| 経営力スコア | 「役員報酬 (C) を下げても、市場相場 (TC) を社長の労働対価として控除するため EBITDA は変わりません。これがバイアウト現場で行われる『正常化調整 (normalization adjustment)』です。報酬を恣意的に上下させても、このスコアは変動しません。」 |
| 蓄積スコア | 「過去の利益の蓄積を示すストック指標です。役員報酬 (C) を抑えて法人内部留保を積めば、このスコアは確実に上がります。」 |
| 税務評価スコア | 「資産管理会社への株式移転時等に税務署が使う『財産評価基本通達』の超簡易版です。役員報酬を上げると下がる傾向があり、上記 2 スコアと逆方向に動くことを学習できます。実際の税務評価額は税理士による精密計算が必須です。」 |
Step 3: MAS-057 cockpit 統合(Phase 3)
配置先
webapp_client/src/CockpitApp.tsx(MAS-057 + MAS-058 + MAS-071 が定義済)の MAS-071 CompensationStrategyPanel の直後 に ValuationScoreboard を挿入。
// CockpitApp.tsx (抜粋)
<>
<ScenarioBar />
<AssumptionsBar />
<CompensationDropdowns /> {/* MAS-057 + MAS-066 */}
<SankeyDiagram /> {/* MAS-057 */}
<ThreeBlockTable /> {/* MAS-057 + MAS-066 */}
<NetWorthChart /> {/* MAS-057 */}
<EffectiveRateMetric /> {/* MAS-057 */}
{/* === ↑ ここまで「現状把握」レイヤー === */}
{/* === ↓ ここから「目標逆算」レイヤー === */}
<RequiredRevenuePanel /> {/* MAS-058 */}
<CompensationStrategyPanel /> {/* MAS-071 */}
<ValuationScoreboard /> {/* MAS-072(本案件・新規)*/}
</>
独立タブ案 vs 統合パネル案
| 観点 | 独立タブ案(旧) | 統合パネル案(採用・推奨) |
|---|---|---|
| 画面切替 | 必要 | 不要・スクロールのみ |
| 既存 cockpit 改修 | tab 制御追加(重) | panel 1 件追加のみ(軽) |
| 役員報酬変更 → 3 スコア即時反映 | tab 跨ぎで分かりづらい | スクロール 1 画面で並列確認可・リアルタイム再計算の体感性 |
| MAS-071 4 アプローチ → 企業価値の連動 | tab 跨ぎで再計算ループ発生 | 同 panel 並びで完結 |
| MAS-067 マルチイヤー連携時の転用性 | tab 跨ぎ | 「ある年の企業価値 KPI」として直接転用可 |
結論: 統合パネル案 を採用。MAS-071 4 アプローチ比較棒グラフの直下に置くことで「役員報酬戦略の選択 → その時の企業価値スコア」が 1 スクロールで観察できる教育的 UX を実現。
Step 4: 03_sys_params 7 キーシード(任意)
800_ops/8XX_migration_mas072_valuation_seed.js を新設し、MAS072_* 7 キーのシーダーを実装(MAS-066 / MAS-071 同パターン)。番号は ls 800_ops/ で次空き番取得(MAS-071 シーダーが 816 を予約予定のため、本案件は 817 以降)。
default 動作はシード未実行でも Constants.getParam(key, default) で機能するため optional 扱い。dev で投入後、prod に反映する運用順。
影響範囲
| 対象 | 種別 | 変更内容 | リスク |
|---|---|---|---|
400_domain/455_valuation_engine.js | 追加 | ValuationEngine 名前空間(calcAllScores / calcManagementScore / calcAccumulationScore / calcTaxValuationScore + 内部ヘルパ群・約 250 行) | 既存ロジックへの影響なし・MAS-071 CompensationStrategyEngine.calcTheoreticalCompensation を input 経由で受領のみ |
webapp_client/src/cockpit/ValuationScoreboard.tsx | 追加 | React 独立パネル(メインスコア 3 列表示 + マルチプルスライダー + 簿外資産入力 + バッジ + 感度ミニグラフ + 解説ツールチップ・約 400 行) | MAS-071 panel の直下に追加・既存パネル位置に影響なし |
webapp_client/src/CockpitApp.tsx | 変更 | ValuationScoreboard を CompensationStrategyPanel 直後に挿入(1 行追加) | 既存 panel レイアウトに影響なし |
000_infra/002_constants.js | 変更 | Constants.MAS072_DEFAULTS 新設(multiple / badgeThresholds / netAssets / offBalanceAssets の default 値を集約) | 既存定数に影響なし |
300_ui/302_spa_bridge.js | 変更 | bootstrap に MAS072_* キー 7 件追加 + runValuationScoreboardCalc(input) 関数追加(GAS 側からも呼出可能化) | 既存 SPA bridge に影響なし |
webapp_client/scripts/sync-engines.mjs | 変更 | sync 対象に 400_domain/455_valuation_engine.js を追加(既存 442/443/444/445/449/451/454 と並列) | 既存 sync に影響なし |
webapp_client/src/cockpit-main.tsx | 変更 | import './engines/455_valuation_engine.js'(副作用 import)を追加 | failure_patterns #33 必須対策・忘れると bundle に含まれない |
03_sys_params | 変更 | MAS072_* 7 キー追加 | default 動作・シード未実行でも動作 |
800_ops/8XX_migration_mas072_valuation_seed.js | 追加(任意) | MAS072_* キーシーダー(MAS-066 / MAS-071 同パターン・次空き番) | optional |
900_test/901_test_runner.js | 変更 | F72-01〜F72-12 単体テスト追加(3 スコア × 主要シナリオ + エッジケース) | 既存テストへの影響なし |
| MAS-057 cockpit 既存パネル | 変更なし | OP_pre / C / D&A を localStorage / panel-local state 経由で受領 | MAS-057 既存ロジック変更不要 |
| MAS-071 CompensationStrategyPanel | 変更なし | TC を MAS-071 panel と同期して受領(MAS-071 推奨額決定 UI からの transmit) | MAS-071 既存ロジック変更不要 |
| MAS-067 / MAS-141 | 連携拡張 | NetAssets / OffBalanceAssets を後続 PR で自動連携(v1 では手動入力フォールバック) | MAS-067 / MAS-141 既存ロジック変更不要 |
| appsscript.json | 変更なし | OAuth スコープ追加不要 | failure_patterns #26 遵守 |
注意事項
#18-#20 命名造語の禁止(必読):
ValuationEngine.calcManagementScore/calcAccumulationScore/calcTaxValuationScoreの関数名は本仕様書で新規定義するもの。実装時は MAS-057 / MAS-071 spec の関数命名パターン(calc{Name}形式・camelCase)に従い、既存ファイル(442/443/444/445/449/451/454)の命名規約と整合するよう確認。getValuation/computeStockのような他 spec に存在しない造語は使わない。CompensationStrategyEngine.calcTheoreticalCompensation(MAS-071)の関数シグネチャは 実装着手前に Read で再確認すること(MAS-071 のリファクタにより行番号やシグネチャがずれる可能性がある)。#25 並列実装の対称性(必読): 3 スコア計算関数
calcManagementScore/calcAccumulationScore/calcTaxValuationScoreは 対称な純粋関数として実装する。引数構造(第 1 引数input・calcManagementScoreのみ第 2 引数evを取るが理由をコメントで明示)・戻り値型(number)・null フォールバック(Number.isFiniteガード後0返却)を全 3 関数で揃える。片側だけ別実装にすると将来の拡張時にバグの温床(MAS-066 / MAS-071 と同パターン)。#26 oauthScopes 部分宣言禁止(必読):
appsscript.jsonは本案件で変更しない。MAS-072 が追加で必要とする外部 API はなし(企業価値計算は全て JS 内完結)。万一スコープ追加が必要になった場合は MAS-057 / MAS-066 / MAS-071 の前例(appsscript.json変更なし)を踏襲し、Advanced Service ならenabledAdvancedServices側に宣言する。#29 V8 → Java Infinity null 化(必読): 経営力スコアの
EV = max(0, 調整EBITDA × Multiple)でOP_pre - TC + D&Aが極端値(極大 OP_pre 入力 / TC が NaN / Multiple が Infinity)になるケースに備え、_calcNormalizedEbitda_/_calcEnterpriseValue_/calcManagementScore/calcAccumulationScore/calcTaxValuationScoreの全ヘルパでNumber.isFinite(raw)ガード必須実装。クライアント返却前に300_ui/302_spa_bridge.jsの_scrubInfinityForJSON_ヘルパ(MAS-066 PR #402 で確立)で再帰的にスキャンし、Infinity→Number.MAX_SAFE_INTEGER、NaN→nullに変換する。runValuationScoreboardCalcの戻り値経路で必ず通過させる。#33 SPA 副作用 import 漏れ防止(必読・最頻発バグ):
webapp_client/scripts/sync-engines.mjsへの 455 追加だけでは不十分。webapp_client/src/cockpit-main.tsxにimport './engines/455_valuation_engine.js'を必ず追加すること。Vite の tree-shaking が「副作用なし」と判断して bundle から除外する典型パターン。MAS-066 PR #402 / MAS-071 PR で同問題が同様 fix された前例あり。チェックリスト: ① 455 ファイル新設(IIFE + window 露出)→ ② sync-engines.mjs 追加 → ③ cockpit-main.tsx 副作用 import 追加 ← 必須・抜けやすい → ④npm run build→ ⑤ ブラウザでconsole.log(window.ValuationEngine)で undefined でないことを確認。企業価値の参考値性・KPI 用途限定の常時免責(本案件の最重要・差別化要素の保護条項): 本案件の 3 スコアは 「経営の通信簿」KPI として位置付けたものであり、実際の M&A 売却価格・税務評価額・遺産分割評価額とは大きく異なる可能性がある。bizlp の運用責任を限定するため、以下を仕様書 + UI 上の常時表示免責文として必ず明記:
- (a) UI 下部に「本スコアは経営 KPI(自社の通信簿)であり、実際の M&A 売却価格・税務評価額とは大きく異なる可能性があります(買い手・タイミング・シナジー・業界マルチプル変動・財産評価基本通達の精緻計算等の影響)。実際の意思決定は M&A アドバイザー・税理士の個別助言が必須です」を常時表示(折りたたみ不可)
- (b) 経営力スコアのツールチップに「(参考値)」表記を必ず併記
- (c) 税務評価スコアのツールチップに「簡易版・実際の財産評価基本通達による株価評価には類似業種比準価額方式・純資産価額方式の精密計算が必須」を併記
- MAS-057 spec 注意事項 #15(税務調査リスク Disclaimer)/ MAS-071 spec 注意事項 #7(不相当に高額な役員給与の Disclaimer)と同型のガードレール。
EBITDA マルチプル業種別 default 値の選定: default 値 5 倍は中小企業 M&A の標準的レンジ(小規模 SaaS 以外の安定収益型)の中央値。業種・成長率・スケールにより実態は大きく変動する(IT 5-7 / コンサル 3-5 / SaaS 8-15 / 製造業 4-6 等)。
Constants.MAS072_DEFAULTS.multipleで運用上書き可能とし、UI スライダー(3-10 倍・刻み 0.5)で what-if 試算可能とした。default 値の年次更新は人間検討事項 #1 で運用ルール化する。MAS-071 連携の段階導入: MAS-072 v1 リリース時に MAS-071 が未完了の場合、
input.theoreticalCompフォールバック(input.theoreticalComp || input.actualCompensation)で「正常化調整なし = 役員報酬を C のまま使用」モードで動作させる。UI 上で「MAS-071 が未実装のため、正常化調整は無効化されています。MAS-071 完了後に経営力スコアが再計算されます」警告を表示。MAS-071 完了後に PR で警告除去 + フォールバック削除を実施。MAS-067 / MAS-141 連携の段階導入: 同様に v1 では
NetAssets/OffBalanceAssetsは panel-local の number 入力(手動入力フォールバック)で受領。MAS-067 完了後にinitialBS.equityから自動取得、MAS-141 完了後にSafetyKyosaiEngine.getCumulativeAccrual()から自動取得する PR を別途実施。v1 リリース時の UI ヒント: 「MAS-067 / MAS-141 完了後に自動連携されます」を入力フィールド横に表示。税務評価スコア算式の妥当性:
(OP_pre - C) × 0.5 + NetAssets × 0.5の重み配分 0.5/0.5 は簡易参考値。実際の財産評価基本通達は類似業種比準価額方式(事業内容・資本金・配当・利益・純資産の 5 比率)と純資産価額方式(含み益課税)の組合せで決まり、本算式は「役員報酬を上げると 1 - 2 と逆方向に動く」教育的 UX のための極簡易モデルである。実装上のリスク低減として:
- (a) 関数 docstring に「簡易版・税理士監査対象外」を明記
- (b) UI ツールチップで上記 (c) の警告文を併記
- (c) 重み配分は
Constants.MAS072_DEFAULTS.taxValuationWeights = { opPreMinus: 0.5, netAssets: 0.5 }で運用上書き可能(v2 で類似業種比準価額方式の精緻化検討)
マイナスゼロ(-0)境界:
Math.max(0, value)は-0を+0に統一しないため、Object.is(value, -0)の検出後に明示的に+0化する。JSON シリアライズで-0は0化されるが、_scrubInfinityForJSON_通過時のチェック対象として念のため処理を含める(MAS-071 エッジケース #13 と同パターン)。異常に大きい値(1 兆超)の表示崩れ防止: メインスコア表示は桁数に応じて「万円」「億円」「兆円」を自動切替(
formatCurrency(value, { autoUnit: true })・MAS-058 で確立済のformatJPYヘルパを流用検討)。1 兆超で UI 表示崩れが発生しないかテストし、必要ならNumber.MAX_SAFE_INTEGERクランプ + 警告表示を実装。リアルタイム再計算時のレースコンディション: cockpit 既存ドロップダウン(
OP_pre/C/D&A)と本パネルの簿外資産入力(panel-local state)の更新タイミングが非同期だと、useMemoの依存配列で stale closure が発生する可能性。React 18 の Concurrent Mode で問題が顕在化する場合はuseDeferredValueで再計算を遅延(MAS-058 RequiredRevenuePanel と同パターン)。Pure Function 厳格化(MAS-057 注意事項 #14 準拠):
400_domain/455_valuation_engine.jsはSpreadsheetApp/UrlFetchAppだけでなくUtils/Constantsへの直接依存も排除する。マルチプル / 閾値等は300_ui/302_spa_bridge.js経由で input 引数として注入。ログ出力は戻り値のwarnings: [{ level, message }]配列で返し、呼出元(SPA bridge)でUtils.persistLogを呼ぶ。Jest 統合テスト時に依存ゼロでテスト可能。教育的 UX としての「役員報酬感度ミニグラフ」の正確性: 役員報酬 C を ±20% / ±50% で変動させた時の 3 スコアの変動を併置表示する機能で「経営力スコアは変わらず・蓄積スコアは C と逆方向・税務評価スコアも C と逆方向(ただし係数 0.5 のため緩やか)」を可視化する。ただし蓄積スコアは「C を変えても NetAssets は短期で変わらない」性質のため、感度グラフでは『翌期以降 C を抑えて蓄積した場合のシミュレーション』として明示する(直接的な C 変動感度ではなく、内部留保推移の予測)。UI ラベルで「翌期以降の蓄積予測」を明記し誤解を防ぐ。
エッジケース
実装時に必ず以下 14 件を単体テスト F72-01〜F72-14 でカバーする。
| # | 条件 | 検知方法 | 期待される挙動 | ログ出力 |
|---|---|---|---|---|
| 1 | OP_pre 負値(赤字法人) | input.opPre < 0 | 調整 EBITDA = OP_pre - TC + D&A が負 → EV = max(0, 負値 × Multiple) = 0 / 経営力スコア = 0 + NetAssets + OffBalanceAssets / 蓄積スコア・税務評価スコアは負値も許容 | INFO |
| 2 | TC > OP_pre + D&A(理論報酬が EBITDA を超過) | 調整 EBITDA = OP_pre - TC + D&A < 0 | EV = 0(max クランプ)/ 経営力スコア = 0 + NetAssets + OffBalanceAssets / UI で「市場相場で正常化すると EBITDA がマイナスになる収益構造」インフォ表示 | INFO |
| 3 | NetAssets 負値(債務超過) | input.netAssets < 0 | 蓄積スコア・経営力スコアが負値も許容(債務超過の現実を反映)/ UI で「累積純資産がマイナス(債務超過)」赤枠警告 | WARN |
| 4 | OffBalanceAssets = 0(簿外資産なし) | input.offBalanceAssets === 0 | 全スコア計算継続(正当な default 値・経営セーフティ共済未加入の状態) | なし |
| 5 | Multiple = 0(マルチプル倍率ゼロ) | input.multiple === 0 | EV = 0 / 経営力スコア = NetAssets + OffBalanceAssets(蓄積スコアと一致)/ UI で「マルチプル倍率 = 0 のため EBITDA 評価が無効化」インフォ表示 | INFO |
| 6 | Multiple 負値(不正入力) | input.multiple < 0 | EV = max(0, 調整EBITDA × 負値) → 調整 EBITDA 正値の場合は 0 クランプ / 負値の場合は正値になるが Math.max(0, ...) で 0 / UI で「マルチプル倍率は 3-10 の範囲で設定してください」赤枠警告 + バリデーションでクランプ | WARN |
| 7 | 全パラメータ 0(OP_pre = C = TC = D&A = NetAssets = OffBalanceAssets = 0) | 全 input が 0 | 全スコア = 0 / UI で「シミュレーション成立せず・前提値入力」インフォ表示・バッジ表示なし | INFO |
| 8 | Infinity 発生(OP_pre が極大値・Multiple が Infinity) | Number.isFinite(raw) === false | 各 calc 関数で 0 を返却 + _scrubInfinityForJSON_ で Number.MAX_SAFE_INTEGER に scrub(spa_bridge 経由・failure_patterns #29)+ UI で「数値が異常値に達しました・前提値見直し」赤枠警告 | ERROR |
| 9 | NaN 発生(TC が undefined / null から計算され NaN 化) | Number.isNaN(raw) === true | 各 calc 関数で 0 を返却 + _scrubInfinityForJSON_ で null に scrub(クライアント側で「---」表示)+ UI で「TC(理論報酬)が取得できません・MAS-071 連携を確認」警告 | ERROR |
| 10 | マイナスゼロ(-0)の境界 | Object.is(value, -0) === true | Math.max(0, value) で +0 に統一(明示処理)/ JSON シリアライズで -0 は 0 化されるが念のため scrub | なし |
| 11 | 異常に大きい値(1 兆超で表示崩れ) | value > 1_000_000_000_000 | formatCurrency(value, { autoUnit: true }) で「兆円」単位に自動切替・桁区切り維持 / UI 表示崩れチェック(メインスコアエリアの最大幅をテスト) | INFO |
| 12 | 通貨単位の桁数省略境界(万円→億円→兆円) | value 境界跨ぎ | 9999 万 → 1.00 億 / 9999 億 → 1.00 兆 のように丸めずに精度 2 桁で表示 / 境界跨ぎでバッジ閾値判定が誤動作しないか確認 | なし |
| 13 | 連携先案件未実装時のフォールバック(MAS-071 / MAS-067 / MAS-141 未完了) | input.theoreticalComp === undefined 等 | TC は actualCompensation でフォールバック / NetAssets / OffBalanceAssets は panel-local 手動入力値で動作 / UI で「自動連携未実装・手動入力モード」インフォ表示 | INFO |
| 14 | リアルタイム更新時のレースコンディション(cockpit ドロップダウン高速変更) | useMemo 依存配列の stale closure | useDeferredValue で再計算を遅延 + 直近変動 Δ アニメーションが連続発火しないようデバウンス(200ms)/ 結果値の正確性は保証 | なし |
実データ検証
1. 齋藤 Baseline(年商 5,000 万 + OP_pre 2,000 万 + C = 800 万 + TC = 1,040 万 + D&A = 50 万 + NetAssets = 1,500 万 + OffBalanceAssets = 200 万 + Multiple = 5)
実装完了後に以下を 901_test_runner.js で自動検証し、±1 円以内で一致を合格基準とする(純粋計算のため誤差なし)。
| スコア | 期待値 | 計算根拠 |
|---|---|---|
| 調整 EBITDA | 1,010 万 | OP_pre 2000 - TC 1040 + D&A 50 = 1,010 |
| EV(マルチプル法) | 5,050 万 | 1010 × 5 = 5,050 |
| 経営力スコア | 6,750 万 | EV 5050 + NetAssets 1500 + OffBalanceAssets 200 = 6,750 |
| 蓄積スコア | 1,700 万 | NetAssets 1500 + OffBalanceAssets 200 = 1,700 |
| 税務評価スコア | 1,350 万 | (OP_pre 2000 - C 800) × 0.5 + NetAssets 1500 × 0.5 = 600 + 750 = 1,350 |
| バッジ判定(経営力スコア基準) | 🚀 成長 | 6750 万 ≥ 3000 万(GROWTH 閾値)かつ < 1 億(TOP 閾値) |
2. 役員報酬 C を変動させた時の 3 スコアの動き(教育的 UX の正確性検証)
C 以外を Baseline に固定。C を 600 万 / 800 万(Baseline)/ 1,040 万(TC 一致)/ 1,500 万(TC 超過)に変動させた時:
| C | 経営力スコア | 蓄積スコア | 税務評価スコア | 検証ポイント |
|---|---|---|---|---|
| 600 万 | 6,750 万 | 1,700 万 | 1,450 万 | 経営力スコア不変・税務評価スコア上昇 |
| 800 万(Baseline) | 6,750 万 | 1,700 万 | 1,350 万 | (Baseline) |
| 1,040 万 | 6,750 万 | 1,700 万 | 1,230 万 | 経営力スコア不変・C = TC で正常化調整影響なし |
| 1,500 万 | 6,750 万 | 1,700 万 | 1,000 万 | 経営力スコア不変・税務評価スコアさらに低下 |
重要: 経営力スコアと蓄積スコアは C 変動で変わらない(短期スナップショット計算のため・経営力は TC で正常化、蓄積は NetAssets が C と独立)。教育的 UX の核心メッセージ「役員報酬を恣意的に変えても、経営力スコアはごまかせない」を仕様書 + UI ツールチップで明示。
3. EBITDA マルチプル感度分析
C 等を Baseline 固定。Multiple を 3 / 5(Baseline)/ 7 / 10 に変動:
| Multiple | EV | 経営力スコア | 検証ポイント |
|---|---|---|---|
| 3 倍 | 3,030 万 | 4,730 万 | 🚀 成長バッジ |
| 5 倍(Baseline) | 5,050 万 | 6,750 万 | 🚀 成長バッジ |
| 7 倍 | 7,070 万 | 8,770 万 | 🚀 成長バッジ |
| 10 倍 | 10,100 万 | 11,800 万 | 🏆 一流バッジ(1 億超) |
Multiple = 10 で経営力スコアが TOP 閾値(1 億)を超え、バッジが 🚀 → 🏆 に変化することを UI 上で確認。
4. 4 アプローチ(MAS-071)連携感度分析
MAS-071 完了後に実施。MAS-071 4 アプローチ(A 生活防衛 / B 内部留保 / C 税務最適 / D 融資対策)の各推奨額を C に流し込んだ時の 3 スコアの動きを併置確認:
| アプローチ | C | 経営力スコア | 蓄積スコア(翌期予測) | 税務評価スコア |
|---|---|---|---|---|
| A 生活防衛 | 1,040 万 | 6,750 万 | 1,700 万 + 翌期内部留保 600 万 = 2,300 万 | 1,230 万 |
| B 内部留保 | 1,250 万 | 6,750 万 | 1,700 万 + 翌期内部留保 750 万 = 2,450 万 | 1,125 万 |
| C 税務最適 | 約 900 万 | 6,750 万 | 1,700 万 + 翌期内部留保 1,100 万 = 2,800 万 | 1,300 万 |
| D 融資対策 | 728 万 | 6,750 万 | 1,700 万 + 翌期内部留保 1,272 万 = 2,972 万 | 1,386 万 |
経営力スコアが全アプローチで一致(TC 正常化により C 変動の影響なし)することを確認。蓄積スコア(翌期予測)はアプローチ D が最大(C 抑制が最も強い)になることを確認。
5. エッジケース検証(単体テスト F72-01〜F72-14)
エッジケースセクションの 14 項目それぞれを 1 テストケースとして 901_test_runner.js に追加。特に #1(OP_pre 負)/ #5(Multiple = 0)/ #8(Infinity)は失敗時の例外メッセージ内容まで検証する。
6. MAS-071 / MAS-067 / MAS-141 との数値整合(連携完了後)
runValuationScoreboardCalc 内で呼出した CompensationStrategyEngine.calcTheoreticalCompensation(MAS-071)/ MultiyearPlanner.getInitialBS().equity(MAS-067)/ SafetyKyosaiEngine.getCumulativeAccrual()(MAS-141)の戻り値を各 spec の単体テスト期待値と照合し、±1 円一致を合格基準とする(同一ライブラリ呼出のため)。
7. 表示崩れ・バッジ閾値跨ぎの UI E2E 検証
Multiple スライダーを連続変動させたときに:
- メインスコアが「万円」→「億円」→「兆円」の単位切替で崩れないか
- バッジ(🌱 / 🚀 / 🏆)が閾値跨ぎで正しく切り替わるか
- Δ アニメーション(緑↑赤↓)が連続発火しないか を Playwright / Cypress 等で E2E テスト(v1 では手動目視・v2 で自動化検討)。
関連ドキュメント
| カテゴリ | ドキュメント | 関係 |
|---|---|---|
| 親案件 (Solo-CEO Cockpit) | dev_mas-057_solo_ceo_cockpit.md v2.2 | 入力源(OP_pre / C / D&A)+ cockpit 配置 + SPA 基盤の供給元 |
| MAS-071 役員報酬戦略シミュレーター | dev_mas-071_compensation_strategy_simulator.md v0.1 | TC(理論報酬額)の供給元・本案件の正常化調整の根拠値 |
| MAS-058 必要年商シミュレーター | dev_mas-058_required_revenue_solver.md v2.1 | panel 配置原則「現状把握↑ vs 目標逆算↓」の確立元・本 panel は MAS-058 / MAS-071 panel 直下に配置 |
| MAS-066 配当ミックス最適化 | dev_mas-066_dividend_mix_optimizer.md v1.2 | _scrubInfinityForJSON_ 汎用ヘルパの実装元(PR #402)・本案件でも同パターン適用・配偶者株主評価の v2 連携先 |
| MAS-067 マルチイヤー計画 | dev_mas-067_multiyear_planning_workspace.md v1.2 | NetAssets(initialBS.equity)連携元・後続「価値ベース KPI ダッシュボード v2」で時系列推移グラフの基盤 |
| MAS-141 節税共済シミュレーター | dev_mas-141_tax_saving_simulator.md | OffBalanceAssets(経営セーフティ共済 解約返戻金)連携元 |
| failure_patterns | failure_patterns.md | #18-#20(命名造語)/ #25(並列実装対称性)/ #26(oauthScopes)/ #29(V8→Java Infinity null)/ #33(SPA 副作用 import 漏れ) |
| dev_spec_prompt_template | dev_spec_prompt_template.md v1.10 | 14 セクション準拠 |
| CLAUDE.md | CLAUDE.md | 名前空間ルール / GAS ファイル番号体系 / Pure Function 規約 |
| PRD(プロダクトポリシー) | prd.md | Human-in-the-Loop 原則 + Disclaimer |
| 国税庁 財産評価基本通達(外部) | 国税庁 法令解釈通達 | 税務評価スコアの簡易版根拠(実際の精緻計算は類似業種比準価額方式・純資産価額方式の組合せ) |
| 中小 M&A レーマン方式(外部) | 中小企業庁 M&A ガイドライン | EBITDA マルチプル法と並ぶ中小 M&A 価格算定の業界標準・参考値性の根拠 |
人間が検討すべき事項
EBITDA マルチプル業種別 default 値の選定とマスタ化: default 5 倍は中小企業 M&A の標準的レンジ中央値だが、業種・成長率・スケールにより実態は大きく変動する(IT 5-7 / コンサル 3-5 / SaaS 8-15 / 製造業 4-6 / 飲食 2-4 等)。業種マスタ化案:
Constants.MAS072_DEFAULTS.multipleByIndustry = { IT: 6, CONSULT: 4, SAAS: 10, ... }で業種別 default を保持し、cockpit assumption の業種選択(既存の場合)と連動させる。判断基準: bizlp 自身の業種が IT/コンサルのため当面 5 倍 default で運用、業種マスタ化は v2 で検討。TC 供給源の選択(MAS-071 vs ロールバリュー積算 vs 業界統計): MAS-071 完了前のフォールバックとして TC をどう推定するか。選択肢: (a) MAS-071
calcTheoreticalCompensation完了を待つ(v1 では未対応 + 警告表示)/ (b) 簡易ロールバリュー積算(V_d × 0.7 + V_i × 0.2 + V_m × 0.1)を panel-local で計算 / (c) 業界統計(doda / type / 経産省賃金構造基本統計調査)の固定値(例: IT 系 1,000 万)をConstants.MAS072_DEFAULTS.theoreticalCompFallbackで保持。v1 推奨: (a) MAS-071 完了待ち + 未完了時は actualCompensation でフォールバック。簿外資産の入力 UX(MAS-141 連携 vs 手動入力 vs 部分連携): MAS-141 完了前の OffBalanceAssets 入力をどう扱うか。選択肢: (a) panel-local 手動入力のみ / (b) MAS-057 法人期首預金残高(Step 6.14)から「経営セーフティ共済加入額」を別フィールドで入力 / (c) MAS-141 完了時に自動連携。v1 推奨: (a) + UI ヒント「MAS-141 完了後に自動連携されます」表示。v2 拡張: 経営セーフティ共済以外の簿外資産(生命保険解約返戻金 / 不動産含み益 / 知財評価額)も別フィールドで入力可能化検討。
「経営力スコア」のスコア帯閾値設計(バッジ閾値の業種別調整): 現行 default 「🌱 新興 < 3,000 万 / 🚀 成長 < 1 億 / 🏆 一流 ≥ 1 億」は IT/コンサル系小規模法人を想定。業種・地域・規模により「一流」基準は大きく変動するため、
Constants.MAS072_DEFAULTS.badgeThresholdsで運用上書き可能とした。運用案: 毎年 4 月(厚労省賃金構造基本統計調査公表月)に default 値を見直す運用をConstants.MAS072_DEFAULTSの TODO コメントに明記。v2 拡張: 業種別バッジ閾値マスタ化検討(IT / 製造 / 飲食 / SaaS 別)。税務評価スコア算式
(OP_pre - C) × 0.5 + NetAssets × 0.5の妥当性レビュー(税理士相談): 重み配分 0.5/0.5 は「役員報酬を上げると 1 - 2 と逆方向に動く」教育的 UX のための極簡易モデル。実際の財産評価基本通達の精緻計算は類似業種比準価額方式(事業内容・資本金・配当・利益・純資産の 5 比率)と純資産価額方式(含み益課税)の組合せで決まる。判断基準: 顧問税理士に算式の妥当性をレビュー依頼し、誤解を生む懸念があれば「(OP_pre - C) × W1 + NetAssets × W2」の重み配分を運用上書き or 算式自体を撤去。v2 拡張: 類似業種比準価額方式の 5 比率を実装し精緻化検討。期末スナップショット保存と時系列推移(v2 候補・MAS-067 マルチイヤー連携): 現行 v1 は単一時点(cockpit 入力時点)のスナップショット計算のみ。v2 拡張案: (a) 期末(年次)の 3 スコアを
99_snapshot_valuation動的シートに保存し、時系列推移グラフ(recharts LineChart)を panel に追加 / (b) MAS-067 マルチイヤー連携で「Y1-Y5 期末の 3 スコア推移」を多年度パネルに統合 / (c) 月次スナップショット(重い)vs 年次スナップショット(軽い)の選択。v1 推奨: スナップショット未対応・MAS-067 連携で v2 実装。バイアウト目的への転用時の追加考慮(DCF / 類似企業比較 等): 本案件は KPI 用途限定で「3 スコア = 自社の通信簿」だが、将来 bizlp 自身が M&A 売却を検討するシナリオで本機能を転用する場合の追加考慮。選択肢: (a) DCF(割引キャッシュフロー)法を 4 つ目の評価軸として追加 / (b) 類似企業比較法(公開比準会社マルチプル)の業種別データベース連携 / (c) Bid-Ask レンジ(買い手提示価格 vs 売り手希望価格)の感度分析。v1 推奨: バイアウト目的は out of scope(Disclaimer で明記)。v2 拡張: 別案件「MAS-XXX バイアウト価格シミュレーター」として独立切出し検討。
KPI 通知(前年同月比 +5% で 🎉 等のゲーミフィケーション通知): 期末スナップショット保存(v2 候補 #6)と組み合わせ、前年同月比で経営力スコアが +5% / +10% / +20% を超えた時に🎉 / 🌟 / 🏆 アニメーション通知を表示。判断基準: スナップショット保存実装後に検討。v2 拡張: メール / Slack 通知連携。
配偶者株主の評価ロジック(MAS-066 配当連携): 配偶者が株主の場合、3 スコアは配偶者持分相当を分離して算出すべきか(例: 50% 持分なら経営力スコアを 1/2)。選択肢: (a) 全持分一括計算(v1 推奨・一人法人前提)/ (b) 持分比率で按分(MAS-066 配当ロジックと整合)/ (c) 完全分離(配偶者個別パネル)。v1 推奨: (a) 一人法人前提。v2 拡張: MAS-066 配当連携時に持分按分検討。
多通貨化(out of scope MAS-064 連動): 海外取引先・オフショア勤務時に NetAssets を USD / EUR ベースで設定するか。v1 推奨: JPY 固定。v2 拡張: MAS-064 多通貨対応の進捗に応じて連携検討。
税務評価スコアの撤去 vs 残置の判断: 簡易版算式の誤解リスクを考慮し、税務評価スコアを v1 で外す選択肢もある。判断基準: (a) 残置 + 強い Disclaimer + 教育的 UX 価値(C 変動で 3 スコアが異なる動き)を重視 / (b) 撤去し、経営力 + 蓄積の 2 スコアに絞る。v1 推奨: (a) 残置 + Disclaimer 強化。v2 拡張: 顧問税理士レビュー結果次第で再判断。
3 スコアの単位(円 vs 万円 vs 億円)の表示統一: メインスコアは桁数自動切替(万円/億円/兆円)だが、Δ アニメーションの表示単位をどうするか。選択肢: (a) メインスコアと同じ単位(一致性)/ (b) 常に万円(精度重視)/ (c) 自動切替(境界跨ぎで視覚的不連続)。v1 推奨: (a) メインスコアと同じ単位。判断: UX 検証後に確定。
実装プロンプト(Claude Code 用)
Claude Opus 4.7(1M context)推奨。MAS-071 連携 + 3 スコア対称実装 + React 独立パネル + ゲーミフィケーション UX + 教育的ツールチップの複合判断のため。
## 案件
MAS-072 — 企業価値(時価評価額)スコアボード機能(3 評価手法統合・MAS-057 cockpit 拡張)
## 事前調査(必ず Read する・failure_patterns #18-#20 対策)
1. `docs/dev/dev_mas-072_valuation_scoreboard.md` 全文(本仕様書)
2. `400_domain/454_compensation_strategy_engine.js` 全文(MAS-071 完了後)
— CompensationStrategyEngine.calcTheoreticalCompensation の関数シグネチャ確認
— IIFE + 内部ヘルパ命名 / failure_patterns #25 並列対称性パターン
3. `400_domain/445_required_revenue_solver.js` 全文
— 同型 cockpit 統合パネルの実装パターン(evaluateScenarioHealth の input/output 構造)
4. `400_domain/449_dividend_mix_optimizer.js` 全文
— IIFE + 内部ヘルパ命名 / failure_patterns #29 対策パターン
5. `webapp_client/src/cockpit/RequiredRevenuePanel.tsx` 全文(909 行)
— React 独立パネルの実装パターン(panel-local state + cockpit 全体 state の分離)
6. `webapp_client/src/cockpit/CompensationStrategyPanel.tsx` 全文(MAS-071 完了後)
— TC を本案件に流す経路の確認
7. `webapp_client/src/cockpit/CompensationDropdowns.tsx` 全文
— MAS-057 ドロップダウンの状態管理パターン(OP_pre / C / D&A 入力源)
8. `webapp_client/scripts/sync-engines.mjs` 全文
— ENGINES_TO_SYNC 配列に 455 を追加する具体的位置
9. `webapp_client/src/cockpit-main.tsx` 全文
— 既存の副作用 import 群(442/443/444/445/449/451/454)の直後に
455 を追加する具体的位置(failure_patterns #33 対策・必須)
10. `300_ui/302_spa_bridge.js` 全文
— bootstrap 構造 / runDividendMixSimulation / runCompensationStrategySimulation の実装パターン
— `_scrubInfinityForJSON_(value)` 汎用ヘルパの使い方(MAS-066 PR #402 で確立)
11. `000_infra/002_constants.js` 全文(特に L1-200)
— Constants.MAS072_DEFAULTS の追加位置(既存 MAS057_DEFAULTS / MAS071_DEFAULTS 末尾推奨)
12. `docs/dev/dev_mas-057_solo_ceo_cockpit.md` v2.2(特に Step 6.9-extension 配置原則)
13. `docs/dev/dev_mas-071_compensation_strategy_simulator.md` v0.1(特に Step 1 計算エンジン + Step 3 cockpit 統合)
14. `docs/dev/dev_mas-058_required_revenue_solver.md` v2.1(特に §配置原則・Step 5)
15. `docs/dev/dev_mas-066_dividend_mix_optimizer.md` v1.2(特に注意事項 #10 / #14・実装サマリ)
16. `docs/_internal/failure_patterns.md` #18-#20 / #25 / #26 / #29 / #33
## 実装対象(Phase 1 → Phase 2 → Phase 3 の順)
### Phase 1: 計算エンジン Pure Function(Sonnet → Opus)
1. `400_domain/455_valuation_engine.js` 新規作成
(IIFE 名前空間 ValuationEngine・約 250 行):
- calcAllScores(input) — 3 スコア + 調整 EBITDA + EV を一括返却
- calcManagementScore(input, ev) — EV + NetAssets + OffBalanceAssets
- calcAccumulationScore(input) — NetAssets + OffBalanceAssets
- calcTaxValuationScore(input) — (OP_pre - C) × 0.5 + NetAssets × 0.5
- 内部ヘルパ(末尾 _ で private 化):
- _calcNormalizedEbitda_(input) — OP_pre - TC + D&A + Number.isFinite ガード
- _calcEnterpriseValue_(normalizedEbitda, multiple) — max(0, ebitda × multiple)
- 末尾に window 露出ラッパ(GAS 側では window 未定義のため安全)
2. `000_infra/002_constants.js` 拡張:
- Constants.MAS072_DEFAULTS = { multiple, multipleMin, multipleMax,
badgeThresholdGrowth, badgeThresholdTop, offBalanceDefault, netAssetsDefault,
taxValuationWeights: { opPreMinus: 0.5, netAssets: 0.5 } } を新設
(既存 MAS057_DEFAULTS / MAS066_DEFAULTS / MAS071_DEFAULTS の直後)
3. 03_sys_params の MAS072_* 7 キー追加
(`100_config/101_sys_config.js` の DDL or 8XX_migration_mas072_valuation_seed.js)
4. 900_test/901_test_runner.js に F72-01〜F72-14 単体テスト
(エッジケース 14 件 + Baseline 数値検証 + C 変動感度 + マルチプル感度)
### Phase 2: React Panel + UI(Opus)
5. `webapp_client/src/cockpit/ValuationScoreboard.tsx` 新規作成
(約 400 行・MAS-058 RequiredRevenuePanel.tsx + MAS-071 CompensationStrategyPanel.tsx を参考実装):
- メインスコア 3 列グリッド(経営力 / 蓄積 / 税務評価)+ 大型数値 + Δ アニメーション
- EBITDA マルチプルスライダー(3-10 倍・刻み 0.5・default 5)
- 簿外資産入力(panel-local 手動 + MAS-141 自動連携準備)
- 帳簿純資産入力(panel-local 手動 + MAS-067 自動連携準備)
- スコア帯バッジ(🌱 / 🚀 / 🏆)+ 閾値ガイドツールチップ
- 役員報酬感度ミニグラフ(C を ±20% / ±50% で 3 スコアの動きを併置)
- 正常化調整解説ツールチップ(?アイコン hover で展開)
- Disclaimer(バイアウト価格との乖離 + KPI 用途限定 + 税理士助言必須)常時表示
6. `webapp_client/src/CockpitApp.tsx` を変更:
- <CompensationStrategyPanel /> の直後に <ValuationScoreboard /> を 1 行追加
(MAS-071 4 アプローチ比較棒グラフの直下に配置 = 役員報酬戦略 → 企業価値 KPI の連続体感)
7. `webapp_client/scripts/sync-engines.mjs` を変更:
- ENGINES_TO_SYNC 配列に '455_valuation_engine.js' を追加
(既存 442/443/444/445/449/451/454 と並列)
8. `webapp_client/src/cockpit-main.tsx` を変更(**failure_patterns #33 必須対策**):
- 既存の副作用 import 群(442〜454)の直後に
`import './engines/455_valuation_engine.js';` を追加
- 忘れると Vite tree-shaking で bundle から除外され window.ValuationEngine が undefined
### Phase 3: GAS 側 SPA bridge 拡張 + ゲーミフィケーション + 解説 UX(Sonnet → Opus)
9. `300_ui/302_spa_bridge.js` 拡張:
- bootstrap に MAS072_* 7 キー追加(既存 MAS071_* / MAS066_* / MAS057_* と並列)
- runValuationScoreboardCalc(input) 関数追加
(ValuationEngine.calcAllScores を呼出 →
_scrubInfinityForJSON_ で scrub → クライアントへ返却)
10. `webapp_client/src/cockpit/ValuationScoreboard.tsx` のゲーミフィケーション要素実装:
- getBadge(managementScore, params) ヘルパ(🌱 / 🚀 / 🏆 判定)
- Δ アニメーション(CSS transition or framer-motion)+ 緑↑赤↓カラー
- formatCurrency(value, { autoUnit: true }) で「万円」「億円」「兆円」自動切替
- 桁数 1 兆超でも UI 崩れなし(テスト含む)
11. `webapp_client/src/cockpit/ValuationScoreboard.tsx` の解説ツールチップ実装:
- 経営力スコア: 「役員報酬 (C) を下げても、市場相場 (TC) を社長の労働対価として控除するため EBITDA は変わりません。これがバイアウト現場で行われる『正常化調整』です。」
- 蓄積スコア: 「過去の利益の蓄積を示すストック指標。役員報酬を抑えて法人内部留保を積めば確実に上がる。」
- 税務評価スコア: 「資産管理会社への株式移転時等に税務署が使う『財産評価基本通達』の超簡易版。役員報酬を上げると下がる傾向(上記 2 と逆方向)。**実際の税務評価額は税理士による精密計算が必須**」
- Disclaimer 常時表示(折りたたみ不可): 「本スコアは経営 KPI(自社の通信簿)であり、実際の M&A 売却価格・税務評価額とは大きく異なる可能性があります。実際の意思決定は M&A アドバイザー・税理士の個別助言が必須です。」
12. `800_ops/8XX_migration_mas072_valuation_seed.js` 新規作成(任意・番号は次空き):
- MAS072_* 7 キーシーダー(MAS-066 / MAS-071 同パターン)
## 制約
- `400_domain/455_valuation_engine.js` は **純粋関数のみ**
(SpreadsheetApp / UrlFetchApp / Utils / Constants 直接依存禁止・MAS-057 注意事項 #14 準拠)
- 既存の 442〜454 ファイルは **変更しない**
(MAS-057 / MAS-066 / MAS-058 / MAS-071 等の既存 spec / 実装に影響を与えない)
- `appsscript.json` は **変更しない**(failure_patterns #26 遵守・OAuth スコープ追加不要)
- 3 スコア calcManagementScore / calcAccumulationScore / calcTaxValuationScore は **対称な純粋関数** として実装
(引数構造・戻り値型 number・Number.isFinite ガード後 0 返却を全 3 関数で揃える)
- `webapp_client/src/cockpit-main.tsx` への副作用 import 追加を **絶対に忘れない**
(failure_patterns #33・MAS-066 PR #402 / MAS-071 で同問題が発生済)
- **Disclaimer は常時表示・折りたたみ不可**(KPI 用途限定 + 税理士助言必須の保護条項)
- **MAS-071 未完了時のフォールバック**: input.theoreticalComp || input.actualCompensation で動作
(「正常化調整無効」UI 警告 + MAS-071 完了後に PR で警告除去)
- **MAS-067 / MAS-141 未完了時のフォールバック**: panel-local 手動入力(NetAssets / OffBalanceAssets)
## 動作確認
1. dev で push:dev → cockpit を開いて MAS-071 panel 直下に MAS-072 panel が表示されること
2. 齋藤 Baseline(OP_pre 2,000 万 / C 800 万 / TC 1,040 万 / D&A 50 万 / NetAssets 1,500 万 /
OffBalanceAssets 200 万 / Multiple 5)で
- 経営力スコア = 6,750 万 / 蓄積スコア = 1,700 万 / 税務評価スコア = 1,350 万
- バッジ 🚀 成長 が表示されること
3. C を 600 万 / 1,040 万 / 1,500 万に変動させた時、経営力スコア・蓄積スコアが**変わらない**こと(教育的 UX)
税務評価スコアのみ C と逆方向に変動すること
4. Multiple を 10 にしたとき経営力スコアが 1.18 億になり、バッジが 🏆 一流 に切り替わること
5. ブラウザ console で `console.log(window.ValuationEngine)` で undefined でないこと
(failure_patterns #33 確認)
6. 解説ツールチップ(?アイコン hover)が 3 スコア全てで動作し、
Disclaimer が panel 下部に常時表示されていること
7. F72-01〜F72-14 単体テスト全 PASS(GAS エディタから testRunner.runAll を実行)
8. MAS-071 連携: MAS-071 推奨額決定 UI で「アプローチ B 採用」をクリックすると
MAS-072 経営力スコアが**変わらない**(C → TC 正常化により)/ 蓄積スコア(翌期予測)が
MAS-071 各アプローチで異なる動きを示すこと
9. Go なら push:prod → prod cockpit でも同等動作確認
## デプロイ
1. dev で push:dev → 動作確認 → コミット
feat(MAS-072): 企業価値スコアボード機能(3 評価手法統合・MAS-057 cockpit 拡張)
2. PR 作成(main 側ワークスペース)
3. ユーザー承認後 main マージ → prod 自動デプロイ
## failure_patterns チェック(必読・実装直前に再確認)
- **#18-#20**: ValuationEngine.calcManagementScore / calcAccumulationScore / calcTaxValuationScore
の関数名は本仕様書で新規定義したもの。MAS-057 / MAS-071 命名規約と整合(calc{Name} camelCase)。
MAS-071 CompensationStrategyEngine.calcTheoreticalCompensation の関数シグネチャを Read で再確認
- **#25**: 3 スコア関数を対称な純粋関数として実装
(引数構造・戻り値 number・Number.isFinite ガード後 0 返却が揃っているか)
- **#26**: appsscript.json は変更なし(OAuth スコープ追加なし)
- **#29**: _calcNormalizedEbitda_ / _calcEnterpriseValue_ / 3 calc 関数全てに Number.isFinite ガード必須・
_scrubInfinityForJSON_ を runValuationScoreboardCalc 戻り値で経由
- **#33**: webapp_client/src/cockpit-main.tsx への副作用 import 追加・実装後に
`console.log(window.ValuationEngine)` で undefined でないこと確認
推奨実行モデル
| 工程 | 推奨モデル | 根拠 |
|---|---|---|
Phase 1 Step 1 455_valuation_engine.js 新規作成(3 スコア対称実装) | Claude Sonnet 4.6 | 3 スコアの対称実装 + 純粋関数のため、MAS-071 と比較して計算ロジックが単純(4 アプローチ vs 3 スコアで複雑度低) |
Phase 1 Step 2 Constants.MAS072_DEFAULTS 追加 | Claude Haiku 4.5 | 既存 MAS057_DEFAULTS / MAS071_DEFAULTS と並列対称な定数追加 |
| Phase 1 Step 3 03_sys_params 7 キー追加 | Claude Haiku 4.5 | パターン化されたキー定義 |
| Phase 1 Step 4 F72-01〜F72-14 単体テスト | Claude Sonnet 4.6 | エッジケース 14 件 + Baseline + 感度分析の期待値検証 |
Phase 2 Step 5 ValuationScoreboard.tsx 新規作成 | Claude Opus 4.7 (1M context) | React 独立パネル + ゲーミフィケーション要素(バッジ + Δ アニメーション + 単位自動切替)+ 教育的ツールチップ + 役員報酬感度ミニグラフの総合判断 |
Phase 2 Step 6 CockpitApp.tsx に panel 挿入 | Claude Haiku 4.5 | 1 行追加・配置原則は spec で確定済 |
Phase 2 Step 7 sync-engines.mjs に 455 追加 | Claude Haiku 4.5 | 既存パターン流用 |
Phase 2 Step 8 cockpit-main.tsx 副作用 import 追加 | Claude Haiku 4.5 | 1 行追加(failure_patterns #33 必須対策・忘れず実施) |
Phase 3 Step 9 302_spa_bridge.js 拡張 | Claude Sonnet 4.6 | bootstrap 拡張 + runValuationScoreboardCalc + _scrubInfinityForJSON_ 経由 |
| Phase 3 Step 10 ゲーミフィケーション要素 | Claude Sonnet 4.6 | バッジ判定 + Δ アニメーション + 単位自動切替(既存 formatJPY ヘルパ流用検討) |
| Phase 3 Step 11 解説ツールチップ + Disclaimer | Claude Sonnet 4.6 | 文言の正確性(正常化調整 / 財産評価基本通達 / バイアウト乖離)+ MAS-057 / MAS-071 spec の Disclaimer パターン整合 |
| Phase 3 Step 12 マイグレーション(任意) | Claude Haiku 4.5 | 800_ops 既存パターン流用(MAS-066 / MAS-071 同パターン) |
| 仕様書レビュー(任意) | Gemini 3 Pro Preview + Deep Think | 第三者視点での税務評価スコア算式の妥当性 + 教育的 UX の正確性 + Disclaimer 文言レビュー |
変更履歴
| 日時 | バージョン | 変更内容 |
|---|---|---|
| 2026-04-30 | v0.1(初版・Draft) | 初版作成。ファイル番号採番経緯 (failure_patterns #31 適用): 当初ユーザープロンプトでは 400_domain/446_valuation_engine.js を提案。main repo /Users/ts_kuma/projects/my-gas-project/400_domain/ の実在確認で 446 が未使用と判明したため一旦採用したが、サブエージェント生成後の sub workspace 全 spec 突合で MAS-059 (Growth Planning Workspace) spec が 446 を decision_tree_orchestrator.js 用に既に予約していたことが発覚。MAS-059 / MAS-060 (447) / MAS-061 (448) / MAS-063 (450) / MAS-144 (452) / MAS-062 (453) も連続で予約済のため、先行予約優先の原則に従い MAS-072 を 455_valuation_engine.js に振直し (455 が次の空き番号)。spec 内 18 箇所の 446_* 参照を sed で一括置換 + 注意事項 + 変更履歴に経緯を二重記載。案件 ID は MAS-072(MAS-071 の直後・FP&A 系列直近 ID・F-72→MAS-072 mapping は stale だったため正式利用)。案件 ID は MAS-072(MAS-071 の直後・FP&A 系列直近 ID)。14 セクション全網羅: 概要 + 目的(バイアウト目的でなく KPI として位置付け・経営の通信簿)+ 現在のコード(MAS-057 入力源 + MAS-071 TC 供給 + MAS-067 / MAS-141 後続連携 + MAS-071 配置原則準拠)+ 修正方針 4 Step(Step 1 計算エンジン Pure Function / Step 2 React Panel + UI / Step 3 MAS-057 cockpit 統合 / Step 4 03_sys_params 7 キーシード)+ 影響範囲(新規 2 + 任意 1 / 変更 6 / 変更なし 4)+ 注意事項 15 件(#18-#20 命名造語 / #25 並列対称性 / #26 oauthScopes / #29 Infinity / #33 SPA 副作用 import / 参考値性 KPI 限定常時免責 / EBITDA マルチプル業種別 / MAS-071 連携段階導入 / MAS-067 / MAS-141 連携段階導入 / 税務評価スコア算式妥当性 / マイナスゼロ / 1 兆超表示崩れ / レースコンディション / Pure Function 厳格化 / 教育的感度ミニグラフ正確性)+ エッジケース 14 件(OP_pre 負 / TC > OP_pre + D&A / NetAssets 負 / OffBalanceAssets 0 / Multiple 0 / Multiple 負 / 全 0 / Infinity / NaN / -0 / 1 兆超 / 単位境界 / 連携先未実装 / レースコンディション)+ 実データ検証 7 本(齋藤 Baseline / C 変動感度 / Multiple 感度 / 4 アプローチ連携 / F72-01〜F72-14 / 数値整合 / E2E 表示崩れ)+ 関連ドキュメント 11 件(MAS-057/058/066/067/071/141 + failure_patterns + dev_spec_prompt_template + CLAUDE.md + PRD + 国税庁財産評価基本通達 + 中小 M&A レーマン方式)+ 人間検討事項 12 件(マルチプル業種別 / TC 供給源 / 簿外資産 UX / バッジ閾値 / 税務評価スコア妥当性 / 期末スナップショット保存 v2 / バイアウト目的転用 / KPI 通知 / 配偶者株主 / 多通貨 / 税務評価撤去判断 / 単位表示統一)+ 実装プロンプト(Claude Opus 4.7 向け・事前調査 16 / 実装対象 12 / 動作確認 9 / failure_patterns チェック 5)+ 推奨実行モデル(Phase 1-3 + テスト + マイグレーション + レビュー)。実装着手は MAS-071 完了後を推奨(TC 自動供給により完全動作)。docs-only PR で prod 自動デプロイへの影響なし。 |
仕様書作成プロンプト
再現性・監査性のため、本仕様書を生成する際に Claude Code(Opus 4.7・1M context)に投入したプロンプトの全文を記録する(dev_spec_prompt_template v1.10 §Phase 2 必須セクション準拠)。
展開して表示
あなたは GAS 会計システム (bizlp-gas-accounting) のシニア開発者兼仕様書ライターです。
## タスク
案件 ID **MAS-072**「企業価値(時価評価額)スコアボード機能(3 評価手法統合・MAS-057 cockpit 拡張)」の開発仕様書を作成し、`/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-072_valuation_scoreboard.md` に保存してください。
## 案件概要
- **Phase**: P2 / **★**: ★★ / **Layer**: 🧠 Domain (純粋関数エンジン) + 🎨 UI (React コンポーネント)
- **位置付け**: 既存 **MAS-057 Solo-CEO Visual Cockpit** の拡張機能 (役員報酬シミュレータ + MAS-071 4 アプローチ統合の隣接配置)
- **目的**: バイアウト目的ではなく、**1 人社長が「自社の経営の通信簿 (KPI)」として企業価値をリアルタイムに把握**し、企業価値向上を数値目標として追えるようにする。役員報酬の設定が企業価値にどう影響するか (あるいは正常化調整によって影響しないか) を可視化し、正しい財務的判断を支援する。
## 3 評価手法 (Pure Function 計算ロジック)
### 入力パラメータ
- `OP_pre`: 役員報酬控除前の営業利益
- `C`: 実際の役員報酬 (年額)
- `TC`: 理論報酬額 (社長の稼働率ベースの市場価値・適正給与) — **MAS-071 から取得**
- `D&A`: 減価償却費
- `NetAssets`: 帳簿上の純資産
- `OffBalanceAssets`: 簿外資産 (経営セーフティ共済の解約返戻金など)
- `Multiple`: EBITDA マルチプル倍率 (default 5 倍・UI で 3-10 倍の範囲で変更可能)
### 計算式 (3 種)
1. **経営力スコア (EBITDA マルチプル法ベース株式価値)**:
- `調整EBITDA = OP_pre - TC + D&A` (役員報酬を理論値で正常化調整)
- `EV = max(0, 調整EBITDA × Multiple)`
- `経営力スコア = EV + NetAssets + OffBalanceAssets`
- **解説**: 役員報酬 (C) を下げて見かけの利益を作っても、適正給与 (TC) で正常化されるため EV は変わらない (ごまかせない) ことを示す指標。
2. **蓄積スコア (時価純資産法ベース株式価値)**:
- `蓄積スコア = NetAssets + OffBalanceAssets`
- **解説**: 過去の利益の蓄積を示す指標。役員報酬 (C) を抑えて内部留保を積むほど確実に上がる。
3. **税務評価スコア (財産評価基本通達の簡易版・参考値)**:
- `税務評価スコア = (OP_pre - C) × 0.5 + NetAssets × 0.5`
- **解説**: 資産管理会社への移転等で使われる税務上の株価の動きを簡易的に示す。役員報酬 (C) を上げると下がる (上記 1, 2 とは逆の動きをする) ことを示すための参考指標。
## アーキテクチャ要件
- **計算ロジック**: `400_domain/455_valuation_engine.js` に新規・**Pure Function** (`ValuationEngine` 名前空間・IIFE パターン・既存 442/443/444/445/449/451/454 と並列対称)
- **クライアント実行**: GAS レイテンシ排除のため計算は React (TypeScript) 側で実行・engine は同型を `webapp_client/src/engines/` に sync-engines.mjs 経由でコピー (MAS-057 / MAS-066 / MAS-071 と同パターン)
- **配置先**: MAS-071 4 アプローチ比較パネルの直下 or 役員報酬ドロップダウンの隣接配置 (3 スコアの相互作用を即座に体感できる構成・ユーザー要望のリアルタイム再計算アニメーションを実現)
## UI/UX 要件
- **スコアボード UI**: 既存の役員報酬シミュレータ (ドロップダウン等) の値を変更すると、**リアルタイムに 3 つの企業価値スコアが再計算・アニメーション更新**
- **ゲーミフィケーション**: 「現在のあなたの企業価値は **〇〇円** です」とモチベーションが上がる見せ方を提案
- 大きく目立つメイン数値 + 直近変動 (Δ) のアニメーション (緑↑赤↓)
- スコア帯別バッジ (🌱 新興 / 🚀 成長 / 🏆 一流 等の閾値ガイド)
- **正常化調整の解説 UI**: なぜ役員報酬を変えても「経営力スコア (マルチプル法)」が変わらないのかを、**ツールチップ等で分かりやすく解説**
- "役員報酬 (C) を下げても、市場相場 (TC) を社長の労働対価として控除するため EBITDA は変わりません。これがバイアウト現場で行われる「正常化調整」です。"
- **3 スコアの動きの違いを学べる UX**: 役員報酬を上下させたとき 3 スコアがそれぞれどう動くかを教育的に体験できる
## 入力源 (連携先案件)
- `OP_pre` / `C` / `D&A`: MAS-057 cockpit の既存ドロップダウン (CompensationDropdowns + AssumptionsPanel)
- `TC`: MAS-071 (稼働率連動型役員報酬シミュレーター) の理論報酬計算結果
- `NetAssets`: MAS-067 マルチイヤー計画の B/S 引継ぎ機能 (`initialBS`) または MAS-057 法人期首預金残高 (Step 6.14) を起点に概算
- `OffBalanceAssets`: MAS-141 共済シミュレーター の積立累計 (経営セーフティ共済解約返戻金) と連動
- `Multiple`: 03_sys_params の `MAS072_EBITDA_MULTIPLE_DEFAULT` (default 5)
## 必読ファイル (調査して固有名詞を確定・failure_patterns #18-#20)
実装の前に以下のファイルを `Read` で参照し、関数名・列名・定数名を確実に存在するものに揃えてください:
1. `/Users/ts_kuma/projects/my-gas-project-doc/docs/_internal/dev_spec_prompt_template.md` — 仕様書 14 セクションテンプレート (必須準拠)
2. `/Users/ts_kuma/projects/my-gas-project-doc/docs/_internal/failure_patterns.md` — #18-#33 全失敗パターン
3. `/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-057_solo_ceo_cockpit.md` — 親案件・連携先 (cockpit 構造・既存ドロップダウン入力源参照)
4. `/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-071_compensation_strategy_simulator.md` — 直近の関連 spec (TC 理論報酬の供給元・対称な実装パターン参照)
5. `/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-067_multiyear_planning_workspace.md` — B/S 引継ぎ機能 + Phase D AI 提案統合の参考
6. `/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-141_tax_saving_simulator.md` — 経営セーフティ共済の解約返戻金 (簿外資産) 連携元
7. `/Users/ts_kuma/projects/my-gas-project-doc/CLAUDE.md` — コーディング規約・名前空間ルール
## 仕様書フォーマット要件 (14 セクション)
`dev_spec_prompt_template.md` 準拠。ユーザー要望の出力構成 (1. 概要・目的 / 2. ビジネスロジック・計算式定義 / 3. UI/UX設計 / 4. システムアーキテクチャ / 5. エッジケース・バリデーション / 6. テスト要件) は 14 セクション内に収まるように対応。
含めるべき内容:
- フロントマター (id: MAS-072, aliases: [], type: Story, status: Draft, parent: MAS-057)
- 概要テーブル (案件 ID / カテゴリ / Phase / 優先度 / 所要時間 / 前提案件: MAS-057 + MAS-071 + MAS-141 / 後続案件: 価値ベース KPI ダッシュボード v2)
- 目的 (バイアウト目的でなく KPI として位置付け・経営の通信簿)
- 修正方針 / 実装スコープ / Step 分割 (Phase 1 = `ValuationEngine` Pure Function / Phase 2 = `ValuationScoreboard.tsx` UI / Phase 3 = MAS-057 cockpit 統合 + ツールチップ解説 + ゲーミフィケーション要素)
- 注意事項
- **#18-#20 命名造語**: `ValuationEngine.calcManagementScore` / `calcAccumulationScore` / `calcTaxValuationScore` の正確な関数名は他案件 (MAS-057/071) と整合
- **#25 並列実装対称性**: 3 スコア計算関数を対称な構造で実装 (同一引数構造 + 戻り値型 + Number.isFinite ガード)
- **#26 oauthScopes 部分宣言禁止**
- **#29 V8 → Java Infinity null**: EV = max(0, 調整EBITDA × Multiple) で `OP_pre - TC + D&A` が極端値の場合の `Number.isFinite` ガード必須
- **#33 SPA 副作用 import 漏れ**: `webapp_client/scripts/sync-engines.mjs` への `455_valuation_engine.js` 追加忘れ防止
- **企業価値の参考値性**: 「実際の M&A 価格は本数値とは大きく異なる可能性がある (買い手・タイミング・シナジー等)」を spec 内および UI 上の常時表示免責文として明記 (税務調査リスクと同型のガードレール・MAS-057 spec 注意事項 #15 と同パターン)
- エッジケース表 (12 件以上)
- OP_pre 負 (赤字) / TC > OP_pre + D&A (調整 EBITDA 負・EV = 0) / NetAssets 負 (債務超過) / OffBalanceAssets 0 / Multiple 0 or 負 / 全パラメータ 0 / Infinity / -0 / NaN / 異常に大きい値 (1 兆超で表示崩れ) / 通貨単位の桁数省略境界 (万円/億円自動切替) / 連携先案件未実装時のフォールバック / リアルタイム更新時のレースコンディション
- 人間が検討すべき事項 (10 件以上)
- Multiple のレンジと業種別 default (IT 5-7・コンサル 3-5・SaaS 8-15 等) の業種マスタ化 / TC の供給源 (MAS-071 vs ロールバリュー積算 vs 業界統計) / 簿外資産の入力 UX (MAS-141 連携 vs 手動入力) / 「経営力スコア」のスコア帯閾値設計 (新興/成長/一流の境界額) / 税務評価スコアの「(OP_pre-C)×0.5 + NetAssets×0.5」算式の妥当性レビュー (税理士) / 期末スナップショット保存と時系列推移 (v2 候補・MAS-067 マルチイヤー連携) / バイアウト目的への転用時の追加考慮 (DCF / 類似企業比較 等) / KPI 通知 (前年同月比 +5% で🎉等のゲーミフィケーション通知) / 配偶者株主の評価ロジック (MAS-066 配当連携) / 多通貨化 (out of scope MAS-064 連動)
- 推奨実行モデル (Step ごとに Haiku/Sonnet/Opus)
- 関連ドキュメント (MAS-057 / MAS-071 / MAS-067 / MAS-141 / MAS-066 / failure_patterns / dev_spec_prompt_template / 国税庁 財産評価基本通達 / 中小 M&A レーマン方式)
- 開発プロンプト (Claude Code 向け実装指示・行頭 4 スペースインデント)
- 変更履歴 (v0.1 初版)
- 末尾に `<details><summary>展開して表示</summary>` ブロックでこのプロンプト全文を記録
## 必ず守る規約
- 名前空間: `ValuationEngine` 新設 (IIFE パターン・既存 449/451/454 と並列対称)
- ファイル番号: `400_domain/455_valuation_engine.js` (**当初プロンプトでは 446 を提案・main repo では 446 が実在しないため採用の方針だったが、sub workspace で MAS-059 spec が 446 を `decision_tree_orchestrator.js` 用に既に予約していることが発覚したため 455 に振り直し** — failure_patterns #31 適用)
- 列参照はヘッダー名ベース・列番号ハードコード禁止
- failure_patterns #18-#20 — 推測で関数名を作らず Read で実在確認
## アウトプット
ファイル: `docs/dev/dev_mas-072_valuation_scoreboard.md`
Step 分割で順次 Write/Edit:
1. Step 2-1: 骨格 Write (フロントマター + 14 H2 見出し)
2. Step 2-2: 概要〜注意事項 Edit (3 評価手法の差分計算 + 入力源連携 + 「参考値性」常時免責)
3. Step 2-3a: エッジケース 12 件以上 + 人間検討事項 10 件以上 Edit
4. Step 2-3b: 開発プロンプト + 変更履歴 + 推奨実行モデル Edit
5. Step 2-4: `<details>` プロンプト全文記録 Edit
最終確認として `wc -l` で行数を測定し報告してください (期待: 500-700 行・MAS-066 / MAS-058 並みのボリューム感)。