See your product through your buyers' eyes — before you build or ship it. Point it at a website, landing page, or product idea; it identifies who the thing is sold to, builds attribute-conditioned buyer personas, runs a synthetic purchase-intent panel, and returns scored segments, verbatim objections, a workflow-coverage gap map, a competitive read, and prioritized fixes.
buyer-lens is a Claude Code / Agent Skill: a folder of instructions, references, and a deterministic scoring script that an agent loads on demand.
The survey protocol implements semantic similarity rating (SSR) from:
Maier, B.F., Aslak, U., Fiaschi, L., Rismal, N., Fletcher, K., Luhmann, C.C., Dow, R., Pappas, K., Wiecki, T.V. — "LLMs Reproduce Human Purchase Intent via Semantic Similarity Elicitation of Likert Ratings", arXiv:2510.08338 (PyMC Labs ×ばつ Colgate-Palmolive).
What the paper measured, across 57 real consumer surveys (9,300 human respondents), and how buyer-lens applies it:
| Paper finding | What buyer-lens does |
|---|---|
| Asking an LLM for a 1–5 rating directly produces unrealistically narrow distributions — everything scores a confident 4 | Personas react in free text only; ratings are derived afterward |
| Mapping free text to a probability distribution over the Likert scale via anchor statements recovers ~90% of human test–retest reliability (KS similarity > 0.85) | Reactions are mapped to distributions against the anchor set in references/ssr-protocol.md; a script validates every distribution |
| Results replicate human panels only with persona conditioning; budget/income effects replicate best, age next, gender/region unreliably | Personas are built from workflows, tool stacks, and buying behavior (references/persona-schema.md); respondents vary on budget pressure, tenure, size, incumbent satisfaction — never on demographic vibes |
| Relative concept ranking is the trustworthy output; absolute intent levels are not | Reports rank segments and concept variants; caveats forbidding conversion-forecast readings are mandatory |
One honest divergence: the paper computes embedding cosine similarity to the anchors; buyer-lens has the model judge semantic closeness to the same anchors directly (no embedding service in an agent session). Every report says so.
Two evaluation dimensions extend the paper, learned from real runs: a workflow-coverage gap map (a page is also judged by the buyer workflows it never mentions — silence is data) and an incumbent/competitive read (reactions must name what the product would displace; vacuum intent isn't intent).
- Intake — you give it a URL (preferred) or a product description.
- Capture — it fetches the page as a buyer would see it (browser-first; plain fetch renders many SPAs empty), recording claims, integrations, and pricing — or the absence of pricing, which buyers read as "expensive."
- Personas — 2–4 buyer segments inferred from the page's own targeting, each built to the schema; unfamiliar domains are web-verified, not invented.
- Maps — workflow coverage (Covered / Named-only / Missing) and the incumbent frame, before any respondent reacts.
- Panel — N respondents per segment, perturbed on the axes that drive real variance, reacting independently in free text.
- Scoring —
scripts/panel_math.pyvalidates distributions and computes the headline table deterministically. - Report — ranked segments, verbatims, objection themes, and prioritized
suggestions tied to evidence.
--comparere-runs the same panel against a revised page.
See examples/sample-report.md for an abridged real output and
examples/sample-panel.json for the panel format.
git clone https://github.com/ujjwalks/buyer-lens.git ln -s "$(pwd)/buyer-lens" ~/.claude/skills/buyer-lens
In any Claude Code session:
Review https://yoursite.com/pricing as if you were my target customers — would they buy?
I'm building an invoicing tool for landscapers. Test the idea with a synthetic buyer panel.
Or run the scripts directly:
# score one panel python3 scripts/panel_math.py examples/sample-panel.json # before/after diff against a baseline python3 scripts/panel_math.py new.panel.json --compare examples/sample-panel.json # rank N concept/pricing variants (segment ×ばつ variant matrix) python3 scripts/panel_math.py v1.panel.json v2.panel.json v3.panel.json # elicit every respondent in its own fresh headless context (true independence) python3 scripts/panel_runner.py spec.json --plan # preview, no cost python3 scripts/panel_runner.py spec.json -o reactions.json
panel_runner.py exists because the SSR protocol's independence requirement
is better enforced by process isolation than by promising the model won't
peek: each respondent runs in a separate claude -p context and returns only
free text — the distribution mapping stays with the calling agent, and the
runner rejects any elicitation question containing scale language.
Re-measurement pending. The description was edited on 2026年08月01日 to add a boundary clause against signal-lens (a measured collision: an unaided model given "review my pricing page — would my target customers buy?" fired neither skill and produced a CRO teardown). The mechanism parenthetical was also dropped, because describing process in a description risks an agent following the summary instead of reading the skill. The numbers below were measured against the previous description and have not yet been re-run. Treat them as stale until they are.
Paired evaluation via skill-doctor's
harness (examples/eval-buyer-lens.json; claude-sonnet-4-6, 3 runs per prompt,
dry pass agents):
- Trigger rate: 15/15 positive prompts fired (100%); 0/6 negatives false-fired — the gate matches real phrasings ("validate my idea", "would people buy this") without hijacking adjacent requests (SEO, CSS fixes). Stable across three eval rounds (v1, post-review fixes, v2).
- Pass rate (v2 body): with-skill 100% of objective assertions vs
baseline 0% (Δ +100 pts) — unaided, the model produced none of the
protocol: no free-text-first elicitation, no SSR routing, no gap map, no
incumbent frame, no deterministic scoring, no relative-vs-absolute caveat.
Assertions accept either elicitation route (in-conversation free text, or
panel_runner.py, which enforces free-text mechanically).
Small-n and dry by design — re-run the spec yourself; trigger and pass are reported separately because they fail differently (description vs body).
panel_runner.py is live-verified end-to-end: isolated respondents produce
genuinely divergent, incumbent-grounded free-text reactions (a shopping VP
computed the per-location price against his signing authority; a change-averse
director defended her spreadsheet by name), at roughly 0ドル.05–0.06 per
respondent.
A synthetic panel is directional research, not a substitute for talking to
real buyers. Trust the relative rankings, the objection themes, and the
budget-pressure effects — the outputs the paper validated. Do not trust
absolute purchase-intent numbers as conversion forecasts, or any demographic
subgroup readout. And per the skill-evaluation literature: this skill's own
worth is only measurable by paired evaluation — examples/eval-buyer-lens.json
is a ready spec for skill-doctor's
eval harness.
python3 -m unittest discover -s tests -v # stdlib only, no depsSurvey method: Maier et al., arXiv:2510.08338. Skill design follows The Art of Writing Skills (progressive disclosure, delta rule, description-as-gate, express-as-code, paired evaluation) — the same field guide that powers skill-doctor.
MIT — see LICENSE.