# Lockstep 9x9 matrix test — results

**Source:** `cwola_export_20260414.json` (N = 791; A = 37, B = 754)

Follow-up to LOCKSTEP_TEST.md: the scalar gate failed at |r|>=0.2. This test checks whether the full 9x9 structure carries signal.

## Test 1 — per-row pairwise products of z-scores (45 unique features)

For each row, z in R^9 (tier didn't fire -> 0). Feature_ij = z_i * z_j. Point-biserial r vs bucket label (A=0, B=1).

### Top 10 features by |r|

| tier_i | tier_j | r | mean_A | mean_B | p |
|---|---|---|---|---|---|
| splade | sema_boost | -0.1268 | +0.268 | +0.012 | 0.000348 |
| sema_boost | pki | -0.1049 | +0.098 | +0.004 | 0.00315 |
| sema_boost | harmonic | -0.0921 | +0.129 | +0.003 | 0.00956 |
| sema_boost | lex_anchor | -0.0912 | +0.105 | +0.007 | 0.0103 |
| sema_boost | sr | +0.0886 | -0.110 | -0.013 | 0.0127 |
| sema_boost | tag_prefix | -0.0883 | +0.102 | +0.006 | 0.013 |
| sema_boost | tag_exact | -0.0852 | +0.103 | +0.004 | 0.0165 |
| fts5 | harmonic | +0.0431 | -0.424 | -0.245 | 0.226 |
| harmonic | harmonic | -0.0408 | +1.278 | +0.986 | 0.252 |
| fts5 | splade | -0.0276 | -0.265 | -0.410 | 0.438 |

**Gate FAILS** — max |r| = 0.1268 on splade x sema_boost. Signal is directional but sub-threshold.

## Test 2 — A vs B correlation-matrix delta

- **Frobenius ||C_A - C_B||:** 1.2931 (baseline: 0 if identical, ~1-2 typical for small samples)
- **Max entrywise |ΔC|:** 0.5287 on splade<->sema_boost
- **Top eigenvalues A:** ['5.485', '1.251', '1.059']
- **Top eigenvalues B:** ['5.283', '1.093', '0.992']
- **Condition number A:** 1875.5, B: 1439.4

### Top pairs by |ΔC|

| tier_i | tier_j | corr_A | corr_B | delta |
|---|---|---|---|---|
| splade | sema_boost | +0.558 | +0.029 | +0.529 |
| sema_boost | harmonic | +0.324 | +0.007 | +0.318 |
| sema_boost | tag_exact | +0.272 | +0.009 | +0.263 |
| sema_boost | tag_prefix | +0.275 | +0.016 | +0.260 |
| sema_boost | lex_anchor | +0.274 | +0.017 | +0.258 |
| sema_boost | sr | -0.291 | -0.041 | -0.250 |

## Test 3 — projection onto top-k eigenvectors of pooled correlation

| k | eigval | %var | r vs bucket | top loadings |
|---|---|---|---|---|
| 0 | 5.283 | 58.7% | +0.0061 | tag_prefix=+0.42, tag_exact=+0.41, lex_anchor=+0.40 |
| 1 | 1.091 | 12.1% | -0.0298 | fts5=+0.72, sema_boost=+0.36, splade=-0.35 |
| 2 | 0.994 | 11.0% | -0.0997 | sema_boost=-0.92, splade=-0.23, fts5=+0.21 |

## Verdict

**Gate still fails on matrix features.** Next moves: (1) query-type segmentation, (2) include semantic cos(query, candidate) as a 10th dimension, (3) try non-linear projections (e.g. kernelised). Even in this case, test 2 tells Gordon+Todd whether the A and B correlation structures are meaningfully different at the population level.

— Generated by `scripts/pwpc/lockstep_matrix_test.py`
