バグ修正・障害対応トラッキング
本ドキュメントは、バグ修正・障害再発防止・コード品質改善の案件を管理するものです。 追加開発案件(TODO_future.md)のエンハンスメントとは分離して管理します。
修正状況サマリー(2026-06-15 時点)
| ステータス | 件数 |
|---|---|
| ✅ 修正完了 | 29 |
| 未着手 | 5 |
| 合計 | 34 |
1. 修正完了(29件)
優先度の定義
| 優先度 | 定義 |
|---|---|
| 🔴 Critical | データ破損・二重登録・本番障害。即時対応必須 |
| 🟡 High | 機能不全・実障害の再発リスク。数日以内に対応 |
| 🟢 Medium | コード品質・保守性の問題。計画的に対応 |
修正済みバグ一覧
| ID | バグ名 | 優先度 | 発見日 | 修正日 | 概要 | 根本原因 | 修正内容 | 回帰テスト |
|---|---|---|---|---|---|---|---|---|
| MAS-286 | isDuplicate_ 冪等性バグ | 🔴 | 2026-04-13 | 2026-04-14 | FALSEにしたINVをRPA再実行で再作成してしまう。データ二重登録のリスク | isDuplicate_ が有効フラグ=FALSEの行を重複チェック対象外としていたため、無効化済みINVと同条件の新規INVが重複生成された | isDuplicate_ のチェック対象を有効フラグに関わらず全行に変更 | ✅ MAS-098(冪等性テスト自動化)で回帰テスト追加済み |
| MAS-287 | clasp push ファイル混入 | 🔴 | 2026-04-14 | 2026-04-15 | clasp push 時にルート直下の非GASファイル(CLAUDE.md等)がGASプロジェクトにデプロイされてしまう実障害が発生 | .claspignore に除外ルールが不足していた | .claspignore にルート直下の非GASファイル除外ルールを追加 | ✅ MAS-195(pre-pushフック)で恒久対策済み |
| MAS-288 | prod→devデータ同期時のフィルター罠 | 🟡 | 2026-04-15 | 2026-04-15 | 手動コピペでprod→devデータを同期する際、スプレッドシートのフィルターが有効だと非表示行がコピーされず、データ欠落が発生 | スプレッドシートの仕様(フィルター表示中のコピーは表示行のみ対象)を意識せずに手動コピペしていた | GAS の getValues() で全行取得→dev に書き込む同期関数(803_sync_tool.js)を実装し、手動コピペを排除 | ✅ MAS-199(同期ツール)のテスト実施済み |
| MAS-289 | 立替精算INVの期ずれバグ | 🟡 | 2026-04-13 | 2026-04-15 | 立替精算INVで発生日と決済日_計画が同月の場合、期ずれ処理が意図しない動作をする | 発生日=支払期限のバリデーションが未実装だった | 発生日と決済日_計画が同月の場合にエラー/警告を表示するバリデーションを追加 | — |
| MAS-290 | CFタブの計画データ混在 | 🟡 | 2026-04-13 | 2026-04-15 | 81/81b CFタブに計画データが混在し、実績タブとしての一貫性がなかった(61 P/L・71 B/Sは実績専用化済み) | isActualOnly パターンがCFタブに未適用だった | 61 P/L・71 B/Sと同じ isActualOnly パターンをCFタブに適用 | ✅ マート更新テスト(CF)で検証済み |
| MAS-291 | 未使用変数の残存 | 🟢 | 2026-04-13 | 2026-04-14 | TypeScript診断で検出された未使用変数(settleYm, appType, iRefType, hasNewDraft等)が残存 | コードリファクタリング時の削除漏れ | 検出済み未使用変数を一括削除 | — |
| MAS-292 | 78タブ全社合計と92タブ営業利益の不整合 | 🟡 | 2026-04-13 | 2026-04-15 | 78_pj_pl の全社合計と92_fs_pl の営業利益が一致しないケースがあった | 共通費配賦後のPJ合計と全社P/Lの集計ロジックの差異 | 不一致の原因を自動検証し、マート更新時に警告表示するチェック機能を追加 | ✅ MAS-085(整合性チェック)としてテストランナーに組込済み |
| MAS-293 | RPA冪等性テストの欠如 | 🟢 | 2026-04-13 | 2026-04-15 | MAS-286(冪等性バグ)の回帰テストが未整備で、再発リスクがあった | テストランナーに冪等性検証のテストケースがなかった | 「同一条件で2回実行→2回目は0件」の冪等性テストをテストランナーに追加 | ✅ テストランナー(901_test_runner.js)に組込済み |
| MAS-294 | Repository/Contracts層のテスト不足 | 🟢 | 2026-04-13 | 2026-04-15 | 新基盤層(003_contracts.js / 202_repository.js)の品質担保テストがなかった | テスト追加が後回しになっていた | toDto/toRow 変換正確性、findAll 戻り値構造、キャッシュ動作のテストを追加 | ✅ テストランナーに組込済み |
| MAS-295 | テストT4-03: MAS-024 BEPセクションが未登録科目として検出 | 🟢 | 2026-04-16 | 2026-04-16 | MAS-024で追加した「📊損益分岐点分析(BEP)」セクションの行ラベルがテストのSKIP_PATTERNSに未登録のため、未登録科目として検出される | テストのSKIP_PATTERNSにBEPセクション用パターンが未追加だった | SKIP_PATTERNSに「📊」「損益分岐点」「BEP」等を追加 | — |
| MAS-296 | テストT4-21: MAS-020 YoY差異列追加による最終月列のずれ | 🟢 | 2026-04-16 | 2026-04-16 | MAS-020で追加したYoY差異列(△YYYY-MM)がP/L末尾に配置されるため、最終月列の取得がずれる | テストが ytdHeaders.length - 1 で最終列を固定参照していた | △列と空白列をスキップして最後の実データ列を特定するよう修正 | — |
| MAS-298 | Action A acc is not defined 未定義変数エラー | 🔴 | 2026-04-30 | 2026-04-30 | 「財務諸表マート再構築」実行時に acc is not defined で停止し、マート更新が完了しない実障害 | processInvoiceApprovals の auditLog 引数で未定義変数 acc を使用していた (リネーム漏れ・スコープ外参照) | auditLog 引数の acc を row[invIdx['科目名']] に置換 (mas/400_domain/410_subledger_engine.js・PR #460・commit 7104460) | — (PR #460 反映後の手動再実行で正常動作確認済・回帰テスト追加候補) |
| MAS-299 | Action A & cc_importer findTrueLastRow_ is not defined 架空関数エラー | 🔴 | 2026-04-30 | 2026-04-30 | 「仕訳A (INV承認 → JNL生成)」実行時 + cc_importer 実行時に findTrueLastRow_ is not defined で停止 | 架空関数名 findTrueLastRow_ を呼出していた (mas/200_data/202_repository.js の正規関数名は findLastRow_)・failure_patterns #18-#20 (命名造語禁止) の事例 | findLastRow_ にリネーム (mas/400_domain/410_subledger_engine.js + mas/500_import/501_cc_importer.js・PR #460・commit fdc0b3a) | — (PR #460 反映後の手動再実行で正常動作確認済) |
| MAS-300 | 73_bs_plan 計画 B/S が実績 71_bs と大きく乖離 (cash plug 過小) | 🟡 | 2026-04-30 | 2026-05-01 | 73_bs_plan の現預金が実績 71_bs と乖離 (2026-02 で約 -605K)。計画 B/S で資金見通しが過度に悲観的になり、経営判断ミスリードリスク | 計画 B/S が「全 INV 即決済前提」のため未払系負債が積み上がらず、現預金がマイナス側に振れる構造的バグ。期ずれが計画 B/S に蓄積されない | 3 段階のロジック改善 (commits d748ed5 → 3aaa04e → c21c3dc → 1f04ef5) で案 A 改 2 に確定。mas/600_report/601_datamart_ingest.js の dmIngestPlanData_ で INV の 決済日_実績 列を期ずれ解消月の判定起点とする: (a) 決済日_実績 記入済 → 実績 PHASE 2 と同月で期ずれ解消 (sStr = settleActStr) / (b) 決済日_実績 空 + 決済日_計画 ≤ 当月 → 未消込のまま残す (sStr = '9999-12') / (c) それ以外 → 決済日_計画 をそのまま使用。残乖離 ±30K: 地代家賃前払 INV 表示差で許容 (cash plug 効果は同値) | ✅ failure_patterns #34 (計画 B/S が実績と乖離・cash plug 過小) として教訓化済・PR #460 commit 1f04ef5 で確定 |
| MAS-301 | 銀行 CSV 合算マッチング ±1 円厳密で口座振替割引等の少額差により外れる | 🟡 | 2026-05-01 | 2026-05-01 | 社会保険料 (厚年金 + 健保) の口座振替で銀行引落額 149,950 円 と STL 合計 150,950 円 (74,575 + 76,375) が ちょうど 1,000 円 ずれて合算候補に提案されない。社会保険料の引落仕訳が UNMATCHED 扱いで人手対応必要 (口座振替割引と推測) | 既存 Pass 2 (合算マッチ) の許容誤差が ±1 円ハードコードのため、実運用で発生する口座振替割引・端数調整等の少額差を救済できない | findComboGroup_(candidates, txAmt, txType, txYm, tolerance) に許容誤差を引数化リファクタ + Pass 2.5 (ソフト合算) 追加: 既存 Pass 2 (±1 円厳密) で不成立時に ±max(1000, txAmt × 1%) で再試行・ヒット時のラベル 合算候補(差額+1,000円) 等で差額明示・背景色は黄色 #FFF2CC (Pass 2 厳密合算 = 緑 #D5E8D4 と視覚区別)・確認FLG=false で書込 → 必ず人間確認を要求 (mas/500_import/502_bank_importer.js・PR #465・commit fb7b68c) | — (PR #465 反映後の手動確認で社会保険料合算が候補に上がることを確認・回帰テスト追加候補) |
| MAS-302 | applyBankSettlement のフィルター silent-fail (決済日_実績等が書き込まれない) | 🔴 | 2026-05-01 | 2026-05-01 | 33_wrk_bank に「決済ステータス = 未処理」フィルターを設定した状態で消込実行すると、消込後に 33タブを見ても 決済日_実績 列が空のまま。Action B (自動仕訳生成) が起動条件 (33タブの「消込済 かつ 自動仕訳JNL_ID あり」判定) を満たさず止まる二次被害あり | setValue('消込済') で対象行が即時フィルター非表示化 → 後続の 決済日_実績 / 消込手段 / 取込ハッシュ setValue が silent-fail する Google Sheets API の挙動 (1 つ目の setValue でフィルター対象列が変わると Sheets が即フィルター再評価して行が hide され、後続 setValue が無効化される) | セル別 setValue 4 回 → 1 行 setValues 1 回に集約・API call 間にフィルター再評価が挟まる隙を排除する原子書込化 (mas/500_import/502_bank_importer.js・PR #465・commit c069b63) | ✅ failure_patterns #35 (フィルター適用中の連続 setValue が silent-fail) として教訓化済・PR #465 commit c069b63 で確定 |
| MAS-361 | 73_bs_plan 売掛金が当月決済予定 INV で 1 ヶ月余分に残る (sStr 境界条件 ≤当月 → <当月) | 🟡 | 2026-05-07 | 2026-05-07 | dmIngestPlanData_ の sStr 判定条件 (b) 決済日_計画 ≤ 当月 が当月を含むため、決済日_計画 = 当月 かつ 決済日_実績 未入力の売上 INV が sStr = '9999-12' となり 73_bs_plan の売掛金が入金予定月で解消されず 1 ヶ月余分に残る | ≤ が当月も含む境界条件ミス。未消込扱いにすべきなのは「過去月」のみ | 601_datamart_ingest.js の dmIngestPlanData_ sStr 判定 (b) を ≤ 当月 → < 当月 に修正 (PR #509・commit d32cfa1) | — (PR #509 反映後の 73_bs_plan 目視確認で 2026-05 売掛金が解消済を確認) |
| DRP-375 | chat UI 復元セッション + フォーム空で停止トグルが無反応 (required バリデーション遮断) | 🟡 | 2026-06-04 | 2026-06-04 | リロードで復元したセッション表示中、フォームが空のまま停止トグルを押すとボタンが form の required バリデーションに遮断されクリックが無反応になる。PR #1375 の mocked-route e2e が導入当日に発見 | 停止トグル button が form 内の submit 扱いで、フォーム必須項目が空だとバリデーションが先に発火しイベントが実行されない | button に formNoValidate を付与してバリデーションを迂回 (PR #1376) | ✅ mocked-route e2e (drp/test/e2e/ui/, CI ui-e2e job) でカバー |
| DRP-374 | Decision Pipeline queue consumer が message を pickup せず session が queued のまま stall (EC-3 watchdog が idle 300s で error 終端・審査未実施) | 🟡 | 2026-06-04 | 2026-06-04 | draft docs-incremental-build の審査 run (session 906aafc2) が watchdog-timeout で終端し審査が一切実行されなかった。telemetry 実測で enqueue (06:22:23) と先行 run 開始 (06:22:24) が 1 秒差 — 実効直列 consumer (max_batch_size=1) の正常な順番待ち (8.3 分) だったと確定 | ①QUEUED_STUCK_MS=300s (起点=enqueue) が queue 順番待ちと取りこぼしを区別できず誤検知 ②error 終端後に配達された message を R4 終端ガードが ack-skip → 永久不実行 (遅延=死の合せ技) | 二段構え (PR #1398): ①QUEUED_STUCK_MS 5分→30分 (worst-case 1 run 占有 25分 をカバー) ②R4 ガードに回復路 — 16 分) が Queues consumer の invocation 時間上限を超え、complete 書込後・ack 前に worker が kill → at-least-once 再配信が running 状態を素通りして全 gate を 3 周再実行。通過 result 2 件が差し戻し result に上書きされた | invocation 上限超過 kill と at-least-once 再配信の組合せに対し、再配信を検出して skip するガードが無かった | error.gate='queue_pickup' (consumer 未着手が確定している誤検知) は ack-skip せず実行再開 (isRecoverableQueuedTimeout())。完走 telemetry が INSERT OR REPLACE で偽 error 行を上書き。max_concurrency 引き上げは numbering 重複採番 (DRP-377) 再導入リスクで見送り | ✅ session_watchdog.test.ts 18 件 (回復判定 5 件追加) + 実機検証 2026-06-04: 並走 3 run で後発 2 run が queued 370s 超 (旧閾値なら死) を通過し完走、watchdog-timeout 新規 0 |
| DRP-371 | chat UI 経路の draftId=null で ADR-0109 goalpost loop-breaker が構造的に無効 (無言スキップ) | 🟡 | 2026-06-04 | 2026-06-04 | chat UI 起点の全審査で telemetry の draft_id が NULL → loop-breaker ガード (state.draftId &&) で無言スキップ。2 連続 CV 却下 × 盲点全入替でも escalate されず plain 差し戻しのまま (draft crossval-systemic-fix で実発生)。escalate KPI も常時 0 で無効化が観測に乗らない | 真因はサーバ側 — chat UI は元から draft_id を送信していた (active-draft-id hidden input) が、/chat/start handler が body の draft_id を受領しておらず DO state の draftId が常に欠落 | PR #1402: ①サーバで draft_id 受領 (DRAFT_ID_RE 検証) → DO state 伝播 + triggerSource:'web-ui' 明示 ②loop-breaker スキップ時の crossval_loopbreaker_skipped 警告ログ ③UI 防御 — 紐付け可視チップ + ✕ 解除 + localStorage 永続化 (リロードで履歴連続性が切れる逆 stale も解消) | ✅ mocked-route e2e 3 本 (draft_binding.spec.ts: draft_id 送信/解除→未送信/リロード永続化)。実機: 次回 chat run の telemetry で draft_id/trigger_source 記録を確認 |
| DRP-379 | chat UI 開始/停止トグルの誤連打で開始直後の審査が即キャンセルされる | 🟡 | 2026-06-04 | 2026-06-04 | ADR-0101 の単一トグルボタン (開始⇄停止) は、ダブルクリックすると 1 打目で審査開始 → ボタンが即「審査をキャンセル」にトグル → 2 打目がそれを踏んで開始した審査が即キャンセルされる。実運用で発生 (代表取締役観測・変更指示) | 開始と停止を同一ボタンに同居させた UI 設計 (ADR-0101 §決定「単一トグルボタン」)。連打への防御がトグル先のアクション実行になっていた | PR #1411 (ADR-0101 corrigendum 方式・決定本文不変): #cancel-btn (type=button) を新設し協調キャンセル/予約/復元停止を移設。審査中は #start-btn を disabled「審査中…」(二重 submit 防止・409 排他は従来どおり主防御)。副次効果: type=button 化で DRP-375 の formNoValidate 回避策が構造的に不要となり撤去 | ✅ mocked-route e2e を分離ボタン状態機械で全面更新 + 誤連打回帰テスト新設 (ダブルクリック → cancel 0 件・start 1 回)。e2e 11/11 pass |
| COM-373 | docs サイトの glossary ホバー説明が表セル内で見切れる (tooltip overflow clip) | 🟢 | 2026-06-04 | 2026-06-04 | .glossary-term ツールチップ (absolute) が .table-wrapper { overflow-x:auto } に clip され、表内の用語では説明の後半が読めなかった | absolute 配置の tooltip は祖先 scroll コンテナに clip される CSS の構造的制約 | PR #1415: hover/focus 時に JS が viewport 座標を測り fixed 配置 (.gt-fixed / .gt-fixed-below) へ動的切替して overflow から脱出。PC のみ (モバイルは既存 @media fixed が担当)。上端近くは下向き表示・左端 clamp | ✅ docs-build 615 頁 + Playwright 実 hover で fixed/可視/座標追従を確認 (throwaway)。最終目視は Pages preview |
| DRP-377 | Decision Pipeline numbering gate が open 中の ADR PR を考慮せず採番 → 並行起案で ADR 番号二重発行 | 🟢 | 2026-06-04 | 2026-06-04 | main の docs/adr/ 既存ファイルだけを見て採番するため、未マージ ADR PR が open 中の別 draft 通過で同一番号が二重発行 (ADR-0110 実発生 → 0111 リナンバー #1391) | 採番ロジックが open PR の予約番号を見ていなかった | PR #1416: GET /pulls?state=open → /pulls/:n/files から docs/adr/NNNN- を予約番号として抽出し main 最大と合算。fail-open (スキャン失敗は警告ログ + 従来動作、adr-lint duplicate が防壁の二段構え)。純粋関数 numbering_pure.ts に切り出し | ✅ numbering_pure.test.ts 8 件 (実シナリオ: main 0109 + open PR 0110 予約 → 0111 採番)。実機: 次回 numbering 実行時の numbering_pr_reserved ログ |
| DRP-380 | chat 経路の escalate で slug/採番がスキップされ PR 起票不能 + 「PR を起票しました」虚偽表示 | 🟡 | 2026-06-04 | 2026-06-04 | DRP-371 修正で chat 経路の loop-breaker が初発火した先で露出。escalate 結果が adrSlug/adrNumber 欠落 → 自動 PR なし + 「PR 作成」ボタンも 400 で手詰まり、なのに「PR を起票しました」と表示 (session 23dc778e・draft agent-knowledge-layers-convention) | escalate の slug/numbering ガードが state.dryRun === false (CI 経路前提) で、chat 経路の dryRun 未設定 (null) がスキップ扱い。rejectionMsg は無条件ハードコード | PR #1420: ①ガードを dryRun !== true へ (明示 dry-run のみ副作用スキップ) ②buildEscalateAcceptMessage 純粋関数でメッセージを経路別出し分け (CI=起票済み / chat=ボタンから起票 / dry-run=プレビュー)。自動 PR 条件は不変 (chat は HITL でボタン起票) | ✅ buildEscalateAcceptMessage 4 件 (経路 3 分岐 + round-cap)。実機: 該当 draft の再 run で PR 作成ボタンが機能すること |
| DRP-378 | chat UI 中間結果パネルの要否判定が常に「判定: - / モード: -」(triage partial 空) | 🟢 | 2026-05-30 | 2026-06-04 | ADR-0089 corrigendum (2026-05-30) の既知ギャップが 2026-06-04 ユーザー観測で再浮上。ステッパー②は Standard と確定表示されるのに中間結果パネルは「-」のままで矛盾。本日の全 run で partial:triage = {} を実測確認 (デプロイ退行ではない) | triage は preGraph (非ストリーミング) で実行され streaming ループの patchPartial が捕捉不能。main graph の triage ノードは needsAdr 設定済で {} を返し、空 partial が書き込まれて UI が - 表示 | PR #1405: ①consumer の pre 解決点で patchPartial('triage', ...) を明示書込 (early-reject でも判定理由を表示) ②extractGatePartial('triage') は needsAdr 不在の空出力で null を返し、streaming ループによる正値の {} 上書きを防止 ③ADR-0089 corrigendum に解消を追記 | — (実機: 次回 chat run で中間結果パネルに 判定/モード が表示されることを確認) |
| DRP-376 | Decision Pipeline queue 再配信で全 gate 3 周再実行 (通過 result の差し戻し上書き・LLM 課金 ~3 周・telemetry 0 行) | 🔴 | 2026-06-04 | 2026-06-04 | ADR draft 審査 (session bedb9912) で発見。フル 10 gate 実行 (isInflightRedelivery() を追加: running かつ updatedAt 20 分鮮度内の再配信 message は ack-skip (PR #1382)。残課題 2 点 (未対応・記録のみ): ①フル run が invocation 上限を超える構造自体 (gate 単位 chunk 化等は将来の再設計) ②kill により telemetry が失われる問題 | — (実 run での再発監視。残課題①が解消されるまで根本原因は残存) |
| COM-0381 | 外部 API 書込 (curl POST/DELETE 等) が層① hooks の対象外で承認の拡大解釈を技術的に防げない | 🟡 | 2026-06-04 | 2026-06-09 | 2026-06-04 セッション監査の実害③ (ADR-0115 §1.2)。包括的「yes」を外部 KV POST の承認とみなして curl で外部書込を実行。pre_bash_guard.sh + permissions.deny は main 直 push・rm -rf 等のローカル不可逆操作のみ対象で、外部 API 書込 (DRP KV POST/DELETE・外部 SaaS API) は技術強制外だった | 外部書込 (curl/wget の書込メソッド) を検知する技術ガードが存在せず、行動規範 (層④ memory・層⑤ Skill「原則」) の運用統制のみに依存していた | pre_bash_guard.sh に外部書込検知を追加。ハードブロックでなく permissionDecision=ask でハーネスにユーザー確認を要求 (curl/wget の -X POST/PUT/PATCH/DELETE・--request/--method・--upload-file。gh・localhost は除外、-X(大文字) で proxy -x と区別)。Claude が token 等で自己バイパスできない点が ask の要 (PR #1632) | ✅ ペイロード 7 ケース (ask/allow/block 分岐) + headless 実機で permissionBehavior=ask・curl 非実行を確認 |
| DRP-0382 | ADR-0119 Phase C-flip が CV system プロンプトへの静的 evidence ルールで golden FN 回帰 + 修正前コミットを本番デプロイ (実害ゼロ) | 🟡 | 2026-06-09 | 2026-06-09 | Phase C-flip (PR #1600・verify_in_code × 非stale evidence で却下を降格) のデプロイで 2 事故が連鎖。①evidence-resolution 指示を CV の system プロンプトへ静的に載せた結果 undermines がドリフトし golden #11 が baseline FN 0/5 → 5/5 に回帰。②git checkout HEAD~0 で detach → amend → push したため branch ref が動かず 修正前 (回帰版) コミットを本番デプロイ。実害はゼロ (露出 04:48–05:02Z の 14 分間に実審査 run 0 件) | ①CV プロンプトは静的ルール追加に敏感で、付帯ルールを system に常時載せると evidence 無し run の判定境界がドリフト する ([[crossval-static-prompt-drift]])。②detached HEAD で amend → push は branch ref を更新せず旧コミットを push 先に上げる — 検証済みローカル HEAD ≠ push されたコミット ([[verify-pushed-sha]]) | hotfix PR #1603: ①evidence-resolution 指示を evidence 添付時のみ userMsg へ動的注入 (EVIDENCE_RESOLUTION_INSTRUCTION)。evidence 無し run は baseline と byte 同一 → golden #11 FN 0/5 復帰。②push/PR 後に git rev-parse origin/<branch> == ローカル HEAD・git show origin/main:<file> を grep して deployed bundle を SHA 突合 する手順を確立。05:02Z に正版デプロイ | ✅ golden eval を baseline (origin/main worktree) との multi-run 比較で #11 FN 0/5 を確認 (tmp/crossval_multirun.sh)。memory [[crossval-static-prompt-drift]] / [[verify-pushed-sha]] に教訓化。telemetry crossval_evidence_demoted_count (migrate-v10) を Phase C-flip 初回降格の tripwire として監視 (当面 0 想定・> 0 で初の実降格=分類妥当性を要確認) |
| DRP-382 | /chat/create-pr (webhookNode) が非冪等 — 既存 branch/file への再 POST で 422 | 🟡 | 2026-06-10 | 2026-06-11 | PR 作成後に再度 create-pr が走ると、既存 branch への POST /git/refs が 422 "Reference already exists"、既存 file への PUT /contents が 422 "sha wasn't supplied" で失敗し、既存 PR を返さずエラーになる構造だった | 多段 GitHub 操作 (branch 作成 → file 作成 → PR 作成) の各ステップに、既存リソースを検出して流用/更新する冪等化が無かった | PR #1722 (4f7f6122・元目的は断続 401 での多段操作の途中再開) の resume ロジックが本シナリオも構造的に解消: ①branch 既存 (422 Reference already exists) は catch して続行 ②file 既存は GET で sha 取得し PUT に付与 (in-place 更新) ③open PR 既存は GET /pulls で検出し既存 URL を返す (webhook.ts L99/L119/L182)。フロント側の再活性化抑止は PR #1679 で対応済 | — unit test 追加を試みたが vitest-pool-workers の制約で collect 不可 (webhook.ts は state.ts/gateway.ts への型依存経由で langchain→langsmith を引き worker pool で評価不能 = vitest.config 明記の Phase 0 制約)。2026-06-15 コード精査で 3 失敗パス全ての冪等化を確認し解消と判定 |
2. 未修正・調査中(5件)
| ID | バグ名 | 優先度 | 発見日 | 概要 | 再現手順 | 影響範囲 | 暫定対処 |
|---|---|---|---|---|---|---|---|
| MAS-362 | スマホ版 月次財務諸表で数値が隣接列と重なって判読不能 (cockpit-ops-sidebar 占有 + 横スクロール非発動) | 🟡 | 2026-05-08 | iPhone Safari (CSS 幅 ~390px) で 📊 月次財務諸表 の P/L・B/S・CF を表示すると、月別数値が隣接列と被って判読不能。期待: 横スクロールで全列を読める/実際: 左ナビが 176px を占有 + table-layout: fixed で列幅が圧縮され文字が overlap (例: 9,791 と 4,337 が 9,79W,337 として重なって描画) | ①iPhone Safari もしくは DevTools mobile mode (390px) で /exec を開く → ②📊 月次財務諸表 タブを表示 → ③P/L 表の月別数値列を確認 → 期待: 列が独立して読める (or 横スクロール発動) /実際: 数値が重なって表示される | webapp_client/src/styles/cockpit.css の @media (max-width: 640px) ブロック (L934-)、.cockpit-ops-sidebar (L83 / 176px sticky 占有)、.pl-monthly-table (L315 / table-layout: fixed + inline width 960px)。FinancialStatementsView / PlMonthlyPanel / FinancialStatementPanel が共通の .pl-monthly-* クラスを利用 | 横向き(landscape)または PC ブラウザで閲覧。修正パッチ案: cockpit.css の @media (max-width:640px) 内に .cockpit-ops-sidebar { display: none }・.pl-monthly-scroll { width:100%; max-width:100vw; overflow-x:auto; -webkit-overflow-scrolling:touch }・.cockpit-section, .cockpit-main { min-width:0 } を追記。詳細は 2026-05-08 チャット履歴の patch 提案 |
| MAS-297 | Action A 複数回実行時の発注残高二重減算 | 🟡 | 2026-04-16 | Action A を複数回実行すると、過去の計上済 INV が再減算され発注残高がマイナス側に乖離するケースを観測 | ①ORD+INV を起票し Action A 実行(残高が正しく減算) → ②同一 INV に対し再度 Action A を実行 → 期待: 既に計上済のため減算なし/実際: 残高がさらに減算される条件が存在 | mas/400_domain/410_subledger_engine.js:233-240、31_wrk_order 発注残高、予算執行管理の正確性 | Action A 連続実行時は 31_wrk_order の発注残高を目視確認。マイナス値は 201_data_validator.js の O01 警告で検出可能 |
| MAS-303 | applyBankSettlement 合算時の差額が記録されない (Pass 2.5 ソフト合算消込時の落ち穂) | 🟡 | 2026-05-01 | applyBankSettlement (mas/500_import/502_bank_importer.js line 393-402) は stlIds.length === 1 の単一 STL マッチ時のみ 差額(手数料等) 列に書き込む。PR #465 で導入された Pass 2.5 ソフト合算 (合算 STL マッチ ±max(1000, 1%)) のヒット時は stlIds.length > 1 のため差額が記録されず会計上ロスト。71_bs 2026-04 現預金乖離 98,837 円のうち 1,000 円分が本バグ起因 (武生年金事務所: 銀行 149,950 円 vs STL 合計 150,950 円・口座振替割引と推定) | ①33_wrk_bank に Pass 2.5 ソフト合算でヒットした合算消込済 STL を準備 (例: 武生年金 STL_20260331_0058 + 0059) → ②applyBankSettlement 実行 → ③33タブ各 STL 行の 差額(手数料等) 列を確認 → 期待: 合算先頭/末尾どちらかに -1,000 が記録 / 実際: 全 STL で空欄 | mas/500_import/502_bank_importer.js line 393-402、71_bs / 91_fs_bs の現預金 cash plug、98,837 円乖離調査 (3 件中 1 件分) | 仕様書 MAS-338 として起票済 (dev_mas-338_settlement_diff_handling.md)。実装まで暫定: Pass 2.5 ヒット時は手動で 33タブの該当行に差額を記入 (確認FLG=false 状態のため人間レビューフェーズで補完) |
| MAS-358 | F-57 SoloFinancialStatementsPanel 健全性行の数値が他行と x 座標で揃わない (cosmetic 整列ズレ) | 🟢 | 2026-05-02 | webapp_client/src/cockpit/SoloFinancialStatementsPanel.tsx 多年表の 税引後利益・ランウェイ(役員報酬込)・営業利益率・労働分配率 の 4 行で、「万円」「ヶ月」「%」の右端 (および一桁目) の x 座標が、非健全性行 (年商 / 売上原価 / 売上総利益 / 販管費 / 営業利益 / 税務 / 純資産 / 現預金 / CF 各行 / ランウェイ / 月次バーン) と 右にズレる (健全性行の方が右に寄る現象)。視覚的整列のみ・数値ロジックには無関係 | ①F-57 cockpit を開く → ②SoloFinancialStatementsPanel 多年表を表示 → ③税引後利益・ランウェイ役員報酬込・営業利益率・労働分配率 の 4 行と他行の数値右端 x 座標を比較 → 期待: 揃う / 実際: 健全性 4 行が右にズレる | webapp_client/src/cockpit/SoloFinancialStatementsPanel.tsx、cockpit UI の視覚的整列のみ (数値ロジック影響なし) | 試した対策と結果: (1) flex column ラッパー + align-items: flex-end → ズレる / (2) ラッパー span に width: 100%; text-align: right → ズレる / (3) ラッパー span に display: block 明示 → ズレる / (4) HTML 構造変更: 数値を td 直下配置 + pills を position: absolute; right: 10px で float (commit b93f4bc・dev @230) → 依然ズレる。推測される根本原因: padding-bottom: 22px !important または別の CSS が td の幅計算に影響している可能性。low priority cosmetic のため別タスクで根本調査・修正 |
| DRP-381 | chat UI で PR 作成中に「📋 結果をコピー」すると結果でない「線かなにか」がコピーされる (要 repro) | 🟢 | 2026-06-10 | PR 作成ボタン押下→PR 作成中の状態で結果をコピーすると、審査結果でない「線かなにか」がコピーされる (ユーザー報告)。コード調査ではコピー実体は buildCopyText(data) で PR 作成 (prArea 更新) と独立しており「線」を返す経路が未特定 | ①審査完了後「📤 GitHub PR を作成」を押す → ②PR 作成中 (スピナー表示) に結果をコピー → 期待: 審査結果テキスト / 実際: 結果でない「線かなにか」。※「📋 結果をコピー」ボタンか手動選択+Cmd+C かは要確認 | drp/public/chat.html (buildCopyText / addCopyButton / PR 作成フロー)。クリップボード内容のみ・データ破損なし | ユーザーが repro 採取予定 → 採取後に原因特定・修正。暫定は PR 作成完了 (リンク表示) 後にコピー |
調査ポイント
仕訳ステータス=='計上済'の判定漏れ有無(INV 側の自動仕訳JNL_IDチェック L196)自動仕訳JNL_IDが途中でクリアされるケース(手動編集 / RPA 再起票との相互作用)ordMap初期化の 0 フォールバックcurrentBal \|\| totalIncTax(L143)と複合した残高復元シナリオ- 同一 ORD に紐づく複数 INV を一括処理する際の ordBalUpdates の累積計算順序
3. バグ登録ガイドライン
ID採番ルール
- 形式:
<PREFIX>-NNNN(4 桁ゼロ詰め・2026-06-04 改定)。番号空間は全 prefix 共有の連番(次は 0383、prefix を問わず重複させない)。旧 ID との対応を自明に保つため、リナンバー時も番号は変えず prefix のみ振り替える- 3 桁では不足見込みのため 4 桁化(ADR 番号 0001〜 と同じ体裁)。既存の 3 桁 ID(〜380)は grandfather — git コミットメッセージ内の旧 ID は書き換え不能のためリナンバー・ゼロ詰め化はしない。grep 時は 3 桁/4 桁の両表記を考慮する(例:
MAS-38[0-9]\|MAS-038[0-9]ではなく番号部分で検索)
- 3 桁では不足見込みのため 4 桁化(ADR 番号 0001〜 と同じ体裁)。既存の 3 桁 ID(〜380)は grandfather — git コミットメッセージ内の旧 ID は書き換え不能のためリナンバー・ゼロ詰め化はしない。grep 時は 3 桁/4 桁の両表記を考慮する(例:
- PREFIX は対象システムで選ぶ:
MAS-: 管理会計 GAS(000_infra〜900_test,webapp_client, GAS デプロイ)DRP-: Decision Pipeline(drp, chat UI, 審査 graph/queue/telemetry)COM-: 共通基盤・横断(認証/secret 管理、docs サイトビルド基盤、CI/CD、複数システムにまたがるもの)
- docs 運用バックログは別軸の
DOC-OPS-NN(TODO_future.md §7)。バグ・障害は本ファイル、エンハンスメントは TODO_future.md - 旧表記「
BUG-NNN(3桁連番)」は廃止(実態は MAS-NNN 採番だったため。2026-06-04 改定)
リナンバー対応表(2026-06-04 改定・旧 MAS prefix からの振替)
git のコミットメッセージ・マージ済み PR の merge commit 内には旧 ID が残る(書き換え不能)。旧 ID を見たら本表で読み替える:
| 旧 ID | 新 ID | 案件 |
|---|---|---|
| MAS-371 | DRP-371 | chat UI 経路 draftId 欠落で loop-breaker 無効 |
| MAS-373 | COM-373 | docs サイト glossary ホバーが表セル内で clip |
| MAS-374 | DRP-374 | queue consumer pickup stall (watchdog 誤検知) |
| MAS-375 | DRP-375 | 復元セッション + フォーム空で停止トグル無反応 |
| MAS-376 | DRP-376 | queue 再配信で全 gate 再実行 |
| MAS-377 | DRP-377 | numbering gate の ADR 番号二重発行 |
| MAS-378 | DRP-378 | 中間結果パネル「判定: - / モード: -」ギャップ |
| MAS-379 | DRP-379 | 審査開始/キャンセルの単一トグル誤連打事故 |
| MAS-380 | DRP-380 | CV escalate が chat UI 発 run で PR 化不能 |
(MAS-372 は案件未割当のまま欠番。MAS-370 以前はリナンバー対象外 = grandfather)
優先度の判定基準
| 優先度 | 条件 | 対応期限 |
|---|---|---|
| 🔴 Critical | データ破損・二重登録・本番サービス停止・セキュリティ | 即時(当日中) |
| 🟡 High | 機能不全・計算ミス・実障害の再発リスク・データ整合性 | 3営業日以内 |
| 🟢 Medium | コード品質・警告・非機能要件・UXの軽微な問題 | 計画的に対応(次スプリント) |
必須記録項目
| 項目 | 説明 |
|---|---|
| バグ名 | 現象を端的に表す名称 |
| 優先度 | 🔴/🟡/🟢 |
| 発見日 | バグが発見された日付 |
| 概要 | 何が起きているか(期待動作 vs 実際の動作) |
| 再現手順 | バグを再現するための手順(未修正バグの場合) |
| 根本原因 | なぜバグが発生したか(修正時に記録) |
| 修正内容 | 何をどう直したか |
| 回帰テスト | 再発防止のテストが追加されたか |
| 影響範囲 | どのタブ・関数・ユーザー操作に影響するか |
[2026-06-01] GAS デプロイ CI の secret stale 化 → prod push Requested entity was not found (PR #1231)
症状
prod GAS デプロイ CI が直近 60 回連続で失敗。clasp push が Requested entity was not found (404) を返し、prod Web アプリへの反映が停止していた。
根本原因
2 点の複合:
CLASPRC_JSON(clasp 認証トークン) の失効 — OAuth refresh token 失効。CLASP_SCRIPT_ID_PRODsecret の stale 化 — secret 設定日 (2026-04-02) が.clasp.prod.jsonの scriptId 修正コミット (2026-04-14, 末尾…Bm_4へ変更) より前だったため、GitHub Secret が旧 prod scriptId を保持。CI は stale な scriptId で push しようとして 404。
- 副次:
deploy.ymlの trigger がpaths-ignore方式で、非 GAS 変更 (drp/**等) でも prod push が誤発火し失敗を量産していた。
修正
CLASPRC_JSONを動作中の~/.clasprc.jsonから再同期。CLASP_SCRIPT_ID_{DEV,PROD}を.clasp.{dev,prod}.jsonの値に再同期。CLASP_DEPLOYMENT_ID_{DEV,PROD}をscripts/deploy.shのハードコード値 (=clasp deployments実在 ID) に合わせて登録。deploy.ymlの trigger を GAS 実体 allowlist (mas/000_infra/**〜mas/900_test/**,mas/templates/**,mas/appsscript.json,.clasp.{dev,prod}.json) +workflow_dispatchに限定 (PR #1231)。- 結果: dev CI green → prod CI green、prod deployment
…@17 → …@19。
再発防止 (地雷・切り分け順)
scriptId / OAuth を変更したら、GitHub Secret 5 本を .clasp.*.json から必ず再同期する:
CLASPRC_JSON / CLASP_SCRIPT_ID_{DEV,PROD} / CLASP_DEPLOYMENT_ID_{DEV,PROD}。
secret は設定時点の値で固定され .clasp.*.json の後続コミットを追従しないため stale 化する (= 今回の罠)。
切り分け順: dev で gh workflow run deploy.yml --ref <feature-branch> (ref≠main → dev 対象) で green 確認 → --ref main で prod。
補足 (clasp 3.3.0 cp 切替の監査結論)
scripts/clasp-switch.sh の cp .clasp.${ENV}.json .clasp.json 方式は clasp 3.3.0 でも正しく機能 (cp dev→dev / cp prod→prod を実証)。「push:prod が dev を push していた」過去の懸念は再現せず=監査問題なし。
関連ドキュメント
- 申し送り:
tasks/prompts/handover_2026-06-01_gas-deploy-ci-resolved_to_sub.md/main_2026-06-01_gas-deploy-auth-ci-residuals.md - changelog: 2026-06-01 PR #1231
[2026-05-27] Decision Pipeline async 実行時 null reference crash (PR #1035/#1036/#1037)
症状
Pipeline の async 実行 (Web UI / API 経由) で「Cannot read properties of null (reading 'needsAdr')」エラーが発生。Web UI では polling timeout (10 分) またはエラー表示。
根本原因
3 つの問題が重層していた:
- conditional edge の null state: LangGraph の conditional edge で
s.needsAdrを直接アクセスしていたが、triage ノードの LLM 呼出し失敗時に statesが null になることがあった - streamEvents の結果キャプチャ不備: Consumer Worker が
event.name === 'LangGraph'でハードコードして最終結果を取得していたが、LangGraph の streamEvents v2 では実際のイベント名が異なりlastResultが常に null になっていた - Queue メッセージ滞留: 失敗した実行が max_retries=3 でリトライされキューに 21 件滞留。新規メッセージの処理が後回しになり polling timeout に至った
修正
src/graph.ts: 全 conditional edge に optional chaining (s?.needsAdr/s?.socraticPass/s?.rejected) (PR #1035)src/index.ts:preGraph.invoke()null guard → 502 レスポンス (PR #1013)src/queues/pipeline_consumer.ts: preGraph null guard + lastResult null guard + streamEvents 結果キャプチャをevent.data?.outputに修正 (PR #1036/#1037)public/chat.html: pollSession の null result guard (PR #1036)
再発防止
- Pipeline README にエラーハンドリングテーブルと Queue 滞留時の Purge 手順を追記
- operator_guide §4.3.1 に差し戻し再投入ルールを明文化 (Pipeline 生成済み本文の再投入禁止)
[2026-05-14] Cloudflare Workers サブリクエスト上限超過 (PR #706)
症状
Decision Pipeline 実行時に Too many subrequests by single Worker invocation エラーが発生し、パイプラインが途中停止。
根本原因
consistency.ts が ADR ファイルを 1 件ずつ個別 fetch していた (38 件)。LLM 呼び出し (~10) + Durable Object 等と合計するとデフォルト上限 50 を超過。
修正
wrangler.toml:[limits] subrequest_limit = 1000追加(即時緩和)consistency.ts: GitHub GraphQL 一括取得に変更(39 → 2 サブリクエスト)
再発防止
- 新ノード追加時は fetch() 呼び出し数をカウントし、パイプライン合計が 50 を超えないか確認する
- 複数ファイルを取得する場合は GitHub GraphQL の field alias 一括取得パターンを使う
関連ドキュメント
- 追加開発案件 (TODO) — エンハンスメント(機能追加・改善)
- テスト手順 — 統合テスト
- データ整備 — データ修正・マイグレーション