型付き辺: 出 1 / 入 0
ADR-0012: RPA 層と仕訳エンジンの冪等性モデルの使い分け
- Status: Accepted (旧形式「## ステータス: 採用済み」より転記)
- Mode: Standard (内容から推定・旧 README 一覧より移設)
- Kruchten Type: Property
- Scope: product
- Implementation Status: Done (RPA / 仕訳エンジン冪等性モデル実装済)
Kruchten Type は ADR-0031 (2026-05-13) で遡及追加。分類根拠は ADR-0031 §決定セクションおよび docs/adr/README.md の Kruchten 3 分類ガイドを参照。 Status / Mode / Scope は 2026-06-11 に遡及追加 (ADR-0031 corrigendum パターン)。出典: Status = 旧形式「## ステータス」節の機械転記 / Mode = 旧 README §既存 ADR 一覧の推定値 (git 履歴) / Scope = ADR-0049 4 層分類の遡及付与 (PR レビューで確定)。
ステータス: 採用済み
コンテキスト
GAS の実行は 6 分制限があり、タイムアウト後のリトライが発生しうる。「再実行しても安全か(冪等か)」はレイヤーごとに異なる要件がある。一方で、すべてを冪等にすることはビジネスロジック的に不正確になる場合がある(例: 同じ請求を 2 回生成してしまう)。
決定
レイヤーごとに異なる冪等性モデルを採用する。
| レイヤー | モデル | 実装 |
|---|---|---|
RPA 層 (401_rpa_hc 等) | 1 回限定実行(Human-in-the-Loop 確認で誤二重実行を防止) | generateAllRpaInvoices() は UI 確認ダイアログを挟む |
仕訳エンジン (410_subledger_engine.js) | 冪等・再実行安全(ID チェックで二重発行防止) | generateTrnId_() / generateStlId_() で既存 ID を検出したらスキップ |
マイグレーション (800_ops/) | 冪等必須(既に存在したらスキップ) | 各スクリプトに「存在確認 → スキップ」ロジック必須 |
データマート (6xx_datamart_*.js) | 完全冪等(何度実行しても同じ結果) | 出力シートを毎回 clear して再構築 |
理由
- RPA 層は「承認済 INV を発行する」という副作用を持つため、誤って 2 回実行すると二重請求が発生する。Human-in-the-Loop での確認が必須
- 仕訳エンジンは GAS タイムアウト後のリトライを想定し、TRN_ID/STL_ID が既に存在する場合はスキップする設計で冪等性を保証
- データマートは「財務諸表の再計算」という性質上、冪等であることが自然
- ADR-0002 で定義した「イベントドリブン vs バッチ」の分離と対応している
結果・影響
- ポジティブ: 「この関数は何度実行していいか」がレイヤーから判断できる
- ポジティブ: GAS タイムアウト後のリカバリー手順がレイヤーによって明確に異なる(RPA層は手動確認、仕訳エンジンはそのまま再実行可)
- ネガティブ: 冪等性モデルの違いを知らないエンジニアが、RPA 層を「もう 1 回実行してもいい」と誤解するリスクがある → CLAUDE.md に規約として明記
Confirmation (準拠確認 / Fitness Function)
本セクションは ADR-0036 (Accepted 2026-05-14) で遡及追加された。ADR-0031 パターン (業界標準準拠メタデータ後付け = 誤字修正範疇) に準拠する遡及で本文の意思決定内容は不変。
- 検証手段: N/A — 要マッピング更新 (ADR-0036 遡及時点で未定義、月次レビューで確定)
- 実行頻度: —
- 違反時の対応: —