Dot Product
Mine an existing codebase for everything a sales motion needs to know about the product, and write it into a .product/ folder at the project root. The output is the raw knowledge layer that sales reps, marketing, and AI sales agents read from.
This skill does discovery and synthesis, not pitching. The copy here should be plain, factual, and grounded in what the code actually does. Polished pitch language is the job of human-copy-style and portfolio-copywriter downstream.
Output
Always write to .product/ at the repository root (alongside .claude/, never inside src/ or a subfolder). Create the folder if missing.
| File |
What goes in |
OVERVIEW.md |
One paragraph: what the product is, the category it sits in, the customer it serves, the core promise. Plus a short "at a glance" block (stack, deployment model, maturity signal). |
FEATURES.md |
User-facing features grouped by area. Each feature: short name, one-line description, where it lives in the code (file or route), maturity (shipped / in progress / experimental). |
USE_CASES.md |
Concrete scenarios: "A {persona} uses this when {trigger} to {outcome}." Build these from real flows in the code, not imagined ones. |
PERSONAS.md |
Who uses the product. Infer from roles, permissions, auth flows, onboarding steps, and UI copy. Include a primary persona and any secondary ones. |
INTEGRATIONS.md |
Third-party services, APIs, OAuth providers, webhooks, supported platforms, import/export formats. Group by category (auth, payments, data, comms, etc.). |
DIFFERENTIATORS.md |
Capabilities that are unusual, surprisingly deep, or worth leading with in a pitch. Conservative — only list things the code actually supports. |
TECHNICAL_PROFILE.md |
Stack, hosting/deployment model, data residency hints, auth model, security-relevant features (RBAC, audit logs, encryption), scalability signals. For technical buyers and security questionnaires. |
LIMITATIONS.md |
What the product does not do, based on what's missing in the code. Important for honest qualification. |
GLOSSARY.md |
Domain terms the product uses (from models, copy, routes). Helps a sales agent talk like the team. |
product-profile.json |
All of the above as structured data. Schema below. Direct input for AI sales agents. |
If the codebase is small, files can be brief — a few bullets is fine. Don't pad. If a section genuinely has nothing in it, write _No signal found in code._ rather than inventing.
Workflow
Run these phases in order. Don't skip discovery to start writing — every claim in the output must trace back to something you read.
Phase 1 — Map the surface
Build a mental model of what the code exposes. Read, don't guess.
Signal sources, in priority order:
- Manifest files —
package.json, pyproject.toml, Cargo.toml, go.mod, composer.json, Gemfile, pubspec.yaml. Name, description, dependencies, scripts, entry points.
- README and
/docs — existing positioning. Useful but treat as a hypothesis to verify against the code, not ground truth. READMEs often lag behind reality.
- Routes / API surface —
app/, pages/, routes/, api/, controllers/, route registrations, OpenAPI specs, GraphQL schemas. Each route is a capability.
- UI surfaces — pages, screens, navigation menus, settings panels. The menu is often the cleanest map of features.
- Data models — schemas, migrations, ORM models, Prisma/SQL/Mongoose definitions. The nouns of the domain.
- Auth and roles — middleware, guards, role checks, RBAC tables, permission strings. These reveal personas.
- Integrations — env vars (
.env.example, config/), SDK imports (stripe, twilio, okta, @aws-sdk/*), webhook handlers, OAuth flows.
- Background jobs / workers — queues, cron, scheduled tasks. Often hide major capabilities (notifications, billing runs, syncs).
- CLI entry points —
bin/, cli.ts, main.py, scripts. Direct user actions.
- Tests and E2E flows —
tests/, e2e/, cypress/, playwright/. Test names describe intended behaviour in plain language.
- UI copy — strings in components, marketing pages, email templates. The voice the product already has.
- Changelog / release notes — what the team chose to ship and announce.
Use the available tools to gather this efficiently. Glob and Grep are the safe defaults. Don't commit to a list of features until you've at least skimmed routes, models, and the navigation surface.
Phase 2 — Cluster signals into features
Group what you found into user-facing features. Rules:
- A feature is something a customer would name, not an internal module. "Send invoice reminders" is a feature; "QueueService" is not.
- One feature can span many files. One file can contribute to many features. Don't map 1:1.
- Drop dev-only tooling, internal admin scripts, and deprecated code paths. They don't belong in sales material.
- If two signals describe the same capability from different angles (e.g. a route, a model, and a UI page), merge them into one feature with multiple references.
For each feature, capture:
- Short name (3–5 words, customer-facing)
- One-line description in plain English
- Code reference(s) — file paths or routes, so the claim is verifiable
- Maturity signal (shipped, in progress, experimental) inferred from test coverage, feature flags, TODOs, route comments
Phase 3 — Translate technical to customer language
This is the step where sales material usually goes wrong. The pattern:
| Technical signal |
Customer-facing framing |
POST /api/exports route |
"Export your data" capability |
BullMQ job processing nightly aggregations |
"Automated daily reporting" |
Stripe SDK + webhook handlers |
"Subscription billing and invoicing" |
Multi-tenant schema (organisation_id on every table) |
"Built for teams — isolated workspaces per organisation" |
Consult references/translation-patterns.md for the full lookup by category (auth, billing, data, comms, storage, scale, security, multi-tenancy), including the list of infrastructure signals NOT worth surfacing.
Three rules for translation:
- Claims must be proportional to evidence. A feature flagged behind
EXPERIMENTAL_* or only enabled in dev is not "shipped". Say "in development" or omit it.
- No invented numbers. Never write "10x faster", "99.9% uptime", "trusted by 500 companies", or any metric the code can't prove. Prefer qualitative claims grounded in what the code does.
- No invented integrations. Only list integrations whose SDK, env var, or API call you actually saw. A
// TODO: add Slack comment is not an integration.
If the README makes a claim the code doesn't back up, document the claim in LIMITATIONS.md as a gap to verify with the team rather than repeating it as fact.
Phase 4 — Write the files
Write all markdown files first, then generate product-profile.json last so it reflects the finished narrative.
Markdown style:
- Plain English. No marketing theatre, no hype adjectives ("powerful", "seamless", "robust", "best-in-class").
- Australian English throughout. Defer spelling detail (licence/license, -ise/-our/-re, prose vs symbol boundary) to the
australian-english skill.
- Short sentences. Bullets where they help, prose where bullets feel staccato.
- Include code references (file or route) for any non-obvious claim, formatted like
src/routes/billing.ts:42. This lets a curious reader verify.
- Avoid emojis, em dashes, and filler transitions ("Furthermore,", "In conclusion,").
- Don't write headings the file doesn't need. If
LIMITATIONS.md has three bullets, three bullets is the file.
JSON style — see schema in references/product-profile-schema.md. Validate that every feature in FEATURES.md appears in product-profile.json and vice versa.
Phase 5 — Verify before finishing
Before declaring done, walk back through and check:
If you find gaps you genuinely cannot resolve from the code alone, list them at the bottom of OVERVIEW.md under a ## Open Questions heading rather than guessing. The sales team would rather see a question than a confident wrong claim.
When NOT to use
- The user wants engineering documentation (architecture, API reference, contributor onboarding) — that's a different artefact.
- The user wants polished pitch copy ready to publish — run this skill first, then hand the output to
portfolio-copywriter or human-copy-style.
- The codebase is a thin prototype with no real features yet — the output would be padding. Tell the user.
- The user wants competitive analysis or market positioning — this skill describes the product, not the market.
- The product is a library or developer tool whose audience is engineers — write developer-facing docs instead, the sales-agent framing doesn't fit.
Common Issues
.product/ already exists with content
Treat it as prior work. Read it first. Update files in place rather than overwriting blindly. Note in your final summary what you changed and why.
Codebase is a monorepo with multiple products
Ask the user which product to analyse, or analyse one per top-level package and write .product/<package-name>/... for each.
README contradicts the code
Trust the code. Note the contradiction in LIMITATIONS.md or the ## Open Questions section of OVERVIEW.md so the team can resolve it.
Heavy use of feature flags
Treat flagged-off features as "in development" unless the flag is on by default in production config. Don't list dark-launched experiments as shipped features.
No clear navigation or routes (CLI, library, SDK)
The "surface" is the public API or command set. Read the exported symbols, the CLI command tree, and the docs. Personas may be just "developer" — that's fine, say so.
Examples
Example 1: SaaS web app
User says: "Build a product profile for this codebase so our sales team can pitch it."
Actions:
- Map routes (
/api/*), pages (app/*), models (prisma/schema.prisma), env vars (.env.example), Stripe + Auth0 SDK usage.
- Cluster into features: workspaces, billing, SSO, exports, audit logs, role-based access.
- Translate:
Auth0 → "SSO via your identity provider", Stripe → "Subscription billing".
- Write
.product/ with all nine files + JSON.
Result: Sales team has a fact-checked feature list, a personas doc inferred from the role enum, and a JSON file the company's AI demo bot can load directly.
Example 2: AI sales agent build
User says: "I'm building an AI agent that pitches this product to inbound leads. Generate the knowledge base it should read from."
Actions: Same workflow, with extra attention to product-profile.json since the agent will read it programmatically. Make sure features and integrations are tagged with categories the agent can filter on.
Result: The agent loads .product/product-profile.json at start-up and can answer "do you support X?" questions accurately.
References
references/product-profile-schema.md — JSON schema for product-profile.json
references/translation-patterns.md — extended technical → customer-facing translation table
1---2name: dot-product3description: Use this skill to analyse an existing codebase and produce a `.product/` folder of sales-oriented knowledge files describing what the product does, who it serves, and how it competes. Output is consumed by sales reps, marketing, demo builders, and AI sales agents — not engineers. Trigger when the user asks to "extract product features", "build a product profile", "generate sales docs from the code", "build a sales agent for this product", "what does this app actually do", "summarise this codebase for sales", or asks for files like FEATURES.md, USE_CASES.md, or a product knowledge base. Also use when onboarding a new product into a sales motion or building an AI agent that needs to pitch, qualify, or answer questions about the product. Pairs with human-copy-style and portfolio-copywriter for downstream copy work.4---56# Dot Product78Mine an existing codebase for everything a sales motion needs to know about the product, and write it into a `.product/` folder at the project root. The output is the raw knowledge layer that sales reps, marketing, and AI sales agents read from.910This skill does **discovery and synthesis**, not pitching. The copy here should be plain, factual, and grounded in what the code actually does. Polished pitch language is the job of `human-copy-style` and `portfolio-copywriter` downstream.1112## Output1314Always write to `.product/` at the **repository root** (alongside `.claude/`, never inside `src/` or a subfolder). Create the folder if missing.1516| File | What goes in |17|------|-------|18| `OVERVIEW.md` | One paragraph: what the product is, the category it sits in, the customer it serves, the core promise. Plus a short "at a glance" block (stack, deployment model, maturity signal). |19| `FEATURES.md` | User-facing features grouped by area. Each feature: short name, one-line description, where it lives in the code (file or route), maturity (shipped / in progress / experimental). |20| `USE_CASES.md` | Concrete scenarios: "A {persona} uses this when {trigger} to {outcome}." Build these from real flows in the code, not imagined ones. |21| `PERSONAS.md` | Who uses the product. Infer from roles, permissions, auth flows, onboarding steps, and UI copy. Include a primary persona and any secondary ones. |22| `INTEGRATIONS.md` | Third-party services, APIs, OAuth providers, webhooks, supported platforms, import/export formats. Group by category (auth, payments, data, comms, etc.). |23| `DIFFERENTIATORS.md` | Capabilities that are unusual, surprisingly deep, or worth leading with in a pitch. Conservative — only list things the code actually supports. |24| `TECHNICAL_PROFILE.md` | Stack, hosting/deployment model, data residency hints, auth model, security-relevant features (RBAC, audit logs, encryption), scalability signals. For technical buyers and security questionnaires. |25| `LIMITATIONS.md` | What the product does **not** do, based on what's missing in the code. Important for honest qualification. |26| `GLOSSARY.md` | Domain terms the product uses (from models, copy, routes). Helps a sales agent talk like the team. |27| `product-profile.json` | All of the above as structured data. Schema below. Direct input for AI sales agents. |2829If the codebase is small, files can be brief — a few bullets is fine. Don't pad. If a section genuinely has nothing in it, write `_No signal found in code._` rather than inventing.3031## Workflow3233Run these phases in order. Don't skip discovery to start writing — every claim in the output must trace back to something you read.3435### Phase 1 — Map the surface3637Build a mental model of what the code exposes. Read, don't guess.3839Signal sources, in priority order:40411. **Manifest files** — `package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `composer.json`, `Gemfile`, `pubspec.yaml`. Name, description, dependencies, scripts, entry points.422. **README and `/docs`** — existing positioning. Useful but treat as a hypothesis to verify against the code, not ground truth. READMEs often lag behind reality.433. **Routes / API surface** — `app/`, `pages/`, `routes/`, `api/`, `controllers/`, route registrations, OpenAPI specs, GraphQL schemas. Each route is a capability.444. **UI surfaces** — pages, screens, navigation menus, settings panels. The menu is often the cleanest map of features.455. **Data models** — schemas, migrations, ORM models, Prisma/SQL/Mongoose definitions. The nouns of the domain.466. **Auth and roles** — middleware, guards, role checks, RBAC tables, permission strings. These reveal personas.477. **Integrations** — env vars (`.env.example`, `config/`), SDK imports (`stripe`, `twilio`, `okta`, `@aws-sdk/*`), webhook handlers, OAuth flows.488. **Background jobs / workers** — queues, cron, scheduled tasks. Often hide major capabilities (notifications, billing runs, syncs).499. **CLI entry points** — `bin/`, `cli.ts`, `main.py`, scripts. Direct user actions.5010. **Tests and E2E flows** — `tests/`, `e2e/`, `cypress/`, `playwright/`. Test names describe intended behaviour in plain language.5111. **UI copy** — strings in components, marketing pages, email templates. The voice the product already has.5212. **Changelog / release notes** — what the team chose to ship and announce.5354Use the available tools to gather this efficiently. `Glob` and `Grep` are the safe defaults. Don't commit to a list of features until you've at least skimmed routes, models, and the navigation surface.5556### Phase 2 — Cluster signals into features5758Group what you found into user-facing features. Rules:5960- A feature is something a customer would **name**, not an internal module. "Send invoice reminders" is a feature; "QueueService" is not.61- One feature can span many files. One file can contribute to many features. Don't map 1:1.62- Drop dev-only tooling, internal admin scripts, and deprecated code paths. They don't belong in sales material.63- If two signals describe the same capability from different angles (e.g. a route, a model, and a UI page), merge them into one feature with multiple references.6465For each feature, capture:6667- Short name (3–5 words, customer-facing)68- One-line description in plain English69- Code reference(s) — file paths or routes, so the claim is verifiable70- Maturity signal (shipped, in progress, experimental) inferred from test coverage, feature flags, TODOs, route comments7172### Phase 3 — Translate technical to customer language7374This is the step where sales material usually goes wrong. The pattern:7576| Technical signal | Customer-facing framing |77|---|---|78| `POST /api/exports` route | "Export your data" capability |79| `BullMQ` job processing nightly aggregations | "Automated daily reporting" |80| `Stripe` SDK + webhook handlers | "Subscription billing and invoicing" |81| Multi-tenant schema (`organisation_id` on every table) | "Built for teams — isolated workspaces per organisation" |8283Consult `references/translation-patterns.md` for the full lookup by category (auth, billing, data, comms, storage, scale, security, multi-tenancy), including the list of infrastructure signals NOT worth surfacing.8485Three rules for translation:86871. **Claims must be proportional to evidence.** A feature flagged behind `EXPERIMENTAL_*` or only enabled in dev is not "shipped". Say "in development" or omit it.882. **No invented numbers.** Never write "10x faster", "99.9% uptime", "trusted by 500 companies", or any metric the code can't prove. Prefer qualitative claims grounded in what the code does.893. **No invented integrations.** Only list integrations whose SDK, env var, or API call you actually saw. A `// TODO: add Slack` comment is not an integration.9091If the README makes a claim the code doesn't back up, document the claim in `LIMITATIONS.md` as a gap to verify with the team rather than repeating it as fact.9293### Phase 4 — Write the files9495Write all markdown files first, then generate `product-profile.json` last so it reflects the finished narrative.9697Markdown style:9899- Plain English. No marketing theatre, no hype adjectives ("powerful", "seamless", "robust", "best-in-class").100- Australian English throughout. Defer spelling detail (licence/license, -ise/-our/-re, prose vs symbol boundary) to the `australian-english` skill.101- Short sentences. Bullets where they help, prose where bullets feel staccato.102- Include code references (file or route) for any non-obvious claim, formatted like `src/routes/billing.ts:42`. This lets a curious reader verify.103- Avoid emojis, em dashes, and filler transitions ("Furthermore,", "In conclusion,").104- Don't write headings the file doesn't need. If `LIMITATIONS.md` has three bullets, three bullets is the file.105106JSON style — see schema in `references/product-profile-schema.md`. Validate that every feature in `FEATURES.md` appears in `product-profile.json` and vice versa.107108### Phase 5 — Verify before finishing109110Before declaring done, walk back through and check:111112- [ ] Every claim in every file traces to a specific file, route, or config you actually read113- [ ] No invented integrations, metrics, customers, or features114- [ ] `LIMITATIONS.md` is honest — at least a couple of items unless the product really is feature-complete115- [ ] `product-profile.json` parses as valid JSON and matches the markdown116- [ ] No internal tooling, dev scripts, or deprecated code leaked into the sales-facing files117- [ ] File paths in references are correct and current118119If you find gaps you genuinely cannot resolve from the code alone, list them at the bottom of `OVERVIEW.md` under a `## Open Questions` heading rather than guessing. The sales team would rather see a question than a confident wrong claim.120121## When NOT to use122123- The user wants engineering documentation (architecture, API reference, contributor onboarding) — that's a different artefact.124- The user wants polished pitch copy ready to publish — run this skill first, then hand the output to `portfolio-copywriter` or `human-copy-style`.125- The codebase is a thin prototype with no real features yet — the output would be padding. Tell the user.126- The user wants competitive analysis or market positioning — this skill describes the product, not the market.127- The product is a library or developer tool whose audience is engineers — write developer-facing docs instead, the sales-agent framing doesn't fit.128129## Common Issues130131### `.product/` already exists with content132Treat it as prior work. Read it first. Update files in place rather than overwriting blindly. Note in your final summary what you changed and why.133134### Codebase is a monorepo with multiple products135Ask the user which product to analyse, or analyse one per top-level package and write `.product/<package-name>/...` for each.136137### README contradicts the code138Trust the code. Note the contradiction in `LIMITATIONS.md` or the `## Open Questions` section of `OVERVIEW.md` so the team can resolve it.139140### Heavy use of feature flags141Treat flagged-off features as "in development" unless the flag is on by default in production config. Don't list dark-launched experiments as shipped features.142143### No clear navigation or routes (CLI, library, SDK)144The "surface" is the public API or command set. Read the exported symbols, the CLI command tree, and the docs. Personas may be just "developer" — that's fine, say so.145146## Examples147148### Example 1: SaaS web app149150User says: "Build a product profile for this codebase so our sales team can pitch it."151152Actions:1531. Map routes (`/api/*`), pages (`app/*`), models (`prisma/schema.prisma`), env vars (`.env.example`), Stripe + Auth0 SDK usage.1542. Cluster into features: workspaces, billing, SSO, exports, audit logs, role-based access.1553. Translate: `Auth0` → "SSO via your identity provider", `Stripe` → "Subscription billing".1564. Write `.product/` with all nine files + JSON.157158Result: Sales team has a fact-checked feature list, a personas doc inferred from the role enum, and a JSON file the company's AI demo bot can load directly.159160### Example 2: AI sales agent build161162User says: "I'm building an AI agent that pitches this product to inbound leads. Generate the knowledge base it should read from."163164Actions: Same workflow, with extra attention to `product-profile.json` since the agent will read it programmatically. Make sure features and integrations are tagged with categories the agent can filter on.165166Result: The agent loads `.product/product-profile.json` at start-up and can answer "do you support X?" questions accurately.167168## References169170- `references/product-profile-schema.md` — JSON schema for `product-profile.json`171- `references/translation-patterns.md` — extended technical → customer-facing translation table