ce-product-pulse — Claude Code skill: product pulse reports
Builds a one-page report on how your product behaved over a chosen window: usage, performance, errors. Handy when you want a quick read without opening a dashboard.
npx skills add EveryInc/compound-engineering-plugin --skill ce-product-pulse -a claude-codeWhat ce-product-pulse does
The skill queries your product's data sources for the window you pass in and writes a compact report to <root>/pulse-reports/YYYY-MM-DD_HH-MM.md, with the headlines echoed in chat. Expect 30–40 lines covering usage, performance, errors and followups. The window comes from the argument — 24h, 7d, 1h — and falls back to the config value, then to 24h. A 15-minute buffer is applied to the upper bound, since analytics and tracing tools often lag on ingestion.
Everything here is read-only. The product, the database and outside systems stay untouched; the only writes are pulse settings in .compound-engineering/config.local.yaml and the report file itself. A database connection has to be read-only, and the interview rejects credentials that can write. A database is optional anyway — analytics and tracing alone are enough for plenty of products. Saved reports carry no emails, account IDs or message content.
There are no thresholds and no good/bad labels: numbers go in as they are and the reader judges. A first run walks through an interview and stores settings; later runs go straight to the report. Every run is kept, so older pulses read as a timeline. This is not a dashboard replacement or a shipping log — deep investigation still belongs to your native tools.
What it helps with
- get a daily read on product usage
- spot an error spike after a deploy
- review how metrics moved over a week
- produce a short report without opening a dashboard
- browse past reports as a timeline
Example prompts for the agent
- Run a pulse report for
7d - Generate a
ce-product-pulsereport for24h - Give me a product pulse for
1h
How to install ce-product-pulse
1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-product-pulse -a claude-code2Manually: put the files in place
~/.claude/skills/ce-product-pulse/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/ce-product-pulse/
1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-product-pulse -a codex2Manually: put the files in place
.agents/skills/ce-product-pulse/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-product-pulse -a cursor2Manually: put the files in place
.cursor/skills/ce-product-pulse/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install EveryInc/compound-engineering-plugin ce-product-pulse2Manually: put the files in place
.github/skills/ce-product-pulse/SKILL.md1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-product-pulse -a gemini-cli2Platform CLI
gemini skills install https://github.com/EveryInc/compound-engineering-plugin --path skills/ce-product-pulseManually: put the files in place
.devin/skills/ce-product-pulse/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-product-pulse -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about ce-product-pulse
How do I install ce-product-pulse in Claude Code?
Run npx skills add EveryInc/compound-engineering-plugin --skill ce-product-pulse -a claude-code. The skill lands at ~/.claude/skills/ce-product-pulse/SKILL.md.
What does ce-product-pulse do?
It pulls from your product's data sources for a given window and writes a 30–40 line report under <root>/pulse-reports/, showing the key points in chat.
Does the skill need a database?
No, database access is optional — analytics and tracing can carry the pulse on their own. If you do connect one, it must be read-only; the interview turns down write-capable credentials.
Source text
SKILL.md · MIT
--- name: ce-product-pulse description: "Generate time-windowed product pulse reports from configured signals." disable-model-invocation: true argument-hint: "[lookback window, e.g. '24h', '7d', '1h'; default 24h]" allowed-tools: - Read - Write - Glob - Grep - Bash - AskUserQuestion --- # Product Pulse `ce-product-pulse` queries the product's data sources for a given time window and produces a compact, single-page report covering usage, performance, errors, and followups. The report is saved to `<root>/pulse-reports/` and the key points are shown in chat. **Done:** a report of 30-40 lines exists at `<root>/pulse-reports/YYYY-MM-DD_HH-MM.md`, its headlines and top followup are in chat, and Phase 3 (Scheduling) has been reached. ## Boundaries - **Read-only, everywhere.** The skill does not mutate the product, the database, or any external system. Its only writes are pulse settings appended to `.compound-engineering/config.local.yaml` (interview and opt-out writes stay on the local override) and the report file. MCP and other data-source tools are invoked read-only; if a tool offers write modes, do not use them. A database source must be a read-only connection — the interview refuses read-write credentials, and DB access is optional, since many products complete the pulse with analytics and tracing alone. - **No PII in saved reports.** No user emails, account IDs, or message content in the file written to disk. - **Read it like a founder.** No hardcoded thresholds, no default "good"/"bad" labels, no alerting: present the numbers and let the reader judge. - **Single page.** Target 30-40 lines. If a section is thin, leave it thin; if the report is getting long, cut. - **Not a shipping log or a dashboard replacement.** Shipped work lives in the issue tracker and commit history. Deep investigation still uses the native tools; this consolidates a single-page read, and every run is saved so past pulses browse as a timeline. ## Interaction Method Default to the host's blocking question tool already in the current tool list (match by capability, not by a host-specific name). Presence in the current tool list is proof the tool exists; never call a user-facing question tool to discover whether it exists. If a matching tool is listed but unloaded, use the host's tool-discovery primitive to load that capability — do not search for another host's tool name. Fall back to numbered options on the host's user-visible chat surface only when no such tool is in the list or a real question call errors. Never silently skip the question. Ask one question at a time. Reserve multi-select for first-run configuration only. ## Lookback Window The **lookback window** is the time range this skill was invoked with (e.g. `24h`, `7d`) — present in the current prompt or conversation, whether the user gave it directly or a calling skill passed it. Common forms are trailing hours (`24h`, `48h`, `72h`), trailing days (`7d`, `30d`), and `1h` for launches. If the argument is empty, default to `pulse_lookback_default` from config (resolved in Phase 0, Route by config state); if that is also unset, fall through to the hard default of `24h`. If the argument is unparseable, ask the user to clarify. Apply a **15-minute trailing buffer** to the window's upper bound. Many analytics and tracing tools have ingestion lag; querying right up to `now` under-reports the most recent events. For a `24h` window, query `[now - 24h - 15m, now - 15m]`. ## Artifact Root This skill writes pulse reports under `<root>/pulse-reports/`. Resolve `<root>` when you first compose a `<root>/` path (per the block below), never before you need it. A write to `<root>/...` and a read of `<root>/solutions/` both count as composing a `<root>/` path, so either one triggers resolution; only a run that touches no `<root>/` path at all -- a scratch-only or no-repo flow -- skips it. <!-- ce-docs-root:start --> **Resolve the CE artifact root `<root>` before composing any artifact path.** - **Read** `docs_root` from `<repo-root>/.compound-engineering/config.yaml` only (`<repo-root>` = `git rev-parse --show-toplevel`). Do not read it from `config.local.yaml`. Unset -> `<root>` is `docs`, exactly as before. - **Validate** a set value: a repo-relative directory whose real, symlink-resolved path stays inside the repo and is neither the repo root nor under `.git/`. Otherwise stop with an error naming `docs_root` and the value -- never fall back to `docs`. - **Use** `<root>` as the sole artifact location: create it if absent, compose each path as `<root>/<subdir>` with this skill's own subdirectory, and never also read `docs`. <!-- ce-docs-root:end --> ## Phase 0: Route by config state <!-- ce-config-layers:start --> **Resolve ordinary CE yaml keys from the two repo files.** - **Read** `<repo-root>/.compound-engineering/config.local.yaml`, then `config.yaml` (`<repo-root>` = `git rev-parse --show-toplevel`). Missing files are skipped. Gitignore does not change resolution. - **Win** with the first active (non-commented) value. For scalars, empty is unset; an invalid value continues to the next layer, then the skill default. For lists and maps, a present key — including an empty list or map — replaces the whole key. - **Do not** use this rule for `docs_root` — that key is `config.yaml` only. <!-- ce-config-layers:end --> Resolve `<repo-root>` with `git rev-parse --show-toplevel`, then apply the ordinary-key rule above to the `pulse_*` keys. Read `references/config.md` whenever a `pulse_*` value has to be interpreted — it is the key schema and nothing else: each key, its allowed values, and its default, with an unset or invalid value taking the documented default rather than being guessed. **Routing:** every run passes through Phase 2 (Run the pulse) and then Phase 3 (Scheduling). Run Phase 1 (First-run interview) first when `pulse_product_name` is unset after cascade (the ordinary-key rule above), when the repo root cannot be resolved, or when the argument was `setup`, `reconfigure`, or `edit config`. Otherwise start at Phase 2 (Run the pulse). ## Phase 1: First-run interview Read `references/setup.md` first; this read is required. It defines the strategy-doc seeding, the interview order and its pushback bar, the read-write database refusal, how the config is written to `config.local.yaml` without disturbing other keys, and the one-time scheduling offer. The questions themselves come from `references/interview.md`, which that file names as its own required read. ## Phase 2: Run the pulse If Phase 1 (First-run interview) ran, re-apply the ordinary-key rule (local then tracked) from the repo root using the native file-read tool before any query, to pick up edits accepted during the Phase 1 review step. Otherwise use the `pulse_*` values already extracted in Phase 0 (Route by config state), applying the defaults in `references/config.md` for anything unset. Then read `references/run.md` before dispatching any query; this read is required. It defines which queries run in parallel and which run serially, the `pulse_db_enabled` check that decides whether database work runs, the optional quality sampling and its scoring discipline, the four report sections, and where the report is written. ## Phase 3: Scheduling Setup offers a recurring run once (`references/setup.md`). On later runs, mention it again lightly: if the argument was a schedule keyword (`daily`, `hourly`, `weekly`), say this run is ad-hoc and point at the harness's scheduling primitive; if no schedule is on file and this is the third or later run, mention once that scheduling is available. Do not nag on every run, and never schedule automatically — any handoff to a scheduling primitive requires explicit confirmation.
© EveryInc · MIT · EveryInc/compound-engineering-plugin