Changelog App — Testing Plan

URL: https://changelog.someshovels.com Date: 2026-02-03

Current State Summary

RouteStatusNotes
/ (landing)âś… 200Renders fully
/sign-inâś… 200Clerk auth form
/sign-upâś… 200Clerk registration
/dashboard (unauth)✅ 307 → sign-inCorrect redirect
/dashboard (auth)âś… 200Works for Adam
/changelog❌ 404BUG: missing tenant resolution
/changelog/feed.rss❌ 404Same bug
/changelog/feed.atom❌ 404Same bug
/changelog/feed.json❌ 404Same bug
/features❌ 404Expected — placeholder nav link
/pricing❌ 404Expected — placeholder nav link
/docs❌ 404Expected — 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 /dashboard while 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.rss returns valid XML
  • T3.7 Atom feed at /changelog/feed.atom returns valid XML
  • T3.8 JSON feed at /changelog/feed.json returns 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):

  1. Signs up at changelog.someshovels.com
  2. Auto-provisioned with a tenant + owner role
  3. Accesses /dashboard to create/manage entries
  4. Their public changelog lives at {tenant-slug}.changelog.someshovels.com (subdomain) OR a custom domain they configure

For the end user (reading a changelog):

  1. Visits the public changelog URL
  2. Sees published entries in reverse chronological order
  3. Can filter by type, platform, search
  4. Can subscribe via RSS/Atom
  5. 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.