Repository navigation
v0.10.0 a robot ran it, the install stopped bringing one, and the arm gets put down
A real arm ran quackd, uv pip install quackd stopped installing a robot, and quackd learned to
put the arm down before it lets go.
A robot ran it
On 2026-09-15 an SO-101 follower arm connected over lerobot:real and a real model drove it,
twelve runs in one afternoon, piloted by OpenAI's gpt-6-astra from a Windows laptop with a USB
webcam. The README leads with a recording of the last of those runs now, rather than with two
rendered ducks, and What happened in that run
reads its transcript call by call.
The honest half is the longer half, and it is all written down. The arm fell at the end of every
one of those runs. The webcam framed the gripper and cropped the raised arm out of the picture,
so the model checked its own waves against joint readings rather than against what it could see.
Six of the seven bodies have still never met hardware.
Breaking: the install brings no robot
Every adapter is its own distribution now, built out of this repository as a uv workspace. The
extras you already know still buy the body, so the migration is one line: anybody who
installed quackd and ran the simulator now wants quackd[microduck]. With nothing installed,
every command that needs a body refuses and names what to install rather than running anything.
Eight distributions, one version between them: quackd, quackd-microduck, quackd-lerobot,
quackd-rosbridge, quackd-open-duck, quackd-xlerobot, quackd-alohamini and
quackd-toddlerbot.
The arm gets put down
You fold the arm by hand once and record that posture with quackd robot rest-pose. From then on
every run drives the arm there before the model gets it, and returns it there before the
disconnect, on every exit path a run has, including the ones nobody plans for. Where the arm did
not get there, torque stays on and you are told so in one line rather than the arm being dropped.
It has stopped no arm falling yet, because no arm has run it.
You can also place the arm yourself before the model gets it, with quackd run --by-hand, and
give a task its own picture with --image.
An optional stepper in front of the model
quackd run --jev is off by default. It answers the turns that are a choice rather than the
turns that need writing, and which turns those are is computed from each verb's own schema and
nothing else. It has never made a real call here, the speed and cost figures are arithmetic over
measured inputs rather than a measurement of the stepper itself, and switching it on says so.
Also
Eleven fixes the release audit found, including a tool_result that answered the model's own
call with a different verb's outcome whenever the stepper took a turn, and an openai extra that
allowed a version of the SDK too old to make the call quackd makes. Both nightly jobs, neither of
which had ever passed a scheduled run, are green.
Full detail, and a Known limitations section, in
CHANGELOG.md.