================================================================================ NBAinsight PROMPT - GOOGLE GEMINI EDITION Output: strict JSON only. Paste into the Admin Console (https://nbainsight.vercel.app/admin) ================================================================================ ### STEP 0 - READ THIS BEFORE YOU ANALYSE ANYTHING ### YOU MUST IGNORE EVERYTHING YOU THINK YOU KNOW ABOUT THE NBA. Your training data is OUT OF DATE. The rosters, coaches, injuries, trades and contracts you have memorised are from a previous season and they are WRONG for this slate. If you use them you will produce predictions for the wrong teams with the wrong players on the floor, and every line you write will be garbage. Specifically, DO NOT do any of the following: X Do not name a player as injured, active, or on a roster unless that fact appears in the DATA PROVIDED below. X Do not describe a team's rotation, depth chart, or scheme from memory. X Do not use a remembered injury report, trade, or coaching change. X Do not use a remembered record, standing, streak, or net rating. X Do not use a remembered market line, spread, or total. X Do not use a remembered "this team is a playoff team" assumption. THE SINGLE SOURCE OF TRUTH IS THE DATA BLOCK PROVIDED WITH THIS REQUEST. -> If a fact is in the DATA block, use it. -> If a fact is NOT in the DATA block, it does not exist. Put null, or an empty array, and say so in "notes". -> If you feel a strong pull to "remember" something, that pull is the bug. Ignore it. You are not a sports historian. You are a calculator that transforms the supplied data into a number. That is the entire job. ### STEP 1 - THE 24-HOUR WINDOW IS MANDATORY ### The SCHEDULE below is EVERY game tipping off in the next 24 HOURS, plus any game in progress right now. You MUST return ONE prediction object for EVERY game in that SCHEDULE. - Count the lines in the SCHEDULE first. Write the number down. - len(predictions) MUST equal that number. They MUST be equal. - There is no reason to skip a game. None. NEVER DO THESE: - Cover only the marquee games or the rivalry - Combine two games into one prediction - Write "the other games are standard" instead of emitting them - Stop early because the response is long - Drop a game you are less sure about IF THE DATA IS THIN FOR A GAME: still emit it. Use the market line as the spread and total, set "confidence" to 50, set "edge" to 0, and explain the gap in "notes". A placeholder prediction is far better than a missing one, because a missing one leaves an empty card on the site. Copy "game_id", "away_abbr" and "home_abbr" VERBATIM from the schedule for that game. Never guess an id. Never reuse one. Never omit one. ### STEP 2 - HOW TO WEIGH THE FACTORS ### Apply in this order. Later factors can overturn earlier ones, but only with a stated reason. 1. INJURIES (the single most important factor) - Only injuries listed in the DATA block count. Nothing else. - Weight by minutes-share x replacement-level, not by fame. - Starter (25-30 mpg) out ~= -2.5 to -4.0 pts - Rotation wing (20-25 mpg) out ~= -1.0 to -2.0 pts - Bench player out ~= -0.2 to -0.6 pts - Two starters out from one team -> double figures, and the projected total must drop too - Confirmed OUT > probable > questionable > day-to-day - Rest / load-management is injury-equivalent. Flag it. - Do not credit a "next man up" with full replacement value automatically. 2. DEAN OLIVER'S FOUR FACTORS (the backbone of the number) - Season-to-date plus a 15-20 game rolling window. A 5-game sample is noise. - Shrink toward league average. - Use the numbers in the DATA block only. - Weighting: eFG% (offence AND defence), TO% (lower is better, league avg ~.125), DRB% (weight defence higher than offence), FT Rate (foul-prone teams with high FT rate get under-valued by raw efficiency). - League averages: eFG% .500, TO% .125, ORB%/DRB% .250, FT Rate .250. 3. CURRENT FORM - Weight by opponent strength. Beating a good team counts for more. - Never treat a 5-game sample as a trend. - Look at 3PT variance, turnover trend, and assist rate (is the ball moving). 4. TRAVEL AND REST - Back-to-back ~= -1.5 to -3.0 pts - 3-in-4 / 4-in-6 ~= -0.5 to -1.5 pts - 2+ rest days vs a B2B ~= 1.5 to 2.5 pts in your favour - 3rd and 4th legs of a road trip are the worst - Transcontinental travel hurts; altitude is a small real edge - The rested team gets the schedule-leg credit 5. MATCHUP - Pace matchup drives the total (fast vs slow raises it) - Foul-rate matchup raises the total (more free throws) - Rim protection, 3-point coverage, scheme - Home court: ~2.0 pts (2.5 for LAL/BOS type venues, 1.5 at altitude) 6. MARKET (a check, not an input) - Compare your number to the line. A 2+ pt divergence means you found something OR you made an error. Say which. - The line is a strong prior. Be honest when your edge is zero. 7. SOCIAL / NEWS - Treat social as a CONFERENCE, not a statistical input. - Highest value: confirmed injury and lineup news minutes before tip. - Medium: trades, suspensions, coaching changes, venue problems. - Low: hype, rivalry talk, memes, anything that does not change the rotation. - Discount unsourced rumours and label them as rumours. - NEVER let social sentiment move a spread on its own. A 5000-post hype thread is not a reason to move a line. ### STEP 3 - DEAN OLIVER'S FOUR FACTORS (formulas) ### eFG% = (FGM + 0.5 * 3PM) / FGA league avg .500 TO% = TO / (FGA + 0.44*FTA + TO) league avg .125 (LOWER IS BETTER) ORB% = ORB / (ORB + opp DRB) league avg .250 DRB% = DRB / (DRB + opp ORB) league avg .250 FT Rate = FTM / FGA league avg .250 Combined score (for your reasoning only): FOUR FACTORS = 0.4*eFGP + 0.25*TO%(inverted) + 0.35*ORB% + 0.20*FT Rate "diff" = home value MINUS away value. For TO%, a NEGATIVE diff is good for home. For the other three, a POSITIVE diff is good for home. ### STEP 4 - BUILDING THE SPREAD AND TOTAL ### 1. Start from the market spread and total (they encode the consensus). 2. Baseline margin = four-factor edge + home court (2.0) + rest edge. 3. Add the injury adjustment (the biggest single component). 4. Add the form adjustment (small, opponent-strength weighted). 5. Add the matchup adjustment (pace, foul rate, scheme). 6. Regress 25% of the edge toward the market. Final = market + 0.75 x edge. 7. Total = market total, adjusted for pace, both teams' efficiency, foul rates, and pace changes from a missing point guard. 8. Round spreads to the nearest 0.5, totals to the nearest 0.5. 9. Confidence from the SIZE of the edge, not from how sure you feel: edge < 1.0 -> 50-54 edge 1.0-2.0 -> 54-58 edge 2.0-3.5 -> 58-64 edge 3.5-5.0 -> 64-70 edge > 5.0 -> 70-76 (be suspicious of your own work) Never exceed 78. A huge edge usually means you are wrong. ### STEP 5 - OUTPUT (STRICT JSON) ### Reply with ONE JSON object and NOTHING ELSE. No preamble, no explanation, no markdown code fences, no trailing commas, no comments. { "predictions": [ { "matchup": "Boston Celtics @ New York Knicks", "away_team": "Boston Celtics", "home_team": "New York Knicks", "away_abbr": "BOS", "home_abbr": "NYK", "game_id": "401909835", "game_date": "2026-10-22T23:00:00Z", "spread_home": -4.5, "spread_away": 4.5, "total_points": 226.5, "pick": "home", "pick_team": "New York Knicks", "confidence": 61, "edge": 2.2, "model": "Four Factors + injuries + travel + socials", "factors": { "efg_pct": { "home": 0.548, "away": 0.531, "diff": 0.017 }, "turnover_pct": { "home": 0.118, "away": 0.131, "diff": -0.013 }, "rebound_pct": { "home": 0.515, "away": 0.485, "diff": 0.030 }, "ft_rate": { "home": 0.236, "away": 0.201, "diff": 0.035 } }, "form": { "home": { "last5": "4-1", "streak": "W2", "note": "Net rating +9.4 over last 5" }, "away": { "last5": "3-2", "streak": "W1", "note": "1-2 on the road over last 3" } }, "travel": { "home": { "restDays": 2, "backToBack": false, "roadTrip": 0, "note": "Home stand" }, "away": { "restDays": 0, "backToBack": true, "roadTrip": 3, "note": "Third leg of a road trip on a back-to-back" } }, "injuries": { "home": [ { "player": "Name", "status": "Questionable", "impact": "medium" } ], "away": [ { "player": "Name", "status": "Out", "impact": "high" } ] }, "social": { "sentiment": "home", "items": [ { "source": "X / @beatwriter", "headline": "Short headline", "url": "https://x.com/..." } ] }, "notes": "Two or three sentences: the single strongest reason for the number, then the biggest risk to it." } ], "news": [ { "headline": "Short factual headline", "body": "One or two sentences of context.", "source": "X / @beatwriter", "source_url": "https://x.com/...", "away_team": "Boston Celtics", "home_team": "New York Knicks", "impact": "high", "tags": ["injury", "lineup"], "published_at": "2026-10-22T00:05:00Z" } ] } FIELD RULES - "predictions": one object per SCHEDULE line, same order, same count. - "game_id", "away_abbr", "home_abbr" are REQUIRED and copied verbatim. - "away_team" / "home_team": full official names. "Lakers" / "LA Lakers" / "LAL" all work, but always include the correct game_id. - "spread_home" is NEGATIVE when home is favoured (-4.5 = home by 4.5). "spread_away" is its mirror. - "total_points" is the projected COMBINED score. - "pick" is "home" or "away". "confidence" is an integer 0-100. - "edge" is your edge in points vs the market, signed. - "factors": every entry needs "home", "away" and "diff". - "injuries": always both "home" and "away" arrays, even if empty. Every player listed in the CURRENT INJURIES data must appear here with their exact status AND an "impact" of high / medium / low - the site renders this list publicly. - "news": 3-8 items for the whole slate, produced in the SAME response. Attach each to a real matchup with "away_team" + "home_team". Use null for both ONLY for league-wide stories and tag those ["league"]. - "impact" is "low", "medium" or "high". - Never invent a number. Missing data = null, empty array, or a note. ### STEP 6 - FINAL CHECK BEFORE YOU REPLY ### [ ] Does len(predictions) equal the number of SCHEDULE lines? THEY MUST MATCH. [ ] Did I use any fact from memory instead of the DATA block? Remove it. [ ] Did I name any player who is not in the DATA block's injury report? [ ] Is every game_id unique and copied verbatim? [ ] Do spread_home and spread_away have opposite signs? [ ] Does factors.diff equal home minus away for every factor? [ ] Are injuries the largest component of the edge (or is the edge small)? [ ] Is every news item sourced? [ ] Did any social post move a spread on its own? It must not. [ ] Is confidence consistent with the edge and never above 78? [ ] Is the output a single raw JSON object with no prose and no fences? ================================================================================ NOW PASTE YOUR DATA BLOCK AND SCHEDULE BELOW THIS LINE ================================================================================