
Competitor Watch
Weekly cross-surface competitor diff — website, pricing, changelog, ads, social, and the demand side (who ranks for "<them> alternative", what their leaving customers say). Every verdict is one of changed / unchanged / queued / not_disclosed / unavailable, and every "changed" traces to a real revision pair with additions/deletions counts. It never reports ad spend, because no ad library discloses it. GUIDANCE-ONLY: the agent's own LLM runs the decision tree in SKILL.md, AgentDocs supplies the diff engine, and 4 enforcement scripts gate the output. Backed by 32 live production probes and 30 evidence-bundled registry items.
I built this after watching competitor reports that were confidently, invisibly wrong. The usual failure is not a missing signal — it is a re-snapshot written in change-flavoured language. Someone describes what a competitor's pricing page says today, the reader infers novelty that was never established, and nobody can tell the difference by eye. So the first rule here is that "changed" has to be earned: it must trace to two AgentDocs revisions and the additions/deletions counts between them. If nothing changed, the substrate says so itself — an identical write creates no new revision at all.
The second rule came out of probing what these sources actually return. Meta discloses ad spend only for political ads, so 30 of 30 commercial ads carry a null there — and one field is non-null on every single ad while containing an impressions index of negative one. LinkedIn publishes flight dates and impressions only for EU-targeted ads, so an American competitor legitimately shows nothing, and reporting that as zero says "they stopped advertising" about a company running 24 ads. Both ad lists are recency-ordered samples — 30 of 377 on Meta, 40 of about 2,000 on Google — so week-over-week set subtraction on page one invents ads disappearing that never stopped. Every one of those is a place a report prints a confident wrong number, and four scripts exist to stop it.
Then there is the question the declared surfaces cannot answer: who is coming after them. Searching "<competitor> alternative" costs one credit and returns the companies publishing intercept content — including ones that buy no ads and are therefore invisible to every ad library. Reddit costs one more and returns the objection language in customers' own words, with the switch destinations named outright. That is where competitive intelligence stops being a report and starts being usable by a copywriter.
Features5
Every change traces to a revision pair with add/delete counts
No ad library discloses commercial spend, so it is never reported
queued and not_disclosed never collapse into unchanged
The alternative-to SERP surfaces entrants no ad library can find
Prints the credit cost first; a half-paginated scan corrupts the diff
Videos1 video
DemoCompetitor Watch · Demo video
Demo · SpiderMediaArticles about Competitor Watch4 articlesAll 4 →
A competitor summary is not competitive intelligence
di-atomic.comA competitor snapshot is NOT a competitor diff
opvs.ai8 Sep 2026A competitor summary is not competitive intelligence
Most competitor tracking produces a fluent weekly document that says roughly what last week's said. I built a role that structurally cannot write it: `changed` has to be earned from a real revision pair, and a week where nothing moved is filed as a finding.
Videos1 video
DemoCompetitor Watch · Demo video
Demo · SpiderMediaArticles about Competitor Watch4 articles
Showing all 4
SKILL.mdthe file your agent reads
SKILL.md loads when you open this tab.
What's new3 releases · newest first · from the package's CHANGELOG
v0.1.22026-11-09Latest
Marketplace listing update: added the launch explainer film (`media.demo_video_url`). No code, schema, copy or guidance changes; hero and screenshots unchanged from 0.1.1.
v0.1.12026-08-04
### Added - Marketplace card creatives: hero + 4 explanatory panels, rendered on the Di-Atomic dark-board chalk style and hosted on SpiderMedia. Same hero is reused as the blog cover and the listing hero - one render, three surfaces. No behaviour change. SKILL.md, references, recipes, registry, learnings and scripts are byte-identical to 0.1.0.
v0.1.0
First release. Weekly cross-surface competitor diff, guidance-only. **Six recipes** — weekly-scan · pricing-diff · ad-activity · content-velocity · steal-list · demand-side-signal. **Five verdicts** — `changed` · `unchanged` · `queued` · `not_disclosed` · `unavailable` (plus `baseline`). Three of them were discovered by probing production rather than designed, and each exists because collapsing it into `unchanged` produces a confident false statement. **AgentDocs is the diff engine**, not storage. An identical write creates no new revision, so "nothing changed" is a server-side fact keyed on a content hash; `pageDiff` returns the unified diff with counts. The build proved the whole chain live before authoring against it. **Four enforcement scripts**, all tested against real captured payloads rather than reviewed: `verify-competitor-set-declared` · `lint-non-attributable-claims` (9 rules) · `verify-diff-vs-prior-week` (9 rules) · `verify-parse-tolerance`. **Built on 32 live production probes.** What they changed: - Ad **spend** is unavailable on every platform — the skill will never emit one. Meta `spend` was null on 30 of 30 commercial ads. - Meta's `impressions_with_index` is non-null on 30 of 30 ads while containing `impressions_index: -1` — a sentinel that scores 100% on any presence-based completeness check. - LinkedIn's empty date fields are **jurisdictional**, not broken: Personio (Munich) disclosed 19/24, n8n (Berlin) 0/24, Zapier (US) 0/24. Per-ad EU targeting, not company country. - Ad lists are **recency-ordered samples** — Meta 30 of 377, Google 40 of ~2000 — so set-difference on page 1 invents ads disappearing that never stopped. - ScrapeCreators emits **strictly-invalid JSON** intermittently (4 of 19 responses failed `JSON.parse`; the YouTube payload needed 420 control-character repairs). Content-dependent, so it breaks the week a competitor uses a line break. - Website crawls are an **async queue** with no latency guarantee — one job sat `queued` with no worker for the whole observation window. **Scope note.** `demand-side-signal` was added during the build after auditing the scraping toolset as an instrument rather than as a given input. It costs ~3 credits and surfaces competitors that no ad library can see — companies publishing "*competitor* alternatives" content while buying no ads. **Boundary.** `@di-atomic/social-media-manager` keeps "what should we post" (social-only, monthly). This owns "what changed across their whole surface" (weekly, cross-surface) and is the only one that diffs or stores state. Marketing media is intentionally empty at 0.1.0 and lands in the next patch.
Showing all 3







