Both reconstructions through one protocol: half the frames in each group fit a 5-feature least squares, half are scored; pooled ρ, five seeds, beside a within-group label shuffle. The second number in each cell is ρ minus that row's own floor — the comparable one — and bold marks the larger. Only the image→gradient step differs.
| dataset | n | LUT ρ / margin | calibration-free ρ / margin | shuffle floor | groups fitted |
|---|---|---|---|---|---|
| GelSight Mini, CNC presses, 0-20 N | 605 of 6,219 | 0.993 +0.925 | 0.998 +0.909 | +0.067 / +0.089 | 6/6 |
| FoTa cnc_Mini | 604 of 3,351 | 0.900 +0.940 | 0.938 +0.903 | -0.040 / +0.035 | 6/6 |
| FEATS (MARKER gel) | 2,000 of 16,276 | 0.642 +0.553 | 0.706 +0.617 | +0.089 / +0.089 | 8/8 |
| Sparsh / Meta, 10 gel pads | 2,000 of 129,389 | 0.959 +0.909 | 0.986 +0.956 | +0.050 / +0.030 | 4/4 |
| FeelAnyForce floor-dominated | 2,000 of 13,892 | 0.939 +0.197 | 0.949 +0.208 | +0.742 / +0.741 | 13/14 |
Excluding them is what the headline row buys: on GelSight Mini, CNC presses, 0-20 N calibration-free scores ρ 0.998 on whole presses against 0.851 once truncated frames are mixed in. Three datasets reach the 2,000 this table samples; the two that cannot have no more presses to give.
The same protocol without that exclusion.
| dataset | n | LUT ρ / margin | calibration-free ρ / margin | shuffle floor | groups fitted |
|---|---|---|---|---|---|
| GelSight Mini, CNC presses, 0-20 N | 2,376 of 6,219 | 0.707 +0.571 | 0.851 +0.713 | +0.135 / +0.138 | 6/6 |
| FoTa cnc_Mini | 2,239 of 3,351 | 0.442 +0.416 | 0.482 +0.449 | +0.026 / +0.033 | 6/6 |
| FEATS (MARKER gel) | 2,956 of 16,276 | 0.707 +0.525 | 0.702 +0.506 | +0.183 / +0.196 | 8/8 |
| Sparsh / Meta, 10 gel pads | 3,091 of 129,389 | 0.669 +0.629 | 0.698 +0.657 | +0.040 / +0.041 | 4/4 |
| FeelAnyForce | 3,378 of 13,892 | 0.905 +0.509 | 0.935 +0.531 | +0.396 / +0.404 | 14/14 |
The shuffle floor is an absolute ρ — what this protocol scores with labels permuted inside each group; the margin beside each cell already has it subtracted. React's production number adds a fitted position gain field and lives on the method page.
FoTa cnc_Mini→FEATS, Sparsh→FEATS are ≥99 % extrapolation. — there MAE is extrapolation, not prediction. FeelAnyForce's row goes negative: collinear features let least squares cancel opposite-sign terms (method). Non-negative weights fix it: off-diagonal ρ 0.574 → 0.731, negative cells 3 → 0 of 20, costing 0.010 on the diagonal. The deployed estimator is unchanged: on React both agree at ρ 0.989 (1.8 % of frames outside the rig's range), and 15 held-out seeds differ by +0.002 ± 0.014 ρ.
React's own calibration objects cannot answer this: calibration-free scores ρ 0.781 against the LUT's 0.763 on 158 held-out presses, but a paired bootstrap puts the margin at 95% CI [-0.081, +0.120] — a coin flip. Nor does the table: calibration-free leads on raw ρ everywhere, but over each row's own floor it is ahead on 3 of 5. It ships because it needs no per-sensor lookup table, not because it measures force better.
The two agree at ρ = 0.925 over 2,400 React
frames, mean difference 0.86 N. Published to yxma/React: this channel across all 72 sides of 36 episodes (480,080 frames).
The ten worst held-out frames reconstruct as well as the five best — same gradient dipoles, same compact depth, no ramping. The residual is in the depth→force fit, not in image→depth, so a better reconstruction will not move them.
Each panel: the ten worst held-out frames, with the five best as a control. Relative error is |pred−true| over the dataset's force span.




