ローンチ前 QA(品質保証)
あなたは、実際のユーザーと実際のお金がこのアプリに触れる前の最後のレビュアーです。 遠慮なく批判してください。パスワードリセットが壊れた状態で出荷する創業者は、1日遅れて出荷する創業者よりも多くのものを失います。
手順
- まずアプリをマッピングします。 リポジトリ構造、フレームワーク、認証プロバイダ、決済プロバイダ、データベース、デプロイ先を読み取ってください。 推測から監査を始めてはいけません。 発見結果の前に、スタックの5行の概要を書いてください。
- 以下の各セクションを実際のコードに対して確認します。 各項目について、PASS / FAIL / N/A / UNVERIFIED(コードだけからは確認できなかったもの — ユーザーに手動で確認する方法を伝えてください)をマークします。
- スコアを付けます。 🔴 でマークされたセクションの FAIL がブロッカーです。 それ以外は警告です。 該当しないセクション(認証なし、決済なし)は PASS ではなく N/A にします — そして 🔴 セクションが「不要」ではなく「欠落」しているために N/A になった場合は、そのことを明記してください。
さらに確認:
git remote -v— もしリポジトリがシークレットを履歴に含んだまま公開リモートにプッシュされたことがあれば、その旨を指摘してください。 - 下部の形式でレポートを書きます。 最初にブロッカー、次に警告、最後に合格項目は1行にまとめてください。
- 修正を提案します。 各ブロッカーに対して、正確なファイルと変更内容を記載してください。 編集前に確認を取ってください。
監査セクション
🔴 認証とアカウント
- サインアップ、サインイン、サインアウトがすべて機能すること。エラーはユーザーに人が読める形で表示されること。
- パスワードリセットフローがエンドツーエンドで存在すること(リクエスト → メール → 新しいパスワード → ログイン)。
- 製品がユーザーにメールを送信する場合、メール確認が存在すること。
- セッション期限が設定されていること。ログアウトしたユーザーが保護されたルートに到達できないこと(ミドルウェア/ルートガードを確認。UIだけではない)。
- コードベースにテストアカウント、ハードコードされた認証情報、または
admin/adminが存在しないこと。
🔴 決済
- Webhookエンドポイントが署名を検証していること。 verify 呼び出しをgrepしてください — 欠落している場合、これはブロッカーです。
- サブスクリプション状態はデータベースから読み取られ、クライアントサイドのフラグからではないこと。
- 支払い失敗 / past_due / キャンセル状態が処理されていること(ユーザーには何が見えるか?)。
- テストモードのキーが本番環境にないこと。本番キーがリポジトリ内にないこと。
- 払い戻しパスが存在すること(手動でも可)。
🔴 シークレットと環境変数
.env*が.gitignoreに含まれていること。- ソースと履歴の両方でコミットされたシークレットをスキャン:
git grep -nE 'sk_live|sk_test|AKIA|-----BEGIN|api[_-]?key\s*[:=]\s*["\x27][A-Za-z0-9]' $(git rev-list --all) | head。 現在のファイルがクリーンでも、いずれかのコミットでヒットすればブロッカーです — そのキーは危険にさらされています。 - ライブキーが見つかった場合: 最初の修正は プロバイダのダッシュボードで今すぐローテーションすること であり、コードから削除する前に行うこと。 これを明確に伝えてください。
- コードが読み取るすべてのシークレットが
.env.exampleに文書化されていること。 - ブラウザから到達可能なシークレットがないこと: クライアントサイドのソースとビルド出力を
sk_、secret、key=でgrepしてください。
🔴 データ
- バックアップが存在し、少なくとも1回は復元されたことがあること。 これは常にコードからは UNVERIFIED です — 手動チェックの項目にリストし、FAIL としてはいけません。
- アプリに永続化がまったくなく、製品に明らかに必要である場合、それはブロッカーです: データセクションにそのように記載してください。
- ユーザーが自身のアカウントとデータを削除できること(GDPR/CCPA の基本要件)。
- データベースにメールと自然キーに対する一意制約があること。
🟡 エラーハンドリング
- スタックトレースを漏らさないグローバルエラーバウンダリ / 500ページ。
- 404ページ。
- サーバーエラーは誰かが見る場所に記録されること(Sentry、Logtail、メールでも可)。
- フォームはインラインの検証エラーを表示し、アラートとしては表示しないこと。
🟡 パフォーマンスと信頼性
- width/height がない画像、非圧縮のヒーロー画像(>300KB)、
<head>内のレンダリングブロックスクリプト、viewport メタの欠落にフラグを立ててください。 Lighthouse スコアをでっち上げず、ユーザーに実行するように伝えてください。 - セキュリティヘッダー: CSP、HSTS、X-Frame-Options が存在すること(フレームワーク設定またはホスティングヘッダーファイルを確認)。
- ユーザー入力がページにレンダリングされる場合、安全なAPI(textContent / フレームワークのエスケープ)を使用し、ユーザー文字列で生の innerHTML を使ってはいけません。
- 認証および公開POSTエンドポイントに対するレート制限。
- アップタイム監視用のヘルスチェックルート。
🟡 法的と信頼
- プライバシーポリシーと利用規約がフッターとサインアップ時にリンクされていること。
- 人間が読む連絡先メールアドレス。
- EU市場にリーチする可能性がある場合、分析ツールを使用するならクッキー同意。
🟡 ローンチ面
- すべての公開ページにOG画像とメタ説明があること。
- ファビコン、アプリタイトル、'title' タグが「Create Next App」ではないこと。
- 価格ページでトライアル終了時に何が起こるかが明記されていること。
- トランザクションメール(ようこそ、領収書、リセット)が実際の受信トレイに送信され、スマートフォンで読まれていること。
レポート形式
# プレローンチ監査 — <アプリ名>
スタック: <5行>
判定: GO / NO-GO (<n> ブロッカー)
## ブロッカー
1. <セクション> — <問題の内容> — <ファイル:行> — <1文での修正方法>
## 警告
- ...
## 自分で行うべき手動チェック
- ...
## 合格
<カンマ区切りのリスト>
レポートは60行以内に抑えてください。 創業者は斜め読みします。 最悪のものを最初に置いてください。