背景
投稿失敗時に、どの SNS に投稿できなかったかは分かるが、なぜ失敗したのかがユーザーに伝わらない。
frontend/src/lib/MainContent.svelte の post() は、失敗時に alert("Blueskyに投稿できませんでした。") と SNS 名のみを表示する
frontend/src/lib/MainContent.ts の postToBluesky / postToThreads / postToMisskey は boolean のみを返し、原因(HTTP ステータスコード・エラーメッセージ)は console.error にしか出力されない
- バックエンドはエラー情報を返しているものも多い(例:
misskey_post.js の { ok: false, statusCode, error })が、フロントエンドが読み捨てている
- フロントエンドの
fetch にタイムアウト設定がなく(AbortController 不使用)、サーバー応答待ちで無期限に待機しうる。リトライの仕組みもない
要件
-
失敗原因のインライン表示
alert をやめ、投稿フォーム近くに失敗原因のリストを表示する(例: Bluesky: タイムアウトしました)
- 原因は分類して伝える: タイムアウト / ネットワークエラー / 認証エラー (401) / サーバーエラー (5xx) / その他 (4xx)
- 成功時の
alert("投稿しました。") は現状維持
-
タイムアウト検知
- 投稿 API(
bluesky_post / threads_post / misskey_post)と R2 アップロードの fetch にタイムアウトを設定する
- 動画 finalize ポーリング(
*_video_finalize の最大試行回数到達)もタイムアウトとして扱う
-
タイムアウト時のリトライ
- タイムアウト(およびネットワークエラー)の場合のみ、SNS ごとに 1 回 リトライする
- 2 回目も失敗した場合は原因と共にエラー表示する
- 動画 finalize ポーリングのタイムアウトも 1 回リトライ対象
スコープ外
- タイムアウト以外(認証・バリデーションエラー等)の自動リトライ
- バックエンドの投稿ロジック自体の変更(エラーレスポンスの JSON 統一は軽微に実施可)
- 成功時表示の変更
関連
- OpenSpec proposal:
openspec/changes/PPP-041-enhance-post-failure-handling/
背景
投稿失敗時に、どの SNS に投稿できなかったかは分かるが、なぜ失敗したのかがユーザーに伝わらない。
frontend/src/lib/MainContent.svelteのpost()は、失敗時にalert("Blueskyに投稿できませんでした。")と SNS 名のみを表示するfrontend/src/lib/MainContent.tsのpostToBluesky/postToThreads/postToMisskeyはbooleanのみを返し、原因(HTTP ステータスコード・エラーメッセージ)はconsole.errorにしか出力されないmisskey_post.jsの{ ok: false, statusCode, error })が、フロントエンドが読み捨てているfetchにタイムアウト設定がなく(AbortController 不使用)、サーバー応答待ちで無期限に待機しうる。リトライの仕組みもない要件
失敗原因のインライン表示
alertをやめ、投稿フォーム近くに失敗原因のリストを表示する(例:Bluesky: タイムアウトしました)alert("投稿しました。")は現状維持タイムアウト検知
bluesky_post/threads_post/misskey_post)と R2 アップロードのfetchにタイムアウトを設定する*_video_finalizeの最大試行回数到達)もタイムアウトとして扱うタイムアウト時のリトライ
スコープ外
関連
openspec/changes/PPP-041-enhance-post-failure-handling/