Playbook: Web App / SaaS

What an agent looks for and models when calibrating a web app or SaaS product: features, experiments and flags, customer feedback, plans.

For Calibrate, Phase 2b. Index: Playbooks.

Evidence first. This playbook is a list of things to look for, not a template: no database, column or row gets created unless this project's code, docs or history shows it.

Pick it when

A web framework in the manifest — next, nuxt, @remix-run/*, @sveltejs/kit, astro, django, rails, laravel/framework — plus at least two product signals: user routes (app/, pages/, src/routes/), auth (next-auth, @auth/*, devise, @clerk/*, @supabase/*), billing (stripe, @paddle/*), feature flags or product analytics (posthog-js, launchdarkly-*, @vercel/flags, unleash-*), pricing or marketing pages, locale message files. A framework alone is a website, not a product.

Concepts to model

Features (conceptType: feature) — the product as users meet it, named the way the app's own navigation names it; never the route or component list. Columns: Area select (from the navigation) · Status status (Idea, Planned → Building → Shipped, Retired) · Audience select (from the plans: Free, Pro, Admin…) · Shipped date · Flag text (the key that gates it, if any).

Experiments & flags (experiment) — only with a flag or experiment SDK in use. Flag key text · Status status (Draft → Running → Rolled out, Removed) · Metric text · Started date · Ended date.

Customer feedback (feedback) — only when feedback exists: issue labels such as bug/feature-request, a support export, a feedback model in the code, notes you were given. Type select (Bug, Request, Praise, Churn reason) · Area select · Source select (Support, Issue, Interview, Review) · Received date · Link url.

Plans & pricing (plan) — only when prices or limits live in code (price ids, a limits constant). Price number · Interval select (Monthly, Yearly) · Status select (Live, Legacy). Body: the limits, quoted from the code.

Example rows

  • Features — Team invitations · Area Workspace · Status Shipped · Audience Pro. Body: "Owners invite by email; the link expires after 7 days (INVITE_TTL in src/lib/invites.ts). Seats are checked when the invite is accepted, not when it's sent, so an over-limit invite fails late — see the gotcha."
  • Customer feedback — Export loses table formatting · Type Bug · Area Export · Source Issue · Link to the issue. Body: "Three reports since v2.3; nested tables flatten to text. Affects the PDF path only."

Home dashboard

The workspace's home (home: true), which opens on the Pano button:

  • project — summary: what users do with the product and who pays for it; stack chips from the manifest (framework, database, auth, billing).
  • Then, only for the databases you actually built, and only blocks that show something today:
    • Features: metric filter Status equals Building, unit "building"; chart stack grouped by Status; list filter Status equals Planned, showColumns Area, Audience.
    • Feedback: metric with a trend on Received over 30 days; chart bar grouped by Area.
    • Experiments: list filter Status equals Running, showColumns Metric, Started.
  • links overview, Decisions, Features · activity · savings

Don't

  • Turn the route tree or component folder into Features — that is one grep away; a feature is what a user would name.
  • Import every issue as feedback. Model the recurring themes with a few representative rows, and link the tracker.
  • Copy prices from marketing copy when the code disagrees. Write what the code says and log the mismatch as an open question.