competlab-battlecard — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited competlab-battlecard (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A sales rep, on the way into a call. Not a CMO, not a report, not a dossier. The rep scans it in sixty seconds and comes out knowing what to say, what they will hear, and what to ask.
That reader sets every rule below:
that only flatters loses the deal the moment the prospect knows something the rep does not.
Read references/reading-the-data.md. One rule matters more here than anywhere else in the suite: every figure carries its count. A rep who says "12% mention rate" is quoting a number we do not stand behind, and cannot answer out of what?. "Named in 8 of the 69 answers pooled across five checks" is a number that survives the follow-up question. On a call, an unsourced figure is a liability, not ammunition.
1. Resolve. mcp__competlab__list_projects → mcp__competlab__list_competitors to match the name or domain (the customer's own row is marked isOwn: true) → mcp__competlab__get_project for when each dimension last ran. Those dates go on the card beside the figures they produced.
2. Pull the four monitored surfaces.
mcp__competlab__get_pricing_dashboard — both sides' plans as a US buyer sees them, in the page'sown words and currency: the customer's entry and this rival's in item.companies[], and the two rows on each typical buyer setup in item.setups[], cheapest first — the rank is the check's, never yours. A side-by-side price line is the most-used row on the card. A company whose page could not be read shows its last read's facts, dated shownAsReadAt: put that date on the card, and never "they have no free plan". A change in item.changes[] goes on the card as the check wrote it, from X to Y with the two dates.
mcp__competlab__get_positioning_dashboard — what they claim on their homepage, in the page's ownwords (this rival's entry in item.companies[]). This is what the prospect already saw.
mcp__competlab__get_tech_trust_dashboard — stack, security headers, trust signals. A measured 0is a finding a rep can use. A null is an unread scan and belongs nowhere near a call.
mcp__competlab__get_content_dashboard — volume and categories, as a maturity signal, not a claim.3. AI Visibility — membership, not the score. mcp__competlab__get_ai_visibility_dashboard. Check summary.promptMarket first; unless its state is rivals_named_in_most_answers, leave this section off the card entirely rather than putting a shaky market read in a rep's mouth.
What belongs on a card is membership, in counts: which companies the AI models name in this category, and whether the customer and this rival are among them. Never the AI Visibility Score — it is a blended figure, it answers a question no prospect asked, and a rep cannot defend it. Order is by presence, never by position, and two brands whose ranges overlap are tied — say tied, do not pick.
Every page of the dashboard's map carries every tracked competitor an answer named. A rival missing from it was named in no answer: mcp__competlab__get_ai_visibility_trend gives its count, 0 of N — a count the card can carry, never "not measured".
4. AI Sources — where they are on the page and we are not. mcp__competlab__get_ai_sources_dashboard. If this rival is named on hosts that more than one engine reads for this market and the customer is not, that is concrete, checkable, and lands on a call. Per engine, never pooled — Perplexity and Google AI Overviews read different pages. Retrieved, never cited: the engines do not say which pages they leaned on, so there is no citation count to quote.
5. What real users say. mcp__competlab__get_briefing with sections: ["competitors", "deep-customer-voice"] — praise, complaints and switching stories the platform already researched, with history behind them. Check meta.status: on running or failed the item is null, which is not "no briefing" — build the card from the dimensions and move on.
6. Date the price before a rep quotes it. Every price on the card carries the readAt of the read it came from, and the check reads as a visitor from the US. If you open their pricing page with mcp__competlab__fetch_url (cleanHtml: true) to see it today, know that this fetch is not from the US: a different currency or amount is the vantage, not a change. A change goes on the card only as the check wrote it, with its two dates. A rep quoting a price that changed last week loses the room.
7. Gaps only. WebSearch for an objection nothing above answers. Verify anything it returns with the fetch above, and drop what does not verify — a rep will repeat this to a prospect.
8. Build the card. Read references/battlecard-templates.md for the format options.
# Battlecard: {Our brand} vs {Competitor}
> Pricing run {date} · Positioning run {date} · Tech & trust run {date} · AI checks {date range}
## At a glance
| | {Our brand} | {Competitor} |
|---|---|---|
| **Pricing** | {plans and prices as the page shows them, with the read date} | {the same} |
| **Free plan / trial** | {the page's own line, or "shown as read on {date}"} | |
| **Who they sell to** | {from positioning} | |
| **They claim** | {their headline, their words} | |
| **Trust signals found** | {n of the signals the scan checked} | |
| **Named by AI models** | {named in n of N answers} | {named in n of N answers} |
## Why we win
- **{Advantage}:** {the measurement behind it, with its count and date} → *Say: "{the line}"*
## Where they are strong — be ready
- **{Their real strength}:** {what the prospect will hear} → *Our answer: "{the line}"*
## Objections
### "Why not just use {Competitor}?"
### "{Competitor} is cheaper"
### "{Competitor} has more features"
### "{Competitor} is the bigger name"
> {2–3 spoken sentences under each}
## Feature comparison
| Feature | {Our brand} | {Competitor} | Edge |
{8–12 rows, decision-relevant only}
## Killer facts
- {One fact per line, each with its count, its universe and its date.}
## Landmines
- "{A question the rep asks the prospect that surfaces a gap we measured.}"rep's credibility the first time a prospect knows better. Name two or three real strengths.
not "12% of the time". The question set is small by design and a share off it is false precision.
of those do not exist and the fourth cannot be defended.
site" are different sentences, and only one of them is safe to say to a prospect.
3–5, tied to what this card actually showed, and aimed at the person who owns the sales motion:
"Their entry price is below ours on every plan and the trust-signal gap runs the other way. That makes this a value conversation, not a price one — which means the rep needs the security proof in the first ten minutes. Is that how the current deck is ordered?"
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.