P1-7: flat edge board — guard the broken edge placeholder (absent > fabricated)

Phone audit called the board 'mostly-empty'. Two causes, both now addressed:
1. Dead images (P0-2, already fixed) → the matchup/team chips render logos now.
2. Degraded edge data. Live snapshot edge_pct is on a broken scale (distinct
   values 20/60/100/140 — not a market %), with projection=0 and confidence
   35-55%. A real prop-market edge is single-digit, never past ~40%. Leading
   the board with '+140%' fabricates a signal (Data Semantics Rule).

Fix: an edge whose |value| > 40 is treated as ABSENT at BOTH layers — the
data layer (flattenToEdgeBoard nulls it, so it can't RANK a fake +140% above a
real +8.4%) and the display (EdgeCell shows '—'). Board falls through to the
grade-rank tiebreak when edges are unreliable. Real edges (≤40) are untouched.

The root cause — edge_pct/projection/confidence degradation — is a BACKEND
grading issue (same family as the P2-9 '45% B' flag), reported separately; this
is the honest frontend guard, not a fix for the data.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kev
2026-07-17 01:34:01 -04:00
parent ff0d3b199e
commit d755b43f05
3 changed files with 31 additions and 2 deletions
+16
View File
@@ -70,4 +70,20 @@ describe('flattenToEdgeBoard', () => {
expect(flattenToEdgeBoard(null)).toEqual([]);
expect(flattenToEdgeBoard([{}])).toEqual([]);
});
// P1-7 — an impossible edge (the pipeline's 60/100/140 placeholder) is not a
// market signal. It must be treated as absent so the board neither DISPLAYS
// nor RANKS on it — a fake +140% must never outrank a real +8.4%.
test('insane edge (>40%) is nulled so it neither displays nor ranks', () => {
const rows = flattenToEdgeBoard([card({ playerStrips: [
strip('RealEdge', [{ stat: 'PTS', line: 20, side: 'O', grade: 'B', edge: 8.4 }]),
strip('BrokenEdge', [{ stat: 'PTS', line: 20, side: 'O', grade: 'A', edge: 140 }]),
] })]);
const broken = rows.find((r) => r.player === 'BrokenEdge');
const real = rows.find((r) => r.player === 'RealEdge');
expect(broken.edge).toBeNull(); // not displayed as a fake %
expect(real.edge).toBe(8.4); // real edge preserved
// real edge outranks the nulled placeholder despite the placeholder's higher grade
expect(rows[0].player).toBe('RealEdge');
});
});
+6 -1
View File
@@ -38,8 +38,13 @@ function rampOpacity(rank: number): number {
return Math.max(0.5, 0.7 - (rank - 5) * 0.06);
}
// A real prop-market edge (model prob implied prob) is single-digit, rarely
// past ~15%, never past ~40. Values beyond that are not a market edge — they're
// the pipeline's miscalibrated placeholder (seen live: 60/100/140). Rendering
// "+140%" would fabricate a signal, so we show it absent. Backend fix pending.
const SANE_EDGE_MAX = 40;
function EdgeCell({ edge }: { edge: number | null }) {
if (edge == null) {
if (edge == null || Math.abs(edge) > SANE_EDGE_MAX) {
return <span className="mono" style={{ fontSize: 12, fontWeight: 700, color: 'var(--text-2)', width: 48, textAlign: 'right' }}></span>;
}
const pos = edge >= 0;
+9 -1
View File
@@ -608,6 +608,10 @@ const EDGE_GRADE_RANK = { 'A+': 0, A: 1, 'A-': 2, 'B+': 3, B: 4, 'B-': 5, C: 6,
function edgeGradeRank(g) {
return EDGE_GRADE_RANK[g] != null ? EDGE_GRADE_RANK[g] : 9;
}
// Ceiling for a plausible prop-market edge; beyond it the value is a broken
// placeholder, not a signal (mirrored in MobileEdgeBoard.EdgeCell).
const EDGE_BOARD_SANE_MAX = 40;
function flattenToEdgeBoard(cards) {
const rows = [];
for (const c of Array.isArray(cards) ? cards : []) {
@@ -624,7 +628,11 @@ function flattenToEdgeBoard(cards) {
line: p.line,
side: p.side || 'O',
grade: p.grade,
edge: (p.edge != null && Number.isFinite(p.edge)) ? p.edge : null,
// A real prop edge is single-digit %, never past ~40. Values beyond
// that are the pipeline's miscalibrated placeholder (live: 60/100/140)
// — treat as absent so the board neither displays nor RANKS on a fake
// edge. When absent, rows fall through to the grade-rank tiebreak.
edge: (p.edge != null && Number.isFinite(p.edge) && Math.abs(p.edge) <= EDGE_BOARD_SANE_MAX) ? p.edge : null,
sport: c.sport || '',
away,
home,