Tests and publishing
A recipe carries its own tests: sets of parameters, and the cut list each one must produce.
"tests": [ { "id": "default_door", "params": {}, "expect": { "cutList": [ { "material": "oak_natural", "thickness": 18, "length": 720, "width": 560, "quantity": 2, "edges": { "L1": "abs2" }, "grainAlongLength": true, "role": "side", … } ] } }]You do not type those numbers. The editor records what the recipe produces now, and the check compares against what it recorded — the same code path, so a case you record passes by construction. What the test is for is the day after: any change to a formula, to the blank rule, to the banding translation or to the ordering moves them, and moving them becomes a decision somebody makes rather than a diff nobody reads.
Five cases is the minimum, and the useful five are not five widths. Take the extremes of each range, one of every front, and one combination you expect to be refused.
The comparison is on the rows, not on the objects: a case that fails because
shelf[2] became shelf[3] is a case people re-record without reading, and
after the third time they re-record it always.
What the validator refuses
Section titled “What the validator refuses”Asked once, when you publish — every fault it finds is the same for every customer who will ever open the recipe:
| It refuses | Because |
|---|---|
| an unknown name in a formula | widht is not width, and nothing else will say so |
a cycle in derived |
the cabinet comes out full of zeroes rather than failing |
| a name that is both a parameter and a derived value | one of them is silently preferred |
| two parts with one id | every reference to it picks one at random |
| a part in a slot the recipe does not have | it will wear no finish at all |
| banding on the flat of the sheet | it is dropped, and the panel arrives bare |
more than 400 parts after repeat |
§5.4’s ceiling |
| parts that overlap ANYWHERE in the ranges | see below |
| a default arrangement the recipe forbids | it would refuse on first sight |
Overlaps are checked across the whole parameter space, not only at the defaults — at the corners of every range and every option. That is not thoroughness for its own sake: a cabinet whose own divider meets the layout’s appears only above 900 mm wide, and everything below it is green.
It also warns, without refusing:
- a rule whose condition is false at every corner. Usually a rule copied from a
taller cabinet:
height > 900in a recipe whose height stops at 900 can never fire, and the third hinge it counts can never be counted. - an edge type or a fitting the catalogue has not been told about. The cabinet is still buildable; the price simply has a hole in it, and the quote names it.
A warning is never a refusal, because the corner check is a sample rather than a proof — and refusing a valid recipe stops a technologist’s day, while missing an invalid one is caught by a recorded cut list.
Versions
Section titled “Versions”A published version is immutable. Saved kitchens pin themselves to the version they were quoted from: their price, their cut list and their DXF resolve through it, and editing it would change all three under a customer who has already ordered.
- Editing a draft — free, as often as you like.
- Publishing
@2— the kitchens on@1do not move. Not their price, not their specification, not their geometry. - Deleting a version somebody has ordered from — refused by the database, not by a check somebody might forget.
The recipe’s own body is fingerprinted, so two shops that both publish
base_cabinet@3 with different bodies stay different cabinets even inside one
long-running service.
Importing a detail sheet
Section titled “Importing a detail sheet”If the family already exists in your own software, you do not have to type the formulas. Export the cut list at two widths and upload both: the rows are matched by role and size, and each dimension comes back as a constant, a formula or a blank.
Only slopes a person would have written are proposed — whole panels, halves, thirds, quarters. Two points always fit a line, and 0.9137 is a perfect fit and not a formula; you are there to confirm, so a plausible wrong answer is worse than an honest blank.
A part whose COUNT follows the parameter — three drawers at one width, four at
another — is reported rather than guessed at. That it changed is more than a
formula for one row would have told you: it means that part needs a repeat.