Objective
Your mission
Run the ship/no-ship framework on your app and make a documented decision. Output: ship_decision.md.
You need: An app you're considering deploying.
Time: 20 minutes.
Step 1: learn the framework (5 min)
Shipping is reversible, first impressions aren't
You can always fix a deployed app — push a new version and the live site updates in minutes. But you can't undo a user's first impression. If their first experience is a broken app, they may never come back. Minimum viable security is non-negotiable: the app doesn't have to be perfect, but it must be secure and functional.
Red lights (DO NOT SHIP):
- Auth untested or broken
- RLS not enabled on all tables
- Hardcoded secrets in frontend code
- No error handling on critical paths
- Haven't tested full user flow end-to-end
Yellow lights (SHIP WITH CAUTION):
- Non-core features broken (core flow works)
- UI rough but functional
- No loading states on some components
- No privacy policy (if collecting data)
- No mobile testing
Green lights (READY TO SHIP):
- Core user flow works end-to-end
- Auth tested and working
- RLS enabled on all tables
- No hardcoded secrets
- Error handling on critical paths
- Tested on desktop + one mobile viewport
- Pre-deployment checklist passed
Step 2: run the 7-question framework (10 min)
Answer each question with evidence.
Write in your file:
## Ship/No-Ship Framework
### 1. Can users access other users' data?
Answer: [yes/no]
Evidence: [e.g., "Checked RLS on all 4 tables — all enabled" or "profiles table missing RLS"]
Verdict: [RED LIGHT / GREEN LIGHT]
### 2. Are secrets exposed in the code?
Answer: [yes/no]
Evidence: [e.g., "grep found no sk_, eyJ, or key= in src/" or "Found hardcoded API key"]
Verdict: [RED LIGHT / GREEN LIGHT]
### 3. Does the core flow work end-to-end?
Answer: [yes/no]
Evidence: [e.g., "Tested: signup → login → create habit → edit habit → logout — all work"]
Verdict: [GREEN LIGHT / RED LIGHT]
### 4. Are critical errors handled?
Answer: [yes/no]
Evidence: [e.g., "All supabase.from() calls have if(error) check" or "2 queries missing error check"]
Verdict: [GREEN LIGHT / RED LIGHT]
### 5. Have you tested on mobile?
Answer: [yes/no]
Evidence: [e.g., "Tested at 375px — layout works" or "Not tested yet"]
Verdict: [GREEN LIGHT / YELLOW LIGHT]
### 6. Is the UI rough but functional?
Answer: [yes/no]
Evidence: [e.g., "UI is clean and responsive" or "UI works but styling is minimal"]
Verdict: [GREEN LIGHT / YELLOW LIGHT]
### 7. Are non-core features broken?
Answer: [yes/no]
Evidence: [e.g., "All features work" or "Settings page crashes but core flow works"]
Verdict: [GREEN LIGHT / YELLOW LIGHT]
Step 3: check minimum viable security (3 min)
These 6 items MUST be in place before shipping:
Write in your file:
## Minimum Viable Security
1. RLS enabled on all tables: [yes/no]
2. No service_role key in frontend: [yes/no]
3. No hardcoded secrets: [yes/no]
4. Auth working and tested: [yes/no]
5. Error handling on critical paths: [yes/no]
6. Full user flow tested: [yes/no]
All 6 met: [yes/no]
If any are "no," you're not ready to ship. Fix them first.
Step 4: make the decision (2 min)
Write in your file:
## Decision
Red lights found: [list or "none"]
Red lights fixed: [list or "none — fixing now" or "N/A"]
Yellow lights found: [list]
Yellow lights plan: [when you'll fix each]
Final decision: [SHIP / SHIP WITH CAUTION / NO SHIP]
Reasoning: [2-3 sentences explaining your decision]
If shipping: Pre-deployment checklist (Phase 7) run? [yes/no]
Your app's settings page crashes, but the core flow works and RLS is on every table. Ship or not?
A broken non-core feature is a yellow light. Red lights are other users' data being reachable, exposed secrets or a broken core flow.