Sessions 5-7a: 955 tests, deployment ready

This commit is contained in:
Kev
2026-06-08 18:35:13 -04:00
parent 06b82624a2
commit 1fa04dc776
371 changed files with 49366 additions and 955 deletions
+1 -1
View File
@@ -128,7 +128,7 @@ Map Odds API market keys to our internal names:
- **TTL:** 15 minutes
- **On cache hit:** Return cached data with `"source": "cache"`
- **On cache miss:** Fetch from Odds API, normalize, store, return with `"source": "live"`
- **On API failure with stale cache:** Return stale cache with a warning header `X-BetonBLK-Stale: true` and `"source": "cache"` (do NOT error if stale data exists)
- **On API failure with stale cache:** Return stale cache with a warning header `X-VYNDR-Stale: true` and `"source": "cache"` (do NOT error if stale data exists)
- **On API failure with no cache:** Return 503
## Rate Limit / Quota Management
+1 -1
View File
@@ -1,7 +1,7 @@
# Feature 1.3 — Prop Analysis Engine
## Overview
The core intelligence of BetonBLK. Takes a player prop (player, stat, line, book) and runs a 6-step grading pipeline to produce a grade (A/B/C/D), edge percentage, confidence score, kill condition flags, and natural-language reasoning. This is the engine that powers the parlay scanner (Feature 2.1) and drives all user-facing analysis.
The core intelligence of VYNDR. Takes a player prop (player, stat, line, book) and runs a 6-step grading pipeline to produce a grade (A/B/C/D), edge percentage, confidence score, kill condition flags, and natural-language reasoning. This is the engine that powers the parlay scanner (Feature 2.1) and drives all user-facing analysis.
## Dependencies
- Feature 1.1 — Odds API Integration (provides lines from multiple books)
+1 -1
View File
@@ -1,7 +1,7 @@
# Feature 1.4 — Database Schema (Supabase + RLS)
## Overview
Complete PostgreSQL schema in Supabase for all BetonBLK data. Uses Supabase Auth for user identity. Row Level Security (RLS) on all tables ensures users can only access their own data. Service role key used by backend for admin operations.
Complete PostgreSQL schema in Supabase for all VYNDR data. Uses Supabase Auth for user identity. Row Level Security (RLS) on all tables ensures users can only access their own data. Service role key used by backend for admin operations.
## Dependencies
- None (builds parallel with Features 1.1, 1.2)
+1 -1
View File
@@ -233,7 +233,7 @@ Period boundaries:
When a user submits a bet with `scan_session_id`:
- Validate the session exists and belongs to the user
- Store the reference in `bets.slip_data.scan_session_id`
- This enables "how many bets followed BetonBLK grades" analytics later
- This enables "how many bets followed VYNDR grades" analytics later
## Service Architecture
+2 -2
View File
@@ -1,7 +1,7 @@
# Feature 2.1 — Parlay Scan
## Overview
The flagship user-facing feature. A user submits a parlay (array of prop legs), BetonBLK grades each leg individually, checks for correlations and conflicts between legs, produces an overall parlay grade, and writes the scan to the database. Free users get 5 scans per month. At scan 5, the system fires a personalized upgrade pitch based on what it learned from scans 1-4.
The flagship user-facing feature. A user submits a parlay (array of prop legs), VYNDR grades each leg individually, checks for correlations and conflicts between legs, produces an overall parlay grade, and writes the scan to the database. Free users get 5 scans per month. At scan 5, the system fires a personalized upgrade pitch based on what it learned from scans 1-4.
## Dependencies
- Feature 1.3 — Prop Analysis Engine (`POST /api/analyze/batch`)
@@ -208,7 +208,7 @@ hook: "You've scanned {total} parlays this month. {good_count} graded B or highe
compliment options:
- "you've got a good eye" (if good_count >= 3)
- "you're getting sharper" (if good_count >= 2)
- "BetonBLK is helping you filter" (if good_count >= 1)
- "VYNDR is helping you filter" (if good_count >= 1)
- "let's find better edges together" (if good_count == 0)
insight: "Your best edge has been {top_stat_type} {top_direction}s. {tier_benefit}."
+5 -5
View File
@@ -1,7 +1,7 @@
# Feature 3.1 — Landing Page
## Overview
Next.js marketing site. Hero section, How It Works, 3-tier pricing with founder badges, email capture CTA, and a blog for SEO content. Deployed on Vercel. This is the first thing a visitor sees — it needs to convert. All copy uses BetonBLK voice: direct, confident, no fluff, speaks like a sharp bettor who respects your time.
Next.js marketing site. Hero section, How It Works, 3-tier pricing with founder badges, email capture CTA, and a blog for SEO content. Deployed on Vercel. This is the first thing a visitor sees — it needs to convert. All copy uses VYNDR voice: direct, confident, no fluff, speaks like a sharp bettor who respects your time.
## Dependencies
- None (static marketing page, no backend calls)
@@ -11,7 +11,7 @@ Next.js marketing site. Hero section, How It Works, 3-tier pricing with founder
- **Framework:** Next.js 14+ (App Router)
- **Styling:** Tailwind CSS
- **Deployment:** Vercel
- **Directory:** `web/` in the betonblk repo (monorepo)
- **Directory:** `web/` in the vyndr repo (monorepo)
## Pages
@@ -20,7 +20,7 @@ Single-page scroll with sections:
**1. Hero**
- Headline: "Stop guessing. Start grading."
- Subheadline: "BetonBLK scans your parlay in seconds. AI-powered prop analysis across DraftKings, FanDuel, and BetMGM."
- Subheadline: "VYNDR scans your parlay in seconds. AI-powered prop analysis across DraftKings, FanDuel, and BetMGM."
- CTA button: "Scan Your First Parlay — Free" → links to /scan (Feature 3.2)
- Background: dark, clean, sports-betting aesthetic. No stock photos.
@@ -109,7 +109,7 @@ web/
│ └── pra-props-explained.mdx
```
## BetonBLK Voice Guide
## VYNDR Voice Guide
All user-facing copy follows these rules:
- **Direct.** No hedging. "This line is soft" not "This line might be worth considering."
- **Confident.** The system did the work. Present findings with authority.
@@ -176,7 +176,7 @@ web/
7. Blog index at /blog lists posts sorted by date
8. Individual blog posts render MDX with correct formatting
9. Blog posts include Open Graph tags and JSON-LD structured data
10. All copy follows BetonBLK voice (direct, confident, concise)
10. All copy follows VYNDR voice (direct, confident, concise)
11. Responsive: works on mobile, tablet, desktop
12. Deploys to Vercel
13. Lighthouse performance score > 90
+1 -1
View File
@@ -12,7 +12,7 @@ The parlay scanner interface. Users input legs via a manual form builder, submit
### Layout
```
┌─────────────────────────────────────────────┐
│ Header: BetonBLK logo + nav + scan counter │
│ Header: VYNDR logo + nav + scan counter │
├─────────────────────────────────────────────┤
│ │
│ ┌─── Leg Builder ────────────────────────┐ │
+1 -1
View File
@@ -12,7 +12,7 @@ Dashboard for tracking bets, viewing performance, and discovering behavioral pat
### Layout
```
┌──────────────────────────────────────────────┐
│ Header: BetonBLK logo + nav │
│ Header: VYNDR logo + nav │
├──────────────────────────────────────────────┤
│ │
│ ┌─ Performance Cards ─────────────────────┐ │
+3 -3
View File
@@ -98,7 +98,7 @@ Simple validation — not a full promo code engine:
VALID_FOUNDER_CODES = ['FOUNDER2026', 'BETONBLK', 'EARLYBIRD']
```
Stored in environment variable: `FOUNDER_CODES=FOUNDER2026,BETONBLK,EARLYBIRD`
Stored in environment variable: `FOUNDER_CODES=FOUNDER2026,VYNDR,EARLYBIRD`
When a valid founder code is used:
1. Checkout uses the founder price ID
@@ -126,9 +126,9 @@ src/
```
STRIPE_SECRET_KEY=sk_...
STRIPE_WEBHOOK_SECRET=whsec_...
FOUNDER_CODES=FOUNDER2026,BETONBLK,EARLYBIRD
FOUNDER_CODES=FOUNDER2026,VYNDR,EARLYBIRD
FOUNDER_CODE_EXPIRY=2026-06-30
BASE_URL=https://betonblk.com
BASE_URL=https://vyndr.app
```
## Acceptance Criteria