← back to pin listCustomer sheet and shop sheet are always separate
kerfmaster pin list · The spec — what we build to
rulingclosed d22d23closed d24A decision by Aristide or Jordan. True because it was decided; it can be superseded, but it cannot be stale.
Content last changed 2026-08-09 — computed from the item itself, not typed.
Contract — Report stage
This contract states a decision, not an implementation.
takes delivery
makes delivery
fails if One page serving two audiences; customer wording re-typed beside the numbers instead of derived from them; a number softened on the way out; the customer sheet linking to the shop sheet.
Contract last changed 2026-08-06 — computed, not typed. Dated separately from the text above, so neither date can speak for the other.
1 open question blocks this pin
- Q15 Can the shop confirm yield 36000 psi, E 29e6 psi and density 0.284 lb/in3 for the stock actually used -- or give the real numbers?
Jordan — The shop sheet is meant to show the engineering behind every customer claim; behind these three is a handbook.
⚠ Known defects
This item's subject has known defects in the code. Recorded and deliberately NOT fixed — recording a defect is not a licence to fix it. Source: cadmaster/defects.json → cadmaster/KNOWN_DEFECTS.md, not this page — the text below is generated from the register so the two can never disagree.
- D22 — Swapping the front door from SVG to PDF mirrored every drawing, and no control could see it (CLOSED)
build_mvt_preview.render() mapped artwork y straight to SVG y: `(y - miny) * k`. That was right while mvt_prep read an SVG export, where y counts DOWNWARDS. mvt_geom reads the customer's .ai as PDF, where y counts UPWARDS, so from a7abeb9 onwards both sheets would have printed the sign upside down.
Cost today: None to the customer. The cost was to the control: it took a third-party render of the source file to notice, because nothing we measure is orientation-sensitive. That gap is now closed for this job only -- any other renderer we write from PDF coordinates has the same trap waiting.
Verified: 2026-08-06. Caught before publication -- no mirrored sheet was ever issued. The last published revision built from the SVG (Q0QB, withdrawn) was the correct way up because the SVG's y already pointed down. - D23 — Every build is archived and logged as an issued revision, including the ones nobody saw
build_mvt_preview.main() copies the sheets into rev/<code>/ and appends to revisions.json on every run. Three runs while fixing wording produced 5TK0, WYJS and ZEA4; only ZEA4 was ever shown to anyone. The other two were removed by hand.
Cost today: Nothing has gone wrong yet. The ledger is correct today only because I cleaned it, which is exactly the maintenance the ledger exists to avoid.
Verified: 2026-08-06. Not fixed. Issuing is a human act -- somebody decides to send it -- so the fix is a flag on that act, not a cleverer build. - D24 — Fixing D16 retired option A's bridges, and nothing said so -- they stayed in, holding a piece that was already attached (CLOSED)
While the ring's hole was subtracted from the cloud there was no metal behind the hole, the triangle floated inside it, and three bridges held it. D16's fix unioned the hole, which put the cloud back -- and the cloud reaches far enough into the hole to overlap the triangle by 240.19 pt2 = 6.84 in2, over a 3.38 in chord. The triangle has been continuous metal since a7abeb9. The three bridges were still being built, welded on at both ends, and quoted to the customer as what holds it.
Cost today: None shipped: revision Q0QB was withdrawn before this and ZEA4 stood for under an hour. The cost is the lesson -- a geometry fix silently changed what an unrelated feature was for, and only a measurement no one had asked for caught it.
Verified: 2026-08-06, revision R357. Two placement bugs were found on the way and fixed in the same pass, and both would have survived if the bridges had simply been deleted: a bridge aimed radially from the ring centre ran nearly parallel to the triangle edge it joined, so a square-ended bar met it with a corner (0.130 in of attachment on a 0.202 in bar); and both ends STOPPED on the curve they joined instead of lapping into it, so the two plates met over the sagitta of a 1.2 pt chord. Bridges now attach at the middle of an edge along its outward normal -- CLAUDE.md's own rule for where a hold goes -- and run a bar's width into each plate.
Every result that goes to a customer is split into two generated pages from one dataset: a customer sheet and a shop sheet. This is a standing ruling by Aristide (2026-08-05), given in response to the MVT icon preview, which had customer copy and shop engineering on the same page.
What separates them
- Customer sheet — plain language and consequences. Pounds, inches, what will bend and how. No psi, no yield, no section modulus, no pierce checks, and none of our internal vocabulary: say circle not ring, tabs not bridges, joins or short connections not ligaments, a narrow gap not a slot.
- Shop sheet — the engineering behind every claim: stresses, margins, load cases, pierce clearances, minimum feature widths, exception lists.
Rules that keep the split honest
- One dataset, two renderers. Both pages are generated from the same JSON so they cannot drift. The customer wording is derived from the measured numbers, never re-typed alongside them.
- The shop sheet quotes the customer sheet back. Each option shows the exact sentence the customer is reading, so anyone can check the translation didn’t soften the finding.
- The customer sheet never links to the shop sheet. The shop sheet links to the customer sheet; not the other way round.
- Softening is a defect. Plain language means fewer words, not a smaller number. If the shop sheet says it bends at 9 lb, the customer sheet says 9 lb.
First built for the MVT icon: build_mvt_preview.py → viewer/mvt-preview/ (customer) and viewer/mvt-preview/shop/ (shop).
2026-08-06 — the split now covers the mounting. Options B and C carry sited spacers: an exploded view, an edge-on section drawn to true scale in both axes, and a hole position for every spacer. Customer sheet gets the pictures, how far it stands off the wall, and the least metal round any hole; shop sheet gets the same sites as coordinates with clearance, web, what each spacer passes, and the note that a 0.219 in hole is under the pierce standoff. Two vocabularies, one map (CLIENT_WORDS): the build calls it the ring, the customer sentence says circle. The mounting sentence is generated by mount_note() from the sited spacers, like every other customer sentence on the page.
The customer letter is a renderer, never an author (added 2026-08-09, from the round-3 blind test)
The letter/cover page falls under one-dataset-two-renderers like every other customer artifact: every claim in it is DERIVED from the measured dataset, never hand-written beside it. Round 3 hand-wrote the letter and it contradicted the measurement in three places ("nothing shows on the front" vs 45 in² of visible template; "mounts anywhere on the wall" vs offsets with zero bolts; "13–15 lb" omitting an 11.5 lb plate the lags actually carry). A claim that cannot be traced to a measured number does not go in the letter. Any ship-hold or unresolved breach on the shop sheet appears on the letter too — a customer must never be invited to approve a job the shop has on hold.
The letter is graded by its FUNCTION: can a stranger choose?
Same doctrine as tolerance-follows-function, applied to documents (Aristide, 2026-08-09 — a letter you cannot decide from is "totally useless" no matter how clean its language). A customer letter is defined by what the reader can DO after reading it: pick an option and say yes. The options ARE the approval mechanism, so the letter must carry, all derived from the dataset: a preview image per option (front view, on the wall, rendered from the measured geometry — never a verbal description standing in for the picture); the measured weight/size/consequence numbers per option, unsoftened; cost per option, or an explicit "quote follows"; and the decision question itself. Grading is the same test: could a stranger pick an option from this page alone? If not, the letter fails regardless of how polite its prose is. Deferring the decisive artifact ("we can show you a drawing before you decide") is the letter confessing it failed its function.