ファイル
btrc-hub/docs/counts-release-checklist.md
T
2026-10-31 13:50:10 +09:00

11 KiB
Raw Blame 履歴

Counts リリース前確認

この作業では Git、テスト、lint、typecheck、build、migration、サーバー・worker・ systemd の起動、本番適用を行っていない。コードの静的確認とテストコードの編集のみ。 以下の実行と結果確認は利用者が行う。未実行の状態は GO としない。

対応箇所

  • 全件集計と安全な軸:counts_axes.rb / counts_table_query.rb / counts_pivot_totals.rb。 非公開値は GROUP BY 前に統合。通常セル・ソート用集計・小計は同じ寄与母集合を使う。
  • 出力:counts_table_export.rb / countsDisplay.ts / CountsSummaryResults.tsx。 CSV とコピーは伏字。JSON の非公開座標は予約値のみ。非公開セルはリンクを作らない。
  • 配布:counts_exports_controller.rb / counts_export_jobs.rb / counts_export_download.rb。 owner/job/attempt、単独 GET、期限・現在権限・旧 artifact policy の拒否を確認する。
  • 表示:summary 行番号を廃止し「行数」を表示。details の行番号・件数は維持。 非公開列座標のソート・並び替え可否はサーバーの能力フラグへ従う。
  • テスト基盤:requestAnimationFrame の同期・時刻0固定を修正。JSDOM の Canvas は 計測非対応を返すテスト専用モックを置く。実ブラウザーの計測動作は変更していない。

利用者によるテスト

backend ディレクトリで提案する対象(未実行):

bundle exec rspec spec/requests/counts_table_spec.rb spec/requests/counts_download_spec.rb spec/services/counts_pivot_security_spec.rb spec/services/counts_export_spec.rb spec/models/history_access_spec.rb spec/requests/post_locale_filter_identity_spec.rb spec/requests/tag_description_wiki_spec.rb

frontend ディレクトリで提案する対象(未実行):

npm run test:run -- src/lib/counts.test.ts src/lib/api.test.ts src/pages/CountsResourcePage.test.tsx src/pages/help/HelpChangesPage.test.tsx src/components/counts/CountsControls.test.tsx src/components/counts/CountsSummaryResults.test.tsx src/components/counts/CountsExportProgress.test.tsx

SSR は frontend/server.ssr.test.mjs が dist/server/entry-server.js を読み込む。 ソースの PageHead はサイト名付きの共通タイトルを使用している。古い成果物のまま SSR テストを実行しても現行ソースの検証にならない。利用者が最新成果物を用意してから npm run test:ssr を実行する。Codex はビルド・SSR テストとも実行していない。 主要テストの後に既存の全テスト群でも回帰の有無を確認する。

ブラウザーと本番切替前

  • anonymous / guest / member / admin で同じ期間・公開条件を指定し、通常セル・総計の 数値を比較する。安全なグループ数は権限で異なり得る。details は秘匿版を出さない。
  • 投稿 A,B / A / B,C のタグ行軸は5。タグを行軸から外した合計は distinct 投稿数。 changed_field、NULL、複数段小計、ページ境界、CSV / JSON でも値を比較する。
  • 伏字セル、API 辞書、DOM、コピー、CSV / JSON に非公開の値・ID がないこと。 非公開セルのドリルダウンはなく、private 条件の summary は安全な403となること。
  • 8軸・100列の専用エラー、SQL timeout、worker 不在、認証・権限、取消失敗を確認する。
  • CSV / JSON とも ready / 100% だけでは閉じず、実 GET の matching attempt が started となってから閉じること。通信遮断・取消・再描画・タイムアウトも確認する。 サーバー送出開始はブラウザーの受信完了・保存完了を保証しない。
  • PC・スマホで独立/共通スクロール、D&D、列幅、セル選択・文字列選択・キャレット、 内表 JSON の折返し、ページタイトル、Counts の noindex・先読み禁止を確認する。 locale 切替後も対象 ID と集計値は同一で、全言語の登録値を保持すること。
  • Web と worker の同一リリース・secret・DB・COUNTS_EXPORT_DIRECTORY、所有者、 flock / atomic rename、容量、期限切れ掃除、heartbeat、ログ、再起動を照合する。
  • systemd unit の User / WorkingDirectory / EnvironmentFile / PATH を実環境と照合する。 設定適用・サービス起動・本番切替はこの作業では行っていない。
  • ロール変更・logout・新しい discard 後に、生成済みファイルが再取得できないこと。
  • ロールバック時も公開ダウンロードを止め、旧生成物を再配布しない。古いコードへ戻すと artifact_policy やマスクの保護を失う可能性があるため、無条件に巻き戻さない。

P0 の回帰テストと利用者の動作確認が済むまで判定は NO-GO。

静的な対応状況

対象 状態 根拠
非公開軸・参照・全件母集団 対応済み(静的確認のみ) HistoryAccess / CountsAxes / CountsTableQuery と回帰コード
タグ・変更項目・小計 対応済み(静的確認のみ) CountsPivotTotals と全セル・ソートの母集合の統一
API / CSV / JSON / コピー / URL 対応済み(静的確認のみ) マスク後の値のみを表示・比較し、予約座標の条件化を拒否
GET ACK・競合・取消・期限 対応済み(静的確認のみ) サーバー状態遷移、単独 GET、独立タイマー、回帰コード
P1・既知テストのソース上の問題 対応済み(静的確認のみ) 行番号、行数、エラー、RAF、fixture、title 契約
テスト成功・実ブラウザー・本番稼働 判定不能 実行禁止のため未検証

今回の編集ファイル

すべて Counts 本体に必要な変更。共有箇所の例外は HistoryAccess の参照秘匿と、 api.ts の Abort/CSRF 待機・native download の機構であり、全域の安全性にも必要。 SQL の速度改善・索引追加は別 Issue とし、今回 migration は追加していない。

Backend App

  • backend/app/models/history_access.rb:外部タグの記録名参照と、投稿の記録済み参照版にも 同じ可視性判定を適用。旧 artifact policy の生成物を拒否。
  • backend/app/services/counts_population.rb:軸条件の型・予約値の検証。
  • backend/app/services/counts_axes.rb:マスク前の内部寄与を計数し、直前版が非公開の場合も changed_field の名前を秘匿。
  • backend/app/services/counts_table_query.rb:通常セル・ソートの寄与母集合、整数順、 条件表示名、公開列座標だけの操作、summary メタデータを整合。
  • backend/app/services/counts_pivot_totals.rb:全セルに寄与する母集合と、タグ行軸の加算。
  • backend/app/services/counts_table_export.rb:CSV の予約値を伏字化。
  • backend/app/services/counts_export_jobs.rb:開始確認の排他・状態遷移・失効と安全なエラーコード。
  • backend/app/services/counts_export_download.rb:64KiB の Rack body、開始確認、取消・close。
  • backend/app/controllers/counts_exports_controller.rb:GET 直前・送出直前の再認可と専用エラー。

Frontend App

  • frontend/src/lib/api.ts:CSRF 待機中も中断可能にし、iframe の寿命・失敗通知を整理。
  • frontend/src/lib/counts.ts:マスク予約値と列操作の API 型。
  • frontend/src/lib/countsDisplay.ts:マスク表示と既知エラーの i18n 解決。
  • frontend/src/components/counts/CountsExportProgress.tsx:一つのジョブを維持し、matching ACK、 独立期限、取消・再描画・通信断を処理。保存完了の成功表示はしない。
  • frontend/src/components/counts/CountsSummaryResults.tsx:行番号コードの撤去、私的セルの ドリルダウン抑止、公開列のソート維持。
  • frontend/src/components/counts/CountsSortHeader.tsx:禁止座標のソート抑止と伏字の理由表示。
  • frontend/src/pages/CountsResourcePage.tsx:専用エラーと、初回失敗後にも再実行できる状態。
  • frontend/src/locales/ja/counts.json:承認されたエラー文言。
  • frontend/src/locales/ain-Kana/counts.json:同じキーと未翻訳・日本語 fallback の管理。

テスト・テスト専用基盤

  • backend/spec/services/counts_pivot_security_spec.rb(新規):4権限、タグ寄与5、distinct、 changed_field、private group、NULL、整数順、ページ、座標探索、JSON/CSV。
  • backend/spec/requests/counts_download_spec.rb(新規):CSV/JSON の実 GET、HEAD、二重取得、 別セッション、失効、取消、ファイル不在、新しい discard。
  • backend/spec/services/counts_export_spec.rb:owner/job/attempt の ACK と Rack body の失敗。
  • backend/spec/models/history_access_spec.rb:旧 policy、外部タグ参照、記録済みタグ参照版。
  • backend/spec/requests/counts_table_spec.rb:専用軸数エラー。
  • frontend/src/components/counts/CountsExportProgress.test.tsx(新規):matching ACK、StrictMode、 再描画、開始受付失敗、通信断、独立期限、取消の競合・再試行、unmount、iframe 失敗。
  • frontend/src/components/counts/CountsSummaryResults.test.tsx(新規):伏字・理由・コピー・旧行番号。
  • frontend/src/components/counts/CountsControls.test.tsx:summary 行番号廃止と表示件数選択。
  • frontend/src/pages/CountsResourcePage.test.tsx:初期エラーからの再実行、サイト名付き title。
  • frontend/src/lib/api.test.ts:共有 CSRF 待機中の中断、iframe の解放・重複失敗通知。
  • frontend/src/lib/counts.test.ts:理由別エラーと任意のサーバー文字列を表示しないこと。
  • frontend/src/test/setup.ts:時刻が進む非同期 RAF と Canvas のテスト専用 fallback。
  • frontend/server.ssr.test.mjs:共通 title の既存 assertion を維持し canonical と秘匿を補足。

文書

  • docs/counts-exports.md:実装と一致する計数・ACK・権限・運用上の限界。
  • docs/counts-release-checklist.md:この一覧と利用者の検証・公開判定手順。

既知失敗の静的な確認結果

  • counts_table_spec.rb:TagVersion.names の auto_generated、script_code、aliases があることを 確認。新しい投稿タグ fixture にも schema 必須の sections を設定。
  • post_locale_filter_identity_spec.rb:検索文字列で基準集合を取得した後、tag_filters の 応答から references を定義して構造化 URL を作る修正を維持。
  • tag_description_wiki_spec.rb:first / last とも対象 ID に限定した delete_all を維持。
  • CountsResourcePage.test.tsx / HelpChangesPage.test.tsx:共有 RAF の同期・時刻0固定を修正。 Help の辞書応答は実 getHelpChanges が language を付ける契約も照合済み。
  • SSR title:現行ソースはサイト名を含む。dist を使うテストの assertion は削除していない。

上記はソース照合の結果であり、過去の失敗件数が0になったという実行結果ではない。 既知の未修正 P0 を残して GO とする判断はしていない。現時点の阻害事項は、ユーザーに よる MySQL・ブラウザー・worker/proxy を含む実検証がまだ行われていないことである。