| @@ -381,88 +381,6 @@ uploadedUser / createdByUser / Wiki history user など、bot 操作や移行デ | |||||
| - [ ] 既知サイトの抽出器を追加できる構造にする | - [ ] 既知サイトの抽出器を追加できる構造にする | ||||
| - [ ] スクリーンショットは最後の手段にする | - [ ] スクリーンショットは最後の手段にする | ||||
| ### 66. [P2] nico:sync の bot操作 付与条件をさらに絞る | |||||
| **種別**: ops / data quality | |||||
| **対象** | |||||
| - `backend/lib/tasks/sync_nico.rake` | |||||
| **背景 / 問題** | |||||
| 既存 issue に bot操作 削減が大量にある。同期バッチが通常編集履歴やタグ一覧を汚さないよう、条件を明確化したい。 | |||||
| **完了条件** | |||||
| - [ ] bot操作 を付ける変更種別を表にする | |||||
| - [ ] タイトル/サムネだけの更新では付けない等を決める | |||||
| - [ ] 既存 open issue を統合・整理する | |||||
| ### 67. [P2] nico:sync の外部取得に retry / timeout / 障害通知を入れる | |||||
| **種別**: ops | |||||
| **対象** | |||||
| - `backend/lib/tasks/sync_nico.rake` | |||||
| - `backend/lib/get_videos.py` | |||||
| **背景 / 問題** | |||||
| 外部 DB / ネットワーク / サムネ取得に依存するバッチは、失敗時の再実行性が命。ログだけでは運用が辛い。 | |||||
| **完了条件** | |||||
| - [ ] 外部取得に timeout と retry を設定する | |||||
| - [ ] 部分失敗を記録する | |||||
| - [ ] 異常終了時に通知する | |||||
| - [ ] 二重実行ロックを入れる | |||||
| ### 68. [P2] バッチの二重起動防止ロックを入れる | |||||
| **種別**: ops | |||||
| **対象** | |||||
| - `backend/lib/tasks/*.rake` | |||||
| - `config/schedule.rb` | |||||
| **背景 / 問題** | |||||
| nico:sync や類似度計算が重なって走ると、post_count や履歴に悪影響が出る可能性がある。 | |||||
| **完了条件** | |||||
| - [ ] DB advisory lock か lock file を使う | |||||
| - [ ] 既に実行中なら安全に終了する | |||||
| - [ ] ログにスキップ理由を出す | |||||
| ### 69. [P1] CI で backend spec / frontend lint / typecheck / build を回す | |||||
| **種別**: test / ops | |||||
| **対象** | |||||
| - `.gitea/workflows/*` | |||||
| - `backend` | |||||
| - `frontend` | |||||
| **背景 / 問題** | |||||
| 今回の静的レビューでも hook ルール違反やスキーマドリフトが見える。CI がないと再発する。 | |||||
| **完了条件** | |||||
| - [ ] bundle exec rspec を CI で実行する | |||||
| - [ ] npm run lint / typecheck / build を CI で実行する | |||||
| - [ ] migration と schema の一致を確認する | |||||
| - [ ] 失敗時に merge できない | |||||
| ### 70. [P1] eslint-plugin-react-hooks を導入し、hook 事故を機械検出する | |||||
| **種別**: test / frontend | |||||
| **対象** | |||||
| - `frontend/package.json` | |||||
| - `frontend/eslint.config.*` | |||||
| - `frontend/src` | |||||
| **背景 / 問題** | |||||
| 条件付き hook は人間レビューで見落としやすい。React アプリなら機械で落とすべき。 | |||||
| **完了条件** | |||||
| - [ ] react-hooks/rules-of-hooks を error にする | |||||
| - [ ] react-hooks/exhaustive-deps を少なくとも warn にする | |||||
| - [ ] 既存違反を直す | |||||
| ### 71. [P1] RSpec にセキュリティ回帰テスト群を追加する | ### 71. [P1] RSpec にセキュリティ回帰テスト群を追加する | ||||
| @@ -481,22 +399,6 @@ BAN、SSRF、権限、limit、system tag 保護は一度壊れると公開事故 | |||||
| - [ ] system tag PATCH forbidden spec | - [ ] system tag PATCH forbidden spec | ||||
| - [ ] limit clamp spec を追加する | - [ ] limit clamp spec を追加する | ||||
| ### 72. [P1] schema.rb と migration の差分検出を CI に入れる | |||||
| **種別**: ops / db | |||||
| **対象** | |||||
| - `backend/db/schema.rb` | |||||
| - `backend/db/migrate` | |||||
| - `.gitea/workflows/*` | |||||
| **背景 / 問題** | |||||
| wiki_assets のような「schema にはあるが migration がない」状態が発生している。これは将来の環境再構築を壊す。 | |||||
| **完了条件** | |||||
| - [ ] db:drop db:create db:migrate 後の schema diff を CI で見る | |||||
| - [ ] 差分が出たら失敗にする | |||||
| - [ ] schema-only 変更を禁止する | |||||
| ### 73. [P3] Gemfile の未使用 gem を棚卸しする | ### 73. [P3] Gemfile の未使用 gem を棚卸しする | ||||
| @@ -514,38 +416,6 @@ jwt や gollum 等、現行コードで使っているか怪しい gem がある | |||||
| - [ ] 不要なら削除する | - [ ] 不要なら削除する | ||||
| - [ ] 必要なら用途を README に書く | - [ ] 必要なら用途を README に書く | ||||
| ### 74. [P2] フォント assets のライセンスを確認する | |||||
| **種別**: legal / release blocker | |||||
| **対象** | |||||
| - `frontend/src/assets/fonts/*` | |||||
| - `frontend/src/styles/*` | |||||
| **背景 / 問題** | |||||
| フロントにフォントファイルが同梱されている。一般公開・配布前にライセンス確認が必要。ここを雑にすると公開後に面倒になる。 | |||||
| **完了条件** | |||||
| - [ ] 同梱フォントのライセンスと再配布可否を確認する | |||||
| - [ ] NOTICE または credits に記載する | |||||
| - [ ] 不明なら Web font/代替フォントへ切り替える | |||||
| ### 75. [P2] ユーザ引継ぎコードを localStorage 保管のままにするリスクを評価する | |||||
| **種別**: security / design | |||||
| **対象** | |||||
| - `frontend/src/App.tsx` | |||||
| - `frontend/src/lib/api.ts` | |||||
| - `backend/app/controllers/application_controller.rb` | |||||
| **背景 / 問題** | |||||
| localStorage の引継ぎコードは実装が簡単だが、XSS で即アカウント奪取される。パスワード制にしないとしても、期限・再発行・スコープ制限は検討が必要。 | |||||
| **完了条件** | |||||
| - [ ] 現方式の脅威モデルを書く | |||||
| - [ ] コード再発行時に旧コードを即失効するか決める | |||||
| - [ ] 管理者/member だけ追加防御するか検討する | |||||
| ### 76. [P2] Post / Tag / Wiki の操作ログを共通 AuditLog に寄せる | ### 76. [P2] Post / Tag / Wiki の操作ログを共通 AuditLog に寄せる | ||||
| @@ -563,157 +433,6 @@ localStorage の引継ぎコードは実装が簡単だが、XSS で即アカウ | |||||
| - [ ] 対象種別・対象 ID・操作・ユーザ・IP を保存する | - [ ] 対象種別・対象 ID・操作・ユーザ・IP を保存する | ||||
| - [ ] 管理画面で横断検索できる | - [ ] 管理画面で横断検索できる | ||||
| ### 77. [P1] 管理画面の最小構成を作る | |||||
| **種別**: feature / admin | |||||
| **対象** | |||||
| - `frontend/src/pages/admin/*` | |||||
| - `backend/app/controllers/admin/*` | |||||
| **背景 / 問題** | |||||
| 公開前に必要なのは派手な機能ではなく、BAN、履歴確認、差し戻し、通報確認を 1 箇所で触れること。今は運用導線が分散/不足している。 | |||||
| **完了条件** | |||||
| - [ ] admin namespace を作る | |||||
| - [ ] ユーザ/BAN/履歴/御意見番の最小画面を作る | |||||
| - [ ] admin 以外アクセス不可にする | |||||
| ### 78. [P2] 既存 open issue の「実装済み疑い」を整理する | |||||
| **種別**: project management | |||||
| **対象** | |||||
| - `btrc-hub.issue.sql` | |||||
| - `Gitea issues` | |||||
| **背景 / 問題** | |||||
| #164 タグ検索機能作成、#171 OR/NOT 検索など、現ソースでは既に実装済みに見える open issue がある。課題表が腐ると優先順位判断が狂う。 | |||||
| **完了条件** | |||||
| - [ ] 実装済み issue を close する | |||||
| - [ ] 残作業があるものは title/body を更新する | |||||
| - [ ] 巨大 issue は小 issue に分割する | |||||
| ### 79. [P1] 公開前チェックリストをリポジトリに置く | |||||
| **種別**: release / ops | |||||
| **対象** | |||||
| - `README.md` | |||||
| - `docs/release-checklist.md` | |||||
| **背景 / 問題** | |||||
| タグ広場は機能量が増えており、「何が揃ったら公開できるか」が頭の中に寄っている。公開判断を文書化しないとスコープが永遠に膨らむ。 | |||||
| **完了条件** | |||||
| - [ ] 法務、BAN、管理画面、履歴復元、Wiki 検索、バックアップ、監視のチェックリストを作る | |||||
| - [ ] P0/P1 issue と対応付ける | |||||
| - [ ] 公開しない理由と公開できる条件を分ける | |||||
| ### 80. [P1] バックアップ / リストア手順を文書化し、定期検証する | |||||
| **種別**: ops / disaster recovery | |||||
| **対象** | |||||
| - `docs/ops/*` | |||||
| - `backend/db` | |||||
| - `ActiveStorage/R2` | |||||
| **背景 / 問題** | |||||
| 共同編集型の知識基盤は DB と添付ファイルを失うと終わる。バックアップよりリストア検証が本体。 | |||||
| **完了条件** | |||||
| - [ ] DB dump 手順を書く | |||||
| - [ ] R2/ActiveStorage のバックアップ方針を書く | |||||
| - [ ] ステージングへリストアする手順を作る | |||||
| - [ ] 月 1 回など検証周期を決める | |||||
| ### 81. [P2] 監視とログ確認の最低線を作る | |||||
| **種別**: ops | |||||
| **対象** | |||||
| - `config/environments/production.rb` | |||||
| - `server config` | |||||
| - `docs/ops/*` | |||||
| **背景 / 問題** | |||||
| 公開後は「落ちてから気づく」だと遅い。cron 失敗、500 増加、容量増加、R2 エラー程度は見たい。 | |||||
| **完了条件** | |||||
| - [ ] HTTP 死活監視を入れる | |||||
| - [ ] cron/batch 失敗通知を入れる | |||||
| - [ ] 500 ログ集計を見る | |||||
| - [ ] DB/R2 容量の確認手順を書く | |||||
| ### 82. [P2] レスポンシブ編集 UI の実機確認チェックを作る | |||||
| **種別**: UX / mobile | |||||
| **対象** | |||||
| - `frontend/src/pages/posts/*` | |||||
| - `frontend/src/pages/tags/*` | |||||
| - `frontend/src/pages/wiki/*` | |||||
| - `frontend/src/components/TopNav.tsx` | |||||
| **背景 / 問題** | |||||
| スマホで PC 同等の快適さを求めるなら、閲覧だけでなく投稿・タグ編集・Wiki 編集の実機確認が必要。 | |||||
| **完了条件** | |||||
| - [ ] 主要画面のスマホ確認表を作る | |||||
| - [ ] タグ補完・Markdown 編集・TopNav を重点確認する | |||||
| - [ ] 横幅崩れとキーボード表示時の問題を直す | |||||
| ### 83. [P2] タグサイドバーの長い半角文字折り返しを修正する | |||||
| **種別**: UX / existing issue | |||||
| **対象** | |||||
| - `frontend/src/components/TagSidebar.tsx` | |||||
| - `frontend/src/components/TagLink.tsx` | |||||
| **背景 / 問題** | |||||
| 既存 #180。長い半角タグ名が見切れる問題はタグ基盤として地味に痛い。 | |||||
| **完了条件** | |||||
| - [ ] break-all / overflow-wrap / min-width を調整する | |||||
| - [ ] 長い URL 風タグ・英数字タグで確認する | |||||
| - [ ] PC/スマホ両方で崩れない | |||||
| ### 84. [P3] アキネータ風お遊び機能の最小仕様を切る | |||||
| **種別**: feature / product | |||||
| **対象** | |||||
| - `docs/spec/*` | |||||
| - `frontend/src/pages/*` | |||||
| - `backend/app/controllers/*` | |||||
| **背景 / 問題** | |||||
| 公開時の話題性として候補に上がっているが、仕様がまだ霧。ゼロイチ系としては小さく切らないと沼になる。 | |||||
| **完了条件** | |||||
| - [ ] 対象をキャラ/ミーム/投稿のどれにするか決める | |||||
| - [ ] 質問生成をタグ階層ベースにするか決める | |||||
| - [ ] MVP を 5〜10 問で当てる程度に制限する | |||||
| ### 85. [P2] 「主要 Wiki 5000 ページ」計画を生成・レビュー・公開の工程に分ける | |||||
| **種別**: content ops | |||||
| **対象** | |||||
| - `wiki data` | |||||
| - `docs/content-plan.md` | |||||
| **背景 / 問題** | |||||
| 5000 ページ目標は野心として正しいが、そのままだと精神論になる。1 行説明でよいなら、タグ優先度と作業単位に落とすべき。 | |||||
| **完了条件** | |||||
| - [ ] 主要タグ抽出クエリを作る | |||||
| - [ ] 優先度 A/B/C に分ける | |||||
| - [ ] 1 行説明テンプレを作る | |||||
| - [ ] 未整備タグ一覧ページを作る | |||||
| ### 86. [P3] Wiki 下書き保存を実装する | ### 86. [P3] Wiki 下書き保存を実装する | ||||
| @@ -731,22 +450,6 @@ Wiki 編集が長文化すると、ブラウザ落ちや競合で書きかけが | |||||
| - [ ] ページ/ユーザ単位で下書きを保存する | - [ ] ページ/ユーザ単位で下書きを保存する | ||||
| - [ ] 復元 UI を出す | - [ ] 復元 UI を出す | ||||
| ### 87. [P2] Wiki 編集メッセージ入力欄を追加する | |||||
| **種別**: feature / audit | |||||
| **対象** | |||||
| - `frontend/src/pages/wiki/WikiNewPage.tsx` | |||||
| - `frontend/src/pages/wiki/WikiEditPage.tsx` | |||||
| - `backend/app/controllers/wiki_pages_controller.rb` | |||||
| **背景 / 問題** | |||||
| バックエンドは message を受けられるが、フロントに入力欄がない。履歴を見る時に「なぜ変更したか」が残らない。 | |||||
| **完了条件** | |||||
| - [ ] 新規/編集フォームに message 欄を追加する | |||||
| - [ ] 空欄可にする | |||||
| - [ ] 履歴画面で表示する | |||||
| ### 88. [P2] WikiDiffPage の query 変更時再取得と key 不足を直す | ### 88. [P2] WikiDiffPage の query 変更時再取得と key 不足を直す | ||||
| @@ -761,38 +464,4 @@ diff 取得 useEffect の依存配列が空で、id/from/to が変わっても | |||||
| **完了条件** | **完了条件** | ||||
| - [ ] 依存配列に id/from/to を入れる | - [ ] 依存配列に id/from/to を入れる | ||||
| - [ ] diff 行に安定 key を付ける | - [ ] diff 行に安定 key を付ける | ||||
| - [ ] ローディング/エラー状態を出す | |||||
| ### 89. [P2] Front/back の camelCase / snake_case 変換境界を明文化する | |||||
| **種別**: DX / refactor | |||||
| **対象** | |||||
| - `frontend/src/lib/api.ts` | |||||
| - `backend/app/representations/*` | |||||
| - `frontend/src/types.ts` | |||||
| **背景 / 問題** | |||||
| レスポンスは camelize しているが、送信 params は手動で snake_case を混ぜている。API が増えるほどズレる。 | |||||
| **完了条件** | |||||
| - [ ] 送信も decamelize するか、手動 snake_case 方針にするか決める | |||||
| - [ ] FormData の扱いを明記する | |||||
| - [ ] 型と representation を対応させる | |||||
| ### 90. [P1] Tag / Wiki / Post の title/name collation 問題を仕様化する | |||||
| **種別**: data integrity / existing issue | |||||
| **対象** | |||||
| - `backend/db/schema.rb` | |||||
| - `backend/app/models/tag_name.rb` | |||||
| - `backend/app/models/wiki_page.rb` | |||||
| **背景 / 問題** | |||||
| DB collation が utf8mb4_0900_ai_ci のため、ひらがな/カタカナ/濁点/大文字小文字などの同一視が起こりうる。既存 #237 と絡む根深い問題。 | |||||
| **完了条件** | |||||
| - [ ] 同一視される文字の実例をテストする | |||||
| - [ ] binary collation にするか、アプリ側で同定文字を制定するか決める | |||||
| - [ ] 作成前に衝突警告を出す | |||||
| - [ ] ローディング/エラー状態を出す | |||||