Landscape: the nested competitor_map (the real products people use today — each
with what it does well, a gap you can exploit, and the clusters it addresses) plus
existing_solutions (real shipped products from Product Hunt / the web, with traction, matched to
your demand clusters). It always includes the “do nothing” status-quo option, because the cost of
people sticking with their current habit is the real thing any new product has to beat.
Competitor names come from two grounded sources: a live web search AND the corpus itself (tools people literally name in their complaints). A name you can’t ground in either is dropped — no hallucinated rivals.
What you get back
metalworks only lists rivals it can ground — a name with no web result and no corpus mention is
dropped — and only keeps a gap when a real complaint backs it: every gap links to one verbatim quote
or a grounded web source. A gap nobody voiced gets dropped.
Per-fork saturation (advisory)
Because every competitor and product is cluster-tagged,assess can show
how crowded each fork is on its own: your indie-DX wedge might face Supabase/Neon while your
enterprise wedge faces RDS/Aurora. Each ForkVerdict carries its own landscape_saturation, so a
GO/NO-GO per fork shows whether that slice is open or crowded. (This per-fork saturation is
advisory today — the GO/NO-GO gate itself still uses the space-level number; the gate goes
per-fork in a follow-up once the attribution is proven stable.)
When the result is thin
If metalworks can’t confidently ground the named competitors, it still ships the “do nothing” alternative (always grounded in your report’s strongest pains) and the existing-solutions scan, flagging the rest withpartial=True and a caveat that the named set is unverified. You’re never
handed a confident-looking map built on invented rivals. The existing-solutions scan needs a Product
Hunt token; without one, that half is empty and the competitor map still holds.