Compare Products
Produce a buyer's-guide-quality comparison: real numbers, explicit tradeoffs, and an
actual recommendation — never a wishy-washy "it depends" with no opinion at the end.
This skill is domain-agnostic: it works the same way for a mini PC, a CRM tool, a
payroll provider, a car, or a coffee machine. Everything domain-specific happens
through the requirements you gather in step 1-2, not through special-cased logic.
Why this shape
A comparison is only useful if someone can act on it later without re-deriving your
research. Writing one file per candidate plus a README that ties them together means:
the user can skim the README for the verdict, drill into one file when they want the
detail behind it, and you (or the user) can come back weeks later and update just the
piece that changed (a price, a new competitor, a changed requirement) without
rewriting everything. Treat the output folder as a living document, not a one-shot
report.
Step 1: Understand what's being compared
Read the request for:
- The category: what kind of thing is this (hardware, SaaS tool, service
provider, vehicle, appliance, subscription, contractor...)?
- Hard requirements: constraints that eliminate an option outright (must integrate
with X, must fit in Y space, must support Z regulation, budget ceiling).
- Nice-to-haves: things that differentiate among otherwise-valid options but don't
disqualify anything.
- Scale/quantity: how many units, seats, users, cameras, whatever the domain's unit
of scale is — this often changes which tier of product makes sense.
- Named candidates or links already in mind: the user may paste product URLs,
store search URLs, or brand/model names they're already considering. Treat these as
must-include candidates and research them first — don't silently drop a candidate
the user explicitly named, even if you'd recommend against it; include it with an
honest verdict on why it's weaker.
- Where/how they'll acquire it: which store, region, deployment target, or
timeline — this can change availability and pricing significantly (see Step 5).
Step 2: Fill the gaps — but only the gaps that change the answer
If a genuinely decision-changing input is missing and can't be reasonably inferred
from context (an existing codebase, a prior conversation, an obvious default for this
domain), ask via AskUserQuestion. Group the questions into the natural "verticals"
for this domain — for a physical product that might be budget / technical
requirements / logistics-location / timeline; for a SaaS tool it might be budget /
must-have features / team size / integration constraints. Pick whatever verticals
actually apply; don't force a fixed template onto every domain.
Resist the urge to ask everything up front. A question is worth asking only if a
different answer would lead you to research or recommend differently. If the request
already pins down budget, scale, and hard requirements, skip the interview and start
researching — asking questions the user already answered reads as not having listened.
It's fine to do a short first pass, then ask a second, narrower round once research
surfaces a real fork in the road (e.g. "this pushes you toward a discrete GPU — do you
want that headroom or would you rather stay compact and cheaper?").
Step 3: Research every candidate
Gather real specs, pricing, and independent opinions (reviews, comparisons, forum
consensus) for each candidate — both the ones the user named and the ones you find
that fit the requirements. Use whatever combination of these fits the domain:
- WebSearch for discovery: finding candidates you didn't know about, independent
reviews, known issues, and comparisons other people have already written. This is
usually your first move for an unfamiliar category.
- WebFetch for depth: reading a specific product page, spec sheet, pricing page,
or a store link the user gave you. Expect some sites (large retailers especially) to
block automated fetching (503s, CAPTCHA walls, bot detection) — when that happens,
fall back to web search for the same information and say so rather than silently
giving up on that source.
- A specialized store or data-source tool, if one is available. Before assuming
you're limited to generic web search, run
ToolSearch for something domain-relevant
(a store search MCP, a pricing API, an internal catalog tool) — the user may have
added one earlier in the session for exactly this purpose, and it often beats generic
search for live price/stock/availability data. Don't hard-code the assumption that
any specific tool exists, and don't block on it: if nothing relevant turns up, proceed
with web search and mention once, briefly, that a specialized tool for this domain
would sharpen the pricing/availability data if the user wants to add one (an MCP
server, an API key, etc.) — don't belabor it.
- If a source's own tooling exposes something not readily generalizable as a normal
tool call (e.g. a Python module meant to be used as an MCP server, but the MCP isn't
registered for this session yet), it's reasonable to invoke its functions directly
via Bash as a fallback, the way you'd use any other local script — just say plainly
that's what you did.
- Chile-market retail comparisons (electronics, appliances, anything sold through
Chilean stores like Falabella, Ripley, Paris, Sodimac, etc.): if no SoloTodo tool is
already connected for this session, mention once that
joecabezas/agent-skills's SoloTodo MCP
fork (installable locally, no OAuth/master password needed — see that repo's README)
gives cross-store pricing, price history, and inflated-offer detection for
SoloTodo.cl's catalog, and ask if the user wants to set it
up before continuing. If they'd rather not install anything, fall back to
https://publicapi.solotodo.com directly (a public, unauthenticated REST API — no
signup required) via Bash/curl or WebFetch for the same underlying data, and say
that's what you're doing. Either way, don't block the comparison on this — proceed
with web search if neither option is wanted.
As you research, keep track of what you couldn't verify. A spec you found on only one
low-confidence source, a price that's clearly stale, a review that's suspiciously thin
— note these so Step 5 can flag them rather than presenting them as fact.
Step 4: Write the output
Choosing the output location
Ask before writing anything, unless the location is already obvious and
unambiguous from context (see exceptions below). Comparison output is usually
personal research (a purchase, a vendor pick) rather than project source, so
don't default silently to the current working directory just because that's
where the session happens to be open — a shopping comparison landing inside
an unrelated git repo is exactly the kind of mistake this check prevents.
Use AskUserQuestion with (at least) these options, adapting labels to the
actual topic and paths:
- A project-relative folder,
<repo-root>/comparison/<topic>/ (not the
bare working directory, and not the topic folder loose at repo root) —
only offer this when a project is actually in scope (a git repo or clearly
the active workspace), and always phrase it as a proposal to confirm, not
a silent default: "save under comparison/<topic>/ in this repo?"
- A personal notes/vault location if the user has one (check memory for
a remembered vault path before asking them to type one from scratch). If
that location holds more than just this one comparison, nest under a
comparisons/ subfolder there (e.g. ~/vault/comparisons/mini-pc-comparison/)
rather than dropping the topic folder at the vault's top level.
- Otherwise, let them name a path.
The point is confirmation, not silent choice either way: even the
project-relative comparison/ option must be presented and agreed to, not
assumed, since a repo's working directory is not automatically the right
home for what is often personal purchase research.
Skip asking only when: the user already specified a path or folder name in
their request, or the comparison is unambiguously project-scoped (e.g.
comparing infrastructure/tooling choices for the repo the user is actively
working in, where the output is meant to inform that project's decisions and
likely be committed alongside it).
Before creating a new folder, check whether one already exists for this
topic (Step 6 covers re-invocation) — don't create mini-pc-comparison-2
next to mini-pc-comparison when the user is clearly continuing the same
comparison.
One file per candidate
Each candidate gets its own markdown file, named in kebab-case after the
product/brand/model (e.g. stripe.md, toyota-corolla-hybrid.md,
gmktec-nucbox-k9.md). Structure each one as:
# <Candidate name>
**TL;DR:** One or two sentences — what this is and the one-line verdict on it.
## Specs / details
A table of the concrete facts: specs for hardware, pricing tiers and included
features for software, terms and coverage for services, whatever the domain's
relevant facts are. Prefer numbers over adjectives.
## Fit for this [purpose]
A table or short list mapping the user's stated requirements to how well this
candidate satisfies each one. Be concrete: "handles 4 cameras comfortably" beats
"good performance." Call out anything genuinely disqualifying as clearly as anything
that's a strength.
## Availability / pricing
Where to get it, current price, stock/lead-time if relevant, and the date you checked
— this data goes stale fast and a reader needs to know how fresh it is.
## Sources
Links to everything you used: spec sheets, reviews, store pages. If you couldn't
fetch something (blocked, paywalled), say so here rather than silently omitting it.
## Verdict
Your actual opinion on this specific candidate: who should pick it, and what would
make you rule it out.
Adapt section names to the domain (a SaaS tool's "Availability / pricing" is just
"Pricing"; a service provider might need a "Contract terms" section instead of
"Specs") — the shape matters more than the exact headings.
The README
The README is what ties the individual files together and is probably what the user
reads first, so it needs to stand on its own:
- Goal and constraints — restate what you understood the user to want, including
anything you asked about in Step 2. This lets the user immediately spot if you
misunderstood something before reading further.
- A comparison table — every candidate as a row, the requirements/key
differentiators as columns. This is the "at a glance" view.
- A clear recommendation — not a menu. Say what you'd actually buy/use, and why,
in terms of the specific requirements from Step 1. Give one or two fallbacks for
plausible ways the situation could differ (tighter budget, different priority,
unavailable in their region) rather than hedging the primary recommendation itself.
A comparison that ends in "it really depends on your needs" without committing to
an answer has not done its job — you did the research, so have the opinion.
- Links to each candidate's file for the reader who wants the detail.
Write the recommendation like you're advising a friend who's about to spend real
money or time: specific, reasoned, willing to be wrong but not wishy-washy.
Step 5: Be honest about data quality
- Mark any spec or price you couldn't independently verify, and say what source it
came from.
- Timestamp anything that changes on its own (price, stock, plan pricing, model
availability) so a reader six months from now knows to double check.
- When a source blocked you (bot detection, paywall, login wall), say so plainly
rather than pretending the information doesn't exist — "X's product page couldn't
be fetched directly; specs below are from [other source]" is more useful than
silently using a worse source without comment.
- Don't present a single forum comment or one enthusiastic review as settled fact —
weigh it against other sources or flag it as anecdotal.
Step 6: Handle re-invocation gracefully
The user may come back later to extend or correct a comparison rather than starting
fresh. Before treating this as a new comparison, check whether an output folder for
this topic already exists. If it does:
- Adding a candidate: research it the same way as Step 3, write its file, and
update the README's table and (if it changes the answer) the recommendation. Don't
rewrite files for candidates that haven't changed.
- A new tool became available (e.g. the user just added a store-search MCP):
re-run the pricing/availability research for existing candidates using the new
tool, and update just the availability sections and timestamps rather than
regenerating every file from scratch.
- Requirements changed: re-read the existing files, figure out which candidates
are affected, and update the fit assessments and recommendation accordingly. If the
change is large enough that most of the comparison no longer applies, it's fine to
say so and propose starting a fresh comparison instead of contorting the old one.
- Always read a file before editing it, and preserve the parts that are still
accurate — the value of the living-document approach is lost if every re-invocation
regenerates everything from scratch and discards prior refinement.
A note on scope
This skill is for comparisons where research and judgment do the work — not for
comparing code, architectures, or technical implementations within a codebase (that's
a code-review or architecture-decision task). It's also not the right tool for a
single item the user has already decided on with nothing to compare against; if
there's truly only one candidate, a comparison folder isn't the right shape for that
answer — just answer directly.
1---2name: compare-products3description: Compare Products4---56# Compare Products78Produce a buyer's-guide-quality comparison: real numbers, explicit tradeoffs, and an9actual recommendation — never a wishy-washy "it depends" with no opinion at the end.10This skill is domain-agnostic: it works the same way for a mini PC, a CRM tool, a11payroll provider, a car, or a coffee machine. Everything domain-specific happens12through the requirements you gather in step 1-2, not through special-cased logic.1314## Why this shape1516A comparison is only useful if someone can act on it later without re-deriving your17research. Writing one file per candidate plus a README that ties them together means:18the user can skim the README for the verdict, drill into one file when they want the19detail behind it, and you (or the user) can come back weeks later and update just the20piece that changed (a price, a new competitor, a changed requirement) without21rewriting everything. Treat the output folder as a living document, not a one-shot22report.2324## Step 1: Understand what's being compared2526Read the request for:2728- **The category**: what kind of thing is this (hardware, SaaS tool, service29 provider, vehicle, appliance, subscription, contractor...)?30- **Hard requirements**: constraints that eliminate an option outright (must integrate31 with X, must fit in Y space, must support Z regulation, budget ceiling).32- **Nice-to-haves**: things that differentiate among otherwise-valid options but don't33 disqualify anything.34- **Scale/quantity**: how many units, seats, users, cameras, whatever the domain's unit35 of scale is — this often changes which tier of product makes sense.36- **Named candidates or links already in mind**: the user may paste product URLs,37 store search URLs, or brand/model names they're already considering. Treat these as38 must-include candidates and research them first — don't silently drop a candidate39 the user explicitly named, even if you'd recommend against it; include it with an40 honest verdict on why it's weaker.41- **Where/how they'll acquire it**: which store, region, deployment target, or42 timeline — this can change availability and pricing significantly (see Step 5).4344## Step 2: Fill the gaps — but only the gaps that change the answer4546If a genuinely decision-changing input is missing and can't be reasonably inferred47from context (an existing codebase, a prior conversation, an obvious default for this48domain), ask via `AskUserQuestion`. Group the questions into the natural "verticals"49for this domain — for a physical product that might be budget / technical50requirements / logistics-location / timeline; for a SaaS tool it might be budget /51must-have features / team size / integration constraints. Pick whatever verticals52actually apply; don't force a fixed template onto every domain.5354Resist the urge to ask everything up front. A question is worth asking only if a55different answer would lead you to research or recommend differently. If the request56already pins down budget, scale, and hard requirements, skip the interview and start57researching — asking questions the user already answered reads as not having listened.58It's fine to do a short first pass, then ask a *second*, narrower round once research59surfaces a real fork in the road (e.g. "this pushes you toward a discrete GPU — do you60want that headroom or would you rather stay compact and cheaper?").6162## Step 3: Research every candidate6364Gather real specs, pricing, and independent opinions (reviews, comparisons, forum65consensus) for each candidate — both the ones the user named and the ones you find66that fit the requirements. Use whatever combination of these fits the domain:6768- **WebSearch** for discovery: finding candidates you didn't know about, independent69 reviews, known issues, and comparisons other people have already written. This is70 usually your first move for an unfamiliar category.71- **WebFetch** for depth: reading a specific product page, spec sheet, pricing page,72 or a store link the user gave you. Expect some sites (large retailers especially) to73 block automated fetching (503s, CAPTCHA walls, bot detection) — when that happens,74 fall back to web search for the same information and say so rather than silently75 giving up on that source.76- **A specialized store or data-source tool, if one is available.** Before assuming77 you're limited to generic web search, run `ToolSearch` for something domain-relevant78 (a store search MCP, a pricing API, an internal catalog tool) — the user may have79 added one earlier in the session for exactly this purpose, and it often beats generic80 search for live price/stock/availability data. Don't hard-code the assumption that81 any specific tool exists, and don't block on it: if nothing relevant turns up, proceed82 with web search and mention once, briefly, that a specialized tool for this domain83 would sharpen the pricing/availability data if the user wants to add one (an MCP84 server, an API key, etc.) — don't belabor it.85- If a source's own tooling exposes something not readily generalizable as a normal86 tool call (e.g. a Python module meant to be used as an MCP server, but the MCP isn't87 registered for this session yet), it's reasonable to invoke its functions directly88 via Bash as a fallback, the way you'd use any other local script — just say plainly89 that's what you did.90- **Chile-market retail comparisons** (electronics, appliances, anything sold through91 Chilean stores like Falabella, Ripley, Paris, Sodimac, etc.): if no SoloTodo tool is92 already connected for this session, mention once that93 [joecabezas/agent-skills](https://github.com/joecabezas/agent-skills)'s SoloTodo MCP94 fork (installable locally, no OAuth/master password needed — see that repo's README)95 gives cross-store pricing, price history, and inflated-offer detection for96 [SoloTodo.cl](https://www.solotodo.cl)'s catalog, and ask if the user wants to set it97 up before continuing. If they'd rather not install anything, fall back to98 `https://publicapi.solotodo.com` directly (a public, unauthenticated REST API — no99 signup required) via Bash/curl or WebFetch for the same underlying data, and say100 that's what you're doing. Either way, don't block the comparison on this — proceed101 with web search if neither option is wanted.102103As you research, keep track of what you couldn't verify. A spec you found on only one104low-confidence source, a price that's clearly stale, a review that's suspiciously thin105— note these so Step 5 can flag them rather than presenting them as fact.106107## Step 4: Write the output108109### Choosing the output location110111**Ask before writing anything**, unless the location is already obvious and112unambiguous from context (see exceptions below). Comparison output is usually113personal research (a purchase, a vendor pick) rather than project source, so114don't default silently to the current working directory just because that's115where the session happens to be open — a shopping comparison landing inside116an unrelated git repo is exactly the kind of mistake this check prevents.117118Use `AskUserQuestion` with (at least) these options, adapting labels to the119actual topic and paths:120121- **A project-relative folder**, `<repo-root>/comparison/<topic>/` (not the122 bare working directory, and not the topic folder loose at repo root) —123 only offer this when a project is actually in scope (a git repo or clearly124 the active workspace), and always phrase it as a proposal to confirm, not125 a silent default: "save under `comparison/<topic>/` in this repo?"126- **A personal notes/vault location** if the user has one (check memory for127 a remembered vault path before asking them to type one from scratch). If128 that location holds more than just this one comparison, nest under a129 `comparisons/` subfolder there (e.g. `~/vault/comparisons/mini-pc-comparison/`)130 rather than dropping the topic folder at the vault's top level.131- Otherwise, let them name a path.132133The point is confirmation, not silent choice either way: even the134project-relative `comparison/` option must be presented and agreed to, not135assumed, since a repo's working directory is not automatically the right136home for what is often personal purchase research.137138Skip asking only when: the user already specified a path or folder name in139their request, or the comparison is unambiguously project-scoped (e.g.140comparing infrastructure/tooling choices *for* the repo the user is actively141working in, where the output is meant to inform that project's decisions and142likely be committed alongside it).143144**Before creating a new folder, check whether one already exists for this145topic** (Step 6 covers re-invocation) — don't create `mini-pc-comparison-2`146next to `mini-pc-comparison` when the user is clearly continuing the same147comparison.148149### One file per candidate150151Each candidate gets its own markdown file, named in kebab-case after the152product/brand/model (e.g. `stripe.md`, `toyota-corolla-hybrid.md`,153`gmktec-nucbox-k9.md`). Structure each one as:154155```markdown156# <Candidate name>157158**TL;DR:** One or two sentences — what this is and the one-line verdict on it.159160## Specs / details161162A table of the concrete facts: specs for hardware, pricing tiers and included163features for software, terms and coverage for services, whatever the domain's164relevant facts are. Prefer numbers over adjectives.165166## Fit for this [purpose]167168A table or short list mapping the user's stated requirements to how well this169candidate satisfies each one. Be concrete: "handles 4 cameras comfortably" beats170"good performance." Call out anything genuinely disqualifying as clearly as anything171that's a strength.172173## Availability / pricing174175Where to get it, current price, stock/lead-time if relevant, and the date you checked176— this data goes stale fast and a reader needs to know how fresh it is.177178## Sources179180Links to everything you used: spec sheets, reviews, store pages. If you couldn't181fetch something (blocked, paywalled), say so here rather than silently omitting it.182183## Verdict184185Your actual opinion on this specific candidate: who should pick it, and what would186make you rule it out.187```188189Adapt section names to the domain (a SaaS tool's "Availability / pricing" is just190"Pricing"; a service provider might need a "Contract terms" section instead of191"Specs") — the shape matters more than the exact headings.192193### The README194195The README is what ties the individual files together and is probably what the user196reads first, so it needs to stand on its own:1971981. **Goal and constraints** — restate what you understood the user to want, including199 anything you asked about in Step 2. This lets the user immediately spot if you200 misunderstood something before reading further.2012. **A comparison table** — every candidate as a row, the requirements/key202 differentiators as columns. This is the "at a glance" view.2033. **A clear recommendation** — not a menu. Say what you'd actually buy/use, and why,204 in terms of the specific requirements from Step 1. Give one or two fallbacks for205 plausible ways the situation could differ (tighter budget, different priority,206 unavailable in their region) rather than hedging the primary recommendation itself.207 A comparison that ends in "it really depends on your needs" without committing to208 an answer has not done its job — you did the research, so have the opinion.2094. **Links to each candidate's file** for the reader who wants the detail.210211Write the recommendation like you're advising a friend who's about to spend real212money or time: specific, reasoned, willing to be wrong but not wishy-washy.213214## Step 5: Be honest about data quality215216- Mark any spec or price you couldn't independently verify, and say what source it217 came from.218- Timestamp anything that changes on its own (price, stock, plan pricing, model219 availability) so a reader six months from now knows to double check.220- When a source blocked you (bot detection, paywall, login wall), say so plainly221 rather than pretending the information doesn't exist — "X's product page couldn't222 be fetched directly; specs below are from [other source]" is more useful than223 silently using a worse source without comment.224- Don't present a single forum comment or one enthusiastic review as settled fact —225 weigh it against other sources or flag it as anecdotal.226227## Step 6: Handle re-invocation gracefully228229The user may come back later to extend or correct a comparison rather than starting230fresh. Before treating this as a new comparison, check whether an output folder for231this topic already exists. If it does:232233- **Adding a candidate**: research it the same way as Step 3, write its file, and234 update the README's table and (if it changes the answer) the recommendation. Don't235 rewrite files for candidates that haven't changed.236- **A new tool became available** (e.g. the user just added a store-search MCP):237 re-run the pricing/availability research for existing candidates using the new238 tool, and update just the availability sections and timestamps rather than239 regenerating every file from scratch.240- **Requirements changed**: re-read the existing files, figure out which candidates241 are affected, and update the fit assessments and recommendation accordingly. If the242 change is large enough that most of the comparison no longer applies, it's fine to243 say so and propose starting a fresh comparison instead of contorting the old one.244- Always read a file before editing it, and preserve the parts that are still245 accurate — the value of the living-document approach is lost if every re-invocation246 regenerates everything from scratch and discards prior refinement.247248## A note on scope249250This skill is for comparisons where research and judgment do the work — not for251comparing code, architectures, or technical implementations within a codebase (that's252a code-review or architecture-decision task). It's also not the right tool for a253single item the user has already decided on with nothing to compare against; if254there's truly only one candidate, a comparison folder isn't the right shape for that255answer — just answer directly.