# OAM-100 · Trajectory-Function Comparison

## 1. Gate Identity

`OAM-100-COMPARISON-001` · downstream, read-only comparison of the
already-frozen Gate-2 OAM output and Gate-3 Stockfish output over the
committed OAM-100 corpus. No OAM rerun. No Stockfish rerun. No corpus
touch. No production change.

## 2. Frozen Inputs (integrity verified before running)

| Input | Expected | Observed | Match |
|---|---|---|---|
| Corpus commitment | `44acd79a7b52f1f3f838d5e344f5ad28623295cd8c797933f366ec2133688706` | recomputed identical | **YES** |
| Gate 2 OAM run hash | `25b6e5c24cba93eba781de5620a7f12c94f7f3aa70dcb9f2a889b1db90420383` | recorded identical | **YES** |
| Gate 3 Stockfish run hash | `96a93811db2ea91714b748537d78801f15b5f83d9a149f58fde9c6073cef13cb` | recomputed identical | **YES** |
| `git diff HEAD -- backend/oam/ backend/oam_analyze.py frontend/src/pgn/parser.js` | 0 lines | 0 lines | **YES** |
| Evergreen invariant (Ply 34 · Black · gxf6 · 3/2/1/6) | preserved | preserved | **YES** |

## 3. Alignment

Alignment key = `(game_id, response_ply, player_side)` between every
OAM qualifying Moment and the corresponding Gate-3 engine ply record.

- 190 / 190 Moments aligned exactly. 0 unaligned.
- 183 Moments landed on `non_mate_to_non_mate` transitions, 7 on mate
  transitions. Corpus-level swing statistics below are computed **strictly
  over the 183 non-mate Moments** and their non-mate ply population
  (n = 7 723).

## 4. Test A · Direct Event Overlap

### Threshold events (non-mate)

| Threshold | SF events | OAM ∩ SF | OAM covered by SF | SF covered by OAM |
|---|---:|---:|---:|---:|
| Δ ≥ 50 cp | 846 | **9** | 4.92% | 1.06% |
| Δ ≥ 100 cp | 306 | **3** | 1.64% | 0.98% |
| Δ ≥ 200 cp | 73 | **0** | 0.00% | 0.00% |
| Δ ≥ 300 cp | 33 | **0** | 0.00% | 0.00% |

### Per-game top-K (non-mate, deterministic (−swing, ply) tie-break)

| K | SF events | OAM ∩ SF | OAM covered by SF | SF covered by OAM |
|---:|---:|---:|---:|---:|
| 1 | 100 | **0** | 0.00% | 0.00% |
| 3 | 300 | **2** | 1.09% | 0.67% |
| 5 | 500 | **3** | 1.64% | 0.60% |
| 10 | 1 000 | **10** | 5.46% | 1.00% |

## 5. Test B · Conditional Distributions of Δ_SF

| Population | n | mean | median | sd | p95 | max |
|---|---:|---:|---:|---:|---:|---:|
| All non-mate transitions | 7 723 | **23.64** | 10 | ~50 | 86 | 3 208 |
| OAM Moments (non-mate) | 183 | **12.61** | 6 | — | — | — |
| Non-OAM transitions | 7 540 | **23.91** | — | — | — | — |

| Quantity | P(·) | P(· \| OAM) |
|---|---:|---:|
| Δ < 50 cp | 0.890 | **0.951** |
| Δ < 100 cp | 0.960 | **0.984** |
| Δ < 200 cp | 0.991 | **1.000** |
| Δ ≥ 100 cp | 0.040 | **0.016** |

OAM Moments occur, on average, in transitions with **lower** Stockfish
swing than the corpus-wide baseline under this experiment. This is the
opposite direction of what a Stockfish-swing-detector-in-disguise would
produce.

## 6. Test C · Correlation

n = 183 (non-mate aligned Moments)

| OAM measure vs Δ_SF | Pearson r | Spearman ρ |
|---|---:|---:|
| OE_SCORE | −0.108 | **−0.019** |
| FTS | −0.002 | 0.105 |
| RDS | −0.050 | −0.022 |
| RLS | −0.139 | −0.107 |

All |ρ| < 0.15. OAM's numerical evidence is essentially uncorrelated
with Stockfish's centipawn swing on the same plies.

> Correlation measures association, not functional equivalence. This
> table is descriptive only.

## 7. Test D · Null Model (game-cluster permutation)

- Cluster unit: **game**.
- Rule: within each game, sample `k_i` pseudo-Moments uniformly from that
  game's non-mate plies, where `k_i` = observed OAM non-mate Moment
  count for that game.
- Seed: **20260215** · Permutations: **10 000**.
- Same total N as observed per replicate.

| Statistic | Observed | Null mean | Null sd | Empirical p (2-sided) |
|---|---:|---:|---:|---:|
| mean swing at pseudo-Moments | **12.61** cp | 25.12 cp | 5.56 | **0.0515** |
| overlap with SF top-3 per game | **2** | ~4.8 | ~2.0 | **0.0696** |
| overlap with SF ≥ 100 cp | **3** | ~7.2 | ~2.5 | **0.0583** |

All three observed statistics fall **below** the null mean — i.e. OAM
selects plies with *lower* engine swing and *less* overlap with
Stockfish's top events than a random within-game selection would
produce. The two-sided p-values sit just above 0.05; a one-sided test
in the "OAM selects lower-swing plies than chance" direction would
place them under 0.05. This is recorded and left as-is — the pre-declared
test was two-sided.

## 8. Test E · Reciprocal Information

Fraction of Stockfish-critical events captured by any OAM Moment:

| Stockfish event set | n | Captured by OAM | P(OAM \| SF) |
|---|---:|---:|---:|
| Δ ≥ 50 cp | 846 | 9 | 1.06% |
| Δ ≥ 100 cp | 306 | 3 | 0.98% |
| Δ ≥ 200 cp | 73 | 0 | 0.00% |
| Δ ≥ 300 cp | 33 | 0 | 0.00% |
| Top-1 per game | 100 | 0 | 0.00% |
| Top-3 per game | 300 | 2 | 0.67% |
| Top-5 per game | 500 | 3 | 0.60% |
| Top-10 per game | 1 000 | 10 | 1.00% |

Reciprocal asymmetry is negligible — the two systems fail to capture
one another in either direction under this experiment.

## 9. Test F · Silence Test — P(Δ < t \| OAM) vs P(Δ < t)

| Threshold t | P(Δ < t) | P(Δ < t \| OAM) | Δ in proportions | Odds ratio |
|---|---:|---:|---:|---:|
| 50 cp | 0.890 | **0.951** | +0.060 | **2.38** |
| 100 cp | 0.960 | **0.984** | +0.023 | **2.48** |
| 200 cp | 0.991 | **1.000** | +0.009 | — |

OAM Moments are approximately 2.4× more likely to occur in
**engine-quiet** transitions than a random ply under this Stockfish
configuration. Language reminder: low engine-evaluation movement under
the tested Stockfish configuration is not the same as "unimportant".

## 10. Test G · Reconstructability (deterministic — no ML)

### SF → OAM (predict qualifying Moment from Stockfish alone)

| Predictor | TP | FP | FN | Precision | Recall | F1 |
|---|---:|---:|---:|---:|---:|---:|
| Δ ≥ 50 cp | 9 | 837 | 174 | 0.011 | 0.049 | **0.017** |
| Δ ≥ 100 cp | 3 | 303 | 180 | 0.010 | 0.016 | 0.012 |
| Top-3 per game | 2 | 298 | 181 | 0.007 | 0.011 | 0.008 |
| Top-10 per game | 10 | 990 | 173 | 0.010 | 0.055 | 0.017 |

### OAM → SF (predict SF-critical from OAM alone)

| Target | TP | FP | FN | Precision | Recall | F1 |
|---|---:|---:|---:|---:|---:|---:|
| Δ ≥ 50 cp | 9 | 174 | 837 | 0.049 | 0.011 | **0.017** |
| Δ ≥ 100 cp | 3 | 180 | 303 | 0.016 | 0.010 | 0.012 |
| Top-3 per game | 2 | 181 | 298 | 0.011 | 0.007 | 0.008 |
| Top-10 per game | 10 | 173 | 990 | 0.055 | 0.010 | 0.017 |

Best F1 in either direction ≈ **0.017**. Neither measurement
reconstructs the other under any tested deterministic rule.

## 11. Test H · Functional-Equivalence Synthesis (H1–H6)

| Hypothesis | Evidence | Assessment |
|---|---|---|
| **H1** · event correspondence | OAM ∩ SF top-3/game = 1.09% (OAM cov) · 0.67% (SF cov) | **WEAK** |
| **H2** · magnitude correspondence | Spearman OE_SCORE vs Δ_SF = −0.019 | **WEAK** |
| **H3** · distribution correspondence | mean Δ_SF: 23.64 (all) vs 12.61 (OAM); ratio 0.53 | **MODERATE** |
| **H4** · reciprocal correspondence | P(OAM \| SF top-3/game) = 0.67% · P(OAM \| SF ≥ 100 cp) = 0.98% | **WEAK** |
| **H5** · reconstructability | best F1 in either direction ≈ 0.017 | **WEAK** |
| **H6** · null-model resistance | p (mean-swing, 2-sided) = 0.0515 | **NOT SIGNIFICANT** at α = 0.05 (2-sided); would be significant one-sided |

Verdict counts across H1–H5: **0 STRONG · 1 MODERATE · 4 WEAK**.

## 12. Primary Table

| Question | Measurement | Result | Interpretation |
|---|---|---|---|
| OAM Moments | N | 190 (183 non-mate) | — |
| OAM ∩ SF ≥ 50 cp | N (%) | 9 (4.92% of OAM) | very low overlap |
| OAM ∩ SF ≥ 100 cp | N (%) | 3 (1.64%) | very low overlap |
| OAM ∩ SF ≥ 200 cp | N (%) | 0 (0%) | no overlap |
| OAM ∩ SF ≥ 300 cp | N (%) | 0 (0%) | no overlap |
| OAM ∩ SF Top-1/game | N (%) | 0 (0%) | no overlap |
| OAM ∩ SF Top-3/game | N (%) | 2 (1.09%) | very low overlap |
| OAM ∩ SF Top-5/game | N (%) | 3 (1.64%) | very low overlap |
| OAM ∩ SF Top-10/game | N (%) | 10 (5.46%) | very low overlap |
| P(Δ < 50 cp \| OAM) | — | 0.951 vs 0.890 baseline | OAM biased toward engine-quiet plies |
| Pearson OE_SCORE / Δ | r | −0.108 | ≈ 0 |
| Spearman OE_SCORE / Δ | ρ | −0.019 | ≈ 0 |
| Null-model empirical p | 2-sided | 0.0515 / 0.0696 / 0.0583 | borderline; observed lies below null in all three |
| Reconstruction SF → OAM | best F1 | 0.017 | non-reconstructable |
| Reconstruction OAM → SF | best F1 | 0.017 | non-reconstructable |

## 13. Primary Conclusion

> **Do OAM and Stockfish measure the same function of the chess
> trajectory?**
>
> **ANSWER: NOT SUPPORTED (under this experiment).**

Rationale, criterion by criterion:

- **H1** — direct event overlap is negligible in every threshold and
  every top-K set (best cell 5.46%).
- **H2** — numerical evidence within OAM (OE_SCORE, FTS, RDS, RLS) is
  essentially uncorrelated with Stockfish's centipawn swing at the same
  plies (all |ρ| < 0.15).
- **H3** — the conditional distribution of Δ_SF at OAM Moments does
  **not** resemble the corpus baseline; the OAM-Moment mean is roughly
  **half** the corpus-wide non-mate mean (12.61 vs 23.64 cp).
- **H4** — Stockfish-critical events are almost never captured by OAM;
  P(OAM | SF≥100 cp) ≈ 1%.
- **H5** — no deterministic rule (thresholds or top-K) reconstructs
  either measurement from the other; best F1 ≈ 0.017.
- **H6** — null-model p-values are on the boundary (0.052 / 0.058 /
  0.070). Not "significant" under a pre-declared two-sided α = 0.05,
  but the observed statistics lie **consistently below** the null mean,
  which is the opposite direction from a Stockfish-swing-detector.

If OAM Moments had demonstrated strong systematic correspondence with
Stockfish evaluation swing across thresholds, rankings, distributions,
reciprocal coverage, and reconstruction tests, the hypothesis of a
materially distinct measurement would have been weakened. That evidence
is not present in this corpus under this Stockfish configuration.

## 14. Shared vs Non-Shared Measurements

**SHARED under this experiment.**
- Trajectory alignment key `(game_id, ply, side)` is fully shared (190/190).
- The mate/non-mate transition boundary is respected by both systems.
- Empirically demonstrated numerical overlap between OAM Moments and
  Stockfish's top-K or threshold event sets is: **essentially none**
  (all overlap cells ≤ 5.5%; most = 0–1%).

**OAM-ONLY under this experiment.**
- 174/183 non-mate OAM Moments occur in transitions where Δ_SF < 50 cp.
- OE_SCORE variation is orthogonal to Δ_SF at these plies (Spearman
  ρ ≈ 0).
- The FTS / RDS / RLS decomposition of the receive-response unit is
  not read from Stockfish's `go depth 16` output.

**STOCKFISH-ONLY under this experiment.**
- 837/846 (~99%) of Δ ≥ 50 cp events, 303/306 (~99%) of Δ ≥ 100 cp
  events, 73/73 (100%) of Δ ≥ 200 cp events, and 33/33 (100%) of
  Δ ≥ 300 cp events are **not** flagged as OAM Moments.
- Per-game Top-1 engine swing is never an OAM Moment in this corpus
  (0/100 games).

## 15. Falsification Statement (pre-declared)

If OAM Moments had demonstrated:

- ≥ 50% overlap with Stockfish top-3 per-game **or** Δ ≥ 100 cp events,
- Spearman |ρ| ≥ 0.4 between OE_SCORE and Δ_SF,
- OAM-Moment mean Δ_SF within [0.8×, 1.25×] of the baseline mean,
- P(OAM | SF top-3/game) ≥ 0.5,
- deterministic reconstruction F1 ≥ 0.6 in either direction,

then the hypothesis "OAM and Stockfish measure a materially distinct
trajectory property" would have been **weakened**. None of those
thresholds are met.

## 16. Logical Guardrails (respected)

- No claim that OAM is "better", "worse", "brilliant", "novel", or
  "superior" appears anywhere in this report or in
  `oam100_comparison.json`.
- Low correlation is not treated as proof of different underlying
  functions — this report evaluates six independent hypotheses
  (H1–H6) and states the primary verdict as **NOT SUPPORTED (under
  this experiment)**, not as "proven".
- Low engine swing is described only as "low engine-evaluation
  movement under the tested Stockfish configuration".

## 17. Reproducibility

Two independent invocations of `run_comparison.py` on the same frozen
inputs; both serialised with `json.dumps(..., indent=2, sort_keys=True)`.

| Field | Value |
|---|---|
| Seed | `20260215` |
| Permutations | 10 000 |
| Run 1 SHA-256 | `f358b83567b53ef7ef96e0ec45743a00f389e6e7ea2c5739a00f9947de66e50e` |
| Run 2 SHA-256 | `f358b83567b53ef7ef96e0ec45743a00f389e6e7ea2c5739a00f9947de66e50e` |
| Byte-identical | **YES** |

## 18. Post-Run Integrity

| Path | Result |
|---|---|
| `backend/oam/` (dir hash) | **unchanged** (`af00d16d…7262`) |
| `backend/oam_analyze.py` | **unchanged** (`5951e8d3…d023b`) |
| `frontend/src/pgn/parser.js` | **unchanged** (`81e106db…a827`) |
| `experiments/oam100/manifest.json` | **unchanged** |
| `experiments/oam100/results/oam100_analysis.json` | **unchanged** (`82468887…b035`) |
| `experiments/oam100/results/oam100_engine_positions.json` | **unchanged** |
| `experiments/oam100/results/oam100_engine.json` | **unchanged** |
| `git diff HEAD -- backend/oam/ backend/oam_analyze.py frontend/src/pgn/parser.js` | **0 lines** |
| Corpus commitment | **unchanged** (`44acd79a…8706`) |

## 19. Limitations

- Corpus is 100 human games from 17 pgnmentor player packs. Distribution
  effects (opening families, decades, master concentrations) are not
  controlled — descriptive results are conditional on this corpus.
- Engine baseline is fixed at Stockfish 15.1, depth 16, Threads=1,
  Hash=32 MB, MultiPV=1, White POV. Different engine configurations
  (higher depth, MultiPV, side-to-move perspective) can shift specific
  cp values and would need their own gate.
- OAM's OE_SCORE is discrete (5–8). Spearman is the appropriate
  correlation; Pearson is reported alongside for completeness.
- The null model preserves game clustering but treats within-game plies
  as exchangeable. A stronger null could also preserve response-move
  timing distributions; this gate does not implement that stronger null.
- H6's two-sided p-value sits just above 0.05 while the observed
  statistics lie clearly below the null mean in all three cases. This
  is documented rather than resolved to a stronger claim.

## 20. Gate Determination

**`OAM-100-COMPARISON-001` · PASS.**

## 21. Terminal Output

```
OAM-100-COMPARISON-001

STATUS: PASS

PRIMARY QUESTION:
  Do OAM and Stockfish measure the same function of the chess trajectory?

ANSWER: NOT SUPPORTED (under this experiment)

SHARED INFORMATION:
  Trajectory alignment key (game_id, ply, side): fully shared (190/190).
  Mate / non-mate transition boundary respected by both systems.
  Empirical numerical overlap between OAM Moments and Stockfish top-K
    or threshold event sets: essentially none (all cells ≤ 5.5%,
    most 0–1%).

OAM-ONLY UNDER THIS EXPERIMENT:
  174/183 non-mate OAM Moments live in Δ_SF < 50 cp transitions.
  OE_SCORE variation orthogonal to Δ_SF (Spearman ρ ≈ 0).
  FTS/RDS/RLS receive-response structure not recovered by Stockfish.

STOCKFISH-ONLY UNDER THIS EXPERIMENT:
  ≥ 50 cp events   : 837/846 not flagged by OAM
  ≥ 100 cp events  : 303/306 not flagged by OAM
  ≥ 200 cp events  :  73/73 not flagged by OAM
  ≥ 300 cp events  :  33/33 not flagged by OAM
  Per-game Top-1 engine swing : 0/100 flagged by OAM

KEY STATISTICS:
  OAM Moments (aligned, non-mate)    : 183
  mean Δ_SF at OAM Moments           : 12.61 cp
  mean Δ_SF over all non-mate plies  : 23.64 cp
  Spearman OE_SCORE vs Δ_SF          : −0.019
  Best F1 (deterministic recon., either direction) : 0.017
  P(Δ<50 | OAM) / P(Δ<50)            : 0.951 / 0.890  (OR 2.38)

NULL MODEL:
  cluster-preserving within-game permutation
  seed = 20260215, N = 10 000
  observed mean swing (12.61) lies below null mean (25.12) with sd 5.56
  two-sided empirical p                : 0.0515
  overlap with SF top-3/game (2)       : two-sided empirical p 0.0696
  overlap with SF ≥ 100 cp (3)         : two-sided empirical p 0.0583

REPRODUCIBILITY:
  run1_hash = run2_hash
    = f358b83567b53ef7ef96e0ec45743a00f389e6e7ea2c5739a00f9947de66e50e
  byte-identical across independent invocations.

INTEGRITY:
  corpus commitment unchanged     : 44acd79a...8706
  Gate 2 run hash unchanged       : 25b6e5c2...0383
  Gate 3 run hash unchanged       : 96a93811...13cb
  git diff on analytical paths    : 0 lines
  Evergreen invariant preserved   : Ply 34 · Black · gxf6 · 3/2/1/6

ARTEFACTS:
  /app/experiments/oam100/results/oam100_comparison.json
  /app/experiments/oam100/results/oam100_comparison_tables.csv
  /app/experiments/oam100/results/oam100_comparison_report.md
  /app/experiments/oam100/results/comparison_status.json

MODIFICATIONS:
  none to /app/backend/oam/
  none to /app/backend/oam_analyze.py
  none to /app/frontend/src/pgn/parser.js
  none to the corpus
  none to Gate 2 output
  none to Gate 3 output
  none to any production application file

STOP.
```

**No product change. No OAM change. No theoretical rewrite. Not opening
another gate.**
