account-research
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAccount 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 tool of the Crustdata MCP server (install.crustdata.com/mcp) as a plain-JavaScript script. Every snippet in this skill follows these rules:
execute- Plain JavaScript only. Author against the typed tool surface from , but the script body carries zero type annotations — a
get_schema,: Type, or generic is a parse error that fails the whole run before any tool call.as - Open every script with a source-labeled comment: or
// user query: .... Scripts without one are rejected before running (zero spend).// model query: ... - One I/O primitive: →
const r = await callTool(name, params)or{ ok: true, data }. Always branch on{ ok: false, status, errorType, message }— a failed call does not abort the script; an unchecked failure silently proceeds on empty data and looks like "no results".r.ok - Return the smallest projection. Only what the script s reaches the model. Shape results in-script (
return,project, plainpick), never return whole profiles..map - Fan out independent calls with ; batch first with
await parallelMap(items, fn). Never parallelize cursor pagination or dependent stages (search → enrich stays sequential; parallelize within a stage).chunk - is a response whitelist. The result carries only the groups you list; an omitted group reads as
fieldslater and looks like missing data. List every group you read.undefined - Plan-gated projections fail the whole call with a 403 that names the field (e.g. on
professional_network.followers). Drop the named field and re-run. Filter onperson_searchwhen you need an activity floor; never project followers.professional_network.connections - Categorical values are closed sets. A plausible-but-wrong value silently returns zero rows. Resolve with /
company_autocomplete(free) before filtering on industries, funding round types, or seniority levels.person_autocomplete - Zero results ≠ no matches. A well-formed query can encode an ill-posed ask. Decompose, test each predicate's selectivity, and read the (per-call filters + counts) in the execute response before trusting a low or zero count.
trajectory - after costly stages in long runs; a timed-out run returns it as
checkpoint(acc)so you can resume viapartial.inputs
Cost cheat sheet: identify / autocomplete / schema = free. Search ~0.03 cr/result; count query (, read ) ~0.03 cr. 2 cr per returned match. Social posts 1 cr/post. Web search 1 cr/query. Web fetch 1 cr/page. (free) reports balance; every execute response carries credits used + remaining. Confirm with the user before a large spend.
limit: 1total_countcompany_enrichaccount_credits所有Crustdata调用都以纯JavaScript脚本的形式,在Crustdata MCP服务器(install.crustdata.com/mcp)的工具中运行。本Skill中的所有代码片段均遵循以下规则:
execute- 仅使用纯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)进行批量处理。绝不对游标分页或依赖阶段进行并行处理(搜索→ enrichment需保持顺序执行;可在同一阶段内并行处理)。chunk - 是响应白名单。结果仅包含你列出的分组;未列出的分组后续会被视为
fields,呈现为数据缺失。请列出所有你需要读取的分组。undefined - 受计划限制的投影会导致整个调用返回403错误,并指明受限字段(例如中的
person_search)。删除指定字段后重新执行。当你需要筛选活跃度下限值时,可基于professional_network.followers进行过滤;绝不要投影followers字段。professional_network.connections - 分类值为封闭集合。看似合理但错误的值会静默返回零行数据。在对行业、融资轮次或职级进行过滤前,先通过/
company_autocomplete(免费工具)确认准确值。person_autocomplete - 零结果≠无匹配项。格式正确的查询可能隐含不合理的需求。分解查询,测试每个谓词的选择性,在信任低计数或零计数结果前,先查看execute响应中的(每次调用的过滤器+计数)。
trajectory - 在长运行流程中的高成本阶段后调用;超时的运行会返回
checkpoint(acc)状态,你可通过partial恢复执行。inputs
成本速查:identify / autocomplete / schema = 免费。搜索约0.03 cr/结果;计数查询(,读取)约0.03 cr。每个返回匹配项2 cr。社交帖子1 cr/条。网络搜索1 cr/查询。网页抓取1 cr/页面。(免费)可查询余额;每个execute响应都会显示已使用和剩余的credits。在进行大额支出前请与用户确认。
limit: 1total_countcompany_enrichaccount_creditsSTEP 0 — Context intake (always, before researching)
步骤0 — 上下文采集(调研前必须执行)
- Config backbone (standalone-safe). If or
config/gtm-config.mdexist 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.config/persona-profile.md - 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.
- Ask the goal (menu below) + which company.
- 配置基础(独立运行安全)。如果工作目录中存在或
config/gtm-config.md,请读取这些文件(了解我们销售的产品→确定相关信息)。如果不存在,请提出1-2个简短的嵌入式问题(“你们销售什么产品,目标客户是谁?”)或引导用户使用icp-builder Skill完成配置。缺少配置不会阻止运行。config/persona-profile.md - 询问上下文数据所在位置(每个会话仅询问一次,之后记录下来):“你们已连接以下哪些工具——CRM?通话记录器?团队聊天工具?电子邮件?”仅使用实际已连接的工具;优雅降级——仅使用外部信息的调研仍然有效,只需说明缺少的内部数据即可。
- 询问目标(如下方菜单所示)+ 目标企业名称。
THE GOAL MENU
目标菜单
- Account deep-dive & plan — everything about one target + how to attack it
- Org chart — who runs it, who reports to whom (see in this folder — the full battle-tested pipeline)
orgchart-playbook.md - Tech stack & wedge — what they run today + our opening
- Competitive battlecard — how we beat a competitor
- 账户深度调研与规划——关于目标企业的所有信息+进攻策略
- 组织架构图——管理层构成、汇报关系(查看本Skill文件夹中的——经过实战验证的完整流程)
orgchart-playbook.md - 技术栈与切入机会——当前使用的技术+我们的切入点
- 竞品对战卡片——我们如何击败竞品
Mode 1 — Account deep-dive & plan
模式1 — 账户深度调研与规划
A. External sweep (Crustdata + web)
A. 外部信息扫描(Crustdata + 网络)
Identify → enrich (the cheapest exact path). is free but fuzzy — one domain or name can match several companies. Pick the top match, then enrich by id with so you pay for exactly one match (2 credits):
company_identifyconfidence_scoreexact_match: truejs
// 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 group (articles carry / / — these become sourced citations in the plan).
newsarticle_titlearticle_urlarticle_publish_dateOpen roles = pains + investment areas. Aggregations with give the hiring shape for pennies; a second call reads the newest postings:
limit: 0js
// 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 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 (29%), with overlapping labels (, , ) and both and . 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: on , or a small fan-out of count queries with on / per role family.
job_details.categoryOthersEngineeringEngineering and Information TechnologyInformation TechnologyOthersOthergroup_byjob_details.titlelimit: 0[.]job_details.titlecontent.descriptionLast-90-days news — (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.
web_search_liveWhat THEY are talking about — is 1 credit per post, so set deliberately:
social_post_list_livelimitjs
// 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 on first (expect values like , , , ), then:
person_autocompleteexperience.employment_details.current.seniority_levelCXOVice PresidentDirectorOwner / Partnerjs
// 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(成本最低的精准路径)。是免费工具但结果模糊——一个域名或名称可能匹配多家企业。选择最高的匹配项,然后通过id调用enrich并设置,这样你只需为精准匹配的单个结果付费(2 credits):
company_identifyconfidence_scoreexact_match: truejs
// 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个月增长率,以及分组(文章包含 / / ——这些会成为规划中的来源引用)。
newsarticle_titlearticle_urlarticle_publish_date公开招聘岗位=痛点+投资方向。设置的聚合查询只需少量成本即可了解招聘布局;第二次调用读取最新的招聘信息:
limit: 0js
// 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名数据工程师的企业存在数据相关问题;一家招聘首位安全负责人的企业即将采购安全工具。请说明招聘布局所隐含的信息。
将视为大致布局,而非确切证据。基于10524条招聘信息的验证结果:存在30个不同的分类,其中最大的分类是通用类别(占29%),还存在重叠标签(、、)以及和两种写法。将其用于“企业招聘方向”的一行式说明即可。如果要在规划中提出具体结论——“19个技术岗位中有9个提到数据管道”,请统计职位名称:基于进行,或针对每个岗位类别,使用少量的计数查询,基于 / 的操作符进行过滤。
job_details.categoryOthersEngineeringEngineering and Information TechnologyInformation TechnologyOthersOtherjob_details.titlegroup_bylimit: 0job_details.titlecontent.description[.]近90天新闻——使用(1 cr/查询,限制为1-3次查询):融资、产品发布、高管变动、裁员。丢弃90天前的内容,或标注为背景信息。
web_search_live企业的公开动态——每条帖子收费1 credit,请谨慎设置:
social_post_list_livelimitjs
// 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_autocompleteexperience.employment_details.current.seniority_levelCXOVice PresidentDirectorOwner / Partnerjs
// 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 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.
orgchart-playbook.md严格遵循本Skill文件夹中的——该流程经过实战验证(按企业规模分支、使用The Org获取真实汇报线、人工校验职位名称、内容整理、base64图片、独立HTML页面、截图/预览自审)。请勿自行设计其他架构图。
orgchart-playbook.mdMode 3 — Tech stack & wedge
模式3 — 技术栈与切入机会
- Job posts are ground truth. Tools named in job descriptions are what the company actually runs. Probe with on
job_search— and this is CRITICAL: for a brand / product / tech name, always use thecontent.descriptionexact-token operator ([.]builds it). TheexactToken(...)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;- Round out the picture: with
company_enrichfor category and competitor context;fields: ["basic_info", "competitors", "software_reviews", "taxonomy"]on their engineering blog / docs / integrations pages for stack mentions.web_enrich_live - Classify each item vs what you sell: incumbent competitor (displacement play — name the switching cost), complement (integrate / land alongside), gap (greenfield).
- Output: a stack map with a confidence tag per item — (named in a live job post, cite it) vs
job-post-confirmed(category/competitor/blog signal) — plus THE WEDGE: the one specific opening, phrased as an opener the rep could actually say out loud.inferred
- 招聘信息是最准确的依据。招聘描述中提到的工具是企业实际使用的技术。使用基于
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;- 完善技术栈全景:调用并设置
company_enrich获取类别和竞品上下文;对企业的技术博客/文档/集成页面使用fields: ["basic_info", "competitors", "software_reviews", "taxonomy"]查找技术栈提及信息。web_enrich_live - 将每个技术项与我们的产品进行分类对比:现有竞品(替换策略——说明切换成本)、互补工具(集成/并行部署)、空白领域(全新市场)。
- 输出内容:带有每个技术项置信标签的技术栈图谱——(在有效招聘信息中提及,需引用) vs
job-post-confirmed(来自类别/竞品/博客信号)——以及切入机会:销售代表可直接使用的具体开场话术。inferred
Mode 4 — Competitive battlecard
模式4 — 竞品对战卡片
- Profile the competitor:
- →
company_identify(company_enrich) — size, growth, funding posture, newsfields: ["basic_info", "headcount", "funding", "news"] - category aggregation — where they're investing (hiring = roadmap)
job_search - — last 90 days: launches, pricing changes, exec moves, layoffs
web_search_live - (explicit
social_post_list_live, ~10) — their current messaging, in their own wordslimit
- 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)
- 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.
- If it's for a live deal: mark which differentiators matter for THIS prospect's stated pains (from the internal sweep or the user).
- 竞品画像:
- →
company_identify(company_enrich)——企业规模、增长情况、融资状况、新闻动态fields: ["basic_info", "headcount", "funding", "news"] - 分类聚合——竞品的投资方向(招聘= roadmap)
job_search - ——近90天:产品发布、价格变动、高管变动、裁员
web_search_live - (明确设置
social_post_list_live,约10条)——竞品当前的官方话术limit
- 对战卡片内容:
- 竞品的ICP与优势——务必客观;刻意贬低竞品会导致销售失败
- 竞品的短板与我们的差异化优势
- 痛点挖掘问题——客户可向竞品提出的、能暴露其短板的问题
- 三大常见异议及应对话术
- 规避陷阱(竞品无法被正面击败的主张)
- 90天规则:所有关于话术或发展势头的主张必须来自近90天的帖子、文章或招聘信息,否则需标注为可能过时。
- 如果是针对当前交易:标记哪些差异化优势与该客户明确提出的痛点相关(来自内部扫描或用户提供的信息)。
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. (company) comes from the free
basic_info.logo_permalinkand fromcompany_identify'scompany_enrich;basic_info(person) is already inside thebasic_profile.profile_picture_permalinkgroupbasic_profilereturns. Neither costs an extra credit. Base64-inline both asperson_searchURIs — the media CDN serves them asdata:image/jpeg;base64,..., so a remotebinary/octet-streamrenders blank. Monogram fallback when an image is missing.<img src> - Icons in rendered output: Lucide, the dashboard's icon set, inlined as SVG with a stroke. No emojis in artifact UI.
currentColor - 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/(dark text, for light backgrounds) andcrustdata-logo-light.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:crustdata-logo-dark.png(the product primary;#5547E2on dark grounds). Body font: Geist when embeddable, else the system stack. The org chart's exact placement is specced in#8387FF.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_profileURI的形式嵌入base64——媒体CDN以data:image/jpeg;base64,...格式提供服务,因此远程binary/octet-stream会显示空白。如果缺少图片,使用字母组合作为 fallback。<img src> - 渲染输出中的图标:使用Lucide(仪表板的图标集),以内联SVG形式嵌入,设置描边。在交付物UI中禁止使用表情符号。
currentColor - 交付物品牌标识:交付物默认以聊天或纯文本文件形式提供——绝不要为了渲染而渲染。但如果交付物以页面或文档形式渲染(组织架构图HTML、账户规划文档、对战卡片页面),需在页眉或页脚添加Crustdata品牌标识:小型大写字母的“Powered by”前缀加上官方Crustdata文字标志,链接至crustdata.com。文字标志文件位于本Skill的文件夹中——
assets/(深色文字,用于浅色背景)和crustdata-logo-light.png(白色文字,用于深色背景),与app.crustdata.com页眉使用的文件相同。将适配主题的变体以约17px高度嵌入base64——绝不要使用热链接;渲染后的交付物无法获取远程图片。品牌强调色:crustdata-logo-dark.png(产品主色调;深色背景下使用#5547E2)。正文字体:可嵌入时使用Geist,否则使用系统字体栈。组织架构图的具体布局规范在#8387FF中定义。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, andget_schema. All Crustdata data tools are reached inside anexecuteplain-JavaScript script viaexecute({ code }). Tools used here:await callTool(name, params),company_identify,company_enrich,company_autocomplete,person_search,person_autocomplete,job_search,social_post_list_live,web_search_live,web_enrich_liveaccount_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接口的Code Mode MCP。所有Crustdata数据工具都通过execute纯JavaScript脚本中的execute({ code })调用。本Skill使用的工具包括:await callTool(name, params)、company_identify、company_enrich、company_autocomplete、person_search、person_autocomplete、job_search、social_post_list_live、web_search_live、web_enrich_liveaccount_credits - 可选连接器:用户可能已连接的任意CRM、通话记录器、团队聊天工具或电子邮件——所有工具仅用于内部信息扫描的只读操作;如果没有这些连接器,Skill会优雅降级为仅使用外部信息的模式
- Python和无头Chrome(均为可选,仅适用于Claude Code):用于组织架构图HTML生成器和自审截图;无此环境时使用中的 fallback方案
orgchart-playbook.md