## Goal
A rigid tool is pivoted about a single fixed point. `scene.json` gives `N` samples of
the tool pose `T_tool_to_world` (4×4, row-major). The tool tip is a fixed unknown
offset `p_tip` expressed in the **tool** frame; across all samples it maps to the same
fixed pivot point `p_pivot` in the **world** frame:

```
R_i · p_tip + t_i = p_pivot     for every sample i
```

where `R_i`, `t_i` are the rotation and translation of `T_tool_to_world` for sample i.
Recover both `p_tip` (tool frame) and `p_pivot` (world frame). Measurements carry small
noise; report the **least-squares** solution.

## Method
Stack the linear system for the 6 unknowns `[p_tip; p_pivot]`:

```
[ R_i   -I ] [ p_tip  ]   [ -t_i ]
[          ] [ p_pivot] = [      ]     (3 rows per sample)
```

Solve by linear least squares (e.g. `numpy.linalg.lstsq`).

## Input: `scene.json`
```
{ "poses": [ [[4x4]], [[4x4]], ... ] }     # each is T_tool_to_world, row-major, mm
```

## Output: `result.json`
```
{
  "p_tip_tool":   [x, y, z],
  "p_pivot_world":[x, y, z],
  "rms_error": <float>   // sqrt( (1/N) * sum_i || R_i p_tip + t_i - p_pivot ||^2 )
}
```
Python 3.11 + NumPy only. No network access.
