MAS-062: PSF プロフィタビリティ指標拡張(Rule of Three 動的分解 + 価値ベース課金移行可視化)
概要
| 項目 | 内容 |
|---|---|
| 案件 ID | MAS-062 |
| 案件名 | PSF プロフィタビリティ指標拡張(Rule of Three 動的分解 + 価値ベース課金移行可視化) |
| カテゴリ | FP&A・PSF KPI |
| 優先度 | P2 ★★(売上構造そのものの差別化軸・MAS-049/MAS-041/MAS-141 等の節税系とは独立領域) |
| 所要時間 | 約 1.5 ヶ月(週 10h 前提) |
| 実装ステータス | 📝 仕様書段階・実装未着手 (2026-04-28 監査時点) |
| 対象ファイル(新規) | 400_domain/453_psf_profitability_engine.js(純粋関数・倍率/稼働率/実効回収率算出 + パターン診断) |
| 対象ファイル(変更) | 600_report/603_datamart_pl.js(P/L 末尾に新セクション追加)/ 100_config/101_sys_config.js(DDL に 32_wrk_invoice の契約形態タグ列追加)/ 000_infra/002_constants.js(MENU_DEFINITION 追加) |
| 新規シート | なし(既存 93_kpi_dashboard / 92_fs_pl に列追加のみ) |
新規 03_sys_params キー | F62_TARGET_MULTIPLIER(default 3.0)/ F62_TARGET_UTILIZATION_BOUTIQUE(default 0.5)/ F62_TARGET_UTILIZATION_LARGE(default 0.7)/ F62_VALUE_BASED_TARGET_RATIO(default 0.5)/ F62_VALUE_BASED_MULTIPLIER_TARGET(default 6.0)/ F62_BUSINESS_TYPE(default boutique)の計 6 キー |
| 前提案件 | MAS-003 KPI ダッシュボード(✅ 完了・93_kpi_dashboard 拡張先)/ MAS-024 BEP 分析(✅ 完了・P/L 末尾拡張パターンの先例)/ MAS-218 タイムトラッキング(未着手・稼働率の分母) |
| 後続連携 | MAS-043(RICE/VALUE/SEED 2 トラック・VALUE トラック ≒ バリューベース売上)/ MAS-051 PSF KPI ダッシュボード(業界ベンチマーク統合)/ MAS-081 進行基準収益認識(INV 契約形態タグの拡張連携) |
| 吸収・再定義対象 | なし(新規領域・MAS-051 は業界ベンチマークレイヤーで並列共存) |
目的
既存の MAS-003(KPI ダッシュボード ✅)/ MAS-024(BEP 分析 ✅・P/L 末尾拡張の前例)/ MAS-051(PSF KPI ダッシュボード 仕様書未着手)/ MAS-043(RICE/VALUE/SEED 2 トラック採算)はカバー範囲が断片的で、「Rule of Three の構造分解 + 価値ベース課金への移行可視化」を扱う統合仕様は空白。
伝統的な「Rule of Three(時間単価×3 倍)」は稼働率 70% + 十分なレバレッジ + 安定した受注フロー が前提だが、ブティック(数人規模)では稼働率 40-55%(創業者が営業・経営・経理兼務)+ レバレッジ不在 + 安定受注の弱さで前提が崩れる。本案件は**「3 倍の時間単価を追うより、6-10 倍相当の利益率を出す案件設計」**へのシフトを P/L 上で可視化し、bizlp 経営者が時間単価モデルから脱却するきっかけを継続提供する。世界の海外 FP&A SaaS(Pigment / Causal / Runway / Mosaic)は時間単価ベースの稼働率管理は扱うが「時間単価モデル vs バリューベースモデルの並列対比」と「6-10 倍相当利益率の達成度シグナル」は不在で、bizlp の差別化機会となる。
現在のコード
本案件は MAS-024 BEP 分析が確立した「P/L 末尾拡張ブロック」パターンに 3 つ目のブロックとして追加する形で実装する。新規ロジックは PSF メトリクス算出(倍率・稼働率・実効回収率・バリューベース指標)と信号機判定のみで、P/L 集計・MAS-003 KPI ダッシュボード描画は既存関数を流用する。
MAS-024 BEP 分析(✅ 完了)の P/L 末尾拡張パターン
| 関数 | 定義ファイル | 用途 |
|---|---|---|
renderPlBepSection_(sheet, plData) | 600_report/603_datamart_pl.js(既存) | P/L 末尾に BEP セクションを描画。本案件はこの直下に PSF セクションを並列追加 |
Constants.PL_EXTENSION_ANCHOR_ROW | 000_infra/002_constants.js(既存) | BEP 直下の追加先行を計算するアンカー定数 |
MAS-003 KPI ダッシュボード(✅ 完了)の信号機ロジック
93_kpi_dashboard の条件付き書式は Utils.applyTrafficLight_(range, thresholds) を共通ヘルパとして既に持つ。本案件は同関数を呼び出して PSF 信号機(🟢/🟡/🔵)を統一描画する。
MAS-218 タイムトラッキング(未着手・前提)
稼働率の分母(総労働時間 = F-ClientWork タグ + F-Internal タグ + F-Sales タグ)と分子(F-ClientWork タグ)を提供する想定。MAS-218 着手前の暫定運用は 手動入力モード(03_sys_params の F62_MANUAL_UTILIZATION_RATE を読む)で対応する(注意事項 #4 参照)。
32_wrk_invoice の契約形態タグ拡張
現状の INV エンティティに「契約形態」列が存在しない。本案件で contractType 列を追加する(4 値: time_based / fixed_price / retainer / ip_license)。既存 INV は default time_based で初期化(マイグレーション 8XX_migration_f62_contract_type.js を新設)。
修正方針
Step 1 — PSF メトリクス 2 ブロック設計
P/L 末尾に 「PSF メトリクス(時間単価モデル分解)」 と 「価値ベース指標(バリューベース課金分解)」 の 2 ブロックを並列配置する。
ブロック A: PSF メトリクス(時間単価モデル分解)
| 指標 | 計算式 | 業態 default |
|---|---|---|
| 時間単価 | 売上 ÷ Billable hours | — |
| 人件費単価 | 人件費(HC RPA 給与)÷ 投入時間 | — |
| 倍率 | 時間単価 ÷ 人件費単価 | 目標 3.0 |
| 稼働率 | Billable hours ÷ 総労働時間 | ブティック 50% / 大手 70% |
| 実効回収率 | 倍率 × 稼働率 | 目標 1.5(倍率 3.0 × 稼働率 0.5) |
| 間接費比率 | 間接費 ÷ 売上 | コンサル 25-35% |
| 純粋利益率 vs 実際利益率 | (1 − 1/倍率 − 間接費比率) vs 実際営業利益率 | — |
ブロック B: 価値ベース指標(バリューベース課金分解)
| 指標 | 計算式 | 目標 |
|---|---|---|
| バリューベース売上比率 | (リテイナー + 固定価格 + IP) 売上 ÷ 総売上 | ≥ 50% |
| 価値ベース実効倍率 | 売上 ÷ 投入時間 × 人件費単価 | 6-10 倍 |
| リテイナー収益安定率 | 直近 3 ヶ月のリテイナー売上の標準偏差 ÷ 平均 | ≤ 0.10(変動係数 10% 以内) |
| IP / フレームワーク売上比率 | IP 売上 ÷ 総売上 | ≥ 10% |
Step 2 — 入力次元の整理
| 入力 | データソース | 取得関数 |
|---|---|---|
| 時間単価 | 売上 ÷ Billable hours | InvoiceRepository.findByPeriod() + MAS-218 タグ集計 |
| 人件費単価 | HC RPA 給与 ÷ 投入時間 | RpaService.getHcMonthlyTotal() + MAS-218 |
| 稼働率 | F-ClientWork ÷ 総労働時間 | MAS-218 タグ集計(暫定: F62_MANUAL_UTILIZATION_RATE) |
| 業態 default | use_cases.md BZ-1〜BZ-5 連動 | Constants.getParam('F62_BUSINESS_TYPE', 'boutique') |
| バリューベース判別 | INV の契約形態タグ | InvoiceRepository.findByContractType(['retainer','fixed_price','ip_license']) |
Step 3 — 信号機シグナル設計
| 状態 | 条件 | 意味 |
|---|---|---|
| 🟢 | 倍率 ≥ 3 ∧ 稼働率 ≥ 60% | 健全な時間単価モデル |
| 🟡 | 倍率 < 3 ∨ 稼働率 < 50% | 価値ベースへの移行検討推奨 |
| 🔵 | バリューベース売上比率 ≥ 50% ∧ 価値ベース実効倍率 ≥ 6 | bizlp が目指す形(6-10 倍相当利益率の達成) |
| 🔴 | 倍率 < 2 ∧ 稼働率 < 40% | 価格・案件構造の根本見直し必要(コモディティ化リスク) |
Step 4 — 純粋関数エンジン実装
// 400_domain/453_psf_profitability_engine.js (純粋関数 + IIFE 名前空間)
var PsfProfitabilityEngine = (function () {
/**
* @param {Object} input
* @param {number} input.revenue 期間売上(円)
* @param {number} input.billableHours Billable 時間(h)
* @param {number} input.totalLaborHours 総労働時間(h)
* @param {number} input.laborCost 人件費(円・HC RPA 集計)
* @param {number} input.indirectCost 間接費(円)
* @param {Object[]} input.invoices [{contractType, amount, billableHours}]
* @param {Object} [input.params] 03_sys_params override
* @returns {{multiplier, utilization, effectiveRecovery, valueBasedRatio,
* valueBasedMultiplier, signal, breakdown}}
*/
function computePsfMetrics(input) {
var p = input.params || _loadParamsFromSysParams_();
// ブロック A: 時間単価モデル
var hourlyRate = input.revenue / input.billableHours;
var laborRatePerHour = input.laborCost / input.totalLaborHours;
var multiplier = hourlyRate / laborRatePerHour;
var utilization = input.billableHours / input.totalLaborHours;
var effectiveRecovery = multiplier * utilization;
// ブロック B: 価値ベース
var valueBasedRevenue = input.invoices
.filter(function (i) { return ['retainer','fixed_price','ip_license'].indexOf(i.contractType) >= 0; })
.reduce(function (s, i) { return s + i.amount; }, 0);
var valueBasedRatio = valueBasedRevenue / input.revenue;
var valueBasedMultiplier = (valueBasedRevenue / _sumValueBasedHours_(input.invoices)) / laborRatePerHour;
var signal = _classifySignal_(multiplier, utilization, valueBasedRatio, valueBasedMultiplier, p);
return {
multiplier: multiplier,
utilization: utilization,
effectiveRecovery: effectiveRecovery,
valueBasedRatio: valueBasedRatio,
valueBasedMultiplier: valueBasedMultiplier,
signal: signal,
breakdown: _buildBreakdown_(input, p)
};
}
function _classifySignal_(m, u, vbr, vbm, p) {
if (vbr >= p.valueBasedTargetRatio && vbm >= p.valueBasedMultiplierTarget) return 'BLUE'; // 🔵
if (m < 2 && u < 0.40) return 'RED'; // 🔴
if (m >= p.targetMultiplier && u >= 0.60) return 'GREEN'; // 🟢
return 'YELLOW'; // 🟡
}
return { computePsfMetrics: computePsfMetrics };
})();
純粋性の維持: SpreadsheetApp 呼び出しはせず、入力値で完結。シート連携は 600_report/603_datamart_pl.js 側のラッパー関数 renderPlPsfSection_(sheet, metrics) が担当。
Step 5 — P/L 末尾セクション統合 + 93_kpi_dashboard 拡張
600_report/603_datamart_pl.js の改修:
function refreshPlDatamart() {
var sheet = _getOrCreateSheet_('92_fs_pl');
var plData = _aggregatePl_();
_renderPlMain_(sheet, plData); // 既存
renderPlBepSection_(sheet, plData); // 既存(F-24)
renderPlPsfSection_(sheet, plData); // 新規(F-62)← 本案件で追加
// 将来: renderPlNonOperatingSection_(sheet, plData) (F-63)
}
93_kpi_dashboard 拡張:
MAS-003 既存ダッシュボードに以下 4 セルを追加:
- 倍率(信号機 🟢/🟡/🔴 + 数値)
- 稼働率(信号機 + %)
- 実効回収率(数値)
- バリューベース売上比率(信号機 🔵/灰 + %)
Utils.applyTrafficLight_(range, F03_PSF_THRESHOLDS) を新設して MAS-003 と統一描画。
影響範囲
| 対象 | 種別 | 変更内容 | リスク |
|---|---|---|---|
400_domain/453_psf_profitability_engine.js | 追加 | PsfProfitabilityEngine.computePsfMetrics() + 内部ヘルパ群(純粋関数・約 200-300 行) | 既存ロジックへの影響なし |
600_report/603_datamart_pl.js | 変更 | renderPlPsfSection_() 追加 + refreshPlDatamart() から呼出 | MAS-024 BEP セクション直下に並列追加・既存描画への影響なし |
100_config/101_sys_config.js | 変更 | 32_wrk_invoice DDL に contractType 列追加(4 値・default time_based) | 既存 INV 行は default 値で初期化・後方互換性維持 |
000_infra/002_constants.js | 変更 | MENU_DEFINITION に「📊 PSF プロフィタビリティ更新」追加 + F03_PSF_THRESHOLDS 信号機閾値追加 | 既存メニューに影響なし |
93_kpi_dashboard | 変更 | 4 セル追加(倍率・稼働率・実効回収率・バリューベース比率)+ 条件付き書式 | MAS-003 既存セルに影響なし |
03_sys_params | 変更 | 6 キー追加(F62_*)。Constants.getParam 経由で読込・default fallback あり | シード未実行でも default 値で動作 |
8XX_migration_f62_contract_type.js | 追加 | 32_wrk_invoice 既存行を contractType = 'time_based' で初期化(冪等) | 一度実行すればスキップ |
900_test/901_test_runner.js | 変更 | MAS-062 単体テスト F62-01〜F62-13 追加 | 既存テストへの影響なし |
| MAS-218 タイムトラッキング | 前提依存 | 着手前は F62_MANUAL_UTILIZATION_RATE で代替・着手後に自動連携に切替 | 暫定モードで MAS-218 ブロッキングを回避 |
| appsscript.json | 変更なし | OAuth スコープ追加不要 | failure_patterns #26 遵守 |
注意事項
MAS-218 タイムトラッキング着手前の暫定運用: 稼働率の分母となる
F-ClientWork/F-Internal/F-Salesタグ集計は MAS-218 で実装される。本案件着手時点で MAS-218 が未完了なら、03_sys_params.F62_MANUAL_UTILIZATION_RATE(default 0.50)を毎月手動更新する暫定モードを採用。MAS-218 完了後にデータソース切替(呼出側を 1 行差し替えるだけで済む構造にする)。業態 default の妥当性: 本 spec の default(ブティック 50% / 大手 70%)は
use_cases.mdBZ-1〜BZ-5 のコンサル/受託前提。SaaS / 物販 / 製造業など他業態向けプリセットを v1 時点で用意するか v2 に持ち越すかは商用化時期判断(MAS-058 と同じ業態プリセット機構を将来共有)。INV 契約形態タグの後方互換:
32_wrk_invoiceへの列追加はマイグレーション 8XX で既存行をtime_basedで初期化する。手動更新は INV 編集画面の dropdown(4 値)で対応。マイグレーション未実行時は新規エンジンがundefinedをtime_based扱いに fallback するロジックを内蔵(防御的プログラミング・failure_patterns #19)。MAS-043 RICE/VALUE/SEED との対応関係: MAS-043 は案件評価軸として VALUE トラックを定義済み。MAS-043 の VALUE = INV の
fixed_price+retainer+ip_licenseという対応関係を spec に明記し、二重定義による誤解を防ぐ。MAS-043 実装後の整合性チェックを単体テスト F62-12 に追加。6-10 倍ターゲットの根拠: 戦略メモ §3 の「代替困難な専門領域では 4-5 倍も射程・小規模ファームでバリューベース移行で 6-10 倍相当」をベースに
F62_VALUE_BASED_MULTIPLIER_TARGET = 6.0を採用。SPI Research 2025 等の業界二次ソースで検証を継続(MAS-051 着手時に再評価)。稼働率の信号機閾値(60%)の妥当性: 戦略メモ §2-1 のブティック 40-55% を踏まえ、目標を 60% に設定。SPI Research 2025 Billable Utilization 中央値 68.9%(MAS-051 spec で定義)と整合。ブティック default 50% は「目指すべき下限」ではなく「現実値」として運用する点を UI 上で明示。
failure_patterns #25 遵守(並列実装対称性): MAS-024 BEP セクションと完全に対称な構造を保つ。
renderPlBepSection_↔renderPlPsfSection_、F03_BEP_THRESHOLDS↔F03_PSF_THRESHOLDSのペアで命名統一。failure_patterns #18-#20 遵守(命名造語禁止): 関数名
computePsfMetrics/renderPlPsfSection_は既存命名と整合(動詞 + 目的語)。「PSF」は Professional Services Firm の業界標準略称・新語ではない。Read で既存ファイルに同名関数がないことを着手時に裏取り。failure_patterns #26 遵守:
appsscript.jsonの OAuth スコープは変更不要(既存スコープ内で完結)。顧客向けサービス化時のテンプレート粒度: 商用化時に PSF 業態専用テンプレートとして切出すか、汎用 KPI として MAS-003 配下に統合するかは PH-4 商用化期に判断(MAS-051 PSF KPI ダッシュボードと統合可能性あり)。v1 では bizlp 自身の運用で実証する段階に絞る。
戦略メモ更新時の MAS-062 spec 同期フロー:
docs/_internal/biz/pricing_strategy_rule_of_three.mdが更新されたら、本 spec の §目的・§注意事項 #5 / #6 を再点検。戦略メモは経営者本人の SSoT・spec はそれを実装に落とした派生物 という関係性を保つ。バリューベース実効倍率の計算境界: 分母の「投入時間」がゼロのリテイナー(成果物提出のみ)の扱い。spec では
_sumValueBasedHours_でゼロ除算を回避し、ゼロ時はリテイナー単独売上を別表示する分岐を内蔵。MAS-029 Unit Economics との関係: MAS-029 は LTV/CAC など SaaS 指標。本案件は PSF(受託/コンサル)指標。両者は業態軸が異なり並列共存で、UI 上で「業態に応じてどちらを表示するか」をテナント設定
Constants.getParam('TENANT_BUSINESS_TYPE')で切替(MAS-219 ADR-0009 連動)。
エッジケース
| # | 条件 | 期待される挙動 | 理由・ログ出力 |
|---|---|---|---|
| 1 | billableHours = 0(全月が内部作業) | 倍率 = Infinity を防ぎ、UI に「Billable 時間ゼロ・稼働率測定不能」警告 | 創業期や夏季休暇月で発生・Utils.persistLog('WARN', ...) |
| 2 | totalLaborHours = 0(全月休業) | 稼働率 = 0、信号機 🔴 | 育休/サバティカル月・前月比較で警告 |
| 3 | laborCost = 0(一人法人で役員報酬を給与計上していない) | 人件費単価分母ゼロを F62_FALLBACK_LABOR_RATE(default 5,000 円/h)で代替 | コンサル業態で頻発・bizlp 自身が該当・default 採用 |
| 4 | revenue = 0(売上ゼロ月) | バリューベース比率は null(NaN 回避)、UI で「データ不足」表示 | 創業初期・受注ギャップ月 |
| 5 | INV 契約形態タグ未付与(マイグレーション未実行) | time_based 扱いに fallback + 1 行 WARN ログ | 防御的プログラミング・後方互換性 |
| 6 | 業態 default が boutique だが実態が大手寄り | 信号機が常に 🟡 = 移行推奨を返す | F62_BUSINESS_TYPE 設定ミス・初回運用時の見直しトリガー |
| 7 | バリューベース売上が突発的(単月 IP ライセンス売上) | 信号機 🔵 が 1 ヶ月だけ点灯 | 偽陽性回避: 直近 3 ヶ月平均でも判定するセカンダリシグナルを併設 |
| 8 | F62_MANUAL_UTILIZATION_RATE 未設定(暫定モードで MAS-218 未着手) | default 0.50 で算出 + 「手動稼働率モード」バッジを UI 表示 | MAS-218 着手前の運用透明性確保 |
| 9 | 倍率が 10 を超える異常値(人件費単価がほぼゼロ) | Math.min(multiplier, 100) で上限クリップ + 異常値警告 | データ品質エラー検出・無限値防止 |
| 10 | リテイナー売上が変動係数 0.10 を超える | 「リテイナー収益安定率」セルが 🔴 表示 | 解約予兆 or 単発契約混在の検出シグナル |
| 11 | IP 売上比率が 0%(時間単価専業) | IP 比率セルは 0% 表示・🟢 にはならない | bizlp の初期段階・成長軸の見える化 |
| 12 | 03_sys_params の F62_* キーが範囲外(負値・100% 超) | 起動時バリデーション: 範囲外なら default で上書き + WARN ログ | ユーザー誤設定対策・MAS-058 と同パターン |
| 13 | 月次集計で前月比 > ±50% 変動 | 「前月比急変アラート」を P/L コメント欄に自動記入 | 一時的な異常値による誤った経営判断を予防 |
実データ検証
1. bizlp 自身の現状値(戦略メモ §5 をテストフィクスチャ化)
実装完了後に以下を 901_test_runner.js で自動検証し、±10% 以内で一致を合格基準とする(戦略メモは「推計」ベースのため許容幅を MAS-058 より広く取る)。
| 軸 | 戦略メモ §5 の現状値 | MAS-062 期待算出値 | 信号機 |
|---|---|---|---|
| 倍率 | 推計 2-2.5 倍 | 倍率 ∈ [1.8, 2.7] | 🟡 |
| 稼働率 | 40-55% | 稼働率 ∈ [0.36, 0.60] | 🟡 |
| 実効回収率 | 倍率 × 稼働率 = 0.8-1.5 | 1.0 前後 | 🟡 |
| バリューベース売上比率 | 現状ほぼゼロ | < 10% | 灰 |
| 価値ベース実効倍率 | 算出不能(バリューベース売上ほぼなし) | null | — |
2. 6-10 倍相当の達成シミュレーション
戦略メモが示す「6-10 倍相当の利益率を出す案件設計」のターゲット状態を入力して 🔵 シグナルが点灯することを検証:
- バリューベース売上比率 60% / 価値ベース実効倍率 7.0 → 🔵 達成
- バリューベース売上比率 60% / 価値ベース実効倍率 5.5 → 🟡(実効倍率不足)
- バリューベース売上比率 40% / 価値ベース実効倍率 7.0 → 🟡(バリューベース比率不足)
3. MAS-003 KPI ダッシュボード閾値との整合確認
PSF 信号機が MAS-003 既存 KPI(労働分配率・営業利益率・ランウェイ)と矛盾しないことを実機検証。「PSF 🟢 なのに MAS-003 営業利益率 🔴」は閾値不整合のサインとして spec 側の調整対象。
4. MAS-043 VALUE トラックとの整合(MAS-043 実装後)
MAS-043 着手後、MAS-043 の VALUE 売上集計と本案件のバリューベース売上が ±1 円一致 することを単体テスト F62-12 で検証。
5. エッジケース検証(単体テスト F62-01〜F62-13)
エッジケースセクションの 13 項目それぞれを 1 テストケースとして 901_test_runner.js に追加。
関連ドキュメント
| カテゴリ | ドキュメント | 関係 |
|---|---|---|
| 戦略 SSoT(最重要) | pricing_strategy_rule_of_three.md | 経営者本人の分析・本案件の起票根拠資料。「3 倍を追うより 6-10 倍相当の案件設計」メッセージの SSoT |
| MAS-003 KPI ダッシュボード | dev_mas-003_kpi_dashboard.md | 93_kpi_dashboard 拡張先。PSF 信号機セルを 4 つ追加 |
| MAS-024 BEP 分析 | dev_mas-024_bep_analysis.md | P/L 末尾拡張パターンの先例。renderPlBepSection_ ↔ renderPlPsfSection_ 並列対称 |
| MAS-029 Unit Economics | dev_mas-029_unit_economics.md | SaaS 軸 KPI(LTV/CAC)。本案件と業態軸切替で並列共存 |
| MAS-043 ハイブリッド 2 トラック採算 | TODO_future.md の MAS-043 行 | VALUE トラック ≒ INV 契約形態 fixed_price + retainer + ip_license の対応関係 |
| MAS-051 PSF KPI ダッシュボード | TODO_future.md の MAS-051 行 | SPI Research 2025 業界ベンチマーク。本案件の閾値根拠 + 商用化時に統合可能性 |
| MAS-058 必要年商シミュレーター | dev_mas-058_required_revenue_solver.md | 業態 default の整合(コンサル一人法人)+ failure_patterns #25 並列実装対称性の手本 |
| MAS-063 P/L 営業外損益指標拡張 | dev_mas-063_pl_non_operating_metrics.md | 並列で P/L 末尾拡張ブロック(3 つ目)として追加される姉妹案件 |
| MAS-218 タイムトラッキング | TODO_future.md の MAS-218 行 | 稼働率分母の自動取得ソース。MAS-218 完了後にデータソース自動切替 |
| MAS-081 進行基準収益認識 | dev_mas-081_*.md | INV 契約形態タグの拡張連携先 |
| use_cases.md OP-X8 | use_cases.md | 月次レビュー時の価格戦略チェックポイントとして PSF 指標を活用 |
| PRD プロダクトポリシー | prd.md | Human-in-the-Loop 原則(指標は提案・最終判断はユーザー) |
| 失敗パターン | failure_patterns.md | 特に #18-#20(命名造語)/ #25(並列実装対称性)/ #26(oauthScopes) |
| CLAUDE.md | CLAUDE.md | プロジェクトルール・GAS ファイル番号体系・コーディング規約 |
人間が検討すべき事項
業態 default 細分化粒度: ブティック 50% / 大手 70% / コモディティ 40% の 3 段階で十分か。SaaS / 物販 / 製造業の業態追加は v1 vs v2。商用化時期と直結。
バリューベース売上の判別ロジック: INV 契約形態タグ拡張で対応するか、別途プロジェクト属性管理(14_mst_project に列追加)にするか。MAS-043 起票時のスキーマ判断と統合検討。
6-10 倍ターゲットの根拠: 業界ベンチマーク確認(SPI Research 2025 / Deltek / Service Performance Insight 等の二次ソース)。MAS-051 着手時に再評価。
MAS-218 タイムトラッキング着手前の暫定運用: 手動入力 vs 計算スキップの選択。spec は「手動入力 default 0.50 + バッジ表示」を採用したが、ユーザー運用負荷を考慮して計算スキップ(PSF セクション非表示)も選択肢。
MAS-043 RICE/VALUE/SEED との整合性: MAS-043 の VALUE トラック ≒ 本案件のバリューベース売上の対応関係を spec で明示したが、MAS-043 着手時に齟齬がないか再点検。両者の整合性テスト F62-12 を必須化。
顧客向けサービス化時のテンプレート粒度: PSF 業態専用テンプレート vs 汎用化。商用化時の SKU 設計に影響。
戦略メモ更新時の MAS-062 spec 同期フロー: SSoT 更新の検知方法(git hook / 手動レビュー)。
docs/_internal/biz/全般の同期ルール化が必要。PSF 信号機の閾値カスタマイズ性: テナント別
F62_*を許可するか、業態 default を強制するか(商用化時のサポート負荷とのトレードオフ)。MENU 配置カテゴリ: 現状 spec は「📊 マート更新」配下に「PSF プロフィタビリティ更新」を配置。
refreshPlDatamart()から自動呼出のため独立メニューは optional。MAS-024 BEP と並列で削除も検討可。リテイナー収益安定率の計算窓: 直近 3 ヶ月 vs 6 ヶ月 vs 12 ヶ月。短期は感度高・長期は安定。bizlp 規模では 3 ヶ月推奨だが SaaS 顧客向けには 12 ヶ月が妥当か。
実装プロンプト(Claude Code 用)
Claude Sonnet 4.6 推奨。MAS-024 BEP セクションの拡張パターンに MAS-058 spec の純粋関数 + 信号機ロジックを組合せる中難易度。
## 案件
MAS-062 — PSF プロフィタビリティ指標拡張(Rule of Three 動的分解 + 価値ベース課金移行可視化)
## 事前調査(必ず Read する)
1. `docs/dev/dev_mas-062_psf_profitability_extension.md` 全文(本仕様書)
2. `docs/_internal/biz/pricing_strategy_rule_of_three.md` 全文(戦略 SSoT)
3. `docs/dev/dev_mas-024_bep_analysis.md` — P/L 末尾拡張パターンの先例
4. `docs/dev/dev_mas-058_required_revenue_solver.md` — 純粋関数 + 信号機ロジックの手本
5. `docs/dev/dev_mas-003_kpi_dashboard.md` — 93_kpi_dashboard 拡張方法
6. `600_report/603_datamart_pl.js` — `renderPlBepSection_` 実装確認
7. `200_data/202_repository.js` — InvoiceRepository の API
8. `100_config/101_sys_config.js` — `32_wrk_invoice` DDL 拡張箇所
9. `docs/_internal/failure_patterns.md` #18-#20 / #25 / #26
## 実装対象
1. `400_domain/453_psf_profitability_engine.js` 新規(IIFE 名前空間 PsfProfitabilityEngine):
- computePsfMetrics(input) — メイン API
- 内部ヘルパ: _loadParamsFromSysParams_ / _classifySignal_ / _sumValueBasedHours_ / _buildBreakdown_
2. `600_report/603_datamart_pl.js` 拡張:
- renderPlPsfSection_(sheet, plData) を `renderPlBepSection_` 直下に追加
- refreshPlDatamart() から呼出
3. `100_config/101_sys_config.js` 拡張:
- 32_wrk_invoice DDL に contractType 列追加(4 値 enum)
4. `8XX_migration_f62_contract_type.js` 新規(番号は `ls 800_ops/` で次番取得):
- 既存 INV を contractType = 'time_based' で初期化(冪等)
5. `93_kpi_dashboard` セル追加(MAS-003 既存セルの右隣)+ 条件付き書式
- 倍率 / 稼働率 / 実効回収率 / バリューベース売上比率 の 4 セル
6. `03_sys_params` の 6 キー追加(default は Constants.getParam の第 2 引数)
7. `900_test/901_test_runner.js` に F62-01〜F62-13 単体テスト
## 動作確認
1. bizlp 現状データで信号機が 🟡 表示
2. 6-10 倍シミュレーションで 🔵 表示
3. MAS-003 KPI ダッシュボードと閾値整合
4. エッジケース 13 項目すべて想定通り
## デプロイ
1. dev で push:dev → メニュー「📊 マート更新」実行 → 92_fs_pl 末尾の PSF セクション目視確認
2. Go なら push:prod
3. コミット: feat(MAS-062): PSF プロフィタビリティ指標拡張 (Rule of Three + バリューベース可視化)
## failure_patterns チェック
- #18-#20: computePsfMetrics / renderPlPsfSection_ を Read で裏取り
- #25: MAS-024 BEP セクションと対称構造
- #26: appsscript.json は変更なし
推奨実行モデル
| 工程 | 推奨モデル | 根拠 |
|---|---|---|
| Phase 1 PsfProfitabilityEngine コア実装 | Claude Sonnet 4.6 | MAS-058 の純粋関数パターン適用・中程度の判断 |
| Phase 2 P/L 末尾セクション統合 + 93_kpi_dashboard 拡張 | Claude Sonnet 4.6 | MAS-024 BEP セクションのパターン流用 |
| Phase 3 32_wrk_invoice DDL 拡張 + マイグレーション | Claude Sonnet 4.6 | 800_ops 既存パターン(804-808)流用 |
| 単体テスト実装(F62-01〜F62-13) | Claude Haiku 4.5 | パターン化された期待値検証 |
| 戦略メモ更新時の spec 同期レビュー | Claude Opus 4.7 (1M context) | SSoT 整合性の判断は domain 知識必須 |
| 仕様書レビュー | Gemini 3 Pro Preview + Deep Think | 第三者視点での閾値妥当性検証 |
変更履歴
| 日時 | バージョン | 変更内容 |
|---|---|---|
| 2026-04-27 | v0.1 (骨組み) | 初版骨組み作成。全セクション見出し + 概要テーブルのみ。ai_agent_tips.md §6 の章単位生成方針を準用。 |
| 2026-04-27 | v0.2 (本体) | 現在のコード(MAS-024 拡張パターン / MAS-003 信号機 / MAS-218 暫定運用 / 32_wrk_invoice contractType 拡張)+ 修正方針 5 Step 本文(PSF メトリクス 2 ブロック設計 / 入力次元 / 信号機シグナル / 純粋関数エンジン JavaScript 疑似コード / P/L 末尾統合 + 93_kpi_dashboard 拡張)を追記。 |
| 2026-04-27 | v0.3 (堅牢化) | 影響範囲テーブル(新規 2 / 変更 6 / 変更なし 2)+ 注意事項 13 項目(MAS-218 暫定運用 / 業態 default 妥当性 / INV タグ後方互換 / MAS-043 VALUE 対応 / 6-10 倍ターゲット根拠 / failure_patterns #25/#26 遵守 等)+ エッジケース 13 パターン(Billable ゼロ / 全月休業 / 人件費単価ゼロ / INV タグ未付与 / 業態誤設定 / 突発バリューベース 等)+ 実データ検証 5 本(bizlp 現状 / 6-10 倍達成シミュレーション / MAS-003 整合 / MAS-043 VALUE 一致 / 単体テスト F62-01〜F62-13)。 |
| 2026-04-27 | v1.0 (仕様書完了) | 関連ドキュメント 14 件(戦略 SSoT を最上位 / MAS-003 / MAS-024 / MAS-029 / MAS-043 / MAS-051 / MAS-058 / MAS-063 / MAS-218 / MAS-081 / use_cases.md / PRD / failure_patterns / CLAUDE.md)+ 人間検討事項 10 項目 + 実装プロンプト(Claude Sonnet 4.6 向け・事前調査 9 / 実装対象 7 / 動作確認 4 / failure_patterns チェック)+ 推奨実行モデル(Phase 1-3 + テスト + レビュー)。仕様書完了(v1.0)として昇格。MAS-043 仕様書起票後または MAS-218 着手前後に本案件の実装タスクをキックオフ。 |
| 2026-04-28 | v1.1 (番号衝突解消・449→453) | 実装監査の結果、v1.0 で予定していた 400_domain/449_psf_profitability_engine.js の 449 番が MAS-066 配当ミックス最適化 (449_dividend_mix_optimizer.js) で既に消費済と判明したため、PSF Engine の番号を 453 に変更。400_domain/ 採番状況 (2026-04-28 時点): 446=MAS-059 (planned) / 447=MAS-060 (planned) / 448=MAS-061 (planned) / 449=MAS-066 (✅実装済) / 450=MAS-063 (planned) / 451=MAS-067 (planned) / 452=MAS-144 (planned) / 453=本案件 (新規アサイン)。spec 内 4 箇所を一括置換。failure_patterns #31 (番号衝突チェック) の事後適用事例。docs-only 改訂で prod 自動デプロイへの影響なし。 |