Positioning — your angle
What you give it / what you get back
You give it theresearch bundle. You get back a PositioningBrief:
| Field | What it is |
|---|---|
pos.positioning_statement | The full one-sentence positioning: who it’s for and why it’s different. |
pos.wedge | The pieces of that angle — unique_attribute (what you do differently), value (why it matters), beachhead (the narrow first audience to win), competitive_alternative (what they use today). |
pos.price_hypothesis | A read on what to charge, carried over from the price talk in your report. |
When the result is thin
If every strong need in your report is already well-served by the market, there’s no real opening — and metalworks tells you so instead of manufacturing an angle. The brief comes back withpos.wedge = None, partial=True, and a caveat suggesting you
either broaden the search or treat the market as commoditized. Same for price: if
your report didn’t see enough price talk, price_hypothesis says so plainly rather
than guessing a number.
Competitors — the rivals to beat
CompetitorMap: the real products people use today, each with what it
does well and a gap you can exploit — and that gap is always backed by an actual
complaint someone posted. It also always includes the “do nothing” option, because
the cost of people sticking with their current habit is the real thing any new product
has to beat.
What you give it / what you get back
| Field | What it is |
|---|---|
comp.competitors[].name / .kind | The rival and its type: direct, adjacent, or status_quo (do nothing). |
comp.competitors[].strengths | What that competitor does well. |
comp.competitors[].gaps[].claim | A gap you can exploit — phrased as what the rival misses. |
comp.competitors[].gaps[].severity | How big the gap is, set from how many people complained about it (not a model’s opinion). |
When the result is thin
If metalworks can’t confidently ground the list of named competitors, it still ships the “do nothing” alternative (always grounded in your report’s strongest pains) and flags the rest withpartial=True and a caveat telling you the named set is unverified.
You’re never handed a confident-looking map built on invented rivals.