account-research

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Account Research

账户调研

One job: know a company completely — what's publicly true (Crustdata + web) AND what your team already knows about them (CRM, calls, team chat, email). Most research skips the second half; that's where deals are actually won.

核心目标:全面了解一家企业——包括公开可得的信息(Crustdata + 网络)以及团队内部已掌握的相关信息(CRM、通话记录、团队聊天、电子邮件)。大多数调研会忽略后者,而这恰恰是促成交易的关键所在。

Code Mode ground rules (read once, apply everywhere)

代码模式基础规则(阅读一次,全场景适用)

All Crustdata calls run inside the
execute
tool of the Crustdata MCP server (install.crustdata.com/mcp) as a plain-JavaScript script. Every snippet in this skill follows these rules:
  • Plain JavaScript only. Author against the typed tool surface from
    get_schema
    , but the script body carries zero type annotations — a
    : Type
    ,
    as
    , or generic is a parse error that fails the whole run before any tool call.
  • Open every script with a source-labeled comment:
    // user query: ...
    or
    // model query: ...
    . Scripts without one are rejected before running (zero spend).
  • One I/O primitive:
    const r = await callTool(name, params)
    { ok: true, data }
    or
    { ok: false, status, errorType, message }
    . Always branch on
    r.ok
    — a failed call does not abort the script; an unchecked failure silently proceeds on empty data and looks like "no results".
  • Return the smallest projection. Only what the script
    return
    s reaches the model. Shape results in-script (
    project
    ,
    pick
    , plain
    .map
    ), never return whole profiles.
  • Fan out independent calls with
    await parallelMap(items, fn)
    ; batch first with
    chunk
    . Never parallelize cursor pagination or dependent stages (search → enrich stays sequential; parallelize within a stage).
  • fields
    is a response whitelist.
    The result carries only the groups you list; an omitted group reads as
    undefined
    later and looks like missing data. List every group you read.
  • Plan-gated projections fail the whole call with a 403 that names the field (e.g.
    professional_network.followers
    on
    person_search
    ). Drop the named field and re-run. Filter on
    professional_network.connections
    when you need an activity floor; never project followers.
  • Categorical values are closed sets. A plausible-but-wrong value silently returns zero rows. Resolve with
    company_autocomplete
    /
    person_autocomplete
    (free) before filtering on industries, funding round types, or seniority levels.
  • Zero results ≠ no matches. A well-formed query can encode an ill-posed ask. Decompose, test each predicate's selectivity, and read the
    trajectory
    (per-call filters + counts) in the execute response before trusting a low or zero count.
  • checkpoint(acc)
    after costly stages
    in long runs; a timed-out run returns it as
    partial
    so you can resume via
    inputs
    .
Cost cheat sheet: identify / autocomplete / schema = free. Search ~0.03 cr/result; count query (
limit: 1
, read
total_count
) ~0.03 cr.
company_enrich
2 cr per returned match. Social posts 1 cr/post. Web search 1 cr/query. Web fetch 1 cr/page.
account_credits
(free) reports balance; every execute response carries credits used + remaining. Confirm with the user before a large spend.

所有Crustdata调用都以纯JavaScript脚本的形式,在Crustdata MCP服务器(install.crustdata.com/mcp)的
execute
工具中运行。本Skill中的所有代码片段均遵循以下规则:
  • 仅使用纯JavaScript。基于
    get_schema
    返回的类型化工具接口编写代码,但脚本主体不得包含任何类型注解——
    : Type
    as
    或泛型都会导致解析错误,使整个调用在执行工具前失败。
  • 所有脚本开头必须添加来源标注注释
    // user query: ...
    // model query: ...
    。无此注释的脚本会被直接拒绝执行(无费用产生)。
  • 单一I/O原语
    const r = await callTool(name, params)
    → 返回
    { ok: true, data }
    { ok: false, status, errorType, message }
    必须始终根据
    r.ok
    进行分支处理
    ——调用失败不会终止脚本;未检查的失败会继续使用空数据执行,最终呈现“无结果”状态。
  • 返回最小化投影结果。只有脚本
    return
    的内容会传递给模型。在脚本内处理结果格式(使用
    project
    pick
    或普通
    .map
    ),绝不返回完整的配置文件。
  • 使用
    await parallelMap(items, fn)
    并行执行独立调用
    ;先通过
    chunk
    进行批量处理。绝不对游标分页或依赖阶段进行并行处理(搜索→ enrichment需保持顺序执行;可在同一阶段内并行处理)。
  • fields
    是响应白名单
    。结果仅包含你列出的分组;未列出的分组后续会被视为
    undefined
    ,呈现为数据缺失。请列出所有你需要读取的分组。
  • 受计划限制的投影会导致整个调用返回403错误,并指明受限字段(例如
    person_search
    中的
    professional_network.followers
    )。删除指定字段后重新执行。当你需要筛选活跃度下限值时,可基于
    professional_network.connections
    进行过滤;绝不要投影followers字段。
  • 分类值为封闭集合。看似合理但错误的值会静默返回零行数据。在对行业、融资轮次或职级进行过滤前,先通过
    company_autocomplete
    /
    person_autocomplete
    (免费工具)确认准确值。
  • 零结果≠无匹配项。格式正确的查询可能隐含不合理的需求。分解查询,测试每个谓词的选择性,在信任低计数或零计数结果前,先查看execute响应中的
    trajectory
    (每次调用的过滤器+计数)。
  • 在长运行流程中的高成本阶段后调用
    checkpoint(acc)
    ;超时的运行会返回
    partial
    状态,你可通过
    inputs
    恢复执行。
成本速查:identify / autocomplete / schema = 免费。搜索约0.03 cr/结果;计数查询(
limit: 1
,读取
total_count
)约0.03 cr。
company_enrich
每个返回匹配项2 cr。社交帖子1 cr/条。网络搜索1 cr/查询。网页抓取1 cr/页面。
account_credits
(免费)可查询余额;每个execute响应都会显示已使用和剩余的credits。在进行大额支出前请与用户确认。

STEP 0 — Context intake (always, before researching)

步骤0 — 上下文采集(调研前必须执行)

  1. Config backbone (standalone-safe). If
    config/gtm-config.md
    or
    config/persona-profile.md
    exist in the working directory, read them (what we sell → what's relevant). If they don't exist, ask 1-2 quick inline questions ("What do you sell, and who's your buyer?") or point at the icp-builder skill to set them up properly. A missing config never blocks the run.
  2. Ask where the context lives (once per session, then remember): "Which of these do you have connected — a CRM? A call recorder? Team chat? Email?" Use ONLY what's actually connected; degrade gracefully — external-only research still works, just say what's missing.
  3. Ask the goal (menu below) + which company.
  1. 配置基础(独立运行安全)。如果工作目录中存在
    config/gtm-config.md
    config/persona-profile.md
    ,请读取这些文件(了解我们销售的产品→确定相关信息)。如果不存在,请提出1-2个简短的嵌入式问题(“你们销售什么产品,目标客户是谁?”)或引导用户使用icp-builder Skill完成配置。缺少配置不会阻止运行。
  2. 询问上下文数据所在位置(每个会话仅询问一次,之后记录下来):“你们已连接以下哪些工具——CRM?通话记录器?团队聊天工具?电子邮件?”仅使用实际已连接的工具;优雅降级——仅使用外部信息的调研仍然有效,只需说明缺少的内部数据即可。
  3. 询问目标(如下方菜单所示)+ 目标企业名称。

THE GOAL MENU

目标菜单

  1. Account deep-dive & plan — everything about one target + how to attack it
  2. Org chart — who runs it, who reports to whom (see
    orgchart-playbook.md
    in this folder — the full battle-tested pipeline)
  3. Tech stack & wedge — what they run today + our opening
  4. Competitive battlecard — how we beat a competitor

  1. 账户深度调研与规划——关于目标企业的所有信息+进攻策略
  2. 组织架构图——管理层构成、汇报关系(查看本Skill文件夹中的
    orgchart-playbook.md
    ——经过实战验证的完整流程)
  3. 技术栈与切入机会——当前使用的技术+我们的切入点
  4. 竞品对战卡片——我们如何击败竞品

Mode 1 — Account deep-dive & plan

模式1 — 账户深度调研与规划

A. External sweep (Crustdata + web)

A. 外部信息扫描(Crustdata + 网络)

Identify → enrich (the cheapest exact path).
company_identify
is free but fuzzy — one domain or name can match several companies. Pick the top
confidence_score
match, then enrich by id with
exact_match: true
so you pay for exactly one match (2 credits):
js
// model query: identify and enrich acme.com for an account deep-dive
const idr = await callTool("company_identify", { domains: ["acme.com"] });
if (!idr.ok) return { error: idr.message };
const matches = idr.data[0]?.matches ?? [];
const best = matches.reduce((a, b) => ((b.confidence_score ?? 0) > (a?.confidence_score ?? -1) ? b : a), null);
if (!best) return { error: "no company match for acme.com" };
const companyId = best.company_data?.basic_info?.crustdata_company_id ?? best.company_data?.crustdata_company_id;

const er = await callTool("company_enrich", {
  crustdata_company_ids: [companyId],
  exact_match: true,
  fields: ["basic_info", "headcount", "funding", "news"], // whitelist: list EVERY group you read
});
if (!er.ok) return { error: er.message };
const cd = er.data[0]?.matches?.[0]?.company_data ?? {};
const news = firstArray(cd.news) ?? [];
return {
  name: cd.basic_info?.name,
  description: cd.basic_info?.description,
  headcount: cd.headcount?.total,
  growth_12m_percent: cd.headcount?.growth_percent?.["12m"],
  last_round: cd.funding?.last_round_type,
  last_round_date: cd.funding?.last_fundraise_date,
  total_raised_usd: cd.funding?.total_investment_usd,
  news: news.slice(0, 10).map(n => ({
    title: n.article_title, url: n.article_url, date: n.article_publish_date,
  })),
};
Read: size, funding, 12-month growth, and the
news
group (articles carry
article_title
/
article_url
/
article_publish_date
— these become sourced citations in the plan).
Open roles = pains + investment areas. Aggregations with
limit: 0
give the hiring shape for pennies; a second call reads the newest postings:
js
// model query: hiring shape + newest roles at acme.com
const base = [{ field: "company.basic_info.primary_domain", type: "=", value: "acme.com" }];
const [agg, fresh] = await parallelMap([
  {
    filters: { op: "and", conditions: base },
    aggregations: [{ type: "group_by", field: "job_details.category", agg: "count", size: 10 }],
    limit: 0,
  },
  {
    filters: { op: "and", conditions: base },
    sorts: [{ field: "metadata.date_added", order: "desc" }],
    limit: 15,
  },
], async (params) => await callTool("job_search", params));
if (!agg.ok) return { error: agg.message };
return {
  total_open_roles: agg.data.total_count,
  by_category: agg.data.aggregations,
  newest: fresh.ok
    ? fresh.data.job_listings.map(j => ({ title: j.job_details?.title, added: j.metadata?.date_added }))
    : [],
};
A company hiring 20 data engineers has a data problem; a company hiring its first security lead is about to buy security tooling. Say what the hiring shape implies.
Treat
job_details.category
as a rough shape, not evidence.
Verified live on a 10,524-posting account: 30 distinct categories, the largest of which is the catch-all
Others
(29%), with overlapping labels (
Engineering
,
Engineering and Information Technology
,
Information Technology
) and both
Others
and
Other
. It is fine for a one-line "where are they hiring" read. For any claim you put in the plan — "9 of 19 engineering roles mention data pipelines" — count titles instead:
group_by
on
job_details.title
, or a small fan-out of
limit: 0
count queries with
[.]
on
job_details.title
/
content.description
per role family.
Last-90-days news
web_search_live
(1 cr/query, keep it to 1-3 queries): funding, launches, exec moves, layoffs. Discard anything older than 90 days or label it as background.
What THEY are talking about
social_post_list_live
is 1 credit per post, so set
limit
deliberately:
js
// model query: what acme.com is posting about right now
const r = await callTool("social_post_list_live", { company_domain: "acme.com", limit: 10 });
if (!r.ok) return { error: r.message };
return r.data.posts.map(p => ({
  date: p.date_posted,
  type: p.post_type,
  text: (p.text ?? "").slice(0, 280),
  reactions: p.engagement?.total_reactions,
}));
Leadership snapshot — the senior layer in the function you sell to. Seniority levels are a closed set: resolve the exact labels with
person_autocomplete
on
experience.employment_details.current.seniority_level
first (expect values like
CXO
,
Vice President
,
Director
,
Owner / Partner
), then:
js
// model query: leadership snapshot at company 12345 in the function we sell to
const seniorities = ["CXO", "Vice President", "Director"]; // verified via person_autocomplete
const r = await callTool("person_search", {
  filters: { op: "and", conditions: [
    eq("experience.employment_details.current.company_id", 12345),
    in_("experience.employment_details.current.seniority_level", seniorities),
  ]},
  fields: ["basic_profile", "experience", "social_handles"],
  limit: 25,
});
if (!r.ok) return { error: r.message };
return r.data.profiles.map(p => ({
  name: p.basic_profile?.name,
  title: p.basic_profile?.current_title,
  linkedin: profileUrl(p),
}));
识别→ enrichment(成本最低的精准路径)
company_identify
是免费工具但结果模糊——一个域名或名称可能匹配多家企业。选择
confidence_score
最高的匹配项,然后通过id调用enrich并设置
exact_match: true
,这样你只需为精准匹配的单个结果付费(2 credits):
js
// model query: identify and enrich acme.com for an account deep-dive
const idr = await callTool("company_identify", { domains: ["acme.com"] });
if (!idr.ok) return { error: idr.message };
const matches = idr.data[0]?.matches ?? [];
const best = matches.reduce((a, b) => ((b.confidence_score ?? 0) > (a?.confidence_score ?? -1) ? b : a), null);
if (!best) return { error: "no company match for acme.com" };
const companyId = best.company_data?.basic_info?.crustdata_company_id ?? best.company_data?.crustdata_company_id;

const er = await callTool("company_enrich", {
  crustdata_company_ids: [companyId],
  exact_match: true,
  fields: ["basic_info", "headcount", "funding", "news"], // whitelist: list EVERY group you read
});
if (!er.ok) return { error: er.message };
const cd = er.data[0]?.matches?.[0]?.company_data ?? {};
const news = firstArray(cd.news) ?? [];
return {
  name: cd.basic_info?.name,
  description: cd.basic_info?.description,
  headcount: cd.headcount?.total,
  growth_12m_percent: cd.headcount?.growth_percent?.["12m"],
  last_round: cd.funding?.last_round_type,
  last_round_date: cd.funding?.last_fundraise_date,
  total_raised_usd: cd.funding?.total_investment_usd,
  news: news.slice(0, 10).map(n => ({
    title: n.article_title, url: n.article_url, date: n.article_publish_date,
  })),
};
读取信息:企业规模、融资情况、12个月增长率,以及
news
分组(文章包含
article_title
/
article_url
/
article_publish_date
——这些会成为规划中的来源引用)。
公开招聘岗位=痛点+投资方向。设置
limit: 0
的聚合查询只需少量成本即可了解招聘布局;第二次调用读取最新的招聘信息:
js
// model query: hiring shape + newest roles at acme.com
const base = [{ field: "company.basic_info.primary_domain", type: "=", value: "acme.com" }];
const [agg, fresh] = await parallelMap([
  {
    filters: { op: "and", conditions: base },
    aggregations: [{ type: "group_by", field: "job_details.category", agg: "count", size: 10 }],
    limit: 0,
  },
  {
    filters: { op: "and", conditions: base },
    sorts: [{ field: "metadata.date_added", order: "desc" }],
    limit: 15,
  },
], async (params) => await callTool("job_search", params));
if (!agg.ok) return { error: agg.message };
return {
  total_open_roles: agg.data.total_count,
  by_category: agg.data.aggregations,
  newest: fresh.ok
    ? fresh.data.job_listings.map(j => ({ title: j.job_details?.title, added: j.metadata?.date_added }))
    : [],
};
一家招聘20名数据工程师的企业存在数据相关问题;一家招聘首位安全负责人的企业即将采购安全工具。请说明招聘布局所隐含的信息。
job_details.category
视为大致布局,而非确切证据
。基于10524条招聘信息的验证结果:存在30个不同的分类,其中最大的分类是通用类别
Others
(占29%),还存在重叠标签(
Engineering
Engineering and Information Technology
Information Technology
)以及
Others
Other
两种写法。将其用于“企业招聘方向”的一行式说明即可。如果要在规划中提出具体结论——“19个技术岗位中有9个提到数据管道”,请统计职位名称:基于
job_details.title
进行
group_by
,或针对每个岗位类别,使用少量
limit: 0
的计数查询,基于
job_details.title
/
content.description
[.]
操作符进行过滤。
近90天新闻——使用
web_search_live
(1 cr/查询,限制为1-3次查询):融资、产品发布、高管变动、裁员。丢弃90天前的内容,或标注为背景信息。
企业的公开动态——
social_post_list_live
每条帖子收费1 credit,请谨慎设置
limit
js
// model query: what acme.com is posting about right now
const r = await callTool("social_post_list_live", { company_domain: "acme.com", limit: 10 });
if (!r.ok) return { error: r.message };
return r.data.posts.map(p => ({
  date: p.date_posted,
  type: p.post_type,
  text: (p.text ?? "").slice(0, 280),
  reactions: p.engagement?.total_reactions,
}));
领导层快照——你所销售产品对应职能的高层人员。职级为封闭集合:先通过
person_autocomplete
查询
experience.employment_details.current.seniority_level
确认准确标签(预期值如
CXO
Vice President
Director
Owner / Partner
),然后执行以下代码:
js
// model query: leadership snapshot at company 12345 in the function we sell to
const seniorities = ["CXO", "Vice President", "Director"]; // verified via person_autocomplete
const r = await callTool("person_search", {
  filters: { op: "and", conditions: [
    eq("experience.employment_details.current.company_id", 12345),
    in_("experience.employment_details.current.seniority_level", seniorities),
  ]},
  fields: ["basic_profile", "experience", "social_handles"],
  limit: 25,
});
if (!r.ok) return { error: r.message };
return r.data.profiles.map(p => ({
  name: p.basic_profile?.name,
  title: p.basic_profile?.current_title,
  linkedin: profileUrl(p),
}));

B. Internal sweep (the differentiator — use whatever is connected)

B. 内部信息扫描(差异化优势——使用已连接的任意工具)

  • CRM: past/open deals with them, contacts we know, notes, why past deals died
  • Call recorder: search past calls with the account — their words, objections, promises
  • Team chat: search the account name — internal chatter, warm intros, who knows them
  • Email: past threads with their domain — existing relationships
Summarize as "our history with them": who we know, what was said, where it stalled. Read-only, always — research never writes to a connected system. If nothing is connected, skip B and say the plan is external-only.
  • CRM:与该企业的过往/当前交易、已对接联系人、备注信息、过往交易失败原因
  • 通话记录器:搜索与该账户的过往通话——客户的原话、异议、承诺
  • 团队聊天工具:搜索企业名称——内部讨论、潜在引荐渠道、熟悉该企业的人员
  • 电子邮件:与该企业域名的过往邮件往来——已有的合作关系
将以上信息总结为“我们与该企业的合作历史”:我们认识谁、沟通内容、合作停滞点。始终保持只读——调研绝不会向已连接的系统写入数据。如果未连接任何工具,跳过本步骤并说明规划仅基于外部信息。

C. Synthesize the ACCOUNT PLAN (this is the deliverable)

C. 整合生成账户规划(最终交付物)

  • One-line read: what they do, where they're going, why now
  • Why we win here: their pains (evidenced — cite the job post, article, or post) mapped to what we sell
  • Who to talk to: champion / economic-buyer hypotheses (or run the org chart mode)
  • Our history: relationships + past context (from B)
  • Entry play: first move, warm path if any, the opener angle
  • Risks: incumbent, timing, past failed deal
  • 90-day next steps, dated
Write it clean (see the no-slop rule under Rules). Offer: deliver in chat, as a doc, continue into the org chart, find lookalikes with sales-prospecting, or export a CSV for your sequencer and hand off to your outreach tooling.

  • 一句话概述:企业业务、发展方向、当前的合作契机
  • 我们的获胜理由:将企业痛点(需提供证据——引用招聘信息、文章或社交帖子)与我们的产品优势匹配
  • 对接人选:潜在拥护者/决策人假设(或运行组织架构图模式)
  • 合作历史:已有的关系+过往上下文(来自步骤B)
  • 切入策略:首次行动、潜在的引荐路径、开场话术角度
  • 风险点:现有竞品、时机问题、过往失败交易
  • 90天后续行动计划(带日期)
撰写时简洁明了(遵循规则中的“无冗余规则”)。提供以下交付选项:聊天内交付、文档交付、继续生成组织架构图、使用sales-prospecting查找相似账户、导出CSV用于序列器并移交至触达工具。

Mode 2 — Org chart

模式2 — 组织架构图

Follow
orgchart-playbook.md
in this skill folder EXACTLY — it is battle-tested (size-branch, The Org for real reporting lines, hand-read titles, curation, base64 photos, standalone HTML, screenshot-or-preview self-review). Do not improvise a different chart.

严格遵循本Skill文件夹中的
orgchart-playbook.md
——该流程经过实战验证(按企业规模分支、使用The Org获取真实汇报线、人工校验职位名称、内容整理、base64图片、独立HTML页面、截图/预览自审)。请勿自行设计其他架构图。

Mode 3 — Tech stack & wedge

模式3 — 技术栈与切入机会

  1. Job posts are ground truth. Tools named in job descriptions are what the company actually runs. Probe with
    job_search
    on
    content.description
    — and this is CRITICAL: for a brand / product / tech name, always use the
    [.]
    exact-token operator (
    exactToken(...)
    builds it). The
    (.)
    operator is typo-tolerant and matches lookalike words, so
    (.)
    on "dbt" or "Ramp" pulls garbage. Keep
    (.)
    only for descriptive multi-word matching ("data quality", "revenue operations").
js
// model query: which of these tools show up in acme.com job posts
const tools = ["Snowflake", "dbt", "Looker", "Datadog", "Terraform"];
const hits = await parallelMap(tools, async (t) => {
  const r = await callTool("job_search", {
    filters: { op: "and", conditions: [
      { field: "company.basic_info.primary_domain", type: "=", value: "acme.com" },
      exactToken("content.description", t), // [.] literal token, never (.) for brand names
    ]},
    limit: 1,
  });
  return { tool: t, job_posts: r.ok ? r.data.total_count : null, error: r.ok ? undefined : r.message };
});
return hits;
  1. Round out the picture:
    company_enrich
    with
    fields: ["basic_info", "competitors", "software_reviews", "taxonomy"]
    for category and competitor context;
    web_enrich_live
    on their engineering blog / docs / integrations pages for stack mentions.
  2. Classify each item vs what you sell: incumbent competitor (displacement play — name the switching cost), complement (integrate / land alongside), gap (greenfield).
  3. Output: a stack map with a confidence tag per item —
    job-post-confirmed
    (named in a live job post, cite it) vs
    inferred
    (category/competitor/blog signal) — plus THE WEDGE: the one specific opening, phrased as an opener the rep could actually say out loud.

  1. 招聘信息是最准确的依据。招聘描述中提到的工具是企业实际使用的技术。使用
    job_search
    基于
    content.description
    进行探查——至关重要的是:对于品牌/产品/技术名称,必须使用
    [.]
    精确令牌操作符(
    exactToken(...)
    用于构建该操作符)。
    (.)
    操作符具有容错性,会匹配相似词汇,因此对“dbt”或“Ramp”使用
    (.)
    会返回无效结果。仅在匹配描述性多词汇(如“data quality”、“revenue operations”)时使用
    (.)
js
// model query: which of these tools show up in acme.com job posts
const tools = ["Snowflake", "dbt", "Looker", "Datadog", "Terraform"];
const hits = await parallelMap(tools, async (t) => {
  const r = await callTool("job_search", {
    filters: { op: "and", conditions: [
      { field: "company.basic_info.primary_domain", type: "=", value: "acme.com" },
      exactToken("content.description", t), // [.] literal token, never (.) for brand names
    ]},
    limit: 1,
  });
  return { tool: t, job_posts: r.ok ? r.data.total_count : null, error: r.ok ? undefined : r.message };
});
return hits;
  1. 完善技术栈全景:调用
    company_enrich
    并设置
    fields: ["basic_info", "competitors", "software_reviews", "taxonomy"]
    获取类别和竞品上下文;对企业的技术博客/文档/集成页面使用
    web_enrich_live
    查找技术栈提及信息。
  2. 将每个技术项与我们的产品进行分类对比现有竞品(替换策略——说明切换成本)、互补工具(集成/并行部署)、空白领域(全新市场)。
  3. 输出内容:带有每个技术项置信标签的技术栈图谱——
    job-post-confirmed
    (在有效招聘信息中提及,需引用) vs
    inferred
    (来自类别/竞品/博客信号)——以及切入机会:销售代表可直接使用的具体开场话术。

Mode 4 — Competitive battlecard

模式4 — 竞品对战卡片

  1. Profile the competitor:
    • company_identify
      company_enrich
      (
      fields: ["basic_info", "headcount", "funding", "news"]
      ) — size, growth, funding posture, news
    • job_search
      category aggregation — where they're investing (hiring = roadmap)
    • web_search_live
      — last 90 days: launches, pricing changes, exec moves, layoffs
    • social_post_list_live
      (explicit
      limit
      , ~10) — their current messaging, in their own words
  2. The battlecard:
    • Their ICP & strengths — be honest; pretending they're weak gets reps killed
    • Their gaps vs our differentiation
    • Landmine discovery questions — questions the prospect can ask the competitor that expose the gaps
    • Top-3 objections you'll hear + responses
    • Traps to avoid (claims of theirs you cannot beat head-on)
  3. Last-90-days rule: every messaging or momentum claim must come from a post, article, or job post dated inside the last 90 days, or be flagged as possibly stale.
  4. If it's for a live deal: mark which differentiators matter for THIS prospect's stated pains (from the internal sweep or the user).

  1. 竞品画像
    • company_identify
      company_enrich
      fields: ["basic_info", "headcount", "funding", "news"]
      )——企业规模、增长情况、融资状况、新闻动态
    • job_search
      分类聚合——竞品的投资方向(招聘= roadmap)
    • web_search_live
      ——近90天:产品发布、价格变动、高管变动、裁员
    • social_post_list_live
      (明确设置
      limit
      ,约10条)——竞品当前的官方话术
  2. 对战卡片内容
    • 竞品的ICP与优势——务必客观;刻意贬低竞品会导致销售失败
    • 竞品的短板与我们的差异化优势
    • 痛点挖掘问题——客户可向竞品提出的、能暴露其短板的问题
    • 三大常见异议及应对话术
    • 规避陷阱(竞品无法被正面击败的主张)
  3. 90天规则:所有关于话术或发展势头的主张必须来自近90天的帖子、文章或招聘信息,否则需标注为可能过时。
  4. 如果是针对当前交易:标记哪些差异化优势与该客户明确提出的痛点相关(来自内部扫描或用户提供的信息)。

Rules

规则

  • Internal context is half the job — always ask what's connected and sweep it. Never skip because it's "just research".
  • Facts get sources (Crustdata result / URL / call / CRM note). Inference gets labeled as inference.
  • Read-only on CRM / recorder / team chat / email — research never writes.
  • No-slop rule on every deliverable: no em dashes, no "delve" / "leverage" / "streamline", no filler sections — if there's nothing real to say, cut the section. Write like a colleague who did the homework.
  • Adapt the layout to the content — never let it hide anything. The brand system is fixed; the layout is not. If real content doesn't fit — a long company or person name, a 12-word title, 200 rows — change the layout, not the content: let the card grow, wrap instead of truncating, drop to one column, widen the column, raise the cap, or give the wide thing its own scroll container. Never solve a fit problem by clipping a card, ellipsing a name, or silently dropping rows. Where a cap really is unavoidable, say so in the UI ("showing the top 50 of 214") so the reader knows what they're not seeing. Look at the rendered output and fix what's cut off before you hand it over.
  • Logos and photos are free — use them in rendered output.
    basic_info.logo_permalink
    (company) comes from the free
    company_identify
    and from
    company_enrich
    's
    basic_info
    ;
    basic_profile.profile_picture_permalink
    (person) is already inside the
    basic_profile
    group
    person_search
    returns. Neither costs an extra credit. Base64-inline both as
    data:image/jpeg;base64,...
    URIs — the media CDN serves them as
    binary/octet-stream
    , so a remote
    <img src>
    renders blank. Monogram fallback when an image is missing.
  • Icons in rendered output: Lucide, the dashboard's icon set, inlined as SVG with a
    currentColor
    stroke. No emojis in artifact UI.
  • Artifact branding: deliverables default to chat or plain files — never render an artifact for its own sake. But IF a deliverable is rendered as a page or document (the org chart HTML, an account-plan doc, a battlecard page), it carries the Crustdata brand lockup in the header or footer: a small uppercase "Powered by" eyebrow plus the official Crustdata wordmark, linking to crustdata.com. The wordmark pair ships in this skill's
    assets/
    crustdata-logo-light.png
    (dark text, for light backgrounds) and
    crustdata-logo-dark.png
    (white text, for dark backgrounds), the same files app.crustdata.com's header renders. Base64-inline the theme-appropriate variant at ~17px height — never hotlink; rendered artifacts cannot fetch remote images. Brand accent:
    #5547E2
    (the product primary;
    #8387FF
    on dark grounds). Body font: Geist when embeddable, else the system stack. The org chart's exact placement is specced in
    orgchart-playbook.md
    .
  • Autocomplete-first on closed sets (industries, funding rounds, seniority). Never guess a categorical value.
  • Costs are real: state the expected credit spend before post pulls, big people pulls, or enrich fan-outs.
  • Hand off: lookalikes of this account → sales-prospecting; no ICP defined yet → icp-builder; first touch → export a CSV for your sequencer and hand off to your outreach tooling.

  • 内部上下文是工作的一半——务必询问已连接的工具并进行扫描。绝不能因为“只是调研”而跳过。
  • 事实需标注来源(Crustdata结果/URL/通话记录/CRM备注)。推断内容需标注为推断。
  • 对CRM/通话记录器/团队聊天工具/电子邮件保持只读——调研绝不会写入数据。
  • 交付物无冗余规则:禁止使用破折号、“深入研究”/“利用”/“优化”等空泛词汇、无实质内容的章节——如果没有真实内容可写,直接删除该章节。撰写风格需像完成了调研工作的同事。
  • 根据内容调整布局——绝不让布局掩盖内容。品牌体系固定,但布局可灵活调整。如果真实内容无法适配布局——过长的企业/人员名称、12字的职位标题、200行数据——请调整布局,而非修改内容:允许卡片扩展、自动换行而非截断、改为单列布局、加宽列宽、提高显示上限、或为宽内容添加独立滚动容器。绝不能通过裁剪卡片、省略名称或静默删除行来解决适配问题。如果确实需要设置上限,请在UI中说明(“显示前50条,共214条”),让读者了解未显示的内容。在交付前查看渲染结果并修复截断问题。
  • Logo和图片免费——在渲染输出中使用
    basic_info.logo_permalink
    (企业)来自免费的
    company_identify
    company_enrich
    basic_info
    分组;
    basic_profile.profile_picture_permalink
    (个人)已包含在
    person_search
    返回的
    basic_profile
    分组中。两者均无需额外付费。将它们以
    data:image/jpeg;base64,...
    URI的形式嵌入base64——媒体CDN以
    binary/octet-stream
    格式提供服务,因此远程
    <img src>
    会显示空白。如果缺少图片,使用字母组合作为 fallback。
  • 渲染输出中的图标:使用Lucide(仪表板的图标集),以内联SVG形式嵌入,设置
    currentColor
    描边。在交付物UI中禁止使用表情符号。
  • 交付物品牌标识:交付物默认以聊天或纯文本文件形式提供——绝不要为了渲染而渲染。但如果交付物以页面或文档形式渲染(组织架构图HTML、账户规划文档、对战卡片页面),需在页眉或页脚添加Crustdata品牌标识:小型大写字母的“Powered by”前缀加上官方Crustdata文字标志,链接至crustdata.com。文字标志文件位于本Skill的
    assets/
    文件夹中——
    crustdata-logo-light.png
    (深色文字,用于浅色背景)和
    crustdata-logo-dark.png
    (白色文字,用于深色背景),与app.crustdata.com页眉使用的文件相同。将适配主题的变体以约17px高度嵌入base64——绝不要使用热链接;渲染后的交付物无法获取远程图片。品牌强调色:
    #5547E2
    (产品主色调;深色背景下使用
    #8387FF
    )。正文字体:可嵌入时使用Geist,否则使用系统字体栈。组织架构图的具体布局规范在
    orgchart-playbook.md
    中定义。
  • 对封闭集合(行业、融资轮次、职级)优先使用autocomplete。绝不要猜测分类值。
  • 成本真实存在:在获取帖子、大量人员信息或批量enrich前,说明预期的credit消耗。
  • 移交路径:相似账户→ sales-prospecting;未定义ICP→ icp-builder;首次触达→导出CSV用于序列器并移交至触达工具。

Tool dependencies

工具依赖

This skill requires:
  • Crustdata MCP server (install.crustdata.com/mcp): a single Code Mode MCP exposing
    list_tools
    ,
    get_schema
    , and
    execute
    . All Crustdata data tools are reached inside an
    execute({ code })
    plain-JavaScript script via
    await callTool(name, params)
    . Tools used here:
    company_identify
    ,
    company_enrich
    ,
    company_autocomplete
    ,
    person_search
    ,
    person_autocomplete
    ,
    job_search
    ,
    social_post_list_live
    ,
    web_search_live
    ,
    web_enrich_live
    ,
    account_credits
  • Optional connectors the user may have: whatever CRM, call recorder, team chat, or email you use — all used read-only for the internal sweep; the skill degrades gracefully to external-only without them
  • Python and headless Chrome (both optional, Claude Code only) for the org-chart HTML generator and self-review screenshot; environments without them use the fallbacks in
    orgchart-playbook.md
本Skill需要以下工具:
  • Crustdata MCP服务器install.crustdata.com/mcp):一个暴露
    list_tools
    get_schema
    execute
    接口的Code Mode MCP。所有Crustdata数据工具都通过
    execute({ code })
    纯JavaScript脚本中的
    await callTool(name, params)
    调用。本Skill使用的工具包括:
    company_identify
    company_enrich
    company_autocomplete
    person_search
    person_autocomplete
    job_search
    social_post_list_live
    web_search_live
    web_enrich_live
    account_credits
  • 可选连接器:用户可能已连接的任意CRM、通话记录器、团队聊天工具或电子邮件——所有工具仅用于内部信息扫描的只读操作;如果没有这些连接器,Skill会优雅降级为仅使用外部信息的模式
  • Python无头Chrome(均为可选,仅适用于Claude Code):用于组织架构图HTML生成器和自审截图;无此环境时使用
    orgchart-playbook.md
    中的 fallback方案