MAS-144: 役員社宅・出張日当・退職金 規程自動ジェネレーター(MAS-334 派生)
概要
| 項目 | 内容 |
|---|---|
| 案件 ID | MAS-144(旧採番候補 MAS-142 → 衝突回避で振直し・後述「ID 採番経緯」参照) |
| 案件名 | 役員社宅・出張日当・退職金 規程自動ジェネレーター(MAS-334 派生・Section F) |
| カテゴリ | 業務効率化・節税補助(規程テンプレート差込 + PDF 生成) |
| Phase | P1(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.js(runRegulationGenerator 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.js も var 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.mjs の ENGINES_TO_SYNC 配列に 400_domain/452_regulation_generator.js を追加すると:
- ファイルが
webapp_client/src/engines/にコピーされる - ビルド時に末尾に
if (typeof window !== 'undefined') window.RegulationGenerator = RegulationGenerator;が自動付与される 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):
| 項目 | SHATAKU | TRAVEL | RETIREMENT |
|---|---|---|---|
| 計算関数 | calcStatutoryRent | calcTravelAllowance | calcRetirementBenefit |
| テンプレートファイル | shataku.md | travel.md | retirement.md |
| React コンポーネント | ShatakuPanel.tsx | TravelPanel.tsx | RetirementPanel.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 PDF(HtmlService + 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_SYNC に 400_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 遵守 |
注意事項
規程テンプレートの法的妥当性は税理士・社労士監修必須: 本案件 spec が提示するテンプレートは国税庁通達準拠だが、最終署名前に税理士・社労士のレビューを受けることを 全画面に Disclaimer として常時表示(MAS-058 / MAS-061 / MAS-066 / MAS-067 と同パターン)。「本テンプレートは税理士・社労士の個別助言に代わるものではありません」を画面下部固定。
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 規程の並列実装対称性(failure_patterns #25 遵守): SHATAKU / TRAVEL / RETIREMENT は意図的に完全に同型な構造で実装する。関数名規則(
calcXxx動詞 + 目的語)/ テンプレートファイル名({type}.md単数形)/ React コンポーネント名({Type}Panel.tsx)/ 入力バリデーション粒度 / 法令根拠コメント形式を揃える。「片方の規程だけ別形式」は禁止(bank/cc 並列で過去に発生した片側欠損パターンの再発防止)。failure_patterns #18-#20 遵守(命名造語禁止): 関数名(
calcStatutoryRent/calcTravelAllowance/calcRetirementBenefit/renderTemplate/RegulationGenerator)は既存命名規則と整合。「StatutoryRent」「TravelAllowance」「RetirementBenefit」は税務会計の業界標準英語であり新語ではない(国税庁英訳ガイドにも記載)。実装前に Read で400_domain/配下に同名関数が存在しないことを裏取り(452 番が空きであることはls 400_domain/で確認済・450/451 既存)。failure_patterns #26 遵守(oauthScopes 部分宣言禁止):
appsscript.jsonは方式 B(HTML to PDF)採用時は変更なし。方式 C(Google Docs API)を将来採用する場合、oauthScopesを追加する際は 完全列挙(既存スコープを GAS エディタ「プロジェクト設定 → OAuth スコープ」から抽出して全宣言)が必須。enabledAdvancedServicesで済むなら優先(GAS が自動付与)。spec v1 は方式 B でoauthScopes変更なしを推奨。failure_patterns #28 遵守(クライアント呼出関数の末尾
_禁止):runRegulationGeneratorはgoogle.script.run経由で呼ばれる public エンドポイントのため末尾_を付けない。内部ヘルパ(_loadRegulationTemplate_/_renderMarkdownToPdf_/_getOrCreateRegulationFolder_/_mergeFormDataWithCalc_/_isSmallHousing_/_getBaseAllowance_/_escapeForMarkdown_)には末尾_を付ける。failure_patterns #29 遵守(V8→Java Infinity null): 退職金計算で在任年数が長期(30 年以上)になる場合の数値オーバーフロー対策として、
runRegulationGeneratorの戻り値は_scrubInfinityForJSON_経由でNumber.MAX_SAFE_INTEGERに置換する(MAS-066 PR #402 で確立した汎用ヘルパを再利用・300_ui/302_spa_bridge.js末尾実装)。failure_patterns #33 遵守(SPA 副作用 import 漏れ):
webapp_client/scripts/sync-engines.mjsに400_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 でないことを確認。テンプレートバージョン管理(法改正時の差分管理):
F144_REGULATION_TEMPLATE_VERSION(default2026-04)でテンプレートのバージョンを管理する。法改正(例: 2026-10 の社宅家賃算定基準改正)時はtemplates/regulations/に新バージョンディレクトリ(例:templates/regulations/2026-10/)を作成し、F144_REGULATION_TEMPLATE_VERSIONを切替えれば過去版で生成された規程との差分管理が可能。顧客通知メカニズムは spec v1 範囲外(人間検討事項 #2 で議論)。業種別カスタマイズ(IT / コンサル / 製造業の差異):
F144_REGULATION_INDUSTRY_DEFAULT(defaultIT)で初期値を切替。例: 出張日当の妥当額は IT/コンサルは内勤中心で日帰り 5,000 円が一般的、製造業は工場巡回が多く 6,000 円も妥当。spec v1 では IT 業種のみ実装、業種別差し替えキーが欠損した場合は default(IT)にフォールバック(エッジケース #8)。株主総会議事録セットの扱い: 役員退職金は株主総会決議が必須。本案件は退職金規程の PDF 出力までを範囲とし、株主総会議事録テンプレートは spec v1 範囲外(人間検討事項 #6 で議論)。MAS-066 注意事項 #2 と整合。
租税回避行為(法人税法 132 条)警告: 過大な役員退職金(功績倍率 5.0 超等)は同族会社の行為計算否認規定に該当しうる。
calcRetirementBenefitでcontributionFactor > 3.5の場合は警告表示(MAS-066 注意事項 #12 と同パターン・MAS-061 v1.1 ガードレールと整合)。PDF タイムアウト対策: GAS 6 分制限内で完走するため、3 規程同時生成は禁止し1 規程ずつ順次実行を default とする。テンプレート差込 + Markdown→HTML→PDF は通常 5-15 秒で完了(人間検討事項 #7)。タイムアウト時は
try/catchで部分結果を Drive に保存 + ユーザーに再実行を促す UI(エッジケース #11)。国税庁算式の小規模住宅判定境界: 木造 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 < 1 | benefit = 0 + reason 返却(spec 既定: 1 年未満は支給対象外) | INFO |
| 8 | テンプレート差込変数欠損({{companyName}} に対応する変数なし) | renderTemplate で variables[key] === undefined | エラー「テンプレート変数欠損: {key}」で throw | ERROR |
| 9 | テンプレートファイル文字化け(UTF-8 以外で保存された) | _loadRegulationTemplate_ 読込時に Unicode 検証 | エラー「テンプレートファイルが UTF-8 で保存されていません」 | ERROR |
| 10 | 業種別カスタマイズキー欠損(未対応業種を指定) | F144_REGULATION_INDUSTRY_DEFAULT の default 値で fallback | default(IT)で続行 + WARN ログ | WARN |
| 11 | PDF 生成タイムアウト(GAS 6 分制限超過) | try/catch で Utilities.computeHmacSha256Signature 等のスタックトレース捕捉 | 部分結果を Drive に保存 + UI で再実行ボタン表示 | ERROR |
| 12 | 退職金: 功績倍率 3.5 超(租税回避リスク域) | contributionFactor > 3.5 | 警告「税務否認リスク高(法人税法 132 条)」赤枠表示 + 続行可 | WARN |
| 13 | テンプレートバージョン不整合(F144_REGULATION_TEMPLATE_VERSION が templates/regulations/ のサブディレクトリと不一致) | 起動時バリデーション | エラー「テンプレートバージョン {version} が見つかりません」+ default に fallback | ERROR |
| 14 | Drive 保存先フォルダ未作成 + 作成権限なし | _getOrCreateRegulationFolder_ で DriveApp.createFolder が throw | エラー「Drive 書込権限がありません。Drive スコープを確認してください」 | ERROR |
実データ検証
1. 国税庁算式の数値整合(F144-01〜F144-04)
実装完了後に以下を 901_test_runner.js で自動検証し、±1 円以内で一致を合格基準とする:
| シナリオ | 床面積 | 構造 | 建物課税標準 | 土地課税標準 | 期待法定家賃(月額) |
|---|---|---|---|---|---|
| 小規模住宅(木造) | 80m² | wooden | 8,000,000 円 | 12,000,000 円 | 約 42,727 円 |
| 小規模住宅(木造以外) | 90m² | concrete | 12,000,000 円 | 18,000,000 円 | 約 64,909 円 |
| それ以外(豪華判定除く・木造) | 200m² | wooden | 20,000,000 円 | 30,000,000 円 | 約 350,000 円 |
| 境界値(木造 132m²) | 132m² | wooden | 15,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.0 | 3,000 万円 |
| 専務 | 80 万 | 8 年 | 2.5 | 1,600 万円 |
| 取締役 | 60 万 | 5 年 | 2.0 | 600 万円 |
| 在任 0.5 年(境界) | 100 万 | 0.5 年 | 3.0 | 0 円(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.md | A10 退職金規程の現在価値計算と整合(将来 PR で連携) |
| MAS-066 配当ミックス | dev_mas-066_dividend_mix_optimizer.md v1.2 | 純粋関数 + IIFE 名前空間パターン + sync-engines.mjs + 副作用 import の前例 |
| MAS-057 Solo-CEO Cockpit | dev_mas-057_solo_ceo_cockpit.md v2.0 | React コンポーネント並列配置パターン(webapp_client/src/cockpit/)の前例 |
| failure_patterns | failure_patterns.md #18-#33 | 命名造語禁止 / 並列実装対称性 / oauthScopes / V8 Infinity / 副作用 import 漏れ |
| CLAUDE.md | CLAUDE.md | コーディング規約・GAS ファイル番号体系(450/451 既存・452 空き) |
| dev_spec_prompt_template | dev_spec_prompt_template.md v1.9 | 14 セクション仕様書テンプレート |
人間が検討すべき事項
テンプレートの法的妥当性レビュー(最優先): 税理士・社労士による初版テンプレート監修(推定費用 5-10 万円スポット)。bizlp 顧問税理士 + 社労士の選定、レビュー範囲(3 規程全部 / 高リスク部分のみ)、レビュー後の改訂サイクル(年次 vs 法改正時のみ)を確定。監修なしの spec v1 は社内ドラフト用途に限定し、外部公開・商用化には監修必須。
テンプレートバージョン管理 + 顧客通知メカニズム: 法改正時(例: 2026-10 の社宅家賃算定基準改正・出張日当の社会通念上限見直し等)にテンプレートを更新した際の過去版で生成済み顧客への通知方式を確定。(a) Email 通知 / (b) ダッシュボード上の更新バナー / (c) 顧客に再生成を強制(再ダウンロード義務)/ (d) 監視のみで通知しない。spec v1 は (b) ダッシュボードバナー方式を default 推奨。
PDF 生成ライブラリの最終選定: 方式 B(GAS HTML to PDF)/ A(jsPDF)/ C(Google Docs API)の中から最終選定。spec v1 は方式 B 推奨だが、デザイン要件(印影フィールドの位置精度等)が上がる場合は方式 C への切替検討。方式 C 採用時は failure_patterns #26(oauthScopes)対策を慎重に。
業種別テンプレート拡張範囲:
F144_REGULATION_INDUSTRY_DEFAULTの default はIT。(a) どの業種を v1 で対応するか(IT のみ / IT + コンサル / 製造業も含む)、(b) 差分の粒度(出張日当の妥当額のみ / 規程文言全文の差替え)、(c) 業種マスタの管理場所(テンプレート内 if 文 / 別シートmst_industry_template)を確定。社宅家賃算定の入力 UX: 国税庁算式は固定資産税課税標準が必須だが、ユーザーが「課税標準」を即座に取得できないケースが多い(市区町村役所の固定資産課税台帳閲覧 or 課税明細書から確認)。(a) 入力支援として近隣相場比較表を提供 / (b) 課税標準が取得できない場合の暫定値の扱い(家賃の 30% 等の業界慣行値)/ (c) 取得方法のヘルプリンク埋込を確定。
株主総会議事録テンプレートの扱い: 役員退職金は株主総会決議が必須だが、本案件 spec v1 は退職金規程の PDF 出力までを範囲とする。議事録テンプレートを v1.1 で追加するか / 別案件として切出すかを確定(後者の場合は MAS-145+ で起票)。
3 規程の同時起動時の Drive 保存先衝突防止: ユーザーが 3 規程を連続生成した場合のファイル名衝突対策。(a)
_{type}_{date}.pdfで同日上書き許可 / (b)_{type}_{date}_{HHmmss}.pdfで時刻付与 / (c) ユーザーにダイアログで上書き確認を確定。spec v1 は (b) 時刻付与を推奨。印影 + 代表者氏名の入力方式: 規程末尾の「代表取締役 {{ceoName}}」と印影画像の差込方式。(a) ceoName のみテキスト差込(印影は手動押印)/ (b) 印影画像を Drive にアップロード → PDF に埋込 / (c) 電子署名(クラウドサイン等)連携。spec v1 は (a) テキスト差込のみ推奨(電子署名連携は MAS-145+ で別案件)。
生成済み規程の改版管理: 同じ会社の規程を再生成した時の旧版の扱い。(a) 旧版を上書き削除 / (b) 旧版を
regulations/archive/に移動 / (c) 旧版を残したまま新版併存。監査証跡として (b) または (c) 推奨だが、Drive 容量を考慮して spec v1 は (b) アーカイブ方式を default 推奨。商用化時のサブスクモデル設計: 「テンプレート無料配布 + 自動生成 + クラウド保管 = サブスク」のアップセル契機をどう実装するか。(a) 単発生成は無料 / 過去 N 件以上は有料 / (b) テンプレート監修バージョンは有料 / (c) 業種別カスタマイズは有料 のいずれを v1 では実装しないが、将来商用化判断のためにユーザー利用ログ(生成回数 / 規程種別 / バージョン)を
99_perf_log等にトラッキングするかを確定。テンプレート文言の AI 生成併用可否: spec v1 は LLM 不要の静的テンプレート差込方式を default とするが、将来「業種特化文言の AI 生成(Vertex AI Gemini)」を追加するか。MAS-216(Vertex AI 移行)と整合する場合の起動条件・コスト試算を別案件で議論。
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.6 | spec で計算式が確定済・MAS-066 449 のパターン適用 |
| Step 3(SPA bridge 追記) | Claude Sonnet 4.6 | 既存 _scrubInfinityForJSON_ パターン踏襲 + Drive API 呼出 |
| Step 4(React コンポーネント) | Claude Sonnet 4.6 | 3 Panel の対称性チェックが必要(cockpit パターン適用) |
| Step 5(sync + Dashboard 改修) | Claude Haiku 4.5 | パターン踏襲・spec で挿入位置確定済 |
| Step 6(単体テスト追加) | Claude Haiku 4.5 | spec のエッジケース 14 件を機械的に実装 |
変更履歴
| 日付 | バージョン | 変更内容 |
|---|---|---|
| 2026-04-30 | v0.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 規程対称実装のため通常より長め)。