Skip to content

Regenerate era twins on the served v5 (64-d) MTNN embedding - #90

Merged
jcdavis131 merged 2 commits into
masterfrom
scout/eratwins-v5
Oct 13, 2026
Merged

jcdavis131 merged 2 commits into
masterfrom
scout/eratwins-v5

Conversation

@jcdavis131

Copy link
Copy Markdown
Owner

What

assets/eratwins.json + the twin-explainer assets were computed with the retired 48-d model and never regenerated after the 2026-07-25 v5 promotion. Their stated similarities did not reproduce in the served 64-d space (spot check from the embedding-truth pass: 0.646 claimed vs 0.348 actual cosine; ledger item #22). Cameron approved the regeneration 2026-10-12 — it changes live Daily Court pairings.

Regenerated with the existing builders, which read the served bundle (mtnn_meta.json dim/rows → mtnn_embeddings.f32, v5, 12,966 × 64, unit-norm). Pairing rules unchanged: signature season = max |v| stat norm, quiz pool = careers with ≥4 charted seasons, twin = nearest other-decade career by cosine, top-5 shipped for warmth feedback.

Result

  • 1,313 players (was 1,308 — the identity-fixed vectors.json split merged Jr/Sr careers, so 7 more careers qualify; 2 stale merged names gone).
  • 1,034 of 1,306 common players (79%) got a new twin. Headliners: LeBron 2008-09 → Durant 2013-14 (0.886); Curry 2015-16 ↔ SGA 2024-25 mutual twins (0.800); Grant Hill 1996-97 → Paul Pierce (was LeBron in the 48-d space).
  • Explainer: 1,175 unique pairs (threshold 0.60 → 0.57 from the new sim distribution), 1,136 pool vectors; only 247 old pair keys survive.

Verification (independent recomputation, exhaustive — not sampled)

  • Every shipped twin is the true argmax other-decade career in the served 64-d space; every top-5 matches in order; max |claimed − recomputed| similarity = 0.000000 across all 1,313 players; coverage = exactly the eligible set; no nulls.
  • All 1,175 explainer records recompute clean (chips, differ label, sim, thin flag, person ids); all 1,136 pool vectors match vectors.json via (person_id, season).
  • Gates: sync_public --check clean, root/public byte-identical, stamp_assets --check OK (JSON assets are fetched unversioned), check_site_facts OK, check_contrast OK (AA), check_a11y OK.

Builder fixes (minimal, in this PR)

  • eratwin_game.py: method string/docstring claimed 48-d; the dimension is now interpolated from the loaded embedding so it cannot go stale again.
  • build_twin_explainer.py: hard-coded 1,308 pair-count assert → sanity floor (count is a function of vectors.json careers); hand-verified QA pairs updated to the v5 pairings (Houston↔Reggie Miller, Stockton↔Rondo; AC Green↔Horace Grant unchanged and still passing); pool-vector join falls back to person_id when display names drift (lite still carries the unhyphenated "GilgeousAlexander") — the same identity principle as the 2026-10-01 fix.

No changes to promote.py / export_mtnn_embeddings.py; embeddings untouched.

eratwins.json + twin-explainer assets were computed with the retired
48-d model and never regenerated after the 2026-07-25 v5 promotion;
their stated similarities did not reproduce in the served 64-d space
(embedding-truth ledger #22). Regenerated with the existing builders,
which read the served bundle (mtnn_meta.json dim/rows ->
mtnn_embeddings.f32); pairing rules unchanged (signature season =
max |v| stat norm, careers >=4 seasons, twin = nearest other-decade
career by cosine, top-5 shipped for warmth feedback).

Result: 1,313 players (was 1,308 — identity-fixed vectors.json split
merged Jr/Sr careers), 1,034 of 1,306 common players got a new twin.
Independently reverified exhaustively: every twin is the true argmax
in the 64-d space, max |claimed - recomputed| sim error 0.000000;
all 1,175 explainer pairs + 1,136 pool vectors recompute clean.

Builder fixes (minimal):
- eratwin_game.py: method string/docstring said 48-d; dimension is
  now interpolated from the loaded embedding so it cannot go stale.
- build_twin_explainer.py: hard-coded 1,308 pair count replaced with
  a sanity floor; hand-verified QA pairs updated to the v5 pairings
  (Houston<->Reggie Miller, Stockton<->Rondo; AC Green<->Horace Grant
  unchanged); pool-vector join falls back to person_id when display
  names drift (lite's unhyphenated GilgeousAlexander), the same
  identity principle as the 2026-10-01 fix.
@vercel

vercel Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
vector-hoops Ready Ready Preview Oct 13, 2026 4:41am UTC

Request Review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. Cursor Bugbot was not present after the first check poll, so that automated-review signal was skipped. No applicable approval policy or existing review state requires holding this PR.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

The site CI job runs ruff format --isolated --check over a named
file list that includes this builder; the sharpshooter QA print line
added with the v5 pairings exceeded the line length. Whitespace-only
reflow — builder output is byte-identical after the change.
@jcdavis131
jcdavis131 merged commit 1b2779b into master Oct 13, 2026
6 of 8 checks passed

This branch was successfully deployed

1 active deployment
Preview — 8b11a74a Deployed Oct 13, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant