team-performance-dashboard

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Team Performance Dashboard

团队绩效仪表盘

Generate the user's own Team Performance Dashboard: a four-tab live artifact built from their La Growth Machine (LGM) data, ranked by sender identity (rep). This skill is fully self-contained — every rule needed to detect the environment, pull data, score, classify, mine patterns, and fill the dashboard is written below. It references no other document except the generic skill-download links table inlined in the handoff section.
基于用户自有的La Growth Machine(LGM)数据生成团队绩效仪表盘:一款包含四个标签页的交互式实时报表,按发件人身份(销售代表)进行排名。该技能完全独立——检测环境、拉取数据、评分、分类、挖掘模式及填充仪表盘所需的所有规则均已在下文列出。除了交接部分内嵌的通用技能下载链接表外,不引用任何其他文档。

Job to be done

核心目标

Every week, show a head of sales who's generating the most replies and the most actual conversions and why, which hot leads are going cold, and how to spread what the best campaigns do across the reps who are behind — as coaching, not a scoreboard.
每周向销售主管展示谁产生的回复量和实际转化量最多及原因、哪些高潜力线索即将流失,以及如何将顶级销售代表的成功策略推广给落后成员——以辅导为导向,而非单纯的排名看板。

Three hard rules, always

三条硬性规则

  1. Only ever show the downloading user's data. Pull exclusively from their connected MCPs. Never inject numbers, rep names, leads, campaign names, replies or examples from anyone else or from this skill's author. The template ships empty; it is filled at runtime with their live values. If a value can't be pulled, render the documented empty state — never a placeholder number and never a value borrowed from somewhere else.
  2. Rank for visibility, coach without punishing. Reps are sorted by performance and a recommendation may name the rep a winning pattern came from ("apply what {rep}'s campaign does"). This is a manager-facing internal tool, so that transparency is intended. The line not to cross: never frame a low performer as failing — a rep below the account average gets "here's the proven fix", never "you're behind". No rep is hidden to spare feelings.
  3. The output is a LIVE, INTERACTIVE ARTIFACT — never a saved .html file and never a raw code block. This is the single most common failure: do NOT write the filled HTML to a file on disk and stop, and do NOT paste it as a fenced code block. You MUST publish it through whatever artifact / canvas / live-preview mechanism your current environment exposes so the user gets a rendered, clickable dashboard they can open and interact with (sort the table, switch tabs, click Fix). On claude.ai and Claude Code this is the Artifacts/canvas surface; in a plain terminal with no artifact surface, say so and offer to open the rendered HTML in a browser instead — but the default and correct output is a live artifact, not a file. Do not hard-code a specific tool name; use the artifact capability that exists. On a refresh, update the existing artifact rather than creating a new one.
    assets/dashboard-template.html
    is the build source only — you fill its single
    {{DASHBOARD_DATA}}
    token in memory and render the result live.

  1. 仅展示下载用户的数据。仅从用户已连接的MCP拉取数据,绝不植入其他用户或技能作者提供的数字、销售代表姓名、线索、活动名称、回复或示例。模板初始为空,运行时会填充用户的实时数据。若无法拉取某一数据值,则渲染文档中定义的空状态——绝不使用占位符数字或从其他地方借用数据。
  2. 排名以提升透明度,辅导而非惩罚。销售代表按绩效排序,建议中可提及优秀模式的来源代表(如“应用{销售代表}的活动策略”)。这是面向管理者的内部工具,因此这种透明度是有意为之。不可触碰的底线:绝不能将绩效不佳的代表描述为“失败”——低于账户平均水平的代表应收到“已验证的改进方案”,而非“你落后了”。绝不因顾及感受而隐藏任何代表的数据。
  3. 输出必须是交互式实时报表——绝不能是保存的.html文件或原始代码块。这是最常见的错误:不得将填充后的HTML写入磁盘文件后停止操作,也不得将其粘贴为代码块。必须通过当前环境提供的报表/画布/实时预览机制发布,确保用户能获得可渲染、可交互的仪表盘(可排序表格、切换标签页、点击“修复”按钮)。在claude.ai和Claude Code中使用Artifacts/画布功能;在无报表功能的纯终端环境中,需告知用户并提供在浏览器中打开渲染后HTML的选项——但默认且正确的输出是交互式实时报表,而非文件。不得硬编码特定工具名称;使用现有报表功能。刷新时,更新现有报表而非创建新报表。
    assets/dashboard-template.html
    仅作为构建源文件——需在内存中填充其唯一的
    {{DASHBOARD_DATA}}
    令牌并实时渲染结果。

Two modes

两种模式

  • Setup mode (first run, or LGM isn't connected / no config yet): interactive, conversational, ~10-15 minutes. Detect, guide connections, ask the setup questions, persist the config.
  • Generate mode (every run once
    ./.wtp/config.json
    exists and LGM is connected): run the engine, fill the template, emit the artifact + a short handoff. No step-by-step narration.

  • 设置模式(首次运行,或LGM未连接/无配置):交互式对话流程,约10-15分钟。检测环境、引导连接、询问设置问题、保存配置。
  • 生成模式
    ./.wtp/config.json
    已存在且LGM已连接后的所有运行):运行引擎、填充模板、输出报表及简短交接说明。无需分步讲解。

Phase 0 — Detect (silent, no questions)

阶段0——环境检测(静默执行,无需询问)

Check your own tool list — never ask what's installed.
  • LGM MCP present? True if tools like
    list_identities
    ,
    list_campaigns
    ,
    get_campaign_stats
    ,
    get_conversations_to_reply
    ,
    search_conversations
    ,
    get_conversation_messages
    are available.
  • CRM / deal MCP present? (HubSpot/Salesforce/Pipedrive) · Airtable MCP? · Stripe?
  • Companion skills available?
    campaign-challenger
    ,
    campaign-impact-analyzer
    . Record these booleans and move on. Do not announce the detection.
检查自身工具列表——绝不询问用户已安装哪些工具。
  • 是否存在LGM MCP?
    list_identities
    list_campaigns
    get_campaign_stats
    get_conversations_to_reply
    search_conversations
    get_conversation_messages
    等工具可用,则为是。
  • 是否存在CRM/交易MCP?(HubSpot/Salesforce/Pipedrive)· 是否存在Airtable MCP? · 是否存在Stripe?
  • 是否有配套技能可用?
    campaign-challenger
    campaign-impact-analyzer
    。 记录这些布尔值并继续,无需告知用户检测结果。

Phase 1 — LGM MCP gate

阶段1——LGM MCP校验

If present: say "LGM connected" in one line, continue. If absent: the dashboard is built entirely from LGM data, so guide the install (don't ask "is it installed?" — you already know it isn't):
  1. Connect the La Growth Machine MCP at https://lagrowthmachine.com/mcp/ (browser OAuth, no API key), or run
    sh install.sh
    from the gtm-system repo.
  2. No LGM account yet → register at https://app.lagrowthmachine.com/register?utm_source=claude_skill&utm_medium=mcp&utm_campaign=team-performance-dashboard and re-run.
  3. Re-detect and loop until the LGM tools appear, then continue.
若已存在: 用一行文字说明“LGM已连接”,继续流程。 若不存在: 仪表盘完全基于LGM数据构建,因此需引导用户安装(无需询问“是否已安装?”——你已确认未安装):
  1. 通过https://lagrowthmachine.com/mcp/连接La Growth Machine MCP(浏览器OAuth认证,无需API密钥),或从gtm-system仓库运行
    sh install.sh
  2. 若无LGM账户→注册地址为https://app.lagrowthmachine.com/register?utm_source=claude_skill&utm_medium=mcp&utm_campaign=team-performance-dashboard,注册后重新运行。
  3. 重新检测,循环直到LGM工具出现,再继续流程。

Phase 2 — Setup questions (~6, one at a time)

阶段2——设置问题(约6个,逐个询问)

Detect before asking; propose a default each time; validate each connection with a test call. Open with: "This takes about 10-15 minutes to get everything wired properly."
Q1 — Success event (keystone).
"What's the outcome you want to measure — a meeting booked, a signup, a deal, an account created, or something else?" Capture
outcomeLabel
+
outcomeType
. Propose a default if detectable (a CRM with deals → "deal"). This drives the header KPI, the conversion-rate numerator, the table, and the Fix prompts.
Q2 — Outcome source (how you track it) — describe the process and have the user validate it.
"How do you know who {outcome}s after your outreach — a CRM, a spreadsheet/Airtable, a CSV, or nothing formal yet?"
  • CRM detected → "I'd match your outreach leads to {CRM} records created after the campaign push. Does that match how you track it, or do you do it differently?" → confirm/adjust.
  • Airtable → ask for base/table/view + the fields for campaign-push date, {outcome} date, and a qualification flag; state the rule ("converted = pushed before {outcome} + qualified") and have them confirm; validate with a test read.
  • CSV / Sheet → ask for the file + columns (lead, campaign/audience, push date, outcome date, qualification); echo the mapping back for confirmation.
  • Nothing formal → reply-only dashboard (no outcome KPI, no conversion, no Reply→outcome in Fix cards); say it can be added later. Always describe the detected process and get validation before computing on it. Capture
    conversionSource
    .
Q3 — Value (€) layer — confirm how the amount maps.
"Want to see the value each rep/campaign generates? If yes, where does the amount come from — CRM deal amounts, Stripe, or elsewhere — and how should I attribute it back to a campaign/identity?" Branches: CRM deal amount (via
campaign-impact-analyzer
if present) · Stripe · none → the value KPI shows its empty state (never blocks). Confirm the attribution rule. Capture
valueSource
. When the value layer is on, it becomes the lead KPI — € is the truth above reply rate and volume.
Q4 — Active routine scope.
"Which campaigns are you actively working right now — all your RUNNING campaigns, or a specific list you follow?" Default: all RUNNING. Capture
activeRoutineCampaigns[]
. (Reply rate is scoped here; outcome, conversion and value stay account-wide so an old winner still shows.)
Q5 — Identities to include.
"I'll track these senders: {identities with >=1 message sent AND received}. Any to exclude (e.g. a test account)?" Default: all with real activity. Capture
identities[]
+
excludedIdentities[]
.
Q6 — Weekly refresh (opt-in).
"Want a routine that refreshes this dashboard every Monday (re-pull LGM, re-classify new replies, update the artifact)? The refresh button will also trigger it on demand." Yes → create the scheduled task, capture its id for
refreshTaskId
. No → empty id; the button falls back to a friendly message.
(Conditional) multi-workspace. If
list_workspaces
reports multiple workspaces, ask which one first.
Not questions:
  • Benchmarks are not asked — use the baked defaults: LinkedIn reply >=25%, email reply >=6% (watch/floor zones in the engine).
  • Reply classification (base pass) is not asked — the dashboard builds fast from campaign stats, so classify only a small seed sample (~6-20 recent replies) in the background (a cheap model is enough) to give the Reply Quality tab a baseline. Do NOT block the build on a big classification pass; the deeper analysis is the opt-in Phase 5 offer below.
询问前先检测;每次提供默认选项;通过测试调用验证每个连接。开场说明:“完成所有配置大约需要10-15分钟。”
问题1——成功事件(核心指标)
“你希望衡量的成果是什么——预约会议、注册、交易、账户创建,还是其他?” 捕获
outcomeLabel
+
outcomeType
。若可检测到则提供默认选项(如存在CRM且包含交易数据→默认“交易”)。该设置将主导头部KPI、转化率分子、表格内容及“修复”提示。
问题2——成果来源(跟踪方式)——描述流程并请用户确认
“你如何知晓外呼后谁达成了{成果}——通过CRM、电子表格/Airtable、CSV文件,还是尚无正式跟踪方式?”
  • 检测到CRM → “我会将你的外呼线索与活动推送后创建的{CRM}记录进行匹配。这是否符合你的跟踪方式,还是有其他方式?” → 确认/调整。
  • 检测到Airtable → 询问库/表格/视图名称,以及活动推送日期、{成果}日期和资格标记字段;说明规则(“转化=推送早于{成果}日期且符合资格”)并请用户确认;通过测试读取验证。
  • CSV/电子表格 → 询问文件路径及列信息(线索、活动/受众、推送日期、成果日期、资格);回显映射关系请用户确认。
  • 尚无正式跟踪方式 → 仅生成回复分析仪表盘(无成果KPI、转化率、修复卡片中的“回复→成果”模块);说明后续可添加该功能。 始终先描述检测到的流程并获得用户确认后再进行计算。捕获
    conversionSource
问题3——价值(€)维度——确认金额映射方式
“是否需要查看每位销售代表/活动产生的价值?若需要,金额数据来自何处——CRM交易金额、Stripe,还是其他渠道?以及如何将金额归因到活动/身份?” 分支选项:CRM交易金额(若存在
campaign-impact-analyzer
则使用该技能)· Stripe · 无→价值KPI显示空状态(绝不阻塞流程)。确认归因规则。捕获
valueSource
。启用价值维度后,它将成为核心KPI——金额优先级高于回复率和成交量。
问题4——当前活跃活动范围
“你当前正在推进哪些活动——所有运行中的活动,还是特定列表?” 默认选项:所有运行中的活动。捕获
activeRoutineCampaigns[]
。(回复率将限定在此范围内;成果、转化率和价值则覆盖全账户,以便仍能展示历史优秀活动的数据。)
问题5——需包含的身份
“我将跟踪以下发件人:{发送且收到至少1条消息的身份}。是否有需要排除的身份(如测试账户)?” 默认选项:所有有真实活动记录的身份。捕获
identities[]
+
excludedIdentities[]
问题6——周度自动刷新(可选)
“是否需要每周一自动刷新该仪表盘(重新拉取LGM数据、重新分类新回复、更新报表)?也可通过刷新按钮手动触发。” 是→创建定时任务,记录任务ID到
refreshTaskId
。否→任务ID为空;刷新按钮将显示友好提示。
(条件触发)多工作区
list_workspaces
返回多个工作区,需先询问用户使用哪一个。
无需询问的内容:
  • 基准值无需询问——使用内置默认值:LinkedIn回复率≥25%,邮件回复率≥6%(引擎中的观察/下限阈值)。
  • **回复分类(基础校验)无需询问——仪表盘基于活动数据快速构建,因此仅在后台对少量种子样本(约6-20条近期回复)**进行分类(使用轻量模型即可),为“回复质量”标签页提供基线。不得因大规模分类阻塞构建流程;深度分析为阶段5的可选功能。

Phase 3 — Build

阶段3——构建仪表盘

Run the engine → fill the template's single
{{DASHBOARD_DATA}}
token in memory → render as a live, interactive artifact (see hard rule 3 — this is the required output; do not save an .html file or paste a code block). Create the artifact on first run, update the existing artifact on later runs. Write this week's snapshot to
./.wtp/
. State the campaign-sampling coverage in the header — never imply full coverage when sampling.
What the base build computes vs defers (honest empty states):
  • Reply rates, acceptance, contacted, awaiting/backlog → always (cheap, from campaign stats).
  • Outcome, conversion, valuecomputed here whenever a source was configured at setup (E6). Empty state ONLY if no source. Do not skip them for cost — they're the headline.
  • Median responsedeferred to the Phase 5 fetch (needs per-thread timestamps). Show its empty state in the base build; it fills when the user runs the conversation analysis.
  • Reply Quality (classification/objection/best-reply) → seeded from a tiny sample now, deepened in Phase 5.
运行引擎→在内存中填充模板的唯一
{{DASHBOARD_DATA}}
令牌→渲染为交互式实时报表(参见硬性规则3——这是必填输出;不得保存为.html文件或粘贴为代码块)。首次运行创建报表,后续运行更新现有报表。将本周快照写入
./.wtp/
。在头部说明活动抽样覆盖范围——绝不能在抽样时暗示覆盖全部数据。
基础构建计算内容与延迟内容(如实显示空状态):
  • 回复率、接受率、联系人数、待跟进/积压线索 → 始终计算(成本低,来自活动统计数据)。
  • 成果、转化率、价值只要设置阶段配置了数据源,就在此计算(阶段2问题2)。仅当无数据源时显示空状态。不得因成本原因跳过——这些是核心指标。
  • 中位响应时间延迟到阶段5拉取数据后计算(需要每个对话线程的时间戳)。在基础构建中显示空状态;用户运行对话分析后自动填充。
  • 回复质量(分类/异议/最佳回复) → 现在基于小样本初始化,阶段5进行深度分析。

Phase 4 — Handoff

阶段4——交接说明

Short, no step narration. See
## Output & LGM handoff
below. End by making the Phase 5 offer.
简短说明,无需分步讲解。参见下文
## 输出与LGM交接
。最后提供阶段5的可选功能。

Phase 5 — Deepen the reply analysis (opt-in, tiered, incremental)

阶段5——深化回复分析(可选,分层增量式)

The base dashboard is up, but the Reply Quality tab (principal objection, competitor read, best-handled reply, radar) is only as rich as the replies you've classified — the base pass reads just a handful. After the dashboard renders, offer to analyze more conversations, framed so the user can do it in bites and see the cost up front. Say something like:
"Your dashboard is live. It classified a small sample of replies so far, and Median response time isn't filled yet — computing it needs me to read your conversation threads. Want me to fetch and analyze more conversations? The same pass sharpens the Reply Quality tab AND fills the response-time metric. Roughly, 50 conversations ≈ 15 min (token cost scales with volume), so pick a batch:
  • This week's replies only (usually the fastest, most relevant)
  • ~50 most recent (~15 min)
  • ~100 most recent (~30 min)
  • Everything awaiting a reply (large — I'll batch it and you can stop anytime) Or skip it for now and come back later."
  • The fetch does double duty. For each thread it pulls, it (a) classifies the reply (E5) and (b) reads the message timestamps to compute the median response after first reply per identity (E5 median-response rule, slowest-20% trimmed, status cross-check). So this one step fills both the Reply Quality tab and the Median-response KPI/column.
  • Pull scope by option: "this week" →
    search_conversations {leadReplied:true, since:<monday>}
    ; "recent N" → the newest N RECEIVED threads; "everything awaiting" → paginate the awaiting queue in batches. For each thread not already in
    classifiedReplyIds
    , read
    get_conversation_messages
    , classify + capture timestamps, and stop cleanly when the chosen batch is done — the user can re-run for more.
  • Not an LGM user? Work from their export. If they don't run LGM (or want to analyze a different channel), let them paste or upload a conversation export (CSV or text: lead, message, direction, date). Classify from that, same taxonomy, same tiers by row count.
  • Incremental & accumulating: every batch merges into the snapshot's accumulating state (
    objectionPlaybook
    ,
    patternLibrary
    , radar counts,
    classifiedReplyIds
    skip-list) and updates the existing live artifact — so the Reply Quality tab sharpens each time, and nothing is re-read. Use a cheap model for the classification loop; reserve stronger reasoning for the best-reply scoring only.
  • Honesty: if a batch surfaces no scorable objection, keep the empty state — never fabricate.

基础仪表盘已上线,但**“回复质量”标签页**(主要异议、竞品提及、最佳回复处理、分布雷达)的丰富程度取决于已分类的回复数量——基础校验仅分类少量回复。仪表盘渲染完成后,主动提议分析更多对话,以用户可分批操作并提前知晓成本的方式呈现。示例话术:
“你的仪表盘已上线。目前仅分类了少量回复,且中位响应时间尚未填充——计算该指标需要读取你的对话线程。是否需要我拉取并分析更多对话?同一操作既可以优化“回复质量”标签页,又能填充响应时间指标。大致耗时:50条对话≈15分钟(令牌成本随数量增加而上升),请选择批次:
  • 仅本周回复(通常最快、最相关)
  • 约50条最新回复(约15分钟)
  • 约100条最新回复(约30分钟)
  • 所有待跟进回复(数量较多——我将分批处理,你可随时停止) 或暂时跳过,后续再处理。”
  • 拉取操作一举两得。对于每个拉取的线程,将(a)分类回复(阶段5规则),并(b)读取消息时间戳以计算每个身份的首次回复后的中位响应时间(阶段5中位响应规则,剔除最慢的20%,交叉验证状态)。因此这一步可同时填充“回复质量”标签页和中位响应KPI/列。
  • 按选项限定拉取范围:“本周”→
    search_conversations {leadReplied:true, since:<周一>}
    ;“最新N条”→最新N条已收到的线程;“所有待跟进”→分批分页拉取待跟进队列。对于未在
    classifiedReplyIds
    中的每个线程,调用
    get_conversation_messages
    、分类并捕获时间戳,完成所选批次后立即停止——用户可重新运行以分析更多内容。
  • 非LGM用户?基于导出数据分析。若用户未使用LGM(或希望分析其他渠道数据),可让用户粘贴或上传对话导出文件(CSV或文本格式:线索、消息、方向、日期)。使用相同分类体系,按行数分层处理。
  • 增量式累积:每批数据合并到快照的累积状态(
    objectionPlaybook
    patternLibrary
    、雷达计数、
    classifiedReplyIds
    跳过列表),并更新现有实时报表——因此“回复质量”标签页会逐步优化,且不会重复读取数据。分类循环使用轻量模型;仅在评分最佳回复时使用更强推理能力的模型。
  • 如实呈现:若批次未检测到可评分的异议,保持空状态——绝不编造数据。

THE ENGINE (inline — reproduce exactly)

引擎规则(内嵌——严格复现)

All scoring is deterministic. Percentages are whole numbers. Plain hyphens, no en-dashes in copy.
所有评分均为确定性计算。百分比取整数。文案中使用普通连字符,不使用短破折号。

E1. Pull (team-wide — every included identity)

E1. 拉取数据(团队范围——所有包含的身份)

  1. list_identities
    → resolve the included identity ids + display names (also used to build inbox links).
    list_campaigns {status:"RUNNING"}
    (paginate) → keep
    identity{id, firstname, lastname}
    on each campaign (the campaign to identity join).
  2. get_campaign_stats
    per campaign → per-channel counters. Cost control: if there are more RUNNING campaigns than fits one run, pull full detail for a sample (>=1-2 per identity, weighted to each identity's highest and lowest
    replyRatePercent
    ) and use
    list_campaigns
    '
    replyRatePercent
    +
    leadsCount
    for the rest. State the coverage in the artifact (e.g. "43 RUNNING campaigns, 17 in full detail") — never imply full coverage when sampling.
  3. Replies:
    get_conversations_to_reply {identityIds:[...]}
    for the awaiting queue (read
    total
    for the count; pull a few rows for hot-lead names). For classification and objection mining, sample
    search_conversations {leadReplied:true}
    get_conversation_messages
    (live, capped).
Header benchmark:
li_reply = Σ(li.replied)/Σ(li.sent)
and
em_reply = Σ(em.replied)/Σ(em.sent)
across campaigns with channel data, each vs the baked targets (
linkedin_reply
good 25 / floor 15;
email_reply
good 6 / floor 3).
blended_reply
= both channels pooled, shown as context with no separate target (don't invent a blended benchmark).
  1. list_identities
    → 解析包含的身份ID及显示名称(也用于构建收件箱链接)。
    list_campaigns {status:"RUNNING"}
    (分页)→ 保留每个活动的
    identity{id, firstname, lastname}
    (活动与身份的关联)。
  2. 每个活动调用
    get_campaign_stats
    → 获取各渠道统计数据。成本控制:若运行中的活动数量超过单次拉取上限,则抽取样本(每个身份至少1-2个,优先选择该身份回复率最高和最低的活动)获取详细数据,其余活动使用
    list_campaigns
    返回的
    replyRatePercent
    +
    leadsCount
    在报表中说明覆盖范围(如“43个运行中活动,17个获取详细数据”)——绝不能在抽样时暗示覆盖全部数据。
  3. 回复数据:调用
    get_conversations_to_reply {identityIds:[...]}
    获取待跟进队列(读取
    total
    获取数量;拉取少量行以显示高潜力线索名称)。为进行分类和异议挖掘,调用
    search_conversations {leadReplied:true}
    抽取样本→调用
    get_conversation_messages
    (实时数据,有数量上限)。
头部基准值
li_reply = Σ(li.replied)/Σ(li.sent)
em_reply = Σ(em.replied)/Σ(em.sent)
(计算所有有渠道数据的活动),分别与内置目标值对比(
linkedin_reply
优秀25/下限15;
email_reply
优秀6/下限3)。
blended_reply
= 两个渠道合并数据,仅作为上下文展示,无单独目标值(不得编造混合基准值)。

E2. Normalize each campaign (baked benchmarks)

E2. 活动标准化(内置基准值)

Per campaign:
contacted
,
li:{accept, reply, csent, msent}|null
,
em:{sent, open, reply, bounce, atag}|null
. Zones per KPI (good, floor, direction):
linkedin_acceptance (30,20,up)
,
linkedin_reply (25,15,up)
,
email_open (60,45,up)
,
email_reply (6,3,up)
,
email_bounce (15,25, down)
.
MIN_SEND = 10
to score a KPI; a campaign with
contacted < 20
is low-sample (listed, not scored).
zone(k,v)
: up → green if v>=good, yellow if v>=floor, else red; down → inverse.
每个活动:
contacted
li:{accept, reply, csent, msent}|null
em:{sent, open, reply, bounce, atag}|null
。每个KPI的阈值区间(优秀、下限、趋势):
linkedin_acceptance (30,20,up)
linkedin_reply (25,15,up)
email_open (60,45,up)
email_reply (6,3,up)
email_bounce (15,25,down)
MIN_SEND = 10
(达到该数量才进行KPI评分);
contacted < 20
的活动为小样本(仅列出,不评分)。
zone(k,v)
:趋势up→v≥优秀显示绿色,v≥下限显示黄色,否则红色;趋势down→相反。

E3. Per-identity rollup and ranking

E3. 身份维度汇总与排名

Per included identity (needs >=1 sent AND >=1 received to appear; others named in a footnote):
  • Reply rate = Σ(replied)/Σ(contacted), volume-weighted, across the identity's active-routine campaigns (the headline). LinkedIn acceptance, email reply rolled up the same way.
  • Awaiting = the
    total
    from the per-identity awaiting queue.
  • Account average = Σ(all replied)/Σ(all contacted) account-wide; a rep is above/below by ±3pt.
  • Outcome (SU/meetings/deals), conversion (outcome ÷ contacted on the campaigns that drove it — mark
    *
    when retired-campaign volume is estimated), value (€) — all account-wide. These are computed in the base build whenever a source is configured (see E6) — never skipped for cost.
  • Median response is NOT computed in the base build (it needs a per-thread timestamp pull). It fills from the Phase 5 conversation fetch (see E5 / Phase 5); until then, show its empty state. The backlog (per-rep awaiting counts) IS available here from the cheap awaiting-queue totals.
  • Rank all reps by reply rate desc (badge #1..#n). Cross-identity recos name the source rep when the best pattern for a lagging rep comes from elsewhere. Prefer the rep's own internal spread first.
每个包含的身份(需满足发送≥1条且接收≥1条消息才会显示;其他身份在脚注中列出):
  • 回复率 = Σ(replied)/Σ(contacted),按成交量加权,计算该身份当前活跃活动的数据(核心指标)。LinkedIn接受率邮件回复率采用相同方式汇总。
  • 待跟进 = 该身份待跟进队列的
    total
    值。
  • 账户平均值 = Σ(all replied)/Σ(all contacted)(全账户范围);代表与平均值的差异为±3个百分点。
  • 成果(注册/会议/交易)转化率(成果÷驱动该成果的活动联系人数——若使用已结束活动的估算数据则标记
    *
    )、价值(€)——均为全账户范围。只要设置阶段配置了数据源(参见E6),就在基础构建中计算这些指标——绝不因成本原因跳过
  • 中位响应时间不在基础构建中计算(需要拉取每个线程的时间戳)。阶段5对话拉取后填充(参见E5/阶段5);在此之前显示空状态。积压线索数(每个代表的待跟进数量)在基础构建中可通过低成本的待跟进队列总数获取。
  • 所有代表按回复率降序排名(标记#1..#n)。跨身份建议中,当落后代表的最佳改进模式来自其他代表时,需提及来源代表。优先使用代表自身的内部数据差异。

E4. Pattern mining (campaign-side + reply-side)

E4. 模式挖掘(活动端+回复端)

Rank scored campaigns account-wide by their driving reply KPI; take the top slice and the strongest same-identity internal contrasts (a rep with a wide spread across their own campaigns is the most defensible source). Read
templates[].newHtml
of top/contrast campaigns; describe the opener structure (what it references, length/tone, CTA). Skip fully-variable/blank templates (no literal copy to generalize). Name each pattern, tag it campaign-side or reply-side, state its lift as a same-sender contrast when possible, set confidence (high = reproduced 2+ times and/or proven cold; medium = warm-only; inferential = single result whose audience confounds it — say so). Match each red/yellow campaign to the library → the "apply this pattern" reco + the Fix prompt. Persist patterns in the snapshot; reinforce/decay across weeks.
按核心回复KPI对全账户已评分活动进行排名;选取排名靠前的活动及同一身份内部差异最显著的活动(同一代表的不同活动表现差异较大时,是最可靠的模式来源)。读取排名靠前/差异显著活动的
templates[].newHtml
;描述开场白结构(引用内容、长度/语气、CTA)。跳过完全可变/空白模板(无可归纳的固定文案)。为每个模式命名,标记为活动端回复端,尽可能说明同一发件人使用该模式的提升效果,设置置信度(高=重复出现2次以上且已验证为冷启动有效;中=仅针对暖线索有效;推断=单一结果且受众存在干扰——需如实说明)。将每个红/黄阈值的活动与模式库匹配→生成“应用该模式”建议及修复提示。将模式保存到快照中;每周更新时强化/弱化模式权重。

E5. Reply quality + median response (mostly from the Phase 5 fetch)

E5. 回复质量+中位响应时间(主要来自阶段5拉取)

The base build seeds this from a tiny sample; the rich version comes from the Phase 5 conversation fetch. The same fetched threads do double duty: classification AND response-time.
  • Classify each sampled thread into one of five types:
    HOT
    (explicit call/meeting/pricing ask),
    CURIOUS
    (engaged, no objection),
    OBJECTION
    ,
    FIRM_NO
    ,
    WRONG_FIT
    . Filter for
    OBJECTION
    before sampling
    the objection view — random RECEIVED threads mostly surface CURIOUS/HOT.
  • Objection sub-types are the nine canonical ids owned by the
    objection-analyzer
    skill:
    competitor_in_place
    /
    feature_gap
    /
    tried_before
    /
    price_budget
    /
    timing
    /
    value_doubt
    /
    process_authority
    /
    scope_mismatch
    /
    channel_trust
    . Use those exact ids so the two skills report the same objection sub-type distribution on the same data. If that skill is installed, its
    references/objection-taxonomy.json
    is the source of truth, aliases included.
  • Migrating an older snapshot. Accumulated state from before this taxonomy holds
    equipped
    ,
    wrong_person
    and
    segment_fit
    . Map them on load —
    equipped
    to
    competitor_in_place
    , the other two to
    WRONG_FIT
    — or the radar and the priority table will show the old and the new label as two separate rows for the same thing.
  • An objection is a blocker raised by someone still engaging. Someone who disqualifies themselves is
    WRONG_FIT
    , not an objection — that covers the wrong contact, the wrong segment, the too-junior and the job-seeker. Count
    WRONG_FIT
    separately and never inside the objection share: it is a targeting signal, not a coaching one.
    EQUIPPED
    is not a separate category, it is the
    competitor_in_place
    objection.
  • Principal objection = the most frequent objection sub-type in the sample + a one-line coaching guideline + what to bring to the team. Radar = the distribution across the five categories. Priority table = objection (build a talk track/battle card), most-cited competitor (from the
    competitor_in_place
    objections, if enough of them), wrong-fit share (targeting signal), AI-tone callouts.
  • Best-handled reply = score sampled OBJECTION replies on a 9-dimension rubric (tone match / addresses the message / length mirrors / one question max / no forbidden phrases / not pushy / correct resource priority / not creepy / process-compliant, 0-3 each, >=22/27) and promote the top one as the "clone this" example. Never fabricate an example — if none qualify, say so. These are the same nine dimensions the
    objection-analyzer
    skill scores, in the same order and against the same threshold, so a reply graded in one carries over to the other. Its
    references/coaching-rubric.md
    holds the 0-3 anchors if you want them.
  • AI-tone callout belongs to the campaign copy (Playbooks tab), not reply handling.
  • Median response (computed from the Phase 5 fetched threads, NOT the base build) = per identity, median time between a lead's message and the rep's next reply after the first reply, from the message timestamps of the threads the user chose to analyze, with the slowest 20% trimmed (that tail is mostly forgotten leads). Cross-check the trimmed tail against each lead's LGM status (
    get_lead_logs
    ): unqualified + cold → a likely oversight (surface as backlog); qualified not-interested/dead → legitimately closed. It fills the median KPI/column as batches come in.
基础构建基于小样本初始化;丰富版本来自阶段5对话拉取。同一拉取的线程可同时用于分类和响应时间计算
  • 分类每个抽样线程为以下五种类型之一:
    HOT
    (明确要求通话/会议/报价)、
    CURIOUS
    (有兴趣,无异议)、
    OBJECTION
    (有异议)、
    FIRM_NO
    (明确拒绝)、
    WRONG_FIT
    (不符合定位)。在抽样异议视图前先筛选
    OBJECTION
    类型
    ——随机抽取已收到的线程大多为CURIOUS/HOT类型。
  • 异议子类型采用
    objection-analyzer
    技能定义的9种标准ID:
    competitor_in_place
    /
    feature_gap
    /
    tried_before
    /
    price_budget
    /
    timing
    /
    value_doubt
    /
    process_authority
    /
    scope_mismatch
    /
    channel_trust
    。必须使用这些精确ID,确保两个技能对同一数据的异议子类型分布报告一致。若已安装该技能,则以其
    references/objection-taxonomy.json
    为权威来源,包括别名。
  • 迁移旧快照。该分类体系之前的累积状态包含
    equipped
    wrong_person
    segment_fit
    。加载时需映射——
    equipped
    映射到
    competitor_in_place
    ,另外两个映射到
    WRONG_FIT
    ——否则雷达图和优先级表会将新旧标签视为同一类别的两个独立条目。
  • 异议指仍在沟通的用户提出的阻碍。主动 disqualify自己的用户属于
    WRONG_FIT
    ,而非异议——这包括联系对象错误、细分市场错误、职位级别过低或求职者。
    WRONG_FIT
    单独计数,不纳入异议占比:这是定位信号,而非辅导信号。
    EQUIPPED
    不是独立类别,属于
    competitor_in_place
    异议。
  • 主要异议 = 样本中最频繁的异议子类型 + 一行辅导指南 + 需向团队传达的内容。分布雷达 = 五种类型的分布情况。优先级表 = 异议(制定话术/应对卡片)、提及最多的竞品(来自
    competitor_in_place
    异议,若数量足够)、不符合定位占比(定位信号)、AI语气提示。
  • 最佳回复处理 = 基于9维度评分标准对抽样的OBJECTION回复进行评分(语气匹配/回应内容/长度匹配/最多一个问题/无禁用短语/不激进/资源优先级正确/不突兀/符合流程,每项0-3分,≥22/27分),将排名第一的回复作为“复制该示例”推荐。绝不编造示例——若无符合条件的回复,需如实说明。这9个维度与
    objection-analyzer
    技能的评分维度完全一致,顺序和阈值相同,因此在一个技能中评分的回复可直接在另一个技能中使用。其
    references/coaching-rubric.md
    包含0-3分的评分锚点(如需可参考)。
  • AI语气提示属于活动文案(“手册”标签页),而非回复处理。
  • 中位响应时间(仅从阶段5拉取的线程计算,基础构建不计算) = 每个身份在首次回复后,用户回复与线索消息之间的中位时间,基于用户选择分析的线程消息时间戳,剔除最慢的20%(这部分主要是已遗忘的线索)。将剔除的尾部数据与每个线索的LGM状态(
    get_lead_logs
    )交叉验证:未合格+冷线索→可能是疏漏(作为积压线索展示);已合格+无兴趣/已终止→合理关闭。随着批次数据的导入,逐步填充中位响应KPI/列。

E6. Conversion tracing + value (base build — required when the source is configured)

E6. 转化追踪+价值(基础构建——配置数据源后必填)

When a conversion/value source was configured at setup (Q2/Q3), compute outcome, conversion and value in the base build — do NOT defer or skip them for cost; they are the headline of this dashboard. Only show their empty state when no source is configured.
  • Pull the configured source (CRM / Airtable / CSV) for "pushed to a campaign before the {outcome} + qualified"; group by campaign/audience → ranks campaigns by actual outcomes, not just reply rate. The exact fields/logic come from what the user described and validated at setup (Q2) — treat it as their process, not a fixed shape.
  • Value = attribute the configured amount back to campaign/identity per the rule the user confirmed (Q3). When the value layer is on, it is the lead KPI.
  • Read a few real threads behind the top-converting campaign to seed the reply-side follow-through pattern (report honestly — sometimes persistence beats reply-handling skill).
若设置阶段配置了转化/价值数据源(问题2/3),在基础构建中计算成果、转化率和价值——不得延迟或因成本原因跳过;这些是仪表盘的核心指标。仅当数据源时显示空状态。
  • 拉取配置的数据源(CRM/Airtable/CSV),筛选“活动推送早于{成果}日期且符合资格”的数据;按活动/受众分组→按实际成果对活动排名,而非仅按回复率。具体字段/逻辑来自用户在设置阶段描述并确认的流程(问题2)——需遵循用户的流程,而非固定格式。
  • 价值 = 根据用户确认的规则(问题3)将配置的金额归因到活动/身份。启用价值维度后,它将成为核心KPI。
  • 读取顶级转化活动背后的部分真实线程,初始化回复端跟进模式(如实报告——有时坚持比回复处理技巧更重要)。

E7. Snapshot —
./.wtp/snapshot-<YYYY>-W<ww>.json

E7. 快照——
./.wtp/snapshot-<YYYY>-W<ww>.json

This-week state (overwritten): per-identity rollups, awaiting queues, header, hot leads, deltas WoW. Accumulating state (loaded, merged, persisted — never overwritten):
patternLibrary[]
,
objectionPlaybook[]
,
classifiedReplyIds[]
(skip-list). Union-safe within an ISO week (counts only grow). Keep >=5 weeks for trends.

本周状态(覆盖写入):身份维度汇总、待跟进队列、头部指标、高潜力线索、周度变化。累积状态(加载、合并、保存——绝不覆盖):
patternLibrary[]
objectionPlaybook[]
classifiedReplyIds[]
(跳过列表)。ISO周内可安全合并(仅计数增长)。保留至少5周数据用于趋势分析。

FILL CONTRACT

填充规范

Read
assets/dashboard-template.html
. It renders entirely from one injected object — replace the single token
{{DASHBOARD_DATA}}
with a JSON object of the shape below, then render the result as a live, interactive artifact (hard rule 3 — not a saved file, not a code block). Escape all user text (rep names, campaign names, lead messages) for HTML. Every field is filled from the engine; omit or empty a field to get its documented empty state (e.g. no
value
→ the value KPI shows "connect CRM / Stripe").
{
  "weekLabel": "Jul 20, 2026", "lastUpdated": "Jul 20, 2026", "refreshTaskId": "",
  "outcomeLabel": "Signups",
  "kpis": { "value": "€120k"|null, "outcome": 23, "hotPipeline": 6,
            "liReply": 20, "liZone": "yellow", "emReply": 3, "emZone": "red", "medianResp": "1.7d" },
  "coverage": "43 RUNNING campaigns, 17 in full detail",
  "hotLeads": [ { "wait":"9d", "owner":"{rep}", "lead":"{name}", "msg":"{signal}" } ],
  "speed": { "median":"1.7d", "backlog": 6, "note":"..." },
  "insights": [ "..." ],
  "team": [ { "name":"{rep}", "contacted":71, "accept":56, "reply":40, "replyZone":"green",
              "emailReply":null, "awaiting":829, "medResp":"0.9d", "outcome":1, "conv":1.4,
              "convApprox":false, "value":"€8.9k"|null, "lowSample":false } ],
  "fixes": [ { "who":"{rep}", "flag":"red"|"yellow", "stat":"...", "headline":"...", "context":"...",
               "improveReply":"{prompt+install link}", "improveConv":"{prompt+install link}" } ],
  "playbook": { "aiCallout":"..."|null,
                "channels":[ {"chan":"email"|"linkedin","title":"...","rows":[{"what":"...","metric":"...","up":true}],"empties":["..."],"conf":"..."} ],
                "patternsCampaign":[ {"name":"...","conf":"high","lift":"...","desc":"...","excerpt":"...","meta":"..."} ],
                "patternsReply":[ {...} ] },
  "quality": { "principalObjection": {"type":"...","desc":"...","team":"..."} | null,
               "radar": [ ["Hot",8], ["Curious",25], ["Objection",18], ["Firm no",4], ["Wrong fit",6] ],
               "priority": [ {"cat":"...","pr":"hi"|"mid"|"lo","prl":"...","todo":"..."} ],
               "bestReply": {"label":"...","text":"...","meta":"..."} | null }
}
Inbox links (hot leads): build at fill-time as
https://app.lagrowthmachine.com/inbox?ID=ALL&ST=REPLIED&Q={firstname+lastname}
(the
Q=
search is what pinpoints the lead; there is no per-conversation route). The template does this from
owner
/
lead
.

读取
assets/dashboard-template.html
。该模板完全通过注入一个对象渲染——将唯一令牌
{{DASHBOARD_DATA}}
替换为以下结构的JSON对象,然后渲染为交互式实时报表(硬性规则3——不得保存为文件或代码块)。对所有用户文本(销售代表姓名、活动名称、线索消息)进行HTML转义。所有字段均来自引擎计算;省略或留空字段将显示文档中定义的空状态(如无
value
→价值KPI显示“连接CRM/Stripe”)。
{
  "weekLabel": "Jul 20, 2026", "lastUpdated": "Jul 20, 2026", "refreshTaskId": "",
  "outcomeLabel": "Signups",
  "kpis": { "value": "€120k"|null, "outcome": 23, "hotPipeline": 6,
            "liReply": 20, "liZone": "yellow", "emReply": 3, "emZone": "red", "medianResp": "1.7d" },
  "coverage": "43 RUNNING campaigns, 17 in full detail",
  "hotLeads": [ { "wait":"9d", "owner":"{rep}", "lead":"{name}", "msg":"{signal}" } ],
  "speed": { "median":"1.7d", "backlog": 6, "note":"..." },
  "insights": [ "..." ],
  "team": [ { "name":"{rep}", "contacted":71, "accept":56, "reply":40, "replyZone":"green",
              "emailReply":null, "awaiting":829, "medResp":"0.9d", "outcome":1, "conv":1.4,
              "convApprox":false, "value":"€8.9k"|null, "lowSample":false } ],
  "fixes": [ { "who":"{rep}", "flag":"red"|"yellow", "stat":"...", "headline":"...", "context":"...",
               "improveReply":"{prompt+install link}", "improveConv":"{prompt+install link}" } ],
  "playbook": { "aiCallout":"..."|null,
                "channels":[ {"chan":"email"|"linkedin","title":"...","rows":[{"what":"...","metric":"...","up":true}],"empties":["..."],"conf":"..."} ],
                "patternsCampaign":[ {"name":"...","conf":"high","lift":"...","desc":"...","excerpt":"...","meta":"..."} ],
                "patternsReply":[ {...} ] },
  "quality": { "principalObjection": {"type":"...","desc":"...","team":"..."} | null,
               "radar": [ ["Hot",8], ["Curious",25], ["Objection",18], ["Firm no",4], ["Wrong fit",6] ],
               "priority": [ {"cat":"...","pr":"hi"|"mid"|"lo","prl":"...","todo":"..."} ],
               "bestReply": {"label":"...","text":"...","meta":"..."} | null }
}
收件箱链接(高潜力线索):填充时构建为
https://app.lagrowthmachine.com/inbox?ID=ALL&ST=REPLIED&Q={firstname+lastname}
Q=
搜索用于定位线索;无单个对话的直接链接)。模板通过
owner
/
lead
字段自动生成该链接。

Output & LGM handoff

输出与LGM交接



ACCEPTANCE (self-check before finishing)

验收标准(完成前自检)

  • Fresh env, LGM absent → guided the connect (https://lagrowthmachine.com/mcp/), waited, re-detected.
  • Every included identity appears ranked by reply rate; excluded ones are named in a footnote.
  • The team table shows all KPIs in one sortable place; reply rate is active-routine, outcome / conversion / value are all-time (labelled so "0 reply + N outcomes" reads as intended).
  • Fix cards flag conversion leaks, not just reply rate; both buttons carry the prompt + install link.
  • Reply Quality shows real classification, principal objection and either a real best-reply example or an honest empty state — never fabricated.
  • Outcome, conversion and value are computed in the base build when a source was configured at setup (never skipped for cost); their empty state shows ONLY when no source is configured.
  • Median response is empty in the base build and fills from the Phase 5 conversation fetch (the same fetch that deepens Reply Quality); the backlog counts show from the base build.
  • Output is a live, interactive artifact — NOT a saved .html file and NOT a code block. (If the environment truly has no artifact surface, that was stated and a browser-open offered instead.)
  • The Phase 5 offer (deepen reply analysis in tiered, timed batches; works from an export for non-LGM users) was made after the dashboard rendered.
  • Snapshot written to
    ./.wtp/
    ; refresh routine offered.
  • No data from anyone but the downloading user appears anywhere.
  • 全新环境且无LGM→引导连接(https://lagrowthmachine.com/mcp/),等待重新检测。
  • 所有包含的身份均按回复率排名;排除的身份在脚注中列出。
  • 团队表格在一个可排序的界面中展示所有KPI;回复率限定在当前活跃活动范围,成果/转化率/价值为全账户范围(标注清晰,确保“0回复+N成果”的展示符合预期)。
  • 修复卡片标记转化漏洞,而非仅回复率;两个按钮均包含提示+安装链接。
  • 回复质量标签页显示真实分类、主要异议,以及真实的最佳回复示例或如实的空状态——绝不编造数据。
  • 若设置阶段配置了数据源,成果、转化率和价值在基础构建中计算(绝不因成本原因跳过);仅当无数据源时显示空状态。
  • 中位响应时间在基础构建中为空,阶段5对话拉取后填充(同一拉取操作同时深化回复质量);积压线索数在基础构建中显示。
  • 输出为交互式实时报表——绝不是保存的.html文件或代码块。(若环境确实无报表功能,需如实说明并提供在浏览器中打开的选项。)
  • 仪表盘渲染完成后,提供阶段5选项(分层定时批次深化回复分析;非LGM用户可基于导出数据分析)。
  • 快照已写入
    ./.wtp/
    ;已提供自动刷新定时任务选项。
  • 所有数据均来自下载用户,无任何其他用户数据。",