Sessions 5-7a: 955 tests, deployment ready
This commit is contained in:
@@ -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,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,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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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}."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ────────────────────────┐ │
|
||||
|
||||
@@ -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 ─────────────────────┐ │
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user