Changelog App — Testing Plan
URL: https://changelog.someshovels.com Date: 2026-02-03
Current State Summary
| Route | Status | Notes |
|---|---|---|
/ (landing) | âś… 200 | Renders fully |
/sign-in | âś… 200 | Clerk auth form |
/sign-up | âś… 200 | Clerk registration |
/dashboard (unauth) | ✅ 307 → sign-in | Correct redirect |
/dashboard (auth) | âś… 200 | Works for Adam |
/changelog | ❌ 404 | BUG: missing tenant resolution |
/changelog/feed.rss | ❌ 404 | Same bug |
/changelog/feed.atom | ❌ 404 | Same bug |
/changelog/feed.json | ❌ 404 | Same bug |
/features | ❌ 404 | Expected — placeholder nav link |
/pricing | ❌ 404 | Expected — placeholder nav link |
/docs | ❌ 404 | Expected — placeholder nav link |
Root Cause of /changelog 404
The public changelog pages read x-tenant-slug or x-custom-domain headers to resolve which tenant’s entries to display. These headers are never set by the middleware. The fallback tries getTenantBySlug("demo") but no “demo” tenant exists. Fix: add tenant resolution to proxy.ts middleware.
Database State
- 2 tenants:
roberts-john-adam,roberts-john-adam-test - 0 changelog entries (none created yet)
- 0 product areas configured
Test Plan
Phase 1: Auth Flow
- T1.1 Visit
/sign-up→ create new account → should auto-provision user + tenant - T1.2 Visit
/sign-in→ sign in with existing account → redirects to/dashboard - T1.3 Visit
/dashboardwhile signed out → redirects to/sign-in - T1.4 After sign-in redirect, lands on
/dashboard(not stuck in loop)
Phase 2: Dashboard — Entry CRUD
- T2.1 Dashboard loads with entry count badges (All: 0, Draft: 0, etc.)
- T2.2 Click “New Entry” → form loads with all fields
- T2.3 Create a draft entry:
- Title: “Test Entry 1”
- Body: some markdown text
- Update type: “New Feature”
- Status: Draft
- → Saves successfully, appears in dashboard table
- T2.4 Create a published entry:
- Title: “Test Published Entry”
- Body: markdown with headings, lists, code blocks
- Update type: “Improvement”
- Status: Published
- Add tags, select platforms, set audiences
- → Saves with publishedAt timestamp
- T2.5 Edit an existing entry → changes persist
- T2.6 Filter by status tab (Draft, Published, etc.) → correct entries shown
- T2.7 Delete an entry (owner role) → removed from list
- T2.8 Search entries by title → filters correctly
Phase 3: Public Changelog (⚠️ BLOCKED — needs fix)
These tests require the tenant resolution fix in proxy.ts
- T3.1 Visit
/changelog→ shows list of published entries (not drafts) - T3.2 Click an entry →
/changelog/[slug]renders full markdown body - T3.3 Entry page has correct SEO meta tags (check page source)
- T3.4 Filter by update type on changelog page
- T3.5 Search works on changelog page
- T3.6 RSS feed at
/changelog/feed.rssreturns valid XML - T3.7 Atom feed at
/changelog/feed.atomreturns valid XML - T3.8 JSON feed at
/changelog/feed.jsonreturns valid JSON
Phase 4: Entry Form — Field Validation
- T4.1 Submit empty form → validation errors shown
- T4.2 Title auto-generates slug (check slug field updates)
- T4.3 Emoji picker works (if present)
- T4.4 Markdown body renders correctly when published
- T4.5 Scheduled status → date picker appears, scheduledFor is set
- T4.6 SEO fields (seoTitle, seoDescription, ogImageUrl) save correctly
Phase 5: Multi-Tenant / Permissions
- T5.1 Owner can delete entries
- T5.2 Viewer role cannot edit entries (read-only view)
- T5.3 Different tenants see different entries (no cross-tenant data leakage)
Phase 6: Edge Cases
- T6.1 Very long entry body (10K+ chars) saves and renders
- T6.2 Special characters in title/body (quotes, , emoji)
- T6.3 Duplicate slugs handled gracefully
- T6.4 Navigate to non-existent entry slug → 404 page
- T6.5 Rapidly creating/deleting entries → no race conditions
What People See: The User Journey
For the SaaS customer (who sets up their changelog):
- Signs up at changelog.someshovels.com
- Auto-provisioned with a tenant + owner role
- Accesses
/dashboardto create/manage entries - Their public changelog lives at
{tenant-slug}.changelog.someshovels.com(subdomain) OR a custom domain they configure
For the end user (reading a changelog):
- Visits the public changelog URL
- Sees published entries in reverse chronological order
- Can filter by type, platform, search
- Can subscribe via RSS/Atom
- Each entry has its own URL with SEO metadata
Current gap:
The public-facing changelog (/changelog) doesn’t work yet because tenant resolution isn’t wired into the middleware. This is the #1 fix needed.