U1 parity: cached-Jacobian pullback vs direct VJP (word=happy/joy)
model=Qwen/Qwen3-0.6B  prompts=8  layers=[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]

|   layer |       cos |      |vA| |      |vB| |
|--------:|----------:|----------:|----------:|
|       8 | +0.999801 | +1.000000 | +1.000000 |
|       9 | +0.999862 | +1.000000 | +1.000000 |
|      10 | +0.999899 | +1.000000 | +1.000000 |
|      11 | +0.999904 | +1.000000 | +1.000000 |
|      12 | +0.999923 | +1.000000 | +1.000000 |
|      13 | +0.999940 | +1.000000 | +1.000000 |
|      14 | +0.999953 | +1.000000 | +1.000000 |
|      15 | +0.999967 | +1.000000 | +1.000000 |
|      16 | +0.999976 | +1.000000 | +1.000000 |
|      17 | +0.999982 | +1.000000 | +1.000000 |
|      18 | +0.999985 | +1.000000 | +1.000000 |
|      19 | +0.999990 | +1.000000 | +1.000000 |
|      20 | +0.999992 | +1.000000 | +1.000000 |
|      21 | +0.999994 | +1.000000 | +1.000000 |
|      22 | +0.999996 | +1.000000 | +1.000000 |
|      23 | +0.999996 | +1.000000 | +1.000000 |
|      24 | +0.999996 | +1.000000 | +1.000000 |

min cos = +0.999801   GATE (>0.999): PASS
