Kickoff state, final score, postgame reports, final xG, and settled odds cannot influence the pre-match model.
Project Turtle / operating method
Turtle Operating Manual
This page is the public reference that future Turtle runs should reopen before a match starts. It explains how data is collected, which sources are trusted, how the score cloud is built, how the proof selects exactly four public scores plus one score 4, and how the postgame analysis is written after full time.
Non-negotiables
The rules that keep Turtle honest.
These are not styling preferences. They are the guardrails that make a public score lab possible. If any item fails, the output is an exploratory note, not a locked prediction.
Intuition can propose a branch, but a branch is selected only when the ledger, rule, and inequality can be shown.
Kalshi or sportsbook prices may be compared only after the score cloud already exists. They cannot create the prediction or publish allocation guidance without formal EV/risk tables.
Every disclosed score must survive deterministic selection rules. Every excluded S10 score needs a named removal rule.
The postgame analysis records hit, miss, score-card settlement, support-market settlement, and the exact rule that needs correction.
After Portugal 0-1 Spain, Turtle added three mandatory proof gates: Clean-Sheet Override, Human Signal Preservation, and Recursive Attack. If a team has an extreme verified non-concession streak, C4 must include a clean-sheet score unless the proof defeats it numerically. If Neohm names a score branch before lock, the branch must be included or rejected by a numeric rule. Every candidate score must be attacked by its strongest opposing fact before it enters C4.
After Belgium 4-1 USA, Turtle added the favorite-cushion ladder rule. If a favorite-cushion BTTS score such as 3-1 survives and the total thread gives P(over 3.5) at or above 0.40, Turtle must evaluate the adjacent ladder before lock: 4-1, 3-2, and 4-2. At least one adjacent score must enter C4 or be rejected by an inequality stronger than the selected branch evidence.
Aster run order
When a match starts, do not improvise the workflow.
Turtle works best when the analyst follows the same order every time. The first job is not to guess the score. The first job is to define the file, protect the cutoff, and make the evidence visible enough that later postgame analysis can tell whether the model was wrong or the data was weak.
Write team names, team codes, date, kickoff time, competition stage, venue, and whether the file is pregame, live, or postgame analysis only.
Every row needs a source URL and visible row text. A row without proof can be a note, but it cannot quietly enter the model.
Calculate rates, modes, lambdas, branch masses, and S10 first. Only after that may Turtle write inclusion and exclusion lemmas.
The exact-score cloud must exist before any price is consulted. Market comparison can change deployment, not the model's memory.
Grade four-score accuracy, support markets, and miss class. Then write the smallest rule correction without pretending it was known before.
Source hierarchy
Reliable data starts with knowing what each source is allowed to prove.
No single public source is perfect for international football. Turtle therefore stores the source URL and visible row text beside every row, then grades each source by what it can reliably support.
Use for fixture identity, kickoff date, venue, squads, lineups, official final score, cards, and tournament context.
- FIFA World Cup 2026 tournament hub
- FIFA men's world ranking
- Official national federation squad or lineup releases when available.
Use for fast last-50 mining when the table is rendered, inspectable, and each row can be checked by date, opponent, and score.
- Example: Colombia results ledger
- Example: Ghana results ledger
- Rendered rows are acceptable as a fast primary path only when proof fields are retained.
Use for settlement cross-checks, shots, corners, xG, cards, substitutions, and in-match texture. Coverage must be explicit.
- Guardian live/report context
- StatsBomb open data when the relevant competition exists.
- FBref, FIFA match centre, or comparable pages only when row-level coverage is visible.
Use as bounded modifiers, never as truth. Rankings, Elo, and EA FC style ratings help classify mismatch, not predict alone.
- FIFA ranking and Elo-style ratings for opponent class.
- Current squad minutes, lineup continuity, injury/news notes.
- EA FC ratings are a proxy for broad roster quality, not a factual match source.
Use after prediction lock to test edge and choose support markets. Prices cannot create the score cloud.
- Kalshi markets or API snapshots after the exact-score proof is locked.
- Executable price, side, time, and ticker must be recorded if a market comparison is made.
Collection protocol
How a match file is mined before the model is allowed to speak.
Turtle should be able to regenerate a match file from scratch and explain every row. The goal is not maximum scraped data. The goal is a small, reliable, reviewable ledger that makes the later mathematics accountable.
Record teams, team codes, competition, stage, venue, kickoff time, timezone, and whether the prediction is pregame, live, or postgame analysis only.
Define the cutoff before the target match starts. Future rows, the target match itself, postgame reports, and final-score summaries are excluded from prediction inputs.
Mine the latest 50 valid pre-cutoff matches for each team. Keep incomplete rows only when flagged for manual review; models consume only rows with parse_status = ok.
Extract recent form and World Cup rows separately. A team can look average across 50 matches but behave differently under current tournament pressure.
Estimate how much of the current XI plus likely substitutes appeared in the mined rows. Older rows with low overlap are down-weighted.
Classify opponent strength, venue, rest, travel, knockout pressure, injuries, suspensions, and motivational context. These are modifiers, not scorelines by themselves.
Flag rows with missing date, score, opponent, venue, scorer ambiguity, or source conflict. A missing-data flag is better than false confidence.
Write CSVs, model summary, candidate table, proof ledger, lock note, and postgame analysis shell before publishing the card.
Required ledger fields
The spreadsheet exists so the proof has something to cite.
The ledger is the first object Turtle should physically inspect. A beautiful model built on a vague ledger is not analysis; it is decoration.
row_id, team_code, team, date, competition, stage, home_away_neutral, opponent.
goals_for, goals_against, scoreline, result, total_goals, goal_difference.
team_scored, team_failed_to_score, team_conceded, team_clean_sheet, btts, over_1_5, over_2_5, over_3_5.
scorers_for_text, scorers_against_text, goal_minutes_for_text, goal_minutes_against_text.
venue, city_country, source_url, source_page_title, source_row_text.
parse_status, data_quality_score, needs_manual_review, notes.
Shots, shots on target, xG, corners, squad overlap, starting-XI overlap, opponent strength class, injury load, rest days, and emotional or momentum index.
Statistical layer
The first pass is descriptive, not predictive.
Before Turtle estimates any score, it writes the descriptive facts. This is where we catch traps such as a high scoring rate built against weak opponents, or a clean-sheet pattern hidden by average goals.
Team summaries
GF50,GA50: average goals for and against over the last 50 valid rows.GF10,GA10: same over the latest 10 rows.GF_WC,GA_WC: same over current World Cup rows.- Scoring rate, conceded rate, failed-to-score rate, clean-sheet rate, BTTS rate.
- Over 1.5, over 2.5, over 3.5 rates and two-plus scoring rate.
Mode summaries
- Win-mode scorelines: how the team usually wins.
- Draw-mode scorelines: whether draws are 0-0, 1-1, 2-2, or chaos.
- Loss-mode scorelines: whether losses are narrow, clean-sheet losses, or blowouts.
- Goal timing when available: early pressure, late collapses, penalty dependency.
Interpretation rule
A mean is not a theorem. If a team averages 1.8 goals but most wins are 1-0 and one 7-0 inflates the sample, the candidate cloud must see the mode, not only the average.
Opponent-threshold model
The last 50 is not one flat pool.
For match A vs B, Turtle asks how A performs against
opponents in B's strength realm, and how B performs
against opponents in A's strength realm. This is the correction
after Algeria-Switzerland and Canada-Morocco.
r_A, r_B in [0,10]
Ratings can come from FIFA rank, Elo-style proxies, squad quality, and public scout notes. The source and confidence are stored.
realm_A_vs_B = { rows of A : |opponent_rating - r_B| <= epsilon }
Default epsilon = 0.75. If fewer than five usable rows survive, widen once to 1.25.
w(row) = recency * competition * squad_overlap * exp(-d^2/(2 sigma^2))
Default sigma = 0.75. Sparse realms are shrunk toward the last-50 prior and marked weak.
team_strength_ratings.csv, opponent_threshold_ledger.csv, realm_summaries.csv
The proof must state raw rows, effective rows, readiness, GF/M, GA/M, scored rate, clean-sheet rate, and shrinkage state.
Mathematical model
Expected goals are built from the ledger, then the score grid is computed.
Turtle currently uses a transparent independent Poisson score grid. That is a baseline, not a claim that football is truly independent or memoryless. The value is that every later adjustment is visible.
A_i = w50 GF50_i + w10 GF10_i + wWC GFWC_i
Build a blended attack component for team i.
D_i = w50 GA50_i + w10 GA10_i + wWC GAWC_i
Build a blended concession component for team i.
λ_home_raw = (A_home + D_away) / 2
λ_away_raw = (A_away + D_home) / 2
Pair one team's attack with the opponent's defensive weakness.
λ_i = λ_i_raw · m_strength · m_pace · m_lineup · m_block · m_emotion
Each modifier is bounded, recorded, and must have a source or a stated reason. Emotional or momentum adjustments are intentionally small.
P(a,c) = Pois(a; λ_home) Pois(c; λ_away)
Pois(k; λ) = e^(-λ) λ^k / k!
The grid probability for exact score (a,c).
A modifier cannot rescue a bad thesis. It can only adjust the rate inside a narrow range: knockout caution, favorite pressure, underdog block, lineup continuity, current-tournament seriousness, and emotional state must be named before the candidate scores are selected.
Candidate universe
The score cloud starts as a finite mathematical object.
Turtle does not scan every imaginable scoreline. It defines a finite grid, ranks it, and then proves why the disclosed scores are the ones that survive.
G = {0,...,7} x {0,...,7}. Scores outside this grid are ignored pre-match unless a dedicated live-state rule opens a tail branch.
S10 is the set of the ten scores in G with largest P(a,c), breaking exact ties lexicographically by (a,c).
For a branch B, M(B) = ∑ P(s) over all grid scores s in that branch.
I(s) is a recorded selection index combining probability, branch mass, data support, and risk penalty. Its components must be in the model summary.
Branch system
Exact scores carry football meaning, not only probability mass.
The Argentina-Cape Verde lesson is that a pressure branch should not delete a strong draw or low-block branch just because the favorite is famous. Branches are therefore defined before selection.
| Branch | Predicate for score (h,a) | Football meaning |
|---|---|---|
B_home_win | h = a + 1 | Favorite or home side wins narrowly. |
B_home_cushion | h ≥ a + 2 | Favorite control turns into a two-plus margin. |
B_draw_low | (h,a) in {(0,0),(1,1)} | Block, caution, or mutual containment. |
B_draw_high | h = a and h ≥ 2 | Open game where neither team separates. |
B_away_win | a > h | Underdog or away upset path. |
B_clean | h = 0 or a = 0 | At least one side is held scoreless. |
B_btts | h ≥ 1 and a ≥ 1 | Both teams score. |
B_tail | Named before disclosure | Low-probability but thesis-compatible score kept as the score 4. |
Spread thread
Result direction must become a margin family before exact scores.
The Canada-Morocco miss created this rule. Turtle had Morocco as the strongest regulation bucket and Under 3.5 as coherent support, but it jumped directly to exact scores and forced Canada scoring. The missing object was the spread thread: a ranked family of margins that says how the stronger side can win.
Compute the result buckets first: home win, draw, away win. The strongest bucket gets a named representative family.
Convert the result bucket into margins: win by 1, win by 2+, clean-sheet win, or chase-state extension.
Ask whether the margin family lives under 2.5, exactly 3, under 3.5, or in an open-game tail.
Only now decide whether both teams scoring is required. A scoring-rate gate cannot erase a full clean-sheet family by itself.
If the strongest result bucket is an away win and the support total is below four,
Turtle must test 0-1, 0-2, 0-3 as one spread family before selecting
any BTTS score. If 0-2 is in S10 and 0-3
is the next same-family extension, the family needs a named inclusion or a named
double-veto. Silence is not a proof.
Proof system
The public prediction must read like a small theorem.
The proof is where Turtle stops saying "cloud" and starts showing why the card follows mechanically from definitions, data, rules, and inequalities. The theorem is not allowed to introduce a fresh opinion.
Define G, S10, P(s), branches, thresholds, modifiers, support gates, and the exact meaning of C4 and score 4.
State the ledger facts used: scoring rates, clean sheets, modes, opponent class, lineup continuity, current tournament rows, and missing-data penalties.
For every s in S10, show P(s), branch, branch mass, Turtle index, data support, rule status, and final status.
Write deterministic rules R1...Rn. Examples: no-score gate, branch representative rule, draw preservation rule, and disclosure cap.
Each disclosed score survives by inequality: its probability, index, branch, and comparison must be visible.
Every non-disclosed score in S10 is removed by a named rule, not by prose. Exhaustion matters.
Under the stated definitions, data, and rules, the unique disclosed set is C4 = {s1, s2, s3, s4}.
Under Definitions 1-N, Data 1-N, and Rules R1-RN, the unique disclosed main
set is C4 = {s1, s2, s3, s4} in declared order. This follows from the inclusion lemmas for
s1,s2,s3,s4 and the exclusion-by-exhaustion lemma over S10.
four-score card standard
Four equal score predictions.
The public score prediction is not a parlay fantasy. It is a compact score-card claim: four exact-score predictions Turtle is willing to grade together, with score 4 preserving the best danger branch instead of hiding it.
Exactly four exact scores. Four-score accuracy asks whether the final regulation score is in this set.
The fourth score is selected by branch evidence and graded inside C4, not as a lesser side bucket.
Over/under or BTTS can be used only if it protects the exact-score thesis. It is not a shortcut around score prediction.
If a market is checked, record side, executable price, model fair probability, and why it supports or conflicts with the score cloud. Do not publish allocation guidance until EV, bankroll, risk, and correlation tables exist.
Support markets are analysis-only alignment checks until Turtle has formal EV, bankroll, risk, and correlation tables. A support row may say aligned, partial, or contradictory relative to C4; it may not recommend allocation size. Scorer props, corners, and assists require separate models.
Postgame analysis
Postgame analysis is where the lab improves.
A hit is evidence, not proof. A miss is not humiliation; it is a named rule correction. The postgame analysis exists so Turtle cannot quietly rewrite history.
Record official regulation score, source, final status, and whether the match went to extra time or penalties.
Grade four-score accuracy against C4 and four-score accuracy against C4.
Grade support separately. A correct support market does not turn a wrong exact-score cloud into a hit.
Name the failure: strength gate, clean-sheet gate, draw branch, pace error, lineup shock, finishing variance, or data-quality failure.
Write the smallest rule change that would have made the model treat the game correctly without cheating backward.
File contract
Every match should leave a recoverable trail.
The website is the polished public layer. The project folder is the source of truth. If the local artifacts cannot explain the page, the page is not ready.
| Artifact | Purpose |
|---|---|
TEAM_match_ledger.csv | Reviewable last-50 rows for each team, with source proof and quality flags. |
team_strength_ratings.csv | The 0-10 team and opponent strength ratings used by the realm filter. |
opponent_threshold_ledger.csv | Every ledger row joined to opponent rating, distance from the target realm, and row weight. |
realm_summaries.csv | Opponent-threshold GF/GA, scoring, clean-sheet, BTTS, total, result, and spread rates. |
spread_thread.csv | Result, spread, total, BTTS, and clean-sheet thread probabilities before exact-score disclosure. |
model_summary.csv | Computed descriptive stats, lambdas, modifiers, and readiness score. |
score_candidates.csv | The full S10 candidate table with probabilities, branches, indices, and statuses. |
final_3_plus_1_card.csv | The locked four locked predictions plus one score 4. |
support_market_card.csv | Optional market support, separated from exact-score prediction. |
proof_ledger.csv | Definitions, rules, inclusion lemmas, exclusion lemmas, and theorem statements. |
DATA_AUDIT.md | Sources, fetch time, row counts, rejected rows, manual-review rows, and assumptions. |
PREDICTION_LOCK.md | Timestamped lock containing the final card before kickoff or before the specified live state. |
Current lessons encoded into the method
The rules are written from scars, not slogans.
The cloud landed, but one hit is only evidence. The lesson was to preserve a compact exact-score branch and review the sample honestly.
Raw scoring rates over-weighted Algeria and under-weighted opponent strength, control, and clean-sheet pressure. This created the strength gate.
The draw branch was real. Turtle must compare 0-0, 1-1, and 2-2 modes instead of treating all draws as one bucket.
Score 4 landed and exposed the display problem. This created the four-score standard: four equal public score predictions.
The exact-cell leader landed and Under 3.5 support matched the low-total cloud. This is a clean hit, but still only part of the ledger.
Protocol failure, not variance. Turtle overstacked BTTS, ignored Spain's elite clean-sheet streak, and failed to preserve Neohm's 0-1 Spain signal. This created the Clean-Sheet Override, Human Signal Preservation, and Recursive Attack gates.
Protocol failure, not variance. Turtle read the Belgium/BTTS/high-total state but capped the favorite-cushion branch at 3-1. This created the favorite-cushion ladder rule: 4-1, 3-2, and 4-2 must be tested when 3-1 survives with a high over-3.5 thread.
What Turtle must not do
Fast mistakes that make the lab useless.
- Do not use market-implied probabilities as independent priors.
- Do not scrape a row and discard its proof text.
- Do not force deployment or prediction because a budget exists.
- Do not publish allocation guidance until EV, bankroll, risk, and correlation tables exist.
- Do not ignore an extreme clean-sheet streak or a named Neohm score branch.
- Do not admit a score into C4 until it survives the strongest opposing fact.
- Do not select a favorite-cushion BTTS score such as 3-1 without testing its adjacent ladder when the over-3.5 thread is live.
- Do not treat scorer, assist, corner, or card props as modeled unless a dedicated model exists.
- Do not change the public card after kickoff and call it the original prediction.
- Do not use a result from weak-opponent rows without an opponent-strength adjustment.
- Do not call a live hedge a pre-match prediction.
Reference links
Sources Turtle opens first.
These links are starting points. The match page must still record the exact URL used for that match and the fetch or review time.