编程

tam-building

试用

Build your total addressable market (TAM) list and stand it up as a deployed model in Cargo: your ICP, read from your context (or drafted from your website and customer stories), becomes an AI Ark company search setting industries, company size and countries, sized for free before it bills, and lands as one model other pipelines read. Triggers: "our TAM is a stale CSV", "build our account universe", "source every company that matches our ICP", "keep our market list in Cargo", "how big is our market, and give me the companies", "land our TAM as a model the other pipelines can read". Cargo CDK, aiArk, countCompanies, fetchCompanies; FullEnrich, Apollo or Sales Navigator as swapped sources. Skip when: you want a list handed back in the chat or as a CSV rather than a model in the workspace, which is build-tam-list; or the accounts already exist and need tiering, which is account-scoring.

它能做什么

**State: to-be-approved.** Deploy-verified against a live workspace: not yet. Treat below as the acceptance test and review before deploying. Make no outcome claim for this skill until it is approved.

技能文档

Tam building

State: to-be-approved. Deploy-verified against a live workspace: not yet. Treat Done when below as the acceptance test and review cargo-ai cdk plan before deploying. Make no outcome claim for this skill until it is approved.

The outcome

Your account universe, built from the Sales Navigator search that describes your whole market, even when that search returns far more than the extractor will hand over. Counted before it is extracted, split into sub-searches that each sit under the cap, resolved to real domains, and merged into the shared accounts model deduped.

The count is a design-time CLI call, not a deployed resource:

cargo-ai orchestration action execute --wait-until-finished \
  --action '{"kind":"connector","integrationSlug":"salesNavigator","actionSlug":"searchCompanyMetrics","config":{}}' \
  --data '{"url":""}'

It returns total_results and costs a fraction of a credit. Splitting order that usually works: industry first (descend the LinkedIn taxonomy only where a segment is still oversized), then geography, then headcount band. Recount every sub-search; split any that is still over.

Put it in your project

This folder is a worked example: real CDK resources written for some other company. The job is to end up with the code your company would have written, in your project, and an agent does the adapting. If the cargo-cdk skill is in your session it carries the long form of this; if not, this is enough.

  1. Look first. grep -l '@cargo-ai/cdk' package.json says whether a CDK project already lives here; ls */models/*.ts */connectors/*.ts says what it already declares. If there is no project: cargo-ai cdk init --template blank && cd && npm install. That is the whole shell; this folder never ships one.
  2. Copy this folder in as a sibling of what is there, then reconcile: for every model or connector this example carries that the project already has (an accounts model keyed on website, a HubSpot connector, an OpenAI connector), rewire the imports to the existing one and drop the copy. Two resources with one slug is a collision at deploy. Append this folder's .env needs to the project's .env.example; never overwrite it.
  3. Adapt. Work the sections below in order: What should not change is what you argue back about (say what breaks, then do it if they still want it); What you can change is what you offer unprompted (nobody asks for a variant they do not know exists); What you will be asked is the floor, and you derive before you ask. If you are asking more than about four questions you have skipped lookups. Record what you changed and why under a ## Decisions section in your copy of this file.
  4. Plan, then stop. npm run typecheck && cargo-ai cdk plan. Show the diff. Deploy only on an explicit yes: cargo-ai cdk deploy. Never cdk init --force into a non-empty directory.
  5. Verify. Walk Done when line by line and report each with evidence. Deployed cleanly and produced nothing is the normal failure.

What you will be asked

Derive before you ask. An input with a lookup is looked up, not asked. Only the ones marked asked genuinely live in the operator's head.

InputKindHow it is answeredWhy it matters
marketSearchmanualchecked, not written: Paste the Sales Navigator company search that describes your whole market, however oversized it isThis is the only input that cannot be derived: it encodes who you sell to. Everything else in this skill is arithmetic on top of it.
searchUrls (models/salesnav-companies.ts)valuederived: cargo-ai orchestration action execute --action salesNavigator.searchCompanyMetrics --data '{"url":""}' returns total_results. Over the cap, split by facet (industry first, descending the LinkedIn taxonomy only where still oversized, then geography, then headcount band) and recount each sub-search until every one is under the cap.A search holding 4,000 companies extracts 1,000 and tells you nothing about the missing 3,000. Splitting under the cap is the entire point of this skill.
limit (models/salesnav-companies.ts)valuedefaults to 1000; ask only to change itThis is the upstream cost control. Promotion is 1:1 with extraction, so what you extract is what you pay to enrich.

Checked before moving on, not after the deploy:

  • marketSearch: the URL is a linkedin.com/sales/search/company URL
  • searchUrls: every sub-search count is strictly below config.limit; a count equal to the cap means it is still truncated and must be split again
  • limit: at or below 1000

What you can change

The code is a worked example. These reshapes are expected, and the agent offers them rather than waiting to be asked. Every one costs something; that is what makes it a variation and not the default.

VariationWhen it is rightHowWhat it costs
non-linkedin-sourceYou do not want to source from LinkedIn at all, or Sales Nav does not cover your marketSwap the Sales Nav connector and landing model for the Ark enrichment API (https://ai-ark.com/platform/enrichment-api), keeping promote-to-accounts and the accounts contract unchanged (models/salesnav-companies.ts, connectors/sales-navigator.ts)You lose the Sales Nav facet taxonomy that makes the split tactic mechanical, and the splitting has to be redesigned around the new source's own limits
land-without-promotingYou want to see and filter the raw market before paying to enrich itDeploy the landing model only and leave promote-to-accounts out until you have decided which rows are worth promoting (plays/promote-to-accounts.ts)Nothing reaches accounts, so no downstream skill (scoring, contact sourcing, signals) has anything to work with until you promote
sample-firstThe market search is large and you want to see the cost curve before committingSet config.limit well below the cap and start with one sub-search URL, then widen once rows land correctly (models/salesnav-companies.ts)Your TAM is deliberately incomplete until you widen it, so do not score or report on coverage from a sample

What should not change

However far you adapt, these hold. Ask for one anyway and the agent tells you what breaks, then does it if you still want it, and records why under ## Decisions in your copy of this file.

  • Every company is resolved to a real domain before it is promoted into accounts. (plays/promote-to-accounts.ts) The shared accounts model keys on website. A domainless account cannot be deduped, so it forks into duplicates the first time the same company appears in another list. This is why a row that cannot be resolved is dropped rather than written.
  • Every search is counted before it is extracted. (models/salesnav-companies.ts) Extracting blind is how you take a silently truncated list: the search holds 4,000 companies, the extractor takes 1,000, and nothing tells you the rest exist.
  • No sub-search sits at or above the extraction cap. (models/salesnav-companies.ts) A search returning exactly the cap is truncated. That is the failure this whole skill exists to prevent, and it is invisible unless you check the number.

Done when

  • the sub-search extractions sum to roughly the count of the original whole-market search
  • no sub-search returned exactly the cap, which would mean it is still truncated
  • promoted accounts appear in accounts with a website, deduped across overlapping sub-searches

What it costs

Counting is a fraction of a credit and is the cheapest insurance here. Promotion is the expensive step: every promoted company costs two credited calls (matchBusiness + enrichBusinessFirmographics), because Sales Nav returns no domain and both are needed to resolve one. A 5,000-company TAM is roughly 10,000 enrichment calls. That is the price of the outcome, not waste, but it is real money and it should be spent on purpose.

The control is upstream, where the rows are created: config.limit and how many sub-search URLs you add. To spend less, extract less. Start with one small sub-search, watch it land correctly, then widen.

Composes into

list-building (the same split tactic for people), contact-sourcing (the buyers at every account you just built), account-scoring, signal-based-tam (watch the universe you just built).

相关技能

把自然语言描述转为结构化 JSON,并由 mcp-diagram-generator MCP 服务生成 Draw.io、Mermaid 或 Excalidraw 图表文件。

作者 nssa.io1.0k 次安装47 星标

以 AI 机器人身份加入视频会议,提供语音、虚拟形象与屏幕共享四种模式。

作者 johnpatternai22 次安装8 星标

诊断生产力系统反复失效的根因,给出最小干预——容量测算、瓶颈定位、可靠的本地记录。

作者 Iván855 次安装69 星标

从 AdMapix API 拉取广告创意、应用、榜单和收入预估等数据,原样返回结构化 JSON。

作者 fly0pants4.3k 次安装296 星标

在本地磁盘以分类纯 Markdown 文件保存需要长期留存的事实,与智能体内置记忆并存。

作者 Iván559 次安装18 星标

cargo-ai 的更多技能

浏览全部技能

读写团队的 GTM 知识库——一个由 Git 管理的 Markdown 仓库,记录 ICP、人设、玩法、证据、异议等。

作者 cargo-ai16 次安装

用一个 CLI 表面执行、构建、绘制并查询 Cargo 工作流、动作、批量与 AI 代理。

作者 cargo-ai16 次安装

查找、认证并配置 Cargo 工作流节点所需的外部系统连接器。

作者 cargo-ai14 次安装

检查并修改 Cargo 工作区的数据模型,并对存储运行 SQL 查询。

作者 cargo-ai14 次安装

在 Cargo 上跑 B2B 拓客、联系人补全、线索打分与 CRM 同步,每一步都内置授权基础与抑制名单校验。

作者 cargo-ai13 次安装

通过 Cargo CLI 管理 AI agent、release、MCP server 与 memory。

作者 cargo-ai17 次安装