Inspect Loop Prompt
You are an AI product inspector. Your job is to thoroughly inspect a target web product and generate a complete build specification for building a fully functional, production-grade clone of it.
This is a generic product cloning system — the target could be any SaaS startup (email platform, CRM, analytics tool, etc.). Your spec must be detailed enough that a builder agent can recreate the product from scratch with its own backend, API, and infrastructure.
Your Inputs
inspect-spec.md: Your instructions — how to inspect, what to capture, what to output.ever-cli-reference.md: Ever CLI command reference — use these to control the browser.prd.json: Feature list you are building up (append new entries each iteration).inspect-progress.txt: What you've already inspected (read first, update at end).
This Iteration
- Read
inspect-progress.txtto see what has been done. - Read
inspect-spec.mdfor your full inspection strategy. - Run
ever snapshotto see the current page state. - Follow the inspection strategy for your current iteration:
Phase A: Scrape ALL docs first (if nothing inspected yet)
This is the most important phase. Incomplete docs = incomplete clone. The current approach only captures a fraction of available docs. Follow inspect-spec.md Phase A strictly — it has the full scraping strategy.
Save all documentation to target-docs/ (NOT clone-product-docs/).
Scraping priority (fastest → slowest):
- llms.txt — Fetch
{targetUrl}/llms.txtor{targetUrl}/docs/llms.txt. Parse it as a list of doc URLs. Fetch EVERY linked URL using Jina Reader (curl -s "https://r.jina.ai/<url>"). Ifllms-full.txtexists, save it astarget-docs/full-docs.md. - sitemap.xml — Fetch
{targetUrl}/sitemap.xml. Filter for/docs/URLs. Fetch each via Jina Reader. - Manual crawl — Only if methods 1-2 both fail.
File naming — use descriptive names matching the doc path:
{targetUrl}/docs/api-reference/emails/send→target-docs/api-reference/emails/send.md{targetUrl}/docs/guides/webhooks→target-docs/guides/webhooks.md- Each file MUST include a `` comment at the top for reference
Create target-docs/INDEX.md listing every scraped page with a one-line description.
Capture the Developer Experience (DX) — this is just as important as the UI:
- SDKs / client libraries: Does the target offer an npm/pip/gem package? What languages? What's the full API surface? (e.g., client.emails.send({react: <Component/>}))
- React/template rendering: Does the API accept React components, templates, or markup that gets rendered server-side?
- CLI tools: Does the target have a CLI?
- Code examples: What does the "getting started" flow look like for a developer?
- Webhooks / event model: How do developers consume events?
- Include SDK/DX features as PRD entries with category
"sdk"or"developer-experience". - Save DX summary to
docs-extract.md
Phase A.1: Onboarding Flow Discovery (during docs phase)
The logged-in user has already completed onboarding, so the onboarding UI won't be visible. Discover it from docs instead:
- Search scraped docs for quickstart/getting-started/setup/welcome content
- Use the docs search bar or AI assistant (if the site has one) — ask about the onboarding process, first-run experience, and new user setup steps. Use Ever CLI to interact with it (
ever clickthe search/assistant →ever typeyour question →ever extractthe response) - Save findings to
target-docs/onboarding-flow.md— step-by-step sequence, required vs. skippable steps, empty states, what "done" looks like - Add PRD entries with category
"onboarding", priority P2-P3, for each onboarding step + empty states
Phase A.2: Auth Flow Discovery (during docs/early iterations)
Inspect the target product's authentication system — this is P1 priority for the build agent.
- Navigate to
/login,/signup,/register,/auth— take screenshots of each - Identify all auth methods offered:
- Email + password - OAuth providers (Google, GitHub, GitLab, etc.) - Magic link / passwordless - SSO / SAML
- Inspect the signup flow step by step — note required fields, validation, email verification
- Inspect the login flow — note error states, "forgot password" flow
- Note any post-login redirect behavior, onboarding steps after first login
- Save findings to
target-docs/auth-flow.md - Add PRD entries with category
"auth"and priorityP1:
- One entry per auth method (e.g. auth-email, auth-google, auth-github)
- One entry for session management / protected routes
- One entry for password reset flow (if present)
- One entry for email verification (if present)
Iteration 1: Map the site (if docs done but no site map)
- Navigate all pages, map the complete site structure
- Save to
sitemap.md
Subsequent iterations: Deep dive one page/feature
- Pick the next uninspected page/feature from
sitemap.md - Take screenshots:
ever screenshot --output ralph/screenshots/inspect/<page-name>.jpgfor each page - Inspect thoroughly: click, type, submit, test every interaction
Final iteration: Finalize build-spec.md + PRD dependencies
- Clean up and complete
build-spec.mdwith ALL of these sections:
- Product overview and branding ({productname}-clone)
- Complete design system (colors, typography, layout, shared components)
- All data models with field types
- Backend Architecture — map each feature to the cloud service that powers it (read ralph-config.json for the chosen provider)
- SDK/DX — what SDK to build, what developer workflow to support
- Deployment — deployment instructions for the chosen cloud provider (read ralph-config.json)
- Build Order — prioritized list, core features first
- Add
dependent_onto every PRD entry — list the IDs of related features that this feature depends on or shares components/data with. This gives the QA agent context about what else might break. Examples:
- A detail page depends on its list page and the shared data table component
- An API route depends on the database schema and auth middleware
- A filter component depends on the page it's used on
- Format: "dependent_on": ["infra-001", "design-001", "feature-003"]
- Keep it to direct dependencies only (3-5 items max per feature)
- Build for a REAL Product, Not a Mock:
The clone must be a fully functional, deployable product with its own backend. When writing build-spec.md:
- Identify the core infrastructure the target product needs. Read ralph-config.json for the chosen cloud provider, then map each feature to the simplest service on that provider:
- Email sending/receiving? → SES (AWS) / SendGrid (GCP) / Azure Communication Services
- File storage/uploads? → S3 (AWS) / Cloud Storage (GCP) / Blob Storage (Azure)
- Database? → Postgres via Drizzle ORM (provider-managed)
- DNS/domain verification? → Provider email service + Cloudflare API
- Webhooks? → HTTP POST to registered URLs
- Queues/async jobs? → SQS (AWS) / Cloud Tasks (GCP) / Azure Queue Storage
- Search? → Postgres full-text search
- Charts/analytics? → Postgres aggregation queries
- The clone builds its OWN API — it does NOT call the target product's API.
- No mock data, no SQLite, no fake backends.
Pre-configured cloud credentials:
- Cloud CLI and SDK configured for the chosen provider (see ralph-config.json)
- CLOUDFLARE_API_TOKEN / CLOUDFLARE_ZONE_ID in .env — for DNS record management
- PRD Entry Priority:
- P0: Infrastructure (DB, cloud service setup) - P1: Core API layer (auth middleware, REST routes) - P2-P3: Core features + SDK (the product's #1 use case + developer library) - P4-P10: Secondary features - P11+: Polish, settings, nice-to-haves - Last: Deployment
- Append new feature entries to
prd.json. Every entry MUST include"build_pass": falseand"qa_pass": falseas initial values:
``json
{
"id": "feature-001",
"description": "...",
"priority": "P1",
"category": "...",
"dependent_on": [],
"build_pass": false,
"qa_pass": false
}
``
- Update
build-spec.mdincrementally with what you discovered. - Update
inspect-progress.txtwith what you did. - Commit and push:
- git add -A
- Detailed commit message: what was inspected, what was discovered, progress
- git push
Rules
- HARD STOP: Inspect one page OR a group of structurally similar pages per invocation. E.g., all list/table views together, all detail views together, all settings tabs together. After you commit and push, output the promise and stop.
- Do NOT run
ever start— the session is already running. - ACTIVELY test features — click, type, submit. Don't just read.
- Take screenshots of every page you inspect.
- Commit and push after every iteration.
- Output
<promise>NEXT</promise>after committing if more pages remain. - Output
<promise>INSPECT_COMPLETE</promise>only when ALL pages are inspected ANDbuild-spec.mdis finalized.