The finding
Probing all six joints by feel (gentle_move driven to each end of its permitted range),
three of them reached the software bound with no contact — still free — and stopped this
close to the encoder seam:
| joint |
reported |
→ raw |
seam @ raw |
gap |
outcome |
shoulder_lift |
4094 |
83 |
85 |
2 ticks |
no wall |
gripper |
4093 |
82 |
85 |
3 ticks |
no wall |
shoulder_pan |
4085 |
74 |
85 |
11 ticks |
no wall |
No contact means they could have kept going. Their remaining travel lies across the seam.
Why this is structural, not coincidence
Every joint except elbow_flex still carries the factory offset Ofs = 85. The
commandable bound is reported tick 4095. With Ofs = 85 that is raw 84 — exactly
one tick below the seam, which lives at raw == Ofs == 85.
For every joint at the factory offset, the software bound lands precisely on the seam.
So the arm has been reporting the seam as its boundary. We could not see past it, so we
could not know any of these joints' real ranges. elbow_flex is the only honest row in that
table — real walls at both ends (raw 983 and 3267), with 829 ticks of clearance from its seam —
and only because #35's re-zero moved its seam out of its travel.
Direct physical confirmation
shoulder_lift was left at reported 4094 by a probe. Torque released, and it sagged
under gravity through the seam — it now reads 2 (raw 87). Nothing commanded it there.
Its travel demonstrably includes the seam.
What this means
The chicken-and-egg, and the way out
To re-zero a joint you need its unreachable arc; you cannot measure the arc until you can see
past the seam. The escape (already proven on elbow_flex): temporarily shift the offset so
the seam moves out of reach, probe freely to find the true travel, then compute the permanent
offset from that — and restore it if you decide not to commit.
Three probe lessons worth encoding in whatever verb does this
- Creep outward; do not command the bound. Shifting the offset also flips which reported
direction maps to which physical direction, so "drive to reported 4095" can mean "drive
back into the wall you just found". Stepping outward from the current position is immune.
- "Not contacted" is not "no wall". A move can also time out — it could not get there and
we learned nothing. Conflating that with "reached the bound" silently turns ignorance into a
measurement. Three outcomes must stay distinct: WALL / EDGE / TIMEOUT.
- Mechanical vs environmental. A limit found in one pose is environmental — it is what the
joint can do given where every other joint happens to be. The mechanical limit is the
widest envelope ever seen across poses, since an obstacle can only ever make a range smaller.
Mechanical limits belong in arm_spec (intrinsic, portable); environmental limits belong in
the map (pose-dependent — and never in the servo's EEPROM).
elbow_flex's walls were confirmed mechanical by this test: probed in three poses
(shoulder_lift 3354 vs 3779, wrist_flex 3963 vs 1366), the wall moved by ≤4 ticks while other
joints moved by hundreds.
Related
Found during the hardware session that proved #35's re-zero — see
docs/hardware-rezero-run-2026-07-12.md. Blocks meaningful progress on #34, since the grid
cannot map a joint-space whose per-joint extents are artifacts.
The finding
Probing all six joints by feel (
gentle_movedriven to each end of its permitted range),three of them reached the software bound with no contact — still free — and stopped this
close to the encoder seam:
shoulder_liftgrippershoulder_panNo contact means they could have kept going. Their remaining travel lies across the seam.
Why this is structural, not coincidence
Every joint except
elbow_flexstill carries the factory offsetOfs = 85. Thecommandable bound is reported tick 4095. With
Ofs = 85that is raw 84 — exactlyone tick below the seam, which lives at
raw == Ofs == 85.So the arm has been reporting the seam as its boundary. We could not see past it, so we
could not know any of these joints' real ranges.
elbow_flexis the only honest row in thattable — real walls at both ends (raw 983 and 3267), with 829 ticks of clearance from its seam —
and only because #35's re-zero moved its seam out of its travel.
Direct physical confirmation
shoulder_liftwas left at reported 4094 by a probe. Torque released, and it saggedunder gravity through the seam — it now reads 2 (raw 87). Nothing commanded it there.
Its travel demonstrably includes the seam.
What this means
the whole codebase assumes may be false for most joints, and we could not tell because the
clamp hid it.
— the measurements feeding it were bounded by an artifact.
The chicken-and-egg, and the way out
To re-zero a joint you need its unreachable arc; you cannot measure the arc until you can see
past the seam. The escape (already proven on
elbow_flex): temporarily shift the offset sothe seam moves out of reach, probe freely to find the true travel, then compute the permanent
offset from that — and restore it if you decide not to commit.
Three probe lessons worth encoding in whatever verb does this
direction maps to which physical direction, so "drive to reported 4095" can mean "drive
back into the wall you just found". Stepping outward from the current position is immune.
we learned nothing. Conflating that with "reached the bound" silently turns ignorance into a
measurement. Three outcomes must stay distinct: WALL / EDGE / TIMEOUT.
joint can do given where every other joint happens to be. The mechanical limit is the
widest envelope ever seen across poses, since an obstacle can only ever make a range smaller.
Mechanical limits belong in
arm_spec(intrinsic, portable); environmental limits belong inthe map (pose-dependent — and never in the servo's EEPROM).
elbow_flex's walls were confirmed mechanical by this test: probed in three poses(
shoulder_lift3354 vs 3779,wrist_flex3963 vs 1366), the wall moved by ≤4 ticks while otherjoints moved by hundreds.
Related
Found during the hardware session that proved #35's re-zero — see
docs/hardware-rezero-run-2026-07-12.md. Blocks meaningful progress on #34, since the gridcannot map a joint-space whose per-joint extents are artifacts.