Skip to content

Printed fixtures, and the path from video capture to a trusted arm policy - #6

Open
di-omics wants to merge 3 commits into
feat/coverage-durability-teaching-feedbackfrom
feat/printed-fixtures
Open

Printed fixtures, and the path from video capture to a trusted arm policy#6
di-omics wants to merge 3 commits into
feat/coverage-durability-teaching-feedbackfrom
feat/printed-fixtures

Conversation

@di-omics

Copy link
Copy Markdown
Owner

Stacked: printed.py imports Refusal from durability. Retarget to main once that branch lands.

printed.py -- the boundary is physical, not regulatory

FDM parts were measured by computed tomography at 4.05-6.32% porosity with infill fixed at 100%. That cannot be validated as cleanable, so it does not go in a fluid path, and post-processing claiming to fix it is recorded as a claim.

Of the materials characterized, only a certified biocompatible photopolymer reaches culture contact, and only that plus machined stock reach sample contact. Everything printable holds things; nothing printable holds liquid. A fixture with nothing declared is refused for every use.

Four refusals carry the weight: porous process in a fluid path; a material whose Tg sits below the sterilization cycle (PETG at 69-77 C comes out the wrong shape from a 121 C autoclave); a part nothing positively locates, which needs no operator error to move and invalidates every taught position once it has; and a critical dimension designed rather than measured.

hardware/tilt_module.scad is the worked example: real ANSI/SLAS figures, 7 deg default, no hinge because an adjustable angle is one nobody records. It defaults to printing the test coupon, and states no recovery figure anywhere.

imitation.py -- video capture to a trusted policy

A video is not a demonstration. Teleop records the arm's own joint states; monocular human video needs pose estimation then retargeting onto different kinematics, two estimators in series. No verified figure for retargeting error was found at all, and the published hand-pose magnitudes alone reach 185.67 mm.

The fixture is inside what the policy learned. A policy carries the fixture revision it trained on, and a capture recording no fixture does not count as agreeing with one that did.

A properly run evaluation is not a good result. The module shipped with trusted=True for a policy that succeeded in zero of twenty held-out trials. evidence_complete and trusted are now separate, and trusted requires a declared acceptance rate that the interval's lower bound clears. That makes 18 of 20 fail an 80% bar that 90 of 100 clears, at the same point estimate.

Interlock adds the leg that was missing: workspace, speed and force bounds enforced outside the policy, with a measured miss rate obtained by driving the violation.

Audit found 3 blockers and 2 majors, all closed with regression tests, including success figures quoted as bare percentages off 12 and 24 trials that this module's own success_rate would refuse.

Note: openscad is not installed here, so the SCAD is structurally checked but has not been rendered.

126 new tests. Recreated after the PR history was reset; the branch is unchanged.

@di-omics
di-omics force-pushed the feat/coverage-durability-teaching-feedback branch from d531723 to 3330cda Compare July 29, 2026 17:39
di-omics added 3 commits July 29, 2026 10:39
The argument running through this portfolio is that a lab does not need a vendor to ship
AI-native labware. That is only honest if the part you printed is held to the standard
everything else here is held to, and a printed fixture is untested hardware made in-house,
sitting inside the working envelope of a moving robot, sometimes near reagents.

The boundary that decides most of it is physical rather than regulatory. Fused-deposition
parts were measured by computed tomography at 4.05 to 6.32 percent porosity with infill
fixed at 100 percent, so an FDM part cannot be validated as cleanable and does not belong in
a fluid path. Post-processing that claims to close this is recorded as a claim rather than a
solution, because a coating whose integrity nobody measured is an assertion about a surface.

The consequences are computed rather than declared. Of the materials characterized here only
a certified biocompatible photopolymer reaches culture contact, and only that plus machined
stock reach sample contact: everything printable holds things and nothing printable holds
liquid. A fixture with nothing declared about it is refused for every use, since passing by
virtue of having no properties is the vacuous-pass failure this package exists to refuse.

Four refusals carry the practical weight. A porous process in a fluid path. A material whose
glass transition sits below the sterilization cycle -- PETG relaxes its frozen-in extrusion
stresses at 121 C and comes out the wrong shape. A part that nothing positively locates,
which needs no operator error to move and invalidates every taught position that references
it once it has. And a critical dimension that was designed rather than measured, which is a
fact about the model: desktop tolerance runs about half a percent with a half-millimetre
floor, shrinkage is material and vendor specific, and the first layer is wider than the model
by roughly the compensation a slicer applies without being asked.

hardware/tilt_module.scad is the worked example, a passive fixed-angle fixture that pools
residual liquid at one side of each well. No hinge and no adjustment, because an adjustable
angle is an angle nobody records, and a hinge is a degree of freedom inside a moving arm's
envelope. It defaults to printing the test coupon rather than the fixture so the fit is
proven before hours are committed, and it states no recovery figure anywhere. The guide
gives the gravimetric protocol that would produce one instead.

Every material property, tolerance, and porosity figure was verified against published
sources before it was encoded, and the ones that could not be confirmed are marked rather
than rounded. openscad is not installed here, so the SCAD is checked for structure but has
not been rendered.

71 new tests, 418 total. ruff clean.
The repo runs an ascii job that refuses non-ASCII bytes in tracked text, and the two new
markdown files carried section signs and plus-minus signs. Replaced with '+/-' and plain
cross-references.

Worth keeping: a tolerance written as a plus-minus glyph reads fine in a browser and badly
in a terminal, a diff, and half the tools that will ever open a hardware note.
The portfolio had a vision layer, an arm, and a printed-fixture layer with nothing between
them. The join is the flow this work is actually for: capture a demonstration, train an arm
from it, and use a printed fixture to make the task tractable. This computes whether a
capture can train a policy at all, and whether the policy may then be handed material.

A video is not a demonstration. Teleoperation and kinesthetic capture record the arm's own
joint states, so the action stream is measured; a monocular human video has none and needs
pose estimation followed by a retargeting model onto different kinematics, which is two
estimators in series rather than a conversion. No verified figure for human-to-robot
retargeting error was located at all, and the published magnitudes for the hand-pose stage
alone reach 185.67 mm, so an unmeasured retargeting is not a small unknown.

The fixture is inside what the policy learned, which is the connection to the printed layer
and the reason a reprint is not a neutral act. A policy carries the fixture revision it
learned on, and a capture that recorded no fixture does not count as agreeing with one that
did: the part was physically there whether or not anybody wrote it down.

A properly run evaluation is not a good result, and this is the distinction the first draft
got wrong. Trust.MEASURED means the evaluation was conducted correctly, and a policy that
succeeded in zero of twenty held-out trials satisfied it. The enum docstring already said
MEASURED does not mean good; the boolean said otherwise to anyone who branched on it rather
than reading the prose. evidence_complete and trusted are now separate, and trusted requires
a declared acceptance rate that the interval's lower bound clears. There is no default rate,
because what is tolerable belongs to the task rather than to this module.

A run needs a bound that lives outside the policy, since a learned policy carries no
guarantee about an input it has not seen. Interlock demands workspace, speed and force
bounds, something named as enforcing them, and a measured miss rate obtained by driving the
violation rather than by observing that nothing went wrong.

Three further audit findings are closed with regression tests: an unrecorded fixture
coupling silently agreeing with a recorded one, a retargeting error accepting zero and
negative distances, and success figures quoted as bare percentages off twelve and
twenty-four trials, which are counts this module's own success_rate refuses. Those now
appear as counts with their intervals, and the simulation result that had been welded onto
a real-robot sentence is marked as simulation and reported across all nine models rather
than cherry-picked to the worst.

55 new tests, 474 total. ruff clean against the pinned version, ASCII clean.
@di-omics
di-omics force-pushed the feat/printed-fixtures branch from 80ff4c6 to 0832622 Compare July 29, 2026 17:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant