概要

項目内容
案件 IDMAS-144(旧採番候補 MAS-142 → 衝突回避で振直し・後述「ID 採番経緯」参照)
案件名役員社宅・出張日当・退職金 規程自動ジェネレーター(MAS-334 派生・Section F)
カテゴリ業務効率化・節税補助(規程テンプレート差込 + PDF 生成)
PhaseP1(Gemini 3 Pro Preview Deep Think 精緻化で確定・Claude 暫定合成版から維持)
優先度★★(MAS-067 のクイックウィン・節税アクション A2/A3/A10 の実行手段)
所要時間約 3 週間(週 10h 前提・テンプレート起草 1 週 + GAS/UI 1 週 + PDF 生成 + テスト 1 週)
対象ファイル(新規)400_domain/452_regulation_generator.js(純粋関数・テンプレート差込・約 200 行)/ templates/regulations/{shataku.md, travel.md, retirement.md}(規程テンプレート SSoT・3 ファイル)/ webapp_client/src/regulation/{ShatakuPanel.tsx, TravelPanel.tsx, RetirementPanel.tsx, RegulationApp.tsx, calc.ts}(React コンポーネント・約 300 行)
対象ファイル(変更)300_ui/302_spa_bridge.jsrunRegulationGenerator API + bootstrap キー追加)/ webapp_client/scripts/sync-engines.mjs(sync 対象に 452 追加)/ webapp_client/src/multiyear/StageDashboard.tsx(🟢 達成時に「📄 規程ダウンロード」ボタン追加)
新規シートなし(PDF は Drive へ出力・既存 Env.receiptFolderId() 配下のサブフォルダ regulations/ を使用)
新規 03_sys_params キーF144_REGULATION_TEMPLATE_VERSION(default 2026-04・テンプレートバージョン)/ F144_REGULATION_PDF_FOLDER_NAME(default regulations・出力先サブフォルダ名)/ F144_REGULATION_INDUSTRY_DEFAULT(default IT・業種別カスタマイズの初期値)
前提案件MAS-067 v1(✅ Phase B-3 完了 2026-04-30 PR #426・ステージ準備度ダッシュボードの 🟢 信号機が起動トリガー)
後続連携MAS-141 共済シミュレーター(A10 退職金規程の現在価値計算と統合)/ MAS-067 Phase B-4(規程ダウンロードボタンを sticky bar に常設)/ 将来案件(業種別テンプレート拡張・税理士監修バージョン管理 SaaS 化)
吸収・再定義対象なし(MAS-067 ダッシュボード信号機 + MAS-141 退職金算式 + MAS-144 規程文書 PDF 出力でスコープ完全分離)

ID 採番経緯(failure_patterns #31 適用)

当初 Gemini Deep Think は本案件を「MAS-142」として提案したが、grep -nE '\| MAS-14[0-9]' docs/_internal/TODO_future.md で確認した結果、MAS-142 は workType 列 DDL 追加(MAS-043 関連)として確定使用済であった(todo_master_tables L113・P2 Phase)。同様に MAS-143 はフリーランス新法対応(Domain + Data + Ops 層横断)として確定使用済(同 L67・L166)。sub 側ワークスペースで git fetch origin main 後の TODO_future.md 重複チェック手順(failure_patterns #31)を実施し、次空き番号 MAS-144 に振直した(2026-04-27・PR #390)。

目的

MAS-067 マルチイヤー計画ワークスペース v1.2 の 5 軸ステージ準備度ダッシュボード(PR #426・Phase B-3 完了)で、節税アクション A2 役員社宅 / A3 出張日当 / A10 退職金制度設計 が🟢 (実行可能)に到達した時点で、ユーザーが「実際に規程を整備する」段階に到達する。しかし規程の文書化(社宅管理規程・旅費交通費規程・役員退職金規程)はテンプレート探索 → 法定要件チェック → カスタマイズ → 印影 → 株主総会議事録セットで通常 3-5 万円 + 1-2 週間が必要となり、「ダッシュボードで判断 → 実行が止まる」病 の主要原因となる。

本案件は「入力 → 国税庁通達準拠の PDF 規程ドラフト 1 分以内出力」を実現することで MAS-067 を分析ツールから自動化プラットフォームへ進化させる。LLM を使わない静的テンプレート差込方式により、再現性 + 監査性 + コスト 0 円で運用可能。

齋藤 Baseline(一人法人・年商 1,800 万)+ 採用拡張(Jr 入社 D-180)両方で恩恵あり。商用化時のアップセル契機(規程テンプレート無料配布 + 自動生成 + クラウド保管 = サブスク)にもなる海外 FP&A SaaS でも空白領域。

現在のコード

本案件は新規実装。既存実装はない。MAS-066/MAS-067 で確立した以下のパターンを再利用:

純粋関数 + IIFE 名前空間パターン(MAS-066 449 / MAS-067 451 と並列対称)

// 既存パターン(MAS-066 449_dividend_mix_optimizer.js 参照)
var DividendMixOptimizer = (function () {
  function calcDividendTax(input) { /* ... */ }
  return { calcDividendTax: calcDividendTax };
})();
// window 露出は sync-engines.mjs が末尾に自動付与

本案件 452_regulation_generator.jsvar RegulationGenerator = (function () { ... })() 形式で実装。

React コンポーネント並列配置パターン(cockpit/ multiyear/ と並列)

既存ディレクトリ内容本案件で並列新設
webapp_client/src/cockpit/MAS-057 Solo-CEO Cockpit(CompensationDropdowns / calc.ts 等)
webapp_client/src/multiyear/MAS-067 マルチイヤー(StageDashboard / GuardrailPanel / SectionGPanel / calc.ts)
webapp_client/src/regulation/(新設)MAS-144 規程ジェネレーター(ShatakuPanel / TravelPanel / RetirementPanel / RegulationApp / calc.ts)

sync-engines.mjs での自動 window 露出パターン(MAS-066 PR #402 で確立)

webapp_client/scripts/sync-engines.mjsENGINES_TO_SYNC 配列に 400_domain/452_regulation_generator.js を追加すると:

  1. ファイルが webapp_client/src/engines/ にコピーされる
  2. ビルド時に末尾に if (typeof window !== 'undefined') window.RegulationGenerator = RegulationGenerator; が自動付与される
  3. webapp_client/src/regulation-main.tsx で副作用 import を必ず追加(failure_patterns #33・MAS-066 で漏れ事例あり)

MAS-067 ステージ準備度ダッシュボード信号機(呼出元)

webapp_client/src/multiyear/StageDashboard.tsx の A2/A3/A10 セルが🟢 になった時に「📄 規程ダウンロード」ボタンを表示し、本案件の RegulationApp を別ビュー(?view=regulation_spa&type=shataku|travel|retirement)として開く。

修正方針

3 規程(SHATAKU 社宅 / TRAVEL 出張日当 / RETIREMENT 退職金)を完全に独立かつ対称に実装する(failure_patterns #25 並列実装対称性遵守)。各規程の構造・関数命名・テンプレート構成・React コンポーネント構成は意図的に同型に揃える。

Step 1: テンプレート SSoT の起草(templates/regulations/)

新規ディレクトリ templates/regulations/ を作成し、3 つの Markdown テンプレートを配置:

templates/regulations/
├── shataku.md      ← 社宅管理規程(国税庁通達 9-2-9 / 36-15 準拠)
├── travel.md       ← 旅費交通費規程(所基通 9-3 + 法基通 9-7-6 準拠)
└── retirement.md   ← 役員退職金規程(法基通 9-2-32 + 功績倍率法準拠)

差込変数記法: Mustache 互換の {{variableName}} を採用(jsPDF 連携時の HTML エスケープリスクが低い)。

テンプレート骨子(shataku.md 抜粋):

# 社宅管理規程

第 1 条(目的)
本規程は、{{companyName}}(以下「会社」という)の役員及び使用人に対し、
社宅を貸与する場合の取扱いについて定めることを目的とする。

第 3 条(家賃の決定)
社宅の貸与を受ける役員は、所得税法基本通達 36-15 に基づき算定された
法定家賃相当額(月額 {{statutoryRent}} 円)を会社に支払うものとする。
- 当該住宅は **{{housingType}}**(小規模住宅 / それ以外)に該当する。
- 算定根拠: 固定資産税課税標準額 {{landTaxBase}} 円 + 建物 {{buildingTaxBase}} 円。

附則
本規程は {{effectiveDate}} より施行する。
{{companyName}}
代表取締役 {{ceoName}}

国税庁算式(小規模住宅判定): 木造家屋 132m² 以下 / 木造以外 99m² 以下を「小規模住宅」とする(所基通 36-41)。法定家賃計算式は計算後、RegulationGenerator.calcStatutoryRent で返却。

Step 2: 純粋関数エンジン 400_domain/452_regulation_generator.js の実装

// 400_domain/452_regulation_generator.js(純粋関数 + IIFE 名前空間・約 200 行)

var RegulationGenerator = (function () {

  /** 社宅: 法定家賃の計算(所基通 36-15 / 36-40 / 36-41) */
  function calcStatutoryRent(input) {
    // input: { housingType, landTaxBase, buildingTaxBase, floorArea, structureType }
    var isSmall = _isSmallHousing_(input.floorArea, input.structureType);
    if (isSmall) {
      // 小規模住宅: ① 建物固定資産税課税標準 × 0.2%
      //         + ② 12 円 × (床面積㎡ / 3.3)
      //         + ③ 土地固定資産税課税標準 × 0.22%
      var rent = input.buildingTaxBase * 0.002
               + 12 * (input.floorArea / 3.3)
               + input.landTaxBase * 0.0022;
      return { statutoryRent: Math.ceil(rent), housingType: '小規模住宅' };
    }
    // それ以外(豪華社宅は別判定・spec 範囲外):
    // ① 建物固定資産税課税標準 × 12% (木造) / 10% (木造以外)
    // ② 土地固定資産税課税標準 × 6%
    // ③ (① + ②) × 1/12 が年額 → 月額に換算
    var rate = (input.structureType === 'wooden') ? 0.12 : 0.10;
    var annual = input.buildingTaxBase * rate + input.landTaxBase * 0.06;
    return { statutoryRent: Math.ceil(annual / 12), housingType: 'それ以外' };
  }

  /** 出張日当: 役員 vs 従業員の妥当額算定(旅費規程の社会通念上妥当な範囲) */
  function calcTravelAllowance(input) {
    // input: { role, distanceKm, isOvernight, region }
    // 役員: 日帰り 5,000 円 / 国内宿泊 8,000 円 / 海外 15,000 円(社会通念上の上限)
    // 従業員: 役員の 70% 程度を default(業種により調整)
    var base = _getBaseAllowance_(input.role, input.isOvernight, input.region);
    var coefficient = (input.role === 'officer') ? 1.0 : 0.7;
    return { dailyAllowance: Math.round(base * coefficient), role: input.role };
  }

  /** 退職金: 功績倍率法による役員退職金の計算(法基通 9-2-32-3) */
  function calcRetirementBenefit(input) {
    // input: { finalMonthlyComp, tenureYears, contributionFactor }
    // 退職金 = 最終月額報酬 × 在任年数 × 功績倍率(社長 3.0 / 専務 2.5 / 取締役 2.0 が一般的)
    if (input.tenureYears < 1) {
      return { benefit: 0, reason: '在任年数 1 年未満は支給対象外(spec 既定)' };
    }
    var factor = input.contributionFactor || 3.0; // default: 社長
    var benefit = input.finalMonthlyComp * input.tenureYears * factor;
    return {
      benefit: Math.round(benefit),
      formula: '最終月額報酬 × 在任年数 × 功績倍率',
      contributionFactor: factor,
    };
  }

  /** テンプレート差込(Mustache 互換・LLM 不要) */
  function renderTemplate(templateText, variables) {
    return templateText.replace(/\{\{(\w+)\}\}/g, function (match, key) {
      if (variables[key] === undefined || variables[key] === null) {
        throw new Error('テンプレート変数欠損: ' + key); // エッジケース #8
      }
      return _escapeForMarkdown_(String(variables[key]));
    });
  }

  return {
    calcStatutoryRent: calcStatutoryRent,
    calcTravelAllowance: calcTravelAllowance,
    calcRetirementBenefit: calcRetirementBenefit,
    renderTemplate: renderTemplate,
  };
})();

3 規程の対称性チェックリスト(failure_patterns #25):

項目SHATAKUTRAVELRETIREMENT
計算関数calcStatutoryRentcalcTravelAllowancecalcRetirementBenefit
テンプレートファイルshataku.mdtravel.mdretirement.md
React コンポーネントShatakuPanel.tsxTravelPanel.tsxRetirementPanel.tsx
入力バリデーション床面積 > 0 / 課税標準 > 0距離 > 0 / region 必須在任年数 > 0 / 報酬 > 0
法令根拠所基通 36-15/36-40/36-41所基通 9-3 + 法基通 9-7-6法基通 9-2-32 + 功績倍率法
03_sys_params キーF144_*(共通)F144_*(共通)F144_*(共通)

Step 3: PDF 生成戦略の選定(人間検討事項 #3 で確定)

3 候補の比較(実装スコープ外で確定不要・spec v1 では選定経緯のみ記録):

方式実装容易性デザイン自由度GAS 制約bizlp 既存使用
(A) jsPDF(クライアント側)★★★★★★★クライアント側で完結・GAS 制限なし未使用(外部 npm 追加必要・約 230KB)
(B) GAS HTML to PDFHtmlService + getAs('application/pdf')★★★★★GAS 6 分制限内・スコープ追加なし使用実績あり502_receipt_reader.js 等で類似 API 使用)
(C) Google Docs API(テンプレート Doc → 差込 → PDF エクスポート)★★★★★★★OAuth スコープ追加必要(failure_patterns #26 リスク)未使用

spec 推奨方式(B): GAS HTML to PDF(HtmlService.createTemplateFromFile().evaluate().getAs('application/pdf'))を default とし、新規 npm 依存・OAuth スコープ追加を回避。Markdown → HTML 変換は既存の marked パッケージ(cockpit ですでに使用中なら流用可・要 Read 確認)を使う。最終確定は人間検討事項 #3 で決定

Step 4: SPA bridge API 追加(300_ui/302_spa_bridge.js)

// 300_ui/302_spa_bridge.js への追加(既存 _scrubInfinityForJSON_ パターン踏襲)

function runRegulationGenerator(input) {
  // input: { type: 'shataku' | 'travel' | 'retirement', formData: {...} }
  var result;
  if (input.type === 'shataku') {
    result = RegulationGenerator.calcStatutoryRent(input.formData);
  } else if (input.type === 'travel') {
    result = RegulationGenerator.calcTravelAllowance(input.formData);
  } else if (input.type === 'retirement') {
    result = RegulationGenerator.calcRetirementBenefit(input.formData);
  } else {
    throw new Error('Unknown regulation type: ' + input.type);
  }
  // テンプレート読込 + 差込
  var templateText = _loadRegulationTemplate_(input.type);
  var variables = _mergeFormDataWithCalc_(input.formData, result);
  var rendered = RegulationGenerator.renderTemplate(templateText, variables);
  // PDF 生成(方式 B: HTML to PDF)+ Drive 保存
  var pdfBlob = _renderMarkdownToPdf_(rendered);
  var folder = _getOrCreateRegulationFolder_();
  var file = folder.createFile(pdfBlob.setName(input.type + '_' + new Date().toISOString().slice(0, 10) + '.pdf'));
  return _scrubInfinityForJSON_({
    pdfUrl: file.getUrl(),
    rendered: rendered,
    calc: result,
  });
}

Step 5: React コンポーネント webapp_client/src/regulation/ 新設(3 規程の対称配置)

webapp_client/src/regulation/
├── RegulationApp.tsx       ← ルーティング(type 別に Panel 切替)
├── ShatakuPanel.tsx        ← 社宅入力 UI(床面積 / 課税標準 / 構造)
├── TravelPanel.tsx         ← 出張日当入力 UI(役員/従業員 / 距離 / 国内/海外)
├── RetirementPanel.tsx     ← 退職金入力 UI(最終報酬 / 在任年数 / 功績倍率)
└── calc.ts                 ← クライアント側計算ヘルパ(GAS 同等の純粋関数)

入口エントリポイント: webapp_client/src/regulation-main.tsx(cockpit-main.tsx / multiyear-main.tsx と並列・副作用 import で window.RegulationGenerator を bundle に含める / failure_patterns #33 遵守)。

Step 6: MAS-067 ダッシュボード連携(StageDashboard.tsx 改修)

A2/A3/A10 セルが🟢 になった時に「📄 規程ダウンロード」ボタンを描画。クリックすると ?view=regulation_spa&type=shataku|travel|retirement を新規タブで開く。

影響範囲

対象種別変更内容リスク
400_domain/452_regulation_generator.js追加RegulationGenerator 名前空間(calcStatutoryRent / calcTravelAllowance / calcRetirementBenefit / renderTemplate + 内部ヘルパ・約 200 行)既存ロジックへの影響なし(純粋関数のみ)
templates/regulations/shataku.md追加社宅管理規程テンプレート(約 80 行)なし(新規ディレクトリ)
templates/regulations/travel.md追加旅費交通費規程テンプレート(約 70 行)なし
templates/regulations/retirement.md追加役員退職金規程テンプレート(約 90 行)なし
webapp_client/src/regulation/RegulationApp.tsx追加ルーティングコンポーネント(約 60 行)なし
webapp_client/src/regulation/ShatakuPanel.tsx追加社宅入力 UI(約 100 行)なし
webapp_client/src/regulation/TravelPanel.tsx追加出張日当入力 UI(約 90 行)なし
webapp_client/src/regulation/RetirementPanel.tsx追加退職金入力 UI(約 110 行)なし
webapp_client/src/regulation/calc.ts追加クライアント側計算ヘルパ(約 80 行)なし
webapp_client/src/regulation-main.tsx追加エントリポイント + 副作用 import(failure_patterns #33)なし
webapp_client/scripts/sync-engines.mjs変更ENGINES_TO_SYNC400_domain/452_regulation_generator.js 追加既存 sync に影響なし
300_ui/302_spa_bridge.js変更runRegulationGenerator 関数 + テンプレート読込ヘルパ + PDF 生成ヘルパ追加既存 SPA bridge に影響なし(新規関数のみ)
webapp_client/src/multiyear/StageDashboard.tsx変更A2/A3/A10 🟢 達成時に「📄 規程ダウンロード」ボタン描画MAS-067 v1.2 ダッシュボードへの軽微な追加
03_sys_params変更F144_* 3 キー追加default 動作・シード未実行でも動作
900_test/901_test_runner.js変更F144-01〜F144-12 単体テスト追加(3 規程の計算 + テンプレート差込 + エッジケース)既存テストへの影響なし
MAS-067 マルチイヤー連携拡張StageDashboard ボタン追加のみ(既存ロジック変更なし)MAS-067 v1.2 既存実装への影響なし
MAS-141 共済シミュレーター連携可能性A10 退職金規程と功績倍率の整合(spec v1 では呼出なし・将来 PR で連携)既存 MAS-141 ロジック変更不要
appsscript.json変更なし(方式 B 採用時)OAuth スコープ追加不要(HTML to PDF は既存スコープで動作)failure_patterns #26 遵守

注意事項

  1. 規程テンプレートの法的妥当性は税理士・社労士監修必須: 本案件 spec が提示するテンプレートは国税庁通達準拠だが、最終署名前に税理士・社労士のレビューを受けることを 全画面に Disclaimer として常時表示(MAS-058 / MAS-061 / MAS-066 / MAS-067 と同パターン)。「本テンプレートは税理士・社労士の個別助言に代わるものではありません」を画面下部固定。

  2. ID 採番衝突回避(failure_patterns #31): 当初 Gemini Deep Think は本案件を「MAS-142」として提案したが、MAS-142 は workType 列 DDL 追加(MAS-043 関連・P2)として確定使用済 / MAS-143 はフリーランス新法対応(層横断)として確定使用済。grep -nE '\| MAS-14[0-9]' docs/_internal/TODO_future.md で検証済。MAS-144 に振直し(2026-04-27・PR #390)。

  3. 3 規程の並列実装対称性(failure_patterns #25 遵守): SHATAKU / TRAVEL / RETIREMENT は意図的に完全に同型な構造で実装する。関数名規則(calcXxx 動詞 + 目的語)/ テンプレートファイル名({type}.md 単数形)/ React コンポーネント名({Type}Panel.tsx)/ 入力バリデーション粒度 / 法令根拠コメント形式を揃える。「片方の規程だけ別形式」は禁止(bank/cc 並列で過去に発生した片側欠損パターンの再発防止)。

  4. failure_patterns #18-#20 遵守(命名造語禁止): 関数名(calcStatutoryRent / calcTravelAllowance / calcRetirementBenefit / renderTemplate / RegulationGenerator)は既存命名規則と整合。「StatutoryRent」「TravelAllowance」「RetirementBenefit」は税務会計の業界標準英語であり新語ではない(国税庁英訳ガイドにも記載)。実装前に Read で 400_domain/ 配下に同名関数が存在しないことを裏取り(452 番が空きであることは ls 400_domain/ で確認済・450/451 既存)。

  5. failure_patterns #26 遵守(oauthScopes 部分宣言禁止): appsscript.json は方式 B(HTML to PDF)採用時は変更なし。方式 C(Google Docs API)を将来採用する場合、oauthScopes を追加する際は 完全列挙(既存スコープを GAS エディタ「プロジェクト設定 → OAuth スコープ」から抽出して全宣言)が必須。enabledAdvancedServices で済むなら優先(GAS が自動付与)。spec v1 は方式 B で oauthScopes 変更なしを推奨。

  6. failure_patterns #28 遵守(クライアント呼出関数の末尾 _ 禁止): runRegulationGeneratorgoogle.script.run 経由で呼ばれる public エンドポイントのため末尾 _ を付けない。内部ヘルパ(_loadRegulationTemplate_ / _renderMarkdownToPdf_ / _getOrCreateRegulationFolder_ / _mergeFormDataWithCalc_ / _isSmallHousing_ / _getBaseAllowance_ / _escapeForMarkdown_)には末尾 _ を付ける。

  7. failure_patterns #29 遵守(V8→Java Infinity null): 退職金計算で在任年数が長期(30 年以上)になる場合の数値オーバーフロー対策として、runRegulationGenerator の戻り値は _scrubInfinityForJSON_ 経由で Number.MAX_SAFE_INTEGER に置換する(MAS-066 PR #402 で確立した汎用ヘルパを再利用・300_ui/302_spa_bridge.js 末尾実装)。

  8. failure_patterns #33 遵守(SPA 副作用 import 漏れ): webapp_client/scripts/sync-engines.mjs400_domain/452_regulation_generator.js を追加するだけでは bundle に含まれない。webapp_client/src/regulation-main.tsx に必ず import './engines/452_regulation_generator.js' の副作用 import を追加。MAS-066 PR #402 で漏れて事後修正となった事例あり。動作確認時に console.log(window.RegulationGenerator) で undefined でないことを確認。

  9. テンプレートバージョン管理(法改正時の差分管理): F144_REGULATION_TEMPLATE_VERSION(default 2026-04)でテンプレートのバージョンを管理する。法改正(例: 2026-10 の社宅家賃算定基準改正)時は templates/regulations/ に新バージョンディレクトリ(例: templates/regulations/2026-10/)を作成し、F144_REGULATION_TEMPLATE_VERSION を切替えれば過去版で生成された規程との差分管理が可能。顧客通知メカニズムは spec v1 範囲外(人間検討事項 #2 で議論)。

  10. 業種別カスタマイズ(IT / コンサル / 製造業の差異): F144_REGULATION_INDUSTRY_DEFAULT(default IT)で初期値を切替。例: 出張日当の妥当額は IT/コンサルは内勤中心で日帰り 5,000 円が一般的、製造業は工場巡回が多く 6,000 円も妥当。spec v1 では IT 業種のみ実装、業種別差し替えキーが欠損した場合は default(IT)にフォールバック(エッジケース #8)。

  11. 株主総会議事録セットの扱い: 役員退職金は株主総会決議が必須。本案件は退職金規程の PDF 出力までを範囲とし、株主総会議事録テンプレートは spec v1 範囲外(人間検討事項 #6 で議論)。MAS-066 注意事項 #2 と整合。

  12. 租税回避行為(法人税法 132 条)警告: 過大な役員退職金(功績倍率 5.0 超等)は同族会社の行為計算否認規定に該当しうる。calcRetirementBenefitcontributionFactor > 3.5 の場合は警告表示(MAS-066 注意事項 #12 と同パターン・MAS-061 v1.1 ガードレールと整合)。

  13. PDF タイムアウト対策: GAS 6 分制限内で完走するため、3 規程同時生成は禁止し1 規程ずつ順次実行を default とする。テンプレート差込 + Markdown→HTML→PDF は通常 5-15 秒で完了(人間検討事項 #7)。タイムアウト時は try/catch で部分結果を Drive に保存 + ユーザーに再実行を促す UI(エッジケース #11)。

  14. 国税庁算式の小規模住宅判定境界: 木造 132m²、木造以外 99m² が境界。境界値ピッタリの場合は「以下」判定で小規模住宅扱い(所基通 36-41)。エッジケース #4 で単体テスト化。

エッジケース

実装時に必ず以下 14 件を単体テストでカバーする(F144-01〜F144-14)。

#条件検知方法期待される挙動ログ出力
1入力フィールドが空白(社宅: 床面積未入力 / 出張: 距離未入力 / 退職: 在任年数未入力)各 calc 関数の入口バリデーションエラー「{fieldName} は必須入力です」+ UI でハイライトERROR
2数値が負値(床面積 -10m² / 距離 -100km / 在任年数 -1 年)value < 0 チェックエラー「負値は入力できません」+ UI でハイライトERROR
3数値が範囲外(床面積 10,000m² / 月額報酬 1,000 万円超 / 在任年数 60 年超)value > sanityMax チェック警告「実務想定範囲外です。確認してください」+ 続行可WARN
4国税庁算式の小規模住宅判定境界(木造 132m² ピッタリ / 木造以外 99m² ピッタリ)_isSmallHousing_<= 判定境界値は小規模住宅扱い(所基通 36-41 準拠)INFO
5出張日当の役員 vs 従業員区別(role 未指定 / 不正値)input.role !== 'officer' && input.role !== 'employee'エラー「役員/従業員の区別を選択してください」ERROR
6出張日当: 海外 region で日帰り(往復 24h 超不可能)region === 'overseas' && !isOvernight警告「海外日帰りは想定外です。宿泊有を推奨」+ 続行可WARN
7退職金: 在任年数 0 年(ちょうど 0)tenureYears < 1benefit = 0 + reason 返却(spec 既定: 1 年未満は支給対象外)INFO
8テンプレート差込変数欠損({{companyName}} に対応する変数なし)renderTemplatevariables[key] === undefinedエラー「テンプレート変数欠損: {key}」で throwERROR
9テンプレートファイル文字化け(UTF-8 以外で保存された)_loadRegulationTemplate_ 読込時に Unicode 検証エラー「テンプレートファイルが UTF-8 で保存されていません」ERROR
10業種別カスタマイズキー欠損(未対応業種を指定)F144_REGULATION_INDUSTRY_DEFAULT の default 値で fallbackdefault(IT)で続行 + WARN ログWARN
11PDF 生成タイムアウト(GAS 6 分制限超過)try/catchUtilities.computeHmacSha256Signature 等のスタックトレース捕捉部分結果を Drive に保存 + UI で再実行ボタン表示ERROR
12退職金: 功績倍率 3.5 超(租税回避リスク域)contributionFactor > 3.5警告「税務否認リスク高(法人税法 132 条)」赤枠表示 + 続行可WARN
13テンプレートバージョン不整合(F144_REGULATION_TEMPLATE_VERSIONtemplates/regulations/ のサブディレクトリと不一致)起動時バリデーションエラー「テンプレートバージョン {version} が見つかりません」+ default に fallbackERROR
14Drive 保存先フォルダ未作成 + 作成権限なし_getOrCreateRegulationFolder_DriveApp.createFolder が throwエラー「Drive 書込権限がありません。Drive スコープを確認してください」ERROR

実データ検証

1. 国税庁算式の数値整合(F144-01〜F144-04)

実装完了後に以下を 901_test_runner.js で自動検証し、±1 円以内で一致を合格基準とする:

シナリオ床面積構造建物課税標準土地課税標準期待法定家賃(月額)
小規模住宅(木造)80m²wooden8,000,000 円12,000,000 円約 42,727 円
小規模住宅(木造以外)90m²concrete12,000,000 円18,000,000 円約 64,909 円
それ以外(豪華判定除く・木造)200m²wooden20,000,000 円30,000,000 円約 350,000 円
境界値(木造 132m²)132m²wooden15,000,000 円20,000,000 円小規模住宅扱い(所基通 36-41)

2. 出張日当の妥当額検証(F144-05〜F144-07)

役職距離宿泊地域期待日当
役員100kmなし国内5,000 円
役員500kmあり国内8,000 円
役員1,000kmあり海外15,000 円
従業員100kmなし国内3,500 円(役員の 70%)

3. 退職金計算の整合(F144-08〜F144-10)

役職最終月額報酬在任年数功績倍率期待退職金
社長100 万10 年3.03,000 万円
専務80 万8 年2.51,600 万円
取締役60 万5 年2.0600 万円
在任 0.5 年(境界)100 万0.5 年3.00 円(spec 既定)

4. テンプレート差込の動作検証(F144-11〜F144-12)

3 つのテンプレート(shataku.md / travel.md / retirement.md)に対し、全変数を埋めた完全入力1 変数だけ欠損の 2 ケースで renderTemplate を呼出:

  • 完全入力 → 期待される PDF 出力(手動目視で法令根拠条文の引用が正確かを確認)
  • 1 変数欠損 → エッジケース #8 のエラー throw

5. PDF 生成 + Drive 保存の E2E 検証(F144-13〜F144-14)

runRegulationGenerator を 3 規程それぞれで実行し、Drive の regulations/ サブフォルダに {type}_{date}.pdf ファイルが作成されていることを DriveApp.getFileById(file.getId()).getName() で確認。

6. 並行起動時の対称性検証

3 規程を同時に並列起動した場合(StageDashboard で 3 ボタン連続クリック)、各 PDF が独立に Drive に保存され、ファイル名衝突がないことを確認(_{type}_{date}_{rand}.pdf のようにランダム接尾辞を付けるかは人間検討事項 #7)。

関連ドキュメント

カテゴリドキュメント関係
MAS-067 マルチイヤー計画(最重要前提)dev_mas-067_multiyear_planning_workspace.md v1.2ステージ準備度ダッシュボード(5 軸モデル)の A2/A3/A10 信号機が🟢 達成時に本案件 UI を起動
MAS-334(親案件)MAS-334 Section F(PRD のセクション・Gemini 3 Pro Preview Deep Think 精緻化)本案件の親案件・派生経緯
MAS-141 共済シミュレーターdev_mas-141_tax_saving_simulator.mdA10 退職金規程の現在価値計算と整合(将来 PR で連携)
MAS-066 配当ミックスdev_mas-066_dividend_mix_optimizer.md v1.2純粋関数 + IIFE 名前空間パターン + sync-engines.mjs + 副作用 import の前例
MAS-057 Solo-CEO Cockpitdev_mas-057_solo_ceo_cockpit.md v2.0React コンポーネント並列配置パターン(webapp_client/src/cockpit/)の前例
failure_patternsfailure_patterns.md #18-#33命名造語禁止 / 並列実装対称性 / oauthScopes / V8 Infinity / 副作用 import 漏れ
CLAUDE.mdCLAUDE.mdコーディング規約・GAS ファイル番号体系(450/451 既存・452 空き)
dev_spec_prompt_templatedev_spec_prompt_template.md v1.914 セクション仕様書テンプレート

人間が検討すべき事項

  1. テンプレートの法的妥当性レビュー(最優先): 税理士・社労士による初版テンプレート監修(推定費用 5-10 万円スポット)。bizlp 顧問税理士 + 社労士の選定、レビュー範囲(3 規程全部 / 高リスク部分のみ)、レビュー後の改訂サイクル(年次 vs 法改正時のみ)を確定。監修なしの spec v1 は社内ドラフト用途に限定し、外部公開・商用化には監修必須

  2. テンプレートバージョン管理 + 顧客通知メカニズム: 法改正時(例: 2026-10 の社宅家賃算定基準改正・出張日当の社会通念上限見直し等)にテンプレートを更新した際の過去版で生成済み顧客への通知方式を確定。(a) Email 通知 / (b) ダッシュボード上の更新バナー / (c) 顧客に再生成を強制(再ダウンロード義務)/ (d) 監視のみで通知しない。spec v1 は (b) ダッシュボードバナー方式を default 推奨。

  3. PDF 生成ライブラリの最終選定: 方式 B(GAS HTML to PDF)/ A(jsPDF)/ C(Google Docs API)の中から最終選定。spec v1 は方式 B 推奨だが、デザイン要件(印影フィールドの位置精度等)が上がる場合は方式 C への切替検討。方式 C 採用時は failure_patterns #26(oauthScopes)対策を慎重に。

  4. 業種別テンプレート拡張範囲: F144_REGULATION_INDUSTRY_DEFAULT の default は IT(a) どの業種を v1 で対応するか(IT のみ / IT + コンサル / 製造業も含む)、(b) 差分の粒度(出張日当の妥当額のみ / 規程文言全文の差替え)、(c) 業種マスタの管理場所(テンプレート内 if 文 / 別シート mst_industry_template)を確定。

  5. 社宅家賃算定の入力 UX: 国税庁算式は固定資産税課税標準が必須だが、ユーザーが「課税標準」を即座に取得できないケースが多い(市区町村役所の固定資産課税台帳閲覧 or 課税明細書から確認)。(a) 入力支援として近隣相場比較表を提供 / (b) 課税標準が取得できない場合の暫定値の扱い(家賃の 30% 等の業界慣行値)/ (c) 取得方法のヘルプリンク埋込を確定。

  6. 株主総会議事録テンプレートの扱い: 役員退職金は株主総会決議が必須だが、本案件 spec v1 は退職金規程の PDF 出力までを範囲とする。議事録テンプレートを v1.1 で追加するか / 別案件として切出すかを確定(後者の場合は MAS-145+ で起票)。

  7. 3 規程の同時起動時の Drive 保存先衝突防止: ユーザーが 3 規程を連続生成した場合のファイル名衝突対策。(a) _{type}_{date}.pdf で同日上書き許可 / (b) _{type}_{date}_{HHmmss}.pdf で時刻付与 / (c) ユーザーにダイアログで上書き確認を確定。spec v1 は (b) 時刻付与を推奨。

  8. 印影 + 代表者氏名の入力方式: 規程末尾の「代表取締役 {{ceoName}}」と印影画像の差込方式。(a) ceoName のみテキスト差込(印影は手動押印)/ (b) 印影画像を Drive にアップロード → PDF に埋込 / (c) 電子署名(クラウドサイン等)連携。spec v1 は (a) テキスト差込のみ推奨(電子署名連携は MAS-145+ で別案件)。

  9. 生成済み規程の改版管理: 同じ会社の規程を再生成した時の旧版の扱い。(a) 旧版を上書き削除 / (b) 旧版を regulations/archive/ に移動 / (c) 旧版を残したまま新版併存。監査証跡として (b) または (c) 推奨だが、Drive 容量を考慮して spec v1 は (b) アーカイブ方式を default 推奨。

  10. 商用化時のサブスクモデル設計: 「テンプレート無料配布 + 自動生成 + クラウド保管 = サブスク」のアップセル契機をどう実装するか。(a) 単発生成は無料 / 過去 N 件以上は有料 / (b) テンプレート監修バージョンは有料 / (c) 業種別カスタマイズは有料 のいずれを v1 では実装しないが、将来商用化判断のためにユーザー利用ログ(生成回数 / 規程種別 / バージョン)を 99_perf_log 等にトラッキングするかを確定。

  11. テンプレート文言の AI 生成併用可否: spec v1 は LLM 不要の静的テンプレート差込方式を default とするが、将来「業種特化文言の AI 生成(Vertex AI Gemini)」を追加するか。MAS-216(Vertex AI 移行)と整合する場合の起動条件・コスト試算を別案件で議論。

  12. MAS-141(共済シミュレーター)連携の起動条件: A10 退職金規程の生成時に MAS-141 の現在価値計算 API を呼び出して「規程上の退職金額 vs 共済受取見込額」の比較表示を行うか。spec v1 は単独動作(MAS-141 連携なし)を default、v1.1 以降で連携を検討。

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

あなたは GAS 会計システム (bizlp-gas-accounting) のシニア開発者です。
案件 MAS-144「役員社宅・出張日当・退職金 規程自動ジェネレーター」を実装してください。
実装は 6 Step に分割し、3 規程(SHATAKU / TRAVEL / RETIREMENT)を完全に対称な構造で並列実装してください。

## 実行前タスク

1. `CLAUDE.md` を読み、ファイル番号体系(450/451 既存・452 が空きであること)と
   コーディング規約を把握する
2. `docs/_internal/failure_patterns.md` の #18-#33 を読み、
   命名造語禁止 / 並列実装対称性 / oauthScopes / V8 Infinity / 副作用 import 漏れの注意点を確認
3. `400_domain/449_dividend_mix_optimizer.js` を Read し、純粋関数 + IIFE 名前空間パターンの構造を把握
4. `webapp_client/scripts/sync-engines.mjs` を Read し、`ENGINES_TO_SYNC` 配列の追加方法を確認
5. `webapp_client/src/cockpit/` および `webapp_client/src/multiyear/` の React コンポーネント構成を Read し、
   並列配置パターンを把握
6. `300_ui/302_spa_bridge.js` の末尾 `_scrubInfinityForJSON_` 純粋ヘルパを Read で確認(MAS-066 PR #402 で実装)

## 修正対象ファイル

### 新規追加(11 ファイル)

- `400_domain/452_regulation_generator.js` のみ(GAS ドメインエンジン・約 200 行)
- `templates/regulations/shataku.md`(社宅管理規程テンプレート)
- `templates/regulations/travel.md`(旅費交通費規程テンプレート)
- `templates/regulations/retirement.md`(役員退職金規程テンプレート)
- `webapp_client/src/regulation/RegulationApp.tsx`(ルーティング)
- `webapp_client/src/regulation/ShatakuPanel.tsx`
- `webapp_client/src/regulation/TravelPanel.tsx`
- `webapp_client/src/regulation/RetirementPanel.tsx`
- `webapp_client/src/regulation/calc.ts`
- `webapp_client/src/regulation-main.tsx`(エントリポイント・副作用 import 必須)
- (任意)`8XX_migration_f144_regulation_seed.js`(F144_* キーシーダー)

### 変更(4 ファイル)

- `300_ui/302_spa_bridge.js` への追記(`runRegulationGenerator` + ヘルパ群)
- `webapp_client/scripts/sync-engines.mjs` の `ENGINES_TO_SYNC` 配列に 452 追加
- `webapp_client/src/multiyear/StageDashboard.tsx` に「📄 規程ダウンロード」ボタン
- `900_test/901_test_runner.js` に F144-01〜F144-14 単体テスト追加

## 実装内容

### Step 1: テンプレート SSoT の起草(templates/regulations/)

3 ファイルを Markdown で作成(Mustache 互換 `{{variable}}` 記法)。
- shataku.md: 国税庁通達 9-2-9 / 36-15 / 36-40 / 36-41 準拠
- travel.md: 所基通 9-3 + 法基通 9-7-6 準拠
- retirement.md: 法基通 9-2-32 + 功績倍率法準拠
- 各ファイル末尾に「{{companyName}} 代表取締役 {{ceoName}}」「附則: {{effectiveDate}} より施行」を含める

### Step 2: `400_domain/452_regulation_generator.js` 実装

`RegulationGenerator` 名前空間(IIFE)で以下 4 公開関数 + 内部ヘルパを実装:
- `calcStatutoryRent(input)`: 社宅法定家賃(小規模住宅判定 + 国税庁算式)
- `calcTravelAllowance(input)`: 出張日当(役員/従業員 × 国内/海外 × 日帰り/宿泊)
- `calcRetirementBenefit(input)`: 退職金(功績倍率法 + 在任年数 1 年未満は 0)
- `renderTemplate(templateText, variables)`: Mustache 互換差込 + 変数欠損で throw
- 内部ヘルパ(末尾 `_` 付き): `_isSmallHousing_` / `_getBaseAllowance_` / `_escapeForMarkdown_`

### Step 3: `300_ui/302_spa_bridge.js` への追記

`runRegulationGenerator(input)` を public 関数として実装(末尾 `_` 禁止)。
内部ヘルパ(末尾 `_` 付き)として:
- `_loadRegulationTemplate_(type)`: HtmlService.getResource 等でテンプレート読込
- `_renderMarkdownToPdf_(markdown)`: HTML to PDF 変換(方式 B・既存スコープで動作)
- `_getOrCreateRegulationFolder_()`: Drive サブフォルダ作成(`Env.receiptFolderId()` 配下)
- `_mergeFormDataWithCalc_(formData, calcResult)`: テンプレート変数のマージ

戻り値は **必ず `_scrubInfinityForJSON_` 経由**(failure_patterns #29 遵守)。

### Step 4: React コンポーネント新設

`webapp_client/src/regulation/` に 5 ファイル + `regulation-main.tsx` を新設。
- 3 Panel コンポーネントは**完全に対称な構造**(state 管理 / バリデーション / 送信処理)
- 各 Panel から `google.script.run.runRegulationGenerator(input)` を呼出
- 戻り値の `pdfUrl` を新規タブで開く
- **`regulation-main.tsx` で必ず `import './engines/452_regulation_generator.js'` の副作用 import を追加**(failure_patterns #33)

### Step 5: sync-engines.mjs + StageDashboard.tsx 改修

- `webapp_client/scripts/sync-engines.mjs` の `ENGINES_TO_SYNC` 配列に
  `'400_domain/452_regulation_generator.js'` を追加
- `webapp_client/src/multiyear/StageDashboard.tsx` の A2/A3/A10 セルに
  🟢 達成時のみ「📄 規程ダウンロード」ボタンを描画

### Step 6: 単体テスト追加(F144-01〜F144-14)

`900_test/901_test_runner.js` にエッジケース全 14 件 + 実データ検証 6 件のテスト追加。

## 制約

1. **3 規程の対称性厳守**(failure_patterns #25): SHATAKU / TRAVEL / RETIREMENT で
   関数命名 / テンプレートファイル名 / Panel コンポーネント名 / バリデーション粒度を完全に揃える。
   「片方だけ別形式」は禁止
2. **命名造語禁止**(failure_patterns #18-#20): 関数名・シート名・定数名は実在確認後のみ採用。
   jsPDF 等の外部ライブラリは spec v1 では採用しない(方式 B = GAS HTML to PDF を default)
3. **oauthScopes 部分宣言禁止**(failure_patterns #26): `appsscript.json` は変更しない(方式 B 採用時)
4. **末尾 `_` 規約**(failure_patterns #28): クライアント呼出関数(`runRegulationGenerator`)は
   末尾 `_` を付けない / 内部ヘルパには付ける
5. **V8 Infinity 対策**(failure_patterns #29): `runRegulationGenerator` の戻り値は
   必ず `_scrubInfinityForJSON_` 経由
6. **副作用 import 必須**(failure_patterns #33): `regulation-main.tsx` に
   `import './engines/452_regulation_generator.js'` を必ず追加
7. **既存コード変更禁止箇所**: MAS-067 v1.2 の StageDashboard.tsx 既存ロジック / MAS-066 449 ファイル / MAS-057 cockpit 既存実装は変更しない(追加のみ)
8. **税理士・社労士 Disclaimer 必須**: 全画面下部に「本テンプレートは税理士・社労士の個別助言に代わるものではありません」を固定表示

## エッジケース

spec の「エッジケース」セクション 14 件を全て単体テストでカバー。特に以下を重点:
- 国税庁算式の小規模住宅判定境界(木造 132m² / 木造以外 99m² ピッタリは小規模住宅扱い)
- 出張日当の役員 vs 従業員区別(role 未指定はエラー)
- 退職金の在任年数 0 年(benefit = 0 で reason 返却)
- テンプレート差込変数欠損(throw)
- 業種別差し替えキー欠損(default = IT に fallback)
- PDF 生成タイムアウト(部分結果保存 + 再実行 UI)

## 実データ検証

実データ検証セクションの 6 検証項目を全て `901_test_runner.js` で自動化:
1. 国税庁算式の数値整合(±1 円以内)
2. 出張日当の妥当額(4 ケース)
3. 退職金計算の整合(4 ケース・在任 0 年境界含む)
4. テンプレート差込(完全入力 + 欠損 1 ケース)
5. PDF 生成 + Drive 保存の E2E
6. 並行起動時のファイル名衝突防止(時刻接尾辞)

## 動作確認

1. `npm run push:dev` で開発用 GAS にデプロイ
2. dev で `setupAllSchemas` を実行(F144_* キーが `03_sys_params` に追加されるか確認)
3. MAS-067 マルチイヤーダッシュボード(`?view=multiyear_spa`)を開き、
   A2/A3/A10 セルが🟢 になっている年で「📄 規程ダウンロード」ボタンが表示されることを確認
4. 3 規程それぞれでボタンを押し、`?view=regulation_spa&type=...` 画面に遷移することを確認
5. 各 Panel で入力 → 「PDF 生成」ボタン → Drive `regulations/` フォルダに PDF が保存されることを確認
6. ブラウザコンソールで `console.log(window.RegulationGenerator)` が undefined でないことを確認(副作用 import 検証)
7. 単体テスト F144-01〜F144-14 を `901_test_runner.js` 経由で実行 → 全て PASS
8. dev 動作確認後、`npm run push:prod` で prod デプロイ

### 拡張思考の使用状況

| フェーズ | 拡張思考 | 備考 |
|---|:---:|---|
| Step 1(テンプレート起草)| あり | 国税庁通達条文の正確な引用が必要 |
| Step 2(GAS エンジン)| 一部 | 計算式は spec で確定済 |
| Step 3(SPA bridge)| 最小限 | 既存パターン踏襲(MAS-066 _scrubInfinityForJSON_ 流用)|
| Step 4(React)| 一部 | 3 Panel の対称性確認に使用 |
| Step 5(sync + Dashboard)| 最小限 | パターン踏襲 |
| Step 6(テスト)| 最小限 | spec の 14 + 6 ケースをそのまま実装 |

推奨実行モデル

工程推奨モデル理由
Step 1(テンプレート起草)Claude Opus 4.7 (1M context)国税庁通達条文(所基通 36-15/36-40/36-41 + 法基通 9-2-32)の正確な引用 + 3 規程の法的整合性が必要・税法理解が中核
Step 2(GAS エンジン実装)Claude Sonnet 4.6spec で計算式が確定済・MAS-066 449 のパターン適用
Step 3(SPA bridge 追記)Claude Sonnet 4.6既存 _scrubInfinityForJSON_ パターン踏襲 + Drive API 呼出
Step 4(React コンポーネント)Claude Sonnet 4.63 Panel の対称性チェックが必要(cockpit パターン適用)
Step 5(sync + Dashboard 改修)Claude Haiku 4.5パターン踏襲・spec で挿入位置確定済
Step 6(単体テスト追加)Claude Haiku 4.5spec のエッジケース 14 件を機械的に実装

変更履歴

日付バージョン変更内容
2026-04-30v0.1初版作成。MAS-334 Section F(Gemini 3 Pro Preview Deep Think 精緻化版)を仕様書化。3 規程(SHATAKU / TRAVEL / RETIREMENT)の並列対称実装(failure_patterns #25 遵守)+ LLM 不要の静的テンプレート差込 + GAS HTML to PDF(方式 B)を default 採用。ID 採番衝突回避経緯: 当初 Gemini Deep Think は「MAS-142」を提案したが、grep -nE '| MAS-14[0-9]' docs/_internal/TODO_future.md で MAS-142(workType DDL)/ MAS-143(フリーランス新法)が既使用済と確認 → 次空き番号 MAS-144 に振直し(failure_patterns #31 適用)。注意事項に #18-#20 / #25 / #26 / #28 / #29 / #31 / #33 のインライン引用を含める。エッジケース 14 件 + 実データ検証 6 件 + 人間検討事項 12 件で MAS-067 v1.2 並列起票推奨レベルの精緻度を確保

仕様書作成プロンプト

再現性・監査性・将来のプロンプト改善トレースのため、本仕様書の生成に投入したプロンプト全文を以下に記録する(dev_spec_prompt_template.md v1.6+ 必須項目)。

展開して表示(投入プロンプト全文)
あなたは GAS 会計システム (bizlp-gas-accounting) のシニア開発者兼仕様書ライターです。

## タスク

案件 ID **MAS-144**「役員社宅・出張日当・退職金 規程自動ジェネレーター(MAS-334 派生)」の開発仕様書を作成し、`/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-144_regulation_generator.md` に保存してください。

## 案件概要 (todo_master_tables.md L311)

- **Phase**: P1 / **★**: ★★ / **Layer**: 🧠 Domain / **業務領域**: 業務効率化・節税補助
- **MAS-334 Section F** (Gemini 3 Pro Preview Deep Think 精緻化で P1 確定・Claude 暫定合成版から維持)
- **MAS-067 v1 と並列起票推奨**
- **ID 採番経緯**: 当初 Gemini Deep Think は「MAS-142」を提案したが、既存 MAS-142 (workType DDL) と衝突 → sub 側で次空き番号 **MAS-144** に振直し (failure_patterns #31 適用・MAS-142/MAS-143 既使用確認済)
- **機能**: MAS-067 ダッシュボードで「役員社宅 (A2) / 出張日当 (A3) / 退職金 (A10)」が🟢 実行可能になった時点で、ユーザーが事業規模・家賃額・出張距離・役員勤続年数等を入力 → 国税庁通達準拠の **(a) 社宅管理規程・(b) 旅費交通費規程・(c) 役員退職金規程** を PDF 自動生成
- **実装方式**: LLM 不要・静的テンプレート (HTML or Markdown) + 入力差込 (Mustache or テンプレートリテラル) + PDF 出力 (jsPDF or GAS HTML to PDF)
- **新規実装想定**:
  - `400_domain/452_regulation_generator.js` (純粋関数・テンプレート差込・約 200 行)
  - `webapp_client/src/regulation/{SHATAKU,TRAVEL,RETIREMENT}.tsx` (3 React コンポーネント・約 300 行)
  - テンプレートは `templates/regulations/{shataku.md, travel.md, retirement.md}` で SSoT 管理
- **連携**: MAS-067 のステージ準備度ダッシュボード信号機が🟢になった時に「📄 規程ダウンロード」ボタンを表示 (MAS-067 cockpit から本案件 UI に遷移)

## 検討事項

1. 規程テンプレートの法的妥当性 (税理士 / 社労士監修必要)
2. 雛形バージョン管理 (法改正時の差分管理 + 顧客通知)
3. PDF 生成ライブラリ選定 (jsPDF / GAS HTML to PDF / Google Docs API)
4. 規程内容の業種別カスタマイズ (IT / コンサル / 製造業で差異)
5. 社宅家賃の国税庁算式 (小規模住宅 vs それ以外) の入力 UX

## 必読ファイル (調査して固有名詞を確定)

実装の前に以下のファイルを `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-#31 (#31 ID 採番衝突対応含む)
3. `/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-067_multiyear_planning_workspace.md` — 連携先の MAS-067 v1.2 仕様書 (5 軸モデル・ステージ準備度ダッシュボード参照)
4. `/Users/ts_kuma/projects/my-gas-project-doc/CLAUDE.md` — コーディング規約・GAS ファイル番号体系
5. `/Users/ts_kuma/projects/my-gas-project-doc/400_domain/` 配下のファイル一覧 (Bash `ls 400_domain/` で 452 番が空き ID か確認)
6. `/Users/ts_kuma/projects/my-gas-project-doc/webapp_client/src/` の React コンポーネント構成 (cockpit/ 配下を参考に regulation/ ディレクトリ新設パターン)
7. 参考: `/Users/ts_kuma/projects/my-gas-project-doc/docs/dev/dev_mas-066_dividend_mix_optimizer.md` — 直近の MAS-066 仕様書 (PDF 出力連携の参考になり得る)

## 仕様書フォーマット要件 (14 セクション)

`dev_spec_prompt_template.md` 準拠。以下を必ず含める:
- フロントマター (id: MAS-144, aliases は MAS-334 派生として明記、type: Story, status: Draft)
- 概要テーブル (案件 ID / カテゴリ / Phase / 優先度 / 所要時間 / 前提案件 [MAS-067 v1] / 後続案件)
- 3 規程の独立性と並列性: SHATAKU / TRAVEL / RETIREMENT を独立コンポーネントとして対称実装
- failure_patterns 参照
  - **#31 ID 採番衝突**: MAS-142 提案 → MAS-144 振直しの経緯を「変更履歴」と「注意事項」両方に明記
  - **#25 並列実装対称性**: 3 規程 (SHATAKU/TRAVEL/RETIREMENT) で対称な構造・関数命名・テンプレート構成を維持
  - **#26 oauthScopes**: PDF 生成のため Drive / Docs API 利用時に oauthScopes を部分宣言しない
  - **#18-#20 命名造語**: jsPDF 等の外部ライブラリ呼出時の関数名は実在確認
- エッジケース表 (12 件以上)
  - 入力空白 / 数値範囲外 / 国税庁算式の小規模住宅判定境界 / 出張日当の役員 vs 従業員区別 / 退職金の勤続年数 0 年 / テンプレート文字化け / PDF 生成タイムアウト / 業種別差し替えキー欠損 等
- 人間が検討すべき事項 (10 件以上)
- 推奨実行モデル (Step ごとに Haiku/Sonnet/Opus)
- 関連ドキュメント (MAS-067 / MAS-334 / MAS-141 共済シミュレーター との関連)
- 開発プロンプト (Claude Code 向け実装指示・3 規程の対称実装を強調)
- 変更履歴 (v0.1 初版 + ID 採番衝突回避経緯)
- 末尾に `<details>` プロンプト全文記録

## 必ず守る規約

- ファイル番号: `400_domain/452_*.js` (450/451 が既存・452 空きを Bash `ls 400_domain/` で確認)
- 名前空間: `RegulationGenerator` 等の新設名前空間 (純粋関数中心・SubledgerService と同型)
- テンプレート SSoT: `templates/regulations/` 配下に Markdown ファイルとして配置
- React コンポーネントは `webapp_client/src/regulation/` 配下 (cockpit/ や multiyear/ と並列配置)
- failure_patterns #18-#20 — 推測で関数名を作らず Read で実在確認 (jsPDF API 等は信頼できる公式ドキュメント引用なら可・ただし bizlp 既存コードには未使用を明記)

## アウトプット

ファイル: `docs/dev/dev_mas-144_regulation_generator.md`

Step 分割:
1. Step 2-1: 骨格 Write
2. Step 2-2: 概要〜注意事項 (3 規程の対称実装方針強調)
3. Step 2-3a: エッジケース 12 件以上 + 人間検討事項 10 件以上
4. Step 2-3b: 開発プロンプト + 変更履歴
5. Step 2-4: `<details>` プロンプト全文記録

最終確認として `wc -l` で行数を測定し報告してください (期待: 400-550 行・3 規程対称実装のため通常より長め)。