{"id":"bumpgrade-admin-user-journeys-source-data","source":"d1","loadError":null,"proofSummary":{"totalJourneys":43,"testedJourneys":43,"partialJourneys":0,"blockedJourneys":0,"notRunJourneys":0,"screenshotLinks":320,"ciLinks":64,"latestTestedAt":"2026-05-26T22:00:00.000Z","journeySpecificProofs":16,"featureInheritedProofs":27,"defaultProofs":0,"inheritedProofs":27},"journeys":[{"id":"journey-prospect-explores-launch-marketing","title":"Prospect explores Bumpgrade launch features","featureId":"feature-public-feature-catalog","featureStatus":"live","issueNumbers":[6,14,15,16,17,18,19,217,226,234],"primaryUser":"Publisher invited to try Bumpgrade","userGoal":"Understand what Bumpgrade can do for a launch without needing to decode project management notes.","sourceEvidence":["https://bumpgrade.com/","https://bumpgrade.com/features","https://bumpgrade.com/features/email-campaigns","https://bumpgrade.com/features/order-bump","https://bumpgrade.com/features/source-data","https://github.com/markitics/bumpgrade/issues/217","https://github.com/markitics/bumpgrade/issues/226","https://github.com/markitics/bumpgrade/issues/234","https://github.com/markitics/bumpgrade/pull/233","https://github.com/markitics/bumpgrade/actions/runs/26168608279"],"happyPath":["Open the homepage and understand Bumpgrade as a publisher launch system.","Open /features to see customer-facing feature groups organized by launch job.","Open a dedicated feature page such as /features/email-campaigns or /features/order-bump.","Follow feature examples or related launch previews when the feature fits the offer.","Open /pricing to understand invite access and payment options."],"edgeCases":["Live billing must not be promoted until live Stripe smoke evidence is linked.","Feature pages must distinguish launch-preview availability from planned parity work.","Admin and implementation details should not be the public marketing story."],"agentAccess":"Agents can read /features/source-data and feature detail pages; public copy changes still need issue evidence, route proof, or source-data support.","validation":["Issue #217 adds launch marketing pages, dedicated feature routes, sitemap entries, screenshots, and CI wiring.","Issue #226 removes internal status-board language from public launch copy and refreshes pricing/domain readiness proof.","Issue #234 refreshes launch user-journey proof with the latest PR #233 CI and issue #226 screenshot links.","Playwright smoke tests cover homepage, /features, dedicated feature pages, /pricing, and source-data routes."],"sortOrder":8,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T14:31:00.000Z","environment":"Local launch branch, GitHub Actions CI, merged PRs #218 and #233, deployed screenshots, and production route smoke.","method":"Public route smoke tests, sitemap checks, feature source-data checks, production visible-text smoke, and launch screenshots.","summary":"Homepage, feature index, feature detail, pricing, account setup, and source-data routes have route, CI, and screenshot proof for publishers evaluating Bumpgrade.","ciLinks":[{"label":"PR #218 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26155451076","kind":"ci"},{"label":"PR #233 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26168608279","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Homepage issue #226 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-226-homepage.png","kind":"screenshot"},{"label":"Features issue #226 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-226-features.png","kind":"screenshot"},{"label":"Order bump issue #226 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-226-order-bump.png","kind":"screenshot"}],"validationLinks":[{"label":"Feature source data","url":"https://bumpgrade.com/features/source-data","kind":"source-data"},{"label":"PR #218","url":"https://github.com/markitics/bumpgrade/pull/218","kind":"pr"},{"label":"PR #233","url":"https://github.com/markitics/bumpgrade/pull/233","kind":"pr"},{"label":"Issue #217","url":"https://github.com/markitics/bumpgrade/issues/217","kind":"issue"},{"label":"Issue #226","url":"https://github.com/markitics/bumpgrade/issues/226","kind":"issue"},{"label":"Issue #234","url":"https://github.com/markitics/bumpgrade/issues/234","kind":"issue"}],"notes":["This proof is for launch marketing readiness; feature-specific billing and provider-send claims still require their own evidence."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-prospect-explores-launch-marketing","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-compare-bumpgrade-to-clickfunnels","title":"Compare Bumpgrade to ClickFunnels","featureId":"feature-compare-source-data","featureStatus":"live","issueNumbers":[5],"primaryUser":"Indiepreneur evaluating funnel software","userGoal":"Decide whether Bumpgrade is the right future platform compared with established funnel tools.","sourceEvidence":["compare:clickfunnels","https://bumpgrade.com/compare/clickfunnels-alternative"],"happyPath":["Open /compare.","Choose the ClickFunnels alternative page.","Read Bumpgrade stance, competitor strengths, and planned parity gaps.","Check /compare/source-data before citing volatile claims."],"edgeCases":["Competitor pricing may change.","Bumpgrade planned items are not live until feature evidence changes."],"agentAccess":"Agents can read /compare/source-data and cite source IDs; agents must refresh volatile competitor facts before user-facing claims.","validation":["Playwright smoke tests cover /compare and every alternative page.","Live edge checks returned 200 for comparison routes."],"sortOrder":10,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T17:20:00.000Z","environment":"GitHub Actions CI, merged PR #243, deployed screenshots, and production comparison route smoke.","method":"Comparison hub route smoke, every alternative-page route smoke, source-data inspection, and marketing-copy visible-text scan.","summary":"The comparison journey has current proof for /compare, the ClickFunnels alternative page, competitor-source metadata, and public copy that avoids internal implementation language.","ciLinks":[{"label":"PR #243 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26175118817","kind":"ci"},{"label":"Main CI after PR #243","url":"https://github.com/markitics/bumpgrade/actions/runs/26175761582","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Compare issue #242 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-242-compare.png","kind":"screenshot"}],"validationLinks":[{"label":"Comparison hub","url":"https://bumpgrade.com/compare","kind":"route"},{"label":"ClickFunnels alternative","url":"https://bumpgrade.com/compare/clickfunnels-alternative","kind":"route"},{"label":"Comparison source data","url":"https://bumpgrade.com/compare/source-data","kind":"source-data"},{"label":"PR #243","url":"https://github.com/markitics/bumpgrade/pull/243","kind":"pr"},{"label":"Issue #242","url":"https://github.com/markitics/bumpgrade/issues/242","kind":"issue"}],"notes":["Competitor facts remain volatile; agents should refresh external competitor pages before making time-sensitive claims."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-compare-bumpgrade-to-clickfunnels","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-read-public-roadmap-source-data","title":"Read public roadmap source data","featureId":"feature-public-roadmap","featureStatus":"live","issueNumbers":[7,8],"primaryUser":"Agent resuming Bumpgrade work","userGoal":"Recover shipped, active, blocked, next, and planned state without reading chat history.","sourceEvidence":["https://bumpgrade.com/roadmap/source-data","https://github.com/markitics/bumpgrade/pull/27"],"happyPath":["Fetch /roadmap/source-data.","Find item IDs, statuses, issue links, evidence, and owner-attention caveats.","Use /admin/roadmap for owner-facing grouping.","Continue the next issue without inventing state."],"edgeCases":["D1 may be unavailable locally, so pages can show fixture fallback.","Private admin notes must not leak into public roadmap JSON."],"agentAccess":"Agents can read the public-safe source data; write/update paths must use approved D1 scripts or future confirmed APIs.","validation":["/roadmap/source-data live smoke returned 200 JSON.","Playwright test asserts stable roadmap records."],"sortOrder":20,"updatedAt":"2026-05-25T11:33:45.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-18T09:45:51.000Z","environment":"Production route smoke and screenshot evidence from roadmap/admin issue work.","method":"Roadmap route and source-data smoke checks.","summary":"Roadmap source data and public roadmap have route proof; this proof now links into journey records.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Roadmap desktop","url":"https://bumpgrade.com/pr-screenshots/issue-7-roadmap-desktop.png","kind":"screenshot"}],"validationLinks":[{"label":"Roadmap source data","url":"https://bumpgrade.com/roadmap/source-data","kind":"source-data"}],"notes":["Public roadmap is for status; product marketing now belongs on /features and /."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-public-roadmap","label":"Inherited feature proof"}},{"id":"journey-mark-reviews-nonblocking-attention","title":"the owner reviews non-blocking attention","featureId":"feature-admin-state","featureStatus":"live","issueNumbers":[8,10],"primaryUser":"the owner as project owner","userGoal":"See important blockers and decisions while agents continue independent work.","sourceEvidence":["https://bumpgrade.com/admin/for-mark","https://github.com/markitics/bumpgrade/issues/10"],"happyPath":["Agent ships a PR and deploys it.","Agent runs the Codex PR email script with the PR number and Worker version.","The script sends from codex@bumpgrade.com through Cloudflare Email Service and logs the result in D1.","the owner replies to codex@bumpgrade.com.","Cloudflare Email Routing invokes the Worker email handler, stores raw mail content in R2, records public-safe metadata in D1, and forwards a copy to the owner.","Agent polls trusted unread rows before starting unrelated large work."],"edgeCases":["Cloudflare REST may return permanent_bounces if DNS/authentication has not propagated.","Plus-address routing is not assumed because Cloudflare currently reports subaddressing disabled for bumpgrade.com.","Only the owner-controlled sender addresses are trusted for actionable inbound tasking.","raw mail content and private message bodies stay in D1/R2 and must not be pasted into GitHub."],"agentAccess":"Agents can add public-safe items with npm run for-mark:add; private or sensitive details must wait for authenticated surfaces.","validation":["Cloudflare Email Routing status reports ready after MX/SPF/DKIM records were installed.","Issue #10 tracks outbound and inbound email setup.","The Worker email() handler stores inbound metadata and raw mail content references."],"sortOrder":30,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T17:20:00.000Z","environment":"Production source-data routes, merged PRs #241 and #244, and deployed owner-attention screenshots.","method":"Owner-attention source-data smoke, admin source-data smoke, user-journey proof summary smoke, and screenshot evidence for response channels.","summary":"Owner attention is now explicit about read-only page behavior, GitHub issue response paths, project email, and durable work-log evidence.","ciLinks":[{"label":"PR #241 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26173122434","kind":"ci"},{"label":"Main CI after PR #244","url":"https://github.com/markitics/bumpgrade/actions/runs/26176981405","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Owner-attention response channels","url":"https://bumpgrade.com/pr-screenshots/issue-73-for-mark-response-channels.png","kind":"screenshot"},{"label":"User-journey proof matrix","url":"https://bumpgrade.com/pr-screenshots/issue-240-user-journeys-proof-matrix.png","kind":"screenshot"}],"validationLinks":[{"label":"Owner-attention source data","url":"https://bumpgrade.com/admin/for-mark/source-data","kind":"source-data"},{"label":"Admin source data","url":"https://bumpgrade.com/admin/source-data","kind":"source-data"},{"label":"PR #241","url":"https://github.com/markitics/bumpgrade/pull/241","kind":"pr"},{"label":"PR #244","url":"https://github.com/markitics/bumpgrade/pull/244","kind":"pr"},{"label":"Issue #61","url":"https://github.com/markitics/bumpgrade/issues/61","kind":"issue"},{"label":"Issue #73","url":"https://github.com/markitics/bumpgrade/issues/73","kind":"issue"}],"notes":["/admin/for-mark is intentionally read-only; response choices point to GitHub, project email, or this Codex thread instead of pretending the page accepts direct replies."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-mark-reviews-nonblocking-attention","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-owner-opens-protected-admin","title":"Owner opens protected admin surfaces","featureId":"feature-better-auth","featureStatus":"live","issueNumbers":[9,10,55],"primaryUser":"the owner as Bumpgrade owner","userGoal":"Sign in with an allowlisted owner account and open private admin pages while public-safe JSON remains available to agents.","sourceEvidence":["https://bumpgrade.com/login","https://bumpgrade.com/admin/roadmap","https://github.com/markitics/bumpgrade/issues/9","https://github.com/markitics/bumpgrade/issues/55"],"happyPath":["Open /login.","Create or sign in to a Bumpgrade account.","Open an admin route.","If the owner email is verified and allowlisted, view the private admin page.","If the owner email is not verified, use the Gmail or resend actions instead of seeing a raw denial string."],"edgeCases":["Cloudflare Email Sending may reject account confirmation mail and must return an actionable browser error.","Recent verification sends hold a 120 second resend cooldown.","Agent-readable source-data routes stay public-safe and should not carry private notes or secrets."],"agentAccess":"Agents can read public-safe source data without a session; private admin pages require a human Better Auth owner session.","validation":["Playwright covers signed-out admin gates, verified owner sign-in, and unverified owner resend/cooldown copy.","D1 migration creates Better Auth storage and account verification email event tables."],"sortOrder":35,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T17:20:00.000Z","environment":"Local authenticated Playwright smoke, GitHub Actions browser journeys, and deployed auth/admin screenshots.","method":"Signed-out admin gate checks, allowlisted owner sign-in journey, verified-email admin access checks, and auth-aware nav screenshot review.","summary":"Owner-protected admin routes have current proof for sign-in, verified owner access, source-data bypass boundaries, and the authenticated nav state.","ciLinks":[{"label":"Main CI after PR #244","url":"https://github.com/markitics/bumpgrade/actions/runs/26176981405","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Signed-in admin","url":"https://bumpgrade.com/pr-screenshots/issue-9-admin-signed-in-desktop.png","kind":"screenshot"},{"label":"Admin locked mobile","url":"https://bumpgrade.com/pr-screenshots/issue-9-admin-locked-mobile.png","kind":"screenshot"},{"label":"Authenticated admin nav","url":"https://bumpgrade.com/pr-screenshots/issue-70-authenticated-admin-nav.png","kind":"screenshot"},{"label":"Auth-aware owner-attention nav","url":"https://bumpgrade.com/pr-screenshots/issue-97-auth-aware-nav-for-mark.png","kind":"screenshot"}],"validationLinks":[{"label":"Login","url":"https://bumpgrade.com/login","kind":"route"},{"label":"Admin roadmap source data","url":"https://bumpgrade.com/admin/roadmap/source-data","kind":"source-data"},{"label":"PR #244","url":"https://github.com/markitics/bumpgrade/pull/244","kind":"pr"},{"label":"Issue #9","url":"https://github.com/markitics/bumpgrade/issues/9","kind":"issue"},{"label":"Issue #70","url":"https://github.com/markitics/bumpgrade/issues/70","kind":"issue"},{"label":"Issue #97","url":"https://github.com/markitics/bumpgrade/issues/97","kind":"issue"}],"notes":["Public-safe source-data routes remain readable for agents, but browser admin pages require a Better Auth owner session."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-owner-opens-protected-admin","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-agent-reads-bumpgrade-manifest","title":"Agent reads Bumpgrade manifest before acting","featureId":"feature-agent-ready-contracts","featureStatus":"live","issueNumbers":[12],"primaryUser":"Codex, ChatGPT, Claude, or another capable agent","userGoal":"Understand what Bumpgrade can read, cite, and safely propose without scraping private admin UI or inventing state.","sourceEvidence":["https://bumpgrade.com/agent-docs","https://bumpgrade.com/agent-docs/source-data","https://bumpgrade.com/agent-docs/bumpgrade-agent-surface","https://github.com/markitics/bumpgrade/issues/12"],"happyPath":["Open /agent-docs or fetch /agent-docs/source-data.","Choose the relevant read contract for feature, roadmap, comparison, commerce, admin, or agent docs.","Cite stable IDs, issue or PR evidence, source URLs, and retrieved dates.","Use MCP roadmap entries only as planned tooling until the MCP server exists.","Require confirmed-write safeguards before any public, billing-impacting, admin, or creator-speech write."],"edgeCases":["Human admin pages require Better Auth owner sessions and should not be scraped as a bypass.","The manifest is public-safe discovery metadata, not permission to write.","Volatile competitor pricing, packaging, and feature availability need current source refreshes.","Live billing remains disabled until a separate rollout proves webhook evidence."],"agentAccess":"Agents can read /agent-docs/source-data, /features/source-data, /roadmap/source-data, /compare/source-data, /commerce/source-data, and /admin/source-data; writes need approved scripts now and confirmed APIs later.","validation":["Playwright covers /agent-docs pages and /agent-docs/source-data.","The manifest exposes stable read contract IDs, evidence route IDs, MCP plan IDs, and write-safety rules."],"sortOrder":38,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T17:20:00.000Z","environment":"Production agent-doc routes, GitHub Actions CI, and deployed agent documentation screenshots.","method":"Agent docs route smoke, source-data contract inspection, sitemap discovery, and manifest stable-ID checks.","summary":"Agent-readable Bumpgrade contracts expose source-data routes, action boundaries, feature IDs, roadmap IDs, and write-safety rules without requiring private admin scraping.","ciLinks":[{"label":"Main CI after PR #244","url":"https://github.com/markitics/bumpgrade/actions/runs/26176981405","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Agent docs index","url":"https://bumpgrade.com/pr-screenshots/issue-12-agent-docs-index-desktop.png","kind":"screenshot"},{"label":"Agent MCP mobile","url":"https://bumpgrade.com/pr-screenshots/issue-12-agent-mcp-mobile.png","kind":"screenshot"}],"validationLinks":[{"label":"Agent docs","url":"https://bumpgrade.com/agent-docs","kind":"route"},{"label":"Agent docs source data","url":"https://bumpgrade.com/agent-docs/source-data","kind":"source-data"},{"label":"Agent surface","url":"https://bumpgrade.com/agent-docs/bumpgrade-agent-surface","kind":"route"},{"label":"Issue #12","url":"https://github.com/markitics/bumpgrade/issues/12","kind":"issue"}],"notes":["The manifest is public-safe read discovery. Public, billing-impacting, admin, or creator-speech writes still need confirmed-write contracts."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-agent-reads-bumpgrade-manifest","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-publisher-plans-funnel-launch","title":"Publisher plans a funnel launch","featureId":"feature-funnel-builder","featureStatus":"live","issueNumbers":[14,15,16,17,18],"primaryUser":"Publisher or creator preparing an offer","userGoal":"Understand the future path from landing page to checkout, delivery, follow-up, and analytics.","sourceEvidence":["https://bumpgrade.com/features","https://bumpgrade.com/roadmap"],"happyPath":["Read the feature catalog.","Open roadmap items for funnel builder, checkout, products, email automation, and analytics.","Track which issue owns each capability before assuming it exists.","Return after each shipped slice to verify the journey has live evidence."],"edgeCases":["No actual funnel editor exists yet.","Billing-impacting actions require explicit confirmation and audit records."],"agentAccess":"Agents can read and summarize planned journeys; agents cannot publish funnels, mutate billing, or claim feature parity until confirmed-write contracts exist.","validation":["Feature catalog and roadmap tests cover pending records.","This journey is represented in D1 shape for future expansion."],"sortOrder":40,"updatedAt":"2026-05-24T06:54:31.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T09:06:58.000Z","environment":"Production screenshot and source-data evidence from funnel feature issues.","method":"Route smoke, owner-gated admin preview, and screenshot evidence.","summary":"Funnel previews, template library, draft admin, publishing, checkout linking, resource delivery links, funnel-scoped private delivery tokens, redacted resource-delivery receipt evidence, webinar event/replay links, archived-draft purge, bulk archived-draft purge, visual style controls, block reordering, cross-step block moves, and webinar/resource shapes have screenshot evidence.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Funnel template library","url":"https://bumpgrade.com/pr-screenshots/issue-159-funnel-template-library.png","kind":"screenshot"},{"label":"Template draft admin","url":"https://bumpgrade.com/pr-screenshots/issue-161-template-draft-admin.png","kind":"screenshot"},{"label":"Webinar and resource funnels","url":"https://bumpgrade.com/pr-screenshots/issue-213-webinar-resource-funnels.png","kind":"screenshot"},{"label":"Draft block editing","url":"https://bumpgrade.com/pr-screenshots/issue-430-funnel-block-editing.png","kind":"screenshot"},{"label":"Draft block add/remove","url":"https://bumpgrade.com/pr-screenshots/issue-432-funnel-block-add-remove.png","kind":"screenshot"},{"label":"Draft block visual styles","url":"https://bumpgrade.com/pr-screenshots/issue-417-funnel-visual-style-controls.png","kind":"screenshot"},{"label":"Resource delivery links","url":"https://bumpgrade.com/pr-screenshots/issue-417-resource-delivery-links.png","kind":"screenshot"},{"label":"Resource delivery tokens","url":"https://bumpgrade.com/pr-screenshots/issue-417-funnel-resource-delivery-tokens.png","kind":"screenshot"},{"label":"Resource delivery receipts","url":"https://bumpgrade.com/pr-screenshots/issue-417-resource-delivery-receipts.png","kind":"screenshot"},{"label":"Webinar event links","url":"https://bumpgrade.com/pr-screenshots/issue-417-webinar-event-links.png","kind":"screenshot"},{"label":"Archived draft purge","url":"https://bumpgrade.com/pr-screenshots/issue-417-archived-draft-purge.png","kind":"screenshot"},{"label":"Bulk archived-draft purge","url":"https://bumpgrade.com/pr-screenshots/issue-417-bulk-purge-policy.png","kind":"screenshot"},{"label":"Draft block reordering","url":"https://bumpgrade.com/pr-screenshots/issue-417-block-reordering.png","kind":"screenshot"},{"label":"Cross-step block moves","url":"https://bumpgrade.com/pr-screenshots/issue-417-cross-step-block-moves.png","kind":"screenshot"},{"label":"Drag/drop block placement","url":"https://bumpgrade.com/pr-screenshots/issue-417-drag-drop-block-placement.png","kind":"screenshot"},{"label":"Agent draft publishing","url":"https://bumpgrade.com/pr-screenshots/issue-417-agent-funnel-publishing.png","kind":"screenshot"}],"validationLinks":[{"label":"Funnels source data","url":"https://bumpgrade.com/funnels/source-data","kind":"source-data"}],"notes":["Issue #14 is the shipped funnel MVP proof. Issue #417 now includes owner-confirmed checkout unlinking, resource delivery links, funnel-scoped private delivery tokens, owner-session agent-created resource delivery tokens, redacted resource-delivery receipt evidence, webinar event/replay links, owner-session visual block style controls, bounded canvas layout controls, archived-draft purge, bulk archived-draft purge, owner-session within-step block reordering, owner-session drag/drop block placement through existing move endpoints, owner-session cross-step block moves, and owner-session direct agent-safe draft writes including visual style presets, bounded canvas layouts, reusable block add/remove, checkout linking/unlinking, resource-delivery and webinar-event linking, block movement, public publishing, archive/unpublish, archived-draft purge, and bulk archived-draft purge; live billing stays in issue #219; arbitrary uploaded private asset delivery, live fulfillment automation, full webinar integrations, unauthenticated public agent-created delivery tokens, non-archived direct agent purge, and unauthenticated public agent writes stay in issue #417.","Issue #215 adds owner-confirmed private draft duplication without copying checkout-link, resource-link, or webinar-link metadata; issue #341 adds owner-confirmed archive/unpublish without deleting evidence; issue #417 adds owner-confirmed checkout unlinking, resource delivery links, funnel-scoped private delivery tokens, owner-session agent-created resource delivery tokens, redacted resource-delivery receipt evidence without buyer or raw checkout data, webinar event/replay links, archived-draft purge with tombstone evidence, bulk archived-draft purge with one tombstone per draft, visual style controls, bounded canvas layout controls, within-step block reordering, drag/drop block placement, cross-step block moves, and expanded owner-session direct agent-safe draft writes including reusable block add/remove and public publishing; issue #430 adds owner-session block title/body editing while preserving block metadata; issue #432 adds owner-session reusable block add/remove while refusing checkout-linked block removal."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-funnel-builder","label":"Inherited feature proof"}},{"id":"journey-prospect-saves-anonymous-playground","title":"Prospect saves a logged-out launch playground","featureId":"feature-resources-use-cases-pricing","featureStatus":"live","issueNumbers":[466],"primaryUser":"Publisher exploring Bumpgrade before signup","userGoal":"Try the product, save launch context in this browser, return later, and attach the work to a Free Build account without paying first.","sourceEvidence":["https://bumpgrade.com/playground","https://bumpgrade.com/playground/source-data","https://bumpgrade.com/funnels/source-data","https://bumpgrade.com/pricing/source-data","https://github.com/markitics/bumpgrade/issues/466"],"happyPath":["Open /playground while logged out.","Enter offer, audience, product, opt-in, checkout, delivery, follow-up, and migration starting-point details.","Save the playground and refresh the page.","Return from the same browser and see the saved draft.","Create or sign into a verified account and attach the playground to a private Free Build workspace.","Bumpgrade maps the structured playground fields into an idempotent private launch draft.","Choose a paid go-live plan before public publishing, live checkout, sends, domains, or fulfillment."],"edgeCases":["Recovery depends on the browser cookie remaining available.","The cookie stores a recovery token only; D1 stores its hash, not the raw cookie value.","Anonymous playground rows expire after 30 days unless extended by later saves.","Owner cleanup and scheduled Cloudflare cleanup can expire old anonymous recovery, clear anonymous draft fields, replace the recovery token hash, and preserve private claimed records.","Playground saves do not create billing state, public domains, buyer routes, subscriber sends, or product access.","Attaching to an account creates or reuses a private Free Build workspace and keeps paid go-live gates intact."],"agentAccess":"Agents can read /playground/source-data for the anonymous playground contract. Saving structured playground state is browser-scoped, rate-limited per browser recovery workspace, and redacted; cleanup can run through owner confirmation or the scheduled Cloudflare cleanup trigger; attaching it requires authenticated, email-verified publisher context, creates private draft and claim records, and still does not authorize public or billing-impacting actions.","validation":["Playwright covers logged-out save, recovery-cookie persistence across refresh, source-data redaction, save-limit rejection, unauthenticated claim rejection, owner cleanup rejection, scheduled cleanup source-data, verified-account claim, private draft and claim-record creation, idempotent claim replay, and paid go-live gate preservation.","/pricing/source-data and /account/source-data distinguish anonymous playground, signed-in Free Build, scheduled cleanup, and paid go-live actions."],"sortOrder":42,"updatedAt":"2026-05-26T13:36:01.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-26T07:05:00.000Z","environment":"Local OpenNext preview, browser recovery smoke, save-limit smoke, authenticated claim smoke, and PR screenshot artifacts for issue #466.","method":"Logged-out save, recovery-cookie persistence after refresh, browser-recovery save-limit rejection, source-data redaction, unauthenticated claim rejection, verified-account claim, owner/scheduled cleanup contract checks, and paid go-live gate checks.","summary":"Logged-out visitors can save a structured launch playground in one browser, return later, and attach it to a verified Free Build account plus private launch draft and claim records; rapid repeat saves are limited without enabling public publishing, billing, sends, domains, or fulfillment.","ciLinks":[{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Anonymous playground","url":"https://bumpgrade.com/pr-screenshots/issue-466-anonymous-playground.png","kind":"screenshot"},{"label":"Anonymous playground save limits","url":"https://bumpgrade.com/pr-screenshots/issue-466-playground-save-limits.png","kind":"screenshot"},{"label":"Anonymous playground claim merge","url":"https://bumpgrade.com/pr-screenshots/issue-466-playground-claim-merge.png","kind":"screenshot"}],"validationLinks":[{"label":"Playground","url":"https://bumpgrade.com/playground","kind":"route"},{"label":"Playground source data","url":"https://bumpgrade.com/playground/source-data","kind":"source-data"},{"label":"Funnel source data","url":"https://bumpgrade.com/funnels/source-data","kind":"source-data"},{"label":"Pricing source data","url":"https://bumpgrade.com/pricing/source-data","kind":"source-data"},{"label":"Account source data","url":"https://bumpgrade.com/account/source-data","kind":"source-data"},{"label":"Issue #466","url":"https://github.com/markitics/bumpgrade/issues/466","kind":"issue"}],"notes":["Anonymous recovery depends on the browser cookie remaining available.","Owner cleanup and scheduled Cloudflare cleanup can expire old anonymous recovery, clear anonymous draft fields, and preserve claimed private records without public exposure.","Claiming a playground is additive for signed-in users with an existing Free Build workspace: Bumpgrade reuses the workspace and adds a private launch draft without replacing existing work.","The playground stores structured launch context and creates a private draft only after verified-account claim; buyer-facing actions remain paid-gated."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-prospect-saves-anonymous-playground","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-prospect-understands-free-build","title":"Prospect understands Free Build before going live","featureId":"feature-resources-use-cases-pricing","featureStatus":"live","issueNumbers":[20,316,466],"primaryUser":"Publisher who wants to start building before paying","userGoal":"See that Bumpgrade can be shaped before payment while public publishing, live checkout, subscriber sends, domains, and fulfillment stay gated until go-live.","sourceEvidence":["https://bumpgrade.com/pricing","https://bumpgrade.com/pricing/source-data","https://bumpgrade.com/playground","https://bumpgrade.com/playground/source-data","https://github.com/markitics/bumpgrade/issues/466"],"happyPath":["Open /pricing.","Read the build-first explanation.","Review what can be assembled privately before payment.","Review which buyer-facing actions require a paid or approved go-live state.","Use /pricing/source-data when an agent needs stable IDs for the same policy."],"edgeCases":["Logged-out playground recovery is browser-scoped and depends on the recovery cookie still being present.","Signed-in Free Build workspace creation is covered by /account/setup and /account/source-data.","Claimed playground work can become a private launch draft, but buyer-facing publishing, live checkout, email sends, domains, and fulfillment remain gated.","Anonymous playground state can attach to a verified account, but it still does not create public buyer-facing state."],"agentAccess":"Agents can read /pricing/source-data for Free Build capability IDs, paid go-live gate IDs, non-live anonymous playground state, and redaction boundaries.","validation":["Pricing route smoke confirms the public copy avoids internal implementation language.","/pricing/source-data exposes Free Build capability records and paid go-live gate records.","/playground and /playground/source-data expose logged-out structured browser recovery and private draft creation as live.","/account/source-data exposes signed-in Free Build workspace creation as live.","/content/source-data and /agent-docs/source-data include the pricing policy as agent-readable evidence."],"sortOrder":42,"updatedAt":"2026-05-25T20:51:30.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T12:25:00.000Z","environment":"Local OpenNext preview, focused Playwright source-data smoke, and PR screenshot artifacts for issue #466.","method":"Pricing route smoke, pricing source-data inspection, content source-data inspection, agent-docs source-data inspection, public-copy scan, and screenshot review.","summary":"The Free Build journey has route and source-data proof for private build-before-payment messaging, logged-out browser playground recovery, signed-in private workspace creation, and paid go-live gates.","ciLinks":[{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Free Build pricing","url":"https://bumpgrade.com/pr-screenshots/issue-466-pricing-free-build.png","kind":"screenshot"},{"label":"Pricing source data","url":"https://bumpgrade.com/pr-screenshots/issue-466-pricing-source-data.png","kind":"screenshot"}],"validationLinks":[{"label":"Pricing","url":"https://bumpgrade.com/pricing","kind":"route"},{"label":"Playground","url":"https://bumpgrade.com/playground","kind":"route"},{"label":"Playground source data","url":"https://bumpgrade.com/playground/source-data","kind":"source-data"},{"label":"Pricing source data","url":"https://bumpgrade.com/pricing/source-data","kind":"source-data"},{"label":"Content source data","url":"https://bumpgrade.com/content/source-data","kind":"source-data"},{"label":"Agent docs source data","url":"https://bumpgrade.com/agent-docs/source-data","kind":"source-data"},{"label":"PR #472","url":"https://github.com/markitics/bumpgrade/pull/472","kind":"pr"},{"label":"Issue #466","url":"https://github.com/markitics/bumpgrade/issues/466","kind":"issue"}],"notes":["The current proof separates browser-scoped anonymous saves, signed-in Free Build, and paid go-live actions."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-prospect-understands-free-build","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-publisher-checks-mobile-admin","title":"Publisher checks mobile admin status","featureId":"feature-mobile-admin","featureStatus":"launch-preview","issueNumbers":[414,428,13,67,68,153,155,157],"primaryUser":"Publisher away from desktop","userGoal":"Open the future Bumpgrade mobile app to check Director workstreams, roadmap, work-log, owner attention, commerce health, owner-session boundaries, confirmed-action requirements, push readiness, and distribution readiness without separate mobile-only semantics.","sourceEvidence":["https://bumpgrade.com/mobile-admin/source-data","https://bumpgrade.com/mobile-admin/dashboard/source-data","https://bumpgrade.com/admin/director/source-data","https://bumpgrade.com/mobile-admin/ios/source-data","https://bumpgrade.com/mobile-admin/android/source-data","https://bumpgrade.com/api/mobile-admin/private-rows","https://bumpgrade.com/api/mobile-admin/private-rows/actions","https://bumpgrade.com/api/mobile-admin/director-reviews","https://bumpgrade.com/api/mobile-admin/commerce-reviews","https://bumpgrade.com/api/mobile-admin/actions","https://bumpgrade.com/agent-docs/bumpgrade-mobile-admin","https://github.com/markitics/bumpgrade/issues/414","https://github.com/markitics/bumpgrade/issues/428","https://github.com/markitics/bumpgrade/pull/443","https://github.com/markitics/bumpgrade/pull/451","https://github.com/markitics/bumpgrade/pull/453","https://github.com/markitics/bumpgrade/issues/13","https://github.com/markitics/bumpgrade/issues/67","https://github.com/markitics/bumpgrade/issues/68","https://github.com/markitics/bumpgrade/issues/153","https://github.com/markitics/bumpgrade/issues/155","https://github.com/markitics/bumpgrade/issues/157"],"happyPath":["Open the future mobile admin app.","Fetch /mobile-admin/dashboard/source-data for the public-safe mobile dashboard digest.","For iOS, open the first simulator foundation and read the live dashboard payload, falling back to the generated fixture if the network is unavailable.","For Android, open the first emulator foundation and read the live dashboard payload, falling back to the same generated fixture if the network is unavailable.","Confirm the Expo, iOS, and Android surfaces distinguish live network hydration from fixture fallback while keeping the dashboard public-safe.","Review the compact Director workstream brief for categories such as Marketing, Mobile Admin, Agent Readiness, Security / Trust, and Operations before drilling into detail.","Use /api/mobile-admin/private-rows to inspect private rows only after owner session auth.","Use /api/mobile-admin/private-rows/actions to mark a private row read or deferred only after owner session auth, exact confirmation, stale-state checks, idempotency, and audit correlation.","Use /api/mobile-admin/director-reviews to acknowledge a reviewed Director workstream only after owner session auth, exact confirmation, stale-state checks, idempotency, and audit correlation.","Use /api/mobile-admin/commerce-reviews to acknowledge reviewed commerce-health source-data only after owner session auth, exact confirmation, stale-state checks, idempotency, and audit correlation.","Use /api/mobile-admin/actions to record audit-only action intents without production mutation.","Review the shared owner-session panel, confirmed-action cards, push boundary, and distribution boundary before any live push sends, store distribution, or high-risk mobile mutations exist.","Use issue #414 for physical-device proof, private APNs/FCM device-token plumbing, live push execution, high-risk confirmed-write APIs, and eventual App Store/TestFlight or Play Store/internal-testing distribution readiness.","Follow closed foundation issues #13, #67, #68, #153, #155, and #157 for completed read-only evidence."],"edgeCases":["The iOS simulator target is not App Store/TestFlight distribution, live push notifications, physical-device private row proof, or high-risk live confirmed-write support.","The Android emulator target is not Play Store/internal-testing distribution, live push notifications, physical-device private row proof, or high-risk live confirmed-write support.","Private admin state requires Better Auth owner or publisher sessions.","Mobile writes are limited to low-risk private-row workflow actions, Director workstream acknowledgements, commerce-health acknowledgements, and audit-only action intents until additional confirmed-write APIs exist.","/mobile-admin/dashboard/source-data is public-safe and excludes private buyer rows, owner email values, raw inbox bodies, raw attention bodies, raw work-log bodies, R2 object keys, signed URLs, secret values, upload bodies, session IDs, and write tokens.","/api/mobile-admin/director-reviews records owner review state only and must not be described as billing, publishing, push, distribution, private-row, or public-agent write support.","/api/mobile-admin/commerce-reviews records owner review state only and must not be described as checkout, refund, subscription, price, fulfillment, entitlement, push, distribution, private-row, or public-agent write support."],"agentAccess":"Agents can read /mobile-admin/source-data, /mobile-admin/dashboard/source-data, /admin/director/source-data, /mobile-admin/ios/source-data, and /mobile-admin/android/source-data to understand app scope, live public-safe mobile digest state, Director workstream nesting, owner-session requirements, private-row requirements, Director review requirements, commerce review requirements, confirmed-action requirements, push/distribution readiness boundaries, and smoke evidence; they must not claim mobile app parity until live push execution, physical-device proof, installable distribution, and high-risk live confirmed writes ship.","validation":["Issue #414 now renders the owner-session, private-row, private-row action, Director review, commerce review, confirmed-action, APNs/FCM push-readiness, and distribution-readiness contract in the app foundations while tracking high-risk billing/publishing/fulfillment confirmed-write APIs, physical-device proof, live push execution, and eventual installable distribution after foundation closeout.","Issue #428 tracks low-risk private-row confirmed actions for Mobile Admin.","Issue #13 defines the shared contract and splits iOS and Android child issues.","Issue #67 adds an Expo app foundation, generated fixture, iOS simulator target, validation command, smoke command, and screenshot path.","Issue #68 adds a native Android activity, generated fixture asset, emulator target, validation command, smoke command, and screenshot path.","Issue #153 adds /mobile-admin/dashboard/source-data as the live public-safe dashboard contract.","Issue #155 renders the live dashboard route and redaction boundary in the Expo, iOS, and Android foundation surfaces.","Issue #157 fetches the live dashboard route in Expo, iOS, and Android while preserving fixture fallback for deterministic smoke tests.","PR #443 records Mobile Admin Director digest evidence.","PR #451 records owner-confirmed Director workstream review API evidence.","PR #453 records owner-confirmed commerce-health review API evidence.","Playwright covers /agent-docs/bumpgrade-mobile-admin, /mobile-admin/source-data, /mobile-admin/dashboard/source-data, /mobile-admin/ios/source-data, /mobile-admin/android/source-data, Director digest redaction, Director review redaction, commerce review redaction, push-readiness redaction, and distribution-readiness blockers. Mobile validations assert the foundation apps render and live-hydrate the dashboard and Director brief panels."],"sortOrder":42,"updatedAt":"2026-05-26T23:03:55.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T02:36:30.000Z","environment":"Mobile source-data routes, Director digest, Director review API, commerce review API, push/distribution boundaries, first iOS/Android foundation evidence, and deployed mobile-admin screenshots.","method":"Mobile admin source-data smoke, dashboard source-data smoke, iOS and Android fixture/live-hydration evidence, owner-gated API auth-boundary smoke, redaction checks, and agent-doc link checks.","summary":"Mobile admin has launch proof for public-safe dashboard contracts, iOS foundation hydration, Android foundation hydration, Director digest nesting, owner-confirmed review APIs, and explicit push/distribution blockers.","ciLinks":[{"label":"Main CI after PR #244","url":"https://github.com/markitics/bumpgrade/actions/runs/26176981405","kind":"ci"},{"label":"Main CI after PR #453","url":"https://github.com/markitics/bumpgrade/actions/runs/26380078561","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Mobile admin contract desktop","url":"https://bumpgrade.com/pr-screenshots/issue-13-mobile-admin-contract-desktop.png","kind":"screenshot"},{"label":"iOS simulator","url":"https://bumpgrade.com/pr-screenshots/issue-67-ios-mobile-admin-simulator.png","kind":"screenshot"},{"label":"Android emulator","url":"https://bumpgrade.com/pr-screenshots/issue-68-android-mobile-admin-emulator.png","kind":"screenshot"},{"label":"iOS live dashboard hydration","url":"https://bumpgrade.com/pr-screenshots/issue-157-ios-live-dashboard-hydration.png","kind":"screenshot"},{"label":"Android live dashboard hydration","url":"https://bumpgrade.com/pr-screenshots/issue-157-android-live-dashboard-hydration.png","kind":"screenshot"},{"label":"Director digest","url":"https://bumpgrade.com/pr-screenshots/issue-414-mobile-director-digest.png","kind":"screenshot"},{"label":"Director review API","url":"https://bumpgrade.com/pr-screenshots/issue-414-mobile-director-review-api.png","kind":"screenshot"},{"label":"Commerce review API","url":"https://bumpgrade.com/pr-screenshots/issue-414-mobile-commerce-review-api.png","kind":"screenshot"},{"label":"Push and distribution boundaries","url":"https://bumpgrade.com/pr-screenshots/issue-414-mobile-push-distribution-boundaries.png","kind":"screenshot"}],"validationLinks":[{"label":"Mobile admin source data","url":"https://bumpgrade.com/mobile-admin/source-data","kind":"source-data"},{"label":"Mobile dashboard source data","url":"https://bumpgrade.com/mobile-admin/dashboard/source-data","kind":"source-data"},{"label":"Director source data","url":"https://bumpgrade.com/admin/director/source-data","kind":"source-data"},{"label":"iOS source data","url":"https://bumpgrade.com/mobile-admin/ios/source-data","kind":"source-data"},{"label":"Android source data","url":"https://bumpgrade.com/mobile-admin/android/source-data","kind":"source-data"},{"label":"Director reviews API","url":"https://bumpgrade.com/api/mobile-admin/director-reviews","kind":"api"},{"label":"Commerce reviews API","url":"https://bumpgrade.com/api/mobile-admin/commerce-reviews","kind":"api"},{"label":"Issue #157","url":"https://github.com/markitics/bumpgrade/issues/157","kind":"issue"},{"label":"Issue #414","url":"https://github.com/markitics/bumpgrade/issues/414","kind":"issue"}],"notes":["Mobile confirmed writes are limited to low-risk private-row workflow actions, Director workstream acknowledgements, commerce-health acknowledgements, and audit-only action intents.","This is not App Store or Play Store distribution, live APNs/FCM push execution, physical-device proof, or high-risk billing, fulfillment, publishing, moderation, or creator-speech mobile mutation support."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-publisher-checks-mobile-admin","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-prospect-reviews-launch-pricing","title":"Prospect chooses a Bumpgrade plan and starts checkout","featureId":"feature-resources-use-cases-pricing","featureStatus":"live","issueNumbers":[20,46,217,222,223,225,226,234,466,473],"primaryUser":"Publisher ready to start a Bumpgrade workspace","userGoal":"Understand Free Build, Experiment, Grow, Enterprise, White glove setup, and live payment handling before starting or upgrading the account plan.","sourceEvidence":["https://bumpgrade.com/pricing","https://bumpgrade.com/pricing/source-data","https://bumpgrade.com/commerce/source-data","https://bumpgrade.com/account/setup","https://bumpgrade.com/account/source-data","https://github.com/markitics/bumpgrade/issues/46","https://github.com/markitics/bumpgrade/issues/217","https://github.com/markitics/bumpgrade/issues/466","https://github.com/markitics/bumpgrade/issues/473"],"happyPath":["Open /pricing.","Review the build-first message and paid go-live gates.","Compare Experiment, Grow, Enterprise, and the optional White glove setup add-on.","Submit Experiment or Grow to start Stripe Checkout for the Bumpgrade account plan.","Return from Stripe to /pricing/success and continue to account setup with the same email."],"edgeCases":["Free Build is a tracked build-before-payment model; verified signed-in private workspace creation is live, while anonymous recovery is not live until implementation evidence exists.","Enterprise is a contact path, not self-serve checkout.","/pricing-v2 is an alternate usage-based draft and is not the default pricing model.","Successful Checkout Sessions are verified server-side before a publisher plan entitlement is activated.","Bumpgrade connects domains customers already own; it does not sell, register, renew, transfer, or price domains today."],"agentAccess":"Agents can read /pricing, /pricing/source-data, and /content/source-data, but billing-impacting recommendations must cite /commerce/source-data and current Stripe proof.","validation":["Issue #217 rewrites pricing as launch-facing copy.","Issue #225 clarifies the domain purchase policy.","Issue #226 refreshes launch signup and pricing copy for paid domain readiness.","Issue #234 refreshes pricing user-journey proof with the latest PR #233 CI and issue #226 screenshot links.","Issue #316 adds live self-serve Bumpgrade plan checkout, success verification, and seeded product/price records.","Issue #466 adds the Free Build policy source data and paid go-live gate evidence.","Issue #473 adds signed-in Free Build workspace creation while keeping buyer-facing actions paid-gated."],"sortOrder":43,"updatedAt":"2026-05-25T13:06:41.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T14:31:00.000Z","environment":"Local launch branch, GitHub Actions CI, merged launch PRs, and production route smoke.","method":"Pricing route smoke test, content review, commerce boundary inspection, account setup source-data inspection, and domain-policy proof.","summary":"Pricing explains self-serve Experiment and Grow checkout, Enterprise contact, White glove setup, Bumpgrade subdomains, existing-domain setup, no domain purchase, and billing boundaries.","ciLinks":[{"label":"PR #218 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26155451076","kind":"ci"},{"label":"PR #232 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26166024751","kind":"ci"},{"label":"PR #233 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26168608279","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Pricing issue #226 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-226-pricing.png","kind":"screenshot"},{"label":"Account setup issue #226 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-226-account-setup.png","kind":"screenshot"}],"validationLinks":[{"label":"Commerce source data","url":"https://bumpgrade.com/commerce/source-data","kind":"source-data"},{"label":"Account source data","url":"https://bumpgrade.com/account/source-data","kind":"source-data"},{"label":"PR #232","url":"https://github.com/markitics/bumpgrade/pull/232","kind":"pr"},{"label":"PR #233","url":"https://github.com/markitics/bumpgrade/pull/233","kind":"pr"},{"label":"Issue #217","url":"https://github.com/markitics/bumpgrade/issues/217","kind":"issue"},{"label":"Issue #226","url":"https://github.com/markitics/bumpgrade/issues/226","kind":"issue"},{"label":"Issue #234","url":"https://github.com/markitics/bumpgrade/issues/234","kind":"issue"}],"notes":["Bumpgrade account-plan checkout is separate from customer-facing checkout for a publisher's own offer.","Live webhook-backed renewal and cancellation automation remains a follow-up until a live Stripe webhook signing secret is configured."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-prospect-reviews-launch-pricing","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-prospect-imports-from-clickfunnels","title":"Prospect plans a ClickFunnels import","featureId":"feature-competitor-importers","featureStatus":"live","issueNumbers":[5,14,15,17,467],"primaryUser":"Publisher moving a launch from ClickFunnels or another familiar platform","userGoal":"Understand what Bumpgrade can bring into a private workspace before public publishing, checkout, subscriber sends, domains, or fulfillment go live.","sourceEvidence":["https://bumpgrade.com/imports","https://bumpgrade.com/imports/clickfunnels","https://bumpgrade.com/imports/samcart","https://bumpgrade.com/imports/source-data","https://bumpgrade.com/api/imports/samcart/preview","https://bumpgrade.com/api/imports/samcart/draft","https://bumpgrade.com/api/imports/samcart/draft/rollback","https://bumpgrade.com/pr-screenshots/issue-467-importer-preflight-review.png","https://bumpgrade.com/compare/source-data","https://github.com/markitics/bumpgrade/issues/467"],"happyPath":["Open /imports.","Choose the current platform.","Review the platform-specific source guide for the URLs, exports, files, and notes Bumpgrade can use.","Add the strongest public URL, page copy, offer notes, export file names, follow-up notes, launch goal, and audience context.","Upload or paste a small CSV, JSON, HTML, or text export so Bumpgrade can parse safe structure before any private record is created.","Review the recognized platform export shape and matched safe header groups before private draft creation.","Review the redacted import map before sign-in or private draft creation, including source-guide items that are ready, need more context, or need source material.","Sign in or create a verified publisher account.","Confirm the private importer action.","Bumpgrade creates or reuses a Free Build workspace, saves a private import plan, keeps the safe importReview export analysis with the private draft, and creates structured private import records for matched review areas.","Open the private record review route to inspect those structured records and safe extracted field targets before any go-live action.","For checkout and product records, record whether the imported offer is ready for Bumpgrade checkout rebuild, needs payment-copy cleanup, or should stay parked.","For audience imports, review subscriber import depth with aggregate contact-row counts and safe identity, tag, consent, and sequence signals before any private subscriber import creation.","Record subscriber import preflight readiness or cleanup on private audience records before saving private importer subscriber records.","Create private importer subscriber records from a confirmed fresh upload or paste when the subscriber preflight is ready.","Inspect the saved private importer contacts from the same-owner private review page after subscriber import creation.","Add saved importer contacts to the audience review list as imported-pending subscribers after exact confirmation.","Download an owner-only private subscriber CSV from saved importer contacts after exact confirmation.","Edit safe extracted field labels, review status, and prompts before cleanup without saving raw source values.","the owner each private record ready or needing cleanup so the next importer cleanup pass has explicit owner-reviewed state.","Archive a private importer draft when the source map was wrong, then start a fresh import from the same source.","Use /imports/source-data when an agent needs stable importer IDs, input kinds, source checklist items, export match templates, preflight signal labels, export-file parser fields, importReview persistence fields, structured private import-record fields, extracted field plans, checkout migration readiness actions, subscriber import depth, subscriber import preflight actions, subscriber import creation actions, subscriber audience promotion actions, owner-only private subscriber record inspection rules, owner-only private subscriber export actions, private record review routes, review action routes, extracted-field edit actions, saved private plan parts, safety gates, limitations, source IDs, private import API routes, and rollback routes."],"edgeCases":["Imported material starts in a private workspace and is not buyer-facing by default.","The public review map does not create records or echo pasted source material, export file names, customer rows, private emails, payment credentials, API keys, session cookies, or payment data.","Export-file parsing returns structural labels, counts, and header groups only; raw file names, raw rows, raw file text, private emails, customer values, credentials, and payment data stay out of responses.","Platform export matches use safe header and signal labels only; they do not prove account transfer, subscriber sends, checkout migration, or fulfillment.","Private importReview metadata stores safe export structure, platform export matches, and recognized match IDs only; it does not store raw rows, raw file text, customer rows, credentials, or go-live effects.","Structured private import records store review-area summaries, safe match IDs, header labels, signal labels, counts, extracted field plans, and redaction flags; they do not store raw rows, raw file text, raw export file names, customer rows, credentials, or go-live effects.","Subscriber import depth stores aggregate row counts and safe label groups only; it does not create private subscriber records, store raw emails or names, enroll sequences, send email, enable exports, or expose contact values.","Subscriber import preflight actions store readiness or cleanup metadata only; they do not create private subscriber records, enroll sequences, send email, enable exports, or expose contact values.","Subscriber import creation stores normalized private subscriber records scoped to the private import plan after a confirmed fresh upload or paste; public responses expose counts only and do not enroll sequences, send email, enable exports, or expose contact values.","Subscriber audience promotion adds saved importer contacts to audience_subscribers with imported_pending_review status and non-sending tag assignments only; it creates no consent events, sequence enrollments, sends, private exports, or go-live effects.","Private subscriber record inspection is available only to the same verified owner on the private review page; public source-data, public preview routes, unauthenticated API responses, and public agent contracts expose counts and redaction rules only.","Private subscriber CSV export is available only to the same verified owner after saved importer contacts exist; public source-data, unauthenticated API responses, and JSON API responses expose counts and redaction rules only.","Checkout migration readiness stores owner review metadata only; it creates no checkout intents, Stripe sessions, payment credentials, public checkout routes, account transfer, domains, fulfillment, subscriber sends, or go-live effects.","Extracted field plans contain Bumpgrade target labels and review prompts only; they do not store raw values, private emails, customer values, payment credentials, or buyer-facing state.","Private record review pages require the same verified publisher who created the import plan and show safe structure plus owner-only saved private importer contacts.","Private record review actions store ready or needs-cleanup decisions in private metadata only; they do not store confirmation text, expose idempotency keys, or trigger buyer-facing effects.","Private extracted-field edit actions store field labels, review status, and prompts only; they reject source URLs and email-shaped private values and do not store raw extracted values.","Source-guide readiness exposes matched signal labels only, not the source URL, export file names, pasted copy, follow-up notes, launch goal, or private audience context.","Platform-specific source guides explain useful material to bring, but they are not account-to-account transfer, credential use, or permission to scrape private platform data.","Private import APIs require a verified publisher session, exact confirmation, idempotency, and redacted responses.","Rollback APIs require the same verified publisher, the current draft revision, exact confirmation, and idempotency; they archive only private importer plans and preserve saved plan content, structured private import records, steps, and audit history.","The response does not echo pasted source material, raw exports, customer rows, private emails, payment credentials, API keys, or session cookies.","Sequence enrollment, account-to-account transfer, customer password transfer, payment credential migration, subscriber sends, live checkout, public publishing, domains, and fulfillment remain follow-up work.","Competitor source facts should still be refreshed before making volatile pricing, packaging, or feature claims."],"agentAccess":"Agents can read /imports/source-data, /compare/source-data, and /features/source-data to answer importer questions with platform IDs, input kinds, platform-specific source checklists, source checklist items, export match templates, preflight signal labels, redacted sourceChecklistReview maps, exportFileAnalysis fields, platformExportMatches, private importReview metadata persistence, structured private import-record contracts, extracted field plans, checkout migration readiness actions, subscriber import depth, subscriber import preflight actions, subscriber import creation actions, subscriber audience promotion actions, owner-only private subscriber record inspection rules, owner-only private subscriber export actions, private record review routes, review action routes, extracted-field edit actions, duplicate-review fields, saved private plan parts, rollback routes, safety gates, source IDs, limitations, and private import API routes. Creating, reviewing, editing, recording checkout migration readiness, importing private subscriber records, promoting saved contacts to audience review, inspecting private subscriber contact values, downloading a private subscriber CSV, or archiving a private import plan requires verified publisher auth, exact confirmation, idempotency, audit evidence, and redacted responses; public or billing-impacting import writes remain unavailable.","validation":["Issue #467 adds /imports, dedicated importer source guides, /imports/clickfunnels, /imports/source-data, public redacted preflight review, sourceChecklistReview maps, exportFileAnalysis parsing, platformExportMatches, structured private import records, extracted field plans, checkout migration readiness, subscriber import depth, subscriber import preflight actions, private subscriber import creation, subscriber audience promotion, owner-only private subscriber record inspection, owner-only private subscriber CSV export, extracted-field editing, private record review, private record review actions, sitemap and llms discovery, feature and comparison source-data references, and importer smoke coverage.","Private importer APIs create or reuse a Free Build workspace, save a private import plan, persist safe importReview export analysis, and create structured private import records with extracted field plans, checkout migration readiness metadata, subscriber import depth, subscriber preflight metadata, private subscriber import records, owner-only subscriber contact inspection, imported-pending audience review-list promotion, owner-only private subscriber CSV export, and no public publishing, live checkout, subscriber sends, domains, fulfillment, account transfer, payment credential migration, or customer password migration.","Private importer rollback APIs archive importer-created private plans, preserve saved plan content, structured import records, steps, and audit history, and let the same source restart as a fresh private plan.","Importer source-data and API responses keep raw exports, customer rows, private emails, payment credentials, API keys, session cookies, export file names, and pasted source material out of public responses."],"sortOrder":43,"updatedAt":"2026-05-26T21:52:09.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-26T22:00:00.000Z","environment":"Local Cloudflare preview, production source-data smoke coverage, PR screenshot artifacts, and PR #526/main CI evidence.","method":"Importer hub route smoke, dedicated importer route smoke, platform-specific source-guide smoke, importer source-data inspection, public redacted preflight review coverage, export-file structure parsing and platform export match coverage, verified-publisher private import API coverage including safe importReview metadata persistence, structured private import records, extracted field plans, checkout migration readiness, subscriber import depth, subscriber import preflight actions, private subscriber import creation, owner-only private subscriber CSV export, extracted-field editing, private record review, private record review actions, private rollback/restart coverage, public discovery checks, and admin user-journey proof summary checks.","summary":"The importer journey has route, source-data, screenshot, issue, CI, deploy, and API evidence for reviewing platform-specific source material, parsing small export files for redacted structure, matching recognized platform export shapes, previewing an import map, saving the safe import review into private draft metadata, creating structured private import records with safe extracted field plans, recording checkout migration readiness, recording subscriber import preflight metadata, creating private subscriber records from a confirmed fresh upload, promoting saved contacts to audience review, preparing an owner-only private subscriber CSV, editing safe field plans in an owner-only page, marking records for cleanup, and archiving that draft before restarting without claiming live account transfer or buyer-facing changes.","ciLinks":[{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"},{"label":"Main CI after PR #526","url":"https://github.com/markitics/bumpgrade/actions/runs/26476974731","kind":"ci"}],"screenshotLinks":[{"label":"Importer center","url":"https://bumpgrade.com/pr-screenshots/issue-467-imports.png","kind":"screenshot"},{"label":"ClickFunnels importer","url":"https://bumpgrade.com/pr-screenshots/issue-467-clickfunnels-importer.png","kind":"screenshot"},{"label":"Importer preflight review","url":"https://bumpgrade.com/pr-screenshots/issue-467-importer-preflight-review.png","kind":"screenshot"},{"label":"Private export review","url":"https://bumpgrade.com/pr-screenshots/issue-467-private-export-review.png","kind":"screenshot"},{"label":"Importer extracted field review","url":"https://bumpgrade.com/pr-screenshots/issue-467-import-record-field-extraction.png","kind":"screenshot"},{"label":"Importer extracted field editing","url":"https://bumpgrade.com/pr-screenshots/issue-467-extracted-field-editing.png","kind":"screenshot"},{"label":"Subscriber import depth","url":"https://bumpgrade.com/pr-screenshots/issue-467-subscriber-import-depth.png","kind":"screenshot"},{"label":"Subscriber import creation","url":"https://bumpgrade.com/pr-screenshots/issue-467-subscriber-import-creation.png","kind":"screenshot"},{"label":"Subscriber audience promotion","url":"https://bumpgrade.com/pr-screenshots/issue-467-subscriber-audience-promotion.png","kind":"screenshot"},{"label":"Private subscriber CSV export","url":"https://bumpgrade.com/pr-screenshots/issue-467-private-subscriber-export.png","kind":"screenshot"},{"label":"Importer checkout readiness","url":"https://bumpgrade.com/pr-screenshots/issue-467-checkout-readiness.png","kind":"screenshot"}],"validationLinks":[{"label":"Import center","url":"https://bumpgrade.com/imports","kind":"route"},{"label":"ClickFunnels importer","url":"https://bumpgrade.com/imports/clickfunnels","kind":"route"},{"label":"Importer source data","url":"https://bumpgrade.com/imports/source-data","kind":"source-data"},{"label":"SamCart importer rollback API","url":"https://bumpgrade.com/api/imports/samcart/draft/rollback","kind":"api"},{"label":"Comparison source data","url":"https://bumpgrade.com/compare/source-data","kind":"source-data"},{"label":"PR #483","url":"https://github.com/markitics/bumpgrade/pull/483","kind":"pr"},{"label":"PR #494","url":"https://github.com/markitics/bumpgrade/pull/494","kind":"pr"},{"label":"PR #526","url":"https://github.com/markitics/bumpgrade/pull/526","kind":"pr"},{"label":"Issue #467","url":"https://github.com/markitics/bumpgrade/issues/467","kind":"issue"}],"notes":["Platform-specific source guides, public redacted preflight review maps, export-file structure parsing, platform export matching, private importReview metadata persistence, structured private import records, safe extracted field plans, checkout migration readiness, subscriber import depth, subscriber import preflight actions, private subscriber import creation, owner-only private record review, subscriber audience review-list promotion, owner-only private subscriber CSV export, and metadata-only record review decisions are live on dedicated importer paths. Private draft creation is live for verified publishers; source-match duplicate review reuses matching private drafts by platform, workspace, normalized title, and source URL or export file name. Private rollback controls archive importer-created plans while preserving saved work so the same source can restart as a fresh private plan. Sequence sends, live checkout creation, payment credential migration, public publishing, domains, and fulfillment remain follow-up work.","Competitor facts remain volatile; agents should refresh external competitor pages before making time-sensitive claims."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-prospect-imports-from-clickfunnels","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-publisher-creates-free-build-workspace","title":"Publisher creates a private Free Build workspace","featureId":"feature-better-auth","featureStatus":"live","issueNumbers":[9,221,466,473],"primaryUser":"Verified publisher who wants to start setup before paying","userGoal":"Create a private Bumpgrade workspace before payment and return later without unlocking public buyer-facing actions.","sourceEvidence":["https://bumpgrade.com/account/setup","https://bumpgrade.com/account/source-data","https://bumpgrade.com/pricing/source-data","https://github.com/markitics/bumpgrade/issues/466","https://github.com/markitics/bumpgrade/issues/473"],"happyPath":["Create or sign into a Bumpgrade publisher account.","Confirm the account email.","Open /account/setup.","Create the private Free Build workspace.","Return to /account/setup and see that Free Build is active.","Choose a paid go-live plan before reserving domains or enabling public buyer-facing actions."],"edgeCases":["Signed-out users must sign in first.","Unverified users must confirm email first.","Idempotent replays return the same workspace.","Free Build workspaces cannot reserve Bumpgrade subdomains or add custom domains until a paid plan is active.","Logged-out anonymous browser recovery remains out of scope."],"agentAccess":"Agents can read /account/source-data for the signed-in Free Build contract, but creating workspaces requires authenticated publisher context, explicit confirmation, idempotency, and redacted audit evidence.","validation":["Playwright covers verified signed-in Free Build creation, idempotent replay, paid subdomain gate preservation, paid custom-domain gate preservation, and /account/setup state.","/account/source-data exposes signed-in Free Build as live and anonymous playground recovery as not live."],"sortOrder":43,"updatedAt":"2026-05-25T13:06:41.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T12:55:00.000Z","environment":"Local OpenNext preview, authenticated Playwright account setup flow, source-data smoke, and PR screenshot artifacts for issue #473.","method":"Verified signed-in Free Build API creation, idempotent replay, paid subdomain/custom-domain gate checks, account setup UI smoke, and account source-data inspection.","summary":"Verified publishers can create a private Free Build workspace before payment while subdomain reservation, custom-domain onboarding, public publishing, live checkout, sends, and fulfillment remain paid-gated.","ciLinks":[{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Free Build account setup","url":"https://bumpgrade.com/pr-screenshots/issue-473-free-build-account-setup.png","kind":"screenshot"}],"validationLinks":[{"label":"Account setup","url":"https://bumpgrade.com/account/setup","kind":"route"},{"label":"Account source data","url":"https://bumpgrade.com/account/source-data","kind":"source-data"},{"label":"Issue #473","url":"https://github.com/markitics/bumpgrade/issues/473","kind":"issue"}],"notes":["Logged-out anonymous browser recovery remains outside this signed-in workspace slice.","Buyer-facing actions still require paid go-live state."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-publisher-creates-free-build-workspace","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-prospect-evaluates-content-surfaces","title":"Prospect evaluates Bumpgrade content surfaces","featureId":"feature-resources-use-cases-pricing","featureStatus":"live","issueNumbers":[20],"primaryUser":"Creator, coach, publisher, agency, or agent evaluating Bumpgrade","userGoal":"Understand who Bumpgrade is for, what resources exist, and what pricing can safely claim before live billing ships.","sourceEvidence":["https://bumpgrade.com/users","https://bumpgrade.com/developers-and-agents","https://bumpgrade.com/resources","https://bumpgrade.com/pricing","https://bumpgrade.com/content/source-data","https://github.com/markitics/bumpgrade/issues/20"],"happyPath":["Open /users to find the relevant audience segment and linked feature IDs.","Open /resources to find live comparison, commerce, and agent contract resources.","Open /pricing to read direction and explicit not-yet-claimed billing caveats.","Fetch /content/source-data to cite stable IDs, issue numbers, evidence routes, and agent boundaries."],"edgeCases":["Pricing tracks are positioning hypotheses, not published plans or live billing availability.","Migration guides and launch playbooks are planned until the related funnel, checkout, automation, and analytics issues ship.","Agents must not treat content copy as permission to perform public, billing-impacting, or creator-speech writes."],"agentAccess":"Agents can read /content/source-data for audience, resource, and pricing-direction records. Public copy changes still need source evidence, issue links, or shipped-product proof.","validation":["Playwright covers /users, /resources, /pricing, /content/source-data, sitemap discovery, and agent manifest read-contract discovery.","Issue #20 updates public route metadata and source-data contracts."],"sortOrder":44,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T17:20:00.000Z","environment":"GitHub Actions CI, merged PR #243, issue #536 branch validation, deployed screenshots, and production route smoke.","method":"Users index, dedicated use-case route smoke, resources/pricing route smoke, content source-data inspection, public visible-text scan, and screenshot review.","summary":"The content surfaces now present Bumpgrade by user outcomes and launch jobs, with dedicated audience pages plus pricing and resource routes avoiding internal build language.","ciLinks":[{"label":"PR #243 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26175118817","kind":"ci"},{"label":"Main CI after PR #243","url":"https://github.com/markitics/bumpgrade/actions/runs/26175761582","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Users issue #242 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-242-users.png","kind":"screenshot"},{"label":"Resources issue #242 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-242-resources.png","kind":"screenshot"},{"label":"Pricing issue #226 screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-226-pricing.png","kind":"screenshot"}],"validationLinks":[{"label":"Users","url":"https://bumpgrade.com/users","kind":"route"},{"label":"Creator use case","url":"https://bumpgrade.com/users/creators","kind":"route"},{"label":"Newsletter use case","url":"https://bumpgrade.com/users/newsletter-publishers","kind":"route"},{"label":"Resources","url":"https://bumpgrade.com/resources","kind":"route"},{"label":"Pricing","url":"https://bumpgrade.com/pricing","kind":"route"},{"label":"Content source data","url":"https://bumpgrade.com/content/source-data","kind":"source-data"},{"label":"PR #243","url":"https://github.com/markitics/bumpgrade/pull/243","kind":"pr"},{"label":"Issue #242","url":"https://github.com/markitics/bumpgrade/issues/242","kind":"issue"},{"label":"Issue #536","url":"https://github.com/markitics/bumpgrade/issues/536","kind":"issue"}],"notes":["Issue #316 moves pricing from launch conversation copy to self-serve Experiment and Grow subscriptions plus the White glove setup option."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-prospect-evaluates-content-surfaces","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-publisher-reserves-bumpgrade-subdomain","title":"Publisher reserves a paid Bumpgrade subdomain","featureId":"feature-better-auth","featureStatus":"live","issueNumbers":[9,221,222],"primaryUser":"Publisher who has activated a paid plan or launch pilot","userGoal":"Sign in, confirm email, and reserve a unique Bumpgrade subdomain that can become the default public hostname for the publisher workspace.","sourceEvidence":["https://bumpgrade.com/account/setup","https://bumpgrade.com/account/source-data","https://github.com/markitics/bumpgrade/issues/221","https://github.com/markitics/bumpgrade/issues/222"],"happyPath":["Create or sign into a Bumpgrade publisher account.","Confirm the account email.","Activate a paid plan or launch-pilot entitlement.","Open /account/setup.","Enter the desired subdomain, such as studio, and submit the reservation.","See the reserved hostname, such as studio.bumpgrade.com, recorded for the publisher tenant."],"edgeCases":["Signed-out users must sign in first.","Unverified users must confirm email first.","Free or unpaid accounts cannot reserve a Bumpgrade subdomain.","Reserved platform names such as admin, api, www, login, pricing, and features are blocked.","A subdomain already reserved by another tenant returns a conflict.","Custom domains and buying domains are tracked separately and should not be claimed as live from this journey."],"agentAccess":"Agents can read /account/source-data and inspect the tenant/subdomain contract. Public or delegated agent writes still require authenticated user context, idempotency, audit correlation, redaction, and paid-plan checks.","validation":["Playwright covers /account/setup rendering, /account/source-data, paid owner reservation, idempotent replay, reserved-name rejection, and unpaid account rejection.","Issue #222 records the D1 migration, API, account setup route, and cross-subdomain auth configuration."],"sortOrder":44,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T14:31:00.000Z","environment":"Local launch branch, GitHub Actions CI, merged PR #227, and production source-data smoke.","method":"Full Playwright browser suite, account setup route smoke test, source-data inspection, and authenticated API reservation checks.","summary":"Paid publisher tenant setup and Bumpgrade subdomain reservation passed local and GitHub validation.","ciLinks":[{"label":"PR #227 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26160043319","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Account setup screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-222-account-setup.png","kind":"screenshot"}],"validationLinks":[{"label":"Account source data","url":"https://bumpgrade.com/account/source-data","kind":"source-data"},{"label":"PR #227","url":"https://github.com/markitics/bumpgrade/pull/227","kind":"pr"},{"label":"Issue #222","url":"https://github.com/markitics/bumpgrade/issues/222","kind":"issue"}],"notes":["Custom-domain DNS verification is tracked separately in issue #223.","Domain purchase is tracked separately in issue #225."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-publisher-reserves-bumpgrade-subdomain","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-publisher-connects-custom-domain","title":"Publisher connects an existing custom domain","featureId":"feature-better-auth","featureStatus":"live","issueNumbers":[9,221,222,223],"primaryUser":"Paid publisher who already controls a domain","userGoal":"Add an existing domain to a Bumpgrade tenant, copy the required DNS record, and see whether DNS has been verified before activation.","sourceEvidence":["https://bumpgrade.com/account/setup","https://bumpgrade.com/account/source-data","https://github.com/markitics/bumpgrade/issues/221","https://github.com/markitics/bumpgrade/issues/223"],"happyPath":["Create or sign into a Bumpgrade publisher account.","Confirm the account email.","Activate a paid plan or launch-pilot entitlement.","Reserve the default Bumpgrade subdomain first.","Open /account/setup and enter the existing domain.","Copy the CNAME record name and target shown by Bumpgrade.","Click re-check DNS after the record is created at the domain host.","See pending DNS or verified DNS state without exposing private provider credentials."],"edgeCases":["Signed-out users must sign in first.","Unverified users must confirm email first.","Free or unpaid accounts cannot add a custom domain.","A default Bumpgrade hostname is required before custom-domain onboarding.","Bumpgrade-owned domains such as bumpgrade.com are rejected here.","Domains already claimed by another tenant return a conflict.","DNS verification can be pending while records propagate.","SSL and final custom-hostname activation remain visible as state, not hidden implementation detail.","Bumpgrade does not sell, register, renew, transfer, or price domains today; publishers bring a domain they already own."],"agentAccess":"Agents can read /account/source-data and inspect the custom-domain DNS contract. Custom-domain writes require authenticated user context, paid-plan checks, idempotency, audit correlation, redaction, and explicit DNS verification state.","validation":["Playwright covers /account/setup rendering, /account/source-data, paid custom-domain onboarding, idempotent replay, DNS verification transition, invalid Bumpgrade-owned domain rejection, unpaid account rejection, and explicit no-domain-purchase policy.","Issue #223 records the D1 migration, API, account setup UI, DNS instruction, and redacted source-data contract.","Issue #225 records the launch policy that Bumpgrade connects owned domains but does not sell/register domains today."],"sortOrder":45,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T14:31:00.000Z","environment":"Local launch branch, GitHub Actions CI, merged PRs #228, #229, and #232, and production source-data smoke.","method":"Account setup route smoke test, source-data inspection, and authenticated custom-domain API checks.","summary":"Existing custom-domain onboarding shows deterministic CNAME instructions, redacted verification state, and the no-domain-purchase launch policy.","ciLinks":[{"label":"PR #229 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26162614936","kind":"ci"},{"label":"PR #232 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26166024751","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Account setup screenshot","url":"https://bumpgrade.com/pr-screenshots/issue-223-custom-domain-setup.png","kind":"screenshot"}],"validationLinks":[{"label":"Account source data","url":"https://bumpgrade.com/account/source-data","kind":"source-data"},{"label":"PR #228","url":"https://github.com/markitics/bumpgrade/pull/228","kind":"pr"},{"label":"PR #229","url":"https://github.com/markitics/bumpgrade/pull/229","kind":"pr"},{"label":"PR #232","url":"https://github.com/markitics/bumpgrade/pull/232","kind":"pr"},{"label":"Issue #223","url":"https://github.com/markitics/bumpgrade/issues/223","kind":"issue"}],"notes":["Custom-domain login semantics are documented in issue #224.","Issue #225 documents the launch policy: Bumpgrade connects domains users already own but does not sell or register domains today."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-publisher-connects-custom-domain","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-publisher-plans-first-checkout","title":"Publisher plans the first paid offer","featureId":"feature-stripe-commerce","featureStatus":"live","issueNumbers":[11,34,15,16,81,99,101,111,113,115,117],"primaryUser":"Publisher preparing to sell a digital offer","userGoal":"Plan a checkout offer stack with a primary offer, order bump, post-purchase upsell, and downsell while seeing what is live, what is only decision evidence, and what remains billing-locked.","sourceEvidence":["https://bumpgrade.com/offers/source-data","https://bumpgrade.com/offers/indie-launch-stack","https://bumpgrade.com/api/commerce/checkout","https://bumpgrade.com/api/commerce/post-purchase-decisions","https://bumpgrade.com/commerce/source-data","https://bumpgrade.com/products/source-data","https://github.com/markitics/bumpgrade/issues/11","https://github.com/markitics/bumpgrade/issues/34","https://github.com/markitics/bumpgrade/issues/15","https://github.com/markitics/bumpgrade/issues/16","https://github.com/markitics/bumpgrade/issues/81","https://github.com/markitics/bumpgrade/issues/99","https://github.com/markitics/bumpgrade/issues/101","https://github.com/markitics/bumpgrade/issues/111","https://github.com/markitics/bumpgrade/issues/113","https://github.com/markitics/bumpgrade/issues/115","https://github.com/markitics/bumpgrade/issues/117"],"happyPath":["Fetch /offers/source-data to inspect the seeded checkout stack.","Start a sandbox checkout with the seeded primary offer and optional order bump.","Use trusted checkout/webhook evidence to open the post-purchase decision path.","Record a non-billing upsell or downsell follow-up decision with exact confirmation, idempotency, and checkout stale-state evidence.","Read aggregate post-purchase decision counts from /offers/source-data or /commerce/source-data without exposing buyer, Stripe, entitlement, or private checkout data."],"edgeCases":["Missing, untrusted, unpaid, stale, or unsupported checkout intents are rejected.","Unsupported offer IDs, decision kinds, confirmation text, and idempotency keys return public-safe errors.","Decision writes do not create Stripe charges, PaymentIntents, subscriptions, fulfillment, entitlements, payable commissions, payout state, tax records, partner notifications, or direct agent billing writes."],"agentAccess":"Agents can read checkout offer structure, post-purchase decision contracts, and aggregate decision counts. Direct agent billing writes, one-click upsell charges, fulfillment, entitlement grants, and price changes require future authenticated confirmed-write APIs.","validation":["Playwright covers post-purchase page rendering, non-billing decision writes, idempotent replay, stale-state rejection, source-data aggregates, and no billing/fulfillment mutation.","Issue #117 records the first post-purchase upsell/downsell decision evidence boundary."],"sortOrder":45,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T17:20:00.000Z","environment":"Sandbox checkout contract evidence, GitHub Actions CI, merged PR #244, deployed screenshots, and production POST-interception smoke.","method":"Commerce source-data inspection, offer route smoke, checkout start smoke, checkout success proof, post-purchase decision proof, and safe production payload interception.","summary":"Publishers can inspect the first paid-offer stack, order bump, post-purchase options, Bumpgrade account-plan checkout, and payment boundaries with current proof.","ciLinks":[{"label":"Main CI after PR #244","url":"https://github.com/markitics/bumpgrade/actions/runs/26176981405","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[{"label":"Commerce contract","url":"https://bumpgrade.com/pr-screenshots/issue-11-commerce-contract-desktop.png","kind":"screenshot"},{"label":"Sandbox checkout contract","url":"https://bumpgrade.com/pr-screenshots/issue-34-sandbox-checkout-contract-desktop.png","kind":"screenshot"},{"label":"Order bump checkout start","url":"https://bumpgrade.com/pr-screenshots/issue-99-checkout-order-bump-start.png","kind":"screenshot"},{"label":"Post-purchase offer stack","url":"https://bumpgrade.com/pr-screenshots/issue-117-post-purchase-offer-stack-desktop.png","kind":"screenshot"},{"label":"Checkout success","url":"https://bumpgrade.com/pr-screenshots/issue-133-checkout-success-desktop.png","kind":"screenshot"}],"validationLinks":[{"label":"Commerce source data","url":"https://bumpgrade.com/commerce/source-data","kind":"source-data"},{"label":"Offers source data","url":"https://bumpgrade.com/offers/source-data","kind":"source-data"},{"label":"Indie launch offer","url":"https://bumpgrade.com/offers/indie-launch-stack","kind":"route"},{"label":"PR #244","url":"https://github.com/markitics/bumpgrade/pull/244","kind":"pr"},{"label":"Issue #219","url":"https://github.com/markitics/bumpgrade/issues/219","kind":"issue"}],"notes":["Production checkout POST interception in PR #244 verified payload behavior without creating real checkout records.","Live self-serve checkout is intentionally parked in issue #219 until the owner confirms product, amount, and rollout."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-publisher-plans-first-checkout","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-customer-uses-one-login-across-bumpgrade-subdomains","title":"Customer uses one login across Bumpgrade-hosted publisher sites","featureId":"feature-better-auth","featureStatus":"live","issueNumbers":[9,221,222,223,224],"primaryUser":"Customer buying from multiple Bumpgrade-hosted publishers","userGoal":"Use one Bumpgrade identity session across publisher subdomains while each publisher site keeps its own access and entitlement checks.","sourceEvidence":["https://bumpgrade.com/account/source-data","https://github.com/markitics/bumpgrade/issues/221","https://github.com/markitics/bumpgrade/issues/224"],"happyPath":["Customer signs into the central Bumpgrade account session.","Customer opens a paid publisher site on a.bumpgrade.com.","Customer later opens another paid publisher site on b.bumpgrade.com without creating a second identity login.","Each site resolves its hostname to the correct publisher tenant before showing protected products, memberships, or customer content.","If the publisher uses a custom domain, Bumpgrade uses the central sign-in handoff and returns the customer to the custom domain for tenant-scoped access checks."],"edgeCases":["A shared identity session must not grant access to products or memberships sold by a different publisher.","A shared identity session must not grant owner/admin access.","Unrelated customer-owned domains cannot receive the bumpgrade.com browser cookie directly.","Localhost smoke tests cannot prove bumpgrade.com browser cookie sharing; production smoke should verify the deployed source-data contract."],"agentAccess":"Agents can read /account/source-data for the session boundary. They must not infer cross-tenant customer access from a shared identity session.","validation":["Playwright asserts the production Better Auth cookie-domain and trusted-origin contract.","Playwright asserts /account/source-data exposes the Bumpgrade-subdomain and custom-domain auth boundary.","GitHub Actions CI passed for PR #230.","Production smoke verified /account/source-data after Worker version cd663146-20c5-4899-a43f-5faec8c720a5.","Issue #224 records the explicit launch behavior and custom-domain limitation."],"sortOrder":46,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-20T14:31:00.000Z","environment":"Local contract tests, GitHub Actions CI, and production source-data smoke after Worker version cd663146-20c5-4899-a43f-5faec8c720a5.","method":"Better Auth configuration assertions, account source-data inspection, GitHub Actions browser journeys, and production route smoke tests.","summary":"The production auth contract uses the bumpgrade.com cookie domain and *.bumpgrade.com trusted origin so Bumpgrade-hosted publisher subdomains share identity while tenant access stays scoped.","ciLinks":[{"label":"PR #230 CI run","url":"https://github.com/markitics/bumpgrade/actions/runs/26164091138","kind":"ci"},{"label":"CI workflow","url":"https://github.com/markitics/bumpgrade/actions/workflows/ci.yml","kind":"ci"}],"screenshotLinks":[],"validationLinks":[{"label":"Account source data","url":"https://bumpgrade.com/account/source-data","kind":"source-data"},{"label":"PR #230","url":"https://github.com/markitics/bumpgrade/pull/230","kind":"pr"},{"label":"Issue #224","url":"https://github.com/markitics/bumpgrade/issues/224","kind":"issue"}],"notes":["Localhost cannot prove production browser cookie sharing for bumpgrade.com, so tests assert the production Better Auth boundary and production smoke verifies source-data after deploy.","Custom domains use a central Bumpgrade sign-in handoff instead of raw cross-domain cookie sharing.","A local account setup screenshot was not attached because the in-app browser rejected the localhost capture target."]},"proofSource":{"kind":"journey","inherited":false,"sourceJourneyId":"journey-customer-uses-one-login-across-bumpgrade-subdomains","sourceFeatureId":null,"label":"Journey-specific proof"}},{"id":"journey-publisher-previews-seeded-funnel","title":"Publisher previews a seeded draft funnel","featureId":"feature-funnel-builder","featureStatus":"live","issueNumbers":[14,79,159,161,163,165,213,215,341,409,417],"primaryUser":"Publisher or agent planning the first funnel","userGoal":"Create, edit, publish, archive, restore, duplicate, reorder, move, style, lay out, and safely purge draft funnels while preserving audit evidence, checkout/resource/webinar metadata, private preview boundaries, public published routes, public-safe checkout start rendering, entitlement-scoped resource delivery, owner-session agent write contracts, and redacted resource-delivery receipt evidence.","sourceEvidence":["https://bumpgrade.com/funnels/source-data","https://bumpgrade.com/funnels/indie-launch-sandbox","https://github.com/markitics/bumpgrade/issues/14","https://github.com/markitics/bumpgrade/issues/79","https://github.com/markitics/bumpgrade/issues/159","https://github.com/markitics/bumpgrade/issues/161","https://github.com/markitics/bumpgrade/issues/163","https://github.com/markitics/bumpgrade/issues/165","https://github.com/markitics/bumpgrade/issues/213","https://github.com/markitics/bumpgrade/issues/215","https://github.com/markitics/bumpgrade/issues/341","https://github.com/markitics/bumpgrade/issues/409","https://github.com/markitics/bumpgrade/issues/417"],"happyPath":["Open /admin/funnels as a verified owner.","Seed or create a private draft funnel.","Edit steps and block copy, add reusable blocks, apply visual style presets, set bounded canvas layout, reorder blocks, and move blocks across steps.","Attach checkout offer metadata to checkout blocks, resource delivery metadata to resource/delivery blocks, and webinar registration/replay URLs to webinar blocks.","Publish the draft to a public D1 funnel route after exact confirmation and current revision checks.","Use a checkout-linked entitlement to request a funnel-scoped private resource delivery token from the published resource block.","Redeem the Bumpgrade download route; the successful redemption records redacted funnel resource-delivery receipt evidence without exposing buyer data, raw checkout or entitlement IDs, raw tokens, R2 keys, signed URLs, or raw rows.","Read /funnels/source-data to inspect published funnel summaries, resource-delivery receipt counts, latest safe receipt metadata, owner-session agent token contract, direct agent draft-write contract, and remaining not-live boundaries.","Archive, unpublish, purge already archived drafts, or bulk purge selected archived drafts only after exact confirmation and tombstone evidence."],"edgeCases":["Resource delivery requires a published funnel, a resource-linked block, a trusted checkout intent, and an active matching entitlement before any token is created.","Receipt evidence is recorded only after the existing Bumpgrade download route successfully revalidates checkout, entitlement, product, and asset state and consumes the token.","Receipt source-data exposes safe funnel/block/product/asset/source metadata and aggregate counts only; it excludes raw buyer identity, raw checkout intent IDs, raw entitlement IDs, raw bearer tokens, R2 object keys, signed URLs, and raw rows.","Token replay after successful redemption returns already-used behavior and does not create a second receipt because receipts are unique by product download token.","Arbitrary uploaded private asset delivery, signed object URLs, live fulfillment tasks, provider-hosted media, unauthenticated public agent-created delivery tokens, unauthenticated public agent publishing, live billing mutation, and non-archived purge remain disabled."],"agentAccess":"Agents can read /funnels/source-data to inspect published funnel summaries, public and owner-session resource delivery token boundaries, redacted resource-delivery receipt counts, latest safe receipt metadata, direct owner-session draft-write capabilities, and remaining not-live boundaries. Owner-session agents can request funnel-scoped delivery tokens only through the confirmed owner-session route. Public agents cannot create unauthenticated delivery tokens, signed URLs, arbitrary asset delivery, fulfillment tasks, billing mutations, or public route writes.","validation":["Playwright covers funnel resource delivery token creation, owner-session agent token creation, download-token redemption, redacted resource-delivery receipt creation, source-data receipt summary, replay behavior, unauthenticated agent rejection, stale revision rejection, mismatched entitlement rejection, and public page rendering.","Issue #417 records the shipped resource delivery receipt evidence without claiming arbitrary private asset delivery, signed URLs, live fulfillment automation, live billing, or unauthenticated public agent writes."],"sortOrder":46,"updatedAt":"2026-05-27T01:48:19.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T09:06:58.000Z","environment":"Production screenshot and source-data evidence from funnel feature issues.","method":"Route smoke, owner-gated admin preview, and screenshot evidence.","summary":"Funnel previews, template library, draft admin, publishing, checkout linking, resource delivery links, funnel-scoped private delivery tokens, redacted resource-delivery receipt evidence, webinar event/replay links, archived-draft purge, bulk archived-draft purge, visual style controls, block reordering, cross-step block moves, and webinar/resource shapes have screenshot evidence.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Funnel template library","url":"https://bumpgrade.com/pr-screenshots/issue-159-funnel-template-library.png","kind":"screenshot"},{"label":"Template draft admin","url":"https://bumpgrade.com/pr-screenshots/issue-161-template-draft-admin.png","kind":"screenshot"},{"label":"Webinar and resource funnels","url":"https://bumpgrade.com/pr-screenshots/issue-213-webinar-resource-funnels.png","kind":"screenshot"},{"label":"Draft block editing","url":"https://bumpgrade.com/pr-screenshots/issue-430-funnel-block-editing.png","kind":"screenshot"},{"label":"Draft block add/remove","url":"https://bumpgrade.com/pr-screenshots/issue-432-funnel-block-add-remove.png","kind":"screenshot"},{"label":"Draft block visual styles","url":"https://bumpgrade.com/pr-screenshots/issue-417-funnel-visual-style-controls.png","kind":"screenshot"},{"label":"Resource delivery links","url":"https://bumpgrade.com/pr-screenshots/issue-417-resource-delivery-links.png","kind":"screenshot"},{"label":"Resource delivery tokens","url":"https://bumpgrade.com/pr-screenshots/issue-417-funnel-resource-delivery-tokens.png","kind":"screenshot"},{"label":"Resource delivery receipts","url":"https://bumpgrade.com/pr-screenshots/issue-417-resource-delivery-receipts.png","kind":"screenshot"},{"label":"Webinar event links","url":"https://bumpgrade.com/pr-screenshots/issue-417-webinar-event-links.png","kind":"screenshot"},{"label":"Archived draft purge","url":"https://bumpgrade.com/pr-screenshots/issue-417-archived-draft-purge.png","kind":"screenshot"},{"label":"Bulk archived-draft purge","url":"https://bumpgrade.com/pr-screenshots/issue-417-bulk-purge-policy.png","kind":"screenshot"},{"label":"Draft block reordering","url":"https://bumpgrade.com/pr-screenshots/issue-417-block-reordering.png","kind":"screenshot"},{"label":"Cross-step block moves","url":"https://bumpgrade.com/pr-screenshots/issue-417-cross-step-block-moves.png","kind":"screenshot"},{"label":"Drag/drop block placement","url":"https://bumpgrade.com/pr-screenshots/issue-417-drag-drop-block-placement.png","kind":"screenshot"},{"label":"Agent draft publishing","url":"https://bumpgrade.com/pr-screenshots/issue-417-agent-funnel-publishing.png","kind":"screenshot"}],"validationLinks":[{"label":"Funnels source data","url":"https://bumpgrade.com/funnels/source-data","kind":"source-data"}],"notes":["Issue #14 is the shipped funnel MVP proof. Issue #417 now includes owner-confirmed checkout unlinking, resource delivery links, funnel-scoped private delivery tokens, owner-session agent-created resource delivery tokens, redacted resource-delivery receipt evidence, webinar event/replay links, owner-session visual block style controls, bounded canvas layout controls, archived-draft purge, bulk archived-draft purge, owner-session within-step block reordering, owner-session drag/drop block placement through existing move endpoints, owner-session cross-step block moves, and owner-session direct agent-safe draft writes including visual style presets, bounded canvas layouts, reusable block add/remove, checkout linking/unlinking, resource-delivery and webinar-event linking, block movement, public publishing, archive/unpublish, archived-draft purge, and bulk archived-draft purge; live billing stays in issue #219; arbitrary uploaded private asset delivery, live fulfillment automation, full webinar integrations, unauthenticated public agent-created delivery tokens, non-archived direct agent purge, and unauthenticated public agent writes stay in issue #417.","Issue #215 adds owner-confirmed private draft duplication without copying checkout-link, resource-link, or webinar-link metadata; issue #341 adds owner-confirmed archive/unpublish without deleting evidence; issue #417 adds owner-confirmed checkout unlinking, resource delivery links, funnel-scoped private delivery tokens, owner-session agent-created resource delivery tokens, redacted resource-delivery receipt evidence without buyer or raw checkout data, webinar event/replay links, archived-draft purge with tombstone evidence, bulk archived-draft purge with one tombstone per draft, visual style controls, bounded canvas layout controls, within-step block reordering, drag/drop block placement, cross-step block moves, and expanded owner-session direct agent-safe draft writes including reusable block add/remove and public publishing; issue #430 adds owner-session block title/body editing while preserving block metadata; issue #432 adds owner-session reusable block add/remove while refusing checkout-linked block removal."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-funnel-builder","label":"Inherited feature proof"}},{"id":"journey-owner-seeds-editable-draft-funnel","title":"Owner seeds, edits, previews, publishes, and archives a draft funnel","featureId":"feature-funnel-builder","featureStatus":"live","issueNumbers":[14,79,91,93,95,135,159,161,163,165,213,215,341,409,417,430,432],"primaryUser":"Publisher or owner preparing the first launch funnel","userGoal":"Create, seed, template-start, or duplicate an owner-gated draft funnel, including webinar and resource page shapes, tune the ordered steps, individual block copy, curated block visual styles, and bounded canvas layouts, attach the seeded sandbox checkout offer to a checkout block, link resource/delivery blocks to product access assets, link webinar blocks to external registration/replay URLs, preview it privately, publish it to a public route that can start the linked sandbox checkout after exact confirmation, show entitlement-safe resource access, mint a scoped private download token for matching checkout entitlements, and show webinar access references, then archive or unpublish without deleting evidence, purge one already archived draft after tombstone evidence exists, or bulk-purge selected archived drafts with one tombstone per draft.","sourceEvidence":["https://bumpgrade.com/admin/funnels","https://bumpgrade.com/admin/funnels/funnel-draft-indie-launch-working-copy/preview","https://bumpgrade.com/funnels/indie-launch-working-copy","https://bumpgrade.com/funnels/source-data","https://github.com/markitics/bumpgrade/issues/14","https://github.com/markitics/bumpgrade/issues/91","https://github.com/markitics/bumpgrade/issues/93","https://github.com/markitics/bumpgrade/issues/95","https://github.com/markitics/bumpgrade/issues/135","https://github.com/markitics/bumpgrade/issues/159","https://github.com/markitics/bumpgrade/issues/161","https://github.com/markitics/bumpgrade/issues/163","https://github.com/markitics/bumpgrade/issues/165","https://github.com/markitics/bumpgrade/issues/213","https://github.com/markitics/bumpgrade/issues/215","https://github.com/markitics/bumpgrade/issues/341","https://github.com/markitics/bumpgrade/issues/409","https://github.com/markitics/bumpgrade/issues/417"],"happyPath":["Sign in with an allowlisted owner account.","Open /admin/funnels.","Seed the indie launch working draft, create a generic draft, or create a private draft from a reusable template after typing the exact template confirmation text.","Create webinar registration/replay or resource-library private drafts from the reusable templates when those page shapes fit the offer.","Duplicate an existing private draft after typing the exact duplicate confirmation text and using the current draft revision.","Edit a step title, goal, or kind, then move a step up or down.","Edit an existing block title/body with the current draft revision while preserving the block ID, kind, and any checkout-link metadata.","Apply a curated visual style preset to an existing block with the current draft revision while preserving block identity, copy, and linked metadata.","Set bounded canvas layout values for an existing block with the current draft revision while preserving block identity, copy, and linked metadata.","Drag or use the fallback controls to move an existing block within or across draft steps with the current draft revision while preserving block metadata.","Attach the seeded sandbox checkout offer to a draft checkout block after typing the exact checkout-link confirmation text and using the current draft revision.","Link a resource or delivery block to a product/access catalog asset after typing the exact resource-delivery confirmation text and using the current draft revision.","Link a webinar block to external registration and optional replay URLs after typing the exact webinar-link confirmation text and using the current draft revision.","Open the owner-gated preview route to confirm the private draft sequence reflects current D1 state, visual styles, and bounded canvas layout.","Type the exact publish confirmation text with the current revision and publish the draft.","Open the public /funnels/{slug} route and confirm the published sequence is crawlable, saved canvas layout renders on wide screens, the linked checkout block renders the sandbox checkout start panel, resource-linked blocks show entitlement-safe access references and the private delivery panel, and webinar-linked blocks show external registration/replay references.","Type the exact archive confirmation text with the current revision and archive or unpublish the draft.","Use /funnels/source-data to confirm archived drafts and unpublished public routes are excluded from published D1 funnel summaries.","For one already archived draft that no longer needs owner workspace rows, type the exact purge confirmation text with the current archived revision and confirm a purge tombstone is recorded before draft and step rows disappear from /admin/funnels.","For multiple already archived drafts, select the archived drafts from /admin/funnels, type the exact bulk purge confirmation text, and confirm every selected archived revision is validated before one tombstone per draft is recorded and draft rows disappear."],"edgeCases":["The admin draft builder is owner-gated and unpublished draft copy is not crawlable public content.","Template-to-draft creation writes only private D1 draft rows and audit metadata; it does not publish.","Draft duplication writes only a new private D1 draft, copies ordered steps and blocks, strips checkout-link, resource-link, and webinar-link metadata, and does not publish.","Granular block editing changes existing block title/body copy only; it preserves block ID, kind, agent-editable flag, ordered step structure, checkout-link metadata, resource-link metadata, and webinar-link metadata.","Visual style updates store only a curated style ID; they preserve block ID, kind, copy, checkout-link metadata, resource-link metadata, webinar-link metadata, and audit evidence while rendering in private previews and public published routes.","Canvas layout updates store only bounded x, y, width, height, and z-index numbers; they preserve block ID, kind, copy, checkout-link metadata, resource-link metadata, webinar-link metadata, and audit evidence while rendering in private previews and public published routes with a readable mobile stack.","Within-step block reordering changes block order only; it preserves block IDs, kinds, title/body copy, checkout-link metadata, resource-link metadata, webinar-link metadata, step membership, and audit evidence.","The drag/drop UI reuses the same owner-session block reorder and cross-step move endpoint modes with fresh revision checks; it is not a separate direct-agent write surface.","Cross-step block moves append an existing block to another step, refuse to empty the source step, and preserve block IDs, kinds, title/body copy, checkout-link metadata, resource-link metadata, webinar-link metadata, and audit evidence.","Webinar event links store public-safe external URLs only; they do not create webinar provider state, reminder sequences, attendance tracking, replay hosting, provider secrets, private files, signed URLs, live fulfillment automation, or entitlements.","Webinar/resource templates are page shapes only; they do not create webinar provider state, reminder sequences, replay hosting, private files, signed URLs, live fulfillment automation, or entitlements.","Checkout-offer linking writes public-safe metadata into private draft step blocks and does not start a checkout session or enable live billing by itself.","Resource delivery linking writes public-safe product, asset, entitlement-template, and safe route metadata into private draft step blocks. It does not expose private R2 keys, signed URLs, buyer records, raw checkout IDs, arbitrary uploaded asset delivery, live fulfillment automation, or direct agent writes.","Published funnel resource delivery token creation requires a published linked resource block plus a matching checkout intent, entitlement, product, and file asset; mismatched entitlements are rejected and replayed download tokens are rejected by the existing product download stream.","The public linked checkout start remains sandbox-only, exact-confirmed, idempotent, and constrained to the seeded offer stack.","Publishing and archive/unpublish actions require exact confirmation and a fresh revision ID.","Archiving changes status to archived, clears preview_route, and preserves draft, step, block, checkout-link, resource-link, webinar-link, and audit records; it does not physically delete data.","Purging requires an archived draft, exact confirmation, a fresh archived revision ID, and an idempotency key; it records a purge tombstone before deleting draft and step rows and does not delete prior audit rows, product assets, R2 objects, buyer records, or billing state.","Bulk archived-draft purge validates every selected archived draft and revision before deleting any rows, caps each request at 12 drafts, records one tombstone per draft, replays from tombstone evidence, and refuses non-archived drafts.","Non-archived purge, live billing, unauthenticated public agent-created delivery tokens, arbitrary uploaded private asset delivery, signed URLs, live fulfillment automation, live webinar scheduling, attendance tracking, replay hosting, unauthenticated public agent publishing, and broad direct agent writes beyond the owner-session draft write API still require future confirmed-write APIs.","/funnels/source-data lists published D1 funnels but does not expose raw owner session or unpublished or archived private draft data."],"agentAccess":"Agents can read public /funnels/source-data, seeded funnel routes, reusable templates including webinar/resource page shapes, draft duplication capability metadata, block-edit capability metadata, block visual-style capability metadata, block canvas-layout capability metadata, block add/remove capability metadata, block reorder capability metadata, cross-step block move capability metadata, checkout-link capability metadata, resource-delivery-link capability metadata, public funnel resource-delivery-token capability metadata, webinar-event-link capability metadata, archived-draft purge capability metadata, bulk archived-draft purge capability metadata, public funnel checkout-start capability metadata, archive/unpublish lifecycle metadata, direct agent public publishing metadata, and published D1 funnel routes. Owner-session UI may create from templates, duplicate, edit steps, edit existing block copy, apply curated visual style presets, set bounded canvas layout, add reusable blocks, remove safe unlinked blocks, reorder or drag/drop existing blocks within a step, move existing blocks across steps, link checkout offers, link resource delivery, link webinar event/replay references, preview, publish, archive, unpublish, purge archived private draft steps, and bulk-purge selected archived private drafts with actor identity, confirmation where required, idempotency, audit correlation, stale-state checks, and redaction. Owner-session agents can use /api/agent/funnels/draft-writes for private block copy edits, curated visual style presets, bounded canvas layouts, reusable block add/remove, checkout linking/unlinking, block reordering, cross-step block moves, resource-delivery linking, webinar-event linking, private duplication, public publishing, archive/unpublish, archived-draft purge, and bulk archived-draft purge with the same confirmation, stale-state, audit, and redaction boundary. Published funnel resource-token creation requires checkout intent, entitlement, product, and file asset scope to match a published linked resource block; direct agent non-archived purge and unauthenticated public agent publishing are still planned.","validation":["Playwright covers the owner-gated /admin/funnels surface, webinar/resource template records, template-to-draft create path, draft duplicate path, granular block-edit path, block visual-style path, block add/remove path, block reorder path, drag/drop block placement UI, cross-step block move path, linked-checkout block removal refusal, checkout-link create path, resource delivery link path, funnel-scoped private delivery token path, webinar event link path, archived-draft purge path, idempotent replay, stale checkout-link/resource-link/webinar-link/purge, block-edit, block-style, block-add, block-move, and cross-step block-move rejection, seed/update/reorder/publish/archive POST paths, stale publish/archive rejection, archived draft read-only behavior, private draft preview, public D1 funnel route rendering, public linked-checkout start rendering, public visual-style rendering, public resource-link and webinar-link rendering, archive removal from /funnels/source-data, /funnels/source-data capability metadata, direct agent style-write coverage, and agent manifest discovery.","Issue #91 records the first owner-gated draft funnel builder foundation.","Issue #93 records the first step edit and reorder controls.","Issue #95 records the first owner-gated private draft preview route.","Issue #135 records the first exact-confirmed D1 draft publishing path.","Issue #159 records reusable template and block-template source data.","Issue #161 records owner-confirmed template-to-draft creation.","Issue #163 records owner-confirmed checkout-offer linking on private draft steps.","Issue #165 records public sandbox checkout start rendering on published linked checkout blocks.","Issue #213 records webinar/resource funnel template and D1 step-kind storage readiness.","Issue #215 records owner-confirmed private draft duplication.","Issue #341 records owner-confirmed archive/unpublish lifecycle actions.","Issue #409 records owner-created product delivery-gate links for the seeded offer/funnel path.","Issue #417 records owner-confirmed checkout unlinking, owner-confirmed resource delivery links, funnel-scoped private delivery tokens, owner-confirmed webinar event/replay links, owner-confirmed archived-draft purge, owner-session visual style controls, owner-session within-step block reordering, owner-session cross-step block moves, owner-session direct agent public publishing, owner-session direct agent visual style writes, owner-session direct agent archived-draft purge, and the remaining advanced funnel parity follow-up after MVP closeout.","Issue #430 records owner-session granular draft block title/body editing.","Issue #432 records owner-session reusable block add/remove controls with checkout-linked block protection."],"sortOrder":47,"updatedAt":"2026-05-26T23:51:18.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T09:06:58.000Z","environment":"Production screenshot and source-data evidence from funnel feature issues.","method":"Route smoke, owner-gated admin preview, and screenshot evidence.","summary":"Funnel previews, template library, draft admin, publishing, checkout linking, resource delivery links, funnel-scoped private delivery tokens, redacted resource-delivery receipt evidence, webinar event/replay links, archived-draft purge, bulk archived-draft purge, visual style controls, block reordering, cross-step block moves, and webinar/resource shapes have screenshot evidence.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Funnel template library","url":"https://bumpgrade.com/pr-screenshots/issue-159-funnel-template-library.png","kind":"screenshot"},{"label":"Template draft admin","url":"https://bumpgrade.com/pr-screenshots/issue-161-template-draft-admin.png","kind":"screenshot"},{"label":"Webinar and resource funnels","url":"https://bumpgrade.com/pr-screenshots/issue-213-webinar-resource-funnels.png","kind":"screenshot"},{"label":"Draft block editing","url":"https://bumpgrade.com/pr-screenshots/issue-430-funnel-block-editing.png","kind":"screenshot"},{"label":"Draft block add/remove","url":"https://bumpgrade.com/pr-screenshots/issue-432-funnel-block-add-remove.png","kind":"screenshot"},{"label":"Draft block visual styles","url":"https://bumpgrade.com/pr-screenshots/issue-417-funnel-visual-style-controls.png","kind":"screenshot"},{"label":"Resource delivery links","url":"https://bumpgrade.com/pr-screenshots/issue-417-resource-delivery-links.png","kind":"screenshot"},{"label":"Resource delivery tokens","url":"https://bumpgrade.com/pr-screenshots/issue-417-funnel-resource-delivery-tokens.png","kind":"screenshot"},{"label":"Resource delivery receipts","url":"https://bumpgrade.com/pr-screenshots/issue-417-resource-delivery-receipts.png","kind":"screenshot"},{"label":"Webinar event links","url":"https://bumpgrade.com/pr-screenshots/issue-417-webinar-event-links.png","kind":"screenshot"},{"label":"Archived draft purge","url":"https://bumpgrade.com/pr-screenshots/issue-417-archived-draft-purge.png","kind":"screenshot"},{"label":"Bulk archived-draft purge","url":"https://bumpgrade.com/pr-screenshots/issue-417-bulk-purge-policy.png","kind":"screenshot"},{"label":"Draft block reordering","url":"https://bumpgrade.com/pr-screenshots/issue-417-block-reordering.png","kind":"screenshot"},{"label":"Cross-step block moves","url":"https://bumpgrade.com/pr-screenshots/issue-417-cross-step-block-moves.png","kind":"screenshot"},{"label":"Drag/drop block placement","url":"https://bumpgrade.com/pr-screenshots/issue-417-drag-drop-block-placement.png","kind":"screenshot"},{"label":"Agent draft publishing","url":"https://bumpgrade.com/pr-screenshots/issue-417-agent-funnel-publishing.png","kind":"screenshot"}],"validationLinks":[{"label":"Funnels source data","url":"https://bumpgrade.com/funnels/source-data","kind":"source-data"}],"notes":["Issue #14 is the shipped funnel MVP proof. Issue #417 now includes owner-confirmed checkout unlinking, resource delivery links, funnel-scoped private delivery tokens, owner-session agent-created resource delivery tokens, redacted resource-delivery receipt evidence, webinar event/replay links, owner-session visual block style controls, bounded canvas layout controls, archived-draft purge, bulk archived-draft purge, owner-session within-step block reordering, owner-session drag/drop block placement through existing move endpoints, owner-session cross-step block moves, and owner-session direct agent-safe draft writes including visual style presets, bounded canvas layouts, reusable block add/remove, checkout linking/unlinking, resource-delivery and webinar-event linking, block movement, public publishing, archive/unpublish, archived-draft purge, and bulk archived-draft purge; live billing stays in issue #219; arbitrary uploaded private asset delivery, live fulfillment automation, full webinar integrations, unauthenticated public agent-created delivery tokens, non-archived direct agent purge, and unauthenticated public agent writes stay in issue #417.","Issue #215 adds owner-confirmed private draft duplication without copying checkout-link, resource-link, or webinar-link metadata; issue #341 adds owner-confirmed archive/unpublish without deleting evidence; issue #417 adds owner-confirmed checkout unlinking, resource delivery links, funnel-scoped private delivery tokens, owner-session agent-created resource delivery tokens, redacted resource-delivery receipt evidence without buyer or raw checkout data, webinar event/replay links, archived-draft purge with tombstone evidence, bulk archived-draft purge with one tombstone per draft, visual style controls, bounded canvas layout controls, within-step block reordering, drag/drop block placement, cross-step block moves, and expanded owner-session direct agent-safe draft writes including reusable block add/remove and public publishing; issue #430 adds owner-session block title/body editing while preserving block metadata; issue #432 adds owner-session reusable block add/remove while refusing checkout-linked block removal."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-funnel-builder","label":"Inherited feature proof"}},{"id":"journey-publisher-previews-checkout-offer-stack","title":"Publisher previews and starts a sandbox checkout bump stack","featureId":"feature-checkout-offers","featureStatus":"launch-preview","issueNumbers":[15,81,99],"primaryUser":"Publisher or agent planning checkout revenue lifts","userGoal":"Inspect the primary offer, choose the seeded order bump, and start a confirmed sandbox Checkout Session without enabling live billing.","sourceEvidence":["https://bumpgrade.com/offers/source-data","https://bumpgrade.com/offers/indie-launch-stack","https://bumpgrade.com/api/commerce/checkout","https://bumpgrade.com/commerce/source-data","https://github.com/markitics/bumpgrade/issues/15","https://github.com/markitics/bumpgrade/issues/81","https://github.com/markitics/bumpgrade/issues/99"],"happyPath":["Open /offers/indie-launch-stack.","Review the primary sandbox launch pass and launch checklist order bump.","Choose the order bump, enter the exact confirmation text, and submit the sandbox checkout start form.","In test or incomplete-secret environments, receive a redacted preview response.","In production sandbox mode with valid secrets, receive a Bumpgrade redirect URL for the Checkout Session rather than a raw Stripe URL."],"edgeCases":["Live billing mode remains disabled.","Only the seeded order bump can be attached in this slice.","One-click upsell/downsell charging, fulfillment, refund, coupon, and customer portal writes require later confirmed-write APIs.","Raw Stripe identifiers and private buyer data stay server-private."],"agentAccess":"Agents can read /offers/source-data and the preview route, and can inspect the confirmed-write checkout boundary. Agents must not create or mutate checkout sessions without exact confirmation, idempotency, stale-state checks, audit correlation, redaction, and webhook evidence.","validation":["Playwright covers /offers/source-data, /offers/indie-launch-stack, the order-bump form preview response, sitemap discovery, and agent manifest read-contract discovery.","Issue #99 records the confirmed sandbox checkout start plus constrained order-bump support."],"sortOrder":48,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-18T16:30:00.000Z","environment":"Production screenshot and sandbox checkout contract evidence.","method":"Sandbox checkout start, checkout success, order bump, and post-purchase source-data validation.","summary":"Sandbox checkout, order bump, referral attribution, and post-purchase decision evidence are proven; live mode is not enabled.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Order bump checkout start","url":"https://bumpgrade.com/pr-screenshots/issue-99-checkout-order-bump-start.png","kind":"screenshot"},{"label":"Checkout success","url":"https://bumpgrade.com/pr-screenshots/issue-133-checkout-success-desktop.png","kind":"screenshot"}],"validationLinks":[{"label":"Offers source data","url":"https://bumpgrade.com/offers/source-data","kind":"source-data"},{"label":"Commerce source data","url":"https://bumpgrade.com/commerce/source-data","kind":"source-data"}],"notes":["This proof intentionally separates sandbox checkout from live product payment readiness."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-checkout-offers","label":"Inherited feature proof"}},{"id":"journey-publisher-previews-product-access","title":"Publisher previews product access rules","featureId":"feature-products-access","featureStatus":"live","issueNumbers":[16,83,101,139,141,143,146,147,151,179,181,185,187,251,403,405,407,409],"primaryUser":"Publisher or agent planning fulfillment","userGoal":"Inspect products, payment-plan read records, draft product creation, buyer-facing test checkout links, delivery-gate links, public test checkout evidence, assets, access rules, entitlement templates, sandbox entitlement grant mappings, subscription-backed membership access, owner entitlement rows, owner-confirmed revocation intents, and protected fixture delivery checks before live billing or private content storage is enabled.","sourceEvidence":["https://bumpgrade.com/products/source-data","https://bumpgrade.com/products/indie-launch-library","https://bumpgrade.com/products/entitlements","https://bumpgrade.com/api/products/entitlements","https://bumpgrade.com/api/products/test-checkout","https://bumpgrade.com/api/products/download-tokens","https://bumpgrade.com/api/products/protected-content","https://bumpgrade.com/api/admin/products/catalog","https://bumpgrade.com/api/admin/products/test-checkout-links","https://bumpgrade.com/api/admin/products/delivery-gates","https://bumpgrade.com/api/admin/products/offer-access-grants","https://bumpgrade.com/api/admin/products/assets","https://bumpgrade.com/api/admin/products/revocation-intents","https://bumpgrade.com/admin/products","https://bumpgrade.com/offers/source-data","https://bumpgrade.com/funnels/source-data","https://github.com/markitics/bumpgrade/issues/16","https://github.com/markitics/bumpgrade/issues/219","https://github.com/markitics/bumpgrade/issues/409"],"happyPath":["Fetch /products/source-data.","Find seeded product types, seeded pay-in-full, installment, and subscription payment-plan records, owner product creation contract, owner product test checkout link contract, owner product delivery-gate contract, owner product offer/access test grant contract, asset IDs, access rules, entitlement templates, sandbox grant mappings, subscription membership access contract, aggregate entitlement inspection counts, customer lookup contract, private R2-backed delivery contract, owner-upload intent contract, owner-confirmed revocation intent contract, protected content readiness, protected fixture delivery contract, revision ID, and write boundary.","Open /products/indie-launch-library to inspect the public preview and payment-plan cards.","Open /admin/products as a verified owner to create a draft product record, create a buyer-facing test checkout link after a current product updatedAt check, link that checkout link to the seeded offer/funnel delivery gates after a current checkout-link revision check, and inspect private buyer entitlement rows, checkout state, product and price context, queued fulfillment evidence, revocation intent records, and protected content readiness.","Use /offers/source-data, /funnels/source-data, and /commerce/source-data to confirm checkout, funnel, delivery-gate, and webhook dependencies before assuming live billing or fulfillment exists."],"edgeCases":["Payment-plan records are public-safe seeded read records only and do not create live Stripe Prices, Checkout Sessions, installment schedules, charges, customer records, or portal sessions.","Owner-created draft products do not create Stripe products or prices.","Owner-created product test checkout links create only a test price record and public test checkout route; they do not create live offer copy or publish funnels.","Owner product delivery-gate links connect a test checkout link to the seeded offer/funnel path only; they do not create Stripe Checkout Sessions, live charges, live published offer/funnel state, signed URLs, private R2 keys, or arbitrary customer delivery.","Public /products/source-data exposes aggregate product creation, test checkout link, delivery-gate, test grant, and seeded payment-plan records plus redaction flags, not owner emails, actor user IDs, buyer emails, buyer hashes, checkout link IDs, checkout intent IDs, entitlement IDs, idempotency keys, metadata JSON, raw Stripe IDs, raw Stripe Price IDs, or live amounts.","Signed object URLs, real protected media, destructive revocation, customer delivery of arbitrary uploads, Customer Portal actions, live Stripe Checkout Sessions, live payment-plan checkout, live charges, and live fulfillment automation require future APIs."],"agentAccess":"Agents can read /products/source-data, /offers/source-data, /funnels/source-data, seeded payment-plan read records, aggregate product creation counts, aggregate owner-created product test checkout counts, aggregate owner product delivery-gate counts, aggregate entitlement inspection counts, the preview route, the customer-safe checkout intent lookup contract, the short-lived private R2-backed download-token boundary with redemption revalidation, the owner-authenticated private asset upload intent boundary, owner-confirmed non-destructive revocation intent evidence, protected content readiness, protected fixture delivery checks, and subscription-backed membership access state. Payment-plan records expose stable IDs and billing-model semantics only; live amounts, Stripe Price creation, Checkout Sessions, customer records, and Customer Portal actions require future confirmed-write APIs.","validation":["Playwright covers /products/source-data payment-plan read records, payment-plan preview cards, product creation contract redaction, owner draft product creation, owner-created product test checkout link contract redaction, owner product delivery-gate contract redaction, customer /products/entitlements lookup, owner /admin/products inspection, revocation intent readiness, protected content readiness, sitemap discovery, and agent manifest read-contract discovery.","Issue #16 records seeded payment-plan read semantics without live billing mutation.","Issue #409 records owner-created product delivery-gate link evidence."],"sortOrder":49,"updatedAt":"2026-05-24T05:27:41.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-18T18:00:00.000Z","environment":"Production screenshot and product/access source-data evidence.","method":"Product preview, entitlement lookup, download token, protected content, and owner inspection smoke evidence.","summary":"Product access, entitlement lookup, protected fixture delivery, and membership state have route and screenshot proof.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"R2 delivery","url":"https://bumpgrade.com/pr-screenshots/issue-146-r2-delivery-desktop.png","kind":"screenshot"},{"label":"Customer entitlements","url":"https://bumpgrade.com/pr-screenshots/issue-141-customer-entitlements-desktop.png","kind":"screenshot"}],"validationLinks":[{"label":"Products source data","url":"https://bumpgrade.com/products/source-data","kind":"source-data"}],"notes":["Customer delivery of arbitrary private uploads still needs a later confirmed rollout."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-products-access","label":"Inherited feature proof"}},{"id":"journey-buyer-chooses-post-purchase-offer","title":"Buyer chooses a post-purchase follow-up offer","featureId":"feature-checkout-offers","featureStatus":"launch-preview","issueNumbers":[15,99,117],"primaryUser":"Buyer returning from a trusted sandbox checkout","userGoal":"Accept or decline a time-boxed upsell/downsell follow-up without triggering a one-click charge.","sourceEvidence":["https://bumpgrade.com/commerce/post-purchase/{checkoutIntentId}","https://bumpgrade.com/api/commerce/post-purchase-decisions","https://bumpgrade.com/offers/source-data","https://bumpgrade.com/commerce/source-data","https://github.com/markitics/bumpgrade/issues/15","https://github.com/markitics/bumpgrade/issues/99","https://github.com/markitics/bumpgrade/issues/117"],"happyPath":["Complete or simulate a trusted sandbox checkout intent.","Open the post-purchase route for that checkout intent.","Choose the launch accelerator upsell or decline it and choose the launch review downsell.","The decision API records follow-up evidence only and returns a redacted public response.","Source-data exposes aggregate decision counts."],"edgeCases":["Checkout intents that are missing, stale, or not paid/completed cannot record decisions.","Accepted follow-up decisions do not charge a card or grant access.","Duplicate idempotency keys replay the same decision row.","Raw Stripe IDs, buyer details, entitlement data, and private payment data stay out of public source-data."],"agentAccess":"Agents can inspect the decision contract and aggregate counts. Agents cannot create billing-impacting post-purchase charges in this slice.","validation":["Playwright covers post-purchase page rendering, accepted/declined decision writes, stale-state rejection, aggregate source-data, and no billing/fulfillment mutation."],"sortOrder":50,"updatedAt":"2026-05-20T15:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-18T16:30:00.000Z","environment":"Production screenshot and sandbox checkout contract evidence.","method":"Sandbox checkout start, checkout success, order bump, and post-purchase source-data validation.","summary":"Sandbox checkout, order bump, referral attribution, and post-purchase decision evidence are proven; live mode is not enabled.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Order bump checkout start","url":"https://bumpgrade.com/pr-screenshots/issue-99-checkout-order-bump-start.png","kind":"screenshot"},{"label":"Checkout success","url":"https://bumpgrade.com/pr-screenshots/issue-133-checkout-success-desktop.png","kind":"screenshot"}],"validationLinks":[{"label":"Offers source data","url":"https://bumpgrade.com/offers/source-data","kind":"source-data"},{"label":"Commerce source data","url":"https://bumpgrade.com/commerce/source-data","kind":"source-data"}],"notes":["This proof intentionally separates sandbox checkout from live product payment readiness."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-checkout-offers","label":"Inherited feature proof"}},{"id":"journey-publisher-previews-audience-automation","title":"Publisher previews audience opt-in automation","featureId":"feature-email-automation-crm","featureStatus":"live","issueNumbers":[17,85,103,137,167,169,171,173,175,177,183,189,191,197,199,201,203,205,207,209,211,253,259,347,351,354,358,360,362,364,366,368,370,372,374,376,378,380,420],"primaryUser":"Publisher or agent planning list growth","userGoal":"Inspect opt-ins, suppression, CRM notes, broadcast and sequence dry-run gates, readiness boundaries, import/export planning, and owner-only test-send paths before subscriber delivery exists.","sourceEvidence":["https://bumpgrade.com/audience/source-data","https://bumpgrade.com/audience/indie-launch-waitlist","https://bumpgrade.com/api/audience/opt-in","https://bumpgrade.com/api/audience/unsubscribe","https://bumpgrade.com/api/admin/audience/notes","https://bumpgrade.com/api/admin/audience/sequences/schedule-intents","https://bumpgrade.com/api/admin/audience/broadcasts/schedule-intents","https://bumpgrade.com/api/admin/audience/broadcasts/delivery-batches","https://bumpgrade.com/api/admin/audience/broadcasts/delivery-queue-messages","https://bumpgrade.com/api/admin/audience/broadcasts/dispatch-preflights","https://bumpgrade.com/api/admin/audience/broadcasts/dispatch-attempts","https://bumpgrade.com/api/admin/audience/import-intents","https://bumpgrade.com/api/admin/audience/import-preflights","https://bumpgrade.com/admin/audience","https://bumpgrade.com/funnels/source-data","https://github.com/markitics/bumpgrade/issues/17","https://github.com/markitics/bumpgrade/issues/85","https://github.com/markitics/bumpgrade/issues/103","https://github.com/markitics/bumpgrade/issues/137","https://github.com/markitics/bumpgrade/issues/167","https://github.com/markitics/bumpgrade/issues/169","https://github.com/markitics/bumpgrade/issues/171","https://github.com/markitics/bumpgrade/issues/173","https://github.com/markitics/bumpgrade/issues/175","https://github.com/markitics/bumpgrade/issues/177","https://github.com/markitics/bumpgrade/issues/183","https://github.com/markitics/bumpgrade/issues/189","https://github.com/markitics/bumpgrade/issues/191","https://github.com/markitics/bumpgrade/issues/197","https://github.com/markitics/bumpgrade/issues/199","https://github.com/markitics/bumpgrade/issues/201","https://github.com/markitics/bumpgrade/issues/203","https://github.com/markitics/bumpgrade/issues/205","https://github.com/markitics/bumpgrade/issues/207","https://github.com/markitics/bumpgrade/issues/209","https://github.com/markitics/bumpgrade/issues/211","https://github.com/markitics/bumpgrade/issues/253","https://github.com/markitics/bumpgrade/issues/259","https://github.com/markitics/bumpgrade/issues/347","https://github.com/markitics/bumpgrade/issues/351","https://github.com/markitics/bumpgrade/issues/354","https://bumpgrade.com/api/admin/audience/sequences/delivery-batches","https://github.com/markitics/bumpgrade/issues/358","https://bumpgrade.com/api/admin/audience/sequences/delivery-queue-messages","https://github.com/markitics/bumpgrade/issues/360","https://bumpgrade.com/api/admin/audience/sequences/dispatch-preflights","https://github.com/markitics/bumpgrade/issues/362","https://bumpgrade.com/api/admin/audience/sequences/dispatch-attempts","https://github.com/markitics/bumpgrade/issues/364","https://bumpgrade.com/api/admin/audience/sequences/queue-producer-readiness","https://github.com/markitics/bumpgrade/issues/366","https://bumpgrade.com/api/admin/audience/sequences/queue-consumer-readiness","https://github.com/markitics/bumpgrade/issues/368","https://bumpgrade.com/api/admin/audience/sequences/provider-call-readiness","https://github.com/markitics/bumpgrade/issues/370","https://bumpgrade.com/api/admin/audience/sequences/delivery-attempt-readiness","https://github.com/markitics/bumpgrade/issues/372","https://bumpgrade.com/api/admin/audience/sequences/delivery-result-readiness","https://github.com/markitics/bumpgrade/issues/374","https://bumpgrade.com/api/admin/audience/sequences/delivery-status-webhook-readiness","https://github.com/markitics/bumpgrade/issues/376","https://bumpgrade.com/api/admin/audience/sequences/provider-polling-readiness","https://github.com/markitics/bumpgrade/issues/378","https://bumpgrade.com/api/admin/audience/sequences/receipt-payload-readiness","https://github.com/markitics/bumpgrade/issues/380","https://github.com/markitics/bumpgrade/issues/420"],"happyPath":["Open /admin/audience as a verified owner.","Confirm the seeded sequence workspace revision, sequence status, and readiness count.","Record an owner-only sequence step test send with exact confirmation, idempotency, and audit correlation.","Verify /audience/source-data summarizes the test-send count and redaction flags without raw recipient email, subscriber payloads, Queue messages, provider message IDs, or public agent sends."],"edgeCases":["Owner-only broadcast and sequence test sends can call the configured Cloudflare Email binding for the verified owner session email only; they are not subscriber blasts, public agent sends, Queue producer/consumer execution, recipient-payload creation, provider response storage, or provider message ID storage.","Public /audience/source-data exposes aggregate test-send status and redaction flags, not recipient email, recipient hash, actor email, actor hash, idempotency keys, confirmation hashes, raw email body, provider errors, or private metadata."],"agentAccess":"Agents can read aggregate owner-only broadcast and sequence test-send counts and redaction flags from /audience/source-data. Owner sessions can trigger the test-send APIs from /admin/audience with exact confirmation, idempotency, audit correlation, stale-state checks, and owner-only recipient scope. Direct public agent sequence/broadcast sends, subscriber delivery, Queue dispatch, recipient payloads, provider response storage, and provider message IDs remain disabled.","validation":["Playwright covers /audience/source-data, owner-only sequence and broadcast test-send redaction, owner-session API creation in APP_ENV=test capture mode, unauthenticated rejection, duplicate idempotency replay, stale readiness rejection, /admin/audience rendering, and agent manifest discovery."],"sortOrder":50,"updatedAt":"2026-05-25T04:39:42.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-23T14:10:00.000Z","environment":"Production screenshot and audience automation source-data evidence.","method":"Opt-in, suppression, CRM note, sequence Queue consumer, sequence provider-call, sequence provider-polling, sequence receipt-payload, broadcast readiness, queue, provider, and dispatch readiness route checks.","summary":"Audience capture, sequence handoff, and campaign readiness surfaces have broad screenshot proof; real provider sends remain gated.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Audience opt-in","url":"https://bumpgrade.com/pr-screenshots/issue-103-audience-opt-in.png","kind":"screenshot"},{"label":"Broadcast readiness","url":"https://bumpgrade.com/pr-screenshots/issue-171-broadcast-readiness.png","kind":"screenshot"},{"label":"Queue consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-211-audience-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Sequence Queue consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-368-admin-audience-sequence-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Sequence provider-call readiness","url":"https://bumpgrade.com/pr-screenshots/issue-370-admin-audience-sequence-provider-call-readiness.png","kind":"screenshot"},{"label":"Sequence delivery-attempt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-372-admin-audience-sequence-delivery-attempt-readiness.png","kind":"screenshot"},{"label":"Sequence delivery-result readiness","url":"https://bumpgrade.com/pr-screenshots/issue-374-admin-audience-sequence-delivery-result-readiness.png","kind":"screenshot"},{"label":"Sequence delivery-status webhook readiness","url":"https://bumpgrade.com/pr-screenshots/issue-376-admin-audience-sequence-delivery-status-webhook-readiness.png","kind":"screenshot"},{"label":"Sequence provider-polling readiness","url":"https://bumpgrade.com/pr-screenshots/issue-378-admin-audience-sequence-provider-polling-readiness.png","kind":"screenshot"},{"label":"Sequence receipt-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-380-admin-audience-sequence-receipt-payload-readiness.png","kind":"screenshot"}],"validationLinks":[{"label":"Audience source data","url":"https://bumpgrade.com/audience/source-data","kind":"source-data"}],"notes":["Provider sends and queue consumption are not claimed as live customer email delivery."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-email-automation-crm","label":"Inherited feature proof"}},{"id":"journey-publisher-verifies-sandbox-entitlement-grant","title":"Publisher verifies sandbox entitlement grant evidence","featureId":"feature-products-access","featureStatus":"live","issueNumbers":[16,83,99,101,139,141,143,146,147,151,179,181,185,187,251,403,405,407,409],"primaryUser":"Publisher or agent validating fulfillment readiness","userGoal":"Confirm that paid sandbox checkout webhooks can grant product entitlements, trusted Stripe Billing state can sync membership access, seeded payment-plan records describe billing semantics without live billing mutation, owner-created draft products can produce buyer-facing test checkout links, delivery-gate links, and access grant evidence, queued fulfillment evidence stays public-safe, owner-confirmed revocation intent records stay non-destructive, and protected fixtures return only for active eligible checkout-linked entitlements.","sourceEvidence":["https://bumpgrade.com/products/source-data","https://bumpgrade.com/products/entitlements","https://bumpgrade.com/api/products/entitlements","https://bumpgrade.com/api/products/test-checkout","https://bumpgrade.com/api/products/download-tokens","https://bumpgrade.com/api/products/protected-content","https://bumpgrade.com/api/admin/products/catalog","https://bumpgrade.com/api/admin/products/test-checkout-links","https://bumpgrade.com/api/admin/products/delivery-gates","https://bumpgrade.com/api/admin/products/offer-access-grants","https://bumpgrade.com/api/admin/products/assets","https://bumpgrade.com/api/admin/products/revocation-intents","https://bumpgrade.com/admin/products","https://bumpgrade.com/commerce/source-data","https://bumpgrade.com/offers/source-data","https://bumpgrade.com/funnels/source-data","https://github.com/markitics/bumpgrade/issues/16","https://github.com/markitics/bumpgrade/issues/219","https://github.com/markitics/bumpgrade/issues/409"],"happyPath":["Fetch /products/source-data and confirm seeded payment-plan records expose stable productPaymentPlanId values, product IDs, billing models, null live amounts, and redaction flags.","Create a draft product record as a verified owner without billing or fulfillment mutation.","Create a buyer-facing test checkout link for the owner-created product after exact confirmation, idempotency, and a current product updatedAt check.","Link that checkout link to the seeded offer/funnel delivery gates after exact confirmation, idempotency, a current product updatedAt check, and a current checkout-link revision check.","Complete the public test checkout after exact confirmation, idempotency, and a current link revision check.","Open /products/entitlements with the checkout intent reference to confirm customer-safe entitlement and fulfillment status.","Open /admin/products as a verified owner to inspect draft products, test checkout links, delivery-gate links, entitlement rows, queued fulfillment evidence, revocation intents, and protected content readiness."],"edgeCases":["Payment-plan records do not create Stripe Prices, Checkout Sessions, live charges, installment schedules, customer records, Customer Portal sessions, or access grants.","Duplicate draft product creation idempotency keys replay only identical requests.","Duplicate owner-created product test checkout link idempotency keys replay only identical requests.","Duplicate owner product delivery-gate idempotency keys replay only identical requests.","Public test checkout completion rejects stale link revisions and conflicting idempotency replays.","Public /products/source-data exposes seeded payment-plan records and aggregate counts, not raw buyer rows, owner identity, checkout link IDs, checkout IDs, entitlement IDs, idempotency keys, raw Stripe Price IDs, or live amounts.","Raw Stripe identifiers and buyer email remain server-private."],"agentAccess":"Agents can read /products/source-data, /offers/source-data, /funnels/source-data, seeded payment-plan read records, /api/products/entitlements, /api/products/test-checkout, /api/products/download-tokens, /api/products/protected-content, and /commerce/source-data to understand billing-model semantics, draft product creation, owner-created product test checkout, owner-created product delivery-gate link, entitlement grant, customer-safe lookup, short-lived private R2-backed fixture delivery, owner-upload intent, owner-confirmed non-destructive revocation intent, protected content, subscription-backed membership access, and aggregate inspection boundaries. Agents cannot grant live access, create live payment-plan checkout, destructively revoke, expose private buyer data, deliver arbitrary protected bodies, deliver arbitrary uploads to customers, create Stripe products or prices, mutate subscriptions, publish live offer/funnel changes, create Customer Portal sessions, or issue signed object URLs without future authenticated confirmed-write APIs.","validation":["Playwright covers source-data payment-plan output, payment-plan preview cards, product creation contract redaction, owner draft product creation, owner-created product test checkout link contract redaction, owner product delivery-gate contract redaction, public test checkout completion, duplicate handling, aggregate redaction, customer-safe lookup, private R2-backed token delivery, protected fixture delivery, subscription-backed membership access, owner private asset upload intent creation, owner-confirmed non-destructive revocation intent creation, owner /admin/products inspection, revocation intent readiness, protected content readiness, and duplicate webhook idempotency.","Issue #16 records seeded product payment-plan read records.","Issue #409 records the owner-created product delivery-gate link path."],"sortOrder":50,"updatedAt":"2026-05-24T05:27:41.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-18T18:00:00.000Z","environment":"Production screenshot and product/access source-data evidence.","method":"Product preview, entitlement lookup, download token, protected content, and owner inspection smoke evidence.","summary":"Product access, entitlement lookup, protected fixture delivery, and membership state have route and screenshot proof.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"R2 delivery","url":"https://bumpgrade.com/pr-screenshots/issue-146-r2-delivery-desktop.png","kind":"screenshot"},{"label":"Customer entitlements","url":"https://bumpgrade.com/pr-screenshots/issue-141-customer-entitlements-desktop.png","kind":"screenshot"}],"validationLinks":[{"label":"Products source data","url":"https://bumpgrade.com/products/source-data","kind":"source-data"}],"notes":["Customer delivery of arbitrary private uploads still needs a later confirmed rollout."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-products-access","label":"Inherited feature proof"}},{"id":"journey-publisher-previews-analytics-experiments","title":"Publisher previews analytics and experiment reporting","featureId":"feature-analytics-testing","featureStatus":"live","issueNumbers":[18,87,105,107,119,121,123,125,127,129,261,263,265,267,269,271,284,286,288,290,292,294,297,299,301,303,305,307,309,311,422],"primaryUser":"Publisher or agent optimizing a launch funnel","userGoal":"Inspect seeded analytics definitions, capture privacy-safe test events, record browser-side funnel page views with deterministic variant and source attribution evidence, route the seeded sandbox opt-in copy through public-safe source/campaign rules and the same session assignment with a baseline holdout, record owner-confirmed winner rollout and rollback evidence for unmatched traffic, read dashboard-visible fixed-window aggregate source rows, assign deterministic variants, read aggregate conversion report rows, read aggregate report export metadata, read owner-reviewed cohort comparison evidence, read owner-reviewed alert threshold/anomaly-review evidence, read owner-reviewed notification delivery readiness evidence, record owner-confirmed notification inbox records, record owner-confirmed dispatch preflights, record owner-reviewed provider/domain readiness evidence, record owner-reviewed content/consent readiness evidence, record owner-reviewed send-payload readiness evidence, record owner-reviewed queue-producer readiness evidence, record owner-reviewed queue-consumer readiness evidence, record owner-reviewed provider-call readiness evidence, record owner-reviewed delivery-attempt readiness evidence, record owner-reviewed delivery-result readiness evidence, record owner-reviewed delivery-status webhook readiness evidence, record owner-reviewed provider-polling readiness evidence, record owner-reviewed receipt-payload readiness evidence, record owner-reviewed delivery-receipt readiness evidence, record owner-reviewed provider-status reconciliation readiness evidence, and record owner-reviewed experiment decision evidence before cookies, contact-level reporting, automated alerts, owner email sends, Queue producer execution, Queue consumer execution, queue dispatch, queue messages, queue message consumption, queue acknowledgements, retry/dead-letter rows, queue payload body reads, queue payload bodies, recipient payloads, personalized bodies, raw payload bodies, provider sends, provider calls, delivery attempts, delivery results, delivery status webhooks, provider responses, provider message IDs, delivery receipts, receipt payloads, status webhooks, provider polling, provider status reconciliation, provider configuration, provider secrets, sender credentials, private DNS credentials, body templates, unsubscribe URLs, customer alerts, raw/private exports, direct public agent writes, or revenue claims exist.","sourceEvidence":["https://bumpgrade.com/analytics/source-data","https://bumpgrade.com/analytics/indie-launch-dashboard","https://bumpgrade.com/api/analytics/events","https://bumpgrade.com/api/analytics/assignments","https://bumpgrade.com/api/admin/analytics/experiment-decisions","https://bumpgrade.com/api/admin/analytics/notification-inbox-records","https://bumpgrade.com/api/admin/analytics/notification-dispatch-preflights","https://bumpgrade.com/api/admin/analytics/notification-provider-domain-readiness","https://bumpgrade.com/api/admin/analytics/notification-content-consent-readiness","https://bumpgrade.com/api/admin/analytics/notification-send-payload-readiness","https://bumpgrade.com/api/admin/analytics/notification-queue-producer-readiness","https://bumpgrade.com/api/admin/analytics/notification-queue-consumer-readiness","https://bumpgrade.com/api/admin/analytics/notification-provider-call-readiness","https://bumpgrade.com/api/admin/analytics/notification-delivery-attempt-readiness","https://bumpgrade.com/api/admin/analytics/notification-delivery-result-readiness","https://bumpgrade.com/api/admin/analytics/notification-delivery-status-webhook-readiness","https://bumpgrade.com/api/admin/analytics/notification-provider-polling-readiness","https://bumpgrade.com/api/admin/analytics/notification-receipt-payload-readiness","https://bumpgrade.com/api/admin/analytics/notification-delivery-receipt-readiness","https://bumpgrade.com/admin/analytics","https://bumpgrade.com/funnels/source-data","https://bumpgrade.com/funnels/indie-launch-sandbox","https://github.com/markitics/bumpgrade/issues/18","https://github.com/markitics/bumpgrade/issues/87","https://github.com/markitics/bumpgrade/issues/105","https://github.com/markitics/bumpgrade/issues/107","https://github.com/markitics/bumpgrade/issues/119","https://github.com/markitics/bumpgrade/issues/121","https://github.com/markitics/bumpgrade/issues/123","https://github.com/markitics/bumpgrade/issues/125","https://github.com/markitics/bumpgrade/issues/127","https://github.com/markitics/bumpgrade/issues/129","https://github.com/markitics/bumpgrade/issues/261","https://github.com/markitics/bumpgrade/issues/263","https://github.com/markitics/bumpgrade/issues/265","https://github.com/markitics/bumpgrade/issues/267","https://github.com/markitics/bumpgrade/issues/269","https://github.com/markitics/bumpgrade/issues/271","https://github.com/markitics/bumpgrade/issues/284","https://github.com/markitics/bumpgrade/issues/286","https://github.com/markitics/bumpgrade/issues/288","https://github.com/markitics/bumpgrade/issues/290","https://github.com/markitics/bumpgrade/issues/292","https://github.com/markitics/bumpgrade/issues/294","https://github.com/markitics/bumpgrade/issues/297","https://github.com/markitics/bumpgrade/issues/299","https://github.com/markitics/bumpgrade/issues/301","https://github.com/markitics/bumpgrade/issues/303","https://github.com/markitics/bumpgrade/issues/305","https://github.com/markitics/bumpgrade/issues/307","https://github.com/markitics/bumpgrade/issues/309","https://bumpgrade.com/api/admin/analytics/notification-provider-status-reconciliation-readiness","https://github.com/markitics/bumpgrade/issues/311","https://github.com/markitics/bumpgrade/issues/422"],"happyPath":["Fetch /analytics/source-data.","Find event IDs, page-view beacon boundary, custom routing rule IDs, aggregate source attribution counts, aggregate variant event counts, fixed time windows, metric IDs, aggregate event counts, aggregate conversion report rows, experiment IDs, variant IDs, assignment rule, assignment API, dashboard source section, and write boundary.","Fetch /analytics/source-data?window=24h to inspect public-safe aggregate source and conversion rows for one supported fixed window.","Open /funnels/indie-launch-sandbox with a recognized safe UTM source or campaign and let the session-idempotent assignment route the opt-in hero copy by custom rule, then let the page-view beacon record a seeded event with that same variant ID and normalized source attribution.","POST a seeded event to /api/analytics/events with an idempotency key and source route.","POST a seeded experiment assignment to /api/analytics/assignments with an anonymous assignment key, idempotency key, source route, and public-safe routingContext when a recognized source or campaign should match.","Read customRoutingRules from /analytics/source-data to inspect rule IDs, priority, matching signal, target variant, redaction flags, and the no-raw-routing-URL boundary.","Read reportExports from /analytics/source-data to inspect aggregate report sections, selected fixed window, sample-size caveats, fixture cohort definitions, owner-reviewed cohort comparison evidence, owner-reviewed alert threshold/anomaly-review evidence, and owner-reviewed notification delivery readiness evidence.","Read notificationInboxRecords from /analytics/source-data to inspect owner-confirmed inbox record counts, current readiness evidence, and redaction flags.","Read notificationDispatchPreflights from /analytics/source-data to inspect owner-confirmed dispatch preflight counts, current inbox evidence, and redaction flags.","Read notificationProviderDomainReadiness from /analytics/source-data to inspect owner-reviewed provider/domain readiness counts, current dispatch-preflight evidence, and redaction flags.","Read notificationContentConsentReadiness from /analytics/source-data to inspect owner-reviewed content/consent readiness counts, current provider/domain evidence, and redaction flags.","Read notificationSendPayloadReadiness from /analytics/source-data to inspect owner-reviewed send-payload readiness counts, current content/consent evidence, and redaction flags.","Read notificationQueueProducerReadiness from /analytics/source-data to inspect owner-reviewed queue-producer readiness counts, current send-payload evidence, and redaction flags.","Read notificationQueueConsumerReadiness from /analytics/source-data to inspect owner-reviewed queue-consumer readiness counts, current queue-producer evidence, and redaction flags.","Read notificationProviderCallReadiness from /analytics/source-data to inspect owner-reviewed provider-call readiness counts, current queue-consumer evidence, and redaction flags.","Read notificationDeliveryAttemptReadiness from /analytics/source-data to inspect owner-reviewed delivery-attempt readiness counts, current provider-call evidence, and redaction flags.","Read notificationDeliveryResultReadiness from /analytics/source-data to inspect owner-reviewed delivery-result readiness counts, current delivery-attempt evidence, and redaction flags.","Read notificationDeliveryStatusWebhookReadiness from /analytics/source-data to inspect owner-reviewed delivery-status webhook readiness counts, current delivery-result evidence, and redaction flags.","Read notificationProviderPollingReadiness from /analytics/source-data to inspect owner-reviewed provider-polling readiness counts, current delivery-status webhook evidence, and redaction flags.","Read notificationReceiptPayloadReadiness from /analytics/source-data to inspect owner-reviewed receipt-payload readiness counts, current provider-polling evidence, and redaction flags.","Read notificationDeliveryReceiptReadiness from /analytics/source-data to inspect owner-reviewed delivery-receipt readiness counts, current receipt-payload evidence, and redaction flags.","Read notificationProviderStatusReconciliationReadiness from /analytics/source-data to inspect owner-reviewed provider-status reconciliation readiness counts, current delivery-receipt evidence, and redaction flags.","Open /admin/analytics as a verified owner and record a redacted experiment decision with the current aggregate assignment counts, fixed-window conversion sample size, and sample-size caveat acknowledgement.","Confirm duplicate idempotency returns the same public-safe event or assignment without duplicating rows.","Open /analytics/indie-launch-dashboard to inspect the public preview, aggregate source rows, custom routing rule summary, fixed-window controls, and caveats."],"edgeCases":["Public source-data exposes aggregate counts, aggregate source attribution counts, aggregate variant counts, custom routing rule metadata, fixed-window metadata, report export metadata, owner-reviewed cohort comparison evidence, owner-reviewed alert threshold/anomaly-review evidence, owner-reviewed notification delivery readiness evidence, owner-confirmed notification inbox aggregate evidence, owner-confirmed dispatch preflight aggregate evidence, owner-reviewed provider/domain readiness aggregate evidence, owner-reviewed content/consent readiness aggregate evidence, owner-reviewed send-payload readiness aggregate evidence, owner-reviewed queue-producer readiness aggregate evidence, owner-reviewed queue-consumer readiness aggregate evidence, owner-reviewed provider-call readiness aggregate evidence, owner-reviewed delivery-attempt readiness aggregate evidence, owner-reviewed delivery-result readiness aggregate evidence, owner-reviewed delivery-status webhook readiness aggregate evidence, owner-reviewed provider-polling readiness aggregate evidence, owner-reviewed receipt-payload readiness aggregate evidence, owner-reviewed delivery-receipt readiness aggregate evidence, owner-reviewed provider-status reconciliation readiness aggregate evidence, and conversion rows only, not raw event, raw routing URLs, or assignment rows.","Unsupported event IDs, experiment IDs, source routes, missing idempotency keys, missing assignment keys, and unrecognized routing signals return public-safe validation or unmatched seeded fallback behavior.","Bot, crawler, and preview/test-suppressed page-view traffic is ignored before analytics event rows are created.","Cookie assignment, contact-level analytics, raw referrer/query reporting, raw routing URL storage, automated alert sends, owner email sends, Queue producer execution, Queue consumer execution, queue dispatch, queue messages, queue message consumption, acknowledgements, retry/dead-letter rows, queue payload body reads, queue payload bodies, recipient payloads, personalized bodies, raw payload bodies, provider sends, provider calls, delivery attempts, delivery results, delivery status webhooks, provider responses, provider message IDs, delivery receipts, receipt payloads, status webhooks, provider polling, provider status reconciliation, provider configuration, provider secrets, sender credentials, private DNS credentials, body templates, unsubscribe URLs, customer alerts, experiment traffic changes beyond the seeded sandbox copy path, automated winners, and revenue claims remain disabled even after owner decision, cohort comparison evidence, threshold review evidence, notification readiness evidence, notification inbox records, dispatch preflights, provider/domain readiness records, content/consent readiness records, send-payload readiness records, queue-producer readiness records, queue-consumer readiness records, provider-call readiness records, delivery-attempt readiness records, delivery-result readiness records, delivery-status webhook readiness records, provider-polling readiness records, receipt-payload readiness records, delivery-receipt readiness records, and provider-status reconciliation readiness records are recorded.","Agents must include sample-size caveats and must not call sparse test events or assignments statistically meaningful."],"agentAccess":"Agents can read /analytics/source-data, /analytics/source-data?window=24h, /analytics/indie-launch-dashboard, event capture boundaries, page-view beacon boundaries, public-safe custom routing rule metadata, owner-confirmed winner rollout metadata, seeded sandbox routing and baseline holdout metadata, dashboard-visible fixed-window aggregate source attribution evidence, aggregate variant evidence, assignment boundaries, aggregate conversion report rows, aggregate report export metadata, owner-reviewed cohort comparison evidence, owner-reviewed alert threshold/anomaly-review evidence, owner-reviewed notification delivery readiness evidence, owner-confirmed notification inbox aggregate evidence, owner-confirmed dispatch preflight aggregate evidence, owner-reviewed provider/domain readiness aggregate evidence, owner-reviewed content/consent readiness aggregate evidence, owner-reviewed send-payload readiness aggregate evidence, owner-reviewed queue-producer readiness aggregate evidence, owner-reviewed queue-consumer readiness aggregate evidence, owner-reviewed provider-call readiness aggregate evidence, owner-reviewed delivery-attempt readiness aggregate evidence, owner-reviewed delivery-result readiness aggregate evidence, owner-reviewed delivery-status webhook readiness aggregate evidence, owner-reviewed provider-polling readiness aggregate evidence, owner-reviewed receipt-payload readiness aggregate evidence, owner-reviewed delivery-receipt readiness aggregate evidence, owner-reviewed provider-status reconciliation readiness aggregate evidence, and redacted experiment decision evidence. Owner sessions can record winner rollout and rollback evidence through /api/admin/analytics/winner-rollouts, notification readiness records through owner analytics APIs, and decision evidence through /api/admin/analytics/experiment-decisions. Issue #422 still owns direct public agent analytics writes, custom events beyond the current seeded boundary, raw campaign/referrer reporting, raw analytics exports, automated alert sends, owner email sends, provider sends, provider calls, delivery attempts, delivery results, delivery status webhooks, provider responses, provider message IDs, delivery receipts, receipt payloads, status webhooks, provider polling, provider status reconciliation execution, provider configuration, provider secrets, sender credentials, private DNS credentials, Queue producer execution, Queue consumer execution, queue dispatch, queue-message creation, queue message consumption, queue acknowledgements, retry/dead-letter rows, queue payload body reads, queue payload body creation, recipient-payload creation, personalized body creation, raw payload body storage, body-template exposure, unsubscribe-URL exposure, customer alerts, and revenue claims behind future authenticated confirmed-write APIs with privacy review, idempotency, stale-state checks, audit correlation, redaction, retention limits, and sample-size caveats.","validation":["Playwright covers /analytics/source-data, /analytics/source-data?window=24h, /analytics/indie-launch-dashboard fixed-window source attribution UI, /admin/analytics owner decision, winner rollout, rollback, notification readiness forms, event ingestion, assignment ingestion, custom source/campaign routing, winner rollout assignment routing, conversion reporting from captured events, duplicate idempotency, deterministic assignment, validation failures, opt-in event recording, sitemap discovery, and agent manifest discovery.","Issues #87, #105, #107, #119, #121, #123, #125, #127, #129, #261, #263, #265, #267, #269, #271, #284, #286, #288, #290, #292, #294, #297, #299, #301, #303, #305, #307, #309, and #311 record the analytics source-data foundation, first privacy-safe event capture path, first deterministic assignment path, first aggregate conversion report, first browser-side funnel page-view beacon, first variant-linked page-view evidence, first aggregate source attribution evidence, first dashboard-visible source breakdown, first fixed-window aggregate filters, first owner-confirmed experiment decision evidence, first aggregate report export metadata, owner-reviewed cohort comparison evidence, owner-reviewed alert threshold/anomaly-review evidence, owner-reviewed notification delivery readiness evidence, owner-confirmed notification inbox records, owner-confirmed dispatch preflights, owner-reviewed provider/domain readiness, owner-reviewed content/consent readiness, owner-reviewed send-payload readiness, owner-reviewed queue-producer readiness, owner-reviewed queue-consumer readiness, owner-reviewed provider-call readiness, owner-reviewed delivery-attempt readiness, owner-reviewed delivery-result readiness, owner-reviewed delivery-status webhook readiness, owner-reviewed provider-polling readiness, owner-reviewed receipt-payload readiness, owner-reviewed delivery-receipt readiness, and owner-reviewed provider-status reconciliation readiness. Issue #422 routes seeded sandbox funnel copy with public-safe source/campaign rules, a baseline holdout, and owner-confirmed winner rollout/rollback while tracking the remaining custom analytics schemas, notification execution, and agent-safe write parity after the issue #18 MVP closeout."],"sortOrder":51,"updatedAt":"2026-05-27T02:41:47.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-24T09:00:00.000Z","environment":"Production screenshot and analytics source-data evidence.","method":"Analytics event, page-view beacon, source attribution, custom routing rule, winner rollout, variant, time-window, report-export, staged notification readiness through provider-status reconciliation readiness, and owner decision-evidence route checks.","summary":"Analytics MVP proof is live: seeded event writes, deterministic assignments, public-safe custom source/campaign routing rules, owner-confirmed winner rollout/rollback routing, aggregate conversion reporting, source attribution, time windows, aggregate report export metadata, owner-confirmed experiment decision evidence, owner-reviewed content/consent readiness, send-payload readiness, queue-producer and queue-consumer readiness, provider-call readiness, delivery-attempt/result/status readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, and provider-status reconciliation readiness have proof surfaces while remaining live execution stays grouped in issue #422.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Analytics time windows","url":"https://bumpgrade.com/pr-screenshots/issue-129-analytics-time-windows-desktop.png","kind":"screenshot"},{"label":"Source attribution","url":"https://bumpgrade.com/pr-screenshots/issue-127-dashboard-source-attribution-desktop.png","kind":"screenshot"},{"label":"Experiment decisions","url":"https://bumpgrade.com/pr-screenshots/issue-261-admin-analytics-experiment-decisions.png","kind":"screenshot"},{"label":"Content/consent readiness","url":"https://bumpgrade.com/pr-screenshots/issue-288-admin-analytics-content-consent-readiness.png","kind":"screenshot"},{"label":"Send-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-290-admin-analytics-send-payload-readiness.png","kind":"screenshot"},{"label":"Queue-producer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-292-admin-analytics-queue-producer-readiness.png","kind":"screenshot"},{"label":"Queue-consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-294-admin-analytics-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Provider-call readiness","url":"https://bumpgrade.com/pr-screenshots/issue-297-admin-analytics-provider-call-readiness.png","kind":"screenshot"},{"label":"Delivery-attempt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-299-admin-analytics-delivery-attempt-readiness.png","kind":"screenshot"},{"label":"Delivery-result readiness","url":"https://bumpgrade.com/pr-screenshots/issue-301-admin-analytics-delivery-result-readiness.png","kind":"screenshot"},{"label":"Delivery-status webhook readiness","url":"https://bumpgrade.com/pr-screenshots/issue-303-admin-analytics-delivery-status-webhook-readiness.png","kind":"screenshot"},{"label":"Provider-polling readiness","url":"https://bumpgrade.com/pr-screenshots/issue-305-admin-analytics-provider-polling-readiness.png","kind":"screenshot"},{"label":"Receipt-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-307-admin-analytics-receipt-payload-readiness.png","kind":"screenshot"},{"label":"Delivery-receipt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-309-admin-analytics-delivery-receipt-readiness.png","kind":"screenshot"},{"label":"Provider-status reconciliation readiness","url":"https://bumpgrade.com/pr-screenshots/issue-311-admin-analytics-provider-status-reconciliation-readiness.png","kind":"screenshot"},{"label":"Analytics custom routing rules","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-custom-routing-rules.png","kind":"screenshot"},{"label":"Analytics winner rollouts","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-winner-rollouts.png","kind":"screenshot"},{"label":"Analytics MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Analytics MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Analytics source data","url":"https://bumpgrade.com/analytics/source-data","kind":"source-data"}],"notes":["Reports, report export metadata, custom routing rule metadata, winner rollout metadata, queue readiness, provider-call readiness, delivery-attempt readiness, delivery-result readiness, delivery-status webhook readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, provider-status reconciliation readiness, and decision evidence are aggregate and public-safe; raw visitor data, raw routing URLs, queue payload bodies, message consumption, acknowledgements, retry/dead-letter rows, provider calls, delivery attempts, delivery results, delivery status webhooks, provider responses, provider message IDs, delivery receipts, receipt payloads, status webhooks, provider polling, provider status reconciliation, secrets, sender credentials, and sends are not exposed or enabled."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-analytics-testing","label":"Inherited feature proof"}},{"id":"journey-visitor-joins-indie-launch-waitlist","title":"Visitor joins the indie launch waitlist","featureId":"feature-email-automation-crm","featureStatus":"live","issueNumbers":[17,85,103,167],"primaryUser":"Visitor interested in the launch checklist","userGoal":"Submit a normalized email and explicit consent, then receive a safe confirmation that Bumpgrade recorded the opt-in without sending email yet.","sourceEvidence":["https://bumpgrade.com/audience/indie-launch-waitlist","https://bumpgrade.com/audience/source-data","https://bumpgrade.com/api/audience/opt-in","https://github.com/markitics/bumpgrade/issues/17","https://github.com/markitics/bumpgrade/issues/85","https://github.com/markitics/bumpgrade/issues/103"],"happyPath":["Open /audience/indie-launch-waitlist.","Enter an email with optional first name and check consent.","Submit the form to /api/audience/opt-in.","Bumpgrade trims and normalizes the email, stores subscriber and consent evidence, assigns seeded tags, and records draft sequence enrollment.","The response confirms the normalized email and states email delivery is disabled."],"edgeCases":["Missing consent or invalid email returns public-safe validation errors.","Duplicate opt-in idempotency keys do not duplicate consent, tag, or sequence rows.","A later unsubscribe request records suppression evidence and marks a known subscriber unsubscribed without revealing list membership.","Email sending, imports, broadcasts, and CRM notes remain disabled.","Private contact metadata and provider IDs stay server-private."],"agentAccess":"Agents can read /audience/source-data, the opt-in write boundary, and the unsubscribe/suppression write boundary. Direct agent subscriber writes, imports, sends, broadcasts, or CRM notes require future authenticated confirmed-write APIs with consent, suppression, and sender-domain safety.","validation":["Playwright covers source-data output, valid opt-in, unsubscribe, unknown-email suppression, validation failures, duplicate idempotency, and agent manifest discovery.","Issues #103 and #167 record the first live audience opt-in and unsubscribe/suppression paths."],"sortOrder":51,"updatedAt":"2026-05-24T08:16:46.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-23T14:10:00.000Z","environment":"Production screenshot and audience automation source-data evidence.","method":"Opt-in, suppression, CRM note, sequence Queue consumer, sequence provider-call, sequence provider-polling, sequence receipt-payload, broadcast readiness, queue, provider, and dispatch readiness route checks.","summary":"Audience capture, sequence handoff, and campaign readiness surfaces have broad screenshot proof; real provider sends remain gated.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Audience opt-in","url":"https://bumpgrade.com/pr-screenshots/issue-103-audience-opt-in.png","kind":"screenshot"},{"label":"Broadcast readiness","url":"https://bumpgrade.com/pr-screenshots/issue-171-broadcast-readiness.png","kind":"screenshot"},{"label":"Queue consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-211-audience-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Sequence Queue consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-368-admin-audience-sequence-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Sequence provider-call readiness","url":"https://bumpgrade.com/pr-screenshots/issue-370-admin-audience-sequence-provider-call-readiness.png","kind":"screenshot"},{"label":"Sequence delivery-attempt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-372-admin-audience-sequence-delivery-attempt-readiness.png","kind":"screenshot"},{"label":"Sequence delivery-result readiness","url":"https://bumpgrade.com/pr-screenshots/issue-374-admin-audience-sequence-delivery-result-readiness.png","kind":"screenshot"},{"label":"Sequence delivery-status webhook readiness","url":"https://bumpgrade.com/pr-screenshots/issue-376-admin-audience-sequence-delivery-status-webhook-readiness.png","kind":"screenshot"},{"label":"Sequence provider-polling readiness","url":"https://bumpgrade.com/pr-screenshots/issue-378-admin-audience-sequence-provider-polling-readiness.png","kind":"screenshot"},{"label":"Sequence receipt-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-380-admin-audience-sequence-receipt-payload-readiness.png","kind":"screenshot"}],"validationLinks":[{"label":"Audience source data","url":"https://bumpgrade.com/audience/source-data","kind":"source-data"}],"notes":["Provider sends and queue consumption are not claimed as live customer email delivery."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-email-automation-crm","label":"Inherited feature proof"}},{"id":"journey-publisher-previews-affiliate-referrals","title":"Publisher previews affiliate and referral management","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,89,109,111,113,115,193,195,273,275,277,279,281,424],"primaryUser":"Publisher or agent planning partner growth","userGoal":"Inspect affiliate programs, partner records, referral links, attribution windows, commission rules, public-safe partner reports, public-safe partner statement snapshots, read-only payout preparation, review-only ledger evidence, owner review/reversal state, payout review states, fraud flags, partner notification readiness evidence, send preflight evidence, provider readiness evidence, aggregate click counts, and checkout attribution evidence before payouts exist.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/affiliates/indie-launch-partners","https://bumpgrade.com/api/affiliates/clicks","https://bumpgrade.com/api/affiliates/commission-ledger","https://bumpgrade.com/api/admin/affiliates/commission-ledger/actions","https://bumpgrade.com/api/admin/affiliates/payout-preparation-records","https://bumpgrade.com/api/admin/affiliates/fraud-review-records","https://bumpgrade.com/api/admin/affiliates/fraud-enforcement-records","https://bumpgrade.com/admin/affiliates","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/424"],"happyPath":["Fetch /affiliates/source-data.","Find the seeded affiliate program, revision ID, partner IDs, partner report IDs, partner statement snapshot IDs, payout preparation IDs, payout preparation record IDs, fraud review record IDs, fraud enforcement record IDs, partner notification readiness record IDs, partner notification send preflight record IDs, partner notification provider readiness record IDs, referral link IDs, attribution rule IDs, commission rule IDs, fixture ledger IDs, payout batch ID, review flags, click capture API, checkout attribution contract, review-only commission ledger contract, owner review action contract, partner report contract, partner statement snapshot contract, payout preparation contract, owner payout preparation record contract, owner fraud review record contract, owner fraud enforcement record contract, owner notification readiness record contract, owner notification send preflight record contract, owner notification provider readiness record contract, and write boundary.","Read partnerReportSummary to compare aggregate click, attributed checkout, review-only ledger, review action, and commission evidence totals by partner without exposing raw rows.","Read partnerStatementSnapshotSummary to inspect statement windows, review-only totals, eligible/blocked/reversed fixture counts, payout-preparation status, fraud status, and notification readiness status without treating the snapshot as payable.","Read payoutPreparationSummary to inspect eligible, blocked, and reversed fixture ledgers plus readiness checklist items without treating them as payable.","Read fraudReviewRecords, fraudEnforcementRecords, partnerNotificationReadinessRecords, partnerNotificationSendPreflightRecords, and partnerNotificationProviderReadinessRecords to inspect aggregate owner-reviewed fraud review, owner-confirmed fraud enforcement, partner notification readiness, send preflight, and provider readiness evidence without private fraud signals, recipient data, message bodies, send payloads, provider configuration, provider secrets, sender credentials, provider IDs, queue rows, or raw rows.","Open /affiliates/indie-launch-partners and the seeded partner portal to inspect the public preview."],"edgeCases":["Public source-data exposes aggregate click, checkout attribution, commission ledger, owner action, partner report, statement snapshot, payout preparation, payout preparation record, fraud review record, fraud enforcement record, notification readiness record, notification send preflight record, and notification provider readiness record counts only, not raw click, checkout, buyer, actor, recipient, message, send payload, provider configuration, provider secret, sender credential, provider, queue, reason, private fraud signal, tax, payout, partner notification, or Stripe rows.","Unsupported referral link IDs, codes, destination routes, referral click IDs, checkout intent IDs, commission ledger IDs, action kinds, stale expected updatedAt values, and missing idempotency keys return public-safe validation errors.","Cookie assignment, buyer attribution finalization, payable statement creation, payable commission writes, payout accounts, tax forms, Stripe payouts, private partner portals, partner notifications, provider execution, and direct agent writes remain grouped in issue #424 and require future confirmed-write APIs.","Agents must not call review-only commission evidence, partner report totals, statement snapshots, payout preparation rows, payout preparation records, fraud review records, fraud enforcement records, notification readiness records, notification send preflight records, or notification provider readiness records payable, send-ready partner statements, payout-ready state, provider-send configuration, provider secret storage, or published affiliate terms."],"agentAccess":"Agents can read /affiliates/source-data, /commerce/source-data, preview routes, click capture boundaries, checkout attribution boundaries, review-only commission ledger boundaries, owner review action boundaries, public-safe partner reports, public-safe partner statement snapshots, read-only payout preparation, owner-confirmed payout preparation records, owner-reviewed fraud review records, owner-confirmed fraud enforcement records, owner-reviewed partner notification readiness records, owner-reviewed partner notification send preflight records, and owner-reviewed notification provider readiness records. Issue #424 owns payout execution, tax, partner notification sends, provider-send enablement, provider configuration, provider secret storage, provider calls, send payload creation, queue dispatch, private partner portal access, partner payout account storage, payable statement creation, buyer attribution finalization, and direct agent affiliate writes behind future authenticated confirmed-write APIs with actor identity, explicit confirmation, idempotency, stale-state checks, audit correlation, redaction, refund-window checks, payout review, private fraud review, notification send preflight checks, provider readiness checks, provider/payment safety, rollback/dispute paths, and private payout data boundaries.","validation":["Playwright covers /affiliates/source-data, /affiliates/indie-launch-partners, click ingestion, checkout attribution, review-only commission ledger creation, owner review/reversal actions, public-safe partner reports, public-safe partner statement snapshots, read-only payout preparation, owner-confirmed payout preparation records, owner-reviewed fraud review records, owner-confirmed fraud enforcement records, owner-reviewed partner notification readiness records, owner-reviewed partner notification send preflight records, owner-reviewed notification provider readiness records, duplicate idempotency, stale-state validation, validation failures, aggregate-only source-data, sitemap discovery, and agent manifest discovery.","Issues #89, #109, #111, #113, #115, #193, #195, #273, #275, #277, #279, #281, and #424 record the affiliate/referral source-data foundation, privacy-safe click capture, checkout attribution evidence, first review-only ledger evidence path, owner review/reversal action boundary, public-safe partner report contract, read-only payout preparation contract, owner-confirmed payout preparation records, owner-reviewed fraud review records, owner-confirmed fraud enforcement records, owner-reviewed partner notification readiness records, owner-reviewed partner notification send preflight records, owner-reviewed notification provider readiness records, and public-safe partner statement snapshots.","Issue #424 tracks live affiliate payout execution, partner notifications, private partner portals, payable statements, and agent-safe write parity after the issue #19 MVP closeout."],"sortOrder":52,"updatedAt":"2026-05-27T00:21:18.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-agent-records-privacy-safe-analytics-event","title":"Agent records a privacy-safe analytics event","featureId":"feature-analytics-testing","featureStatus":"live","issueNumbers":[18,87,105,121,125],"primaryUser":"Agent or system integration validating event capture","userGoal":"Record a seeded analytics event with idempotency and verify Bumpgrade stores only public-safe fields plus hashed request evidence.","sourceEvidence":["https://bumpgrade.com/api/analytics/events","https://bumpgrade.com/analytics/source-data","https://github.com/markitics/bumpgrade/issues/18","https://github.com/markitics/bumpgrade/issues/87","https://github.com/markitics/bumpgrade/issues/105","https://github.com/markitics/bumpgrade/issues/121","https://github.com/markitics/bumpgrade/issues/125"],"happyPath":["Choose a seeded event definition from /analytics/source-data.","POST the event definition ID, source route, public properties, and idempotency key to /api/analytics/events.","Replay the same idempotency key and receive the same public-safe event ID.","Read aggregate counts from /analytics/source-data without exposing raw event rows."],"edgeCases":["Missing idempotency is rejected.","Unsupported event IDs and source routes are rejected.","Known bot/crawler and explicit preview/test-suppressed traffic returns an ignored public-safe response without adding analytics event rows.","Private request fields are hashed or omitted.","The API does not create cookies, store raw campaign/referrer payloads, route experiment traffic, or decide winners."],"agentAccess":"Agents can inspect the event capture contract and propose seeded analytics events with normalized public properties, but direct agent analytics writes beyond seeded events and raw attribution access require future authenticated confirmed-write APIs.","validation":["Playwright covers valid event ingestion, bot/crawler suppression, duplicate idempotency, validation failures, normalized source attribution, and aggregate-only source-data.","Issues #105, #121, and #125 record the first live analytics event capture path, first bot-suppressed browser beacon path, and normalized source attribution boundary."],"sortOrder":53,"updatedAt":"2026-05-24T08:44:46.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-24T09:00:00.000Z","environment":"Production screenshot and analytics source-data evidence.","method":"Analytics event, page-view beacon, source attribution, custom routing rule, winner rollout, variant, time-window, report-export, staged notification readiness through provider-status reconciliation readiness, and owner decision-evidence route checks.","summary":"Analytics MVP proof is live: seeded event writes, deterministic assignments, public-safe custom source/campaign routing rules, owner-confirmed winner rollout/rollback routing, aggregate conversion reporting, source attribution, time windows, aggregate report export metadata, owner-confirmed experiment decision evidence, owner-reviewed content/consent readiness, send-payload readiness, queue-producer and queue-consumer readiness, provider-call readiness, delivery-attempt/result/status readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, and provider-status reconciliation readiness have proof surfaces while remaining live execution stays grouped in issue #422.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Analytics time windows","url":"https://bumpgrade.com/pr-screenshots/issue-129-analytics-time-windows-desktop.png","kind":"screenshot"},{"label":"Source attribution","url":"https://bumpgrade.com/pr-screenshots/issue-127-dashboard-source-attribution-desktop.png","kind":"screenshot"},{"label":"Experiment decisions","url":"https://bumpgrade.com/pr-screenshots/issue-261-admin-analytics-experiment-decisions.png","kind":"screenshot"},{"label":"Content/consent readiness","url":"https://bumpgrade.com/pr-screenshots/issue-288-admin-analytics-content-consent-readiness.png","kind":"screenshot"},{"label":"Send-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-290-admin-analytics-send-payload-readiness.png","kind":"screenshot"},{"label":"Queue-producer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-292-admin-analytics-queue-producer-readiness.png","kind":"screenshot"},{"label":"Queue-consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-294-admin-analytics-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Provider-call readiness","url":"https://bumpgrade.com/pr-screenshots/issue-297-admin-analytics-provider-call-readiness.png","kind":"screenshot"},{"label":"Delivery-attempt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-299-admin-analytics-delivery-attempt-readiness.png","kind":"screenshot"},{"label":"Delivery-result readiness","url":"https://bumpgrade.com/pr-screenshots/issue-301-admin-analytics-delivery-result-readiness.png","kind":"screenshot"},{"label":"Delivery-status webhook readiness","url":"https://bumpgrade.com/pr-screenshots/issue-303-admin-analytics-delivery-status-webhook-readiness.png","kind":"screenshot"},{"label":"Provider-polling readiness","url":"https://bumpgrade.com/pr-screenshots/issue-305-admin-analytics-provider-polling-readiness.png","kind":"screenshot"},{"label":"Receipt-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-307-admin-analytics-receipt-payload-readiness.png","kind":"screenshot"},{"label":"Delivery-receipt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-309-admin-analytics-delivery-receipt-readiness.png","kind":"screenshot"},{"label":"Provider-status reconciliation readiness","url":"https://bumpgrade.com/pr-screenshots/issue-311-admin-analytics-provider-status-reconciliation-readiness.png","kind":"screenshot"},{"label":"Analytics custom routing rules","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-custom-routing-rules.png","kind":"screenshot"},{"label":"Analytics winner rollouts","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-winner-rollouts.png","kind":"screenshot"},{"label":"Analytics MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Analytics MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Analytics source data","url":"https://bumpgrade.com/analytics/source-data","kind":"source-data"}],"notes":["Reports, report export metadata, custom routing rule metadata, winner rollout metadata, queue readiness, provider-call readiness, delivery-attempt readiness, delivery-result readiness, delivery-status webhook readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, provider-status reconciliation readiness, and decision evidence are aggregate and public-safe; raw visitor data, raw routing URLs, queue payload bodies, message consumption, acknowledgements, retry/dead-letter rows, provider calls, delivery attempts, delivery results, delivery status webhooks, provider responses, provider message IDs, delivery receipts, receipt payloads, status webhooks, provider polling, provider status reconciliation, secrets, sender credentials, and sends are not exposed or enabled."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-analytics-testing","label":"Inherited feature proof"}},{"id":"journey-agent-assigns-privacy-safe-experiment-variant","title":"Agent assigns a privacy-safe experiment variant","featureId":"feature-analytics-testing","featureStatus":"live","issueNumbers":[18,87,105,107],"primaryUser":"Agent or system integration validating A/B assignment","userGoal":"Assign a seeded experiment variant with idempotency and verify Bumpgrade stores only public-safe response fields plus hashed visitor evidence.","sourceEvidence":["https://bumpgrade.com/api/analytics/assignments","https://bumpgrade.com/analytics/source-data","https://github.com/markitics/bumpgrade/issues/18","https://github.com/markitics/bumpgrade/issues/87","https://github.com/markitics/bumpgrade/issues/105","https://github.com/markitics/bumpgrade/issues/107"],"happyPath":["Choose a seeded experiment definition from /analytics/source-data.","POST the experiment ID, source route, anonymous assignment key, and idempotency key to /api/analytics/assignments.","Replay the same idempotency key and receive the same public-safe assignment ID.","Use a new idempotency key with the same anonymous assignment key and receive the same variant and bucket.","Read aggregate assignment counts from /analytics/source-data without exposing raw assignment rows."],"edgeCases":["Missing idempotency is rejected.","Missing anonymous assignment key is rejected.","Unsupported experiment IDs and source routes are rejected.","Private request fields are hashed or omitted.","The API does not set cookies, route traffic, create page-view events, mutate campaign attribution, or decide winners."],"agentAccess":"Agents can inspect the assignment contract and propose experiment assignment tests, but direct agent experiment writes beyond seeded assignment requires future authenticated confirmed-write APIs.","validation":["Playwright covers valid assignment ingestion, duplicate idempotency, deterministic replay with a new idempotency key, validation failures, and aggregate-only source-data.","Issue #107 records the first deterministic experiment assignment path."],"sortOrder":54,"updatedAt":"2026-05-24T08:44:46.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-24T09:00:00.000Z","environment":"Production screenshot and analytics source-data evidence.","method":"Analytics event, page-view beacon, source attribution, custom routing rule, winner rollout, variant, time-window, report-export, staged notification readiness through provider-status reconciliation readiness, and owner decision-evidence route checks.","summary":"Analytics MVP proof is live: seeded event writes, deterministic assignments, public-safe custom source/campaign routing rules, owner-confirmed winner rollout/rollback routing, aggregate conversion reporting, source attribution, time windows, aggregate report export metadata, owner-confirmed experiment decision evidence, owner-reviewed content/consent readiness, send-payload readiness, queue-producer and queue-consumer readiness, provider-call readiness, delivery-attempt/result/status readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, and provider-status reconciliation readiness have proof surfaces while remaining live execution stays grouped in issue #422.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Analytics time windows","url":"https://bumpgrade.com/pr-screenshots/issue-129-analytics-time-windows-desktop.png","kind":"screenshot"},{"label":"Source attribution","url":"https://bumpgrade.com/pr-screenshots/issue-127-dashboard-source-attribution-desktop.png","kind":"screenshot"},{"label":"Experiment decisions","url":"https://bumpgrade.com/pr-screenshots/issue-261-admin-analytics-experiment-decisions.png","kind":"screenshot"},{"label":"Content/consent readiness","url":"https://bumpgrade.com/pr-screenshots/issue-288-admin-analytics-content-consent-readiness.png","kind":"screenshot"},{"label":"Send-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-290-admin-analytics-send-payload-readiness.png","kind":"screenshot"},{"label":"Queue-producer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-292-admin-analytics-queue-producer-readiness.png","kind":"screenshot"},{"label":"Queue-consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-294-admin-analytics-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Provider-call readiness","url":"https://bumpgrade.com/pr-screenshots/issue-297-admin-analytics-provider-call-readiness.png","kind":"screenshot"},{"label":"Delivery-attempt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-299-admin-analytics-delivery-attempt-readiness.png","kind":"screenshot"},{"label":"Delivery-result readiness","url":"https://bumpgrade.com/pr-screenshots/issue-301-admin-analytics-delivery-result-readiness.png","kind":"screenshot"},{"label":"Delivery-status webhook readiness","url":"https://bumpgrade.com/pr-screenshots/issue-303-admin-analytics-delivery-status-webhook-readiness.png","kind":"screenshot"},{"label":"Provider-polling readiness","url":"https://bumpgrade.com/pr-screenshots/issue-305-admin-analytics-provider-polling-readiness.png","kind":"screenshot"},{"label":"Receipt-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-307-admin-analytics-receipt-payload-readiness.png","kind":"screenshot"},{"label":"Delivery-receipt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-309-admin-analytics-delivery-receipt-readiness.png","kind":"screenshot"},{"label":"Provider-status reconciliation readiness","url":"https://bumpgrade.com/pr-screenshots/issue-311-admin-analytics-provider-status-reconciliation-readiness.png","kind":"screenshot"},{"label":"Analytics custom routing rules","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-custom-routing-rules.png","kind":"screenshot"},{"label":"Analytics winner rollouts","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-winner-rollouts.png","kind":"screenshot"},{"label":"Analytics MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Analytics MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Analytics source data","url":"https://bumpgrade.com/analytics/source-data","kind":"source-data"}],"notes":["Reports, report export metadata, custom routing rule metadata, winner rollout metadata, queue readiness, provider-call readiness, delivery-attempt readiness, delivery-result readiness, delivery-status webhook readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, provider-status reconciliation readiness, and decision evidence are aggregate and public-safe; raw visitor data, raw routing URLs, queue payload bodies, message consumption, acknowledgements, retry/dead-letter rows, provider calls, delivery attempts, delivery results, delivery status webhooks, provider responses, provider message IDs, delivery receipts, receipt payloads, status webhooks, provider polling, provider status reconciliation, secrets, sender credentials, and sends are not exposed or enabled."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-analytics-testing","label":"Inherited feature proof"}},{"id":"journey-partner-checks-affiliate-status-portal","title":"Partner checks affiliate status portal","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,193,195,273,275,277,279,281,424],"primaryUser":"Affiliate partner checking public-safe status before payouts exist","userGoal":"Inspect referral link, aggregate performance, review-only statement snapshot, payout-readiness blockers, fraud status, and notification readiness without exposing buyer data, payout accounts, tax forms, Stripe identifiers, provider secrets, message bodies, queue rows, raw rows, or private fraud signals.","sourceEvidence":["https://bumpgrade.com/affiliates/indie-launch-partners/partners/launch-circle","https://bumpgrade.com/affiliates/source-data","https://github.com/markitics/bumpgrade/issues/424","https://github.com/markitics/bumpgrade/issues/193","https://github.com/markitics/bumpgrade/issues/195"],"happyPath":["Open /affiliates/indie-launch-partners/partners/launch-circle.","Confirm the partner portal ID, referral link, report, statement snapshot, commission evidence, payout readiness, fraud/review status, and notification readiness sections.","Use /affiliates/source-data.partnerPortalSummary and partnerStatementSnapshotSummary to read the same public-safe portal route, stable IDs, aggregate totals, blocker counts, redaction flags, and non-live execution boundaries.","Follow the program overview or source-data links when a partner or agent needs broader context."],"edgeCases":["The portal does not authenticate a partner or expose private partner rows.","The portal does not expose partner email, buyer data, raw click rows, raw checkout rows, raw ledger rows, private fraud signals, payout accounts, tax data, Stripe payout IDs, notification recipient emails, message bodies, send payloads, provider secrets, provider message IDs, or queue rows.","Payable statement creation, payable commission state, Stripe transfers, payout receipts, payout account collection, tax collection, partner notification sends, provider configuration, provider calls, queue dispatch, and direct public agent writes remain grouped in issue #424."],"agentAccess":"Agents can read the partner portal page plus /affiliates/source-data.partnerPortalSummary and partnerStatementSnapshotSummary as public-safe status. Authenticated private partner access, payable statements, payout execution, provider sends, and direct agent affiliate writes require future confirmed-write APIs and private auth boundaries.","validation":["Playwright covers the partner portal route, heading, source-data partnerPortalSummary and partnerStatementSnapshotSummary, sitemap entry, agent manifest stable IDs, and redaction boundaries.","Issue #424 records this as a partner-facing status slice, not private partner auth, payable statement creation, or payout execution."],"sortOrder":54,"updatedAt":"2026-05-27T00:21:18.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-agent-records-privacy-safe-referral-click","title":"Agent records a privacy-safe referral click","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,89,109],"primaryUser":"Agent or system integration validating referral tracking","userGoal":"Record a seeded referral click with idempotency and verify Bumpgrade stores only public-safe response fields plus hashed request evidence.","sourceEvidence":["https://bumpgrade.com/api/affiliates/clicks","https://bumpgrade.com/affiliates/source-data","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/89","https://github.com/markitics/bumpgrade/issues/109"],"happyPath":["Choose a seeded referral link from /affiliates/source-data.","POST the referral link ID or code, destination route, and idempotency key to /api/affiliates/clicks.","Replay the same idempotency key and receive the same public-safe click ID.","Read aggregate click counts from /affiliates/source-data without exposing raw click rows."],"edgeCases":["Missing idempotency is rejected.","Unsupported referral links, codes, and destination routes are rejected.","Private request fields are hashed or omitted.","The API does not set cookies, attribute buyers, create commissions, mutate payout state, or enforce fraud decisions."],"agentAccess":"Agents can inspect the click capture contract and propose referral click tests, but buyer attribution, commission writes, payout mutations, fraud decisions, and direct agent affiliate writes require future authenticated confirmed-write APIs.","validation":["Playwright covers valid click ingestion, duplicate idempotency, validation failures, and aggregate-only source-data.","Issue #109 records the first live referral click capture path."],"sortOrder":55,"updatedAt":"2026-05-24T09:16:47.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-publisher-reads-funnel-conversion-report","title":"Publisher reads a funnel conversion report","featureId":"feature-analytics-testing","featureStatus":"live","issueNumbers":[18,87,105,107,119,121,123,125,127,129],"primaryUser":"Publisher or agent validating funnel optimization evidence","userGoal":"Read visitor, conversion, and conversion-rate rows from captured test events without exposing raw analytics events or visitor identifiers.","sourceEvidence":["https://bumpgrade.com/analytics/source-data","https://bumpgrade.com/analytics/indie-launch-dashboard","https://github.com/markitics/bumpgrade/issues/18","https://github.com/markitics/bumpgrade/issues/119","https://github.com/markitics/bumpgrade/issues/121","https://github.com/markitics/bumpgrade/issues/123","https://github.com/markitics/bumpgrade/issues/125","https://github.com/markitics/bumpgrade/issues/127","https://github.com/markitics/bumpgrade/issues/129"],"happyPath":["Capture seeded analytics events with idempotency or visit the public funnel preview to assign a seeded variant and emit a session-idempotent page-view event with variant and source attribution evidence.","Fetch /analytics/source-data.","Read funnelConversionReport rows for metric ID, step ID, visitor count, conversion count, conversion rate, report mode, selected time window, and sample-size caveat.","Switch /analytics/source-data?window=24h or the dashboard window control to inspect the same aggregate report in a fixed window.","Open /analytics/indie-launch-dashboard and confirm the report and source attribution section render captured aggregate rows when samples exist."],"edgeCases":["Duplicate idempotency does not inflate conversion counts.","Bot and preview/test-suppressed page-view traffic is ignored before it can inflate visitor counts.","Rows fall back to fixture counts only when no captured samples exist.","Raw analytics rows, full referrers, raw query strings, IP hashes, user agent hashes, visitor keys, contact IDs, and Stripe IDs are not included.","Sparse samples are not statistically meaningful and must be labeled with caveats."],"agentAccess":"Agents can read aggregate funnel conversion rows by fixed window and cite metric IDs, event IDs, dashboard-visible aggregate source attribution evidence, aggregate variant evidence, and issues #119/#121/#123/#125/#127/#129 evidence. Direct analytics writes, raw referrer/query reporting, traffic routing, and automated experiment decisions require future confirmed-write APIs.","validation":["Playwright seeds captured events, visits the funnel page-view beacon, replays duplicate idempotency, verifies aggregate source and variant counts, verifies dashboard fixed-window source row rendering, verifies conversion counts and rates, and checks public source-data excludes raw/private rows.","Issues #119, #121, #123, #125, #127, and #129 record the aggregate conversion report, browser-side funnel page-view instrumentation, variant-linked page-view evidence, source-attributed page-view evidence, dashboard source attribution preview, and fixed-window aggregate controls."],"sortOrder":55,"updatedAt":"2026-05-24T08:44:46.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-24T09:00:00.000Z","environment":"Production screenshot and analytics source-data evidence.","method":"Analytics event, page-view beacon, source attribution, custom routing rule, winner rollout, variant, time-window, report-export, staged notification readiness through provider-status reconciliation readiness, and owner decision-evidence route checks.","summary":"Analytics MVP proof is live: seeded event writes, deterministic assignments, public-safe custom source/campaign routing rules, owner-confirmed winner rollout/rollback routing, aggregate conversion reporting, source attribution, time windows, aggregate report export metadata, owner-confirmed experiment decision evidence, owner-reviewed content/consent readiness, send-payload readiness, queue-producer and queue-consumer readiness, provider-call readiness, delivery-attempt/result/status readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, and provider-status reconciliation readiness have proof surfaces while remaining live execution stays grouped in issue #422.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Analytics time windows","url":"https://bumpgrade.com/pr-screenshots/issue-129-analytics-time-windows-desktop.png","kind":"screenshot"},{"label":"Source attribution","url":"https://bumpgrade.com/pr-screenshots/issue-127-dashboard-source-attribution-desktop.png","kind":"screenshot"},{"label":"Experiment decisions","url":"https://bumpgrade.com/pr-screenshots/issue-261-admin-analytics-experiment-decisions.png","kind":"screenshot"},{"label":"Content/consent readiness","url":"https://bumpgrade.com/pr-screenshots/issue-288-admin-analytics-content-consent-readiness.png","kind":"screenshot"},{"label":"Send-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-290-admin-analytics-send-payload-readiness.png","kind":"screenshot"},{"label":"Queue-producer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-292-admin-analytics-queue-producer-readiness.png","kind":"screenshot"},{"label":"Queue-consumer readiness","url":"https://bumpgrade.com/pr-screenshots/issue-294-admin-analytics-queue-consumer-readiness.png","kind":"screenshot"},{"label":"Provider-call readiness","url":"https://bumpgrade.com/pr-screenshots/issue-297-admin-analytics-provider-call-readiness.png","kind":"screenshot"},{"label":"Delivery-attempt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-299-admin-analytics-delivery-attempt-readiness.png","kind":"screenshot"},{"label":"Delivery-result readiness","url":"https://bumpgrade.com/pr-screenshots/issue-301-admin-analytics-delivery-result-readiness.png","kind":"screenshot"},{"label":"Delivery-status webhook readiness","url":"https://bumpgrade.com/pr-screenshots/issue-303-admin-analytics-delivery-status-webhook-readiness.png","kind":"screenshot"},{"label":"Provider-polling readiness","url":"https://bumpgrade.com/pr-screenshots/issue-305-admin-analytics-provider-polling-readiness.png","kind":"screenshot"},{"label":"Receipt-payload readiness","url":"https://bumpgrade.com/pr-screenshots/issue-307-admin-analytics-receipt-payload-readiness.png","kind":"screenshot"},{"label":"Delivery-receipt readiness","url":"https://bumpgrade.com/pr-screenshots/issue-309-admin-analytics-delivery-receipt-readiness.png","kind":"screenshot"},{"label":"Provider-status reconciliation readiness","url":"https://bumpgrade.com/pr-screenshots/issue-311-admin-analytics-provider-status-reconciliation-readiness.png","kind":"screenshot"},{"label":"Analytics custom routing rules","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-custom-routing-rules.png","kind":"screenshot"},{"label":"Analytics winner rollouts","url":"https://bumpgrade.com/pr-screenshots/issue-422-analytics-winner-rollouts.png","kind":"screenshot"},{"label":"Analytics MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Analytics MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-18-analytics-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Analytics source data","url":"https://bumpgrade.com/analytics/source-data","kind":"source-data"}],"notes":["Reports, report export metadata, custom routing rule metadata, winner rollout metadata, queue readiness, provider-call readiness, delivery-attempt readiness, delivery-result readiness, delivery-status webhook readiness, provider-polling readiness, receipt-payload readiness, delivery-receipt readiness, provider-status reconciliation readiness, and decision evidence are aggregate and public-safe; raw visitor data, raw routing URLs, queue payload bodies, message consumption, acknowledgements, retry/dead-letter rows, provider calls, delivery attempts, delivery results, delivery status webhooks, provider responses, provider message IDs, delivery receipts, receipt payloads, status webhooks, provider polling, provider status reconciliation, secrets, sender credentials, and sends are not exposed or enabled."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-analytics-testing","label":"Inherited feature proof"}},{"id":"journey-agent-attaches-referral-click-to-checkout","title":"Agent attaches referral click evidence to checkout","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,109,111],"primaryUser":"Agent or system integration validating referral-to-checkout tracking","userGoal":"Record a seeded referral click, create a sandbox checkout intent that references it, and verify Bumpgrade stores only public-safe attribution evidence.","sourceEvidence":["https://bumpgrade.com/api/affiliates/clicks","https://bumpgrade.com/api/commerce/checkout","https://bumpgrade.com/commerce/source-data","https://bumpgrade.com/affiliates/source-data","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/109","https://github.com/markitics/bumpgrade/issues/111"],"happyPath":["POST a seeded referral click for the launch funnel with idempotency.","POST /api/commerce/checkout with exact confirmation text, checkout idempotency, and the referral click ID.","Replay the checkout idempotency key and receive the same checkout intent plus the same attribution evidence.","Read aggregate attribution counts from /commerce/source-data or /affiliates/source-data without exposing raw rows."],"edgeCases":["Missing or unknown referral click IDs are rejected.","Referral clicks for non-eligible destinations are rejected.","The evidence row does not create a commission, payout, fraud decision, tax record, partner notification, or buyer attribution finalization.","Private request, buyer, and Stripe fields remain server-private."],"agentAccess":"Agents can inspect the checkout attribution contract and propose referral-to-checkout tests, but commission writes, payout mutations, fraud decisions, buyer attribution finalization, and direct agent affiliate writes require future authenticated confirmed-write APIs.","validation":["Playwright covers referral click creation, checkout attribution attachment, duplicate idempotency, validation failures, and aggregate-only source-data.","Issue #111 records the first checkout referral attribution evidence path."],"sortOrder":56,"updatedAt":"2026-05-24T09:16:47.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-agent-creates-review-only-commission-evidence","title":"Agent creates review-only commission evidence","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,109,111,113],"primaryUser":"Agent or system integration validating referral-to-commission tracking","userGoal":"Create a review-only commission ledger row from trusted sandbox checkout attribution and verify it remains non-payable.","sourceEvidence":["https://bumpgrade.com/api/affiliates/clicks","https://bumpgrade.com/api/commerce/checkout","https://bumpgrade.com/api/affiliates/commission-ledger","https://bumpgrade.com/commerce/source-data","https://bumpgrade.com/affiliates/source-data","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/109","https://github.com/markitics/bumpgrade/issues/111","https://github.com/markitics/bumpgrade/issues/113"],"happyPath":["POST a seeded referral click for the launch funnel with idempotency.","POST /api/commerce/checkout with exact confirmation text, checkout idempotency, and the referral click ID.","POST /api/affiliates/commission-ledger with exact commission confirmation, checkout intent ID, and ledger idempotency key.","Replay the ledger idempotency key and receive the same non-payable ledger evidence.","Read aggregate ledger counts from /commerce/source-data or /affiliates/source-data without exposing raw rows."],"edgeCases":["Missing or unknown checkout intent IDs are rejected.","Checkout intents without referral attribution are rejected.","Ledger evidence remains review-only and does not create payout, tax, fraud, partner notification, or buyer attribution finalization state.","Private request, buyer, and Stripe fields remain server-private."],"agentAccess":"Agents can inspect the review-only ledger contract and propose referral-to-commission tests, but payable commission writes, payout mutations, fraud decisions, buyer attribution finalization, owner review, reversal, and direct agent affiliate writes require future authenticated confirmed-write APIs.","validation":["Playwright covers referral click creation, checkout attribution attachment, review-only ledger creation, duplicate idempotency, validation failures, and aggregate-only source-data.","Issue #113 records the first review-only commission ledger evidence path."],"sortOrder":57,"updatedAt":"2026-05-24T09:16:47.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-owner-reviews-commission-ledger-evidence","title":"Owner reviews or reverses commission evidence","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,113,115],"primaryUser":"Owner reviewing affiliate commission evidence before payout exists","userGoal":"Apply an owner review, hold, or reversal action to review-only commission evidence without making it payable.","sourceEvidence":["https://bumpgrade.com/api/admin/affiliates/commission-ledger/actions","https://bumpgrade.com/api/affiliates/commission-ledger","https://bumpgrade.com/commerce/source-data","https://bumpgrade.com/affiliates/source-data","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/113","https://github.com/markitics/bumpgrade/issues/115"],"happyPath":["Create review-only commission ledger evidence from trusted checkout attribution.","Read the current ledger updatedAt from the ledger creation response.","POST an owner review action with exact confirmation, idempotency key, action kind, expectedUpdatedAt, and public reason.","Replay the idempotency key and receive the same action row.","Read aggregate review action counts from /commerce/source-data or /affiliates/source-data without exposing raw actor, buyer, Stripe, payout, or private reason fields."],"edgeCases":["Signed-out requests are rejected.","Missing confirmation, unknown action kinds, unknown ledgers, stale expectedUpdatedAt values, and conflicting idempotency keys are rejected.","Actions keep payoutStatus not_payable and do not create payout, tax, fraud, partner notification, or buyer attribution finalization state.","Private actor identity and private reasons remain server-private."],"agentAccess":"Agents can inspect public-safe review action contracts and aggregate counts. Direct agent review/reversal writes, payable commission writes, payout mutation, fraud decisions, buyer attribution finalization, and partner notifications require future authenticated confirmed-write APIs.","validation":["Playwright covers owner sign-in, review action creation, duplicate idempotency, stale-state rejection, signed-out rejection, aggregate-only source-data, and no payout/tax/partner notification state.","Issue #115 records the first owner-gated review/reversal action boundary."],"sortOrder":58,"updatedAt":"2026-05-24T09:16:47.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-publisher-prepares-affiliate-payout-batch","title":"Publisher prepares an affiliate payout batch","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,113,115,193,195,273,275,277,279,281,424],"primaryUser":"Publisher reviewing affiliate payout readiness before payable state exists","userGoal":"Inspect read-only payout preparation rows, checklist blockers, partner-report links, owner-confirmed payout preparation records, owner-reviewed fraud review records, and owner-confirmed fraud enforcement records before any Stripe payout, tax, payout account, or partner notification execution exists.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/affiliates/indie-launch-partners","https://bumpgrade.com/api/admin/affiliates/payout-preparation-records","https://bumpgrade.com/api/admin/affiliates/fraud-review-records","https://bumpgrade.com/api/admin/affiliates/fraud-enforcement-records","https://bumpgrade.com/admin/affiliates","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/424"],"happyPath":["Fetch /affiliates/source-data.","Find payoutPreparationContract, payoutPreparationSummary, payoutPreparationRecords, fraudReviewRecords, and fraudEnforcementRecords.","Inspect each payoutPreparationId, linked payoutBatchId, partnerReportIds, eligible ledger IDs, blocked ledger IDs, reversed ledger IDs, readiness checklist, fraud review flag, fraud review contract status, and public-safe aggregate totals.","Open /admin/affiliates as a verified owner and record redacted fraud enforcement evidence with exact confirmation, idempotency, current program revision, payout batch status, fraud review record status, review flag severity, and linked ledger count.","Treat the rows as evidence only; do not call them payable commission state, partner statements, Stripe payouts, partner notifications, or direct agent write parity."],"edgeCases":["Refund-window, owner-hold, and self-referral evidence keep payout execution blocked until future private review contracts exist.","Public preparation rows, owner-confirmed payout records, owner-reviewed fraud records, and owner-confirmed fraud enforcement records never expose buyer data, raw ledger rows, raw click rows, raw checkout rows, raw actor identity, private fraud signals, partner payout accounts, tax forms, Stripe payout identifiers, or partner notification payloads.","Stripe payouts, transfer creation, private partner portals, payout account storage, tax collection, payable commission finalization, partner notification sends, and direct agent writes require future confirmed-write APIs."],"agentAccess":"Agents can read public-safe payout preparation, fraud review, and fraud enforcement evidence from /affiliates/source-data and cite payoutPreparationId, payoutPreparationRecordId, reviewFlagId, fraudReviewRecordId, and fraudEnforcementRecordId values. Owner sessions can record fraud enforcement evidence through /api/admin/affiliates/fraud-enforcement-records. Payout execution, tax handling, payout accounts, partner sends, private portals, and direct agent affiliate writes require future authenticated confirmed-write APIs.","validation":["Playwright covers payoutPreparationContract, payoutPreparationSummary, owner-confirmed payout preparation records, owner-reviewed fraud review records, owner-confirmed fraud enforcement records, preview rendering, admin journey exposure, agent manifest stable IDs, and redaction boundaries.","Issues #195, #273, #275, and #424 record the read-only payout preparation slice, owner-confirmed payout preparation records, owner-reviewed fraud review records, and owner-confirmed fraud enforcement records."],"sortOrder":59,"updatedAt":"2026-05-25T06:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-publisher-reads-affiliate-partner-reports","title":"Publisher reads affiliate partner reports","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,193],"primaryUser":"Publisher reviewing partner growth before payouts exist","userGoal":"Compare partner performance evidence across clicks, attributed checkouts, review-only ledgers, owner review actions, and payout-readiness caveats without exposing private buyer or payout data.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/affiliates/indie-launch-partners","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/193"],"happyPath":["Fetch /affiliates/source-data.","Find partnerReportContract and partnerReportSummary.","Read each affiliatePartnerReportId, affiliatePartnerId, linked referralLinkIds, aggregate totals, payoutReadiness caveats, and redaction flags.","Open /affiliates/indie-launch-partners and inspect the partner report cards.","Use the report caveat before treating totals as payable, partner-facing statements, or published affiliate terms."],"edgeCases":["Reports return zero aggregate totals when no D1 click, attribution, ledger, or review action rows exist yet.","Reports never expose buyer emails, buyer hashes, Stripe IDs, raw click rows, raw checkout rows, payout accounts, tax forms, raw actor identity, private review reasons, or partner notification state.","Private partner portals, payable commissions, payout batches, fraud decisions, and tax collection require future confirmed-write APIs."],"agentAccess":"Agents can read public-safe partner reports from /affiliates/source-data and cite affiliatePartnerReportId values. Partner notifications, private partner portals, payout preparation, tax handling, fraud decisions, and direct agent affiliate writes require future confirmed-write APIs.","validation":["Playwright covers the source-data partner report contract, preview report cards, redaction flags, and agent manifest stable IDs.","Issue #193 records the public-safe partner report slice."],"sortOrder":59,"updatedAt":"2026-05-24T09:16:47.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-owner-reviews-affiliate-fraud-flag","title":"Owner records affiliate fraud review evidence","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,113,115,193,195,273,275],"primaryUser":"Owner reviewing affiliate fraud evidence before payout exists","userGoal":"Record redacted fraud review evidence for a seeded affiliate review flag without enforcing a fraud decision or creating payout state.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/api/admin/affiliates/fraud-review-records","https://bumpgrade.com/admin/affiliates","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/275"],"happyPath":["Fetch /affiliates/source-data and inspect fraudReviewRecords.currentEvidence.","Open /admin/affiliates as a verified owner.","Record a fraud review disposition with exact confirmation, idempotency key, current program revision, payout batch status, review flag severity, and linked ledger count.","Replay the idempotency key and confirm the same redacted record is returned.","Read /affiliates/source-data again and confirm aggregate fraud review counts and latest redacted metadata update."],"edgeCases":["Signed-out requests are rejected.","Missing confirmation, unsupported review flags, unsupported dispositions, unsupported payout preparation IDs, unsupported payout batch IDs, stale program revisions, stale payout batch statuses, stale review flag evidence, and conflicting idempotency keys fail safely.","The record does not enforce fraud decisions, create payable commission state, trigger Stripe payouts or transfers, store payout accounts, collect tax data, notify partners, expose buyer data, expose raw ledger/click/checkout rows, expose actor identity, or expose private fraud signals."],"agentAccess":"Agents can read the public-safe fraud review contract and aggregate evidence, but only owner sessions can create fraud review records. Direct public agent writes, fraud enforcement, payable commission mutation, payout execution, tax handling, partner notification, and private fraud signal exposure require future confirmed-write APIs.","validation":["Playwright covers unauthenticated rejection, owner contract read, exact confirmation, idempotency replay/conflict, stale-state rejection, unsupported review flags and dispositions, public source-data redaction, and admin UI rendering for fraud review records.","Issue #275 records the owner-reviewed affiliate fraud review evidence slice."],"sortOrder":60,"updatedAt":"2026-05-24T09:16:47.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-owner-records-affiliate-fraud-enforcement","title":"Owner records affiliate fraud enforcement evidence","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,113,115,193,195,273,275,424],"primaryUser":"Owner enforcing affiliate fraud review before payout execution exists","userGoal":"Record a redacted affiliate fraud enforcement decision for a seeded review flag without creating payable commission state, Stripe payouts, partner notifications, payout accounts, tax data, buyer data, raw rows, or direct public agent writes.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/api/admin/affiliates/fraud-enforcement-records","https://bumpgrade.com/admin/affiliates","https://github.com/markitics/bumpgrade/issues/424"],"happyPath":["Fetch /affiliates/source-data and inspect fraudEnforcementRecords.currentEvidence.","Open /admin/affiliates as a verified owner.","Record a fraud enforcement disposition with exact confirmation, idempotency key, current program revision, payout batch status, fraud review record status, review flag severity, and linked ledger count.","Replay the idempotency key and confirm the same redacted record is returned.","Read /affiliates/source-data again and confirm aggregate fraud enforcement counts and latest redacted metadata update."],"edgeCases":["Signed-out requests are rejected.","Missing confirmation, unsupported review flags, unsupported dispositions, unsupported payout preparation IDs, unsupported payout batch IDs, stale program revisions, stale payout batch statuses, stale fraud review contract status, stale review flag evidence, and conflicting idempotency keys fail safely.","The record does not create payable commission state, trigger Stripe payouts or transfers, store payout accounts, collect tax data, notify partners, expose buyer data, expose raw ledger/click/checkout rows, expose actor identity, or expose private fraud signals."],"agentAccess":"Agents can read the public-safe fraud enforcement contract and aggregate evidence, but only owner sessions can create fraud enforcement records. Direct public agent writes, payable commission mutation, payout execution, tax handling, partner notification, private portal access, and private fraud signal exposure require future confirmed-write APIs.","validation":["Playwright covers unauthenticated rejection, owner contract read, exact confirmation, idempotency replay/conflict, stale-state rejection, unsupported review flags and dispositions, public source-data redaction, and admin UI rendering for fraud enforcement records.","Issue #424 records the owner-confirmed affiliate fraud enforcement evidence slice."],"sortOrder":61,"updatedAt":"2026-05-25T06:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-owner-prepares-affiliate-partner-notification-readiness","title":"Owner records affiliate partner notification readiness evidence","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,193,195,273,275,277],"primaryUser":"Owner reviewing affiliate partner notification readiness before sends exist","userGoal":"Record redacted partner notification readiness evidence for a seeded affiliate partner report without sending partner notifications, calling providers, creating queue rows, or creating payout state.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/api/admin/affiliates/notification-readiness-records","https://bumpgrade.com/admin/affiliates","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/277"],"happyPath":["Fetch /affiliates/source-data and inspect partnerNotificationReadinessRecords.currentEvidence.","Open /admin/affiliates as a verified owner.","Record a notification readiness disposition with exact confirmation, idempotency key, current program revision, partner report status, payout batch status, payout preparation record status, fraud review record status, review flag severity, and linked ledger count.","Replay the idempotency key and confirm the same redacted record is returned.","Read /affiliates/source-data again and confirm aggregate notification readiness counts and latest redacted metadata update."],"edgeCases":["Signed-out requests are rejected.","Missing confirmation, unsupported partner reports, unsupported partners, unsupported payout preparation IDs, unsupported payout batch IDs, unsupported review flag IDs, unsupported dispositions, stale program revisions, stale partner report statuses, stale payout batch statuses, stale payout preparation contract statuses, stale fraud review contract statuses, stale fraud evidence, and conflicting idempotency keys fail safely.","The record does not send partner notifications, call providers, create queues, include recipient emails or message bodies, enforce fraud decisions, create payable commission state, trigger Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, expose actor identity, or expose private fraud signals."],"agentAccess":"Agents can read the public-safe notification readiness contract and aggregate evidence, but only owner sessions can create notification readiness records. Direct public agent writes, partner notification sends, provider calls, queue dispatch, fraud enforcement, payable commission mutation, payout execution, tax handling, recipient exposure, and private fraud signal exposure require future confirmed-write APIs.","validation":["Playwright covers unauthenticated rejection, owner contract read, exact confirmation, idempotency replay/conflict, stale-state rejection, unsupported report/partner/flag/disposition validation, public source-data redaction, and admin UI rendering for notification readiness records.","Issue #277 records the owner-reviewed affiliate partner notification readiness evidence slice."],"sortOrder":62,"updatedAt":"2026-05-25T06:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-owner-prepares-affiliate-partner-notification-send-preflight","title":"Owner records affiliate partner notification send preflight evidence","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,193,195,273,275,277,279],"primaryUser":"Owner reviewing affiliate partner notification send preflight before sends exist","userGoal":"Record redacted partner notification send preflight evidence for a seeded affiliate partner report without sending partner notifications, enabling provider sends, calling providers, creating send payloads, creating queue rows, or creating payout state.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/api/admin/affiliates/notification-readiness-records","https://bumpgrade.com/api/admin/affiliates/notification-send-preflights","https://bumpgrade.com/admin/affiliates","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/277","https://github.com/markitics/bumpgrade/issues/279"],"happyPath":["Fetch /affiliates/source-data and inspect partnerNotificationSendPreflightRecords.currentEvidence.","Open /admin/affiliates as a verified owner.","Record a notification send preflight disposition with exact confirmation, idempotency key, current program revision, partner report status, payout batch status, payout preparation record status, fraud review record status, notification readiness record status, review flag severity, and linked ledger count.","Replay the idempotency key and confirm the same redacted record is returned.","Read /affiliates/source-data again and confirm aggregate notification send preflight counts and latest redacted metadata update."],"edgeCases":["Signed-out requests are rejected.","Missing confirmation, unsupported partner reports, unsupported partners, unsupported payout preparation IDs, unsupported payout batch IDs, unsupported review flag IDs, unsupported dispositions, stale program revisions, stale partner report statuses, stale payout batch statuses, stale payout preparation contract statuses, stale fraud review contract statuses, stale notification readiness contract statuses, stale fraud evidence, and conflicting idempotency keys fail safely.","The record does not send partner notifications, enable provider sends, call providers, create send payloads, create queues, include recipient emails or message bodies, enforce fraud decisions, create payable commission state, trigger Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, expose actor identity, or expose private fraud signals."],"agentAccess":"Agents can read the public-safe notification send preflight contract and aggregate evidence, but only owner sessions can create notification send preflight records. Direct public agent writes, partner notification sends, provider-send enablement, provider calls, send payload creation, queue dispatch, fraud enforcement, payable commission mutation, payout execution, tax handling, recipient exposure, and private fraud signal exposure require future confirmed-write APIs.","validation":["Playwright covers unauthenticated rejection, owner contract read, exact confirmation, idempotency replay/conflict, stale-state rejection, unsupported report/partner/flag/disposition validation, notification readiness stale-state validation, public source-data redaction, and admin UI rendering for notification send preflight records.","Issue #279 records the owner-reviewed affiliate partner notification send preflight evidence slice."],"sortOrder":63,"updatedAt":"2026-05-25T06:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}},{"id":"journey-owner-prepares-affiliate-partner-notification-provider-readiness","title":"Owner records affiliate partner notification provider readiness evidence","featureId":"feature-affiliates-referrals","featureStatus":"live","issueNumbers":[19,193,195,273,275,277,279,281],"primaryUser":"Owner reviewing affiliate partner notification provider readiness before sends exist","userGoal":"Record redacted partner notification provider readiness evidence for a seeded affiliate partner report without sending partner notifications, enabling provider sends, calling providers, creating send payloads, creating queue rows, or creating payout state.","sourceEvidence":["https://bumpgrade.com/affiliates/source-data","https://bumpgrade.com/api/admin/affiliates/notification-readiness-records","https://bumpgrade.com/api/admin/affiliates/notification-send-preflights","https://bumpgrade.com/api/admin/affiliates/notification-provider-readiness","https://bumpgrade.com/admin/affiliates","https://github.com/markitics/bumpgrade/issues/19","https://github.com/markitics/bumpgrade/issues/277","https://github.com/markitics/bumpgrade/issues/279","https://github.com/markitics/bumpgrade/issues/281"],"happyPath":["Fetch /affiliates/source-data and inspect partnerNotificationProviderReadinessRecords.currentEvidence.","Open /admin/affiliates as a verified owner.","Record a notification provider readiness disposition with exact confirmation, idempotency key, current program revision, partner report status, payout batch status, payout preparation record status, fraud review record status, notification readiness record status, send preflight record status, review flag severity, and linked ledger count.","Replay the idempotency key and confirm the same redacted record is returned.","Read /affiliates/source-data again and confirm aggregate notification provider readiness counts and latest redacted metadata update."],"edgeCases":["Signed-out requests are rejected.","Missing confirmation, unsupported partner reports, unsupported partners, unsupported payout preparation IDs, unsupported payout batch IDs, unsupported review flag IDs, unsupported dispositions, stale program revisions, stale partner report statuses, stale payout batch statuses, stale payout preparation contract statuses, stale fraud review contract statuses, stale notification readiness contract statuses, stale send preflight contract statuses, stale fraud evidence, and conflicting idempotency keys fail safely.","The record does not send partner notifications, enable provider sends, call providers, create send payloads, create queues, include recipient emails or message bodies, enforce fraud decisions, create payable commission state, trigger Stripe payouts or transfers, store payout accounts, collect tax data, expose buyer data, expose raw ledger/click/checkout rows, expose actor identity, or expose private fraud signals."],"agentAccess":"Agents can read the public-safe notification provider readiness contract and aggregate evidence, but only owner sessions can create notification provider readiness records. Direct public agent writes, partner notification sends, provider-send enablement, provider calls, provider secrets, sender credentials, send payload creation, queue dispatch, fraud enforcement, payable commission mutation, payout execution, tax handling, recipient exposure, and private fraud signal exposure require future confirmed-write APIs.","validation":["Playwright covers unauthenticated rejection, owner contract read, exact confirmation, idempotency replay/conflict, stale-state rejection, unsupported report/partner/flag/disposition validation, notification readiness stale-state validation, public source-data redaction, and admin UI rendering for notification provider readiness records.","Issues #279 and #281 record the owner-reviewed affiliate partner notification provider readiness evidence slice."],"sortOrder":64,"updatedAt":"2026-05-25T06:06:14.000Z","proof":{"status":"passed","lastTestedAt":"2026-05-25T05:53:00.000Z","environment":"Local owner-session smoke plus production screenshot, affiliate/referral source-data evidence, fraud enforcement record screenshot, and MVP closeout source-data checks.","method":"Referral click, checkout attribution, commission ledger, review action, partner report, partner statement snapshot, payout-prep, owner payout-preparation record, owner fraud-review record, owner fraud-enforcement record, notification-readiness, send-preflight, provider-readiness, and grouped post-MVP execution-boundary route checks.","summary":"Affiliate/referral MVP proof is live: source data, partner links, privacy-safe click capture, sandbox checkout attribution, review-only commission evidence, reversible owner review actions, public-safe partner reports, public-safe partner statement snapshots, payout preparation, fraud review records, fraud enforcement records, and notification readiness/preflight/provider-readiness records have proof surfaces while payout execution, partner sends, private portals, payable statements, and direct agent writes remain grouped in issue #424.","ciLinks":[{"label":"GitHub Actions","url":"https://github.com/markitics/bumpgrade/actions","kind":"ci"}],"screenshotLinks":[{"label":"Affiliate payout prep","url":"https://bumpgrade.com/pr-screenshots/issue-195-affiliate-payout-prep.png","kind":"screenshot"},{"label":"Commission review","url":"https://bumpgrade.com/pr-screenshots/issue-115-commission-review-affiliates-desktop.png","kind":"screenshot"},{"label":"Fraud review records","url":"https://bumpgrade.com/pr-screenshots/issue-275-admin-affiliate-fraud-review-record.png","kind":"screenshot"},{"label":"Fraud enforcement records","url":"https://bumpgrade.com/pr-screenshots/issue-424-admin-affiliate-fraud-enforcement-records.png","kind":"screenshot"},{"label":"Partner statement snapshot","url":"https://bumpgrade.com/pr-screenshots/issue-424-partner-statement-snapshots.png","kind":"screenshot"},{"label":"Notification readiness record","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-notification-readiness-record.png","kind":"screenshot"},{"label":"Latest notification readiness records","url":"https://bumpgrade.com/pr-screenshots/issue-277-admin-affiliate-latest-notification-records.png","kind":"screenshot"},{"label":"Affiliate MVP roadmap closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-roadmap.png","kind":"screenshot"},{"label":"Affiliate MVP features closeout","url":"https://bumpgrade.com/pr-screenshots/issue-19-affiliate-mvp-live-closeout-features.png","kind":"screenshot"}],"validationLinks":[{"label":"Affiliates source data","url":"https://bumpgrade.com/affiliates/source-data","kind":"source-data"}],"notes":["Payable statements, payable commissions, Stripe payouts, payout accounts, tax records, private fraud signals, recipient data, provider calls, queue dispatch, partner notifications, private partner portals, buyer attribution finalization, and direct agent writes remain outside the live MVP and are tracked by issue #424."]},"proofSource":{"kind":"feature","inherited":true,"sourceJourneyId":null,"sourceFeatureId":"feature-affiliates-referrals","label":"Inherited feature proof"}}]}