概要

項目内容
案件 IDMAS-044
カテゴリFP&A・シミュレーション(基盤整備)
対象ファイル(変更あり)100_config/101_sys_config.jsschemasMST_HC_TMPL 追加 + existKeys + setVali
200_data/202_repository.js(末尾に PositionTemplateRepository 追記)
400_domain/430_what_if_simulator.jsgetWhatIfDefaults に HC テンプレ参照ロジック追加)
templates/what_if_sidebar.html(HC_ADD ブロックにテンプレート選択 dropdown 追加・onChange で全フィールド自動入力)
新規シート18_tmpl_hc_position(ポジションテンプレ・DDL 管理)
前提案件MAS-011 MVP(PR #315 + #320 polish、完了済)
後続案件MAS-045(予算転記:テンプレ ID を転記行に記録する列追加の可能性)、MAS-048(採用 TCO シミュレーター:テンプレから標準月額給与を参照)、MAS-055(SaaS カタログマスタ・2026-04-23 に本案件から切り出し独立起票)

MAS-011 What-if シミュレーションで「人員追加(HC_ADD)」を検討する際、毎回手入力していた給与水準・採用費・PC 費・想定月次売上貢献等を ポジション単位でテンプレート化 する。MAS-011 polish で追加された「実績平均プリロード」(22_bud_headcount の有効行平均から自動補完)を補完する位置付け — 実績ゼロ期(創業直後・新ポジション)でもデフォルト値が出る状態を実現する。

ポジション例: 営業 Jr / 営業 Sr / エンジニア Jr/Mid/Sr / CSM / Manager / Executive。

2026-04-23 スコープ縮小

本案件は当初 HC(18_tmpl_hc_position)+ SaaS(19_tmpl_saas_catalog)の 2 タブを一括対象としていたが、main スペースの採用判断機能群への注力方針を反映し、SaaS カタログ部分を MAS-055(SaaS カタログマスタ)として独立起票。本案件は HC テンプレに限定した。

目的

  • 毎回手入力する手間を削減(複数ポジションパターンを比較する時に効果大)
  • 社内基準の標準化(Sr Eng の想定給与レンジ等を属人性排除)
  • 実績ゼロ時のフォールバック(MAS-011 polish の実績平均プリロードが機能しない創業直後・新ポジションでもデフォルト値提供)
  • MAS-048 採用 TCO シミュレーターへの入力源(採用検討 → 採用 TCO 試算 → MAS-045 予算転記の直線フローを可能にする)

現在のコード

100_config/101_sys_config.js(DDL スキーマ)

setupAllSchemas() 関数内 const schemas = {...}(L879 起点)でシート毎の headers / color / validations を宣言的に定義。本案件では L880 付近に 'MST_HC_TMPL' を追加する。

existKeys 設定(L832 付近)にも MST_HC_TMPL のシステムキー登録を追加し、initConfigs()01_sys_config に自動登録されるようにする。

200_data/202_repository.js(Repository パターン)

AccountRepository(L304-350)/ PartnerRepository(L356-406)/ HurdleRateRepository(MAS-042 で追加済、PR #336)と同じキャッシュパターンを採用。readSheetAsDtos_(sheet)(L19、ファイルスコープのプライベート関数)を流用し、findAsMap() では有効フラグ FALSE 行スキップ + 重複キー先着採用 + _cache キャッシュ。

400_domain/430_what_if_simulator.js(MAS-011 MVP 実装)

getWhatIfDefaults(driver) 関数(MAS-011 polish で実装済)は現在 22_bud_headcount の実績平均から月額給与・想定月次売上・初期費用等のデフォルト値を算出。本案件ではこの関数を拡張し、以下の優先順位で値を返す:

  1. ユーザーが選択したテンプレート値(MAS-044 新規)
  2. 実績平均(MAS-011 polish 既実装)
  3. Constants.getParam のシステム既定値(ハードコードフォールバック)

templates/what_if_sidebar.html(MAS-011 MVP 実装)

432 行。<select id="driver"> で HC_ADD / SAAS_ADD を切替え、<div class="driver-form"> 内にフォーム項目を配置。本案件では HC_ADD ドライバーフォームの冒頭に「ポジションテンプレート選択」dropdown を追加し、選択時に google.script.run.getTemplateValues(templateId) を呼んで全フィールドに反映する。SAAS_ADD 側の同等機能は MAS-055 で対応。

修正方針

Step 1: DDL 追加(101_sys_config.js

schemas 配列に 1 エントリ追加:

'MST_HC_TMPL': {
  headers: ["有効フラグ", "管理ID", "ポジション名", "想定雇用形態", "標準月額給与", "想定月次売上貢献", "想定変動費比率", "採用費デフォルト", "PC費デフォルト", "備考"],
  color: "#c90076",  // BUD_HC と同系統色
  validations: {
    "想定変動費比率": { type: 'range', min: 0, max: 1, helpText: '0〜1 の小数で入力(例: 0.3 = 30%)' },
    "標準月額給与": { type: 'range', min: 0, max: 10000000 },
    "採用費デフォルト": { type: 'range', min: 0, max: 10000000 },
    "PC費デフォルト": { type: 'range', min: 0, max: 1000000 }
  }
},

existKeys 追加(L830 付近):

if (!existKeys.includes('MST_HC_TMPL')) confSheet.appendRow(['MST_HC_TMPL', '', '18_tmpl_hc_position', 'ポジション別テンプレート']);

setVali プルダウン設定(L1491 付近、既存 MST_PROJ 等と同パターン):

  • MST_HC_TMPL想定雇用形態 列: 15_mst_dictionaryUI雇用形態 カテゴリを参照
  • MST_HC_TMPLポジション名 列: フリーテキスト(バリデーション不要)

Step 2: Repository 新設(202_repository.js 末尾)

// =====================================================================
// PositionTemplateRepository — 18_tmpl_hc_position (読み取り専用マスタ)
// =====================================================================

var PositionTemplateRepository = {
  _getSheet: function() {
    return Utils.getSheetByKey('MST_HC_TMPL', '18_tmpl_hc_position');
  },
  findAll: function() {
    return readSheetAsDtos_(PositionTemplateRepository._getSheet());
  },
  findAsMap: function() {
    if (PositionTemplateRepository._cache) return PositionTemplateRepository._cache;
    var result = PositionTemplateRepository.findAll();
    var map = {};
    for (var i = 0; i < result.dtos.length; i++) {
      var dto = result.dtos[i];
      var flag = dto['有効フラグ'];
      if (flag === false || String(flag).toUpperCase() === 'FALSE') continue;
      var id = String(dto['管理ID'] || '').trim();
      if (!id || map[id]) continue;  // 重複は先着採用
      map[id] = {
        positionName: String(dto['ポジション名'] || '').trim(),
        employmentType: String(dto['想定雇用形態'] || '').trim(),
        monthlySalary: Number(dto['標準月額給与']) || 0,
        monthlyRevenue: Number(dto['想定月次売上貢献']) || 0,
        variableCostRate: Number(dto['想定変動費比率']) || 0,
        defaultRecruitFee: Number(dto['採用費デフォルト']) || 0,
        defaultPcCost: Number(dto['PC費デフォルト']) || 0,
        note: String(dto['備考'] || '').trim(),
      };
    }
    PositionTemplateRepository._cache = map;
    return map;
  },
  _cache: null,
  resetCache: function() { PositionTemplateRepository._cache = null; },
};

Step 3: 430_what_if_simulator.jsgetWhatIfDefaults 拡張

MAS-011 polish で実装済の getWhatIfDefaults(driver) を拡張し、引数に templateId(optional)を追加:

function getWhatIfDefaults(driver, templateId) {
  if (driver === 'HC_ADD' && templateId) {
    var tmpl = PositionTemplateRepository.findAsMap()[templateId];
    if (tmpl) {
      return {
        monthlySalary: tmpl.monthlySalary,
        monthlyRevenue: tmpl.monthlyRevenue,
        variableCostRate: tmpl.variableCostRate,
        recruitFee: tmpl.defaultRecruitFee,
        pcCost: tmpl.defaultPcCost,
        source: 'TEMPLATE',
        templateName: tmpl.positionName,
      };
    }
  }
  // (既存 F-11 polish の実績平均プリロードロジックにフォールバック)
  // ...
  // SAAS_ADD 側のテンプレート参照は F-55(SaaS カタログマスタ)で実装
}

新規関数 getHcTemplateList() を公開(サイドバーの dropdown 初期化用):

function getHcTemplateList() {
  var map = PositionTemplateRepository.findAsMap();
  return Object.keys(map).map(function(id) {
    return { id: id, name: map[id].positionName };
  });
}

Step 4: サイドバー UI 拡張(what_if_sidebar.html

HC_ADD ドライバーフォーム冒頭に dropdown を挿入:

<div class="driver-form" id="form-hc-add">
  <label for="hc-template">ポジションテンプレート(任意・選択すると自動入力)</label>
  <select id="hc-template">
    <option value="">-- 手動入力 --</option>
    <!-- onload で getHcTemplateList() の結果を動的挿入 -->
  </select>
  <!-- 既存フォーム項目 -->
</div>

JavaScript:

  • ページロード時に google.script.run.getHcTemplateList()<option> を動的挿入
  • dropdown の onchangegoogle.script.run.getWhatIfDefaults('HC_ADD', templateId) を呼び、返り値で全フィールドを更新
  • source: 'TEMPLATE' のときはフォーム上部に「📋 テンプレート「{{templateName}}」を適用」のヒント表示

SAAS_ADD ドライバー側の同等機能は MAS-055(SaaS カタログマスタ)で別途実装

影響範囲

変更ファイル一覧

ファイル変更種別内容
100_config/101_sys_config.js追加のみschemas に 1 エントリ / existKeys に 1 行 / setVali に数行
200_data/202_repository.js追加のみ末尾に PositionTemplateRepository(約 40 行)
400_domain/430_what_if_simulator.js変更getWhatIfDefaults 拡張 + getHcTemplateList 新設(約 20 行)
templates/what_if_sidebar.html変更HC_ADD ブロックに dropdown 追加 + JS 修正(約 30 行)
docs/_config.json追加のみnav に仕様書登録

既存動作への影響

  • MAS-011 MVP 動作(#315 / #320): templateId 未指定時は既存の実績平均プリロードにフォールバック → 完全後方互換
  • MAS-048 採用 TCO: 本案件完成後、MAS-048 は PositionTemplateRepository.findAsMap() を入力源として使用可能
  • MAS-045 予算転記: 本案件完成後、MAS-045 は転記行に templateId 列を追加する拡張余地あり
  • MAS-055 SaaS カタログマスタ: 並列実装可能。MAS-044 の PositionTemplateRepository パターンを踏襲した SaasTemplateRepository を MAS-055 で実装

運用・デプロイ手順

  1. npm run push:dev → サイドバー 🔧 開発・設定 → DDL 全更新 (Full)setupAllSchemas)実行 → 18_tmpl_hc_position 生成
  2. initConfigs 実行 → 01_sys_configMST_HC_TMPL 登録
  3. ユーザーが初期データ投入(ポジション例 7-10 件を手動入力 or MCP add_rows
  4. What-if サイドバー起動 → HC_ADD 選択 → dropdown が有効化されたことを確認
  5. npm run push:prod → 同手順

注意事項

  • ⚠️ failure_patterns #18-#20(命名造語禁止): システムキー MST_HC_TMPL・シート名 18_tmpl_hc_position・関数名 getHcTemplateList / getWhatIfDefaults・Repository 名 PositionTemplateRepository を記述前に必ず Read で実在確認 or 新設予定として明示
  • ⚠️ failure_patterns #3(DDL コード値 vs 実データ乖離): 想定雇用形態 プルダウンは 15_mst_dictionaryUI雇用形態 カテゴリを参照するが、カテゴリ実在確認が必要
  • ⚠️ シート番号衝突監査: 18_* が既存他案件で予約されていないことを grep -rn "18_" docs/ で確認済(MAS-046 投資カタログマスタは P2.5 で競合する可能性あり → MAS-044 を先行実装)。19_* は MAS-055 で確保
  • ⚠️ Constants.RPA_DEFAULTS / Constants.SHEET_DEFAULTS との住み分け: Constants.RPA_DEFAULTS002_constants.js L169 実在)は会社固有のデフォルト値({'税務署': '武生税務署', ...})。Constants.SHEET_DEFAULTS002_constants.js L73 実在)はシート行追加時の既定値。本案件は「ポジション単位の標準値」で粒度が異なる
  • ⚠️ Human-in-the-Loop: テンプレート選択は「一括入力」であり確定ではない。選択後もユーザーは各フィールドを手動修正可能。転記 (MAS-045) 時点で最終確定する設計
  • ⚠️ キャッシュ無効化: PositionTemplateRepository._cacheGAS 実行単位でリセットされるため通常問題ないが、サイドバー起動中にマスタ編集した場合は再起動が必要(仕様書にユーザー向け注意として明記)

エッジケース

#条件検知方法期待される挙動ログ出力
118_tmpl_hc_position シート未作成(DDL 未実行)Utils.getSheetByKey('MST_HC_TMPL', ...)nullgetHcTemplateList が空配列返却 → サイドバー dropdown に「-- 手動入力 --」のみ表示Utils.logInfo('getHcTemplateList', 'MST_HC_TMPL 未作成')
2マスタ空(ヘッダー行のみ)findAsMap(){} 返却空配列返却(dropdown 選択肢なし)ログ出力なし(正常系)
3管理 ID が空欄`id = String(dto['管理ID']'').trim()` が空
4同一管理 ID の重複map[id] 既存検知先着行採用Utils.persistLog('WARN', 'findAsMap', '重複ID: ' + id, '先着採用')
5有効フラグ FALSE`flag === falseString(flag).toUpperCase() === 'FALSE'`
6標準月額給与が負値Number(dto[...]) が負数そのまま格納(計算時にシミュレーター側でエラー or 警告)格納時はログなし、使用時に警告
7想定変動費比率が 1 超(例: 1.5)Number 値が 1 超バリデーション側でブロックする想定だが、DDL 未適用シートでは通る。シミュレーター側で Math.min(rate, 1) で防御Utils.persistLog('WARN', ...)
8サイドバー dropdown 選択後にマスタ編集 → 再選択キャッシュ未更新古い値が返却される可能性ユーザーに「再読込してください」の案内をヒントで表示
9getHcTemplateList() 呼び出し時にシート未作成Repository が空マップ返却空配列返却ログ出力なし
10テンプレート適用後にユーザーが手動で値を変更フォーム側の input / change イベントsource: 'TEMPLATE' ヒントを非表示化し source: 'MANUAL' に切替ログ出力なし(UX の一部)
11テンプレート名に絵文字・全角記号が含まれるプルダウン表示そのまま表示(サニタイズ不要)。失敗パターン #24 ラベル解決脆弱性の影響なし(値は ID で管理)ログ出力なし
12初期データ投入前に MAS-011 サイドバー起動dropdown 選択肢 0 件「-- 手動入力 --」のみ → MAS-011 polish の実績平均プリロードにフォールバックログ出力なし(正常系・MAS-044 の存在価値 = 実績ゼロ時の補完)

冪等性・再実行の設計

本案件は読み取り専用マスタ + UI 拡張。シート書き込みは setupAllSchemas 実行時のみ(既存 DDL と同じ冪等性)。サイドバー起動時の getHcTemplateList / getWhatIfDefaults は副作用なし(読み取りのみ)で何度呼んでも安全。

Human-in-the-Loop

テンプレート選択は一括入力の補助であり確定ではない。ユーザーは選択後にすべてのフィールドを自由に修正可能。MAS-045(予算転記)実行時点で最終確定する位置付け。

テスト要件(900_test/901_test_runner.js への追加)

テスト関数合格基準
test_PositionTemplateRepository_findAsMap_emptyMaster空マスタで {} 返却
test_PositionTemplateRepository_findAsMap_disabledFlag有効フラグ=FALSE 行が除外される
test_PositionTemplateRepository_findAsMap_duplicateId重複 ID で先着行採用
test_getWhatIfDefaults_withHcTemplatetemplateId 指定時に HC テンプレ値が優先される
test_getWhatIfDefaults_withoutTemplate_fallbacktemplateId 未指定時に実績平均プリロード動作(MAS-011 polish 後方互換)

実データ検証

実装前に MCP で以下を確認:

  1. 18_tmpl_hc_position シートの有無(DDL 実行前は存在しない)
  2. 22_bud_headcount の現行ヘッダー構成BUD_HC schema と一致確認)
  3. 15_mst_dictionaryUI雇用形態 カテゴリの値域(正社員 / 契約社員 / 業務委託 / 副業 / パート 等の定義確認)
  4. 01_sys_configMST_HC_TMPL キーが未登録であること
  5. MAS-011 サイドバーの現状 UI(HC_ADD ドライバー dropdown 挿入位置の確定)

関連ドキュメント

仕様書・ドキュメント関連箇所
dev_mas-011_what_if_simulation.md本案件の UI 拡張対象(MAS-011 MVP 完成済、polish で実績平均プリロード実装済)。MAS-044 は実績ゼロ時の補完として機能
dev_mas-055_saas_catalog_master.md本案件から切り出した姉妹案件。SaaS 側のテンプレートマスタを担当
dev_mas-045_whatif_to_budget_transfer.md後続案件。MAS-045 の予算転記行にテンプレ ID 列を追加する拡張余地あり
dev_mas-048_hiring_tco_bep_simulator.mdMAS-048 採用 TCO シミュレーターの入力源。PositionTemplateRepository を参照して想定年収・採用費等を取得
CLAUDE.mdコーディング規約(ヘッダー名ベース列参照・有効フラグスキップ・キャッシュ付きマスタ)
failure_patterns.md#18-#20 命名造語禁止 / #3 DDL コード値 vs 実データ乖離

人間が検討すべき事項

  1. テンプレートの粒度(単一値 or 給与レンジ): 現案は単一値。レンジ採用の場合は Low / Mid / High の 3 倍化。判断基準: 業務委託採用でレンジ提示が必要になった時点で拡張
  2. ポジション階層(Junior / Mid / Senior)を行 or 列で表現: 現案は(別管理 ID)。列での表現は Repository インターフェースを大きく変える必要があるため非推奨
  3. マスタ未登録時のフォールバック: 現状どおり手入力可(MAS-011 MVP 挙動を維持)。テンプレ選択は任意機能
  4. 22_bud_headcount の有効行から自動生成する機能: 現案は未実装。運用実績がたまってきた時点で「テンプレ候補提案」機能として追加検討(半年後)
  5. Constants.RPA_DEFAULTS との住み分け運用ルール: RPA_DEFAULTS は会社固有デフォルト(税務署名・振込口座名等)、本案件は「職種単位の標準値」。混同防止のため仕様書に明記
  6. テンプレート ID の採番規則: POS_001, POS_002 等のプレフィックス採番 or 自由文字列。現案は ID_PREFIX_MAP002_constants.js)に追記する前提だが、手動採番でも動作する
  7. 多言語対応: 現案は日本語のみ。SaaS 展開時に英語ポジション名を別列として持つか、管理 ID を英数字化するか
  8. テンプレート更新時のキャッシュ反映: サイドバー起動中の更新は再起動が必要。自動再読込は実装しない方針(パフォーマンス優先)
  9. MAS-046(投資カタログマスタ)との統合: MAS-046 は 8 大投資カテゴリーを管理、本案件はポジション単位で粒度が異なる。将来的に統合する場合は MAS-046 の上位マスタ化を検討
  10. MAS-055(SaaS カタログ)との運用統合: HC と SaaS のテンプレートを同じ UI から探索できるよう、MAS-044 / MAS-055 双方完成後に統合ダッシュボード(📋 全テンプレート一覧)を検討

実装プロンプト(Claude Code 用)

あなたは GAS 会計システム (bizlp-gas-accounting) のシニア開発者です。
案件 MAS-044「ポジション別 HC テンプレートマスタ」を以下の 4 Step で実装してください。

## 実行前タスク(必須・4 件)
1. `200_data/202_repository.js` の `AccountRepository`(L304-350)/ `PartnerRepository`(L356-406)を Read し Repository パターンを確認
2. `100_config/101_sys_config.js` の `schemas` 配列(L879 起点)と `existKeys` / `setVali` を Read し追加位置を確定
3. `400_domain/430_what_if_simulator.js` の `getWhatIfDefaults` 実装を Read し拡張箇所を特定
4. `templates/what_if_sidebar.html` を Read し HC_ADD ドライバーフォーム構造と dropdown 挿入位置を確定

## Step 1: DDL 追加(`101_sys_config.js`、推奨モデル: Haiku)

- `schemas` に `MST_HC_TMPL` エントリ追加(列定義・validations)
- `existKeys` に 1 行追加
- `setVali` で `想定雇用形態` → `UI雇用形態` のプルダウンを設定
- `npm run push:dev` → `setupAllSchemas` 実行 → `18_tmpl_hc_position` 生成確認
- `initConfigs` 実行 → `01_sys_config` に `MST_HC_TMPL` 登録確認

## Step 2: Repository 新設(`202_repository.js`、推奨モデル: Sonnet)

- 末尾に `PositionTemplateRepository` を追加
- `AccountRepository.findAsMap` パターン完全準拠(`_cache` + 有効フラグスキップ + 重複キー先着採用)
- JSDoc(`@returns {{ headers, dtos }}`)を付記

## Step 3: `430_what_if_simulator.js` の拡張(推奨モデル: Sonnet)

- `getWhatIfDefaults(driver, templateId)` に `templateId` 引数追加
- `templateId` 指定時は Repository から取得 → 実績平均プリロードを上書き
- 新規公開関数 `getHcTemplateList()`: テンプレ ID リストを返す
- SAAS_ADD 側は MAS-055 で別途実装のため、本案件では HC_ADD 分岐のみ

## Step 4: サイドバー UI 拡張(`what_if_sidebar.html`、推奨モデル: Sonnet)

- HC_ADD ドライバーフォーム冒頭に「テンプレート選択」dropdown 追加
- ページロード時に `google.script.run.getHcTemplateList()` で選択肢を動的挿入
- dropdown `onchange` で `getWhatIfDefaults('HC_ADD', templateId)` を呼び全フィールド更新
- `source: 'TEMPLATE'` のときは「📋 テンプレート「{{name}}」を適用」のヒント表示

## 制約
- `appsscript.json` の `oauthScopes` を変更しない(failure_patterns #26)
- 列番号ハードコード禁止(`headers.indexOf` で動的取得)
- 架空の関数名・シート名を使わない(failure_patterns #18-#20)
- MAS-011 MVP の既存動作を破壊しない(`templateId` 未指定時は実績平均プリロードにフォールバック)
- **SAAS_ADD 関連は本案件で実装しない**(MAS-055 で対応)

## 動作確認
1. サイドバー起動 → HC_ADD ドライバー選択 → dropdown に登録済ポジションが表示
2. テンプレート選択 → 全フィールドが自動入力される
3. 「📋 テンプレート「Sr エンジニア」を適用」ヒント表示
4. フィールドを手動変更 → ヒント非表示化
5. `01_sys_config` に `MST_HC_TMPL` が登録されている

推奨実行モデル

工程推奨モデル理由
Step 1: DDL 追加Claude Haiku 4.5既存パターンの単純追記、判断要素なし
Step 2: Repository 新設Claude Sonnet 4.6AccountRepository パターン流用だが JSDoc・エッジケース考慮が必要
Step 3: getWhatIfDefaults 拡張Claude Sonnet 4.6既存関数への非侵襲拡張(後方互換確保)の判断
Step 4: サイドバー UI 拡張Claude Sonnet 4.6HTML + JavaScript + google.script.run 連携の実装

変更履歴

日付変更内容
2026-04-23初版作成。MAS-011 MVP(PR #315 + #320 polish)の後継基盤として、ポジション別 / SaaS 別テンプレートマスタを DDL + Repository + サイドバー dropdown で実装する 4 Step 仕様。新規シート 18_tmpl_hc_position / 19_tmpl_saas_catalog、新規 Repository PositionTemplateRepository / SaasTemplateRepositorygetWhatIfDefaults の後方互換拡張、getTemplateList 公開。エッジケース 12 件・人間検討事項 10 件・推奨実行モデル 4 工程(Haiku×1 / Sonnet×3)を定義。後続 MAS-048(採用 TCO)・MAS-045(予算転記)が本案件の Repository を入力源として活用する
2026-04-23Gemini レビュー(PR #335)指摘を反映。🟡 Major 対応: getWhatIfDefaults の Step 3 実装例に SAAS_ADD 分岐を追記(failure_patterns #25 並列実装対称性漏れ回避)。🟢 Minor 対応: Constants.RPA_DEFAULTS との住み分け記述を明確化(RPA_DEFAULTS は L169 実在、SHEET_DEFAULTS は L73 実在、本案件マスタと 3 者の役割分離を明記)。Gemini の誤指摘Constants.RPA_DEFAULTS を「誤記」と判定 → 実在する)は訂正せず、記述明確化で混乱防止
2026-04-23SaaS カタログ部分を MAS-055(SaaS カタログマスタ)として独立起票し、本案件は HC テンプレ限定に縮小(main スペースの採用判断機能群への注力方針を反映)。ファイル名を dev_F-44_hc_saas_template_master.mddev_mas-044_hc_template_master.mdgit mv でリネーム(履歴保持)。削除対象: 19_tmpl_saas_catalog / MST_SAAS_TMPL / SaasTemplateRepository / 23_bud_subscription 補完言及 / SAAS_ADD dropdown 拡張。保持対象: 18_tmpl_hc_position / MST_HC_TMPL / PositionTemplateRepository / 22_bud_headcount 補完 / HC_ADD dropdown。Gemini レビュー指摘の SAAS_ADD 対称性論点は MAS-055 側に移譲