To keep company and competitor context fresh, read the same pages every week (your own site, each competitor’s pricing and changelog, and the news about all of you), write each page to a file in your go-to-market repository, let git diff say what changed, and land the changes as one dated note in a pull request a human merges. The web capture cookbook deploys that as one Claude Code harness agent on a Monday cron, with two fixed reads that cost at most 0.625 credits a run.
The problem: the context your agents read (positioning, offerings, the ICP, who you compete with) goes stale the week after someone writes it, and nobody notices a competitor’s new pricing tier until a prospect mentions it. An agent with stale context writes confident copy about last quarter. For why context matters to agents at all, see contextualizing go-to-market agents.
How it works, end to end #
- Two fixed reads. One
parallel.extractcall withfullContentreads every listed URL in full: your pages (home, pricing, customers, careers, blog, changelog by default) and each competitor’s watched pages. Oneparallel.createTaskcall on theliteprocessor asks what you and each competitor announced, launched or were covered for since the last merged read. The commands are spelled out in the agent’s prompt, so every week reads the web the same way. - Code writes the files, not the agent. A fixed
node -eline writes each page tocadence/log/raw/web/pages/<page>.mdorcadence/log/raw/web/competitors/<name>/<page>.md, and the news tocadence/log/raw/web/news/<date>.json. No page text passes through the model on its way to disk, so a diff is a change on the site, not a retyping. - Git says what changed.
git diffagainst the default branch lists the pages that moved; a news URL that appears in no earlier file is new. The agent keeps what a reader would want (a new offering, a pricing change, a new customer, a repositioned headline) and drops footer dates and duplicates. - The first run seeds, every later run adds. The first run fills every empty
context/domain:global/(positioning, value proposition, offerings),icp/as an inferred profile with at least one disqualifier,alternative/,client/,proof/andsignal/. After that, each week adds oneinsight/<date>-web.md, one tagged line per finding, plus a file for a newly named customer or competitor. It never edits an existing file: a contradiction becomes a proposal in the pull request body. - Every sentence carries an evidence tag.
[R: <url>]when a page states it,[I: <from what>]when inferred,[TR: <what would settle it>]when unknown. Public pages are one source, so nothing is stated with the conviction of a deal. - One pull request, or none. The first run always opens one, because its files are the baseline. A quiet week opens none, and the next news window starts at the last merged read, so nothing is skipped. After a merge, the next
cargo-ai project deploysyncscontext/into the workspace context.
Run it #
npm install -g @cargo-ai/cli
cargo-ai login --email you@company.com # emailed code, no browser, 100 free credits, no card
cargo-ai project cookbook view web-capture
cargo-ai project init my-gtm --cookbook web-capture && cd my-gtm && npm install
# already have a Cargo project? from its root:
cargo-ai project add cookbook/web-capture
Then set three constants in infra/agents/web-scribe.prompt.ts (under infra/web-capture/ once installed): DOMAIN (your bare domain; the agent refuses to run on the placeholder), PAGES (your real sections, from the sitemap) and COMPETITORS (each competitor’s pricing and changelog URLs; it ships empty). Set languageModel, then cargo-ai project plan (one agent, two bound connectors, one folder) and cargo-ai project deploy. Run the first one by hand:
cargo-ai ai message create --agent-uuid <uuid> \
--parts '[{"type":"text","text":"Run the web capture. Follow your system prompt exactly."}]'
What it needs and what it costs #
| Needs | Why |
|---|---|
| An authorized GitHub connector | The agent’s only write path: a branch and a pull request |
| An authorized Anthropic connector | The harness runs on Cargo’s model proxy, billed to it |
A repository with context/ and cadence/ | The shape cargo-ai project init scaffolds |
No credential in .env, no CRM, no Slack. The reads are priced in code:
| Read | Credits |
|---|---|
parallel.extract | 0.025 per URL, a 404 included |
parallel.createTask, lite | 0.125 per run |
| One week at the 20-URL maximum | 0.625 |
parallel.extract takes at most 20 URLs per call, which is the cookbook’s cap across your pages and every competitor’s. The six default pages with no competitor cost 0.275 credits a week. The other cost is model usage for the harness run, which scales with how much changed. Switching the news question to the base processor doubles its price to 0.25; higher processors cost far more, which is why the prompt keeps lite.
What it will not do #
- It does not read a CRM, calls, an inbox or Slack. Verifying the ICP it seeds against won and lost deals is the monthly win-loss review.
- It does not edit, rename or delete an existing file under
context/, so what a human corrected stays corrected. - It does not write
persona/orjtbd/: job titles and jobs come from evidence it does not read. - It does not write the workspace context directly, contact anyone or merge its own pull request.
- It does not watch target accounts. News about accounts you sell to is monitoring buying signals.
The cookbook is marked to-be-approved: not yet deploy-verified against a live workspace. Read the plan before you deploy and walk its acceptance list after the first run.
Frequently asked questions #
An agent that fetches pages its own way, or retypes what it read, changes the shape of the text every week, and every tidy edit reads as a change on the site. Fixed commands with fullContent, and a node line that writes the files from the command output, make the weekly diff mean something.
As many as fit in 20 URLs in total, counting your own pages, because one parallel.extract call takes at most 20. Two pages per competitor (pricing and changelog) next to six of your own leaves room for seven competitors.
It opens no pull request and says no change this week. The next run’s news window starts at the last merged read, so the quiet week is covered rather than skipped.