chore(fts): enrich D1 upsert failure logs to surface root cause (#135)#137
Conversation
processAndUpsertCommitDiff の FTS5 upsert 失敗ログに、根本原因特定に必要な 構造化詳細を追加する。既存の "Failed to upsert FTS5 row for diff ..." 行は ログ検索性のため温存し、新たに `FTS5 diff upsert detail (#135):` 行で errorName / vectorId / tokenizerKind / contentChars / filePathChars / fileStatus / commitSha / repo を JSON として出力する。 #135 の現状ログは ftsErr.message のみで D1 側の具体エラー型・該当行サイズが 見えず、cross-repo / diff-only という発生パターンから先に進めない。本変更は 観測フェーズの最小一手で、次回 :30 cron 実行で構造化ログが残れば、後続 PR で根本原因対応 (trigram tokenizer 限界 / content size / 特殊バイト等の仮説) に進める。 Refs #135
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
github-rag-mcp | 90ae0ac | Apr 27 2026, 09:54 AM |
liplus-lin-lay
left a comment
There was a problem hiding this comment.
Self-review (auto mode)
Option choice & reasoning
選択: Option B (log enrichment) — #135 が first step として明示している経路。
理由:
- コードリーディングだけでは根本原因仮説が複数残る (trigram tokenizer 限界 / content size / 特殊バイト / VTAB corruption 再発)
- D1 側エラーの具体型 (D1_ERROR / SQLITE_*) が現状ログから読み取れず、推測修正のリスクが高い
- 観測フェーズを 1 cron 走らせれば仮説を 1〜2 個に絞れる
Files touched & scope minimality
src/pipeline.ts 1 ファイル, +16 行, -0 行。
diff 経路の catch ブロック 1 箇所のみ修正。issue / release / doc / wiki / comment / review の FTS5 catch は意図的に手付かず — 失敗観測は diff のみのため scope を広げない。
Risk assessment
回帰リスク: 極小。
- 振る舞い変化なし (catch ブロック内の
console.error1 行追加のみ) - 例外フロー変更なし (re-throw も swallow 解除もしていない)
- 成功パスは未変更
- ログ量増加: 失敗時 1 行 → 2 行。失敗が常時発生している現状なら出力量は倍増だが、根本原因特定までの一時負担として許容範囲
ログ PII リスクなし (commitSha / repo は public、filePathChars / contentChars は数値、errorName は型名のみ)。
Verification path (open question)
このコード変更自体の verify は tsc --noEmit で完結 (exit 0 確認済) だが、ログ強化の効果検証 は merge 後 deploy + 次回 :30 cron 実行の構造化ログ出現を待つ必要がある:
- merge → Workers Builds 自動 deploy
- 次回 :30 UTC cron 実行 (
pollDiffs) で diff upsert が発生 - Cloudflare Workers Observability で
FTS5 diff upsert detail (#135):行を観測 - 取得できた errorName / contentChars / fileStatus 分布から根本原因仮説を絞り込み、後続 PR で root-cause fix
#135 は本 PR では Refs に留める。root-cause fix の後続 PR が Closes #135 を担当する。
CI status
Workers Builds: github-rag-mcp SUCCESS、test IN_PROGRESS (lint/typecheck 系)。merge gate は CI 完了待ち。
Verdict
Approve for merge (auto mode self-review)。
概要
processAndUpsertCommitDiffの FTS5 upsert 失敗時に出ているログ (Failed to upsert FTS5 row for diff ...) がftsErr.messageのみで根本原因が特定できないため、構造化詳細行を追加する観測強化 PR。選択肢
#135 が提示している 2 候補のうち Option B (log enrichment) を選択。
理由:
変更内容
src/pipeline.tsの diff 用 FTS5 upsert catch ブロック 1 箇所のみ:FTS5 diff upsert detail (#135):行を追加し、JSON で以下を出力:errorName(Error.name / typeof — D1_ERROR か他か判別)vectorId(該当 SHA-256 base64url ID)tokenizerKind: "code"(trigram 仮説の確認用)contentChars(8000 上限近接かどうか)filePathChars(path 長さ仮説)fileStatus(added/modified 等 status との相関)commitSha,repodiff stat:
src/pipeline.ts | 16 ++++++++++++++++1 file, +16/-0.検証
npx tsc --noEmitexit 0 (型エラーなし)後続
このログが次回以降の cron 実行で蓄積されたあと、別 issue/PR で root-cause fix を行う。issue #135 はそれまで open のまま (
Refs #135、Closesではない)。実行モード
automode、AI 自律 self-review 経由で merge。--autoflag は付けない (operations.md auto mode rule に準拠)。