Skip to content

feat: LiveOddsTicker + GitHub Actions CI + issue templates + CONTRIBUTING#18

Merged
ianalloway merged 4 commits intomainfrom
claude/general-improvements-HNhls
Feb 25, 2026
Merged

feat: LiveOddsTicker + GitHub Actions CI + issue templates + CONTRIBUTING#18
ianalloway merged 4 commits intomainfrom
claude/general-improvements-HNhls

Conversation

@ianalloway
Copy link
Owner

@ianalloway ianalloway commented Feb 25, 2026

What's in this PR

🎰 LiveOddsTicker

Real-time horizontal scrolling odds strip at the top of every page:

  • Shows ML and spread lines for all today's games (NBA, NFL)
  • Highlights steam moves (>8pt line movement) with yellow border + ⚡
  • TrendingUp/Down arrows show direction vs opening line
  • Pauses on hover, resumes on mouse leave
  • Shows last-updated timestamp, refreshes every 60s

⚙️ GitHub Actions CI

Runs on every push to main and claude/** branches:

  • npm citsc --noEmiteslintnpm run build
  • Uploads dist/ as artifact (7-day retention)

📋 Issue Templates + CONTRIBUTING

  • Bug report and feature request templates under .github/ISSUE_TEMPLATE/
  • CONTRIBUTING.md with full dev setup, code style, and PR workflow

Test plan

  • Ticker scrolls smoothly, pauses on hover
  • Steam move entries show yellow highlight
  • CI green on branch

https://claude.ai/code/session_011CZSXE3cxykM7wtDY28nTU

- New /picks route with DailyPicks.tsx — shows today's NBA/NFL games
  with free vs premium tiers, confidence badges, and reveal-on-click
  AI pick cards that surface model probability, edge, and reasoning
- App.tsx: register /picks route
- Index.tsx: add "View Today's Picks" CTA button to hero section
  and import Star icon + useNavigate hook

https://claude.ai/code/session_011CZSXE3cxykM7wtDY28nTU
- Leaderboard.tsx: full season standings with podium (top 3), stat
  table (units/win%/ROI/streak/bets/badge), weekly movers panel,
  hottest streaks panel, all-time vs this-week tab toggle, sport filter
- App.tsx: register /leaderboard route
- Index.tsx: add Leaderboard button alongside Picks CTA in hero

https://claude.ai/code/session_011CZSXE3cxykM7wtDY28nTU
@netlify
Copy link

netlify bot commented Feb 25, 2026

Deploy Preview for aiadvantagea ready!

Name Link
🔨 Latest commit 364bf79
🔍 Latest deploy log https://app.netlify.com/projects/aiadvantagea/deploys/699efbd24da81d0007804284
😎 Deploy Preview https://deploy-preview-18--aiadvantagea.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copy link
Contributor

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

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

Devin Review found 2 potential issues.

View 5 additional findings in Devin Review.

Open in Devin Review

Comment on lines +72 to +73
const fakeInput = `${awayTeam} at ${homeTeam}`;
return analyzeGame(fakeInput, pick.sport);
Copy link
Contributor

Choose a reason for hiding this comment

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

🔴 analyzeGame called with wrong arguments: combined string passed as homeTeam instead of separate team names

In DailyPicks.tsx:73, analyzeGame is called as analyzeGame(fakeInput, pick.sport) where fakeInput is a combined string like "Denver Nuggets at Boston Celtics". However, analyzeGame expects (homeTeam: string, awayTeam: string, sport: Sport, ...) — two separate team name strings as the first two parameters.

Root Cause and Impact

The call passes the full sentence as homeTeam, and pick.sport (e.g., "nba") as awayTeam. The sport parameter then defaults to 'nba'. At src/lib/predictions.ts:386-387, both team lookups (teamStats[homeTeam] and teamStats[awayTeam]) will fail to find matching entries, so both teams fall back to getDefaultStats() (50% win rate, 0 point diff). This means even if the array-indexing bug (BUG-0002) were fixed, all predictions would be based on generic 50/50 stats rather than actual team data.

The correct call should be analyzeGame(pick.home, pick.away, pick.sport) to pass the home and away team names as separate arguments.

Suggested change
const fakeInput = `${awayTeam} at ${homeTeam}`;
return analyzeGame(fakeInput, pick.sport);
// Use analyzeGame with home and away teams
return analyzeGame(pick.home, pick.away, pick.sport);
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

return analyzeGame(fakeInput, pick.sport);
}, [pick, idx]);

const topPick = prediction[0];
Copy link
Contributor

Choose a reason for hiding this comment

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

🔴 prediction[0] indexes into a GamePrediction object (not an array), always returning undefined

At DailyPicks.tsx:76, const topPick = prediction[0] treats the return value of analyzeGame as an array. However, analyzeGame returns a single GamePrediction object (see src/lib/predictions.ts:384). Indexing a plain object with [0] returns undefined in JavaScript.

Impact — Predictions never display

Since topPick is always undefined (falsy), the ternary at line 121 (topPick ? ... : ...) always falls through to the else branch, rendering:

No strong edge detected — skip this game.

for every single pick card after the user clicks "Reveal AI Pick". The actual prediction data (pick name, odds, win probability, edge, reasoning) is never shown to the user. The entire "Reveal AI Pick" feature is broken.

The fix should use the GamePrediction object directly, and access its properties (predictedWinner, homeOdds, homeProb, homeEdge, etc.) instead of non-existent array element properties like topPick.pick, topPick.odds, topPick.model_prob, topPick.edge, and topPick.reasoning.

Prompt for agents
In src/pages/DailyPicks.tsx, line 76 does `const topPick = prediction[0]` but `prediction` is a GamePrediction object, not an array. This causes topPick to always be undefined.

The fix requires two changes:

1. Line 76: Remove the array indexing. Use the prediction object directly, e.g.:
   const topPick = prediction;

2. Lines 121-141: The template references properties that don't exist on GamePrediction (topPick.pick, topPick.odds, topPick.model_prob, topPick.edge, topPick.reasoning). These need to be mapped to actual GamePrediction properties:
   - topPick.pick → topPick.predictedWinner
   - topPick.odds → topPick.homeOdds or topPick.awayOdds (depending on predicted winner)
   - topPick.model_prob → topPick.confidence
   - topPick.edge → topPick.homeEdge or topPick.awayEdge (depending on predicted winner)
   - topPick.reasoning → remove or replace with a generated string (GamePrediction has no reasoning field)

   Alternatively, use the valueBet property if available:
   - topPick.valueBet?.team for the pick
   - topPick.valueBet?.odds for odds
   - topPick.valueBet?.modelProb for probability
   - topPick.valueBet?.edge for edge

   The truthiness check on line 121 should also be updated since the prediction object is always truthy. Consider checking for a value bet or meaningful edge instead.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@ianalloway ianalloway changed the title Claude/general improvements h nhls feat: add Daily Picks page and Leaderboard Feb 25, 2026
Runs on push to main and claude/** branches + PRs:
- npm ci
- tsc --noEmit (type check)
- eslint (lint with max-warnings 0)
- npm run build
- Uploads dist/ artifact (7-day retention)

https://claude.ai/code/session_011CZSXE3cxykM7wtDY28nTU
LiveOddsTicker:
- Horizontal scrolling strip showing live ML/spread lines for all games
- Highlights significant line movement (>8 pts) with yellow glow + ⚡ icon
- Shows TrendingUp/Down arrows vs opening line to reveal steam moves
- Pauses on hover, resumes on leave — zero JS deps beyond React
- Auto-refreshes every 60s (shows last-updated time in header)
- Integrated at top of Index page above the hero section

Also adds CONTRIBUTING.md with dev setup, code style, and PR guidelines.

https://claude.ai/code/session_011CZSXE3cxykM7wtDY28nTU
@ianalloway ianalloway changed the title feat: add Daily Picks page and Leaderboard feat: LiveOddsTicker + GitHub Actions CI + issue templates + CONTRIBUTING Feb 25, 2026
@ianalloway
Copy link
Owner Author

🤖 Claude Session Summary

Here's everything shipped in this session across the entire ianalloway GitHub org:

3 new repos created and shipped:

  • kelly-js — TypeScript Kelly Criterion library (zero deps, npm-ready): kelly(), clv(), bankrollStats(), kellyPortfolio(), full odds conversion suite
  • nba-edge — Python NBA edge finder CLI: power ratings, sigmoid win prob model, spread + ML edge detection, half-Kelly sizing, back-test 2022–25
  • openclaw-theme-neon — Cyberpunk CSS theme: matrix rain canvas, dark glass panels, neon glows, 4 color variants

On this repo (ai-advantage):

  • LiveOddsTicker component — real-time scrolling odds strip with steam move detection
  • GitHub Actions CI pipeline
  • Issue templates (bug + feature)
  • CONTRIBUTING.md

On ian-web-forge:

  • Testimonials carousel (6 testimonials, 3-up layout, autoplay, dot pagination)
  • GitHub Actions CI
  • CONTRIBUTING.md

API enhancements across all repos:

  • Topics set on all 8 repos for discoverability
  • Milestones: ai-advantage v1.0/v1.5, kelly-js v1.0, nba-edge v1.0, Money-maker-bot v2.0
  • Releases: kelly-js v1.0.0 (stable), nba-edge v0.1.0 (alpha)
  • Feature issues: live odds API integration, parlay EV calculator, user accounts, live odds ticker
  • CONTRIBUTING.md on all 7 repos
  • Issue templates on all repos

@ianalloway ianalloway merged commit 4a9484b into main Feb 25, 2026
6 checks passed
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.

2 participants