概要

項目内容
案件 IDMAS-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.jsP/L 末尾に新セクション追加)/ 100_config/101_sys_config.jsDDL32_wrk_invoice の契約形態タグ列追加)/ 000_infra/002_constants.jsMENU_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_ROW000_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_paramsF62_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 hoursInvoiceRepository.findByPeriod() + MAS-218 タグ集計
人件費単価HC RPA 給与 ÷ 投入時間RpaService.getHcMonthlyTotal() + MAS-218
稼働率F-ClientWork ÷ 総労働時間MAS-218 タグ集計(暫定: F62_MANUAL_UTILIZATION_RATE
業態 defaultuse_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% ∧ 価値ベース実効倍率 ≥ 6bizlp が目指す形(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 遵守

注意事項

  1. 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 行差し替えるだけで済む構造にする)。

  2. 業態 default の妥当性: 本 spec の default(ブティック 50% / 大手 70%)は use_cases.md BZ-1〜BZ-5 のコンサル/受託前提。SaaS / 物販 / 製造業など他業態向けプリセットを v1 時点で用意するか v2 に持ち越すかは商用化時期判断(MAS-058 と同じ業態プリセット機構を将来共有)。

  3. INV 契約形態タグの後方互換: 32_wrk_invoice への列追加はマイグレーション 8XX で既存行を time_based で初期化する。手動更新は INV 編集画面の dropdown(4 値)で対応。マイグレーション未実行時は新規エンジンが undefinedtime_based 扱いに fallback するロジックを内蔵(防御的プログラミング・failure_patterns #19)。

  4. MAS-043 RICE/VALUE/SEED との対応関係: MAS-043 は案件評価軸として VALUE トラックを定義済み。MAS-043 の VALUE = INV の fixed_price + retainer + ip_license という対応関係を spec に明記し、二重定義による誤解を防ぐ。MAS-043 実装後の整合性チェックを単体テスト F62-12 に追加。

  5. 6-10 倍ターゲットの根拠: 戦略メモ §3 の「代替困難な専門領域では 4-5 倍も射程・小規模ファームでバリューベース移行で 6-10 倍相当」をベースに F62_VALUE_BASED_MULTIPLIER_TARGET = 6.0 を採用。SPI Research 2025 等の業界二次ソースで検証を継続(MAS-051 着手時に再評価)。

  6. 稼働率の信号機閾値(60%)の妥当性: 戦略メモ §2-1 のブティック 40-55% を踏まえ、目標を 60% に設定。SPI Research 2025 Billable Utilization 中央値 68.9%(MAS-051 spec で定義)と整合。ブティック default 50% は「目指すべき下限」ではなく「現実値」として運用する点を UI 上で明示。

  7. failure_patterns #25 遵守(並列実装対称性): MAS-024 BEP セクションと完全に対称な構造を保つ。renderPlBepSection_renderPlPsfSection_F03_BEP_THRESHOLDSF03_PSF_THRESHOLDS のペアで命名統一。

  8. failure_patterns #18-#20 遵守(命名造語禁止): 関数名 computePsfMetrics / renderPlPsfSection_ は既存命名と整合(動詞 + 目的語)。「PSF」は Professional Services Firm の業界標準略称・新語ではない。Read で既存ファイルに同名関数がないことを着手時に裏取り。

  9. failure_patterns #26 遵守: appsscript.json の OAuth スコープは変更不要(既存スコープ内で完結)。

  10. 顧客向けサービス化時のテンプレート粒度: 商用化時に PSF 業態専用テンプレートとして切出すか、汎用 KPI として MAS-003 配下に統合するかは PH-4 商用化期に判断(MAS-051 PSF KPI ダッシュボードと統合可能性あり)。v1 では bizlp 自身の運用で実証する段階に絞る。

  11. 戦略メモ更新時の MAS-062 spec 同期フロー: docs/_internal/biz/pricing_strategy_rule_of_three.md が更新されたら、本 spec の §目的・§注意事項 #5 / #6 を再点検。戦略メモは経営者本人の SSoT・spec はそれを実装に落とした派生物 という関係性を保つ。

  12. バリューベース実効倍率の計算境界: 分母の「投入時間」がゼロのリテイナー(成果物提出のみ)の扱い。spec では _sumValueBasedHours_ でゼロ除算を回避し、ゼロ時はリテイナー単独売上を別表示する分岐を内蔵。

  13. MAS-029 Unit Economics との関係: MAS-029 は LTV/CAC など SaaS 指標。本案件は PSF(受託/コンサル)指標。両者は業態軸が異なり並列共存で、UI 上で「業態に応じてどちらを表示するか」をテナント設定 Constants.getParam('TENANT_BUSINESS_TYPE') で切替(MAS-219 ADR-0009 連動)。

エッジケース

#条件期待される挙動理由・ログ出力
1billableHours = 0(全月が内部作業)倍率 = Infinity を防ぎ、UI に「Billable 時間ゼロ・稼働率測定不能」警告創業期や夏季休暇月で発生・Utils.persistLog('WARN', ...)
2totalLaborHours = 0(全月休業)稼働率 = 0、信号機 🔴育休/サバティカル月・前月比較で警告
3laborCost = 0(一人法人で役員報酬を給与計上していない)人件費単価分母ゼロを F62_FALLBACK_LABOR_RATE(default 5,000 円/h)で代替コンサル業態で頻発・bizlp 自身が該当・default 採用
4revenue = 0(売上ゼロ月)バリューベース比率は null(NaN 回避)、UI で「データ不足」表示創業初期・受注ギャップ月
5INV 契約形態タグ未付与(マイグレーション未実行)time_based 扱いに fallback + 1 行 WARN ログ防御的プログラミング・後方互換性
6業態 default が boutique だが実態が大手寄り信号機が常に 🟡 = 移行推奨を返すF62_BUSINESS_TYPE 設定ミス・初回運用時の見直しトリガー
7バリューベース売上が突発的(単月 IP ライセンス売上)信号機 🔵 が 1 ヶ月だけ点灯偽陽性回避: 直近 3 ヶ月平均でも判定するセカンダリシグナルを併設
8F62_MANUAL_UTILIZATION_RATE 未設定(暫定モードで MAS-218 未着手)default 0.50 で算出 + 「手動稼働率モード」バッジを UI 表示MAS-218 着手前の運用透明性確保
9倍率が 10 を超える異常値(人件費単価がほぼゼロ)Math.min(multiplier, 100) で上限クリップ + 異常値警告データ品質エラー検出・無限値防止
10リテイナー売上が変動係数 0.10 を超える「リテイナー収益安定率」セルが 🔴 表示解約予兆 or 単発契約混在の検出シグナル
11IP 売上比率が 0%(時間単価専業)IP 比率セルは 0% 表示・🟢 にはならないbizlp の初期段階・成長軸の見える化
1203_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.51.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.md93_kpi_dashboard 拡張先。PSF 信号機セルを 4 つ追加
MAS-024 BEP 分析dev_mas-024_bep_analysis.mdP/L 末尾拡張パターンの先例。renderPlBepSection_renderPlPsfSection_ 並列対称
MAS-029 Unit Economicsdev_mas-029_unit_economics.mdSaaS 軸 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_*.mdINV 契約形態タグの拡張連携先
use_cases.md OP-X8use_cases.md月次レビュー時の価格戦略チェックポイントとして PSF 指標を活用
PRD プロダクトポリシーprd.mdHuman-in-the-Loop 原則(指標は提案・最終判断はユーザー)
失敗パターンfailure_patterns.md特に #18-#20(命名造語)/ #25(並列実装対称性)/ #26(oauthScopes)
CLAUDE.mdCLAUDE.mdプロジェクトルール・GAS ファイル番号体系・コーディング規約

人間が検討すべき事項

  1. 業態 default 細分化粒度: ブティック 50% / 大手 70% / コモディティ 40% の 3 段階で十分か。SaaS / 物販 / 製造業の業態追加は v1 vs v2。商用化時期と直結。

  2. バリューベース売上の判別ロジック: INV 契約形態タグ拡張で対応するか、別途プロジェクト属性管理(14_mst_project に列追加)にするか。MAS-043 起票時のスキーマ判断と統合検討。

  3. 6-10 倍ターゲットの根拠: 業界ベンチマーク確認(SPI Research 2025 / Deltek / Service Performance Insight 等の二次ソース)。MAS-051 着手時に再評価。

  4. MAS-218 タイムトラッキング着手前の暫定運用: 手動入力 vs 計算スキップの選択。spec は「手動入力 default 0.50 + バッジ表示」を採用したが、ユーザー運用負荷を考慮して計算スキップ(PSF セクション非表示)も選択肢。

  5. MAS-043 RICE/VALUE/SEED との整合性: MAS-043 の VALUE トラック ≒ 本案件のバリューベース売上の対応関係を spec で明示したが、MAS-043 着手時に齟齬がないか再点検。両者の整合性テスト F62-12 を必須化。

  6. 顧客向けサービス化時のテンプレート粒度: PSF 業態専用テンプレート vs 汎用化。商用化時の SKU 設計に影響。

  7. 戦略メモ更新時の MAS-062 spec 同期フロー: SSoT 更新の検知方法(git hook / 手動レビュー)。docs/_internal/biz/ 全般の同期ルール化が必要。

  8. PSF 信号機の閾値カスタマイズ性: テナント別 F62_* を許可するか、業態 default を強制するか(商用化時のサポート負荷とのトレードオフ)。

  9. MENU 配置カテゴリ: 現状 spec は「📊 マート更新」配下に「PSF プロフィタビリティ更新」を配置。refreshPlDatamart() から自動呼出のため独立メニューは optional。MAS-024 BEP と並列で削除も検討可。

  10. リテイナー収益安定率の計算窓: 直近 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.6MAS-058 の純粋関数パターン適用・中程度の判断
Phase 2 P/L 末尾セクション統合 + 93_kpi_dashboard 拡張Claude Sonnet 4.6MAS-024 BEP セクションのパターン流用
Phase 3 32_wrk_invoice DDL 拡張 + マイグレーションClaude Sonnet 4.6800_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-27v0.1 (骨組み)初版骨組み作成。全セクション見出し + 概要テーブルのみ。ai_agent_tips.md §6 の章単位生成方針を準用。
2026-04-27v0.2 (本体)現在のコード(MAS-024 拡張パターン / MAS-003 信号機 / MAS-218 暫定運用 / 32_wrk_invoice contractType 拡張)+ 修正方針 5 Step 本文(PSF メトリクス 2 ブロック設計 / 入力次元 / 信号機シグナル / 純粋関数エンジン JavaScript 疑似コード / P/L 末尾統合 + 93_kpi_dashboard 拡張)を追記。
2026-04-27v0.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-27v1.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-28v1.1 (番号衝突解消・449→453)実装監査の結果、v1.0 で予定していた 400_domain/449_psf_profitability_engine.js449 番が 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 自動デプロイへの影響なし。