ce-product-pulse

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Product Pulse

产品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
docs/pulse-reports/
and the key points are surfaced in chat.
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
(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.
ce-product-pulse
会针对指定时间窗口查询产品的数据源,生成一份简洁的单页报告,涵盖使用情况、性能、错误以及后续跟进事项。报告将保存至
docs/pulse-reports/
目录,关键要点会在聊天界面展示。
该Skill不会修改产品、数据库或任何外部系统。它仅会将Pulse设置追加写入
.compound-engineering/config.local.yaml
(统一的CE本地配置文件,已加入git忽略,仅本地机器可见)以及报告文件(
docs/pulse-reports/...
)。调用MCP及其他数据源工具时仅使用只读模式;若工具提供写入模式,请勿使用。

Interaction Method

交互方式

Default to the platform's blocking question tool:
AskUserQuestion
in Claude Code (call
ToolSearch
with
select:AskUserQuestion
first if its schema isn't loaded),
request_user_input
in Codex,
ask_user
in Gemini,
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.
Ask one question at a time. Reserve multi-select for first-run configuration only.
默认使用平台的阻塞式提问工具:Claude Code中使用
AskUserQuestion
(若其架构未加载,需先调用
ToolSearch
并传入
select:AskUserQuestion
);Codex中使用
request_user_input
;Gemini中使用
ask_user
;Pi中使用
ask_user
(需安装
pi-ask-user
扩展)。仅当工具集中无阻塞式工具或调用出错时(如Codex编辑模式),才退而求其次在聊天中使用编号选项——不得因需要加载架构而使用备选方案。切勿跳过问题而不告知用户。
一次仅提出一个问题。仅在首次运行配置时使用多选功能。

Lookback Window

回溯窗口

<lookback> #$ARGUMENTS </lookback>
Interpret the argument as a time window. Common forms:
  • 24h
    ,
    48h
    ,
    72h
    - trailing hours
  • 7d
    ,
    30d
    - trailing days
  • 1h
    - short-window (useful during launches)
If the argument is empty, default to
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.
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]
.
<lookback> #$ARGUMENTS </lookback>
将参数解析为时间窗口。常见格式包括:
  • 24h
    48h
    72h
    - 最近N小时
  • 7d
    30d
    - 最近N天
  • 1h
    - 短窗口(适用于发布期间)
若参数为空,则默认使用配置中的
pulse_lookback_default
值(在第0阶段解析);若该值也未设置,则使用硬默认值
24h
。若参数无法解析,请询问用户进行澄清。
为窗口的上限设置15分钟的延迟缓冲。许多分析和追踪工具存在数据摄入延迟;直接查询到
now
会漏报最新事件。对于
24h
窗口,查询范围应为
[now - 24h - 15m, now - 15m]

Core Principles

核心原则

  1. Read it like a founder. No hardcoded thresholds. Do not label things "bad" or "good" by default - present the numbers and let the reader judge.
  2. Single page. Target 30-40 lines of terminal output. If the report is getting long, cut.
  3. No PII in saved reports. Do not include user emails, account IDs, or message content in the report written to disk.
  4. Parallel where safe, serial where it matters. Analytics and tracing queries run in parallel. Database queries run serially to avoid load.
  5. Memory through saved reports. Every run writes to
    docs/pulse-reports/
    so past pulses are browseable as a timeline.
  6. Read-only database access only. If a database is used as a data source, the connection must be read-only. The interview refuses to accept read-write credentials. Database access is optional - many products complete the pulse with analytics and tracing alone.
  7. Strategy-seeded when available. If
    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.
  1. 以创始人视角阅读报告。不设置硬编码阈值。默认情况下不要将事物标记为“好”或“坏”——仅展示数据,由读者自行判断。
  2. 单页呈现。终端输出目标为30-40行。若报告过长,需进行精简。
  3. 保存的报告中不含个人可识别信息(PII)。写入磁盘的报告中不得包含用户邮箱、账户ID或消息内容。
  4. 安全场景下并行,关键场景下串行。分析和追踪查询并行执行。数据库查询串行执行以避免负载过高。
  5. 通过保存的报告留存历史记录。每次运行都会写入
    docs/pulse-reports/
    目录,因此过往的Pulse报告可按时间线浏览。
  6. 仅使用只读数据库访问。若将数据库作为数据源,连接必须为只读模式。配置流程拒绝接受读写权限凭证。数据库访问为可选操作——许多产品仅通过分析和追踪即可完成Pulse报告。
  7. 有策略文档时优先使用其种子数据。若存在
    STRATEGY.md
    文件,配置流程会在提问前读取该文件,并沿用其中的产品名称和关键指标作为初始数据。数据源配置的目标是建立所需的连接,以实际衡量这些指标。

Execution Flow

执行流程

Phase 0: Route by Config State

第0阶段:根据配置状态路由

Config (pre-resolved): !
(top=$(git rev-parse --show-toplevel 2>/dev/null); [ -n "$top" ] && cat "$top/.compound-engineering/config.local.yaml" 2>/dev/null) || (common=$(git rev-parse --path-format=absolute --git-common-dir 2>/dev/null); main="${common%/.git}"; [ -n "$main" ] && cat "$main/.compound-engineering/config.local.yaml" 2>/dev/null) || echo '__NO_CONFIG__'
If the block above contains YAML key-value pairs, extract values for the
pulse_*
keys listed under "Config keys" below. If it shows
__NO_CONFIG__
, the file does not exist — treat this as a first run. If it shows an unresolved command string, read
.compound-engineering/config.local.yaml
from the repo root using the native file-read tool (e.g., Read in Claude Code, read_file in Codex). If the file does not exist, treat as first run.
Config keys:
  • 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 name
  • pulse_value_event
    -- string, the value-realization event name
  • pulse_completion_events
    -- comma-separated string of 0-3 event names
  • pulse_quality_scoring
    --
    true
    or default
    false
    (AI products only)
  • pulse_quality_dimension
    -- string scored 1-5 when
    pulse_quality_scoring
    is true; ignored otherwise
  • pulse_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 used
  • pulse_db_enabled
    --
    true
    or default
    false
    ; when
    true
    , read-only DB access is part of the pulse
  • pulse_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 lands
  • pulse_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 reports
Routing:
  • pulse_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.
If the argument was
setup
,
reconfigure
, or
edit config
, go to Phase 1 regardless of config state.
配置(预解析): !
(top=$(git rev-parse --show-toplevel 2>/dev/null); [ -n "$top" ] && cat "$top/.compound-engineering/config.local.yaml" 2>/dev/null) || (common=$(git rev-parse --path-format=absolute --git-common-dir 2>/dev/null); main="${common%/.git}"; [ -n "$main" ] && cat "$main/.compound-engineering/config.local.yaml" 2>/dev/null) || echo '__NO_CONFIG__'
若上述代码块包含YAML键值对,请提取以下“配置键”中列出的
pulse_*
键对应的值。 若显示
__NO_CONFIG__
,则表示文件不存在——将其视为首次运行。 若显示未解析的命令字符串,请使用原生文件读取工具(如Claude Code中的Read、Codex中的read_file)从仓库根目录读取
.compound-engineering/config.local.yaml
。若文件不存在,视为首次运行。
配置键:
  • pulse_product_name
    -- 字符串,用于报告标题。路由必填项:若未设置,则Skill未配置。
  • pulse_lookback_default
    -- 可选值为
    1h
    24h
    7d
    30d
    (默认值:
    24h
  • pulse_primary_event
    -- 字符串,用户参与事件名称
  • pulse_value_event
    -- 字符串,价值实现事件名称
  • pulse_completion_events
    -- 逗号分隔的字符串,包含0-3个事件名称
  • pulse_quality_scoring
    --
    true
    或默认值
    false
    (仅适用于AI产品)
  • pulse_quality_dimension
    -- 当
    pulse_quality_scoring
    为true时,用于1-5分评分的维度字符串;否则忽略
  • pulse_analytics_source
    -- 字符串,标识分析服务提供商(如
    posthog
    mixpanel
    custom
  • pulse_tracing_source
    -- 字符串,标识追踪服务提供商(如
    sentry
    datadog
    custom
  • pulse_payments_source
    -- 字符串,标识支付服务提供商(如
    stripe
    custom
    );若未使用则省略
  • pulse_db_enabled
    --
    true
    或默认值
    false
    ;当为true时,只读数据库访问是Pulse的一部分
  • pulse_metric_sources
    -- 逗号分隔的
    metric=source
    对,用于覆盖策略指标的数据源(如
    retention_d7=posthog,nps=delighted
    )。未列出的策略指标将 fallback 到
    pulse_analytics_source
    ,并显示
    (default source)
    标记以明确隐式路由。
  • pulse_pending_metrics
    -- 逗号分隔的字符串,包含策略文档中待埋点的指标名称;在埋点完成前,每份Pulse报告中这些指标将显示为
    no data
  • pulse_excluded_metrics
    -- 逗号分隔的字符串,包含策略文档中有意排除在Pulse之外的指标名称;这些指标仍保留在
    STRATEGY.md
    中,但不会在Pulse报告中展示
路由规则:
  • pulse_product_name
    未设置(或配置文件缺失)
    → 首次运行。进入第1阶段(配置流程),然后进入第2阶段。
  • pulse_product_name
    已设置
    → 跳过第1阶段,直接进入第2阶段。
若参数为
setup
reconfigure
edit config
,则无论配置状态如何,均进入第1阶段。

Phase 1: First-Run Interview

第1阶段:首次运行配置流程

1.0 Seed from strategy (if available)

1.0 从策略文档获取种子数据(若存在)

Before asking any questions, read
STRATEGY.md
using the native file-read tool. If the file exists, extract:
  • The product name from the
    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
  • The list of key metrics from the
    ## Key metrics
    section, one per line
Open the interview by surfacing what was extracted: announce that a strategy doc was found, show the seeded product name and the list of key metrics that will be carried into event/data setup, and invite the user to correct any of it before continuing.
If
STRATEGY.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.
在提问前,使用原生文件读取工具读取
STRATEGY.md
。若文件存在,提取:
  • 从YAML前置元数据的
    name
    键中获取产品名称;若无前置元数据,则从H1标题中提取(去除末尾的
     Strategy
    后缀,例如
    # Spiral Strategy
    Spiral
  • ## Key metrics
    部分提取关键指标列表,每行一个指标
配置流程开始时,先展示提取到的内容:告知用户已找到策略文档,展示将用于事件/数据配置的种子产品名称和关键指标列表,并邀请用户在继续前进行修正。
STRATEGY.md
不存在,则在聊天中明确说明:当前无策略文档,将从头开始配置,并提及若先运行
ce-strategy
,后续可为Pulse提供种子数据。

1.1 Interview

1.1 配置流程

Read
references/interview.md
. This load is non-optional - the pushback rules, anti-pattern examples, and metric-to-source mapping logic live there.
Run the interview in this order:
  1. Product name (confirm or edit the seeded value)
  2. Primary engagement event
  3. Value-realization event
  4. Completions or conversions (0-3)
  5. Quality scoring (opt-in, AI products only)
  6. Data sources - wire up connections for each agreed metric and event. Nudge toward MCP. Reject read-write database access. DB entirely optional.
  7. System performance - a short recommended setup for top errors and latency. Users rarely have strong opinions here; present defaults and accept.
  8. Default lookback window
Apply the pushback rules in
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.
If the user offers read-write database access, refuse and offer the alternatives documented in
references/interview.md
section 6.
Write the captured config to
<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.
After the config is written, run the scheduling recommendation from
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.
读取
references/interview.md
。此步骤为必填项——其中包含异议处理规则、反模式示例以及指标到数据源的映射逻辑。
按以下顺序执行配置流程:
  1. 产品名称(确认或修改种子数据中的值)
  2. 主要用户参与事件
  3. 价值实现事件
  4. 完成或转化事件(0-3个)
  5. 质量评分(可选,仅适用于AI产品)
  6. 数据源——为每个商定的指标和事件建立连接。优先推荐MCP。拒绝读写数据库访问。数据库访问完全可选。
  7. 系统性能——针对顶级错误和延迟的简短推荐配置。用户对此通常无强烈意见,展示默认配置并接受。
  8. 默认回溯窗口
每个环节均需遵循
references/interview.md
中的异议处理规则。将用户提出的每个指标、事件和信号与
references/interview.md
“总体规则”部分中阐述的SMART标准(具体、可衡量、可操作、相关、及时)进行比对——对模糊、虚荣或不可操作的内容提出异议。
若用户提供读写数据库访问权限,需拒绝并提供
references/interview.md
第6节中记录的替代方案。
将捕获的配置以扁平的
pulse_*
键写入
<repo-root>/.compound-engineering/config.local.yaml
,使用
references/interview.md
“配置文件格式”部分中的架构。通过
git rev-parse --show-toplevel
解析仓库根目录。写入规则:(1) 若文件或目录不存在,创建
.compound-engineering/
目录并写入YAML文件;(2) 若文件已存在,将新键合并到现有YAML中,保留所有非Pulse键(如
work_delegate_*
)不变。若
.compound-engineering/config.local.yaml
未被仓库的
.gitignore
覆盖,需在写入前询问用户是否添加该条目。在聊天中展示最终的Pulse配置块,并提供一轮编辑机会。
配置写入完成后,执行
references/interview.md
第9节中的调度推荐:提议设置定期运行,使用户无需手动触发即可按节奏获取Pulse报告。接受“是”、“否”或“稍后”的回复。若用户同意,移交至当前工具集提供的调度原语——若已安装插件内的
schedule
Skill则使用该工具,否则说明调度是平台特定的(如cron、GitHub Actions、宿主自身的自动化工具),并简要提示需要运行的内容。不得直接在线调度。之后进入第2阶段。

Phase 2: Run the Pulse

第2阶段:运行Pulse报告

If Phase 1 ran (first run, or
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").
若已执行第1阶段(首次运行,或参数为
setup
/
reconfigure
),需使用原生文件读取工具从仓库根目录重新读取
.compound-engineering/config.local.yaml
,以获取第1阶段审核步骤中接受的任何编辑内容。否则,使用第0阶段已提取的
pulse_*
值。对任何未设置的参数应用硬默认值(见第0阶段“配置键”)。

2.1 Dispatch Queries

2.1 分发查询

Run these in parallel (different tools, no shared load):
  • Product analytics query (primary event count, value-realization count, completions, conversion ratios) over the window
  • Application tracing query (error counts by category, latency distribution, top error signatures) over the window
  • Payments query, if configured (new customers, churn, revenue delta) over the window
Run these serially, after the parallel batch:
  • Read-only database queries. One at a time. Tight, scoped queries only. Never full-table scans on large tables. If a DB query would be expensive, skip it and note "DB query skipped (estimated cost too high)".
以下查询并行执行(使用不同工具,无共享负载):
  • 产品分析查询(窗口内的主要事件计数、价值实现事件计数、完成事件计数、转化率)
  • 应用追踪查询(窗口内按类别统计的错误数、延迟分布、顶级错误特征)
  • 支付查询(若已配置,窗口内的新客户数、 churn 率、收入变化)
并行批处理完成后,以下查询串行执行:
  • 只读数据库查询。一次执行一个。仅执行范围严格限定的查询。切勿对大表执行全表扫描。若数据库查询成本过高,跳过该查询并记录“DB query skipped (estimated cost too high)”。

2.2 Optional: Sample Quality Scoring

2.2 可选:样本质量评分

If
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
.
Scoring discipline: Default to 4 or 5 when the session looks normal. Reserve 1-3 for sessions with a clear failure mode (product gave wrong answer, user got stuck, error surfaced). If every session is scoring 3, the bar is too strict; if every session is scoring 5, the bar is too loose.
No PII in the score summary. Capture a count distribution (e.g., "8x 5, 1x 4, 1x 2") and a short anonymized note on any session scored below 4. Do not include message content or user identifiers in the saved report.
pulse_quality_scoring
true
(仅适用于AI产品),从窗口内抽取最多10个会话或对话,并根据
pulse_quality_dimension
记录的维度为每个会话打1-5分。
评分规则: 若会话正常,默认打4或5分。仅当会话存在明确故障模式(产品给出错误答案、用户陷入困境、出现错误)时打1-3分。若所有会话均打3分,说明评分标准过严;若所有会话均打5分,说明评分标准过松。
评分摘要中不含PII。记录分数分布(例如“8个5分,1个4分,1个2分”),并对任何评分低于4分的会话添加简短的匿名说明。保存的报告中不得包含消息内容或用户标识符。

2.3 Assemble the Report

2.3 组装报告

Read
references/report-template.md
. Fill in the template using the query results. Four sections, in order:
  1. Headlines - 2-3 lines summarizing the window
  2. Usage - primary engagement, value realization, completions, quality sample
  3. System performance - latency (p50/p95/p99) and top 5 errors by count with one-line explanation each
  4. Followups - 1-5 things worth investigating
Keep the total to 30-40 lines. If a section is thin, leave it thin; do not pad.
读取
references/report-template.md
。使用查询结果填充模板。报告分为四个部分,顺序如下:
  1. 头条摘要 - 2-3行总结时间窗口内的情况
  2. 使用情况 - 主要用户参与、价值实现、完成事件、质量样本
  3. 系统性能 - 延迟(p50/p95/p99)以及按计数排序的前5个错误,每个错误配一行说明
  4. 后续跟进 - 1-5个值得调查的事项
总篇幅控制在30-40行。若某部分内容较少,无需填充,保持简洁即可。

2.4 Write the Report

2.4 写入报告

Save to
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.
Surface the Headlines and top Followup in chat. Provide the full file path so the user can open the saved report.
使用运行时的本地时间将报告保存至
docs/pulse-reports/YYYY-MM-DD_HH-MM.md
。若
docs/pulse-reports/
目录不存在,需创建该目录。
在聊天界面展示头条摘要和顶级后续跟进事项。提供完整文件路径,方便用户打开保存的报告。

Phase 3: Routine Hook

第3阶段:常规提示

First-run setup already offered scheduling (see Phase 1.1 end). Phase 3 is a lighter re-surface for ad-hoc runs:
  • If the argument was a known schedule keyword (
    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.
  • If no schedule is on file and this is the third or later pulse run the user has done, mention once that scheduling is available. Don't nag on every run.
Never schedule automatically. Any scheduling handoff requires explicit confirmation.
首次运行配置已提供调度选项(见第1.1阶段末尾)。第3阶段是针对临时运行的轻量级提示:
  • 若参数为已知的调度关键字(
    daily
    hourly
    weekly
    ),需说明此次运行为临时运行,并建议通过工具集提供的原语设置定期运行(若已安装插件内的
    schedule
    Skill则使用该工具;否则使用平台原生选项)。
  • 若当前无调度记录,且此次是用户第三次或更多次运行Pulse,可提及一次调度选项。切勿每次运行都提醒。
切勿自动调度。任何调度移交均需用户明确确认。

What This Skill Does Not Do

该Skill不具备的功能

  • Does not report "what shipped." Shipped work lives in the issue tracker and commit history, not here. Pulse is strictly about user experience and system performance.
  • Does not set thresholds or alert the user. The reader interprets.
  • Does not persist PII in saved reports.
  • Does not mutate the database or any external system. All queries are read-only.
  • Does not replace tracing dashboards or analytics tools. It consolidates a single-page read; deep investigation still uses the native tools.
  • 不报告“已发布内容”。已发布工作记录在问题追踪器和提交历史中,不在此报告中。Pulse仅关注用户体验和系统性能。
  • 不设置阈值或向用户发送警报。由读者自行解读数据。
  • 不在保存的报告中留存PII。
  • 不修改数据库或任何外部系统。所有查询均为只读。
  • 不替代追踪仪表板或分析工具。它仅整合为单页报告供快速阅读;深入调查仍需使用原生工具。

Learn More

更多说明

The "read like a founder" posture and the single-page constraint are deliberate. Dashboards with 40 metrics produce attention sprawl; one page with the right four sections forces the reader to notice what matters. The saved-reports folder is designed to be a team's working memory, not a data warehouse - past pulses are grepable, diffable, and disposable.
“以创始人视角阅读”的定位和单页约束是刻意设计的。包含40个指标的仪表板会分散注意力;而包含四个关键部分的单页报告能迫使读者关注重要内容。保存报告的目录旨在作为团队的工作记忆,而非数据仓库——过往的Pulse报告可被 grep 检索、对比差异,且可随时丢弃。