A fixed workflow for every future component — the head next, then whatever follows. Each stage exists because skipping it has already cost this project real time, and the failures are named so the rule is not abstract.
On 2026-08-21 a correct, physically measured hole spacing of 10.0 mm was "corrected" to 12.0 mm on the strength of three CAD files that agreed with each other — and a claim was attributed to the operator that they had never made. Both were caught, everything was reverted byte-for-byte, and no part was printed. But nothing in the process caught them: a person did, several messages later.
Every stage below is one of the gates that was missing. Stage 3 alone would have caught both failures in a single line.
Write down, in one place: which physical part is on the robot right now, which files claim to describe it, and which of those are archived or superseded. Then apply the ordering.
Moving_Jaw_PLA.stl was measured as if it were the mount. It is an archived file
from a known-bad upload. Three files agreed on 12.000 mm — all descended from that same
upload — and the agreement was read as proof. The 59 superseded STLs are now in
archive/ with a README saying they must not be used for measurements.
A replacement part is defined by what it has to mate with, not by what it looks like. Every interface becomes a fixed constraint; everything else is design freedom. List them first, then the measurement set follows automatically.
The most reliable readings are outer-surface to outer-surface, because calipers can reach them. Name each point, say which part it is on and which side, and give its span partner. Where two points are not level, measure the component along the axis that matters — square, not diagonal.
I restate every number in my own words, with what I believe it means physically, and derive at least one prediction from it that you can check against the real part without a caliper. You confirm or correct. Nothing is designed until this passes.
# the shape of the echo-back
you said : A = 78.4 mm
I read it as : outermost foot corner (left blade) to outermost foot
corner (right blade), gripper fully closed, protrusions touching
which implies : each foot edge sits 39.2 mm from the centreline
a prediction you can check : the two feet together should be about
11 mm narrower than the mounts they sit on — is that
roughly what you see?
provenance : MEASURED (caliper, 2026-08-21), not derived
One number, two derivations that do not share a source. If they agree, proceed. If they disagree — stop. Do not average them. Do not pick the one that fits the plan. Go back and find out why.
| Group | What goes in it | Gripper example |
|---|---|---|
| Fixed | Interfaces you cannot change — they belong to something else | Bolt spacing 10.0 mm; jaw pivot at (−20.2, −24.4); closed = 0°, open = 97.4° |
| Free | Real design space — where judgement applies | Rib pitch and angle, tip profile, texture, blade length |
| Limits | Bounds from material, process or load | TPU hole-edge margin ≥ 0.85 mm; print flat, layer lines across the bend; nozzle 0.4 mm |
For each criterion: which check, which threshold, run against which file. Include the ones an automated tool cannot catch — those need a named manual step, or they will be skipped.
# the gripper's set, as an example of the shape
automated check_mesh.py connected shells = 1, watertight, manifold
automated check_ribs.py run on the TOOTHLESS body, not the final part
manual texture bands vertex count per 5 mm z-band, body vs toothed
manual hairline gaps slice at y=0, list every closed loop under 6×6 mm
The last two exist because both defects passed check_mesh cleanly. A watertight
mesh can still have a texture band silently clipped away and a hairline gap that the eye
finds and the script does not.
A number in a CAD script with no provenance will eventually be "corrected" by someone reading a file. Put the origin next to the value, and where a correct value looks wrong, say so explicitly.
// 孔距 = 10.000mm — operator's caliper reading on the real hardware. // ★★ Do NOT "fix" this to 12.0 from the STLs ★★ Someone did on 2026-08-21. // Every upstream STL says 12.000 — they all descend from one upload that // does not match the machine. Ruled on 2026-08-19. The measurement wins. HOLE_SPAN = 10.000;
python policy_safety.py --provenance does the same job on the software side —
one command that prints where each threshold came from. Any part with more than a handful
of constants deserves the equivalent.
The head has no STL available online, so it will be measured rather than downloaded — the first component to go through this workflow from the start. Stage 0 already turns up something that needs resolving before anything else happens.
| Question | Answer today |
|---|---|
| What versions exist? | v5 (Gemini 335 mount) and v6 (character kits) on main; v7 exists only on the branch hardware/head-v7-real-top-mount-20260821 — CAD, an assembly-stack diagram, engineering checks and reference photos |
| Which is current? | Unresolved. v7 is titled "real top mount" and is newest, but it is not merged. This repo has already been bitten once by an unmerged branch being mistaken for the current state — settle it before measuring |
| What are the interfaces? | The camera's own mounting pattern; the mast or top-mount face it bolts to; cable exit and bend radius; and whatever the head must not block in the arms' workspace |
| What has been measured? | Nothing found labelled as a caliper reading in the v7 docs — so treat every dimension there as unverified until stage 2 says otherwise |
It is deciding whether v7 on that branch is the current design or an abandoned line, the way
agent/policy-safety-wrapper-20260820 turned out to be. Then list the interfaces.
Then measure. I will echo back before anything is drawn.