### Fixed

- **simulation**: end-effector hint words were matched as bare substrings, so the short hints fired inside unrelated words - `"ee"` occurs in `"knee"`, `"wheel"` and `"unitree"`. `discover_ee_frame()` resolved a knee or a drive wheel as the end-effector on 12 of the 62 loadable registry robots - the frame `move_to()` servos toward and every `eef_delta` / `cartesian_delta` policy chunk is applied to - and `list_bodies(robot_name=...)` advertised one as the robot's gripper/EEF mount on 18 of them, which is the answer a caller resolves `add_camera(parent_body=...)` from for a wrist view. Hints now match name *components* everywhere the question is asked, through one shared matcher (`hint_matches_name()`) that `discover_ee_frame` and both `list_bodies` backends call, so a body cannot be an end-effector to one surface and not to the other: names are split into tokens on separators, camelCase boundaries and letter/digit boundaries, and a hint matches when its own tokens occur as a consecutive run, so `attachment_site`, `wristYawLeft`, `tool0` and `ee_link` all still resolve while a hint can no longer fire inside an unrelated word.
