goes to another screengoes to another state of this screenfaded = not mocked yetEverything else — filters, sorts, tabs, modals — works, it just stays on this screen. The URL always names the state you are on, so any view can be copied and shared.
Same brand and name against a different formula record — 120 capsules rather than 60. That is a different physical product with its own FP SKU: usually deliberate, occasionally the wrong formula picked from the list.
Who acknowledged, and when, is recorded on the product.
MR-056 / MR-059 / MR-348 — design notes
Add a product to the catalog. Sources: CATALOG-PRODUCT-CREATE.md (MR-055) · QUICKBOOKS-FP-SETUP.md (MR-054) · SOURCE-FORMULA.md · grilling session 2026-09-01 (D2, D6, D7, D12, D14, D16) · Sourcing round 2026-09-12 (MR-348).
MR-398 — a free-only product is checked for shipping, not selling
One rule in the shared checklist. Set Sold on its own to No and, after Create, the Setup & gaps drawer asks only for the front image, weight and size — not a formula, Form, unit, label panel, Active ingredients or Research by — and says Ready to use as a free item. The steps on this form are unchanged. RI-801
MR-394 — Sold on its own replaces Gift eligible
A free item is a role in a listing, not a kind of product (Paul, 2026-09-14). The product says only whether it is sold on its own: No for a gift bag or a sample. Such a product is left out of the products a listing sells and is always offered as Free with this listing. Which product goes free in a given listing — the gift bag, a sample, or surplus stock we normally sell — is the listing’s choice. RI-786 · RI-787
Gift eligible is gone: nothing read it (neither listing builder), and the note that said the package builder did was wrong. RI-788
MR-393 — Instructions, and Markdown for the Ingredients panel
Instructions sit under the label panel on the Formula / Facts step (Paul, 2026-09-14). On Labeled by us they are a copy of the linked formula’s, editable, saying matches SF-0044 or edited with Reset to formula; picking another formula re-seeds them. On Arrives finished they are typed here, and a real product starts from its label’s directions. RI-783
The Ingredients panel has Table / Markdown: a line per ingredient, bold for Active, or the label’s list pasted as one comma-separated line. RI-782
MR-392 — a plain name field, categories on How it sells, the SKUs Create makes, bracketed notes
Product name is a plain field (Paul, 2026-09-14: it looked like a search to select a product, which this field never is). Similar names are shown in their own Possible matches in the catalog box under it, each with an Open link that opens a new tab. That is the tested create-with-duplicate-check pattern: Stack Overflow’s Similar questions, Jira’s similar issues, Salesforce’s possible duplicates. Brand stays a pick-list: an existing brand is chosen. RI-778 · RI-781
Categories are picked on How it sells, from a closed categories list in _tagfield.js whose rows carry their branch. Ticking Category under Research by prints the full paths research reads. The tree now has three copies (this, categories.html and the record’s drawer) — open. RI-777
Step 6 shows What Create makes: the product, the QuickBooks item on the next FP SKU (or a link, if QuickBooks has it), the ShipStation product and the RW SKU. The FP SKU comes from the same fixture the Setup & gaps drawer mints from; a failure opens that drawer rather than a new one. RI-780
Unit spec on Arrives finished is a number and a Counted / Measured unit, drawn by MRMeasure (data-measure="unit"). The source formula still has its own copy — open. RI-779
Development notes left on the page are bracketed (.devnote, MOCKUP-GUIDANCE §0b): the four Research by explanations.
Fixes. The benefit field went blank after moving between steps: returning the modules to the bank also took m-ben out of its card, which is why benefits could not be selected. Only whole modules move now. A linked formula with no ingredient list no longer marks the Formula step done. SF-0051 is 60 capsules at 3 a serving, so 20 servings per container, not 30.
Gift eligible was held here, then settled by MR-394: it is now Sold on its own.
MR-391 — the Images step starts with Front, the panel and Side
Three empty slots are preset (Paul, 2026-09-14): Front, the label panel’s slot and Side. The panel slot follows the product’s panel — Supplement Facts, Ingredients, or none on Product details — the same rule as a gallery set (RI-715). The list is MRImageTaxonomy.baseSlots, read through baseSlotsFor(panel), not a copy on this screen (RI-230). An empty slot opens the picker and the image keeps that slot’s type. RI-775
MR-373’s flexibility stays. A filled slot’s type is still a select over every listable type, Add another image still takes any type, and the rest of the form’s suggested set (Lifestyle, and Size on a topical; Back, In the box, In use, Size and Lifestyle on a hard good) stays as Also suggested chips.
An added image is no longer cropped (RI-776). It was drawn cover at 4:5 with the file name laid over it, and at the 178 px tile the header’s Set as main pushed the main badge off the edge. Now the image is contain on white at the product record’s own 1460:1600 (.role .ph), the file name sits under it, and Set as main and Remove share the line below, so the header holds only the type and the main badge.
The picker has no Side type in its catalog-product list (MR-367’s pre-split roles), so the Side slot opens it with no type preselected; the image takes Side from the slot regardless.
MR-390 — step 6 is a recap, one layout, and the notes leave the page
Step 6 recaps what is done and what is not (Paul, 2026-09-14: keep it, because it’s different than the drawer). The drawer lists what blocks listing once the product exists; step 6 is the form’s own summary before Create. Its heading is Ready to create with nothing under it. One row per step: Done, Not done or Skipped, and what the step holds — or what it is missing. The step name goes back to that step. RI-771
One answer to “is this step done” (stepDone) feeds the step strip, the record column and the recap. The strip and the column used to turn a step green because you had walked past it, so they said Done over empty Images and an unwritten Description while the review said Left blank. A passed step with nothing in it now stays grey. RI-772
The record column steps aside on step 6. The recap is the same information as a table, and two copies of it side by side on one step was the kind of duplication this round removed. Not asked by Paul — see the open item. RI-771
Removed from step 6: the If left as it is column (a hand-written second copy of the drawer’s gap list, RI-740, RI-758), and the After you press Create rail with its does not ask and why only two fields are required boxes — which said two fields beside an Identity card that requires three. The N readiness gaps so far line under the record column went with them. RI-773
The one-canvas layout is deleted, and with it the layout toggle and the Screens panel’s open question. The ingredient list sits beside the formula picker; the Beside / Below toggle is gone. RI-774
The inline explanations moved here or were cut (MOCKUP-GUIDANCE §0): card intros and subtitles, field hints, the harness footer, the spine step 0–1 chip, the formula drawer’s notes and the duplicate state’s intros. What they said that is not already below is in Moved off the screen.
Moved off the screen (MR-390)
Brand. A new brand is a name and one choice of kind; logo, voice and categories are filled in later on the brand’s own screen. A brand is ours, so unlike a source formula it can be made from here.
UPC. Singles only. Bundles and combos never carry one, and nothing is blocked by its absence.
Formula search. It searches manufacturer, house name, code and count at once, because a dropdown of hundreds is a scroll. Two records can differ only by count: 60 ct and 90 ct are separate records with separate weights. Two such records are the same chemistry with two ingredient lists that can drift apart — a claims risk, not a cosmetic one.
A formula with no ingredient list is the gap that blocks the most: content generation reads the list, and the claims gate traces every claim back to a row in it.
How it sells. Benefit tags and gift eligibility describe how the goods go to market, not what they are. A listing job’s creative brief starts its Benefits from the union across its products. Gift eligible is read by the package builder, and gift variants multiply on purpose — more unique listings is the strategy.
Research by. Each ingredient marked Active is read against each benefit tag and shared with every product that has the same ingredient; benefit research is shared with every product carrying the tag; category research is shared across the product’s finest category; Guidance is read by this product only, before anything is written.
The formula drawer carries only the gaps the product was asking about; everything else about the formula is edited on its own screen. Unit weight rates a label, and on a bundle ShipStation ignores the weight we send and adds up component weights, so a wrong number costs money on every order of every product on the formula.
Not asked on this form: the FP SKU (minted when the physical product is settled), the product version (v1 is implicit until the first supplier cutover) and status (derived from the Setup & gaps drawer).
Duplicates. The check runs on brand + name + unit spec when a formula is attached and on brand + name alone when there is none. The same brand, name and count is the same product — a second copy splits inventory and listings — so it is refused. A similar name, or the same name at another count, is legitimate often enough that it only warns. The unit spec is not a field here: it is the formula’s, and picking a different count is what makes a different product.
What the screen is built on
Checklist, not wizard. The form mints a product from two typed fields — brand and name — plus the Sourcing answer, which is a choice rather than something to look up (MR-348); everything else is optional and becomes a line in the Setup & gaps drawer, which is also the catalog list’s status column and the listing job’s precondition check. One definition, three surfaces. D12
Optional is weight, not visibility. The first pass folded the optional sections into accordions, which was a response to a 660px column rather than a decision. A section nobody can see is a section nobody fills in. layout round, 2026-09-02
The third column is the answer to stepping’s one real cost. A stepped layout can never show the whole record at once, so the record shows itself: identity, formula, images and merchandising accumulate down the right-hand side as each step is done. It reads the same state the step 6 recap does, so the two can never disagree.
Skipping is a statement of intent, and doing the thing retracts it. Skip the formula, come back, pick one, and the step stops saying skipped. A flag that outlives the reason for it is how a summary starts lying.
The Formula step is the only three-column step, because it is the only one where the choice and the evidence for the choice are two different objects: you pick a formula in order to get its ingredient list, so the list sits beside the picker rather than under it.
Grouped by the question each step answers, not by which system owns the field: who is it (brand, name, UPC) · what is it made of (formula) · what does it look like (images) · how does it sell (tags, gift). The two read-only things the formula hands over — its physical facts and its ingredient panel — sit together underneath, because they are consequences of one pick rather than two more things to fill in.
“Product details” is dissolved. A barcode is an identifier and belongs with brand and name; benefit tags and gift eligibility describe how the goods go to market rather than what they are, and are read by two different downstream screens. A container holding all three was a container named after nothing.
The stepped form never blocks. MR-055 chose checklist over wizard precisely because product information arrives out of order, so a stepped layout only survives if it is a suggested order rather than a gate: every step after the first is skippable, the strip shows what was skipped, and Create is live from step 1. If that guarantee were dropped, it would be reopening a settled decision.
Searching for a thing and creating it are one decision, so they share one frame. The brand picker is a single module: the field, the list that filters as you type, and the create half that appears as the last row’s consequence. Two bordered boxes read as two decisions and invite the wrong one.
The product name does duplicate reconnaissance while you type, across every brand, because the same name on another brand is ordinary and the same name on this brand is about to be refused. Better to learn that at the third keystroke than at the Create button.
The ingredient list is the strongest signal of what a product is, so it is on the create screen rather than two clicks away — read-only when a formula is linked, because the formula owns it, and re-rendered the moment a different formula is picked. With no formula (Arrives finished only) it is typed on the product, and a Hard good has none. MR-348
While a formula is linked, every physical fact belongs to it.Amended by MR-348: this was “every physical fact belongs to the source formula”, which stopped being true for goods that arrive finished with no formula — those facts are the product’s. Count, weight, dimensions, bottle, label size and cost are read-only here behind an SF- link, and filling a blank from this side is refused too — the rule is ownership, not “don’t overwrite”. The formula’s editor arrives as a drawer so the trip is avoided rather than the rule bent. The formula field is therefore select-only. D2
Automation stops at the first sign of ambiguity, and says so when it does not. An empty candidate set mints the QuickBooks item unattended, read live at the decision point; any candidate at all routes to a person. When the machine acted alone the record says “no person reviewed this” in as many words — now on the setup drawer (state I was archived by MR-373). D6
There is no park. Link one, mint one, or leave it unsettled with a note on the readiness row — which is the outcome parking produced anyway. Five states, not six. D7
The tracker is sized to the situation. One line when settled, click to expand; the full strip while a job is running or stuck. D14
Refusal and attention are different colours. Amber stays attention-only per MOCKUP-GUIDANCE §2. The hard duplicate block and the already-linked candidate use --danger, which reads as “this is refused”, so a warning you can acknowledge never looks like a wall you cannot pass.
The physical-product step lives inside creation, not in the listing job. Asked once, remembered forever.
Every status dot carries an sr-only expansion and sits next to its own text label, so colour is never the only carrier.
MR-382 / MR-383 — a Description step, a fourth Research by input, and images at the record’s size
Research by has four inputs (RI-750): Active ingredients, Benefits, Category, Guidance. Benefits reads the tags picked beside it and repaints when they change. The default is still Active ingredients alone (RI-711).
The Description step is new, and it is a gap Paul found (RI-753). The product record got Generate description beside its editor in the same round, and the create form had no description at all — nothing for a Generate button to fill. So step 5 generates one from the ticked inputs, into the sameMRPanel.richtext editor the record uses, where it is ordinary text. It comes after How it sells because it reads what that step sets; it names each input and what it holds before writing, asks before replacing, and like every step after the first it can be skipped. Create is step 6.
Added images are the record’s size now (RI-754). The slot grid was auto-fit, which stretches the tiles to fill the row — one added image drew 590 × 822 px at 1920. It is auto-fill at the record’s own 178 px minimum, so one image is 189 px wide and the empty columns stay empty.
MR-348 — Sourcing comes first
Sourcing is a two-option answer: Labeled by us, or Arrives finished.Labeled by us means we put our own label on a formula we hold, so a source formula is needed and unlabeled stock (an RW SKU) can exist. Arrives finished means the goods come in already labeled or branded — a branded cream in its printed jar and carton, or a branded hard good — and stock is received straight into the FP SKU. It sits beside the Brand_Kind axis, not inside it: a reseller product and an own-brand product can both arrive finished.
Why it is the first thing on the form. It decides which of the later fields exist at all — whether the formula is needed, whether an RW SKU can ever appear, and where the physical facts live. Asking it after the Formula step would mean undoing that step. It is also fixed once the product is created: a different answer is a different catalog product, so the choice is made where it is cheapest to get right.
Labeled by us is the screen as it was. The formula step is unchanged, except that its tag now says needed to list instead of optional: skipping still never blocks Create, but the missing formula is a readiness gap.
What Arrives finished removes (MR-350, MR-356). There is never a source formula on this path, now or later (RI-669), so the formula picker is gone and the step is called Facts. There is no RW SKU and no raw-to-finished transfer. The form asks for what a formula would have supplied: Form, unit, unit weight (lb and oz, as ShipStation takes it), package dimensions as L × W × H, the container, and whether it ships in a box.
The label panel is picked, not derived (RI-679). A Label panel card offers Supplement Facts · Ingredients · Product details with the same editors the product record and the source formula use (_panel-editor.js). A supplement types a structured Supplement Facts panel here, which closes the open item on it. Form does not choose the panel, a hard good included; switching away from typed lines asks first. An empty Product details panel is never a gap.
No batch is asked. The product’s QuickBooks item does not exist yet, so nothing can have been received into it. Batches arrive with its first receipt (RI-684).
How it sells gains Research by (RI-682). Active ingredients, Category and Guidance are checkboxes since MR-372 (RI-733, reversing RI-683): each is one more input to the writing, and ingredient and category research are shared with other products, so reading both costs little. Active ingredients starts ticked (RI-711). A hard good cannot tick it. Nothing ticked blocks research. Guidance says what to look into before anything is written; nothing on the drafts review links to it, which is what keeps it from becoming a corrections box (RI-513).
Research by counts the marked rows (MR-364, RI-719, RI-724). Only ingredients ticked Active on the panel are researched, so the hint reads N of M marked, and with none ticked research is blocked and the gap list says so (RI-723). On Labeled by us the Formula step shows this product’s copy of the formula’s panel with real checkboxes (MR-372, RI-732): the rows stay the formula’s, the ticks start as the formula has them and change only this product — the same thing the product record lets you do after Create. The Eroluve glide (SF-0058) marks none, which is the blocked state to walk to.
Three examples, one per shape. From the screen index: &ex=avinol (a supplement), &ex=complexion (a topical) and &ex=zeroair (a hard good). Pressing Create opens that product’s Setup & gaps drawer. Clicking Arrives finished on a fresh form still fills in the Complexion MD example while its fields are untouched.
Fixtures. CP-0151 Complexion MD and CP-0152 Zero Air are products Paul named; every weight, dimension, ingredient, lot and SKU on them is ILLUSTRATIVE, a placeholder until real values are recorded.
Considered and not drawn. Carrying a formula picked on the Labeled-by-us path across to Arrives finished: rejected, because on that path a linked formula is a deliberate, uncommon act and should not be inherited by clicking a radio. Swapping the example to Zero Air when Form becomes Hard good: rejected, because an example name that changes under a Form pick reads as data loss; so the hard-good readiness fixture is a different product from the one on the form, which is a fixture seam and not a rule.
The nav collapses to its icons
Ported unchanged from catalog-product-edit-v6.html, where it was drawn — same CSS, same toggle. A control in the brand row drops the rail from 284px to 58px. Labels are hidden rather than removed, so section order, the current-page rule and the not mocked yet stubs are all still there when it opens again; while collapsed each link carries its label as a native title, because .sb is overflow:hidden and would clip a CSS tooltip.
The width goes to the work: at 58px the stepped Identity step lays brand and product name out side by side instead of stacked.
It is deliberately not in the URL. The hash says what you are looking at — state, step — and the collapse is chrome, the same call already made for the x-ray toggle. If a collapsed rail should be shareable, that is a decision to take once and apply to both toggles.
Settled this round — the hedges are gone
S4’s first question is closed: we mint the FP number. Highest existing code + 1, gaps never reused, and a duplicate-SKU race retried automatically up to three times before it stops and asks — because “take the next number” is never a judgement. The two [PLACEHOLDER — spike S4] blocks this screen carried are deleted. D16
Still open — not this screen’s to answer
S4 · is the whole QuickBooks item record writable by API? If some field turns out to be UI-only it joins the pattern ShipStation already uses: do what the API can do, prove it by reading it back, handle the residue explicitly.
The RW SKU grammar is unresearched and is its own QuickBooks spike. It belongs to the source formula, not here.
Settled since MR-348
Sourcing starts unanswered (MR-349). A supplement that arrives finished gets the structured Supplement Facts editor, and no batch is asked at creation (MR-356).
Deliberately not here
Supplier cutover and v2. Its own flow, its own cutover rules. v1 is implicit here.
Stock. This makes the item exist so fulfillment has something to point at. Whether any units are on a shelf is warehouse work.
Research, pricing and copy. All belong to the listing job, which reads this product as its input.
A second unit spec at creation. A formula is a formula at one size, so a second size is a second formula and a second product built on it. The only unit field on this form is the one an Arrives-finished product with no formula types for itself — one unit, never two (a new count is a new product, MR-348).
Creating a source formula. Deliberately absent — the search says so when it finds nothing. Whether the drawer should eventually be able to create one is unsettled and not urgent, because a product may exist with no formula at all.
Editing the formula’s panel rows. The rows on the Formula step are read-only. v1 copies the panel at creation and the copy is then the product’s to diverge from; editing its wording lives on the product screen. Only the Active ticks are set here (MR-372, RI-732), because Research by on the next step reads them.
Images are never inherited (MR-372, RI-734). Paul, 2026-09-13: even on an open brand, the Supplement Facts or ingredients image “has to be custom for the new product … because it needs to be branded to the product”. So the Images step no longer shows formula images as inherited. Its empty slots are Front, the panel and Side (MR-391); the rest of the form’s set is suggested as chips; every image carries a type select, and a last tile adds an image beyond the set. A source formula’s own panel photo is a reference, not a listing image.
MR-388 — the completion page is gone; Create always opens the drawer
Paul, 2026-09-14: the completion page largely repeats the drawer’s All complete state, so it is dropped. Create now opens the Setup & gaps drawer every time, over the form: on what is left when something blocks, and otherwise on ✓ CP-nnnn created above Creating the records, which walks to All complete · Open product on its own. QuickBooks needs you and ShipStation needs you were always drawer states and stay so.
No per-record steps. The page showed Check → Create → Read back changing for each record. Moving those beats into the shared drawer was offered and declined: Paul does not need the detail, just to know that a product is incomplete or still processing. The product record already says so — its header chip reads amber for gaps or a record that needs you, blue Creating the records, green Setup complete, with the same status bar under it — and every one opens the drawer.
With the drawer closed, the status bar under this form’s heading follows the same five states (MRSetup.bar): created · N block listing, Setting up the physical product, Setting up stopped, and ✓ CP-nnnn is ready to list · Open product. Closing the last gap on the form starts the records without reopening the drawer — it would slide over the field just typed — and the bar shows them running. In the mockup creating becomes complete after four seconds, so the harness’s 3 · creating does not stay put.
MR-387 — how you know a product is done (its completion page withdrawn by MR-388)
Superseded in part by MR-388. What survives is the status bar under the form’s heading (MRSetup.bar) and step 6’s heading changing to Created once Create is pressed; DECISIONS.md MR-387 has the rest.
Not drawn: a QuickBooks decision for any product but CP-0102 (P90) — on the collagen example state 2’s drawer says the decision is drawn elsewhere, so the harness’s 2 · QuickBooks shows the drawer but cannot be resolved there.
MR-386 — Create opens the Setup & gaps drawer here, over the form
Paul, 2026-09-14: the drawer should be part of the create product flow, where you can fix things and then complete the creation. MR-374 had Create open catalog-product-setup.html — right drawer, wrong place: what was missing appeared on another screen, away from the fields that could fill it.
Create still does not wait (RI-759, Paul’s answer when asked). Pressing it makes the record at once — the header becomes CP-0119 created — finishing setup — and opens the drawer over the form. From then on this form edits that product. Each gap’s fix closes the drawer and jumps to the step that asks for it (the front image to Images, weight and panel to Formula or Facts, Research by to How it sells); the Create buttons become Setup & gaps · what is left ▸ and bring it back. When the last blocking gap closes, QuickBooks and ShipStation start on their own and the drawer walks to All complete, where Open product goes to the record.
One checklist, not a third copy (RI-758). The drawer is _setup-drawer.js, mounted by this form, the product record and the setup screen alike, and its gap and settled rows are computed from facts. This form hands it what is typed — the images added, the formula’s weight or the weight typed, form, unit, size, panel, the Active marks and Research by — so the drawer cannot say done about something the form left blank, which is the disagreement MR-374 was about. The system-record cards are the same markup everywhere, because they show what QuickBooks and ShipStation did.
The harness’s After Create segment creates the example and puts the drawer in any of its five states, and #…&setup=gaps&open=1 is a link to it. The QuickBooks decision’s candidates are drawn on CP-0102 only; on the create examples state 2 says so (P90). The This preview cannot open another screen note (MR-376) is gone with the navigation it explained.
MR-374 — Create opens the setup drawer; the readiness page is archived
Create opened catalog-product-setup.html (superseded by MR-386), and state C, the readiness page, was archived because two copies of the checklist had started to disagree (RI-740).
MR-373 — six states archived
States D to I were drawn on 2026-09-01 and had not changed since. The QuickBooks match and the cost conflict now live in the setup drawer, as its state 2 QuickBooks needs you (open it), without the count rule that dropped a 60 ct item from a 90 ct search (RI-361). Bulk queue, Mint, Evidence & history and Auto-minted are retired: the setup drawer already shows the mint and its proof, and the bulk sheet described a two-field form that no longer exists. The rules only they held are records: a missing cost stops the mint, the code can be edited before minting, and a rename in QuickBooks is caught against the name stored at linking (RI-737, RI-738). The whole file as it stood is in mockups/_archive/, bannered as not current.