概要
POST /feedback が重複 id で 409 になったとき、(a) 直前に書いた screenshot が孤児ファイルとして残り、(b) 保存されない feedback について Slack 通知だけが飛ぶ。
詳細
- 場所:
server/receive.js:204-223
- 処理順が「screenshot 書き込み(L207) →
deliverToSlack(L221) → store.insert(L223)」。store.insert は重複 id で 409 を throw する設計(server/store.js:147-149)。
- insert 失敗時に screenshot を削除する後始末が無いため、永続化されない feedback の screenshot が
SCREENSHOT_DIR に残り続ける(容量リーク)。
- insert 前に Slack 送信済みのため、inbox に存在しない feedback の通知が送られる。
- import 経路は insert 失敗時に
deleteScreenshotFile(L284)で後始末しており、feedback 経路だけが非対称。
修正方針
- insert を try/catch で囲み、失敗時に
deleteScreenshotFile(screenshot) を呼ぶ。
- 副作用順序を見直し「insert 成功 → Slack 通知」にし、永続化できた feedback だけ通知する。
受け入れ条件
- 重複 id の
POST /feedback で screenshot ファイルが残らない。
- 保存されない feedback について Slack 通知が飛ばない。
- 409 時に orphan しない回帰テストを追加。
出典: 全体監査(2026-06-20)で検出し、独立検証で実在確定(Medium / confidence high)。
概要
POST /feedbackが重複 id で 409 になったとき、(a) 直前に書いた screenshot が孤児ファイルとして残り、(b) 保存されない feedback について Slack 通知だけが飛ぶ。詳細
server/receive.js:204-223deliverToSlack(L221) →store.insert(L223)」。store.insertは重複 id で 409 を throw する設計(server/store.js:147-149)。SCREENSHOT_DIRに残り続ける(容量リーク)。deleteScreenshotFile(L284)で後始末しており、feedback 経路だけが非対称。修正方針
deleteScreenshotFile(screenshot)を呼ぶ。受け入れ条件
POST /feedbackで screenshot ファイルが残らない。