# Stadium accuracy and release QA

Updated October 3, 2026. The same process applies independently to every active MLB park. The main viewer now uses MLB-hosted meshes for 29 compatible parks. Its [current model workbench](mlb-model-qa.html), [source audit](MLB_MODEL_QA.md), and [distinctive per-park acceptance queues](MLB_STADIUM_CHECKLIST.md) supersede the old renderer construction snapshot. Legacy reporting charts remain separate until registered. A model loading successfully is a functional result, not an accuracy result. Every current park is still under geometry review.

## What passing means

The product helps fans choose seats with a better chance of catching a ball. A park must match its own physical layout before modeled landings can support a precise section or row recommendation. Source-backed records, estimated first impacts and observed final/catch locations must remain distinct.

No “exact seat,” five-foot or inch claim may pass without independent measured references and a published error assessment. Chair instances are visual elements until an official seat inventory establishes real seat numbers. Missing measurements remain unresolved; they cannot be filled by a default shape or a convenient row count.

## The process for each park

1. **Freeze the edition and sources.** Record the stadium, actual MLB venue ID, season/date range, renovations, source URLs, capture dates and geometry edition. Start with the club's current baseball chart, physical floor plans, posted field dimensions and photographs. Check that a ticket map is the baseball configuration. Retain conflicts between Statcast dimensions and club guide dimensions for investigation.
2. **Build the field first.** Use feet, home plate at the origin and center field along the negative Z axis. Check 90-foot base paths, the 60-foot-6-inch pitching distance, home plate, backstop, foul territory, poles and every wall bend. Five radial distances constrain the field; they do not locate every corner. Register independent landmarks and check them as holdout points. Do not use ticket-diagram spacing as a physical survey.
3. **Trace each seating bank separately.** Model the lower, club, suite, upper and outfield footprints from physical references. Verify section order, varying widths, omitted numbers, aisles, ramps, deck ends, overhang and elevation. Overlay the plan against an independent reference at a matched camera angle. Inspect the underside and cross section: connected construction must not fill real open space or turn into a slab over the field.
4. **Resolve rows and seats.** Compare every catalog entry to the current official/reference chart. Verify the first and last row, skipped/doubled letters, accessible platforms, premium boxes, tables, standing areas and numbering direction. Check row-to-row depth and elevation with measured information. Leave unresolved rows empty. An exact-seat claim also requires actual per-row seat counts, numbering and positions; evenly spaced chairs do not establish these.
5. **Map all non-seating destinations.** Trace home and visiting bullpens, concourses, fan zones, batter's eyes, scoreboards, roof surfaces, outside streets and water. Record spectator access separately. Hidden roof coverings in the viewer must not erase roof destinations from the data model. Check each footprint against the field and adjacent sections. Bullpen/water/outside landings never enter seated-catch rankings.
6. **Verify dated netting.** Record endpoints, height changes, posts, mesh and the edition/year of installation. Compare photographs from multiple angles. Verify the paths below, above and around a net; a protected section cannot simply be declared unreachable. Until interception is validated, the overlay is a reference and cannot establish zero catch probability. First impact, net deflection, bounce and final destination stay separate.
7. **Audit every event.** Reconcile each venue/season to its source manifest; check identities, duplicates, inside-the-park HRs, missing metrics, batter/pitcher, inning and before/after scores. Keep scored HRs even when no credible landing can be drawn. Every modeled HR dot must be finite, fair-side, beyond the actual rendered fence and consistent with wall clearance. Never invent foul landing coordinates from a pitch outcome. Archives that overlap must not be added as unique balls.
8. **Validate against independent video.** Build a holdout set before tuning the geometry. Include LF/CF/RF, corners, near-wall impacts, high decks, bullpens/fan areas, net hits, unknown outcomes and bounces. Start with at least 50 independently reviewed visible first impacts for each ball class offered by that park. Report the sample's visibility bias, section confusion matrix, row error, distance error where measured and confidence intervals. This is an initial QA sample, not proof of population catch odds. An unobserved location is not a negative observation.
9. **Run desktop and phone QA.** Inspect overview, top-down, both foul poles, behind home plate, CF looking home, and close section views. Exercise tap picking at all levels, drag-and-hold, pinch zoom, reset, one-pass Animate, season/game/ball-stage changes and ticket handoff. Test 360/390/430-pixel widths, landscape, touch targets, keyboard navigation, reduced motion, slow network, failed requests and WebGL recovery. Verify no horizontal overflow, idle rendering stops, bounded caches and no full-league eager load. Measure real low-end phones and stadium cellular connections before calling mobile performance passed.
10. **Exercise reporting and accounts.** A fan taps a map area before answering short questions. Check unknown rows, independent first/final spots, saved drafts, reload, sign-in return, duplicate edits, account isolation, CSRF, session revocation and stale geometry. Use an isolated database for QA. Points and badges must wait for independent accepted accuracy, never reward an unreviewed placement.
11. **Release only with evidence.** Store the reviewer, date, geometry edition, source links, comparison captures, measurements and known limitations for each gate. A second reviewer checks geography and the landing holdout. Open blockers prevent an accuracy release for that park. Changing seating, walls, nets or the registration invalidates those gates and dependent landing annotations; investigate/migrate observations explicitly rather than moving dots silently.

## Accuracy acceptance checks

| Claim / area | Required evidence | Fail condition |
| --- | --- | --- |
| Field outline | Independent scaled reference and wall/pole holdouts | A misplaced bend, pole, home plate or incorrect foul territory |
| Section location | All section IDs reconciled; independently registered bank boundaries | Missing/wrong order, bank width, crossing, wrong level or detached deck |
| Row location | Verified row labels and measured progression | Invented row, reversed progression, unsupported spacing/elevation |
| Individual seat | Official per-row inventory and measured layout | Synthetic seat number or unknown physical position |
| Within five feet | Independent measured benchmark; report median, 95th percentile, maximum and reference uncertainty | Reference itself cannot support five feet, or any advertised location exceeds the tolerance |
| Within an inch | Survey/CAD with sufficient precision and independent checks | Photo/chart interpolation is the only reference |
| HR/foul recommendation | Validated geometry, representative event coverage and disclosed uncertainty | Estimated/incomplete coordinates presented as observed odds |
| Net restriction | Dated physical dimensions plus validated interception behavior | Unknown height or all seats behind a net assigned zero chance |
| Mobile readiness | Real-device/network measurements plus browser regression checks | Interaction failures, runaway idle rendering, memory/load regressions |

## Status and evidence

The [interactive workbench](stadium-qa.html) records all 30 parks, their individual inspection targets, collision candidates and required evidence. It is a recorded QA snapshot, not a live certification. The [written all-park audit](QA_REPORT.md) is generated from the same results.

`npm run qa:stadiums` writes `data/stadium-qa.json` and its public metadata copy. It compares reporting meshes, imported catalog consistency, both landing archive audits, browser checks and explicit manual reviews. It checks row footprints at nearby heights across all levels, rather than only matching heights. Overlap pairs with less than eight feet of modeled separation remain blockers until inspected; the threshold is a conservative screening choice, not a structural standard. Passing automatic checks cannot make a park accuracy-ready. `npm run qa:stadiums:release` exits unsuccessfully while any required gate is missing or failed.

Manual evidence goes in `data/stadium-quality-reviews.json`, keyed by venue ID, geometry edition and fingerprint. A passed manual gate requires a named reviewer, review date and evidence links. Reviewer evidence must describe actual checks; adding a URL alone does not perform the review. Model-space fingerprints compare renderer/reporting coordinates at export precision; they do not establish real-world precision. Changed exported coordinates, wall heights or landing-area shapes invalidate earlier landing-audit/browser/manual QA evidence even if someone forgets to bump the edition. Fan annotations still require an edition bump and explicit migration when geometry changes.

Each review records `primaryReviewer`; the final `independent-review` gate must name a different reviewer. Future review dates cannot pass. Use each current map’s `fingerprint`, not a copied fingerprint from an earlier build. Manual gates use `{ "status": "pending|pass|fail", "reviewer": "name", "reviewedAt": "ISO date", "evidence": ["comparison/measurement record URL"], "reason": "actual result" }`. Keep failed measurements and conflicting references in the evidence record instead of silently replacing them.

```powershell
npm run maps
npm run build
npm run check
npm test
python -m unittest discover -s tests -p '*_test.py'
npm run audit:geometry
npm run audit:landings
# Recheck all parks in the browser and save the new fingerprint/count snapshot.
npm run qa:stadiums
python scripts/build_qa_report.py
npm run qa:stadiums:release
```

The release command is expected to fail while parks remain blocked or unreviewed. A successful code test suite cannot override that failure. The browser stage must exercise each current park in the actual viewer; do not copy old checks into a new snapshot. Record the selected season, loaded venue, geometry fingerprint, row/section counts, ledger count, drawn endpoints, viewport, overflow and console errors. Run the real-phone and independent reference/video stages separately.

Required manual gates: source edition, field registration, physical seating banks, section catalog, rows, seat inventory, non-seating zones, netting, independent HR holdout, independent foul holdout, mobile devices and independent reviewer. A park can be prepared for a limited section-level preview while seat/foul claims remain blocked, but it cannot be labelled fully accurate.

## Current repair order

T-Mobile Park first: compare its physical main/club/upper-floor plans and photographs, correct the backstop and deck positions, then each section boundary. Fenway follows, then Oracle. Daikin, Kauffman, Angel, Citi, Sutter, Citizens Bank, Petco, Tropicana, Globe Life, Rogers and Nationals currently have missing outfield seating placement; each needs its own bank trace. The remaining parks also need independent geographic checks. All 30 appear in the generated status file; none is certified.

Primary Seattle references: [official concourse/floor map](https://www.mlb.com/mariners/ballpark/concourse-map), [official seating/netting map](https://www.mlb.com/mariners/ballpark/seat-map), [club guide](https://www.mlb.com/news/featured/t-mobile-park-guide-capacity-seating-chart-parking-and-more), and [PFD facility assessment](https://bpfd-prod-backend.parallelpublicworks.com/sites/default/files/documents/2022%20Long-Term%20Capital%20Needs%20Assessment.pdf). Illustrated charts establish useful identifiers and relative placement; they do not certify dimensions.
