Surface & screens — what to build
mw.surface(...) picks the right kind of product to build — web, mobile, cli,
browser_extension, and so on — with a runner-up and the trade-offs. It judges the
call on five fixed questions: where your users already are, how technical they are,
how often they’d use it, whether it needs realtime or hardware, and how you’d
distribute it. mw.ux(...) then sketches the 3-5 screens you need, each with a one-line
purpose and a single primary action.
What you give it / what you get back
| Field | What it is |
|---|---|
surface.chosen / runner_up | The recommended product type and the second choice. |
surface.rubric[].finding | What the evidence says on each of the five questions. |
surface.rubric[].is_assumption | True when no real quote backs that finding — a stated guess, labeled. |
surface.confidence | How sure metalworks is, set from how many questions it could actually back with quotes. |
ux.screens[].validated | True when at least one real voice asked for that screen; False means it’s a hypothesis to test. |
ux.screens[].serves_wedge | True when the screen directly delivers your positioning. |
When the result is thin
This is the step with the least to stand on, so metalworks is deliberately strict: when the signal is thin, it under-claims — marking more findings as honest assumptions and dropping the whole recommendation topartial=True — rather than pinning a
confident “the users are here” on a loosely related comment.
Marketing site — every claim is a real quote
mw.site(...) drafts a small marketing page; mw.render_site(...) turns it into one
self-contained index.html you can open. The copy isn’t AI prose — every
claim-bearing line is a word-for-word quote from a real user, and each one renders
with a footnote linking back to the Reddit thread it came from, so any visitor is one
click from the real comment.
What you give it / what you get back
| Field | What it is |
|---|---|
site.sections[].role | What the section does: hero, feature, objection, pricing, social_proof, or cta. |
site.sections[].copy | The text. For a claimed section it contains a verbatim fragment of a real quote. |
site.sections[].provenance | verbatim (a cited real quote) or connective (claim-free glue between sections). |
When the result is thin
metalworks drops anything it can’t back with a real quote. If a line doesn’t exactly match a stored comment, that section is removed rather than shipped on the model’s word. If nothing matches at all, the site comes back empty withpartial=True and a
caveat — never an invented section, never a crash.