EPIC-5: Beta Launch + Cost-Data Deliverable
Drafted 2026-05-19. Beta-sprint epic 5 of 5. Sequencing: Week 2 Days 13-14. Depends on EPIC-4 (production deploy live).
Goal
Onboard real beta users + produce the cost-data deliverable that drives Tier Ladder pricing decisions. End state: 3+ external beta users have logged in and successfully used the product; an end-of-sprint cost report exists with per-MAU cost numbers per stack layer.
Why this epic exists
A deployed app with no users is not a beta — it's a demo. This epic is where Autri stops being a project Dan works on and starts being a product real people use. Onboarding mom (Author tier validation) + STEM Racing engineer (Team tier validation) gives us the first real signal on whether the wedge works for the audiences we built it for.
The cost-data deliverable matters separately: D18 / Tier Ladder pricing is currently placeholder. Two weeks of real beta usage gives us $/MAU numbers we can use to validate or revise pricing before any paying customer touches it.
Scope (in)
Reconciled with projects/autri/requirements/autri-beta blue-team pass (2026-05-19). All email infrastructure cut; replaced by in-app notifications.
Onboarding artifacts:
- First-login welcome banner — one-time, dismissable, shows on first login after Cognito post-confirmation provisioning. Replaces welcome email per requirements blue-team.
- In-app KB-ready notification — triggered by ingestion finalization (writes
notificationsrow). Replaces "KB is ready" email per requirements blue-team. - "Connect Autri to Claude Desktop" guide — 1-page markdown, served in-app at
/help/claude-desktop - Connector creation walk-through — in-app tooltips on
/settings/connectors(no Loom; live screen-share if user gets stuck) mailto:dan@hannahlabs.ai"having trouble?" link on login page — covers the "can't even log in" case without email infrastructure (opens user's email client)
In-app notifications UI (NEW from blue-team):
- Bell icon in app header with unread count badge
- Dropdown shows recent notifications (most recent first); click marks as read
- Notification types in v1:
welcome(from post-confirmation Lambda),kb_ready(from ingestion finalization) - Empty state: "No notifications yet"
- Mark-all-read action
Token-minting flow (the actual "Connect to Claude Desktop" UX):
- Static bearer token approach (per locked decision)
- In-app button on connector detail page: "Mint Claude Desktop token" → modal shows a long-lived JWT (signed by autri app server action; 30-day expiry; scoped to connector)
- User copies the JWT + pastes into Claude Desktop MCP config as
Authorization: Bearer <token> - User re-mints from the same connector when token expires
In-app feedback feature:
- Two fixed-position buttons in the app shell: "Report a bug" + "Request a feature"
- Modal with form: title, description, repro steps, screenshot upload (multi-image)
- Screenshots upload to S3 (
feedback-screenshotsbucket from EPIC-4) → returns URLs - Submit creates a GitHub issue in
autrirepo via GitHub Issues API:- Title from the form
- Body: description + repro steps + embedded screenshot URLs (markdown image syntax) + reporter name
- Labels:
bug(for bug reports) orenhancement(for feature requests)
- GitHub PAT stored in Secrets Manager (provisioned in EPIC-4)
- Endpoint requires Cognito session (auth-gated; only allowlisted users can submit) — bot/spam defense
- Build fresh — no clean reusable code from other apps; build it portable so future apps can extract to a shared package
Beta users (3 minimum, revised personas):
- User 1: Dan — self-onboard end-to-end on the deployed stack. Validates web chat + MCP (Claude Desktop) paths. Test from a new Google account (not his existing test account) to simulate the stranger-walks-up flow.
- User 2: Mom — web chat only path. Uses her novel manuscript KB. Desktop confirmed (no mobile-responsive work needed).
- User 3: STEM Racing engineer (green to AI tools) — web chat first (Path D from triage). Validates the web chat path for non-technical users. Optional follow-up post-beta: hand-hold them through Claude Desktop installation to validate MCP for "willing-to-learn" users.
Cognito auto-provisioning validation (with allowlist):
- Day 13 explicit step: STEM Racing engineer's email pre-added to
ALLOWED_EMAILSParameter Store - They sign up via Google → post-confirmation Lambda runs allowlist check (pass) → auto-provisioning (create user + Personal library + access) → welcome notification insert
- Dan watches the signup live, verifies DB state post-signup before mom logs in Day 14
- Catches any missing provisioning logic before second user hits the path
Feedback channel:
- Primary: in-app feedback buttons → GitHub Issues with
bug/enhancementlabels (autri repo, private) - Backup:
mailto:dan@hannahlabs.ailink on login page — for issues users can't capture via in-app modal (e.g., "I can't even log in") - Daily check-in during week 2 (Dan reviews GitHub Issues + email inbox)
Apex domain placeholder:
- 30-min Cloudflare Pages page at
autri.aiapex: "Autri is in private beta — invite-only. Email dan@hannahlabs.ai for waitlist." - Brand colors (from
design-brief.md) - No CMS, no analytics, no complexity
Cost-data deliverable:
- End-of-sprint cost report at
projects/autri/beta-sprint-cost-report.md $/user-dayper stack layer (renamed from$/MAU— clearer at our scale)- Amplify (app)
- AgentCore Runtime (MCP)
- RDS (DB)
- Fargate Tasks (ingestion)
- S3 (storage)
- Cognito (auth — free at our scale)
- Anthropic API (LLM — traffic-driven, not infra-driven)
- (SES line cut — no email)
- Per-user activity from
chat_queriestable (EPIC-2) +mcp_audit_log(EPIC-3): chat queries, MCP queries, KB sizes - Cost Explorer 24h lag explicitly noted: report covers days 8-13 fully; day 14 spend partial
- Recommendations for D18 / Tier Ladder pricing refinement (next session topic)
Out of scope
- Marketing landing page (deferred — separate session before AWS Activate Founders application)
- Tally form / waitlist (deferred — beta is invite-only)
- Stripe / payment (everyone in beta is free)
- Team invite flow (single-user-per-org for beta)
- Actual pricing change to D18 — just produce the data; pricing decisions in a later session
Dependencies
- EPIC-4 — production deploy live (
app.autri.ai,mcp.autri.aiboth working with Cognito Google login) - Mom + STEM Racing engineer are aware they're being onboarded (Dan coordinates the human side)
Deliverables
- Onboarding email templates (3 versions)
- "How to connect to Claude Desktop" guide
- 3+ external beta users with active accounts + successful queries
- Feedback triage channel active with at least 1 daily check-in
- End-of-sprint cost report with $/MAU breakdown
Implementation plan
Day 13 — Onboarding artifacts + in-app notifications + in-app feedback + apex placeholder + Dan self-test
- Welcome banner component (replaces welcome email):
- First-login detection (check if user has any prior
notificationsrow OR alast_login_atfield) - Dismissable banner at top of dashboard: greeting + "what to do next" (3 bullets max) + link to
/help/claude-desktop - Dismiss writes to a flag (localStorage or user preference column)
- First-login detection (check if user has any prior
- Notifications UI:
- Bell icon in app header with unread count badge
- Dropdown component listing recent notifications
markNotificationReadserver action wired- KB-ready notification write added to ingestion finalization step
- "Connect Autri to Claude Desktop" guide at
/help/claude-desktop:- Log in at app.autri.ai → /settings/connectors → "Create connector"
- Select library, name it, click "Generate"
- Copy URL + client_secret (warning: shown only once)
- Click "Mint Claude Desktop token" → copy the JWT
- Open Claude Desktop config (path per OS), add
mcpServersblock with URL + bearer token - Restart Claude Desktop, verify autri tools appear
- Token-minting flow: server action in autri app accepts connector credentials, returns long-lived JWT (30-day expiry, scoped to connector)
- In-app feedback feature:
- Two fixed-position buttons in app shell ("Report a bug" / "Request a feature")
- Modal component with form (title, description, repro steps, screenshot upload)
- Screenshot upload → S3 (
feedback-screenshotsbucket) - Submit endpoint (Cognito-session-gated) → GitHub Issues API via PAT (creates issue with appropriate label, embeds screenshot URLs)
- Test: submit a bug report, verify GitHub issue created correctly
autri.aiapex placeholder: Cloudflare Pages, single HTML page, brand colors, "private beta — invite-only" +dan@hannahlabs.aiwaitlist mailtomailto:dan@hannahlabs.ai"having trouble?" link on login page (/loginor wherever auth landing is)- Dan self-onboard end-to-end (NEW Google account):
- Add Dan's new Google account email to
ALLOWED_EMAILSParameter Store + redeploy Lambda - Sign up at
app.autri.aiwith the fresh Google account - Verify post-confirmation Lambda created user + Personal library + welcome notification (
SELECT * FROM libraries, notifications WHERE owner_user_id = ?) - Confirm welcome banner appears + bell shows unread notification
- Upload a test document
- Wait for ingestion + see KB-ready notification in bell
- Generate a connector → mint token → install into Claude Desktop using the guide
- Run 5+ queries through Claude Desktop
- Run 5+ queries through web chat
- Submit a test bug report via in-app feature → verify GitHub issue
- Add Dan's new Google account email to
- Triage any issues found during self-test, patch them
- Mark self-test complete only when the full flow works without intervention
Day 14 — External beta + cost report
- Onboard STEM Racing engineer (first, while Dan is fresh):
- Add engineer's email to
ALLOWED_EMAILSParameter Store + redeploy Lambda - Tell them what URL to go to (
app.autri.ai) + that Dan will check in synchronously - Dan watches the signup live — verify post-confirmation Lambda allowlist check passes + creates user + Personal library + welcome notification correctly
- Help them upload a test doc (FIA Regs or sample)
- Walk through web chat usage
- Defer Claude Desktop: schedule a 30-min follow-up session post-beta to walk through MCP setup (Path D)
- Capture initial reactions in shared notes
- Add engineer's email to
- Onboard mom:
- Add mom's email to
ALLOWED_EMAILSParameter Store + redeploy Lambda - Tell her the URL + walk through "log in with Google" (web chat only — no MCP)
- Help her upload her novel (manual path, since ingestion-from-upload already works)
- Confirm she sees welcome banner + can chat with her novel KB
- Capture her reactions
- Add mom's email to
- Triage feedback received from both — both GitHub Issues (in-app reports) and direct email (
dan@hannahlabs.ai) - Generate cost report:
- Pull Cost Explorer data for the 2-week sprint window (acknowledge day-14 partial data due to 24h lag)
- Break down by stack layer using
cost-bucket=<layer>tags - Compute $/user-day per layer (just 3 users, so noisy — acknowledge in the report)
- Calculate per-user activity: chat queries (from
chat_queries), MCP queries (frommcp_audit_log), KB chunks, ingestion costs
- Write cost report at
projects/autri/beta-sprint-cost-report.md:- Sprint cost summary
- Per-stack-layer breakdown ($/user-day)
- Per-user activity (chat + MCP)
- Notes for D18 Tier Ladder refinement — present data, defer pricing decisions to next session
- Open questions for next session
Risks
- Onboarding friction we haven't predicted. Mitigation: Dan tests his own flow Day 13 with a new Google account before sending external invites. Anything that trips him up gets patched.
- STEM Racing engineer (green to AI tools) bouncing off. Mitigation: web-chat-first path (Path D); MCP deferred to optional post-beta session. Web chat has lower onboarding ceiling.
- Mom or STEM Racing engineer hits an edge case that blocks them. Mitigation: Dan available for synchronous troubleshooting during their onboarding (kiddy-pool launch — be on call).
- Cost report numbers don't have enough signal (only 2 weeks of data, only 3 users). Mitigation: acknowledge in the report; extend the data window with a "30 days post-deploy" follow-up report later.
- Bedrock model-access still pending at end of Week 2. Mitigation: stay on Anthropic API for live traffic; cost report reflects Anthropic API spend with a note about expected delta when switching to Bedrock.
- SES still in sandbox at beta launch. Mitigation: pre-verify all 3 beta users' email addresses individually (workable for beta scale). Production access submitted Day 8; if not approved by Day 13, use pre-verified addresses.
- GitHub PAT for feedback API exposed. Mitigation: stored in Secrets Manager; only accessible to autri app code; rate-limited per the GitHub API.
- Screenshot uploads contain sensitive info. Mitigation: feedback-screenshots S3 bucket is private (signed URLs in issue body OR public-read with hard-to-guess keys); Dan reviews issues before sharing externally.
- Cognito post-confirmation Lambda silently failing. Mitigation: Lambda alerts on failure (CloudWatch metric); manual SQL cleanup script as fallback; Dan watches first 2 signups live.
- Mom's tech comfort level. Mitigation: she gets the easiest path (web chat only, no MCP, no Claude Desktop). If she still struggles, that's important UX feedback worth capturing.
- autri.ai apex placeholder may need follow-up tweaks. Mitigation: 30-min budget, ship and revisit if anyone complains. Static HTML on Cloudflare Pages is easy to update.
Definition of done
- First-login welcome banner component working (dismissable, one-time)
- Bell icon + notifications dropdown live in app header (unread count, mark-read on click)
- KB-ready notification trigger wired in ingestion finalization
- "How to connect to Claude Desktop" guide live at
/help/claude-desktop - Token-minting flow live (button on connector page → modal shows long-lived JWT)
- In-app feedback feature live (2 buttons + modal + screenshot upload → GitHub Issues, Cognito-session-gated)
-
autri.aiapex placeholder live (Cloudflare Pages, brand colors, waitlist mailto) -
mailto:dan@hannahlabs.ai"having trouble?" link on login page - Dan self-onboarded successfully via the deployed stack from a new Google account (full flow, no intervention)
- Cognito post-confirmation Lambda verified doing allowlist check + creating user + Personal library + welcome notification on new signups
- STEM Racing engineer successfully logged in (allowlisted) + chatted with a KB via web chat
- Mom successfully logged in (allowlisted) + chatted with her novel KB via web chat
- 3+ external beta users have active sessions
- At least 5 chat queries + 5 MCP queries (Dan's path) logged across the users
- At least one test bug + one test feature request flowed through the in-app feedback feature into GitHub Issues
- Cost report produced at
projects/autri/beta-sprint-cost-report.mdwith $/user-day per stack layer - Day-14 cost lag explicitly noted in report
- Feedback documented in GitHub Issues for next session's review
Notes / open questions
Locked this triage pass + blue-team pass (2026-05-19):
- MCP auth UX: static bearer token (mint via in-app button), not full OAuth flow in v1
- Mom's onboarding: desktop confirmed (no mobile-responsive work needed)
- STEM Racing engineer (green): web chat first (Path D); MCP deferred to optional post-beta session
- Auto-provisioning + allowlist: explicit Day 13/14 verification (post-confirmation Lambda allowlist check + Personal library creation + welcome notification)
- Skip Loom: written guide + live screen-share if user gets stuck
- Cost metric: $/user-day (not $/MAU at this scale)
autri.aiapex: 30-min Cloudflare Pages placeholder- In-app feedback buttons: 2 buttons (bug/feature) → modal → S3 screenshots → GitHub Issues API (autri repo, private). No backend persistence beyond GitHub. Cognito-session-gated.
- Per-user activity tracking: new
chat_queriestable in EPIC-2 schema (one row per chat turn) - Feedback channel: in-app buttons → GitHub Issues (primary);
mailto:dan@hannahlabs.ai(backup) - Cost Explorer 24h lag: acknowledged explicitly in the report
Cut by requirements blue-team (2026-05-19):
Welcome email template— replaced by first-login welcome banner (in-app)"KB ready" email template— replaced by in-app notification (bell + dropdown)— replaced bybeta@autri.aioutbound email aliasmailto:dan@hannahlabs.ailink on login pageSES domain setup— entire email infrastructure removed from beta
Still open (decide during implementation):
- Token expiry duration — lean 30 days. Beta users won't tolerate weekly re-minting.
- Welcome banner dismissal storage — localStorage (per-device) or DB column (per-user)? Lean DB column (
users.welcome_dismissed_at) for cross-device consistency - Notifications real-time vs polling? Lean polling on a 30s interval for v1; SSE/websocket if UX needs it
- Mom's Claude Desktop onboarding eventually — queue for post-beta if she stays engaged
- Second STEM Racing user to validate multi-user-shared-library — defer to v1.1
- Cost report cadence post-beta: monthly? Bi-weekly? Lean monthly cadence once we have steady-state traffic
- Beta exit criteria (clearer): 30 days post-launch + ≥50 chat queries across users + cost report shows usable $/user-day signal. Time-based trigger, not "feedback velocity drops."
- Whether to auto-create GitHub issues as public-visible or repo-private — autri repo is private for beta, so issues are private