A Leader is whatever decides how the Follower should move. Nothing in it assumes a person, so a model drives an arm the same way an operator does: return the next pose from read_joints().
observation() gives the model the same thing a person looks at: a frame per camera and the joint values from that frame’s own capture instant. Reading it also stamps the next command with that observation’s id, so the recorded action is paired with what caused it.
Set max_misalignment and use arm_when_aligned() here too. A model whose first output is far from where the arm is standing makes the follower travel to meet it.

The safety envelope still applies

Everything a human operator passes through, the model passes through. The follower clamps to limits(), caps the per tick step at slew, and holds if commands stop arriving. That matters for training: action in a recording is the clamped value, so a policy trained on it learns the envelope rather than learning to command through one it will not have. See Exporting datasets.
Release the deadman to stop the model. The command stream stops, the follower’s watchdog runs out, and the arm holds where it is. That is the same stop a person gets, and it does not depend on the model cooperating.

Watching without driving

A third peer can join and see everything without ever taking control. Give the LeRobot leader adapter the joint names and no arm:
With no arm to read, read_joints() returns {} and the base refuses to send anything at all. Do not call claim_control() on it. It is there to observe and to record, which is useful when the person driving is not on the machine you want the dataset on.
A leader recording is indexed by video frame rather than by observation, so it samples the session differently from the follower’s copy. See Recording.

Leader

Every argument, method and event on this side.

Exporting datasets

Turn recorded sessions into training data.

Safety

The checks every command passes, whoever sent it.