Skip to main content

Acceptance Spec — Try before signup

Why (one paragraph)​

Before this, a pastor could not see a single thing made for THEIR passage until they had created an account and confirmed an email. Every one of the site's 783 "Generate" buttons sent a logged-out visitor to a page headed "Sign in to your account" — a wall, for someone who has no account. Google sends ~30 visitors a month and the founder intends to buy a few hundred more with ads (2026-09-23), so the few who arrive must see value before being asked for anything. The preview is the fast first stage of the real generator (the sermon skeleton), so it is honest about what the full product produces and costs a few cents.

Who / where​

A visitor to https://sermonwise.ai who is NOT signed in. The preview lives on the existing /sermon-outline-generator page (src/app/sermons/sermon-outline-generator/), whose form is already above the fold.

Expected output (Pastor Ruth test)​

1. Entry — no more sign-in wall​

  • A logged-out visitor who clicks ANY generator link (/sermons/app/new?..., built by buildGeneratorHref()) lands on /sermon-outline-generator, with the passage, tradition and theme they came with already filled in. Not the sign-in page.
  • A signed-in pastor who clicks the same link goes straight to the full wizard, exactly as today.
  • Every other signed-out bounce (dashboard, my sermons, a saved sermon) still goes to sign-in.

2. The preview​

  • Form: passage (required, ≤ 200 chars), tradition (the 17 lenses, required for the preview — tradition alignment is the product, and the prompt is built around it; prefilled when carried in), preaching style (expository by default). Button: "Preview my outline — free, no account".
  • While it works (target under 25 s): a progress line that changes at least once ("Reading the passage…" → "Shaping the outline…"). Never a blank spinner.
  • Result, rendered on the same page, clearly labelled "Preview":
    • the sermon title,
    • 3–5 sections, each with its heading, its scripture references, a one- or two-sentence summary, and the named illustration it will use (e.g. "Illustration: Corrie ten Boom forgiving her guard"),
    • one line naming what the full outline adds: full exposition for every section, each illustration written out with its source, applications, prayers, and Word/PDF export.
  • Nothing in the result may contain tool markup (<parameter, <invoke), "undefined", or an empty heading.

3. The ask — after value, not before​

  • Directly under the preview: "Get the full outline — free" (2 free outlines a month, no card). It goes to sign-up carrying the passage, tradition and theme through the existing next chain, so after confirming their email the pastor lands in the wizard with the same passage and tradition preselected — never an empty step 1.
  • A quieter link: "Already have an account? Sign in" (same next).

4. Limits (founder decision 2026-09-23)​

  • Per visitor: 3 previews per UTC day (keyed by IP, via the existing Supabase-backed rateLimit; its windows are fixed and clock-aligned, so "a day" is a UTC day, not rolling).
  • Site-wide: 100 previews per UTC day. This ceiling fails CLOSED: if the counter cannot be read, no preview is generated. (The shared rateLimit fails OPEN by design; it is acceptable for the per-visitor limit, never for the spending ceiling.)
  • When either limit is hit, the visitor sees a friendly message — "You've used today's free previews. Create a free account to write the full outline" — with the sign-up button. Never an error page, never a raw status code.
  • Input over the length caps, an unknown tradition, or an empty passage → a plain-language inline message; no model call is made.

5. What it must NOT do​

  • No database row tied to a person; no email asked for before the preview; nothing written to sermons or sermon_generation_usage (the preview must not consume the pastor's 2 free outlines).
  • No model call beyond the skeleton pass. No fallback to a different provider/model.
  • No change to the signed-in generator, the free/Pro caps, checkout, or FA-106 auth.
  • Robots: the preview API is not crawlable; the page stays indexable as today.

6. Measurement (so the ad test can be read)​

PostHog, anonymous distinct_id (merged into the Person at signup, as seo_cta_clicked is today): preview_requested (tradition, has_theme, landing_cluster), preview_shown (section_count, seconds), preview_limited (which limit), preview_signup_clicked. No passage text beyond the reference, no free text.

Acceptance tests (run on the REAL host, https://sermonwise.ai, after deploy)​

  1. Logged out: click "Generate" on a passage×tradition page → land on /sermon-outline-generator with passage + tradition filled in (sampled at two timepoints after hydration).
  2. Logged in: the same click → the wizard, unchanged.
  3. Logged out: /sermons/app (dashboard) → still the sign-in page.
  4. Preview: submit → title + 2–5 sections (typically 3–4; fewer than 2 usable = friendly retry, never a half-empty outline), each with heading, scripture, summary and a named illustration; no markup/"undefined"; sermons row count unchanged; the visitor's usage unchanged.
  5. 4th preview from one visitor in the same UTC day → friendly limit message + sign-up button, no model call.
  6. Ceiling: with the day's counter at 100 → friendly message, no model call; with the counter unreadable → no model call (fail closed).
  7. "Get the full outline — free" → sign-up → confirm email → wizard preselected with the passage and tradition.
  8. Mobile width (390 px): form, progress and result readable with no horizontal scroll.

Non-goals​

  • Showing a full outline without an account.
  • Saving the preview to the account after sign-up (the wizard regenerates it; a later improvement).
  • Changing the 2-free / 15-Pro caps, pricing, or checkout.