← all reports
standing procedure measure → confirm → design → verify 2026-08-21

Replacing A Part

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.

!

Why this exists

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.

0 · what is authoritative 1 · interfaces first 2 · measure 3 · echo back I restate, you confirm — a GATE 4 · cross- validate 5 · constraints + 6 · design 7 · verify + record source mismatch → re-measure two paths disagree → re-measure, never average no CAD is written before the green gate
The two dashed returns are the whole point: a mismatch at the confirmation gate, or two independent derivations disagreeing, both send the work back to measuring rather than forward into CAD. Everything to the right of the gate is cheap; everything to the left is where errors are still free to fix.

The seven stages

stage 0

Establish what is authoritative, before quoting any number

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.

  • A physical measurement beats a file. Always. A file can predate the part.
  • Files agreeing with each other is not evidence if they share an ancestor.
  • An archived file is not a reference. It is a record of what was once tried.
what went wrong 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.
stage 1

List the interfaces before deciding what to measure

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.

  • Every fastener: count, spacing, diameter, thread or clearance
  • Every mating surface: which face touches what, and in which direction load passes
  • Every clearance: cables, moving parts, the workspace it must not intrude on
  • Every datum: what you will measure from, stated once and used throughout
stage 2

Measure spans between named points, not "dimensions"

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.

  • Label every number measured, derived, or chosen — and never let a chosen number get described as measured later
  • Take each critical span twice, and say if the two readings differ
  • A photo with the caliper in place is worth more than the number alone
what went wrong An earlier request asked "if they touch flat, roughly how long is that contact" — meaning length in millimetres, read as duration. A measurement request that can be misread is a defect in the request. Name two points and ask for the distance between them.
stage 3 · the gate

Echo back before any CAD is written

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
what went wrong "The operator confirmed the 10 mm came from their first test piece" was written into a source-code comment. The operator never said that. An echo-back would have surfaced it in one line, before it reached a file. The false attribution has been removed.
stage 4

Cross-validate every critical number by a second, independent path

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.

  • Independent means different origin: a caliper reading vs a file, a file vs a photo with a scale, an assembled measurement vs a sum of parts
  • Two files are not independent if one was generated from the other
  • When physical and file disagree, the physical wins — but record the disagreement rather than silently overwriting
stage 5

Write the constraint set down, in three groups

GroupWhat goes in itGripper example
FixedInterfaces you cannot change — they belong to something elseBolt spacing 10.0 mm; jaw pivot at (−20.2, −24.4); closed = 0°, open = 97.4°
FreeReal design space — where judgement appliesRib pitch and angle, tip profile, texture, blade length
LimitsBounds from material, process or loadTPU hole-edge margin ≥ 0.85 mm; print flat, layer lines across the bend; nozzle 0.4 mm
what went wrong "A 90° step is an overhang, it won't print" sat in the source as a limit and shaped the tip for several revisions. The part prints flat — the whole profile lies in the bed plane, so a 90° step is a vertical wall with zero overhang. A limit that is not tied to the actual process is a guess wearing a constraint's clothes.
stage 6

Define the acceptance criteria before building, not after

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.

stage 7

Record where every constant came from, in the source

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.

Next application — the head

Running stage 0 on it right now

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.

QuestionAnswer 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

So the first move on the head is not measuring

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.