Generate time-windowed product pulse reports from configured signals.
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 docs/pulse-reports/ and the key points are surfaced in chat..compound-engineering/config.local.yaml (the unified CE local config, gitignored, machine-local) and the report file (docs/pulse-reports/...). MCP and other data-source tools are invoked read-only; if a tool offers write modes, do not use them.AskUserQuestion in Claude Code (call ToolSearch with select:AskUserQuestion first if its schema isn't loaded), request_user_input in Codex, ask_question in Antigravity CLI (agy), ask_user in Pi (requires the pi-ask-user extension). Fall back to numbered options in chat only when no blocking tool exists in the harness or the call errors (e.g., Codex edit modes) — not because a schema load is required. Never silently skip the question.24h, 48h, 72h - trailing hours7d, 30d - trailing days1h - short-window (useful during launches)pulse_lookback_default from config (resolved in Phase 0); if that is also unset, fall through to the hard default of 24h. If the argument is unparseable, ask the user to clarify.now under-reports the most recent events. For a 24h window, query [now - 24h - 15m, now - 15m].docs/pulse-reports/ so past pulses are browseable as a timeline.STRATEGY.md exists, the interview reads it before asking questions and carries forward the product name and key metrics as seeds. The goal of data-source setup is to wire up whatever connections are needed to actually measure those metrics.git rev-parse --show-toplevel 2>/dev/null || true<repo-root>. If it is empty or still shows a backtick command string (a non-Claude harness that did not run the pre-resolution), resolve <repo-root> at runtime by running git rev-parse --show-toplevel with the shell tool. Then read <repo-root>/.compound-engineering/config.local.yaml with the native file-read tool (e.g., Read in Claude Code, read_file in Codex). If the root cannot be resolved or the file does not exist, treat this as a first run. Otherwise extract values for the pulse_* keys listed under "Config keys" below.pulse_product_name -- string, used in report titles. Required for routing: if unset, skill is unconfigured.pulse_lookback_default -- one of 1h, 24h, 7d, 30d (default: 24h)pulse_primary_event -- string, the engagement event namepulse_value_event -- string, the value-realization event namepulse_completion_events -- comma-separated string of 0-3 event namespulse_quality_scoring -- true or default false (AI products only)pulse_quality_dimension -- string scored 1-5 when pulse_quality_scoring is true; ignored otherwisepulse_analytics_source -- string identifying analytics provider (e.g., posthog, mixpanel, custom)pulse_tracing_source -- string identifying tracing provider (e.g., sentry, datadog, custom)pulse_payments_source -- string identifying payments provider (e.g., stripe, custom); omit if not usedpulse_db_enabled -- true or default false; when true, read-only DB access is part of the pulsepulse_metric_sources -- comma-separated metric=source pairs giving per-strategy-metric source overrides (e.g., retention_d7=posthog,nps=delighted). Strategy metrics not listed fall back to pulse_analytics_source and are rendered with a (default source) marker so the implicit routing is visible.pulse_pending_metrics -- comma-separated string of strategy-doc metric names awaiting instrumentation; rendered as no data in each pulse report until instrumentation landspulse_excluded_metrics -- comma-separated string of strategy-doc metric names intentionally excluded from the pulse; the metric stays in STRATEGY.md but is not surfaced in pulse reportspulse_product_name is unset (or config file missing) -> First run. Go to Phase 1 (interview), then Phase 2.pulse_product_name is set -> Skip to Phase 2.setup, reconfigure, or edit config, go to Phase 1 regardless of config state.STRATEGY.md using the native file-read tool. If the file exists, extract:name key in the YAML frontmatter, falling back to the H1 title (stripping the trailing Strategy suffix, e.g., # Spiral Strategy -> Spiral) if frontmatter is missing## Key metrics section, one per lineSTRATEGY.md does not exist, note that explicitly in chat: no strategy doc on file, running setup from scratch, and mention that ce-strategy can seed pulse later if run first.references/interview.md. This load is non-optional - the pushback rules, anti-pattern examples, and metric-to-source mapping logic live there.references/interview.md for each section. Treat every metric, event, and signal the user proposes against the SMART bar (specific, measurable, actionable, relevant, timely) spelled out in references/interview.md under "Overall Rules" - push back on anything vague, vanity, or unactionable.references/interview.md section 6.<repo-root>/.compound-engineering/config.local.yaml as flat pulse_* keys, using the schema in references/interview.md under "Config file shape". Resolve the repo root with git rev-parse --show-toplevel. To write: (1) if the file or directory does not exist, create .compound-engineering/ and write the YAML file; (2) if the file exists, merge new keys into the existing YAML, preserving any non-pulse keys (e.g., work_delegate_*) untouched. If .compound-engineering/config.local.yaml is not already covered by the repo's .gitignore, offer to add the entry before writing. Show the resulting pulse block to the user in chat and offer one round of edits.references/interview.md section 9: offer to set up a recurring run so the user gets the pulse on a cadence instead of having to remember to run it. Accept yes/no/later. If yes, hand off to whichever scheduling primitive the current harness exposes — the in-plugin schedule skill if it is installed, otherwise note that scheduling is platform-specific (cron, GitHub Actions, the host's own automation) and emit a brief hint covering what would need to run. Do not schedule inline. Then proceed to Phase 2.setup/reconfigure argument), re-read .compound-engineering/config.local.yaml from the repo root using the native file-read tool to pick up any edits accepted during the Phase 1 review step. Otherwise, use the pulse_* values already extracted in Phase 0. Apply hard defaults for any unset settings (see Phase 0 "Config keys").pulse_quality_scoring is true (AI products only), sample up to 10 sessions or conversations from the window and score each 1-5 on the dimension recorded in pulse_quality_dimension.references/report-template.md. Fill in the template using the query results. Four sections, in order:docs/pulse-reports/YYYY-MM-DD_HH-MM.md using the local time of the run. Create docs/pulse-reports/ if it does not exist.daily, hourly, weekly), note that this run is ad-hoc and suggest scheduling via the harness's available primitive (the in-plugin schedule skill where present; otherwise a platform-native option) for recurring runs.