# Lockstep 9x9 matrix test — results

**Source:** `cwola_export_20260415.json` (N = 2209; A = 161, B = 2048)

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 |
|---|---|---|---|---|---|
| sema_boost | lex_anchor | -0.0420 | +0.066 | +0.022 | 0.0484 |
| fts5 | harmonic | -0.0344 | +0.147 | +0.052 | 0.106 |
| sema_boost | pki | -0.0333 | +0.027 | +0.001 | 0.118 |
| splade | harmonic | -0.0332 | +0.345 | +0.220 | 0.118 |
| lex_anchor | harmonic | -0.0315 | +0.472 | +0.291 | 0.139 |
| tag_exact | harmonic | -0.0315 | +0.653 | +0.455 | 0.139 |
| tag_prefix | harmonic | -0.0311 | +0.728 | +0.526 | 0.144 |
| sema_boost | tag_exact | -0.0309 | +0.147 | +0.084 | 0.146 |
| harmonic | harmonic | -0.0304 | +1.271 | +0.979 | 0.153 |
| pki | harmonic | -0.0277 | +0.332 | +0.201 | 0.193 |

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

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

- **Frobenius ||C_A - C_B||:** 0.6212 (baseline: 0 if identical, ~1-2 typical for small samples)
- **Max entrywise |ΔC|:** 0.1556 on lex_anchor<->harmonic
- **Top eigenvalues A:** ['4.381', '1.435', '1.086']
- **Top eigenvalues B:** ['4.213', '1.405', '1.219']
- **Condition number A:** 293.3, B: 295.7

### Top pairs by |ΔC|

| tier_i | tier_j | corr_A | corr_B | delta |
|---|---|---|---|---|
| lex_anchor | harmonic | +0.449 | +0.293 | +0.156 |
| sema_boost | tag_exact | +0.293 | +0.142 | +0.151 |
| pki | harmonic | +0.372 | +0.234 | +0.139 |
| tag_exact | harmonic | +0.595 | +0.459 | +0.135 |
| sema_boost | tag_prefix | +0.301 | +0.190 | +0.111 |
| tag_prefix | harmonic | +0.641 | +0.532 | +0.109 |

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

| k | eigval | %var | r vs bucket | top loadings |
|---|---|---|---|---|
| 0 | 4.222 | 46.9% | +0.0026 | tag_prefix=-0.46, tag_exact=-0.45, lex_anchor=-0.44 |
| 1 | 1.405 | 15.6% | -0.0067 | fts5=-0.66, sr=+0.50, sema_boost=-0.42 |
| 2 | 1.210 | 13.4% | -0.0342 | harmonic=+0.63, sema_boost=+0.54, sr=+0.45 |

## 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`
