kerfmaster pin list · The interface — recorded intent (build later)
recordStates what the code does today. Auditable against the code — this is the only type that can go stale.
Content last changed 2026-09-01 — computed from the item itself, not typed.
Contract — Report stage
This contract describes the code as it runs today.
takes delivery
makes delivery
fails if A delivery shipping without customer.html; a customer sentence re-typed instead of derived; a shop page not quoting the customer sheet verbatim; a banned word or link shipping on a customer page.
Contract last changed 2026-09-01 — computed, not typed. Dated separately from the text above, so neither date can speak for the other.
The last recorded UI brick: the customer sheet of the ruled customer/shop split (Aristide 2026-08-05, pin client-shop-split), on both delivery surfaces. Built 2026-09-01 on Aristide's go ("go for last brick").
server._cust_sentences(v) derives every customer sentence from the very packet.json dict the floor packet renders — material in plain words ("Mild Steel, 0.125″ thick"), finished size / pieces / sheets / asked-vs-filled quantities with the shop's numbers VERBATIM, the production-check sentence with exact red/yellow counts (red = "N points on this job need a decision before we cut — we will review them with you first"; a customer is never invited to approve a job the shop has on hold), and the revision line naming what it replaces. _customer_html renders them plus the real geometry preview (the letter ruling: never a verbal description standing in for the picture); the nested delivery's previews carry PLAIN captions ("Sheet 1 of 2 — 3 pieces" — program numbers are shop vocabulary)._cust_quote_block(v) — the same sentence function, quoted verbatim on the floor packet, the nest packet and both board pages, so anyone can check the translation never softened a number._customer_vocab_census runs on the RENDERED page exactly like the MetaCam census on the delivered DXF: any banned word (ring/slot/ligament, psi/yield, pierce/slug/kerf/wirejoint, nest/macro/audit/census/dxf/gcode/toolpath/comp/boundary…, any O-number) or any hyperlink REFUSES the delivery — a breach is our generator defect, never an operator matter. The customer's own part name is their word and is exempt.Wiring: run_deliver and run_delivernest write customer.html into every version dir, zip and board build; the Deliver tab offers a "customer sheet" button beside the floor packet (only on versions that carry the file — older immutable versions stand as delivered). Stale honest-limit records on bricks 7/9/14 fixed in this same commit.
Proven: test_customer.py (19 controls, new suite — the four rules one by one, census as gate, part-name exemption) + app/verify_customer.js live over the public URL (16 checks, fresh page per phase): nav209 single-part v5 (6 yellow → "We noted 6 points of attention…"), ex2_dirty red job ("2 points … need a decision before we cut", count matching the packet's RED banner), ms-verify 2-sheet nest delivery (plain captions, no program numbers on the customer page), quote-back verbatim on packet AND board pages, UI button. All six prior suites pass.
Honest limits: the delivery customer sheet carries what the delivery dataset holds — no pricing (the sales quote surface is its own stage), no time estimate (PENDING everywhere, honestly), no per-feature engineering translation; weight in pounds waits for a density column in materials.json (never invented). Operator identity ('by whom') stays a later brick.
Hardened 2026-09-01 (systems-test fix block 1): the census part-name exemption is SCOPED — only the rendered <span class="pname"> occurrences and the title element are excused (the old global string strip let a part named after a banned word blank that word out of generator text, and a name containing href= could mask a real anchor). Controls 20–26 prove the scoping, the escape, and that the exemption survives. Suite now 26 controls; verify_customer.js compares verbatim quotes at TEXT level (same words, escaped render).