Foundry Foundry

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 notifications row). 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-screenshots bucket from EPIC-4) → returns URLs
  • Submit creates a GitHub issue in autri repo 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) or enhancement (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_EMAILS Parameter 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/enhancement labels (autri repo, private)
  • Backup: mailto:dan@hannahlabs.ai link 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.ai apex: "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-day per 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_queries table (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.ai both 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

  1. Welcome banner component (replaces welcome email):
    • First-login detection (check if user has any prior notifications row OR a last_login_at field)
    • 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)
  2. Notifications UI:
    • Bell icon in app header with unread count badge
    • Dropdown component listing recent notifications
    • markNotificationRead server action wired
    • KB-ready notification write added to ingestion finalization step
  3. "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 mcpServers block with URL + bearer token
    • Restart Claude Desktop, verify autri tools appear
  4. Token-minting flow: server action in autri app accepts connector credentials, returns long-lived JWT (30-day expiry, scoped to connector)
  5. 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-screenshots bucket)
    • 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
  6. autri.ai apex placeholder: Cloudflare Pages, single HTML page, brand colors, "private beta — invite-only" + dan@hannahlabs.ai waitlist mailto
  7. mailto:dan@hannahlabs.ai "having trouble?" link on login page (/login or wherever auth landing is)
  8. Dan self-onboard end-to-end (NEW Google account):
    • Add Dan's new Google account email to ALLOWED_EMAILS Parameter Store + redeploy Lambda
    • Sign up at app.autri.ai with 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
  9. Triage any issues found during self-test, patch them
  10. Mark self-test complete only when the full flow works without intervention

Day 14 — External beta + cost report

  1. Onboard STEM Racing engineer (first, while Dan is fresh):
    • Add engineer's email to ALLOWED_EMAILS Parameter 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
  2. Onboard mom:
    • Add mom's email to ALLOWED_EMAILS Parameter 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
  3. Triage feedback received from both — both GitHub Issues (in-app reports) and direct email (dan@hannahlabs.ai)
  4. 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 (from mcp_audit_log), KB chunks, ingestion costs
  5. 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.ai apex 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.md with $/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.ai apex: 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_queries table 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)
  • beta@autri.ai outbound email alias — replaced by mailto:dan@hannahlabs.ai link on login page
  • SES 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

Review

🔒

Enter your access token to view annotations