MR-073Source formula — the entity that owns the physical productStates
The mint, on state A
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.
Minting the RW SKUQuickBooks · searching Vox Nutrition itemscheckingRW-0003BL · the code it will takenot writtenRuns on its own. You can leave this screen.
The mint stoppedQuickBooks · 31 Vox Nutrition items read2 candidatesNothing written · no item, no linkwaiting on youIt will not resume on its own.
RW SKURW-0003BLMinted 2026-06-01
RW SKURW-0003BLMinting now — nothing written yet
RW SKUon hold2 candidates — you decide
RW SKUdeferredWaiting on the bottle — it is the suffix
Unit Spec60 capsulesInherited by all 4 products
Cost / unit$3.85QuickBooks’, read-only
On hand1,240Never gates a listing
Last received2026-08-14From QuickBooks
BottleBlack · 150 mlThe BL in the SKU
Unit Weight4.8 ozRates every label
Products4All share the facts below
Product Attributes shared by 4 products
Unit Spec
Set this when the formula arrives in a printed retail carton. A poly mailer delivers it crushed — the parcel was never too small, it was the wrong kind, and no volume calculation can work that out. Every catalog product built from this formula inherits it and cannot clear it.Shipment Packaging ▸
The last four purchase orders on SF-0007, newest first
POQB
Date receivedQB
StatusQB
ReceivedQB
On handQB
Batch
Exp
COA
Edit
PO-4471
not yet
Ordered
—
—
Nothing has arrived — there is no batch to record
PO-4392
2026-08-14
Received
1,100
900
VOX-2608-A
2028-08
PO-4310
2026-07-02
Received
620
340
VOX-2607-C
2028-07
No COA yet
PO-4188
2026-06-02
Received
480
0
VOX-2606-A
2028-06
PO-4392 is the batch the four products inherit — its COA, Exp, Batch and received date show read-only on each product's Specs tab. 900 + 340 = the 1,240 the header shows on hand, and PO-4188 at zero is a batch that sold through.All batches ▸
Notes 2
Dana Whitfield2026-08-14 09:12
Vitalabs confirmed the 60 ct bottle uses the same tooling as the 90 ct. Dimensions verified against the sample that came with the August delivery.
Paul2026-06-02 16:40
Bottle colour changed from clear to black at the June run — the RW SKU suffix moved with it. Old reference photography retired.
All three. The size is not a detail — it is part of which record this is.
required
required
Unit specrequired
Four existing Vitalabs formulas were compared
None at 90 capsules. The nearest is SF-0031 Marine Collagen 500, 60 capsules — same chemistry, different size, so it is a separate record by design and not a duplicate. The check ranks on name, count and size rather than looking for an exact key, so a near miss like this surfaces rather than passing silently.
Physical facts
True of the goods on the pallet, not of any label printed over them.
feeds the SKU
optional
optional — and the expensive one
optional
optional
Ingredient list
the starting pointThe single strongest indicator of what these goods actually are.
Image assets
The type decides who inherits it — so the type is the field that matters.
vitalabs-collagen-asreceived.jpg
not for listings
No panel photo yet
inherited
No instructions panel yet
inherited
The RW SKU this will mint
Nobody types it.
RW-0044WHprefix RW-sequence 0044 — next after RW-0043, gaps never reusedbottle WH — from the step before
Needs you (skipped)Skipped — no person reviewed this
Creating (complete)Written 09:12, read back 09:12
Linked (complete)Settled 2026-06-01
Nobody looked at this one
The search came back with zero Vox Nutrition items resembling these goods, so the SKU was minted without asking. That is the intended behaviour — but it is said out loud, because “a person checked and confirmed there was no match” and “the machine found no match” are different amounts of confidence in a link that decides where stock and cost land.
The Code
Minted RW SKURW-0003BLNext in sequence after RW-0002No collision in QuickBooks, read liveBottle suffix BL matches the record
Missing (gap) Not recorded on SF-0044, which owns it.
Settling the physical product. On a bundle ShipStation adds component weights to rate the label, so a wrong weight quietly costs money on every order.
Formula ingredients
Missing (gap) SF-0044 recorded, ingredient list empty.
Content generation and the claims gate — every claim traces back to an ingredient.
Physical product settled
Blocked (blocked) Waiting on unit weight. Someone left a note: “spec sheet requested from Vitalabs 29 Aug.”
Everything. No listing without a QuickBooks item and a ShipStation component product.
SF-0044 · Marine Collagen 500
The formula’s own editor, opened over the product. Nothing you typed on the page behind is lost.
Used by 3 products. A weight typed here is the weight for all three — Nordhaven Marine Collagen, Kelpwright Collagen+ and this one. It is the bottle in front of you, but it is not only your bottle.
the gap
optional — while you are here
Design notes
Why a formula is its own record
Because the relationship is one-to-many and the facts are physical. Twenty open brands can wear one formula, and the weight, dimensions and bottle are true of the goods rather than of any label. Held on the product, those facts get retyped per brand and drift; held here, there is one of each.
Grain: formula plus size
A 60 ct and a 90 ct of identical chemistry are separate records. That is forced by the ask — weight and dimensions only exist once a count exists, and a purchase line is written for a count, not for a powder. The price is a duplicated ingredient list when the same chemistry ships in two counts. Since ingredients feed the claims gate, drift between two such lists is a claims risk rather than a cosmetic one, so it is worth watching. A parent formula with child pack records would remove it, and is the upgrade path if two-count formulas turn out to be common.
Status is half derived, half decided
Awaiting stock → stocked is derived from QuickBooks recording a receipt. Discontinued is a person’s act, because QuickBooks never learns that a supplier dropped a line. Reading status off quantity on hand would have been simpler and wrong: a formula sold weekly would flicker to discontinued every time it ran dry. Quantity is therefore shown beside status and never as it — and it gates nothing at all.
Vocabulary, deliberately not shared
A version already uses active / incoming / retired. Reusing those words here would put two fields reading “Active” inches apart on the product’s Specs tab, meaning different things. So the formula speaks in inventory terms instead. “Stocked” rather than “in stock” is also deliberate: under the rule above, zero on hand is not a status change, and “In stock · 0” would be a contradiction printed on the screen.
Assets split by who determines them
The Supplement Facts and instructions panels are determined by the formula, so every product inherits them and a fifth brand gets them free. The label is determined by the brand, so main, front and back stay on the product. The reference photo and the house label artwork are the formula’s alone and are marked never-for-listings — an unlabeled bottle reaching a live listing is exactly the failure a helpful default would cause.
Notes is a shared component, not a feature of this screen
Built to be lifted wherever a record needs a log — the catalog product edit screen first. The contract is markup, not wiring: a container with data-notes and an optional data-author, holding [data-newnote], [data-addnote], [data-notelist] and an optional [data-ncount]. Every lookup is scoped to that container and the handler is delegated from the document, so any number of blocks can sit on one screen without colliding and none of them need initialising. Verified with two independent instances: adding to one leaves the other's list and count untouched.
An edit keeps its provenance. The textarea is seeded with the note's words alone, and cancelling restores exactly what was rendered before — including an earlier edited stamp, which a naive text-only restore silently drops.
MR-070 — the create screen, and where its prose went
Round 2. Every note that used to sit inside the screen is now here, per MOCKUP-GUIDANCE.md §0. Nothing was deleted — a .lede, thirteen of them, ten .hint lines, two blast-radius callouts, the “After you press Create” rail and the “How This Record Behaves” grid all moved into the sections below. What stayed on the screen is the microcopy that would exist in the shipped product: units, required and optional markers, the duplicate-check result, the words on the two decision screens.
What each part of the form is for
Identity. A formula is a formula at one size. Sixty count and ninety count of identical chemistry are separate records, because weight and dimensions only exist once a count does, and a purchase line is written for a count rather than for a powder. There is no brand to go on either: on an unlabeled good the supplier is the identity. The duplicate check is scoped to the manufacturer and casts a wider net than the finished-product one — it ranks on name, count and size rather than looking for an exact key, so a near miss surfaces instead of passing silently. House name is the manufacturer's name for the goods, never a brand's name for the label. Every catalog product on the formula inherits the unit spec and never types one.
Physical facts. This is the whole reason the formula is its own record. Held on the product, these get retyped per brand and drift; held once, there is one of each. Only the bottle has a deadline — it is the RW SKU's suffix, so an unknown bottle defers the mint, and Not known yet is a legitimate answer that still creates the record. Unit weight is the expensive one: rating a label uses it, and on a bundle ShipStation ignores what we send and adds up the components' PACKAGE weights — item plus tare — so the packaging is counted once per unit and a wrong number costs money quietly, on every order, forever. Measured 2026-09-02; see Shipment Packaging. Suggested label size is the manufacturer's recommendation — asked for every single time artwork is commissioned, and never to hand.
Ingredient list. Every product on this formula copies it at version creation and then owns its copy outright — branded labels take small liberties with wording, so they are allowed to diverge and their edits never come back here. Content generation and the claims gate read this table, not the printed label. Structured now, or scanned from the panel later; markdown round-trips losslessly either way.
Image assets.Supplement Facts and Instructions are determined by the formula, so they are lent to every product on it and a fifth open brand gets them free. Reference photo is the goods as they arrive, for receiving and PO matching, and is never listing-eligible — an unlabeled bottle reaching a live listing is exactly the failure a helpful default would cause. House label, our work and other stay ours. Main, front, back and lifestyle are the brand's and live on the product.
Why these facts live here, and the two costs of it
Nothing wears these facts yet. On the create screen the blast radius is zero products — which makes it the one and only moment these fields are cheap to be wrong on. Every edit after today changes the weight, the dimensions and the bottle for every brand built on the formula at once, which is the point of the record and also its risk. The editor says so from then on: “sets unit weight for SF-0044, used by 3 products.”
Copy-on-create cuts both ways. Fixing a wrong ingredient later does not correct labels already printed from it — under live inheritance one fix would reach all of them, under copy-on-create it reaches none. Filling it in before any product exists to copy it is the only version of this that costs nothing.
What the form deliberately does not ask
Cost per unit
QuickBooks'. It comes down with everything else once the item exists, and we never write it back — that is accounting's act, not ours.
Quantity on hand
Observed, shown beside status, and gates nothing at all. A formula at zero is still listable: the goods are on a truck, and refusing to build listings for them would be the wrong help.
Status
Derived. Awaiting stock → stocked follows QuickBooks recording a receipt; only discontinued is ever a person's act, because QuickBooks never learns a supplier dropped a line. Reading status off quantity would flicker a weekly seller to discontinued every time it ran dry.
Purchase orders
They live in QuickBooks. Under the mirror, stock arriving is something we observe rather than track — and that makes the status machine simpler, not poorer.
The RW SKU
Minted, never typed. The card only shows you what it will be.
Why the size is required but the weight is not. The count says which record this is — without it there is nothing to tell a 60 ct apart from a 90 ct of the same chemistry. The weight is only something the record does not know yet. One is identity; the other is a gap, and gaps are allowed.
The mint moved off the form
It used to read Create formula & mint, and it waited. Minting the RW SKU is a write to QuickBooks that can take seconds or stop outright for a decision, and holding a person on a submitted form while that happens was the mistake. Now Create formula writes the record and returns; the mint follows on its own.
The strip is one cell now, and it is the record's name. It used to read 1 · The formula / 2 · Its RW SKU (runs on its own). The second cell narrated work that happens after you leave the form, in a system this page cannot show, and that nobody standing on this form can act on — so it was decoration on the only screen where the reader is busiest. It reads Source formula product, and the footer still says the SKU is minted behind you at the moment that becomes true.
The reconciliation screen folded into the drawer. Candidates used to be state C, a screen of its own: you left the record to answer a question about the record, then had to find your way back. It is now the drawer's #fix=match fixture — the same panel the header chip and the runbar already open — sitting inside the System record card at the beat where the job actually stopped. Nothing about the decision changed: any candidate at all halts the mint, nothing is written, and there is no third option. What changed is that deciding is the end of one gesture rather than a round trip.
What the search does, and where each outcome lands. QuickBooks is read live at the decision point, not from the mirror — the one moment a stale list costs money is the moment you decide nothing matched. Nothing at this supplier looks like it ⇒ it mints automatically, unattended, and says out loud that no person reviewed it. Any candidate at all, even one ⇒ it stops and nothing is written, because linking to an abandoned duplicate sends stock and cost to the wrong item; you go to reconciliation in the drawer ▸. The bottle not known ⇒ the formula is created anyway and the mint defers, because the suffix is part of the SKU.
A toast and a banner are not the same tool, and both are here on purpose.catalog-product-setup.html ruled that a toast that vanishes is the wrong shape for work that outlasts a toast. That still holds and nothing here contradicts it: the runbar, the header chip and the drawer carry the work and stay. What the toast carries is the handoff moment — you pressed Create, the record exists, something else has the SKU now — and a banner cannot mark a moment, because it was already there before you acted.
The drawer holds two different kinds of work.Needs you is the optional fields nobody supplied; System record is the QuickBooks job, drawn with four beats — check, you decide, create, prove — because a lifecycle does not fit in a table cell. Settled items fold rather than vanish: a field filled in on the create form is not a gap, but “was the weight ever recorded?” still needs an answer.
Why one canvas, and what went with the decision
The form is 2.2 screens tall. catalog-product-create.html was 5.8 when MR-061 rejected one canvas for being “a tall page on the first visit” — that decision was measured on a form nearly three times this one and does not simply carry over. A formula asks for twelve fields and one table; a product asks for the same plus everything a brand puts on a label. Stepping a two-screen form is ceremony: five tabs to hold twelve fields.
MR-070 finished what MR-067 started. The canvas-vs-stepped toggle, the five-step walker, the skip machinery and the Ready to create review card are all gone. The review card restated a page you can already see; #m-progress in the rail does the same job live, grouped by what each blank blocks rather than by how far through you are — which is the half of the stepped design that had actually earned its place.
How the record behaves
This screen owns these facts. Everything on it is read-only wherever else it appears. A catalog product shows the weight and the RW SKU on its Specs tab, greyed, with a link back here. Filling a blank from over there is not allowed either — one fact, one owner, one place it is written.
Stock never blocks. On hand is shown because it is useful, not because it gates anything. No purchase orders here — POs live in QuickBooks and we mirror items down continuously, so the arrival of stock is something we observe. Why not one formula for all sizes: a 60 ct and a 90 ct weigh differently and are bought on different lines, so one record per size keeps weight honest. The cost is a duplicated ingredient list when the same chemistry ships in two counts — rare, and worth watching, because ingredients feed the claims gate and drift between two lists is a claims risk rather than a cosmetic one.
The image module
One picker, three libraries — source formula, catalog product, sales channel — in _image-module.js, loaded by a single <script src> per screen rather than pasted into four. Each screen opens the library that belongs to it, so a source formula never browses catalog art.
The contract is markup, not wiring: data-imgpick="<library>" on any element opens the picker, optional data-imgpick-role preselects the type, and the answer comes back as an imgpick CustomEvent on the trigger carrying {library, file, src, label, role}. Each screen decides what to do with it, so the module never has to know four DOM shapes. Same shape as the notes component, for the same reason.
Size rules differ by library, and that is the honest answer rather than one number. Catalog product and sales channel images are read as generation references and go out to marketplaces, so 1500 × 1500 is held to. Source formula images are never posted and never used as references — a phone photo of the panel does the job, and pretending otherwise would invent work.
An unknown library name is a console warning and nothing opens. Falling back to some other library would quietly offer catalog art on a source formula, which is worse than a picker that does not appear.
MR-072 — batches, POs and the COA
Round 4. A grid of the last four purchase orders on the record, a drawer to type the three facts QuickBooks does not hold, and a viewer for the certificate. It reverses a settled decision, which is the first thing to say about it.
MR-059 said “no purchase orders” and this contradicts it. The spec's words were: POs live in QuickBooks; under the mirror the arrival of stock is something we observe, not something we track — repeated at SOURCE-FORMULA.md §3 and REQUIREMENTS.md §5. Both are amended rather than left standing beside a screen that disagrees with them. The reasoning changed, not just the answer: MR-059 was arguing against re-keying procurement, and that argument still holds — nobody types a PO number here. What it did not weigh is that the COA, the expiry and the batch number exist in no system at all. QuickBooks records a receipt; it does not record which lot arrived, when it expires, or where the lab's certificate is. Those three are the module, and the PO row is only the peg they hang on.
Split ownership, marked on the header row. Five columns carry a QB tag and are read from the QuickBooks mirror — PO, date received, status, received, on hand — and three are typed here. It is the same rule cost per unit already follows on this screen: QuickBooks owns it, we never write back, and a PO is accounting's record before it is ours. The alternative Paul raised — type all six, sync status later — was set aside for the reason MR-055 set aside an editable cost: a field that is authoritative somewhere else and editable here is a value that quietly stops being true. It costs one thing: a batch with no PO in QuickBooks has no row, so Add batch exists as the escape hatch and its drawer opens titled waiting on a PO.
Received and On hand are two columns, not one cell with a number under a number. They were drawn stacked — 900 over of 1,100 received — which reads as one fact with a footnote when it is two facts of equal standing, and buries the second at a font size nothing else in the grid uses. Two columns cost one column's width and are scannable down the page: how much arrived, and how much is left, each comparable against the rows above it.
They also make the record checkable in place.900 + 340 is the 1,240 the facts bar shows on hand, said out loud in the grid's footer, so a number that has drifted is visible rather than merely wrong somewhere. Both columns are QuickBooks' — quantity is stock, and stock has one owner on this screen, the same rule cost per unit follows.
Depleted is gone, because 0 is the fact and depleted was only its name. Once what is left has a column, a third status word restates it one cell to the left — and worse, it restates it as a judgement: a row marked depleted invites “written off?”, where a plain zero beside 480 received says exactly what happened and nothing more. Status is now Ordered · Received, read from QuickBooks; received carries a green dot and ordered is quiet, because “not here yet” is not attention. Colour is not being asked to tell them apart — the words are (§2). A missing COA on a received row is attention, and that is the one amber thing in the grid.
The drawer, not a tab. This screen already has two drawers and no tabs; state A is one canvas. A tab would have restructured the whole record for one module and pushed the grid off-screen from the stock and status it belongs beside. Row click, Edit, Attach and Add batch all open the same panel, retitled — add and edit are the same act on a record that is mostly blank.
What the products inherit, and what they do not. The newest received batch — its COA, expiry, batch number and received date — appears on every catalog product built on the formula, as a read-only Current batch group on the Specs tab, beside the physical facts that already live there under the same rule. Read here, edited there. The COA viewer is deliberately not copied onto the product screen: the filename links back to the formula, which is where the document lives. A second viewer in a second file is the drift MR-071 built the image module to stop; if a third screen ever wants it, it becomes _doc-viewer.js and is copied by build-mockup-site.sh like the other shared assets.
The certificate rides the asset viewer already on this screen. Same modal, a page-shaped stage instead of a square one, and a Download control — which is real, not decorative: a COA is the one asset here a person genuinely needs a copy of, because a marketplace or a customer asks for the file itself. It is never edited, only replaced.
The dead controls in the edit drawer (state D) are fixed in the same pass. Its Save, Cancel and × did nothing — a picture of a drawer with an inert Close reads as broken rather than as staged, and Paul read it exactly that way. They now close the drawer onto the readiness page behind, which is the thing the drawer's own copy already promises (“nothing you typed on the page behind is lost”). Re-entering the state re-opens it.
Fixtures
SF-0007 Cognitive Complex owns states A and C and all four #fix= fixtures. The record, its four mint stages and the durable proof are one formula, one supplier and one SKU throughout — RW-0003BL, 31 Vox Nutrition items read, minted 09:12 on 2026-06-01, first receipt on PO-4188 the next day, which is the row the batch grid already shows as depleted. That was not true until MR-073: the candidates and the settled screen had been drawn on SF-0044 Vitalabs, so The durable record ▸ walked you from one formula’s proof to another formula’s proof.
The four fixtures are branches, not a sequence.Minting and Linked both say zero candidates; Candidates found is the same record had the search come back with two. They are outcomes of one moment, shown one at a time, rather than four things that happen in order — the beats strip inside each fixture is where the order lives.
What is still a different record, on purpose. The create form builds SF-0044 Marine Collagen 500 and the edit drawer opens over CP-0119, which is also SF-0044 — so pressing Create lands you on a different formula showing the same shape. That is the same compromise catalog-product-create.html → catalog-product-setup.html already makes (a Nordhaven product, then CP-0102) and it is called out rather than papered over.
The four batch rows are SF-0007’s and are recorded in SAMPLE-DATA.md: PO-4471 ordered, PO-4392 received 2026-08-14 (the batch all four products inherit), PO-4310 received with no COA yet, PO-4188 depleted. They exercise all three statuses, a filled certificate and a missing one. PO-4392’s date is the same 2026-08-14 the facts bar already shows as Last received — the grid and the bar are the same fact, not two.
Open
The RW SKU grammar. Drawn as sequence + bottle code, which reads correctly against RW-0003BL and RW-0011AG, but no methodology existed before and this one is ours to invent. Its own QuickBooks spike.
Where a formula is created from. Drawn as its own screen. Whether the product intake screen should be able to launch it in a drawer — creating rather than only editing — is not settled; the rule that a product may exist with no formula means it is not urgent.
Whether QuickBooks can report quantity per receipt at all. The Received and On hand columns assume a batch is a thing stock can be counted against. QuickBooks counts stock per item — RW-0003BL holds 1,240 — and splitting that across the receipts it arrived on needs lot or bin tracking to be switched on over there. Nobody has checked. Received is the safer of the two — it is a fact about one receipt and should come off the bill either way; on hand is the one that needs lot tracking. If it cannot be read, received stays (typed here beside the batch number as a fourth fact we own, if QuickBooks will not give it), on hand goes, and Depleted has to come back to say what the zero was saying. Drawn as the optimistic case, added to spike S4 below rather than assumed.
Which QuickBooks PO fields are actually readable. The grid assumes the mirror can give us PO number, receipt date, a three-word status and a per-batch quantity per raw-stock item. Nobody has read the API for this yet — it is spike S4 in NEXT-STEPS.md, which owes us the RW SKU grammar too. If the status vocabulary differs, the screen takes QuickBooks' words rather than translating them — noting that Depleted is now dropped on our side even if QuickBooks reports it, because the On hand column says it better; and if POs cannot be read at all, the split down the header row reopens and all six columns become manual.
The COA belongs to the raw batch, but the shelf holds labelled goods. A product's finished stock can have been bottled from an older batch than the newest raw receipt. Drawn as newest received wins, which is what was asked for and is right most of the time; it is wrong the week after a delivery. Fixing it properly means the finished product knowing which raw batch it came from, which is a QuickBooks question, not a UI one.
Where the COA PDFs live. Not decided. A COA is per batch, not per formula, so it is a poor fit for the source-formula image library (MR-071) — which is for reusable images, and a certificate is used exactly once. Drawn as attached to the batch row with no library at all. If it wants an R2 prefix, it needs its own.
Whether a missing COA belongs in the header bell count. Drawn as no — the bell counts setup (MR-066), and a certificate is not setup. But a received batch without one is genuinely outstanding work on this record, so the counter rule may want widening rather than the row staying quiet in the grid.
How far back the grid goes. Four, because that is what was asked for. All batches ▸ is drawn but goes nowhere — whether a formula ever needs a full batch history screen, or whether four is simply the answer, is unanswered.
How many R2 prefixes. The brief said “two subfolders” while naming three libraries. Drawn as three — source-formula/, catalog-product/, sales-channel/ — because three libraries with two homes has no reading that works. Flagged rather than quietly decided; if two is right, which two share?