Close the feedback loop for an already-live app: inspect production signals, prioritize top issues, fix, verify live, repeat. Use when "post-launch polish", "fix the top production issues", "iterate on feedback", or "what should I fix next after launch?". One named bug → workflow-fix-and-ship.
Scanned 9/11/2026
Install to Claude Code
npx -y skills add kensaurus/cursor-kenji --skill iterate-post-launch --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Iterate Post Launch?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/kensaurus-iterate-post-launch)More formats (shields.io, HTML) on the badges page.
---
name: iterate-post-launch
description: >
Close the feedback loop for an already-live app: inspect production
signals, prioritize top issues, fix, verify live, repeat. Use when
"post-launch polish", "fix the top production issues", "iterate on
feedback", or "what should I fix next after launch?". One named bug →
workflow-fix-and-ship.
license: MIT
---
# iterate-post-launch — Production Signal → Prioritised Fix Loop
**Degree of freedom: MIXED.** Triage and sprint plan `[HIGH freedom]`;
signal pulls, confirmation-before-edit, and live verify
`[LOW freedom — run exactly]`.
**You shipped. That is the beginning, not the end.** Real users hit real paths
you did not test. Sentry, Supabase logs, and the live UI tell you exactly what
to fix next — if you know how to read them. This skill turns those signals into
a ranked, actionable improvement plan and then implements it.
> **Plan → Signal → Triage → Fix → Verify.** Do not guess what to improve.
> Let production data point to the highest-impact work first.
**Before ANY browser action, read `protocol-browser-anti-stall`.**
## How to reason
1. **Observe** — Sentry, Supabase logs/advisors, and a headed walkthrough in parallel
2. **Interpret** — impact × effort from those signals, not a guessed redesign
3. **Classify** — Critical / High / Medium / Low; present the sprint before editing
4. **Verify** — live Playwright (or the failing query) before resolving the Sentry issue
## Worked example
> **Observe:** Sentry `TypeError` on `/checkout` 2.4k events / 14d; advisor missing index on `orders(user_id)`; live empty cart has no message.
> **Interpret:** checkout crash blocks paying users — outranks the index and the empty state.
> **Classify:** Critical = crash fix; High = index; Medium = empty-cart copy. Present that sprint; do not start a homepage rewrite.
> **Verify:** headed `-s=post-launch` replay of checkout → 2xx; then `sentry:update_issue` resolved.
## Self-critique before reporting
- **Signal-backed** — every fix traces to Sentry, logs, advisors, or the walkthrough
- **Live before resolve** — Playwright or the query, then Sentry resolved
- **Rows ask first** — asked-for schema ships; DELETE/UPDATE on real rows waits
- **Right owner** — one named bug → `workflow-fix-and-ship`
---
## Phase 0: Context [LOW freedom — run exactly]
Read the stack before pulling any signals:
```
package.json → framework, Sentry SDK, Supabase client version
.env.local → SENTRY_ORG, SENTRY_PROJECT, SUPABASE_PROJECT_ID (name only)
README → any known issues the team is tracking
```
Confirm available MCPs: `sentry`, `supabase`,
`firecrawl`, `playwright`.
---
## Phase 1: Pull production signals [LOW freedom — pull these sources]
Run all signal sources in parallel, then synthesise.
### 1a. Sentry — errors and performance
Look up the tool schemas first.
```json
sentry:search_issues
{
"organizationSlug": "<ORG>",
"query": "unresolved issues last 14 days sorted by frequency",
"projectSlugOrId": "<PROJECT>",
"regionUrl": "<REGION_URL>",
"limit": 25
}
```
For each top-5 issue, get root-cause analysis:
```json
sentry:analyze_issue_with_seer
{
"organizationSlug": "<ORG>",
"issueId": "<ISSUE_ID>",
"regionUrl": "<REGION_URL>"
}
```
Record per issue: title, frequency (events/users), first/last seen, component.
### 1b. Supabase — query performance and API failures
```json
supabase:get_logs
{
"project_id": "<PROJECT_ID>",
"service": "api"
}
```
```json
supabase:get_logs
{
"project_id": "<PROJECT_ID>",
"service": "postgres"
}
```
```json
supabase:get_advisors
{
"project_id": "<PROJECT_ID>"
}
```
Flag:
- API: repeated 5xx, slow responses (>1 s), CORS errors, RLS denies
- Postgres: sequential scans on large tables, missing indexes, bloated RLS policies
- Advisors: ERROR-level items = immediate action; WARN = scheduled
### 1c. Live UX walkthrough (Playwright)
Navigate the app's 3–5 most-used flows as a real user. Look for:
- Anything that is obviously broken, slow, or confusing
- Empty/error states that have no message
- Console errors and network failures during normal use
```bash
PW="npx --yes @playwright/cli@latest"
$PW -s=post-launch open --headed "<app-url>" # then `goto` each primary page
$PW -s=post-launch console # capture errors
$PW -s=post-launch requests # capture 4xx/5xx
$PW -s=post-launch screenshot --filename ".playwright-mcp/post-launch-<page>.png"
```
### 1d. Research best practices for flagged areas
For each signal category that surfaced issues:
```json
firecrawl:firecrawl_search
{
"query": "<framework> <issue-type> fix best practices 2026",
"limit": 3,
"sources": [{ "type": "web" }]
}
```
---
## Phase 2: Triage — rank by impact × effort [HIGH freedom]
Build an improvement backlog. For each finding:
| Field | What to fill |
|-------|-------------|
| Source | Sentry / Supabase logs / Advisor / Live walkthrough |
| Finding | One sentence describing what is wrong |
| Affected users | High (blocks most users) / Medium (hits some) / Low (edge case) |
| Effort | S (< 1 h) / M (half day) / L (multi-day, consider splitting) |
| Priority | Critical / High / Medium / Low |
**Priority mapping**:
- Critical: production crash or data loss affecting real users
- High: broken feature, significant UX failure, missing index on hot query
- Medium: degraded experience, slow query, console error not shown to user
- Low: cosmetic issue, info-only log noise, minor UX annoyance
Sort the backlog: Critical first, then by impact ÷ effort (quick wins above hard ones).
---
## Phase 3: Plan the improvement sprint [HIGH freedom]
For the top 5–10 items, map each to specific code:
```
Improvement: [title]
Root cause: [1 sentence]
Fix: [file path + what to change]
Verify: [how to confirm it is fixed]
Risk: [low / medium — explain if medium+]
```
Present the plan to the user. Get confirmation before making changes.
---
## Phase 4: Implement fixes [LOW freedom — surgical]
Work through the approved list one by one, following
`workflow-coding-discipline` principles:
1. Read the file before editing. Understand the existing pattern.
2. Make the surgical change. No refactoring unrelated code.
3. `ReadLints` after each edit. Fix introduced linter errors.
4. For Supabase schema fixes (missing index, RLS policy):
- Deploy via MCP: `apply_migration` for DDL, `execute_sql` for data fixes
- Write the matching versioned migration file under `supabase/migrations/`
- Verify the object exists: query `information_schema` / `pg_indexes` / `pg_policies`
---
## Phase 5: Verify each fix [LOW freedom — run exactly]
After each fix, drive the specific flow that was broken:
```bash
$PW -s=post-launch goto "<affected-page>"
$PW -s=post-launch snapshot # confirm page renders correctly
# … reproduce the original scenario as a real user …
$PW -s=post-launch console # green (no new errors)
$PW -s=post-launch requests # 2xx where it was failing
$PW -s=post-launch screenshot --filename ".playwright-mcp/fixed-<flow>.png"
```
For Supabase fixes, re-run the failing query with `execute_sql` and confirm
the performance improvement or policy correction.
For Sentry issues: mark as resolved only after live verification confirms the
fix, not before:
```json
sentry:update_issue
{
"organizationSlug": "<ORG>",
"issueId": "<ISSUE_ID>",
"status": "resolved",
"regionUrl": "<REGION_URL>"
}
```
---
## Phase 6: Improvement report [LOW freedom — this shape]
```markdown
## Post-Launch Improvement Report — [App] — [Date]
### Signal sources checked
- Sentry: [issue count, date range]
- Supabase logs: [service, date range]
- Supabase advisors: [ERROR count / WARN count]
- Live walkthrough: [pages tested]
### Improvements implemented
| # | Source | Finding | Fix (file) | Verified |
|---|--------|---------|-----------|---------|
| 1 | Sentry | [error] | [file:line] | ✅ |
### Deferred (needs more investigation or is out of scope)
| # | Finding | Why deferred | Recommendation |
|---|---------|-------------|----------------|
### Remaining Sentry noise
- [issues that are known / won't-fix / need tracking ticket]
### Before / after summary
- Errors resolved: [count]
- Queries improved: [count, estimated ms saved]
- UX issues fixed: [count]
```
---
## Guardrails
- **No speculative improvements** — only act on signal from production data.
- **Ask before deleting or restructuring** — fixes should be surgical.
- **Schema the user asked for ships; DELETE/UPDATE on real rows asks first.**
- **Re-test every fix live** — a fix is not done until Playwright confirms it.
## Related
- `audit-analytics` — prove the funnel events this loop iterates on actually fire
- `test-red-team` / `deploy-verify` / `debug-sentry-monitor` / `test-playwright`
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!