A competitor summary is not competitive intelligence
Most competitor tracking produces a document nobody reads twice. You get a weekly summary of four rivals, it is fluent, it is dated this week, and it says roughly what last week's said. So you skim it. Then a customer tells you on a renewal call that one of those four cut their price in March.
I built a role that cannot write that document. Below is what it is for, what you actually hire when you equip it, the six skills it carries, the four workflows it runs, and what your first 30 days look like.
Who this is for
You already know who you are up against. You do not need a market map, and you are not asking anyone to find your competitors for you. What you want is one reliable answer, every week, to a single question: what moved.
Today that job belongs to nobody. Or it belongs to a founder skim-reading four websites on a Sunday, which is the same thing with worse sleep.
Here is why that matters: the value of competitive intelligence is not in any one report. It is in the unbroken series. Week 12 is only worth reading if it is a difference against week 11. The moment the series breaks, every later report quietly becomes a fresh description of the world, and a fresh description of the world is something anyone can produce in five minutes without looking at anything.
What you hire when you equip this role
@di-atomic/competitive-intelligence-analyst tracks a competitor set that a human declared, and reports what changed on their website, their pricing page and their changelog since last week. Every surface gets exactly one of five verdicts: changed, unchanged, queued, not_disclosed, unavailable. Every claim carries a citation.
But there is a catch, and it is the whole design. The word changed is not something this role is allowed to decide.
Snapshots are written to pages whose addresses derive from competitor and surface, and nothing else. An identical write creates no new revision. So unchanged is a fact the server hands back for free, not a judgement an agent made by comparing two texts it was holding in its head. When a page does gain a revision, the report carries the revision pair and the add and delete counts, taken from the diff itself.
That single property is what makes the output worth acting on. It is also why the role proves it empirically before your first scan, in both directions, on a throwaway page: identical content must produce no revision, and different content must produce a pair. A substrate that never revisions would pass a lazier test and then report unchanged forever.
Two ordinary things would defeat this, and both get handled deliberately. A scan date written into a page body differs every week, so every page would diff forever, beaten by the one field guaranteed to vary. The date belongs in the commit message. And self noise on a live page, meaning session tokens, rotating banners, "N customers" counters, currency and geography state, A/B variants, does the same damage from the other end. Normalising it out is not tidiness. It is what stops you learning that changed means nothing, so that the week a real price moves is not the week you skim past it.

There is also a number this role will never give you. It will not report or estimate ad spend. No ad library discloses it for commercial ads, so any figure would be invented, and hedging it with a tilde or a range does not help: a range still reads as a measurement, and a number is exactly the part of a report that gets lifted out and repeated in a meeting. Pricing behind an enterprise contact form comes back as not_disclosed, which is a real finding and a stable one.
The toolkit
Six skills, each doing one job. Five are called; one is read.
@opvs-ai/agentboardholds the watch card: the declared set, the page address map, the credit ledger. Every write merges rather than replaces, because the default would destroy the set that intake wrote.@opvs-ai/agentdocsis the diff engine, not the filing cabinet. This is the piece most people mistake for storage, and it is the reason the verdicts mean anything.@opvs-ai/agentmemorycarries narrative priors only, meaning positioning shifts and angles. Never the snapshot, because it has no keyed read and would hand back a different "last week" on every run.@opvs-ai/opvs-protocolcarries the guild address and escalation.@spideriq/lead-gen-skillsreads the competitor's live page. A crawl and capture subset only.@di-atomic/competitor-watchis the craft: eight hard rules, the five verdict taxonomy, the disclosure limits, three enforcement scripts. Read, never called.

The four workflows
client-intake fires when an engagement starts. It loads the declared set, proves the diff substrate in both directions, and builds the week zero baseline. It emits no verdicts, because with one revision per page there is nothing to compare against yet. It blocks.
weekly-scan is the core operation. One line per competitor per surface, every verdict explicit, no surface silently dropped.
pricing-diff is the highest value slice, separating structural change from a numeric move from a positioning shift, each with its own revision pair.
insufficient-evidence fires when credits run short or a surface will not read. It classifies the shortfall and returns it. It never backfills the gap.
That last one is the one I would point at. Credits dying at competitor 7 of 12 is not an inconvenience to work around. It leaves half your set diffed and half not, and that hole is invisible in every report that follows. Refusing costs you one week. Backfilling costs you the series, silently, for as long as you keep reading it.

The guild address
The address is competitive-intelligence-analyst@profession.md.
Here is what that gets you. A profession is not a bundle of skills stapled together. It is an address that accumulates craft. What gets promoted back to the guild is the method: a normalisation rule that killed a class of false positives, a surface that turned out to be worth tracking. Never your competitor set, never your report, never anything a client owns.
So the role gets better at the job across every brand running it, while your data stays yours. That is the compounding half. Buy the skill and you get one good report. Equip the profession and you get a baseline that is worth more every week you do not skip it.
What v0.1.0 does not do
It covers website, pricing and changelog. Ad activity, content velocity and demand side search are written and working inside @di-atomic/competitor-watch, but they reach a data source with no marketplace package under any vendor, which means an installed profession cannot get to them. I checked all 98 published packages across the three vendors before deciding.
So this ships three surfaces instead of advertising six and quietly failing three. Ask for one of the missing ones and you get a refusal with the reason, recorded as a v0.2.0 request. That is the honest version, and the gap is the roadmap.
Equip it
opvs tools install @di-atomic/competitive-intelligence-analystYour first 30 days, plainly. Week one is intake: you declare the set, the substrate gets proved, the baseline gets built, and you receive no verdicts. Weeks two through four produce three scans, and the second one is the first report that is genuinely a difference rather than a description.
Expect some of those lines to read unchanged. That is the product working. A week where nothing moved, reported as a week where nothing moved, is a finding you can act on. It is also the one sentence a fetch and summarise bot will never write for you.