You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Purpose: this issue is the durable roadmap for TortoiseWolfe/ScriptHammer (the template). The body below is always-current — active arc, next 3 sessions queued, backlog. Comments are the audit trail. The prime prompt at the top tells a fresh Claude session to read this body first.
✅ Updated 2026-07-05. The basePath E2E hardening arc (#157/#158/#159) is COMPLETE — shipped as PRs #176/#177/#178. With it, the entire multi-session PAYMENTS → CI → DB → basePath backlog is fully drained. There is no queued engineering thread left; the next session is a clean product-direction pivot (user's call). See the latest comment for the audit trail.
Prime prompt (copy from here into a fresh Claude session)
/prep
Then check this issue (TortoiseWolfe/ScriptHammer#115) — its BODY is the current roadmap. Read everything below the prime prompt: active arc, next 3 sessions queued, backlog. The most recent COMMENT on this issue is the audit trail of what changed since the previous session.
Supplementary context (read if the body's roadmap references them or if the user's first message takes us off-roadmap):
1. `~/.claude/projects/-home-TurtleWolfe-repos-ScriptHammer/memory/MEMORY.md` — top of the index lists NON-NEGOTIABLE user preferences + recently-banked lessons. Read these first; they're binding.
2. `git log --oneline -20` — what shipped recently.
3. Open issues (`gh issue list --repo TortoiseWolfe/ScriptHammer --state open`) — most are tagged `template-v1-out-of-scope` (Eval-Backlog / Gap-Audit); treat those as deferred backlog. (RescueDogs-fork bugs once misfiled here were transferred to the fork — its roadmap is TortoiseWolfe/RescueDogs#5.)
4. Open PRs (`gh pr list --repo TortoiseWolfe/ScriptHammer --state open`).
Operational reminders from MEMORY.md / CLAUDE.md you'll trip over otherwise:
- ALWAYS prefer cleaner long-term solutions over quick hacks. Never offer a hack as the primary recommendation. Fix root cause, not symptoms.
- TWO local checkouts push to related repos: ~/repos/ScriptHammer → TortoiseWolfe/ScriptHammer (THIS roadmap), ~/repos/RescueDogs → TortoiseWolfe/RescueDogs (roadmap = RescueDogs#5). A fork session once overwrote this body by accident — confirm which checkout you're in before running /session-prime.
- CI honesty: a green job `conclusion` ≠ 0 flaky — `retries:2` masks retry-recovered failures. ALWAYS read per-job `flaky`/`failed` lines + `gh api .../commits/<sha>/check-runs` annotations before claiming clean or merging. (The lone `Test Report` annotation is a `notice` with the pass/skip count — that's clean.)
- Local live-acceptance E2E runbook (root-path build, serve on :3001 — the fn CORS allowlist —, SKIP_WEBSERVER+BASE_URL, seeded env-driven users): see [[lesson_e2e_live_acceptance_mechanics]]. basePath-served E2E (the PREFIXED sibling): [[lesson_basepath_e2e_project]] + `scripts/serve-basepath.sh` (`--project=basepath`).
- Edge fns read NEXT_PUBLIC_SUPABASE_* names the platform does NOT auto-inject — set as fn secrets via `pnpm supabase:secrets`. NEXT_PUBLIC_SITE_URL fn secret IS set (scripthammer.com). See [[lesson_stripe_clover_and_fn_env]].
- Pushing to `.github/workflows/**` needs SSH (gh HTTPS token lacks `workflow` scope). If the session's ssh-agent is empty, probe `/tmp/ssh-*/agent.*` sockets and export the one that authenticates.
- Supabase prod can DRIFT from the monolithic migration. Verify schema/triggers against the LIVE DB, never trust issue text or the migration file alone. Mgmt API DDL: build the JSON payload from a FILE. Edge-fn deploys are CLI-free via the Management API (see [[lesson_edge_function_deploy_management_api]]); regenerate types via GET /v1/projects/{ref}/types/typescript.
- CI mutex serializes E2E runs; PR E2E is chromium-only (firefox/webkit on push-to-main + cron, or the `full-e2e` PR label). A merge to main kicks off a full push-to-main E2E that holds the mutex, so the NEXT PR's E2E queues behind it (~30-60 min) — expected, not a hang. docs/`.claude`/`.specify`/`features`/md changes skip E2E (paths-ignore). `--admin` merge is OK when all gates+smoke are green and only unrelated chromium-gen shards (or a documented unrelated retry-recovered flake) remain.
- The container's `.env` has `NEXT_PUBLIC_BASE_PATH=/ScriptHammer`, so any local build/test regenerates `public/manifest.json` with the prefix — a build side-effect. REVERT it before every commit; it is never part of a PR.
Then either start on the roadmap's "next session should" item, or ask the user if they want to deviate.
Stop reading here when priming — everything below is the roadmap
Roadmap
Active arc
VERIFICATION HANDOFF + PICK THE NEXT PRODUCT DIRECTION — the payment/E2E backlog (#188 → #189-197) shipped and closed this session. Two open issues (#188, #212) are now in a human-verification phase handed to collaborator schlajo; once those close, the tracked eng backlog is fully drained and the next arc is a user product call.
Status: payment backlog drained; 2 issues awaiting schlajo's verification; 1 docs PR open. Open issues: #188 (confirm backlog drained — REOPENED after a premature close, awaiting independent verification), #212 (label/input gap — needs rendered screenshots; code audit says fork-only), #205 (flaky-watch marker), #115 (this roadmap). Open PR: #213 (schlajo verification runbook, docs-only). The 9 payment/CI tickets (#189-197) all merged with main green across chromium+firefox+webkit (final commit ccdc86c).
Why: with verification closed, this is the clean point to pick a new feature direction. A driving app (e.g. HatCoatAndBoots) or a new template capability both qualify.
First action: ask the user what the next product goal is, then run the SpecKit/PRP flow for anything >1 day.
Why: two features are code-complete and inert pending a user-supplied key — zero engineering, just set the secret + verify activation.
First action: once the user provides a Sentry DSN and/or Resend key, set it (Actions secret / Vault) and confirm the feature activates live.
Backlog (no scheduled position)
Implement group message end-to-end encryption (finish the 5 message-service stubs) #182 — group message E2E encryption — SHIPPED (PR feat(messaging): #182 implement group message end-to-end encryption #185, b1ee9ad, 2026-07-05). Wired the group key into all 5 message-service stubs (send/edit/decrypt keyed by per-message key_version; archive/unarchive via conversation_members.archived) + fixed 3 pre-existing group-creation RLS gaps that made groups unreachable (conversations INSERT+SELECT, conversation_members SELECT creator-clause) — all applied live + verified. Group E2E is skip-tolerant (heavy Argon2/ECDH); logic covered by unit tests. See [[lesson_group_messaging_rls_and_e2e]].
Follow-up (small): deterministic group send/decrypt E2E — the current group E2E skips on slow runners (UI-creation does in-browser key distribution >90s). A seed-group-server-side variant (replicating ECDH key distribution in the fixture) would give a non-skipping send/decrypt test. Nice-to-have.
Follow-up (small): deterministic group send/decrypt E2E — see the group-messaging note above; seed-group-server-side variant so it doesn't skip on slow runners. Nice-to-have.
Reusable substrate (on main):scripts/serve-basepath.sh + the basepath Playwright project (basePath-served E2E, E2E: add a basePath-enabled Playwright project so Pages project-site bugs are catchable #157); getInternalUrl/getRedirectUrl basePath helpers; the DISABLE_BASE_PATH E2E harness switch (Upstream the DISABLE_BASE_PATH E2E harness switch from RescueDogs #158); pnpm supabase:secrets (Vault, CLI-free); the live-acceptance runbook; embed-theme.ts + useEmbedThemeColor; EmailProviderHealth; the unified /payment hub (?tab= deep-link); idx_subscriptions_one_live_per_user dup-guard; PaymentQueuePanel; useConnections realtime-badge pattern; startFormQueueFallback. New this session:usePaymentResultsRealtime (additive onBatch?/onEvent? callbacks); aggregate-daily.ts + PaymentTrendChart; the retry-subscription edge fn (deployed, dunning-schedule advance); paginated listUsers throughout global-setup.ts/test-user-factory.ts (the >50-users gate fix); seedIsolatedSubscription/openSubscriptionsAs fixtures; cross-browser E2E patterns (offline-event dispatch for FF/WebKit, defineProperty for WebKit navigator.storage).
Next session should
Close out the schlajo verification handoff, then ask the user for a new product direction. First: check whether schlajo accepted the repo invite (gh api repos/TortoiseWolfe/ScriptHammer/collaborators/schlajo) — if yes, assign #188 + #212 to him (gh issue edit … --add-assignee schlajo); merge PR #213 (docs runbook); act on any verification findings. Once #188/#212 resolve, the tracked eng backlog is fully drained (payment/CI/DB/basePath + #181 review + both follow-ups all shipped), and the next arc is a user product call — a new feature, a driving-app pull (HatCoatAndBoots), or flipping Sentry #45 / Resend live with a user-supplied key. Confirm the goal before inventing an arc.
Why this exists
Sessions end. The next session starts cold. Without a single canonical "what was the world like when we last stopped + here's what to do next" pointer, the new model wastes context wandering. This issue is the one URL to paste into a fresh chat. The BODY carries the plan; comments form the audit trail.
How to maintain
Run /session-prime at session-end. The skill rewrites the body to reflect what changed in the roadmap and appends a comment with the audit trail. This issue is the TEMPLATE's roadmap — RescueDogs-fork sessions must use TortoiseWolfe/RescueDogs#5 instead.
If the prime prompt itself becomes stale (memory file renamed, project changed shape), edit the body's prime-prompt block directly.
Purpose: this issue is the durable roadmap for TortoiseWolfe/ScriptHammer (the template). The body below is always-current — active arc, next 3 sessions queued, backlog. Comments are the audit trail. The prime prompt at the top tells a fresh Claude session to read this body first.
Prime prompt (copy from here into a fresh Claude session)
Stop reading here when priming — everything below is the roadmap
Roadmap
Active arc
VERIFICATION HANDOFF + PICK THE NEXT PRODUCT DIRECTION — the payment/E2E backlog (#188 → #189-197) shipped and closed this session. Two open issues (#188, #212) are now in a human-verification phase handed to collaborator
schlajo; once those close, the tracked eng backlog is fully drained and the next arc is a user product call.Status: payment backlog drained; 2 issues awaiting schlajo's verification; 1 docs PR open. Open issues: #188 (confirm backlog drained — REOPENED after a premature close, awaiting independent verification), #212 (label/input gap — needs rendered screenshots; code audit says fork-only), #205 (flaky-watch marker), #115 (this roadmap). Open PR: #213 (schlajo verification runbook, docs-only). The 9 payment/CI tickets (#189-197) all merged with
maingreen across chromium+firefox+webkit (final commitccdc86c).Remaining tasks (in suggested order):
docs/verification/schlajo-tickets.md+ [[pending_schlajo_assignment]].Blockers / decisions needed:
324802601, Read). Everything else (Cursor prompts, runbook) is already in place.Next 3 sessions queued
Nothing is force-ordered. In rough priority, the next sessions should pick from:
Session +1: Close out the verification handoff (#188, #212, PR #213)
gh api repos/TortoiseWolfe/ScriptHammer/collaborators/schlajo); if yes, assign Track remaining skipped E2E placeholders — run when unblocked or delete #188+UX: add horizontal gap between form labels and inputs (Account Settings, auth forms) #212; merge PR docs(verification): schlajo verification runbook for #188 + #212 #213; act on any verification findings he posted.Session +2: New product arc (user-directed)
Session +3: Provider-supplied enablement (Sentry DSN #45, RESEND_API_KEY)
Backlog (no scheduled position)
b1ee9ad, 2026-07-05). Wired the group key into all 5 message-service stubs (send/edit/decrypt keyed by per-messagekey_version; archive/unarchive viaconversation_members.archived) + fixed 3 pre-existing group-creation RLS gaps that made groups unreachable (conversations INSERT+SELECT, conversation_members SELECT creator-clause) — all applied live + verified. Group E2E is skip-tolerant (heavy Argon2/ECDH); logic covered by unit tests. See [[lesson_group_messaging_rls_and_e2e]].oauth_statesCSRF layer — SHIPPED (PR refactor(auth): #183 remove the unused custom oauth_states CSRF layer #184,4ad49ca, 2026-07-05). Deleted the dead module+test, edited the monolith, live-dropped the prod table (0 rows, 4 public policies), regen types. Also corrected the OAuth blog +OAuthButtonscomment: the app usesflowType: 'implicit'(static export), CSRF = Supabase's OAuth2state— NOT PKCE (old comments were wrong)..md(surfaced during refactor(auth): #183 remove the unused custom oauth_states CSRF layer #184, which only re-synced the OAuth post). Standalonepnpm run generate:blogresync + commit; small, mechanical.NEXT_PUBLIC_SENTRY_DSNin.env+ Actions secret. Monitoring activates post-consent with zero code change.retry-subscriptionedge fn (Subscription retry / dunning: 'Retry payment now' + edge function #195/feat(payment): #195 subscription dunning — Retry-payment-now + retry-subscription edge fn #210), Keep-Alive pnpm-order CI fix (CI: Supabase Keep-Alive 'prime-supabase' job fails — pnpm not on PATH (action-setup v6) #196/fix(ci): #196 keep-alive — install pnpm before setup-node (pnpm not on PATH) #211), and the keystone unpaginated-listUsersfix (CI: scheduled full-matrix E2E flakes — shared test users deleted mid-run by racing cleanup #197/fix(e2e): #197 paginate admin listUsers — real root cause of 'test user not found' #202 — "test user not found" was pagination, NOT a race). All merged;maingreen on all 3 browsers @ccdc86c. What remains skipped is 53 runtime guards + 12 permanent creds/feature markers (Stripe/PayPal live-Checkout) — NOT debt.schlajo(Read invite, not yet accepted). Cursor prompts on both issues +docs/verification/schlajo-tickets.md(PR docs(verification): schlajo verification runbook for #188 + #212 #213). Assign once he accepts: [[pending_schlajo_assignment]].oauth-csrf.spec.ts:78webkit (live github.com nav),messaging-scroll.spec.ts:292, blog-TOC / color-contrast / message-editing a11y. All retry-recover; harden if noisy. Tracked as a marker, not work.scripts/serve-basepath.sh+ thebasepathPlaywright project (basePath-served E2E, E2E: add a basePath-enabled Playwright project so Pages project-site bugs are catchable #157);getInternalUrl/getRedirectUrlbasePath helpers; theDISABLE_BASE_PATHE2E harness switch (Upstream the DISABLE_BASE_PATH E2E harness switch from RescueDogs #158);pnpm supabase:secrets(Vault, CLI-free); the live-acceptance runbook;embed-theme.ts+useEmbedThemeColor;EmailProviderHealth; the unified/paymenthub (?tab=deep-link);idx_subscriptions_one_live_per_userdup-guard;PaymentQueuePanel;useConnectionsrealtime-badge pattern;startFormQueueFallback. New this session:usePaymentResultsRealtime(additiveonBatch?/onEvent?callbacks);aggregate-daily.ts+PaymentTrendChart; theretry-subscriptionedge fn (deployed, dunning-schedule advance); paginatedlistUsersthroughoutglobal-setup.ts/test-user-factory.ts(the >50-users gate fix);seedIsolatedSubscription/openSubscriptionsAsfixtures; cross-browser E2E patterns (offline-event dispatch for FF/WebKit,definePropertyfor WebKitnavigator.storage).Next session should
Close out the schlajo verification handoff, then ask the user for a new product direction. First: check whether schlajo accepted the repo invite (
gh api repos/TortoiseWolfe/ScriptHammer/collaborators/schlajo) — if yes, assign #188 + #212 to him (gh issue edit … --add-assignee schlajo); merge PR #213 (docs runbook); act on any verification findings. Once #188/#212 resolve, the tracked eng backlog is fully drained (payment/CI/DB/basePath + #181 review + both follow-ups all shipped), and the next arc is a user product call — a new feature, a driving-app pull (HatCoatAndBoots), or flipping Sentry #45 / Resend live with a user-supplied key. Confirm the goal before inventing an arc.Why this exists
Sessions end. The next session starts cold. Without a single canonical "what was the world like when we last stopped + here's what to do next" pointer, the new model wastes context wandering. This issue is the one URL to paste into a fresh chat. The BODY carries the plan; comments form the audit trail.
How to maintain
Run
/session-primeat session-end. The skill rewrites the body to reflect what changed in the roadmap and appends a comment with the audit trail. This issue is the TEMPLATE's roadmap — RescueDogs-fork sessions must use TortoiseWolfe/RescueDogs#5 instead.If the prime prompt itself becomes stale (memory file renamed, project changed shape), edit the body's prime-prompt block directly.