Use this when you want to try design mode end-to-end and return to a clean baseline without merging test changes to main.
| Layer | What gets created | Affects production? |
|---|---|---|
| Browser | localStorage (welcome, contributor name), sessionStorage (agent session) |
No |
| Worker KV | session:*, run:*, ratelimit:*, merge-cooldown:* keys |
No |
| GitHub | Branch cursor/design/{sessionId} with style commits |
No, until merged |
| GitHub | Optional PR (if you submit for review) | Only if merged |
| Auto cleanup | Hourly cron deletes idle branches after ~1 hour | No |
| Cloudflare Pages | Preview deployment for the test branch | No (preview URL only) |
| Cursor | Cloud agent runs (bc-*) |
No |
Production (main / popped.dev) stays unchanged if you never merge a test PR.
- Open
https://popped.dev(or local dev with Worker running). - Complete welcome → enter a test contributor name.
- Turn on Design mode → click a resume element → send a style request.
- Wait for SSE status → preview iframe (branch alias URL).
- Optional: Submit for review → confirm PR opens on GitHub (do not merge if testing).
Pick how far back you want to go.
Clears agent session only. Keeps welcome dismissed and contributor name.
In DevTools → Console on popped.dev:
sessionStorage.removeItem("popped.dev:agent-session-id");
sessionStorage.removeItem("popped.dev:agent-id");
location.reload();Next chat creates a new cursor/design/{sessionId} branch.
localStorage.removeItem("popped.dev:welcome-dismissed");
localStorage.removeItem("popped.dev:contributor-name");
sessionStorage.removeItem("popped.dev:agent-session-id");
sessionStorage.removeItem("popped.dev:agent-id");
location.reload();Welcome modal and name step return.
From workers/agent-api (logged into Wrangler):
# List keys (optional)
npx wrangler kv key list --namespace-id=99cbe29666424381b3b1837e2551d237
# Delete all keys (nuclear reset for this namespace)
npx wrangler kv bulk delete --namespace-id=99cbe29666424381b3b1837e2551d237 <(npx wrangler kv key list --namespace-id=99cbe29666424381b3b1837e2551d237 | jq -r '.[].name')Or use the helper script:
./scripts/reset-test-state.sh --kvClears rate-limit blocks and orphaned session/run records.
Delete agent branches on GitHub (does not touch main):
./scripts/reset-test-state.sh --gitOr manually:
gh api repos/parse-nip/popped-dev/git/refs/heads --jq '.[].ref' | grep 'cursor/design' | while read ref; do
gh api -X DELETE "repos/parse-nip/popped-dev/git/refs/heads/${ref#refs/heads/}"
doneClose test PRs without merging:
gh pr list --head cursor/design --state open
gh pr close <number> --comment "Test PR — not merging"git checkout main
git pull
git revert -m 1 <merge-commit-sha>
git push origin mainPages will redeploy reverted main. This is the only way to “reset production” after a merge.
1. Level 2 (browser) → fresh UX
2. Run your test → design chat + preview
3. Wait ~1 hour (or Level 4) → auto/manual branch cleanup
4. Level 3 (KV) → clear rate limits if you hit 5/hour
5. Do NOT merge test PRs
Abandoned cursor/design/* branches are deleted automatically by the agent Worker cron (default: 1 hour of inactivity). Branches with open PRs are kept.
After Merge to main, the Worker enforces a 30-minute cooldown per IP before a new cloud agent can start (Cursor allows one agent per chat). The browser clears sessionStorage and shows a countdown in the header.
Same browser steps as Level 1–2. Restart wrangler dev if needed. Local KV uses the preview namespace (preview_id in wrangler.toml); production KV is separate.
cd workers/agent-api
npx wrangler kv key list --namespace-id=f93d5fe63942416a86c255c140616f7b # preview KVEasy: If you only preview on a branch and never merge, does popped.dev change for other visitors?
Medium: Why does clearing sessionStorage create a new Git branch on the next test?
Hard: You merged a test PR by accident. Which reset level fixes production?