TARGET WEEK: 2026-10-19 through 2026-10-25 (America/Chicago) HISTORY ENDS: 2026-10-18 Generated prompt at: 2026-10-24T00:04:42+00:00 Verify the current week again before delivering the data. Create this week's MVPeeps Division I college football prediction data file. WEEKLY UPDATE WORKFLOW - Preserve prediction_record from the previous packet exactly, including all frozen picks and snapshot metadata. Append verified finals for pending picks; never overwrite a saved prediction or rebuild a past pick from newer data. If available, also attach college_football_prediction_record.json from the server and merge it by season + game ID, preserving its existing picks. Use schema mvpeeps.cfb.record.v1 inside the optional prediction_record field. Do not invent an all-time record, pregame timestamps, or missing past weeks. - If an existing college_football_predictions.json is attached, read it first. Reuse stable team IDs, verified profile links, and still-valid source links. Do not simply advance its dates or generated_at. - Recheck the final scores and CLOSING spreads for the newly completed week. Shift the four calendar-week references by the actual number of elapsed weeks, preserving verified byes; drop history outside the new window. Recheck unresolved games/lines. Never fill gaps with assumptions. - Rebuild the upcoming schedule from current sources, including changed kickoff times and cancellations. Remove games that have already started. - Both updated pages retain schema mvpeeps.cfb.predictions.v1 and compute winner-only picks. Do not add predicted final scores or alter the formula. - Generate for the actual current Monday-Sunday week in America/Chicago. If research crosses a Monday boundary, rebuild for the new current week. - Finals in the results array are also used to grade visitors' saved picks. Include verified results even when closing spreads are unavailable. DELIVERABLE Return a downloadable UTF-8 JSON file named exactly: college_football_predictions.json Use schema "mvpeeps.cfb.predictions.v1". This is a research/data task for an existing PHP page, not a website build. Do not write or redesign PHP. Do not substitute a prose report for the JSON file. Validate it before returning it. TIME AND SCOPE 1. Determine the actual current date and timestamp. All calendar dates and week boundaries use America/Chicago; retain explicit offsets in timestamps. 2. prediction_week_start is Monday of the current calendar week. prediction_week_end is the following Sunday. history_week_ending is the Sunday immediately before that Monday. Do not confuse calendar weeks with a publisher's football Week 0/1 labels. 3. Analyze the four COMPLETED Monday–Sunday weeks ending on history_week_ending. Array position 0 is newest, 3 is oldest. Do not include games from the current prediction week in history, even if already final. 4. Include remaining scheduled games in the prediction week that have not started at generated_at. Include games with genuinely unpublished kickoff times using kickoff_at: null. Exclude canceled/postponed games without a confirmed new date, and do not insert a fabricated kickoff time. 5. Include ALL currently verified NCAA Division I football teams: FBS AND FCS, with current-season subdivisions and conferences. Research membership, including transitions. Do not hardcode a remembered team count. Teams with no usable lines must still appear. Do not silently turn this into FBS only. 6. Use this football season only. In postseason months, use the season's start year (e.g., January 2027 playoffs belong to season 2026). Do not reuse games from the previous season to fill early-season history. RESEARCH RULES - Browse actual sources. Prefer NCAA/conference/team publications for membership, schedules, and final scores; use a reputable historical odds source for full-game CLOSING spreads. Inspect the actual records. - Use the SAME named sportsbook or clearly identified closing consensus for all lines where possible. Describe your policy and any exception in line_policy. State each game's exact line_provider. Never mix opening, live, first-half, projected, or current upcoming-game lines into history. - A closing line must be explicitly identifiable as closing in the source; a search snippet displaying a bare spread is insufficient. If you cannot verify the closing line, use null and spread_kind "unavailable". - Each result needs a source for its final score and, if a line is present, a source for that closing line. Each upcoming game needs a schedule source. Link the actual relevant page, never a fabricated URL. Reuse source IDs. - Scores include overtime; use the full-game market's settlement convention. - Never infer a team's result from its rank, current line, ATS record, or the other teams in an old example file. Never invent a missing score, line, date, membership fact, logo, or matchup. - Include logos only when you verify a direct HTTPS image belongs to that team; otherwise use an empty string. A missing logo is fine: the page uses an abbreviation. profile_url is an optional verified MVPeeps team profile URL; leave empty unless that exact link is verified. Never guess team codes. - Build a full verified team inventory first. Then use bulk historical results and odds tables where available. Work in batches, save intermediate results, and produce the full file rather than stopping after popular teams. - If a source requires credentials you do not have, use another accessible authoritative source or accurately mark missing data. Do not pretend access. SCORING — THE PHP PAGE COMPUTES THIS; DO NOT CHANGE THE MODEL For a historical game: home ATS margin = home_score - away_score + home_spread away ATS margin = -home ATS margin home_spread is always FROM THE HOME TEAM'S PERSPECTIVE: home favored by 7.5: -7.5 home underdog by 7.5: +7.5 pick'em: 0 (numeric zero, never null) If the source lists the away spread, negate it to obtain home_spread. Positive margin = cover. Zero = push. Negative = miss. Newest-to-oldest calendar-week weights: 1.00, 0.65, 0.40, 0.25. Score = SUM(ATS margin * calendar-week weight) + 5 * MAX(number of covers across those four weeks - 1, 0). Round the FINAL score to two decimal places; do not round intermediate sums. Misses subtract, pushes contribute zero, and every additional cover after the first earns five extra model points, whether consecutive or not. Byes and verified pre-season weeks contribute zero and KEEP THEIR POSITIONS. Do not shift an older game into a bye week to make it seem more recent. "unverified" history or any final game with a missing closing line makes the entire team's score unavailable. No verified games also means no score. For each matchup, the higher eligible team score predicts the straight-up winner. A tie or a missing score on either side produces no pick. Score and edge are NOT projected winning margins, confidence percentages, calibrated probabilities, power ratings, or recommendations to wager. Do not invent a backtested win rate. Do not add betting links or calls to bet. Do not put precomputed scores, rankings, or predicted winners in the file. The page derives them from the source results to keep the formula consistent. EXACT JSON SHAPE The following is a structural illustration, NOT real sports data. Replace every illustration value. Include all required keys. Output valid JSON, with no comments, markdown fences, NaN, trailing commas, or numeric strings. { "schema": "mvpeeps.cfb.predictions.v1", "dataset_mode": "live", "generated_at": "YYYY-MM-DDTHH:MM:SSZ", "season": 2026, "division_scope": "FBS+FCS", "history_week_ending": "YYYY-MM-DD", "prediction_week_start": "YYYY-MM-DD", "prediction_week_end": "YYYY-MM-DD", "line_policy": "Name the verified closing-line source, sportsbook or consensus, and exceptions.", "coverage": { "inventory_complete": false, "schedule_complete": false, "expected_team_count": null, "notes": "Briefly state coverage, unavailable lines, and any omitted teams or games." }, "membership_source_ids": ["membership-source"], "schedule_source_ids": ["schedule-source"], "sources": [ {"id": "membership-source", "title": "Actual source title", "url": "https://ACTUAL-SOURCE-URL"}, {"id": "schedule-source", "title": "Actual source title", "url": "https://ACTUAL-SOURCE-URL"}, {"id": "result-source", "title": "Actual source title", "url": "https://ACTUAL-SOURCE-URL"}, {"id": "line-source", "title": "Actual source title", "url": "https://ACTUAL-SOURCE-URL"} ], "teams": [ { "id": "school-a", "name": "Verified school team name", "abbr": "AAA", "subdivision": "FBS", "conference": "Verified conference", "logo_url": "", "profile_url": "", "weeks": ["completed-game-a", "bye", "not_started", "not_started"] }, { "id": "school-b", "name": "Another verified school team name", "abbr": "BBB", "subdivision": "FCS", "conference": "Verified conference", "logo_url": "", "profile_url": "", "weeks": ["completed-game-a", "unverified", "not_started", "not_started"] } ], "results": [ { "id": "completed-game-a", "date": "YYYY-MM-DD", "home_id": "school-a", "away_id": "school-b", "home_name": "Verified school team name", "away_name": "Another verified school team name", "home_score": 31, "away_score": 24, "home_spread": -3.5, "spread_kind": "closing", "line_provider": "Exact sportsbook or closing consensus name", "line_source_id": "line-source", "result_source_id": "result-source" } ], "matchups": [ { "id": "upcoming-game-a", "date": "YYYY-MM-DD", "kickoff_at": null, "home_id": "school-a", "away_id": "school-b", "home_name": "Verified school team name", "away_name": "Another verified school team name", "neutral_site": false, "schedule_source_id": "schedule-source" } ] } FIELD AND CONSISTENCY RULES - dataset_mode must be "live" for actual researched data. "sample" is only for explicitly fictional demonstrations; it produces a visible banner. - All IDs: 1–80 characters; lowercase a–z, digits, hyphen, underscore; first character must be a letter or digit. Use stable school IDs across updates. - Every array, including an empty one, must be a JSON array, not an object. - generated_at is a real ISO 8601 timestamp with seconds and Z or a numeric offset. Set it after research, before validating upcoming kickoff times. It must lie within prediction_week_start/end and not be in the future. - All date fields are YYYY-MM-DD in America/Chicago. A known kickoff_at is ISO 8601 with seconds and a UTC offset; its Central date must match date. Do not assume Central Standard Time during daylight saving time. - Each team has exactly FOUR weeks, newest first. Each entry is either: a result ID for that team's final game in that calendar week; "bye" for a VERIFIED in-season week with no game; "not_started" for a VERIFIED week before its current season began; or "unverified" for an unresolved schedule, game, or nonfinal game. Never use bye or not_started just because research did not find a result. - Store each completed game ONCE in results. Both listed teams must reference that SAME game ID in the same correct week position. Never store separate, contradictory lines or final scores for the two sides. Every result must be referenced by every listed team involved in it. - All final scores are integers from 0 to 222. Spreads are numbers from -100 to 100 in whole or half points. No prices/juice such as -110 in this field. - Missing closing line: home_spread null, spread_kind "unavailable", line_provider "", line_source_id "". Keep the verified final score and result_source_id. This is different from pick'em, which is numeric 0. - At least one participant in every result/matchup must be in teams. For a verified opponent outside Division I, use a stable external ID and exact name in the game but do not put it in teams or assign it FBS/FCS. The page displays that opponent and withholds a prediction against an unranked side. - Every game must involve two DIFFERENT IDs. No team can have two completed games in one history calendar week or two matchups in the prediction week. If a rare genuine schedule violates this v1 limitation, do not falsify its dates: report the incompatibility clearly instead of creating an invalid file. - A neutral-site game's home/away designations must match its odds/result source so the line sign is correct. Set neutral_site true for the matchup. - Upcoming matchups need no spread: predictions use historical margins only. - Every source reference must resolve to a sources entry. Source titles must describe what they support. URLs must be real full HTTPS links. Limit ID duplicates; reuse one source entry when a page supports multiple games. - Include at most 500 teams, 1,500 historical results, 500 upcoming matchups, and 6,000 sources. Keep the complete JSON under 8 MiB. COVERAGE HONESTY Set expected_team_count to the current membership total only after verifying it; otherwise null. inventory_complete may be true only after including every verified Division I team and confirming the team count matches that total. membership_source_ids cannot be empty when inventory_complete is true. schedule_complete may be true only when inventory_complete is true and all remaining games for that week have been checked against cited schedule sources. schedule_source_ids cannot be empty when schedule_complete is true. Missing lines do not make the team inventory incomplete, but they must be identified in coverage.notes and left unavailable. Do not describe partial research as all Division I coverage. If full research cannot be completed, return the largest VERIFIED valid packet, mark the correct coverage flags false, and state the omissions by name in notes. Never fill gaps with guesses. BEFORE DELIVERY Validate JSON syntax, numeric types, required keys, current-season membership, team counts, source references, dates, historical week positions, duplicate games, reciprocal line signs, closing-line evidence, and upcoming kickoff timestamps. Spot-check favorite, underdog, push, bye, no-line, and tie cases. If the PHP page is attached, use its validator as the final schema check. Do not attach an old dataset with a new timestamp as if it were new research. Return the file plus one short sentence stating the prediction-week dates, number of teams, number ranked, and whether coverage is complete or partial.