{"id":"676d9f9b-20d9-4485-9489-5ba8305803d9","entityType":"agent","slug":"clawhub-youjunzhao-world-cup-2026-predictor","name":"World Cup and Football Predictor","canonicalUrl":"https://www.xpersona.co/agent/clawhub-youjunzhao-world-cup-2026-predictor","canonicalPath":"/agent/clawhub-youjunzhao-world-cup-2026-predictor","generatedAt":"2026-10-12T12:20:30.058Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:30:32.004Z","emptyReason":null},"description":"Use for English or Chinese football match forecasts, pre-kickoff alerts, post-match review, and controlled self-evolution from multi-book odds, line movement...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 976 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17dqq0kma9dgn9qf8j67bhskn83s2cj:world-cup-2026-predictor","sourceUrl":"https://clawhub.ai/youjunzhao/world-cup-2026-predictor","homepage":"https://clawhub.ai/youjunzhao/skills/world-cup-2026-predictor","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/youjunzhao/world-cup-2026-predictor","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/youjunzhao/skills/world-cup-2026-predictor","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"World Cup and Football Predictor technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:30:32.004Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:30:32.004Z","emptyReason":null},"stars":null,"forks":null,"downloads":976,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.2.0","tractionLabel":"976 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:30:31.991Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T23:30:32.004Z","lastCrawledAt":"2026-10-11T23:30:31.991Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T23:30:31.991Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.0","createdAt":"2026-07-13T06:40:23.237Z","changelog":"**Major update: Adds post-match review, model evolution, and expanded market/format support.** - Introduced post-match review and model evolution workflows, including scripts for settling results, reviewing forecasts, and tracking calibration. - Added support for new odds formats and market types, with clarified evidence intake and validation rules. - Expanded example coverage and reference documentation for post-match and model monitoring. - Updated SKILL.md for enhanced post-match and evolution guidance, including bilingual review labels and calibration processes. - Implemented new tests for post-match alerts, review, evolution, and content validation. - Removed older, obsolete documentation files for clarity.","fileCount":29,"zipByteSize":122688},{"version":"1.1.0","createdAt":"2026-07-12T13:30:38.383Z","changelog":"V2 multi-book consensus, European and Asian handicap conversion, 1X2/totals/BTTS/exact-score consistency, calibration gates, four rolling pre-kickoff alerts, and automatic English/Chinese response matching.","fileCount":16,"zipByteSize":61247},{"version":"1.0.2","createdAt":"2026-07-08T08:15:08.086Z","changelog":"Make the skill bilingual: English prompts receive English forecasts, Chinese prompts receive Chinese forecasts, with bilingual output-section guidance.","fileCount":8,"zipByteSize":13072},{"version":"1.0.1","createdAt":"2026-07-08T08:06:08.407Z","changelog":"- Renamed skill to world-cup-2026-predictor and updated description for broader odds/market types and more languages/formats. - Added a new reference: odds-formats.md, supporting conversion and clarity across multiple odds systems (decimal, US, Hong Kong, Malay, Indo). - Improved output requirements: must label every odds source and format, with stricter explanation of line interpretation and implied probability. - Clarified workflow steps and added emphasis on using both market-rules.md and odds-formats.md for disciplined forecasts. - Extended odds format handling, specifically instructing to treat Asian handicap separately from 1X2 and never to equate the two. - Further strengthened disclaimers and safety boundary language.","fileCount":8,"zipByteSize":12577},{"version":"1.0.0","createdAt":"2026-07-07T22:52:23.181Z","changelog":"Initial release of World Cup Odds Forecaster: - Provides disciplined, probability-based forecasts for World Cup matches using bookmaker odds, market movement, and fresh news. - Supports analysis in Chinese and English, with responses in the user’s language. - Covers 90-minute, qualification, handicap, totals, BTTS, and correct score markets. - Structured outputs: conclusion, market reading, news confirmation, bookmaker perspective, risks, and pre-kickoff reminders. - Emphasizes data discipline, risk awareness, and avoids guaranteeing results.","fileCount":7,"zipByteSize":9578}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17dqq0kma9dgn9qf8j67bhskn83s2cj:world-cup-2026-predictor","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17dqq0kma9dgn9qf8j67bhskn83s2cj:world-cup-2026-predictor` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/youjunzhao/world-cup-2026-predictor before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T12:20:30.048Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-youjunzhao-world-cup-2026-predictor/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:30:32.004Z","emptyReason":null},"readme":"Skill: World Cup and Football Predictor\n\nOwner: youjunzhao\n\nSummary: Use for English or Chinese football match forecasts, pre-kickoff alerts, post-match review, and controlled self-evolution from multi-book odds, line movement...\n\nTags: latest:1.2.0\n\nVersion history:\n\nv1.2.0 | 2026-07-13T06:40:23.237Z | auto\n\n**Major update: Adds post-match review, model evolution, and expanded market/format support.**\n\n- Introduced post-match review and model evolution workflows, including scripts for settling results, reviewing forecasts, and tracking calibration.\n- Added support for new odds formats and market types, with clarified evidence intake and validation rules.\n- Expanded example coverage and reference documentation for post-match and model monitoring.\n- Updated SKILL.md for enhanced post-match and evolution guidance, including bilingual review labels and calibration processes.\n- Implemented new tests for post-match alerts, review, evolution, and content validation.\n- Removed older, obsolete documentation files for clarity.\n\nv1.1.0 | 2026-07-12T13:30:38.383Z | user\n\nV2 multi-book consensus, European and Asian handicap conversion, 1X2/totals/BTTS/exact-score consistency, calibration gates, four rolling pre-kickoff alerts, and automatic English/Chinese response matching.\n\nv1.0.2 | 2026-07-08T08:15:08.086Z | user\n\nMake the skill bilingual: English prompts receive English forecasts, Chinese prompts receive Chinese forecasts, with bilingual output-section guidance.\n\nv1.0.1 | 2026-07-08T08:06:08.407Z | auto\n\n- Renamed skill to world-cup-2026-predictor and updated description for broader odds/market types and more languages/formats.\n- Added a new reference: odds-formats.md, supporting conversion and clarity across multiple odds systems (decimal, US, Hong Kong, Malay, Indo).\n- Improved output requirements: must label every odds source and format, with stricter explanation of line interpretation and implied probability.\n- Clarified workflow steps and added emphasis on using both market-rules.md and odds-formats.md for disciplined forecasts.\n- Extended odds format handling, specifically instructing to treat Asian handicap separately from 1X2 and never to equate the two.\n- Further strengthened disclaimers and safety boundary language.\n\nv1.0.0 | 2026-07-07T22:52:23.181Z | auto\n\nInitial release of World Cup Odds Forecaster:\n\n- Provides disciplined, probability-based forecasts for World Cup matches using bookmaker odds, market movement, and fresh news.\n- Supports analysis in Chinese and English, with responses in the user’s language.\n- Covers 90-minute, qualification, handicap, totals, BTTS, and correct score markets.\n- Structured outputs: conclusion, market reading, news confirmation, bookmaker perspective, risks, and pre-kickoff reminders.\n- Emphasizes data discipline, risk awareness, and avoids guaranteeing results.\n\nArchive index:\n\nArchive v1.2.0: 29 files, 122688 bytes\n\nFiles: agents/openai.yaml (398b), examples/completed-match.json (459b), examples/forecast-snapshot.json (27854b), examples/legacy-match.json (700b), examples/multi-book-match.json (22765b), profiles/default.json (455b), references/consensus-model.md (5648b), references/market-rules.md (6395b), references/odds-formats.md (3221b), references/postmatch-evolution.md (5810b), references/source-policy.md (3203b), scripts/calibrate.py (24385b), scripts/evolve.py (33975b), scripts/forecast.py (113549b), scripts/kickoff_alerts.py (4504b), scripts/model_profile.py (21043b), scripts/postmatch_alerts.py (5557b), scripts/postmatch_review.py (48789b), skill-card.md (3034b), SKILL.md (14066b), tests/test_calibrate.py (24880b), tests/test_evolve.py (25281b), tests/test_forecast.py (73487b), tests/test_kickoff_alerts.py (6499b), tests/test_model_profile.py (17498b), tests/test_postmatch_alerts.py (6228b), tests/test_postmatch_review.py (20980b), tests/test_skill_content.py (3166b), _meta.json (143b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: world-cup-2026-predictor\ndescription: Use for English or Chinese football match forecasts, pre-kickoff alerts, post-match review, and controlled self-evolution from multi-book odds, line movement, 1X2/moneyline, European odds, Asian handicap, Hong Kong/Malay/Indo water, totals, BTTS, exact score, qualification, lineup/news, 盘口, 赔率, 欧赔, 亚盘, 港赔, 马来盘, 印尼盘, 大小球, 临场盘, 比分预测, 赛后复盘, and 模型进化.\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - python3\n    emoji: \"⚽\"\n---\n\n# World Cup 2026 Predictor\n\nUse this skill to produce a disciplined, probability-based football forecast from market structure and fresh news. Keep the output analytical: no guarantees, no profit claims, no certainty language, and no claim that a bookmaker knows the result.\n\nThe canonical invocation name stays `world-cup-2026-predictor`. The skill now covers football broadly, including international tournaments and club matches, while preserving bilingual response matching.\n\n## Language Policy\n\nUse the same language as the user in the response.\n\n- English input -> English response.\n- Chinese input -> Chinese response.\n- Mixed input -> use the dominant language and keep market terms that are clearest in their original form.\n- Do not duplicate every paragraph in both languages. Write one response in the user's language.\n\n## Intake Gate\n\nBefore calculating:\n\n1. Confirm the exact teams, competition, kickoff time and timezone, venue when relevant, and whether the match has started.\n2. Confirm the match type: `league_or_group`, `single_leg_knockout`, `two_leg_first`, `two_leg_second`, or `friendly`. A second leg also requires the aggregate score and applicable tiebreak rules.\n3. Collect at least three independent underlying bookmakers; five or more are preferred. An aggregator and its displayed bookmaker are one source, not two.\n4. Record the source, underlying bookmaker, market, period, line, selection, explicit odds format, observed timestamp, and snapshot for every quote.\n5. Link the schedule/competition source, odds sources, and every material lineup or news source.\n\nIf match identity is ambiguous, required context is missing, or the match has already started, abstain from a new pre-match forecast.\n\n## Forecast Workflow\n\n1. Deduplicate quotes by underlying bookmaker before counting sources.\n2. Convert declared formats to decimal and implied probability. Reject ambiguous formats rather than guessing.\n3. Remove each bookmaker's margin, then build the weighted, de-vigged consensus described in `references/consensus-model.md`.\n4. Keep opening separate and compare Opening, T-3h10, T-2h10, T-1h10, and T-10min snapshots when available. Never relabel a nearby quote as a missing checkpoint.\n5. Fit one coherent 90-minute score distribution from 1X2, totals, and BTTS. Use Asian handicap and exact-score markets as margin/consistency checks.\n6. Keep 90-minute and qualification/to-advance probabilities separate. Qualification may include extra time and penalties.\n7. Classify news as confirmed hard information, credible but unconfirmed reporting, or public narrative. Do not add a hidden probability adjustment; check whether later prices confirm the news.\n8. Compare the new result with prior analysis. State what changed, what stayed the same, and whether the conclusion improved or was revised.\n9. Score evidence quality and abstain when the evidence gate fails.\n\nIf a bundled script rejects malformed odds, missing formats, aggregator provenance, or unsupported live-only input, catch that validation error at the response layer. Name the missing/invalid field and return `no forecast edge` or `观望`; never expose a traceback and never guess a replacement value. When `actionable_forecast` is false, probabilities may be described only as diagnostics, not as a pick.\n\n## Evidence Rules\n\n- Require the market type, selection, and odds format before interpreting any number.\n- Convert every price to a fair probability before comparing books.\n- Remove bookmaker margin before building consensus.\n- Use de-vigged consensus, not raw price averages.\n- Treat opening lines as a separate reference point, not a substitute for current data.\n- Prefer fresh quotes close to kickoff. Older data must be labeled as such.\n- If the current picture depends on one book, one feed, or one rumor, do not publish a betting edge.\n\n## Market Coverage\n\n- 90-minute result: home/draw/away or moneyline.\n- Qualification or to-advance: only for advancement, extra time, or penalties.\n- Asian handicap: cover risk, not winner truth.\n- Totals and BTTS: goal-shape and score-shape evidence.\n- Exact score: consistency check, not the primary anchor.\n\nKeep 90-minute and qualification markets separate. A team can be weak in 90 minutes and still credible to advance.\n\n## Consistency Rules\n\n- Asian handicap, totals, BTTS, and exact score must agree with the same fitted score distribution.\n- If they disagree, explain the conflict instead of averaging it away.\n- A stronger 1X2 favorite with a weak handicap is a narrow-win signal, not a blowout signal.\n- A qualification favorite with a weak 90-minute price implies extra-time or penalty risk.\n- Do not treat one market family as independent evidence if it is derived from the same underlying prices.\n\n## News Rules\n\n- Mark news as `confirmed` only when it comes from official or clearly attributable sources.\n- Mark it as `unconfirmed` when it is rumor, preview, opinion, or unsupported reporting.\n- Include source links for news that affects the forecast.\n- If news is weak or unverified, keep it separate from the market read and lower confidence.\n\n## Rolling Alert Workflow\n\nWhen the user requests rolling pre-kickoff updates, create exactly four alerts per match unless the user explicitly requests a different schedule:\n\n| Offset | Purpose |\n| --- | --- |\n| T-3h10 | Establish the fresh multi-book baseline and compare with opening. |\n| T-2h10 | Recheck consensus movement, news, and source quality. |\n| T-1h10 | Recheck likely/confirmed lineup information and flip triggers. |\n| T-10min | Produce the final pre-match update, leaving the requested 10-minute decision window. |\n\nEvery alert prompt must invoke `$world-cup-2026-predictor`, refresh current sources, read prior analysis, and answer in the user's language. Use `scripts/kickoff_alerts.py --minutes-before 190 130 70 10` to generate exact local times. If automation tools are available, create the alerts; otherwise return the four exact times and prompts. A user who explicitly asks only for the final alert may use the default T-10min mode.\n\n## Post-Match Review And Evolution\n\nReview correct and incorrect forecasts with the same discipline and in the same language as the user. A correct pick is not proof that its explanation was valid, and a wrong pick is not permission to chase the latest result.\n\n1. Fetch one official final result or two reputable independent sources that agree.\n2. Keep `score_90m`, `score_after_extra_time`, `penalties`, and the qualifier separate. Never settle a 90-minute market with an extra-time or penalty result.\n3. Join the verified result to the exact archived forecast by event id and `input_fingerprint`. Reject missing or changed replay input.\n4. Settle 1X2, qualification, Asian handicap, totals, BTTS, and correct score in their declared periods. Quarter lines may be `half_win` or `half_loss`; pushes stay pushes.\n5. Review both right and wrong calls, closing movement, evidence-backed causes, calibration impact, and unresolved evidence. Never invent a cause from the final score.\n6. Write the completed record once. Postponed, abandoned, suspended, conflicting, or otherwise non-final results remain pending and never enter learning data.\n\nUse these user-facing labels:\n\n| User language | Required review labels |\n| --- | --- |\n| English | Final result, Right, Wrong, Unsettled/push, Causes, Calibration, Evolution status, Probability reminder |\n| Chinese | 最终赛果、判断正确、判断错误、未结算/走盘、原因证据、校准影响、模型状态、概率提醒 |\n\n### Evolution Safety Gates\n\nOne completed match never changes the active profile. Eligibility requires at least 100 distinct matches overall and 30 distinct matches in every affected bucket. Four alert snapshots from one event count as one independent match, and only the latest valid pre-kickoff record is primary.\n\nUse grouped chronological walk-forward evaluation: older events select one-coordinate `-5%` or `+5%` challengers, and the newest 30 distinct events form the holdout. All snapshots from one event stay in one fold. Tier D remains zero.\n\nPromotion requires every gate: 1% relative Brier improvement, no log-loss regression, no totals or BTTS regression when each has at least 30 observations, a 2% bucket regression cap, and a 0.005 calibration-error tolerance. Invalid records, source conflicts, missing fingerprints, non-finite metrics, or stale parent profiles fail closed. Pick accuracy is diagnostic, not a promotion gate.\n\nUse these state ids and explain them in the user's language:\n\n| State | Meaning |\n| --- | --- |\n| `model_unchanged` | Fewer than 100 distinct matches, no eligible bucket, or no validated improvement. |\n| `challenger_pending` | A challenger exists, but one or more holdout or regression gates are pending or failed. |\n| `champion_promoted` | Every promotion gate passed and the versioned profile was atomically activated. |\n| `champion_rolled_back` | A manual rollback was performed, or 30 new distinct matches showed both Brier and log-loss regression against the parent. |\n\nDo not perform a per-match profile update. Automatic rollback evidence requires 30 new distinct matches and both primary metrics to worsen; `--mode rollback` is also an explicit operator recovery command. Keep every promoted profile, its parent, record ids, metrics, parameter diff, decision, and integrity fingerprint.\n\n### Reproducible Commands\n\n```bash\npython3 scripts/forecast.py --input examples/multi-book-match.json --data-dir ~/.football-forecaster --pretty\npython3 scripts/postmatch_review.py --forecast examples/forecast-snapshot.json --result examples/completed-match.json --language en --data-dir ~/.football-forecaster --pretty\npython3 scripts/calibrate.py --input ~/.football-forecaster/completed.jsonl --pretty\npython3 scripts/evolve.py --completed ~/.football-forecaster/completed.jsonl --data-dir ~/.football-forecaster --mode evaluate --pretty\npython3 scripts/evolve.py --completed ~/.football-forecaster/completed.jsonl --data-dir ~/.football-forecaster --mode promote --pretty\npython3 scripts/evolve.py --data-dir ~/.football-forecaster --mode rollback --pretty\npython3 scripts/postmatch_alerts.py --input matches.json --timezone Asia/Hong_Kong --retry-count 4\n```\n\nUse `--language zh` for a Chinese review. Read `references/postmatch-evolution.md` before creating post-match automation, interpreting evolution gates, or changing a model profile.\n\n## Required Output\n\nUse the same language as the user and include:\n\n1. Data timestamp, timezone, match type, and current alert offset.\n2. A compact conclusion table: 90-minute result probabilities, qualification when applicable, Asian handicap, total, BTTS, and a three-level score ladder.\n3. Source coverage: raw sources, deduped independent bookmakers, formats, freshness, and missing checkpoints.\n4. What changed, what stayed unchanged, and whether the previous forecast is retained or revised.\n5. No-vig 90-minute probabilities and a separately labeled qualification probability.\n6. Asian handicap, totals, BTTS, and exact-score consistency or conflict.\n7. Confirmed lineup/news versus unconfirmed reporting and public narrative, with links.\n8. A bookmaker/capital read grounded in observable prices and movement, without alleging manipulation.\n9. Confidence as evidence quality, all abstention reasons, and exact flip triggers.\n10. A concise betting-window note that never promises profit or accuracy.\n\nWhen the evidence is insufficient, output `no forecast edge` in English or `观望` in Chinese instead of forcing a pick.\n\n### Non-Actionable Output\n\nWhen validation fails, a bundled script raises an input error, or `actionable_forecast` is false, replace the normal conclusion table with only:\n\n1. Match, timestamp, and `no forecast edge` / `观望` status.\n2. Stable reason category: `invalid_odds_format`, `missing_underlying_bookmaker`, `insufficient_books`, `invalid_context`, `stale_near_kickoff`, `already_started`, or `unsupported_live_state`.\n3. The invalid or missing field and the evidence needed for a new run.\n4. The next relevant checkpoint, if kickoff has not passed.\n\nDo not output a recommended 1X2, qualification, Asian handicap, total, BTTS, or score pick in this mode. Diagnostic probabilities may be shown only when the user explicitly asks for them, and must remain labeled non-actionable.\n\n## Confidence and Safety\n\n- Three independent underlying books are the operational minimum for a full forecast; five are preferred.\n- Near kickoff, no quote within 60 minutes triggers abstention.\n- Ambiguous identity, severe disagreement, malformed markets, duplicated sources, or a started match without an in-play state model triggers abstention.\n- Confidence describes evidence quality, not outcome certainty or value. A likely winner can still offer no demonstrated pricing edge.\n- Never guarantee a result, encourage chasing losses, present betting as income, or place a bet for the user.\n\n## Bundled References\n\n- `references/source-policy.md`\n- `references/consensus-model.md`\n- `references/market-rules.md`\n- `references/odds-formats.md`\n- `references/postmatch-evolution.md`\n\nUse these references before answering when source quality, consensus math, market interpretation, odds conversion, settlement, or evolution matters. Use `scripts/forecast.py` for reproducible probabilities and `scripts/calibrate.py` only on completed JSONL records; source-weight changes remain locked until the distinct-match floors and every promotion gate are met.\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn72thwj42fqymrwn8pas9fwk1833phy\",\n  \"slug\": \"world-cup-2026-predictor\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1783924823237\n}\n\nFile v1.2.0:references/consensus-model.md\n\n# Consensus Model\n\nThis reference defines the reproducible V2 path from timestamped bookmaker quotes to a score model and evidence score. It is an audit contract, not a promise of predictive certainty.\n\n## 1. Normalize and Group\n\nEach quote must include source, underlying bookmaker, market, period, line when applicable, selection, declared odds format, observed timestamp, and snapshot. Convert the price to decimal odds `d`, then raw implied probability `q = 1 / d`.\n\nGroup mutually exclusive selections from the same underlying bookmaker by market, period, canonical line, and snapshot. Opening and current checkpoints never share a group. Deduplicate mirrored aggregator records before any source count or weighting.\n\n## 2. Remove Bookmaker Margin\n\nFor a complete three-way 1X2 market, use power de-vigging. Solve for `k > 0` by bisection so:\n\n`sum(q_i ** k) = 1`\n\nThe fair probabilities are `p_i = q_i ** k`. If the power method cannot converge, record the fallback and use proportional normalization.\n\nFor a complete binary market such as totals or BTTS, use proportional de-vigging:\n\n`p_i = q_i / sum(q_j)`\n\nAn incomplete group is marked unvigged/incomplete, receives at most half completeness weight, and cannot anchor the fit. Never silently synthesize a missing selection.\n\n## 3. Weight and Aggregate\n\nThe starting quote weight is the product of:\n\n- source tier: A `1.25`, B `1.0`, C `0.75`, D `0.0`;\n- recency: under 15 minutes `1.0`, 15-60 `0.9`, 60-180 `0.7`, older current quotes `0.4`;\n- completeness: full for complete de-vigged groups, at most `0.5` for incomplete groups;\n- the engine's market-quality/liquidity factor.\n\nUse the weighted median for each consensus selection rather than a simple mean. Report raw quote count, deduped independent bookmaker count, usable complete books, overround range, consensus probability, and dispersion.\n\n## 4. Outliers and Dispersion\n\nWith at least five usable independent bookmakers, a quote is an exclusion candidate only when it differs from the median by both:\n\n- more than six percentage points; and\n- more than three scaled median absolute deviations.\n\nNever exclude more than 20% of usable books. Preserve every exclusion and reason in diagnostics. When MAD is zero, the absolute six-point condition still prevents trivial differences from becoming outliers. Wide residual dispersion lowers confidence even if no quote is excluded.\n\n## 5. Snapshot Movement\n\nTrack Opening, T-3h10, T-2h10, T-1h10, and T-10min independently. Movement is a change in de-vigged consensus probability and, for Asian markets, the signed line and water. Missing checkpoints remain missing. A one-book move is not consensus movement.\n\nCompare each rolling forecast with its prior record and state:\n\n- what changed;\n- what stayed unchanged;\n- whether the conclusion is retained or revised;\n- the exact price, line, lineup, or news trigger that would flip it.\n\n## 6. Score Fit and Market Separation\n\nFit home and away expected goals over a bounded grid. For independent Poisson rates `lambda_home` and `lambda_away`:\n\n`P(H=h, A=a) = Poisson(h; lambda_home) * Poisson(a; lambda_away)`\n\nMinimize the weighted residual between the score matrix and the no-vig 90-minute consensus for 1X2, totals, and BTTS. Market-family weights reflect usable coverage and dispersion and are capped so correlated derivative markets cannot dominate.\n\nThe fitted matrix must produce coherent 1X2, supplied totals, BTTS, exact-score, and win-margin probabilities. Asian handicap and correct-score prices validate margin/shape; they are not additional winner votes. Qualification remains separate because it can include extra time and penalties.\n\n## 7. Asian and Total Settlement\n\nSettle integer and half lines directly from every score cell. Split quarter lines into equal half-stakes on adjacent lines, for example:\n\n- `-0.75` -> half at `-0.5`, half at `-1.0`;\n- `+0.25` -> half at `0.0`, half at `+0.5`;\n- over `2.25` -> half over `2.0`, half over `2.5`.\n\nReport win, half-win, push, half-loss, and loss probabilities. Preserve home/away sign orientation; never normalize away which team is giving the handicap.\n\n## 8. Evidence Confidence and Abstention\n\nConfidence measures input quality, not certainty of the outcome:\n\n| Component | Maximum |\n| --- | ---: |\n| Independent bookmaker coverage | 25 |\n| Quote freshness | 20 |\n| Trusted core market-family coverage | 20 |\n| Low cross-book dispersion | 15 |\n| Cross-market/score-fit agreement | 15 |\n| Confirmed lineup | 5 |\n\nScores `75-100` are high, `50-74` medium, and below `50` low. Friendly matches receive a 10-point penalty. Qualification-only books and core families supported by only one book do not inflate 90-minute confidence.\n\nThe skill and engine require three independent underlying books for a full forecast and prefer five. Also abstain for stale near-kickoff evidence (no usable quote inside 60 minutes), ambiguous identity, invalid aggregate context, severe disagreement, or a match that has started without a separate in-play state model.\n\nUse `no forecast edge` or `观望` when the gate fails.\n\n## 9. Calibration Lock\n\n`scripts/calibrate.py` reports multiclass Brier score, log loss, top-pick accuracy, totals/BTTS Brier, score error, confidence-bucket calibration, and movement to closing consensus. No source-weight change is eligible before both:\n\n- 100 valid completed forecasts overall; and\n- 30 valid observations in the affected competition/market bucket.\n\nInvalid or internally conflicting records are quarantined atomically and cannot contribute partial metrics. Calibration can justify a later review of weights; it never changes them automatically.\n\nFile v1.2.0:references/market-rules.md\n\n# Market Rules\n\nThese rules apply the V2 cross-market framework to international and club football. Observable prices and movement may reveal the risk a market is protecting; they do not prove manipulation or that a bookmaker knows the result.\n\n## Core Priority\n\n1. Use 90-minute moneyline movement for win/draw/loss direction.\n2. Compare qualification/to-lift market with 90-minute moneyline to detect extra-time or penalty risk.\n3. Use Asian handicap/spread to decide whether a favorite can cover or only win narrowly.\n4. Use totals and BTTS to shape the scoreline.\n5. Explain whether news is confirmed by price movement or just public sentiment.\n6. Use correct score only after market structure is understood.\n\n## Competition Context\n\nConfirm context before interpreting motivation or advancement:\n\n| Match type | Required interpretation |\n| --- | --- |\n| `league_or_group` | Forecast the 90-minute result; table position, goal difference, and draw incentives may matter. Do not invent an advancement probability when no such market applies. |\n| `single_leg_knockout` | Keep 90-minute and qualification markets separate; extra time and penalties create real divergence. |\n| `two_leg_first` | Expect aggregate caution and asymmetric risk. Do not assume the home favorite must chase a large margin. |\n| `two_leg_second` | Require the current aggregate score and tiebreak rules. The side trailing on aggregate may accept early risk; the leading side may protect space even when its 90-minute price is short. |\n| `friendly` | Rotation, substitutions, and motivation are unstable; apply the confidence penalty and avoid strong edge language. |\n\nIf match type is unknown, calculate market consensus only. Do not infer advancement or tactical incentives.\n\n## Favorite Movement\n\n| Signal | Read |\n| --- | --- |\n| Favorite shortens and handicap also strengthens | Favorite direction is credible; cover becomes more plausible. |\n| Favorite shortens but handicap does not follow | Favorite may win, but narrow win is more likely than a blowout. |\n| Favorite drifts near kickoff | Warning signal; protect draw, underdog +0.5, or upset. |\n| Favorite drifts while totals stay high | Underdog scoring threat rises; protect 1-1, 1-2, 2-2. |\n| Favorite qualification price is strong but 90-minute price is weak | Favorite may advance after draw/extra time; protect 90-minute draw. |\n\n## Asian Handicap Cross-Check\n\nAsian handicap answers \"can the team cover the line?\", not just \"will the team win?\"\n\n| Combined signal | Read |\n| --- | --- |\n| 1X2 favorite shortens and Asian line moves from -1.0 to -1.25/-1.5 | Favorite win and cover are both being confirmed. |\n| 1X2 favorite shortens but Asian line stays flat or weakens | Favorite may win, but narrow win/failed cover is live. |\n| Favorite Asian line weakens from -1.5 to -1.25/-1.0 | Market is protecting the underdog; reduce blowout confidence. |\n| Favorite line deepens but favorite water gets much higher | Book is asking for favorite backers at a better payout; treat cover as unconfirmed. |\n| Underdog + handicap water keeps dropping | Underdog protection is real; protect one-goal favorite win, draw, or upset. |\n| Moneyline and Asian handicap disagree | Prefer split conclusion: ML/advance for winner, Asian handicap for margin risk. |\n\n## Big Favorite Pattern\n\nBig favorites often win, but the spread and over can fail in knockout matches.\n\n- If favorite is very short and opponent sits deep, prefer 1-0 or 2-0 over automatic 3-0/4-0.\n- If favorite ML is very short but Asian handicap does not deepen, do not infer a blowout from ML alone.\n- If favorite leads early and tempo-control incentives are high, reduce cover confidence.\n- If the favorite's defense has shown leaks and BTTS/over shortens, 2-1 or 3-1 becomes more plausible than 2-0.\n\n## Medium Favorite Pattern\n\nMedium favorites are often where 2-1, 1-1, and extra time live.\n\n| Market shape | Score tendency |\n| --- | --- |\n| Favorite around modest moneyline favorite, BTTS yes firm | 2-1 or 1-1. |\n| Favorite price strong but handicap weak | 1-goal favorite win or 1-1. |\n| Qualification favorite, 90-minute market close | 1-1, 0-0, extra time/penalties. |\n| Over 2.5 near even and both teams have transition threats | 2-1, 2-2, 3-2. |\n\n## Small Favorite / Coin-Flip Pattern\n\n- Do not lean on team reputation alone.\n- If draw price shortens and under is firm, make 0-0 or 1-1 a main scenario.\n- If one side's qualification price is favored but 90-minute ML is close, separate \"advance\" from \"win in 90\".\n- In strong-versus-strong matches, small favorite plus under often points to 1-0, 1-1, or 0-0.\n\n## Totals and BTTS\n\n| Signal | Read |\n| --- | --- |\n| Over 2.5 shortens steadily | Prefer 2-1, 2-2, 3-1, 3-2; avoid 1-0 as main score. |\n| Under 2.5 shortens steadily | Prefer 1-0, 0-0, 1-1, 2-0. |\n| Under shortens and BTTS Yes also shortens | 1-1 is the central score. |\n| Under shortens and BTTS No shortens | 1-0, 2-0, 0-0 are central. |\n| Over stays high while favorite drifts | Upset with goals or both teams scoring becomes more plausible. |\n\nRelated derivative markets are consistency checks, not extra independent votes. DNB, double chance, team totals, BTTS, and correct score often reuse the same underlying information, so cap each market family's influence.\n\n## News Filter\n\nClassify every news item:\n\n- **Hard signal**: confirmed starting XI, major injury, suspension, formation change, goalkeeper change, extreme weather, rest/travel disadvantage.\n- **Public/emotional signal**: star return hype, host-country narrative, media pressure, brand-name team reputation, revenge story.\n\nNews is trustworthy only when the relevant market confirms it. If public news moves ML but handicap and totals do not confirm, mark it as possible sentiment trap.\n\n## Final Forecast Template\n\nProduce in the user's language. Use English labels for English users and Chinese labels for Chinese users. The required content is:\n\n- 90-minute / 90 分钟: favorite/draw/underdog with confidence.\n- Advancement / 晋级: who advances and whether extra time is live.\n- Asian handicap / 亚盘: whether the favorite can cover or underdog protection is better.\n- Totals / 大小球: over/under lean.\n- BTTS / 双方进球: yes/no lean.\n- Score ladder / 比分阶梯: main score, defensive score, chaos/upset score.\n- Flip triggers / 反转条件: exact market/news moves that would change the call.\n\nFile v1.2.0:references/odds-formats.md\n\n# Odds Formats\n\nAlways identify the format before reading the market. The same number can mean different things across books.\n\n## Ambiguity Rejection\n\n- Every quote must declare its odds format. Never infer the format from the number, bookmaker region, sign, or surrounding prose.\n- Reject ambiguous inputs such as bare `0.85`, `-0.85`, or `1.20`; each could mean a different return under decimal, Hong Kong, Malay, Indo, or handicap notation.\n- Keep the Asian handicap line separate from its water price. For example, `home -0.75 @ 0.92 HK` contains a signed handicap and a Hong Kong price; neither may replace the other.\n- Reject decimal odds at or below `1.0`, zero American odds, malformed fractional odds, and values outside the declared format's valid domain.\n- If a screenshot or source does not label the format, report it as unavailable until corroborated. Do not guess and do not feed it into consensus.\n\n## Main Markets\n\n| Market | What it answers | Use |\n| --- | --- | --- |\n| European decimal 1X2 | Home/draw/away in 90 minutes | Convert to implied probability; compare with moneyline. |\n| US moneyline | Team/draw price in 90 minutes | Convert to implied probability; useful on US sites. |\n| Qualification/to-lift | Who advances or wins tie/tournament | Separate from 90-minute result; reveals extra-time/penalty risk. |\n| Asian handicap | Margin and protection line | Do not treat as winner market; use to judge cover and underdog protection. |\n| Totals | Total goals line | Score-shape input. |\n| BTTS | Whether both teams score | Score-shape input, especially 1-1 vs 2-0. |\n\n## Conversion Quick Reference\n\nUse approximate implied probability before comparing prices:\n\n| Format | Example | Conversion |\n| --- | --- | --- |\n| Decimal/European | 1.80 | `1 / 1.80 = 55.6%` |\n| Fractional | 4/5 | decimal `1.80`, probability `55.6%` |\n| American negative | -150 | `150 / (150 + 100) = 60.0%` |\n| American positive | +240 | `100 / (240 + 100) = 29.4%` |\n| Hong Kong water | 0.92 | decimal `1.92`, probability `1 / 1.92 = 52.1%` |\n| Malay positive | 0.85 | decimal `1.85`, probability `54.1%` |\n| Malay negative | -0.85 | probability `0.85 / 1.85 = 45.9%` |\n| Indo positive | 1.20 | decimal `2.20`, probability `45.5%` |\n| Indo negative | -1.20 | probability `1.20 / 2.20 = 54.5%` |\n\nThese raw probabilities include bookmaker margin. De-vig each complete bookmaker market before comparing it with another book or fitting the score model.\n\n## Asian Handicap Reading\n\nFor favorites, more negative lines are stronger:\n\n- `-1.0 -> -1.25 -> -1.5` means the favorite cover expectation is strengthening.\n- `-1.5 -> -1.25 -> -1.0` means the market is protecting the underdog or doubting the blowout.\n- If the line strengthens but favorite water rises sharply, cover is not fully confirmed.\n- If the favorite ML strengthens while Asian handicap weakens, split the call: favorite can win, but the handicap may fail.\n\nFor underdogs, more positive protection or falling underdog water is meaningful:\n\n- `+1.5` with falling water suggests the book expects the underdog to stay within the number.\n- In knockout matches, underdog protection plus under 2.5 often points to `1-0`, `1-1`, or `2-0`, not a runaway favorite score.\n\nFile v1.2.0:references/postmatch-evolution.md\n\n# Post-Match Review And Controlled Evolution\n\nUse this reference after a match, when scheduling a result check, or when evaluating a model challenger. The active model changes only after repeated, independently validated evidence.\n\n## Data Directory\n\nRuntime data is separate from the installed skill. Resolution order is:\n\n1. `--data-dir`\n2. `FOOTBALL_FORECASTER_DATA_DIR`\n3. `~/.football-forecaster`\n\nThe directory may contain:\n\n| Path | Purpose |\n| --- | --- |\n| `forecasts.jsonl` | Immutable forecast snapshots. |\n| `completed.jsonl` | Idempotent settled review records. |\n| `profiles/*.json` | Versioned promoted profiles with bound evidence. |\n| `active-profile.json` | Atomic pointer to the champion and its parent. |\n| `evolution/candidates.json` | Candidate parameters and selected challenger. |\n| `evolution/evaluation.json` | Samples, chronological split, and holdout metrics. |\n| `evolution/decision.json` | Passed and failed promotion gates. |\n\nDo not store runtime ledgers inside the skill folder. An upgrade may replace installed package files.\n\n## Verified Result Contract\n\nA final result needs either one official source or two reputable, independent sources that agree. Record source name, URL, and observation time. Do not finalize a postponed, abandoned, suspended, live, or conflicting result.\n\nKeep each scope explicit:\n\n```json\n{\n  \"status\": \"final\",\n  \"event_id\": \"event-id\",\n  \"score_90m\": {\"home\": 1, \"away\": 1},\n  \"score_after_extra_time\": {\"home\": 3, \"away\": 1},\n  \"penalties\": null,\n  \"qualified\": \"Home Team\",\n  \"sources\": [{\"name\": \"Official\", \"official\": true, \"observed_at\": \"2026-07-13T06:00:00+00:00\", \"url\": \"https://example.test/result\"}]\n}\n```\n\n`score_90m` settles 1X2, Asian handicap, totals, BTTS, and exact score. Qualification uses the declared advancement result. Never substitute an after-extra-time score for a missing 90-minute score.\n\n## Review Workflow\n\n1. Load the archived forecast snapshot, including `raw_match`, `as_of`, `event_id`, and `input_fingerprint`.\n2. Verify the final result and periods.\n3. Run `postmatch_review.py` with `--language en` or `--language zh`.\n4. Report right, wrong, push/unsettled, closing movement, cause evidence, calibration impact, and evolution status.\n5. Append the completed record idempotently.\n6. Schedule retries rather than guessing when the result is not final.\n\nCause tags require evidence. The final score alone cannot prove lineup impact, news impact, market manipulation, or model error. A correct prediction receives the same audit as an incorrect one.\n\n## Post-Match Timing\n\n`postmatch_alerts.py` uses absolute-time arithmetic:\n\n| Match type | First check |\n| --- | --- |\n| League, group, friendly | Kickoff +135 minutes |\n| Single-leg or two-leg knockout | Kickoff +165 minutes |\n\nIf the result is not final, retry every 15 minutes at most four times. The generated prompt must invoke `$world-cup-2026-predictor`, use verified sources, preserve result periods, run the review script, and answer in the user's language.\n\n## Independent Samples\n\nOne event is one independent sample. T-3h10, T-2h10, T-1h10, and T-10min snapshots remain useful diagnostics, but they do not count as four matches. The latest valid pre-kickoff snapshot is the primary evolution record.\n\nRecords are invalid for evolution when replay input is missing or changed, `as_of` is missing or not before kickoff, result settlement is invalid, metrics are non-finite, or source evidence is quarantined.\n\n## Champion-Challenger Procedure\n\n1. Require 100 valid distinct completed matches overall.\n2. Require 30 holdout matches in each affected eligible bucket.\n3. Group every snapshot for an event into the same chronological fold.\n4. Select from deterministic one-coordinate `-5%` and `+5%` candidates on older records.\n5. Replay the champion and selected challenger on the newest 30 distinct matches.\n6. Promote only if every gate passes.\n\nThe gates are:\n\n| Gate | Requirement |\n| --- | --- |\n| 1X2 Brier | At least 1% relative improvement. |\n| 1X2 log loss | No regression. |\n| Totals and BTTS | No regression when each market has at least 30 observations. |\n| Eligible bucket Brier | No more than 2% regression. |\n| Calibration error | No more than 0.005 regression. |\n| Integrity | No conflicts, malformed metrics, changed replay input, or stale lineage. |\n\nTier D stays at zero. Structural rules such as de-vigging, deduplication, period separation, and source minimums are not tunable.\n\n## Profile Activation And Rollback\n\nAn `evaluate` run is deterministic and does not create a versioned profile. A successful `promote` run writes candidate, evaluation, and decision audits before atomically changing `active-profile.json`.\n\nThe promoted artifact binds its parent, creation time, training cutoff, training and holdout record ids, metrics, one-coordinate parameter diff, promotion decision, and SHA-256 evidence fingerprint. Tampered evidence, path traversal, conflicting profile ids, stale parents, and concurrent activation fail closed.\n\nRollback changes only the active pointer; it does not delete a profile. The automatic rollback rule requires at least 30 new distinct matches and regression in both Brier score and log loss. `--mode rollback` remains an explicit operator recovery action.\n\n## Bilingual Status\n\nKeep state ids stable for automation and localize their explanations:\n\n| State | English | 中文 |\n| --- | --- | --- |\n| `model_unchanged` | Model unchanged | 模型不变 |\n| `challenger_pending` | Challenger pending | 挑战模型待验证 |\n| `champion_promoted` | Champion promoted | 冠军模型已晋升 |\n| `champion_rolled_back` | Champion rolled back | 冠军模型已回滚 |\n\nAlways preserve probability language. No review, calibration score, promotion, or rollback guarantees the next result or any profit.\n\nFile v1.2.0:references/source-policy.md\n\n# Source Policy\n\nThis policy defines which sources can enter numeric consensus and how they are counted.\n\n## Tiers\n\n| Tier | Source type | Use |\n| --- | --- | --- |\n| A | Exchange or high-liquidity reference bookmaker with timestamped prices | Full numeric input |\n| B | Mainstream sportsbook with timestamped prices | Full numeric input |\n| C | Odds aggregator that exposes the underlying bookmaker and update time | Numeric input only after dedupe |\n| D | Tip site, preview, social post, unattributed odds, or commentary | Context only; never numeric consensus |\n\nTip sites are excluded from consensus because they are not prices and do not provide independent market truth.\n\n## Deduplication\n\n- Count the underlying bookmaker, not the page that displays it.\n- If the same bookmaker appears on multiple aggregators, count it once.\n- Deduplicate by bookmaker, market, line, selection, and time bucket.\n- Do not treat mirrored feeds, affiliate mirrors, or copied tables as new books.\n\n## Freshness\n\n- Use recency weight `1.0` for quotes under 15 minutes old, `0.9` for 15-60 minutes, `0.7` for 60-180 minutes, and `0.4` for older non-opening quotes.\n- Quote freshness must always be shown with an explicit timestamp.\n- Opening lines remain a separate snapshot and are never silently mixed into the current consensus.\n- Stale quotes may be reported, but their age must be stated and their weight reduced.\n- Near kickoff, a forecast with no usable quote inside 60 minutes must abstain.\n\n## Source Counts\n\n- Minimum usable independent bookmakers: three.\n- Preferred independent bookmakers: five or more.\n- If fewer than three independent books remain after dedupe, abstain from a market edge. A diagnostic or tactical summary may still be given if it is clearly labeled non-betting analysis.\n- Report both raw source count and deduped bookmaker count.\n\n## Starting Weights\n\n- Tier A: `1.25`.\n- Tier B: `1.0`.\n- Tier C: `0.75` after underlying-bookmaker deduplication.\n- Tier D: `0.0` for numeric consensus.\n- A complete de-vigged market receives full completeness weight. An incomplete market receives at most half weight and cannot anchor the forecast.\n\nThese are transparent starting assumptions, not permanent claims about bookmaker quality. Change them only after at least 100 completed forecasts overall and 30 in the affected competition/market bucket.\n\n## Unavailable Data\n\n- Never invent missing prices or timestamps.\n- If a book, market, or checkpoint is unavailable, say it is unavailable.\n- If a requested checkpoint has no quote, do not relabel a nearby quote as that checkpoint.\n- If only one market family is available, state that the forecast is partial.\n\n## Current Consensus Inputs\n\nOnly these sources can move the numeric consensus:\n\n- current bookmaker prices;\n- underlying bookmaker prices reached through an aggregator;\n- exchange/reference prices with timestamps.\n\nEverything else is diagnostic or narrative support.\n\n## Minimum Reporting Fields\n\nEvery usable quote should carry:\n\n- source name;\n- underlying bookmaker;\n- market type;\n- selection and line;\n- odds format;\n- quoted odds;\n- timestamp with timezone;\n- whether it belongs to opening or one of the comparison checkpoints.\n\nFile v1.2.0:skill-card.md\n\n## Description:\n\nBilingual football forecasting skill for pre-kickoff alerts, post-match review, and controlled model evolution from multi-book odds, market movement, Asian handicap, totals, BTTS, exact score, qualification, lineup, and news evidence.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[youjunzhao](https://clawhub.ai/user/youjunzhao)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and agents use this skill to produce disciplined English or Chinese football match forecasts, rolling pre-kickoff updates, and post-match reviews from timestamped market and news evidence. It also supports local calibration and controlled profile evolution after sufficient verified completed matches.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Football forecasts can be mistaken or interpreted as certainty.\n\nMitigation: Present probabilities as evidence-quality assessments, avoid guarantees or profit claims, and abstain when source coverage, freshness, or match context is insufficient.\n\nRisk: Forecast and review commands can create local ledgers that mix match inputs with other local data.\n\nMitigation: Use a dedicated data directory for this skill, or use no-record options when local forecast or review records should not be written.\n\nRisk: Promotion or rollback commands can change the local active model profile.\n\nMitigation: Run promote or rollback only as an intentional operator action after reviewing the completed-match evidence, metrics, and profile audit records.\n\nRisk: Ambiguous odds formats, duplicated aggregator data, stale prices, or insufficient independent bookmakers can produce misleading forecasts.\n\nMitigation: Require declared odds formats, timestamps, underlying bookmaker identity, source deduplication, and the minimum independent-bookmaker threshold before treating a forecast as actionable.\n\n## Reference(s):\n\n- [Consensus Model](references/consensus-model.md)\n- [Market Rules](references/market-rules.md)\n- [Odds Formats](references/odds-formats.md)\n- [Post-Match Review And Controlled Evolution](references/postmatch-evolution.md)\n- [Source Policy](references/source-policy.md)\n- [ClawHub Skill Page](https://clawhub.ai/youjunzhao/skills/world-cup-2026-predictor)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, json, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown analysis with optional JSON outputs from bundled Python scripts]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Matches the user's language, labels non-actionable forecasts, and may write local JSONL forecast or review records unless disabled with no-record options.]\n\n## Skill Version(s):\n\n1.2.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.2.0:examples/completed-match.json\n\n{\n  \"schema_version\": \"1.0\",\n  \"status\": \"final\",\n  \"event_id\": \"event-425f7518b27c3f6742c6bfc5\",\n  \"score_90m\": {\n    \"home\": 1,\n    \"away\": 1\n  },\n  \"score_after_extra_time\": {\n    \"home\": 3,\n    \"away\": 1\n  },\n  \"qualified\": \"Argentina\",\n  \"sources\": [\n    {\n      \"name\": \"Official competition result\",\n      \"official\": true,\n      \"observed_at\": \"2026-07-19T22:45:00+00:00\",\n      \"url\": \"https://example.test/matches/argentina-netherlands\"\n    }\n  ]\n}\n\nFile v1.2.0:examples/forecast-snapshot.json\n\n{\"actionable_forecast\":true,\"alert_offset\":\"T-10min\",\"as_of\":\"2026-07-19T19:52:00+00:00\",\"competition\":null,\"confidence\":{\"abstain\":false,\"abstain_reasons\":[],\"components\":{\"agreement\":15,\"dispersion\":15,\"freshness\":20,\"independent_books\":25,\"lineup\":5,\"market_families\":12},\"context_errors\":[],\"context_limitations\":[],\"label\":\"high\",\"match_type\":\"single_leg_knockout\",\"penalties\":{},\"score\":92,\"score_before_penalties\":92},\"cross_market_conflicts\":[],\"engine_version\":\"2.1.0\",\"event_id\":\"event-425f7518b27c3f6742c6bfc5\",\"expected_goals\":{\"away\":0.85,\"home\":1.75},\"forecast_id\":\"forecast-e8e10b16aaf394eb015ec32d\",\"forecast_status\":\"forecast\",\"input_fingerprint\":\"8ec4ded78c2bad6a420576cc6c36b0d25c89cd99ba540d4e1143879494cbe21b\",\"kickoff\":\"2026-07-19T20:00:00+00:00\",\"markets\":{\"1x2\":{\"period\":\"90m\",\"pick\":\"home\",\"probabilities\":{\"away\":0.17960584807001,\"draw\":0.23330254454266638,\"home\":0.5870916073873234}},\"asian_handicap\":[{\"away_line\":1.0,\"home_line\":-1.0,\"independent_books\":2,\"line\":1.0,\"market_probabilities\":{\"away\":0.5129533678756477,\"home\":0.48704663212435234},\"model_probabilities\":{\"away\":0.5533635520338135,\"home\":0.44663644796618646},\"period\":\"90m\",\"pick\":\"away\",\"settlement\":{\"away\":{\"half_loss\":0.0,\"half_win\":0.0,\"loss\":0.33327084361473147,\"push\":0.25382076377259233,\"win\":0.4129083926126765},\"home\":{\"half_loss\":0.0,\"half_win\":0.0,\"loss\":0.4129083926126765,\"push\":0.25382076377259233,\"win\":0.33327084361473147}},\"snapshot\":\"current\"}],\"btts\":{\"period\":\"90m\",\"pick\":\"no\",\"probabilities\":{\"no\":0.5269155364297182,\"yes\":0.4730844635702819}},\"correct_score\":{\"displayed\":[{\"away_goals\":0,\"home_goals\":1,\"probability\":0.1299790737654387,\"score\":\"1-0\"},{\"away_goals\":0,\"home_goals\":2,\"probability\":0.11373168954475886,\"score\":\"2-0\"},{\"away_goals\":1,\"home_goals\":1,\"probability\":0.1104822127006229,\"score\":\"1-1\"},{\"away_goals\":1,\"home_goals\":2,\"probability\":0.09667193611304503,\"score\":\"2-1\"},{\"away_goals\":0,\"home_goals\":0,\"probability\":0.07427375643739355,\"score\":\"0-0\"}],\"period\":\"90m\"},\"qualification\":{\"favorite\":\"Argentina\",\"independent_books\":3,\"period\":\"qualification\",\"probabilities\":{\"Argentina\":0.6308068459657702,\"Netherlands\":0.36919315403422975},\"snapshot\":\"current\"},\"totals\":[{\"independent_books\":3,\"line\":2.5,\"market_probabilities\":{\"over\":0.49350649350649356,\"under\":0.5064935064935064},\"model_probabilities\":{\"over\":0.4815691800669931,\"under\":0.5184308199330068},\"period\":\"90m\",\"pick\":\"under\",\"settlement\":{\"over\":{\"half_loss\":0.0,\"half_win\":0.0,\"loss\":0.518430819933007,\"push\":0.0,\"win\":0.48156918006699334},\"under\":{\"half_loss\":0.0,\"half_win\":0.0,\"loss\":0.48156918006699334,\"push\":0.0,\"win\":0.518430819933007}},\"snapshot\":\"current\"}]},\"match\":\"Argentina vs Netherlands\",\"match_type\":\"single_leg_knockout\",\"probabilities_90m\":{\"away\":0.17960584807001,\"draw\":0.23330254454266638,\"home\":0.5870916073873234},\"profile\":{\"confidence_thresholds\":{\"high\":75.0,\"medium\":50.0},\"cross_market_conflict_penalty\":0.0,\"fit_family_caps\":{\"1x2\":1.0,\"btts\":0.5,\"totals\":0.75},\"parent_id\":null,\"profile_id\":\"v2-default\",\"recency_weights\":{\"0_15\":1.0,\"15_60\":0.9,\"60_180\":0.7,\"older\":0.4},\"schema_version\":\"1.0\",\"source_weights\":{\"A\":1.25,\"B\":1.0,\"C\":0.75,\"D\":0.0}},\"profile_fingerprint\":\"df17bf1b367e965177b8b9c9ecbff217abd8041ac42c5078d4c1f5d1c191af6a\",\"profile_id\":\"v2-default\",\"raw_match\":{\"kickoff\":\"2026-07-19T20:00:00+00:00\",\"lineup_confirmed\":true,\"match\":\"Argentina vs Netherlands\",\"match_type\":\"single_leg_knockout\",\"news\":[{\"category\":\"confirmed\",\"headline\":\"Official lineups announced\",\"observed_at\":\"2026-07-19T19:05:00+00:00\"},{\"category\":\"credible_unconfirmed\",\"headline\":\"Respected reporter says the Dutch full-back trained separately yesterday\",\"observed_at\":\"2026-07-19T15:30:00+00:00\"},{\"category\":\"narrative\",\"headline\":\"Social media expects a chaotic match\",\"observed_at\":\"2026-07-19T14:00:00+00:00\"}],\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"quotes\":[{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:00:00+00:00\",\"odds\":\"1.78\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:00:00+00:00\",\"odds\":\"3.75\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:00:00+00:00\",\"odds\":\"5.20\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:03:00+00:00\",\"odds\":\"1.80\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:03:00+00:00\",\"odds\":\"3.70\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:03:00+00:00\",\"odds\":\"5.10\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:05:00+00:00\",\"odds\":\"1.79\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:05:00+00:00\",\"odds\":\"3.72\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:05:00+00:00\",\"odds\":\"5.15\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:08:00+00:00\",\"odds\":\"1.77\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:08:00+00:00\",\"odds\":\"3.76\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:08:00+00:00\",\"odds\":\"5.25\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:10:00+00:00\",\"odds\":\"1.81\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:10:00+00:00\",\"odds\":\"3.68\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-18T12:10:00+00:00\",\"odds\":\"5.05\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:50:00+00:00\",\"odds\":\"1.72\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:50:00+00:00\",\"odds\":\"3.82\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:50:00+00:00\",\"odds\":\"5.45\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:51:00+00:00\",\"odds\":\"1.73\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:51:00+00:00\",\"odds\":\"3.80\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:51:00+00:00\",\"odds\":\"5.40\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:52:00+00:00\",\"odds\":\"1.71\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:52:00+00:00\",\"odds\":\"3.84\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:52:00+00:00\",\"odds\":\"5.50\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:53:00+00:00\",\"odds\":\"1.74\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:53:00+00:00\",\"odds\":\"3.79\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:53:00+00:00\",\"odds\":\"5.35\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:54:00+00:00\",\"odds\":\"1.75\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:54:00+00:00\",\"odds\":\"3.77\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T18:54:00+00:00\",\"odds\":\"5.30\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-1h10\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:50:00+00:00\",\"odds\":\"1.69\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:50:00+00:00\",\"odds\":\"3.90\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:50:00+00:00\",\"odds\":\"5.70\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:50:30+00:00\",\"odds\":\"1.68\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:50:30+00:00\",\"odds\":\"3.88\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:50:30+00:00\",\"odds\":\"5.80\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:00+00:00\",\"odds\":\"1.70\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:00+00:00\",\"odds\":\"3.86\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:00+00:00\",\"odds\":\"5.65\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:30+00:00\",\"odds\":\"1.71\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:30+00:00\",\"odds\":\"3.84\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:30+00:00\",\"odds\":\"5.60\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:45+00:00\",\"odds\":\"1.72\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:45+00:00\",\"odds\":\"3.82\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:51:45+00:00\",\"odds\":\"5.55\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"t-10min\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"1.68\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"3.92\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"5.80\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"1.69\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"3.89\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"5.75\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"1.70\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"3.87\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"5.70\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:30+00:00\",\"odds\":\"1.71\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:30+00:00\",\"odds\":\"3.84\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book D\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:30+00:00\",\"odds\":\"5.68\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:40+00:00\",\"odds\":\"1.72\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:40+00:00\",\"odds\":\"3.83\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"draw\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book E\",\"market\":\"1x2\",\"observed_at\":\"2026-07-19T19:52:40+00:00\",\"odds\":\"5.60\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"C\"},{\"bookmaker\":\"Book A\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-18T12:15:00+00:00\",\"odds\":\"1.95\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"over\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-18T12:15:00+00:00\",\"odds\":\"1.90\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"under\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-18T12:16:00+00:00\",\"odds\":\"1.94\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"over\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-18T12:16:00+00:00\",\"odds\":\"1.91\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"under\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-18T12:17:00+00:00\",\"odds\":\"1.95\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"over\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-18T12:17:00+00:00\",\"odds\":\"1.90\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"under\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book A\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"1.95\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"over\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"1.90\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"under\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"1.94\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"over\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"1.91\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"under\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"1.95\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"over\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"line\":\"2.5\",\"market\":\"totals\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"1.90\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"under\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book A\",\"market\":\"btts\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"2.02\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"yes\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"btts\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"1.80\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"no\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"market\":\"btts\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"2.00\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"yes\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"btts\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"1.82\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"no\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"btts\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"2.04\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"yes\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"btts\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"1.79\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"no\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book A\",\"line\":\"-0.75\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-18T12:20:00+00:00\",\"odds\":\"1.97\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"line\":\"0.75\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-18T12:20:00+00:00\",\"odds\":\"1.89\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"line\":\"-0.75\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-18T12:21:00+00:00\",\"odds\":\"1.96\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"line\":\"0.75\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-18T12:21:00+00:00\",\"odds\":\"1.90\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"opening\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book A\",\"line\":\"-1.0\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"1.98\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"line\":\"1.0\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"1.88\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"line\":\"-1.0\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"1.96\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"home\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"line\":\"1.0\",\"market\":\"asian_handicap\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"1.90\",\"odds_format\":\"decimal\",\"period\":\"90m\",\"selection\":\"away\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book A\",\"market\":\"to_qualify\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"1.50\",\"odds_format\":\"decimal\",\"period\":\"qualification\",\"selection\":\"Argentina\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book A\",\"market\":\"to_qualify\",\"observed_at\":\"2026-07-19T19:52:00+00:00\",\"odds\":\"2.62\",\"odds_format\":\"decimal\",\"period\":\"qualification\",\"selection\":\"Netherlands\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"A\"},{\"bookmaker\":\"Book B\",\"market\":\"to_qualify\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"1.52\",\"odds_format\":\"decimal\",\"period\":\"qualification\",\"selection\":\"Argentina\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book B\",\"market\":\"to_qualify\",\"observed_at\":\"2026-07-19T19:52:10+00:00\",\"odds\":\"2.56\",\"odds_format\":\"decimal\",\"period\":\"qualification\",\"selection\":\"Netherlands\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"to_qualify\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"1.51\",\"odds_format\":\"decimal\",\"period\":\"qualification\",\"selection\":\"Argentina\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"},{\"bookmaker\":\"Book C\",\"market\":\"to_qualify\",\"observed_at\":\"2026-07-19T19:52:20+00:00\",\"odds\":\"2.58\",\"odds_format\":\"decimal\",\"period\":\"qualification\",\"selection\":\"Netherlands\",\"snapshot\":\"current\",\"source\":\"direct\",\"source_tier\":\"B\"}],\"teams\":[\"Argentina\",\"Netherlands\"]},\"schema_version\":\"1.0\",\"score_distribution_90m\":{\"0-0\":0.07427375643739355,\"0-1\":0.06313269297178452,\"0-10\":4.029596989847818e-09,\"0-2\":0.026831394513008415,\"0-3\":0.007602228445352383,\"0-4\":0.0016154735446373815,\"0-5\":0.0002746305025883548,\"0-6\":3.8905987866683604e-05,\"0-7\":4.724298526668723e-06,\"0-8\":5.019567184585519e-07,\"0-9\":4.7407023409974336e-08,\"1-0\":0.1299790737654387,\"1-1\":0.1104822127006229,\"1-10\":7.051794732233682e-09,\"1-2\":0.04695494039776473,\"1-3\":0.013303899779366671,\"1-4\":0.0028270787031154177,\"1-5\":0.00048060337952962097,\"1-6\":6.808547876669631e-05,\"1-7\":8.267522421670266e-06,\"1-8\":8.784242573024659e-07,\"1-9\":8.29622909674551e-08,\"10-0\":5.513823285677366e-06,\"10-1\":4.686749792825761e-06,\"10-10\":2.9914315338617095e-13,\"10-2\":1.9918686619509483e-06,\"10-3\":5.643627875527686e-07,\"10-4\":1.1992709235496335e-07,\"10-5\":2.0387605700343765e-08,\"10-6\":2.8882441408820336e-09,\"10-7\":3.507153599642469e-10,\"10-8\":3.726350699620124e-11,\"10-9\":3.519331216307894e-12,\"2-0\":0.11373168954475886,\"2-1\":0.09667193611304503,\"2-10\":6.170320390704471e-09,\"2-2\":0.041085572848044136,\"2-3\":0.011640912306945837,\"2-4\":0.0024736938652259906,\"2-5\":0.00042052795708841836,\"2-6\":5.9574793920859273e-05,\"2-7\":7.234082118961482e-06,\"2-8\":7.686212251396576e-07,\"2-9\":7.25920045965232e-08,\"3-0\":0.066343485567776,\"3-1\":0.0563919627326096,\"3-10\":3.599353561244275e-09,\"3-2\":0.02396658416135908,\"3-3\":0.006790532179051738,\"3-4\":0.0014429880880484946,\"3-5\":0.00024530797496824405,\"3-6\":3.475196312050124e-05,\"3-7\":4.2198812360608646e-06,\"3-8\":4.4836238133146695e-07,\"3-9\":4.234533601463854e-08,\"4-0\":0.029025274935902002,\"4-1\":0.0246714836955167,\"4-10\":1.5747171830443704e-09,\"4-2\":0.010485380570594598,\"4-3\":0.0029708578283351357,\"4-4\":0.0006313072885212164,\"4-5\":0.00010732223904860677,\"4-6\":1.5203983865219294e-05,\"4-7\":1.8461980407766283e-06,\"4-8\":1.961585418325168e-07,\"4-9\":1.8526084506404362e-08,\"5-0\":0.0101588462275657,\"5-1\":0.008635019293430845,\"5-10\":5.511510140655296e-10,\"5-2\":0.0036698831997081086,\"5-3\":0.0010398002399172972,\"5-4\":0.00022095755098242568,\"5-5\":3.756278366701236e-05,\"5-6\":5.321394352826752e-06,\"5-7\":6.461693142718198e-07,\"5-8\":6.865548964138087e-08,\"5-9\":6.484129577241525e-09,\"6-0\":0.0029629968163733295,\"6-1\":0.00251854729391733,\"6-10\":1.6075237910244614e-10,\"6-2\":0.0010703825999148651,\"6-3\":0.00030327506997587843,\"6-4\":6.444595236987418e-05,\"6-5\":1.0955811902878608e-05,\"6-6\":1.552073352907803e-06,\"6-7\":1.8846604999594746e-07,\"6-8\":2.0024517812069423e-08,\"6-9\":1.8912044600287783e-09,\"7-0\":0.0007407492040933324,\"7-1\":0.0006296368234793325,\"7-10\":4.0188094775611534e-11,\"7-2\":0.0002675956499787163,\"7-3\":7.581876749396961e-05,\"7-4\":1.6111488092468544e-05,\"7-5\":2.738952975719652e-06,\"7-6\":3.8801833822695073e-07,\"7-7\":4.7116512498986865e-08,\"7-8\":5.006129453017356e-09,\"7-9\":4.728011150071946e-10,\"8-0\":0.00016203888839541643,\"8-1\":0.00013773305513610398,\"8-10\":8.791145732165023e-12,\"8-2\":5.8536548432844186e-05,\"8-3\":1.658535538930585e-05,\"8-4\":3.5243880202274934e-06,\"8-5\":5.991459634386738e-07,\"8-6\":8.487901148714546e-08,\"8-7\":1.0306737109153375e-08,\"8-8\":1.0950908178475465e-09,\"8-9\":1.0342524390782381e-10,\"9-0\":3.1507561632442086e-05,\"9-1\":2.6781427387575776e-05,\"9-10\":1.7093894479209768e-12,\"9-2\":1.1382106639719704e-05,\"9-3\":3.2249302145872487e-06,\"9-4\":6.852976705997904e-07,\"9-5\":1.1650060400196436e-07,\"9-6\":1.650425223361162e-08,\"9-7\":2.004087771224268e-09,\"9-8\":2.129343256925785e-10,\"9-9\":2.0110464093187966e-11},\"score_ladder\":[{\"label\":\"low-score\",\"probability\":0.1299790737654387,\"score\":\"1-0\"},{\"label\":\"central\",\"probability\":0.1104822127006229,\"score\":\"1-1\"},{\"label\":\"high-variance\",\"probability\":0.11373168954475886,\"score\":\"2-0\"}],\"source_coverage\":{\"confidence_market_families\":3,\"confidence_market_family_names\":[\"1x2\",\"btts\",\"totals\"],\"core_90m_books_by_family\":{\"1x2\":[\"Book A\",\"Book B\",\"Book C\",\"Book D\",\"Book E\"],\"btts\":[\"Book A\",\"Book B\",\"Book C\"],\"totals\":[\"Book A\",\"Book B\",\"Book C\"]},\"deduped_quotes\":92,\"freshest_age_minutes\":0.0,\"independent_books\":5,\"market_families\":5,\"qualification_books\":[\"Book A\",\"Book B\",\"Book C\"],\"qualification_independent_books\":3,\"raw_quotes\":92},\"teams\":[\"Argentina\",\"Netherlands\"]}\n\nFile v1.2.0:examples/legacy-match.json\n\n{\n  \"matches\": [\n    {\n      \"teams\": [\"Argentina\", \"Netherlands\"],\n      \"kickoff\": \"2026-07-19T20:00:00Z\",\n      \"moneyline\": {\n        \"opening\": {\n          \"home\": \"1.95\",\n          \"draw\": \"3.30\",\n          \"away\": \"+260\"\n        },\n        \"current\": {\n          \"home\": \"1.80\",\n          \"draw\": \"3.40\",\n          \"away\": \"+240\"\n        }\n      },\n      \"totals\": {\n        \"lean\": \"under 2.5\"\n      },\n      \"btts\": {\n        \"lean\": \"no\"\n      },\n      \"asian_handicap\": {\n        \"favorite\": \"Argentina\",\n        \"opening_line\": \"-0.75\",\n        \"current_line\": \"-1.0\",\n        \"opening_odds\": \"0.98\",\n        \"current_odds\": \"0.92\",\n        \"odds_format\": \"hong_kong\"\n      }\n    }\n  ]\n}\n\nFile v1.2.0:examples/multi-book-match.json\n\n{\n  \"match\": \"Argentina vs Netherlands\",\n  \"teams\": [\"Argentina\", \"Netherlands\"],\n  \"kickoff\": \"2026-07-19T20:00:00+00:00\",\n  \"observed_at\": \"2026-07-19T19:52:00+00:00\",\n  \"match_type\": \"single_leg_knockout\",\n  \"lineup_confirmed\": true,\n  \"news\": [\n    {\n      \"headline\": \"Official lineups announced\",\n      \"category\": \"confirmed\",\n      \"observed_at\": \"2026-07-19T19:05:00+00:00\"\n    },\n    {\n      \"headline\": \"Respected reporter says the Dutch full-back trained separately yesterday\",\n      \"category\": \"credible_unconfirmed\",\n      \"observed_at\": \"2026-07-19T15:30:00+00:00\"\n    },\n    {\n      \"headline\": \"Social media expects a chaotic match\",\n      \"category\": \"narrative\",\n      \"observed_at\": \"2026-07-19T14:00:00+00:00\"\n    }\n  ],\n  \"quotes\": [\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.78\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:00:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.75\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:00:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.20\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:00:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:03:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:03:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.10\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:03:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.79\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:05:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:05:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.15\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:05:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.77\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:08:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.76\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:08:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.25\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:08:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.81\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:10:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:10:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.05\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:10:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"opening\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.82\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.45\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.73\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.40\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.71\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.84\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.50\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.74\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:53:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.79\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:53:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.35\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:53:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.75\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:54:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.77\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:54:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.30\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:54:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-1h10\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.69\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.88\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.86\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.65\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.71\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.84\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.60\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:45+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.82\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:45+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.55\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:45+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-10min\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.92\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.69\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.89\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.75\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.87\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.71\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.84\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:40+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.83\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:40+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.60\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:40+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"current\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.95\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:15:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:15:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.94\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:16:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.91\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:16:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.95\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:17:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:17:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.95\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.94\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.91\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.95\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\", \"line\": \"2.5\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"btts\", \"selection\": \"yes\", \"odds\": \"2.02\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"btts\", \"selection\": \"no\", \"odds\": \"1.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"btts\", \"selection\": \"yes\", \"odds\": \"2.00\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"btts\", \"selection\": \"no\", \"odds\": \"1.82\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"btts\", \"selection\": \"yes\", \"odds\": \"2.04\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"btts\", \"selection\": \"no\", \"odds\": \"1.79\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"asian_handicap\", \"selection\": \"home\", \"odds\": \"1.97\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:20:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\", \"line\": \"-0.75\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"asian_handicap\", \"selection\": \"away\", \"odds\": \"1.89\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:20:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\", \"line\": \"0.75\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"asian_handicap\", \"selection\": \"home\", \"odds\": \"1.96\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:21:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"-0.75\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"asian_handicap\", \"selection\": \"away\", \"odds\": \"1.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:21:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"0.75\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"asian_handicap\", \"selection\": \"home\", \"odds\": \"1.98\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\", \"line\": \"-1.0\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"asian_handicap\", \"selection\": \"away\", \"odds\": \"1.88\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\", \"line\": \"1.0\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"asian_handicap\", \"selection\": \"home\", \"odds\": \"1.96\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\", \"line\": \"-1.0\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"asian_handicap\", \"selection\": \"away\", \"odds\": \"1.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\", \"line\": \"1.0\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"to_qualify\", \"selection\": \"Argentina\", \"odds\": \"1.50\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"qualification\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"to_qualify\", \"selection\": \"Netherlands\", \"odds\": \"2.62\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"qualification\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"to_qualify\", \"selection\": \"Argentina\", \"odds\": \"1.52\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"qualification\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"to_qualify\", \"selection\": \"Netherlands\", \"odds\": \"2.56\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"qualification\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"to_qualify\", \"selection\": \"Argentina\", \"odds\": \"1.51\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"qualification\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"to_qualify\", \"selection\": \"Netherlands\", \"odds\": \"2.58\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"qualification\", \"source_tier\": \"B\", \"snapshot\": \"current\"}\n  ]\n}\n\nArchive v1.1.0: 16 files, 61247 bytes\n\nFiles: agents/openai.yaml (370b), examples/legacy-match.json (700b), examples/multi-book-match.json (22765b), references/consensus-model.md (5648b), references/market-rules.md (6395b), references/odds-formats.md (3221b), references/source-policy.md (3203b), scripts/calibrate.py (20186b), scripts/forecast.py (97097b), scripts/kickoff_alerts.py (4504b), skill-card.md (2428b), SKILL.md (9531b), tests/test_calibrate.py (15933b), tests/test_forecast.py (65945b), tests/test_kickoff_alerts.py (6499b), _meta.json (143b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: world-cup-2026-predictor\ndescription: Use for English or Chinese football match forecasts from multi-book odds, line movement, 1X2, moneyline, European odds, Asian handicap, Hong Kong/Malay/Indo water, totals, BTTS, exact score, qualification, lineup/news, 盘口, 赔率, 欧赔, 亚盘, 大小球, 临场盘, 比分预测, and pre-kickoff alerts.\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - python3\n    emoji: \"⚽\"\n---\n\n# World Cup 2026 Predictor\n\nUse this skill to produce a disciplined, probability-based football forecast from market structure and fresh news. Keep the output analytical: no guarantees, no profit claims, no certainty language, and no claim that a bookmaker knows the result.\n\nThe canonical invocation name stays `world-cup-2026-predictor`. The skill now covers football broadly, including international tournaments and club matches, while preserving bilingual response matching.\n\n## Language Policy\n\nUse the same language as the user in the response.\n\n- English input -> English response.\n- Chinese input -> Chinese response.\n- Mixed input -> use the dominant language and keep market terms that are clearest in their original form.\n- Do not duplicate every paragraph in both languages. Write one response in the user's language.\n\n## Intake Gate\n\nBefore calculating:\n\n1. Confirm the exact teams, competition, kickoff time and timezone, venue when relevant, and whether the match has started.\n2. Confirm the match type: `league_or_group`, `single_leg_knockout`, `two_leg_first`, `two_leg_second`, or `friendly`. A second leg also requires the aggregate score and applicable tiebreak rules.\n3. Collect at least three independent underlying bookmakers; five or more are preferred. An aggregator and its displayed bookmaker are one source, not two.\n4. Record the source, underlying bookmaker, market, period, line, selection, explicit odds format, observed timestamp, and snapshot for every quote.\n5. Link the schedule/competition source, odds sources, and every material lineup or news source.\n\nIf match identity is ambiguous, required context is missing, or the match has already started, abstain from a new pre-match forecast.\n\n## Forecast Workflow\n\n1. Deduplicate quotes by underlying bookmaker before counting sources.\n2. Convert declared formats to decimal and implied probability. Reject ambiguous formats rather than guessing.\n3. Remove each bookmaker's margin, then build the weighted, de-vigged consensus described in `references/consensus-model.md`.\n4. Keep opening separate and compare Opening, T-3h10, T-2h10, T-1h10, and T-10min snapshots when available. Never relabel a nearby quote as a missing checkpoint.\n5. Fit one coherent 90-minute score distribution from 1X2, totals, and BTTS. Use Asian handicap and exact-score markets as margin/consistency checks.\n6. Keep 90-minute and qualification/to-advance probabilities separate. Qualification may include extra time and penalties.\n7. Classify news as confirmed hard information, credible but unconfirmed reporting, or public narrative. Do not add a hidden probability adjustment; check whether later prices confirm the news.\n8. Compare the new result with prior analysis. State what changed, what stayed the same, and whether the conclusion improved or was revised.\n9. Score evidence quality and abstain when the evidence gate fails.\n\nIf a bundled script rejects malformed odds, missing formats, aggregator provenance, or unsupported live-only input, catch that validation error at the response layer. Name the missing/invalid field and return `no forecast edge` or `观望`; never expose a traceback and never guess a replacement value. When `actionable_forecast` is false, probabilities may be described only as diagnostics, not as a pick.\n\n## Evidence Rules\n\n- Require the market type, selection, and odds format before interpreting any number.\n- Convert every price to a fair probability before comparing books.\n- Remove bookmaker margin before building consensus.\n- Use de-vigged consensus, not raw price averages.\n- Treat opening lines as a separate reference point, not a substitute for current data.\n- Prefer fresh quotes close to kickoff. Older data must be labeled as such.\n- If the current picture depends on one book, one feed, or one rumor, do not publish a betting edge.\n\n## Market Coverage\n\n- 90-minute result: home/draw/away or moneyline.\n- Qualification or to-advance: only for advancement, extra time, or penalties.\n- Asian handicap: cover risk, not winner truth.\n- Totals and BTTS: goal-shape and score-shape evidence.\n- Exact score: consistency check, not the primary anchor.\n\nKeep 90-minute and qualification markets separate. A team can be weak in 90 minutes and still credible to advance.\n\n## Consistency Rules\n\n- Asian handicap, totals, BTTS, and exact score must agree with the same fitted score distribution.\n- If they disagree, explain the conflict instead of averaging it away.\n- A stronger 1X2 favorite with a weak handicap is a narrow-win signal, not a blowout signal.\n- A qualification favorite with a weak 90-minute price implies extra-time or penalty risk.\n- Do not treat one market family as independent evidence if it is derived from the same underlying prices.\n\n## News Rules\n\n- Mark news as `confirmed` only when it comes from official or clearly attributable sources.\n- Mark it as `unconfirmed` when it is rumor, preview, opinion, or unsupported reporting.\n- Include source links for news that affects the forecast.\n- If news is weak or unverified, keep it separate from the market read and lower confidence.\n\n## Rolling Alert Workflow\n\nWhen the user requests rolling pre-kickoff updates, create exactly four alerts per match unless the user explicitly requests a different schedule:\n\n| Offset | Purpose |\n| --- | --- |\n| T-3h10 | Establish the fresh multi-book baseline and compare with opening. |\n| T-2h10 | Recheck consensus movement, news, and source quality. |\n| T-1h10 | Recheck likely/confirmed lineup information and flip triggers. |\n| T-10min | Produce the final pre-match update, leaving the requested 10-minute decision window. |\n\nEvery alert prompt must invoke `$world-cup-2026-predictor`, refresh current sources, read prior analysis, and answer in the user's language. Use `scripts/kickoff_alerts.py --minutes-before 190 130 70 10` to generate exact local times. If automation tools are available, create the alerts; otherwise return the four exact times and prompts. A user who explicitly asks only for the final alert may use the default T-10min mode.\n\n## Required Output\n\nUse the same language as the user and include:\n\n1. Data timestamp, timezone, match type, and current alert offset.\n2. A compact conclusion table: 90-minute result probabilities, qualification when applicable, Asian handicap, total, BTTS, and a three-level score ladder.\n3. Source coverage: raw sources, deduped independent bookmakers, formats, freshness, and missing checkpoints.\n4. What changed, what stayed unchanged, and whether the previous forecast is retained or revised.\n5. No-vig 90-minute probabilities and a separately labeled qualification probability.\n6. Asian handicap, totals, BTTS, and exact-score consistency or conflict.\n7. Confirmed lineup/news versus unconfirmed reporting and public narrative, with links.\n8. A bookmaker/capital read grounded in observable prices and movement, without alleging manipulation.\n9. Confidence as evidence quality, all abstention reasons, and exact flip triggers.\n10. A concise betting-window note that never promises profit or accuracy.\n\nWhen the evidence is insufficient, output `no forecast edge` in English or `观望` in Chinese instead of forcing a pick.\n\n### Non-Actionable Output\n\nWhen validation fails, a bundled script raises an input error, or `actionable_forecast` is false, replace the normal conclusion table with only:\n\n1. Match, timestamp, and `no forecast edge` / `观望` status.\n2. Stable reason category: `invalid_odds_format`, `missing_underlying_bookmaker`, `insufficient_books`, `invalid_context`, `stale_near_kickoff`, `already_started`, or `unsupported_live_state`.\n3. The invalid or missing field and the evidence needed for a new run.\n4. The next relevant checkpoint, if kickoff has not passed.\n\nDo not output a recommended 1X2, qualification, Asian handicap, total, BTTS, or score pick in this mode. Diagnostic probabilities may be shown only when the user explicitly asks for them, and must remain labeled non-actionable.\n\n## Confidence and Safety\n\n- Three independent underlying books are the operational minimum for a full forecast; five are preferred.\n- Near kickoff, no quote within 60 minutes triggers abstention.\n- Ambiguous identity, severe disagreement, malformed markets, duplicated sources, or a started match without an in-play state model triggers abstention.\n- Confidence describes evidence quality, not outcome certainty or value. A likely winner can still offer no demonstrated pricing edge.\n- Never guarantee a result, encourage chasing losses, present betting as income, or place a bet for the user.\n\n## Bundled References\n\n- `references/source-policy.md`\n- `references/consensus-model.md`\n- `references/market-rules.md`\n- `references/odds-formats.md`\n\nUse these references before answering when source quality, consensus math, market interpretation, or odds conversion matters. Use `scripts/forecast.py` for reproducible probabilities and `scripts/calibrate.py` only on completed JSONL records; source-weight changes remain locked until the 100-overall/30-relevant-bucket calibration floors are met.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn72thwj42fqymrwn8pas9fwk1833phy\",\n  \"slug\": \"world-cup-2026-predictor\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1783863038383\n}\n\nFile v1.1.0:references/consensus-model.md\n\n# Consensus Model\n\nThis reference defines the reproducible V2 path from timestamped bookmaker quotes to a score model and evidence score. It is an audit contract, not a promise of predictive certainty.\n\n## 1. Normalize and Group\n\nEach quote must include source, underlying bookmaker, market, period, line when applicable, selection, declared odds format, observed timestamp, and snapshot. Convert the price to decimal odds `d`, then raw implied probability `q = 1 / d`.\n\nGroup mutually exclusive selections from the same underlying bookmaker by market, period, canonical line, and snapshot. Opening and current checkpoints never share a group. Deduplicate mirrored aggregator records before any source count or weighting.\n\n## 2. Remove Bookmaker Margin\n\nFor a complete three-way 1X2 market, use power de-vigging. Solve for `k > 0` by bisection so:\n\n`sum(q_i ** k) = 1`\n\nThe fair probabilities are `p_i = q_i ** k`. If the power method cannot converge, record the fallback and use proportional normalization.\n\nFor a complete binary market such as totals or BTTS, use proportional de-vigging:\n\n`p_i = q_i / sum(q_j)`\n\nAn incomplete group is marked unvigged/incomplete, receives at most half completeness weight, and cannot anchor the fit. Never silently synthesize a missing selection.\n\n## 3. Weight and Aggregate\n\nThe starting quote weight is the product of:\n\n- source tier: A `1.25`, B `1.0`, C `0.75`, D `0.0`;\n- recency: under 15 minutes `1.0`, 15-60 `0.9`, 60-180 `0.7`, older current quotes `0.4`;\n- completeness: full for complete de-vigged groups, at most `0.5` for incomplete groups;\n- the engine's market-quality/liquidity factor.\n\nUse the weighted median for each consensus selection rather than a simple mean. Report raw quote count, deduped independent bookmaker count, usable complete books, overround range, consensus probability, and dispersion.\n\n## 4. Outliers and Dispersion\n\nWith at least five usable independent bookmakers, a quote is an exclusion candidate only when it differs from the median by both:\n\n- more than six percentage points; and\n- more than three scaled median absolute deviations.\n\nNever exclude more than 20% of usable books. Preserve every exclusion and reason in diagnostics. When MAD is zero, the absolute six-point condition still prevents trivial differences from becoming outliers. Wide residual dispersion lowers confidence even if no quote is excluded.\n\n## 5. Snapshot Movement\n\nTrack Opening, T-3h10, T-2h10, T-1h10, and T-10min independently. Movement is a change in de-vigged consensus probability and, for Asian markets, the signed line and water. Missing checkpoints remain missing. A one-book move is not consensus movement.\n\nCompare each rolling forecast with its prior record and state:\n\n- what changed;\n- what stayed unchanged;\n- whether the conclusion is retained or revised;\n- the exact price, line, lineup, or news trigger that would flip it.\n\n## 6. Score Fit and Market Separation\n\nFit home and away expected goals over a bounded grid. For independent Poisson rates `lambda_home` and `lambda_away`:\n\n`P(H=h, A=a) = Poisson(h; lambda_home) * Poisson(a; lambda_away)`\n\nMinimize the weighted residual between the score matrix and the no-vig 90-minute consensus for 1X2, totals, and BTTS. Market-family weights reflect usable coverage and dispersion and are capped so correlated derivative markets cannot dominate.\n\nThe fitted matrix must produce coherent 1X2, supplied totals, BTTS, exact-score, and win-margin probabilities. Asian handicap and correct-score prices validate margin/shape; they are not additional winner votes. Qualification remains separate because it can include extra time and penalties.\n\n## 7. Asian and Total Settlement\n\nSettle integer and half lines directly from every score cell. Split quarter lines into equal half-stakes on adjacent lines, for example:\n\n- `-0.75` -> half at `-0.5`, half at `-1.0`;\n- `+0.25` -> half at `0.0`, half at `+0.5`;\n- over `2.25` -> half over `2.0`, half over `2.5`.\n\nReport win, half-win, push, half-loss, and loss probabilities. Preserve home/away sign orientation; never normalize away which team is giving the handicap.\n\n## 8. Evidence Confidence and Abstention\n\nConfidence measures input quality, not certainty of the outcome:\n\n| Component | Maximum |\n| --- | ---: |\n| Independent bookmaker coverage | 25 |\n| Quote freshness | 20 |\n| Trusted core market-family coverage | 20 |\n| Low cross-book dispersion | 15 |\n| Cross-market/score-fit agreement | 15 |\n| Confirmed lineup | 5 |\n\nScores `75-100` are high, `50-74` medium, and below `50` low. Friendly matches receive a 10-point penalty. Qualification-only books and core families supported by only one book do not inflate 90-minute confidence.\n\nThe skill and engine require three independent underlying books for a full forecast and prefer five. Also abstain for stale near-kickoff evidence (no usable quote inside 60 minutes), ambiguous identity, invalid aggregate context, severe disagreement, or a match that has started without a separate in-play state model.\n\nUse `no forecast edge` or `观望` when the gate fails.\n\n## 9. Calibration Lock\n\n`scripts/calibrate.py` reports multiclass Brier score, log loss, top-pick accuracy, totals/BTTS Brier, score error, confidence-bucket calibration, and movement to closing consensus. No source-weight change is eligible before both:\n\n- 100 valid completed forecasts overall; and\n- 30 valid observations in the affected competition/market bucket.\n\nInvalid or internally conflicting records are quarantined atomically and cannot contribute partial metrics. Calibration can justify a later review of weights; it never changes them automatically.\n\nFile v1.1.0:references/market-rules.md\n\n# Market Rules\n\nThese rules apply the V2 cross-market framework to international and club football. Observable prices and movement may reveal the risk a market is protecting; they do not prove manipulation or that a bookmaker knows the result.\n\n## Core Priority\n\n1. Use 90-minute moneyline movement for win/draw/loss direction.\n2. Compare qualification/to-lift market with 90-minute moneyline to detect extra-time or penalty risk.\n3. Use Asian handicap/spread to decide whether a favorite can cover or only win narrowly.\n4. Use totals and BTTS to shape the scoreline.\n5. Explain whether news is confirmed by price movement or just public sentiment.\n6. Use correct score only after market structure is understood.\n\n## Competition Context\n\nConfirm context before interpreting motivation or advancement:\n\n| Match type | Required interpretation |\n| --- | --- |\n| `league_or_group` | Forecast the 90-minute result; table position, goal difference, and draw incentives may matter. Do not invent an advancement probability when no such market applies. |\n| `single_leg_knockout` | Keep 90-minute and qualification markets separate; extra time and penalties create real divergence. |\n| `two_leg_first` | Expect aggregate caution and asymmetric risk. Do not assume the home favorite must chase a large margin. |\n| `two_leg_second` | Require the current aggregate score and tiebreak rules. The side trailing on aggregate may accept early risk; the leading side may protect space even when its 90-minute price is short. |\n| `friendly` | Rotation, substitutions, and motivation are unstable; apply the confidence penalty and avoid strong edge language. |\n\nIf match type is unknown, calculate market consensus only. Do not infer advancement or tactical incentives.\n\n## Favorite Movement\n\n| Signal | Read |\n| --- | --- |\n| Favorite shortens and handicap also strengthens | Favorite direction is credible; cover becomes more plausible. |\n| Favorite shortens but handicap does not follow | Favorite may win, but narrow win is more likely than a blowout. |\n| Favorite drifts near kickoff | Warning signal; protect draw, underdog +0.5, or upset. |\n| Favorite drifts while totals stay high | Underdog scoring threat rises; protect 1-1, 1-2, 2-2. |\n| Favorite qualification price is strong but 90-minute price is weak | Favorite may advance after draw/extra time; protect 90-minute draw. |\n\n## Asian Handicap Cross-Check\n\nAsian handicap answers \"can the team cover the line?\", not just \"will the team win?\"\n\n| Combined signal | Read |\n| --- | --- |\n| 1X2 favorite shortens and Asian line moves from -1.0 to -1.25/-1.5 | Favorite win and cover are both being confirmed. |\n| 1X2 favorite shortens but Asian line stays flat or weakens | Favorite may win, but narrow win/failed cover is live. |\n| Favorite Asian line weakens from -1.5 to -1.25/-1.0 | Market is protecting the underdog; reduce blowout confidence. |\n| Favorite line deepens but favorite water gets much higher | Book is asking for favorite backers at a better payout; treat cover as unconfirmed. |\n| Underdog + handicap water keeps dropping | Underdog protection is real; protect one-goal favorite win, draw, or upset. |\n| Moneyline and Asian handicap disagree | Prefer split conclusion: ML/advance for winner, Asian handicap for margin risk. |\n\n## Big Favorite Pattern\n\nBig favorites often win, but the spread and over can fail in knockout matches.\n\n- If favorite is very short and opponent sits deep, prefer 1-0 or 2-0 over automatic 3-0/4-0.\n- If favorite ML is very short but Asian handicap does not deepen, do not infer a blowout from ML alone.\n- If favorite leads early and tempo-control incentives are high, reduce cover confidence.\n- If the favorite's defense has shown leaks and BTTS/over shortens, 2-1 or 3-1 becomes more plausible than 2-0.\n\n## Medium Favorite Pattern\n\nMedium favorites are often where 2-1, 1-1, and extra time live.\n\n| Market shape | Score tendency |\n| --- | --- |\n| Favorite around modest moneyline favorite, BTTS yes firm | 2-1 or 1-1. |\n| Favorite price strong but handicap weak | 1-goal favorite win or 1-1. |\n| Qualification favorite, 90-minute market close | 1-1, 0-0, extra time/penalties. |\n| Over 2.5 near even and both teams have transition threats | 2-1, 2-2, 3-2. |\n\n## Small Favorite / Coin-Flip Pattern\n\n- Do not lean on team reputation alone.\n- If draw price shortens and under is firm, make 0-0 or 1-1 a main scenario.\n- If one side's qualification price is favored but 90-minute ML is close, separate \"advance\" from \"win in 90\".\n- In strong-versus-strong matches, small favorite plus under often points to 1-0, 1-1, or 0-0.\n\n## Totals and BTTS\n\n| Signal | Read |\n| --- | --- |\n| Over 2.5 shortens steadily | Prefer 2-1, 2-2, 3-1, 3-2; avoid 1-0 as main score. |\n| Under 2.5 shortens steadily | Prefer 1-0, 0-0, 1-1, 2-0. |\n| Under shortens and BTTS Yes also shortens | 1-1 is the central score. |\n| Under shortens and BTTS No shortens | 1-0, 2-0, 0-0 are central. |\n| Over stays high while favorite drifts | Upset with goals or both teams scoring becomes more plausible. |\n\nRelated derivative markets are consistency checks, not extra independent votes. DNB, double chance, team totals, BTTS, and correct score often reuse the same underlying information, so cap each market family's influence.\n\n## News Filter\n\nClassify every news item:\n\n- **Hard signal**: confirmed starting XI, major injury, suspension, formation change, goalkeeper change, extreme weather, rest/travel disadvantage.\n- **Public/emotional signal**: star return hype, host-country narrative, media pressure, brand-name team reputation, revenge story.\n\nNews is trustworthy only when the relevant market confirms it. If public news moves ML but handicap and totals do not confirm, mark it as possible sentiment trap.\n\n## Final Forecast Template\n\nProduce in the user's language. Use English labels for English users and Chinese labels for Chinese users. The required content is:\n\n- 90-minute / 90 分钟: favorite/draw/underdog with confidence.\n- Advancement / 晋级: who advances and whether extra time is live.\n- Asian handicap / 亚盘: whether the favorite can cover or underdog protection is better.\n- Totals / 大小球: over/under lean.\n- BTTS / 双方进球: yes/no lean.\n- Score ladder / 比分阶梯: main score, defensive score, chaos/upset score.\n- Flip triggers / 反转条件: exact market/news moves that would change the call.\n\nFile v1.1.0:references/odds-formats.md\n\n# Odds Formats\n\nAlways identify the format before reading the market. The same number can mean different things across books.\n\n## Ambiguity Rejection\n\n- Every quote must declare its odds format. Never infer the format from the number, bookmaker region, sign, or surrounding prose.\n- Reject ambiguous inputs such as bare `0.85`, `-0.85`, or `1.20`; each could mean a different return under decimal, Hong Kong, Malay, Indo, or handicap notation.\n- Keep the Asian handicap line separate from its water price. For example, `home -0.75 @ 0.92 HK` contains a signed handicap and a Hong Kong price; neither may replace the other.\n- Reject decimal odds at or below `1.0`, zero American odds, malformed fractional odds, and values outside the declared format's valid domain.\n- If a screenshot or source does not label the format, report it as unavailable until corroborated. Do not guess and do not feed it into consensus.\n\n## Main Markets\n\n| Market | What it answers | Use |\n| --- | --- | --- |\n| European decimal 1X2 | Home/draw/away in 90 minutes | Convert to implied probability; compare with moneyline. |\n| US moneyline | Team/draw price in 90 minutes | Convert to implied probability; useful on US sites. |\n| Qualification/to-lift | Who advances or wins tie/tournament | Separate from 90-minute result; reveals extra-time/penalty risk. |\n| Asian handicap | Margin and protection line | Do not treat as winner market; use to judge cover and underdog protection. |\n| Totals | Total goals line | Score-shape input. |\n| BTTS | Whether both teams score | Score-shape input, especially 1-1 vs 2-0. |\n\n## Conversion Quick Reference\n\nUse approximate implied probability before comparing prices:\n\n| Format | Example | Conversion |\n| --- | --- | --- |\n| Decimal/European | 1.80 | `1 / 1.80 = 55.6%` |\n| Fractional | 4/5 | decimal `1.80`, probability `55.6%` |\n| American negative | -150 | `150 / (150 + 100) = 60.0%` |\n| American positive | +240 | `100 / (240 + 100) = 29.4%` |\n| Hong Kong water | 0.92 | decimal `1.92`, probability `1 / 1.92 = 52.1%` |\n| Malay positive | 0.85 | decimal `1.85`, probability `54.1%` |\n| Malay negative | -0.85 | probability `0.85 / 1.85 = 45.9%` |\n| Indo positive | 1.20 | decimal `2.20`, probability `45.5%` |\n| Indo negative | -1.20 | probability `1.20 / 2.20 = 54.5%` |\n\nThese raw probabilities include bookmaker margin. De-vig each complete bookmaker market before comparing it with another book or fitting the score model.\n\n## Asian Handicap Reading\n\nFor favorites, more negative lines are stronger:\n\n- `-1.0 -> -1.25 -> -1.5` means the favorite cover expectation is strengthening.\n- `-1.5 -> -1.25 -> -1.0` means the market is protecting the underdog or doubting the blowout.\n- If the line strengthens but favorite water rises sharply, cover is not fully confirmed.\n- If the favorite ML strengthens while Asian handicap weakens, split the call: favorite can win, but the handicap may fail.\n\nFor underdogs, more positive protection or falling underdog water is meaningful:\n\n- `+1.5` with falling water suggests the book expects the underdog to stay within the number.\n- In knockout matches, underdog protection plus under 2.5 often points to `1-0`, `1-1`, or `2-0`, not a runaway favorite score.\n\nFile v1.1.0:references/source-policy.md\n\n# Source Policy\n\nThis policy defines which sources can enter numeric consensus and how they are counted.\n\n## Tiers\n\n| Tier | Source type | Use |\n| --- | --- | --- |\n| A | Exchange or high-liquidity reference bookmaker with timestamped prices | Full numeric input |\n| B | Mainstream sportsbook with timestamped prices | Full numeric input |\n| C | Odds aggregator that exposes the underlying bookmaker and update time | Numeric input only after dedupe |\n| D | Tip site, preview, social post, unattributed odds, or commentary | Context only; never numeric consensus |\n\nTip sites are excluded from consensus because they are not prices and do not provide independent market truth.\n\n## Deduplication\n\n- Count the underlying bookmaker, not the page that displays it.\n- If the same bookmaker appears on multiple aggregators, count it once.\n- Deduplicate by bookmaker, market, line, selection, and time bucket.\n- Do not treat mirrored feeds, affiliate mirrors, or copied tables as new books.\n\n## Freshness\n\n- Use recency weight `1.0` for quotes under 15 minutes old, `0.9` for 15-60 minutes, `0.7` for 60-180 minutes, and `0.4` for older non-opening quotes.\n- Quote freshness must always be shown with an explicit timestamp.\n- Opening lines remain a separate snapshot and are never silently mixed into the current consensus.\n- Stale quotes may be reported, but their age must be stated and their weight reduced.\n- Near kickoff, a forecast with no usable quote inside 60 minutes must abstain.\n\n## Source Counts\n\n- Minimum usable independent bookmakers: three.\n- Preferred independent bookmakers: five or more.\n- If fewer than three independent books remain after dedupe, abstain from a market edge. A diagnostic or tactical summary may still be given if it is clearly labeled non-betting analysis.\n- Report both raw source count and deduped bookmaker count.\n\n## Starting Weights\n\n- Tier A: `1.25`.\n- Tier B: `1.0`.\n- Tier C: `0.75` after underlying-bookmaker deduplication.\n- Tier D: `0.0` for numeric consensus.\n- A complete de-vigged market receives full completeness weight. An incomplete market receives at most half weight and cannot anchor the forecast.\n\nThese are transparent starting assumptions, not permanent claims about bookmaker quality. Change them only after at least 100 completed forecasts overall and 30 in the affected competition/market bucket.\n\n## Unavailable Data\n\n- Never invent missing prices or timestamps.\n- If a book, market, or checkpoint is unavailable, say it is unavailable.\n- If a requested checkpoint has no quote, do not relabel a nearby quote as that checkpoint.\n- If only one market family is available, state that the forecast is partial.\n\n## Current Consensus Inputs\n\nOnly these sources can move the numeric consensus:\n\n- current bookmaker prices;\n- underlying bookmaker prices reached through an aggregator;\n- exchange/reference prices with timestamps.\n\nEverything else is diagnostic or narrative support.\n\n## Minimum Reporting Fields\n\nEvery usable quote should carry:\n\n- source name;\n- underlying bookmaker;\n- market type;\n- selection and line;\n- odds format;\n- quoted odds;\n- timestamp with timezone;\n- whether it belongs to opening or one of the comparison checkpoints.\n\nFile v1.1.0:skill-card.md\n\n## Description: <br>\nProduces English or Chinese football forecasts from multi-book odds, line movement, market structure, lineup and news evidence, and pre-kickoff checkpoints. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[youjunzhao](https://clawhub.ai/user/youjunzhao) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and analysts use this skill to turn supplied match, odds, and news evidence into probability-based football forecasts, consistency checks, and rolling pre-kickoff updates. It is intended for analytical support, not guaranteed outcomes or financial certainty. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Football odds forecasts may be mistaken for financial certainty. <br>\nMitigation: Treat outputs as probabilistic analysis, preserve no-guarantee language, and abstain when source quality or freshness gates fail. <br>\nRisk: Bundled scripts read provided match and odds files and perform local calculations. <br>\nMitigation: Run scripts only on intended input files and review validation errors instead of guessing missing odds, formats, bookmakers, or match context. <br>\nRisk: Rolling pre-kickoff alerts can create repeated automated analysis prompts. <br>\nMitigation: Review alert timing and prompt content before enabling automation. <br>\n\n\n## Reference(s): <br>\n- [Source Policy](references/source-policy.md) <br>\n- [Consensus Model](references/consensus-model.md) <br>\n- [Market Rules](references/market-rules.md) <br>\n- [Odds Formats](references/odds-formats.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, guidance] <br>\n**Output Format:** [Markdown forecast text with tables, source-quality notes, non-actionable abstention output, and optional alert prompts.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Bilingual English/Chinese response matching; bundled Python scripts support reproducible odds calculations and kickoff alert timing.] <br>\n\n## Skill Version(s): <br>\n1.1.0 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.0:examples/legacy-match.json\n\n{\n  \"matches\": [\n    {\n      \"teams\": [\"Argentina\", \"Netherlands\"],\n      \"kickoff\": \"2026-07-19T20:00:00Z\",\n      \"moneyline\": {\n        \"opening\": {\n          \"home\": \"1.95\",\n          \"draw\": \"3.30\",\n          \"away\": \"+260\"\n        },\n        \"current\": {\n          \"home\": \"1.80\",\n          \"draw\": \"3.40\",\n          \"away\": \"+240\"\n        }\n      },\n      \"totals\": {\n        \"lean\": \"under 2.5\"\n      },\n      \"btts\": {\n        \"lean\": \"no\"\n      },\n      \"asian_handicap\": {\n        \"favorite\": \"Argentina\",\n        \"opening_line\": \"-0.75\",\n        \"current_line\": \"-1.0\",\n        \"opening_odds\": \"0.98\",\n        \"current_odds\": \"0.92\",\n        \"odds_format\": \"hong_kong\"\n      }\n    }\n  ]\n}\n\nFile v1.1.0:examples/multi-book-match.json\n\n{\n  \"match\": \"Argentina vs Netherlands\",\n  \"teams\": [\"Argentina\", \"Netherlands\"],\n  \"kickoff\": \"2026-07-19T20:00:00+00:00\",\n  \"observed_at\": \"2026-07-19T19:52:00+00:00\",\n  \"match_type\": \"single_leg_knockout\",\n  \"lineup_confirmed\": true,\n  \"news\": [\n    {\n      \"headline\": \"Official lineups announced\",\n      \"category\": \"confirmed\",\n      \"observed_at\": \"2026-07-19T19:05:00+00:00\"\n    },\n    {\n      \"headline\": \"Respected reporter says the Dutch full-back trained separately yesterday\",\n      \"category\": \"credible_unconfirmed\",\n      \"observed_at\": \"2026-07-19T15:30:00+00:00\"\n    },\n    {\n      \"headline\": \"Social media expects a chaotic match\",\n      \"category\": \"narrative\",\n      \"observed_at\": \"2026-07-19T14:00:00+00:00\"\n    }\n  ],\n  \"quotes\": [\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.78\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:00:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.75\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:00:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.20\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:00:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:03:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:03:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.10\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:03:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.79\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:05:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:05:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.15\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:05:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.77\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:08:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.76\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:08:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.25\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:08:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.81\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:10:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:10:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"opening\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.05\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:10:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"opening\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.82\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.45\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.73\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.40\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.71\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.84\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.50\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.74\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:53:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.79\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:53:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.35\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:53:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.75\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:54:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.77\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:54:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-1h10\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.30\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T18:54:00+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-1h10\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.69\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.88\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:50:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.86\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.65\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.71\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.84\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.60\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:45+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.82\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:45+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-10min\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.55\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:51:45+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"t-10min\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.92\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.80\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.69\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.89\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.75\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:10+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.87\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.70\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:20+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.71\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.84\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book D\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.68\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:30+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"home\", \"odds\": \"1.72\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:40+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"draw\", \"odds\": \"3.83\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:40+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"current\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book E\", \"market\": \"1x2\", \"selection\": \"away\", \"odds\": \"5.60\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-19T19:52:40+00:00\", \"period\": \"90m\", \"source_tier\": \"C\", \"snapshot\": \"current\"},\n\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.95\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:15:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book A\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.90\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:15:00+00:00\", \"period\": \"90m\", \"source_tier\": \"A\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"totals\", \"selection\": \"over\", \"odds\": \"1.94\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:16:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book B\", \"market\": \"totals\", \"selection\": \"under\", \"odds\": \"1.91\", \"odds_format\": \"decimal\", \"observed_at\": \"2026-07-18T12:16:00+00:00\", \"period\": \"90m\", \"source_tier\": \"B\", \"snapshot\": \"opening\", \"line\": \"2.5\"},\n    {\"source\": \"direct\", \"bookmaker\": \"Book C\", \"market\": \"totals\", \"selectio\n\nArchive v1.0.2: 8 files, 13072 bytes\n\nFiles: agents/openai.yaml (377b), references/market-rules.md (5021b), references/odds-formats.md (2312b), scripts/forecast.py (9889b), scripts/kickoff_alerts.py (1980b), skill-card.md (2531b), SKILL.md (6551b), _meta.json (143b)\n\nArchive v1.0.1: 8 files, 12577 bytes\n\nFiles: agents/openai.yaml (332b), references/market-rules.md (4811b), references/odds-formats.md (2312b), scripts/forecast.py (9889b), scripts/kickoff_alerts.py (1980b), skill-card.md (2573b), SKILL.md (5461b), _meta.json (143b)\n\nArchive v1.0.0: 7 files, 9578 bytes\n\nFiles: agents/openai.yaml (301b), references/market-rules.md (3707b), scripts/forecast.py (5809b), scripts/kickoff_alerts.py (1980b), skill-card.md (2478b), SKILL.md (4582b), _meta.json (143b)","readmeExcerpt":"Skill: World Cup and Football Predictor Owner: youjunzhao Summary: Use for English or Chinese football match forecasts, pre-kickoff alerts, post-match review, and controlled self-evolution from multi-book odds, line movement... Tags: latest:1.2.0 Version history: v1.2.0 | 2026-07-13T06:40:23.237Z | auto **Major update: Adds post-match review, model evolution, and expanded market/format support.** - Introduced post-ma","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python3 scripts/forecast.py --input examples/multi-book-match.json --data-dir ~/.football-forecaster --pretty\npython3 scripts/postmatch_review.py --forecast examples/forecast-snapshot.json --result examples/completed-match.json --language en --data-dir ~/.football-forecaster --pretty\npython3 scripts/calibrate.py --input ~/.football-forecaster/completed.jsonl --pretty\npython3 scripts/evolve.py --completed ~/.football-forecaster/completed.jsonl --data-dir ~/.football-forecaster --mode evaluate --pretty\npython3 scripts/evolve.py --completed ~/.football-forecaster/completed.jsonl --data-dir ~/.football-forecaster --mode promote --pretty\npython3 scripts/evolve.py --data-dir ~/.football-forecaster --mode rollback --pretty\npython3 scripts/postmatch_alerts.py --input matches.json --timezone Asia/Hong_Kong --retry-count 4"},{"language":"json","snippet":"{\n  \"status\": \"final\",\n  \"event_id\": \"event-id\",\n  \"score_90m\": {\"home\": 1, \"away\": 1},\n  \"score_after_extra_time\": {\"home\": 3, \"away\": 1},\n  \"penalties\": null,\n  \"qualified\": \"Home Team\",\n  \"sources\": [{\"name\": \"Official\", \"official\": true, \"observed_at\": \"2026-07-13T06:00:00+00:00\", \"url\": \"https://example.test/result\"}]\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: world-cup-2026-predictor\ndescription: Use for English or Chinese football match forecasts, pre-kickoff alerts, post-match review, and controlled self-evolution from multi-book odds, line movement, 1X2/moneyline, European odds, Asian handicap, Hong Kong/Malay/Indo water, totals, BTTS, exact score, qualification, lineup/news, 盘口, 赔率, 欧赔, 亚盘, 港赔, 马来盘, 印尼盘, 大小球, 临场盘, 比分预测, 赛后复盘, and 模型进化.\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - python3\n    emoji: \"⚽\"\n---\n\n# World Cup 2026 Predictor\n\nUse this skill to produce a disciplined, probability-based football forecast from market structure and fresh news. Keep the output analytical: no guarantees, no profit claims, no certainty language, and no claim that a bookmaker knows the result.\n\nThe canonical invocation name stays `world-cup-2026-predictor`. The skill now covers football broadly, including international tournaments and club matches, while preserving bilingual response matching.\n\n## Language Policy\n\nUse the same language as the user in the response.\n\n- English input -> English response.\n- Chinese input -> Chinese response.\n- Mixed input -> use the dominant language and keep market terms that are clearest in their original form.\n- Do not duplicate every paragraph in both languages. Write one response in the user's language.\n\n## Intake Gate\n\nBefore calculating:\n\n1. Confirm the exact teams, competition, kickoff time and timezone, venue when relevant, and whether the match has started.\n2. Confirm the match type: `league_or_group`, `single_leg_knockout`, `two_leg_first`, `two_leg_second`, or `friendly`. A second leg also requires the aggregate score and applicable tiebreak rules.\n3. Collect at least three independent underlying bookmakers; five or more are preferred. An aggregator and its displayed bookmaker are one source, not two.\n4. Record the source, underlying bookmaker, market, period, line, selection, explicit odds format, observed timestamp, and snapshot for every quote.\n5. Link the schedule/competition source, odds sources, and every material lineup or news source.\n\nIf match identity is ambiguous, required context is missing, or the match has already started, abstain from a new pre-match forecast.\n\n## Forecast Workflow\n\n1. Deduplicate quotes by underlying bookmaker before counting sources.\n2. Convert declared formats to decimal and implied probability. Reject ambiguous formats rather than guessing.\n3. Remove each bookmaker's margin, then build the weighted, de-vigged consensus described in `references/consensus-model.md`.\n4. Keep opening separate and compare Opening, T-3h10, T-2h10, T-1h10, and T-10min snapshots when available. Never relabel a nearby quote as a missing checkpoint.\n5. Fit one coherent 90-minute score distribution from 1X2, totals, and BTTS. Use Asian handicap and exact-score markets as margin/consistency checks.\n6. Keep 90-minute and qualification/to-advance probabilities separate. Qualification may include extra time and penalties.\n7. Classify news as conf"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn72thwj42fqymrwn8pas9fwk1833phy\",\n  \"slug\": \"world-cup-2026-predictor\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1783924823237\n}"},{"path":"references/consensus-model.md","content":"# Consensus Model\n\nThis reference defines the reproducible V2 path from timestamped bookmaker quotes to a score model and evidence score. It is an audit contract, not a promise of predictive certainty.\n\n## 1. Normalize and Group\n\nEach quote must include source, underlying bookmaker, market, period, line when applicable, selection, declared odds format, observed timestamp, and snapshot. Convert the price to decimal odds `d`, then raw implied probability `q = 1 / d`.\n\nGroup mutually exclusive selections from the same underlying bookmaker by market, period, canonical line, and snapshot. Opening and current checkpoints never share a group. Deduplicate mirrored aggregator records before any source count or weighting.\n\n## 2. Remove Bookmaker Margin\n\nFor a complete three-way 1X2 market, use power de-vigging. Solve for `k > 0` by bisection so:\n\n`sum(q_i ** k) = 1`\n\nThe fair probabilities are `p_i = q_i ** k`. If the power method cannot converge, record the fallback and use proportional normalization.\n\nFor a complete binary market such as totals or BTTS, use proportional de-vigging:\n\n`p_i = q_i / sum(q_j)`\n\nAn incomplete group is marked unvigged/incomplete, receives at most half completeness weight, and cannot anchor the fit. Never silently synthesize a missing selection.\n\n## 3. Weight and Aggregate\n\nThe starting quote weight is the product of:\n\n- source tier: A `1.25`, B `1.0`, C `0.75`, D `0.0`;\n- recency: under 15 minutes `1.0`, 15-60 `0.9`, 60-180 `0.7`, older current quotes `0.4`;\n- completeness: full for complete de-vigged groups, at most `0.5` for incomplete groups;\n- the engine's market-quality/liquidity factor.\n\nUse the weighted median for each consensus selection rather than a simple mean. Report raw quote count, deduped independent bookmaker count, usable complete books, overround range, consensus probability, and dispersion.\n\n## 4. Outliers and Dispersion\n\nWith at least five usable independent bookmakers, a quote is an exclusion candidate only when it differs from the median by both:\n\n- more than six percentage points; and\n- more than three scaled median absolute deviations.\n\nNever exclude more than 20% of usable books. Preserve every exclusion and reason in diagnostics. When MAD is zero, the absolute six-point condition still prevents trivial differences from becoming outliers. Wide residual dispersion lowers confidence even if no quote is excluded.\n\n## 5. Snapshot Movement\n\nTrack Opening, T-3h10, T-2h10, T-1h10, and T-10min independently. Movement is a change in de-vigged consensus probability and, for Asian markets, the signed line and water. Missing checkpoints remain missing. A one-book move is not consensus movement.\n\nCompare each rolling forecast with its prior record and state:\n\n- what changed;\n- what stayed unchanged;\n- whether the conclusion is retained or revised;\n- the exact price, line, lineup, or news trigger that would flip it.\n\n## 6. Score Fit and Market Separation\n\nFit home and away expected goals over a bounded grid. For inde"},{"path":"references/market-rules.md","content":"# Market Rules\n\nThese rules apply the V2 cross-market framework to international and club football. Observable prices and movement may reveal the risk a market is protecting; they do not prove manipulation or that a bookmaker knows the result.\n\n## Core Priority\n\n1. Use 90-minute moneyline movement for win/draw/loss direction.\n2. Compare qualification/to-lift market with 90-minute moneyline to detect extra-time or penalty risk.\n3. Use Asian handicap/spread to decide whether a favorite can cover or only win narrowly.\n4. Use totals and BTTS to shape the scoreline.\n5. Explain whether news is confirmed by price movement or just public sentiment.\n6. Use correct score only after market structure is understood.\n\n## Competition Context\n\nConfirm context before interpreting motivation or advancement:\n\n| Match type | Required interpretation |\n| --- | --- |\n| `league_or_group` | Forecast the 90-minute result; table position, goal difference, and draw incentives may matter. Do not invent an advancement probability when no such market applies. |\n| `single_leg_knockout` | Keep 90-minute and qualification markets separate; extra time and penalties create real divergence. |\n| `two_leg_first` | Expect aggregate caution and asymmetric risk. Do not assume the home favorite must chase a large margin. |\n| `two_leg_second` | Require the current aggregate score and tiebreak rules. The side trailing on aggregate may accept early risk; the leading side may protect space even when its 90-minute price is short. |\n| `friendly` | Rotation, substitutions, and motivation are unstable; apply the confidence penalty and avoid strong edge language. |\n\nIf match type is unknown, calculate market consensus only. Do not infer advancement or tactical incentives.\n\n## Favorite Movement\n\n| Signal | Read |\n| --- | --- |\n| Favorite shortens and handicap also strengthens | Favorite direction is credible; cover becomes more plausible. |\n| Favorite shortens but handicap does not follow | Favorite may win, but narrow win is more likely than a blowout. |\n| Favorite drifts near kickoff | Warning signal; protect draw, underdog +0.5, or upset. |\n| Favorite drifts while totals stay high | Underdog scoring threat rises; protect 1-1, 1-2, 2-2. |\n| Favorite qualification price is strong but 90-minute price is weak | Favorite may advance after draw/extra time; protect 90-minute draw. |\n\n## Asian Handicap Cross-Check\n\nAsian handicap answers \"can the team cover the line?\", not just \"will the team win?\"\n\n| Combined signal | Read |\n| --- | --- |\n| 1X2 favorite shortens and Asian line moves from -1.0 to -1.25/-1.5 | Favorite win and cover are both being confirmed. |\n| 1X2 favorite shortens but Asian line stays flat or weakens | Favorite may win, but narrow win/failed cover is live. |\n| Favorite Asian line weakens from -1.5 to -1.25/-1.0 | Market is protecting the underdog; reduce blowout confidence. |\n| Favorite line deepens but favorite water gets much higher | Book is asking for favorite backers at a better "},{"path":"references/odds-formats.md","content":"# Odds Formats\n\nAlways identify the format before reading the market. The same number can mean different things across books.\n\n## Ambiguity Rejection\n\n- Every quote must declare its odds format. Never infer the format from the number, bookmaker region, sign, or surrounding prose.\n- Reject ambiguous inputs such as bare `0.85`, `-0.85`, or `1.20`; each could mean a different return under decimal, Hong Kong, Malay, Indo, or handicap notation.\n- Keep the Asian handicap line separate from its water price. For example, `home -0.75 @ 0.92 HK` contains a signed handicap and a Hong Kong price; neither may replace the other.\n- Reject decimal odds at or below `1.0`, zero American odds, malformed fractional odds, and values outside the declared format's valid domain.\n- If a screenshot or source does not label the format, report it as unavailable until corroborated. Do not guess and do not feed it into consensus.\n\n## Main Markets\n\n| Market | What it answers | Use |\n| --- | --- | --- |\n| European decimal 1X2 | Home/draw/away in 90 minutes | Convert to implied probability; compare with moneyline. |\n| US moneyline | Team/draw price in 90 minutes | Convert to implied probability; useful on US sites. |\n| Qualification/to-lift | Who advances or wins tie/tournament | Separate from 90-minute result; reveals extra-time/penalty risk. |\n| Asian handicap | Margin and protection line | Do not treat as winner market; use to judge cover and underdog protection. |\n| Totals | Total goals line | Score-shape input. |\n| BTTS | Whether both teams score | Score-shape input, especially 1-1 vs 2-0. |\n\n## Conversion Quick Reference\n\nUse approximate implied probability before comparing prices:\n\n| Format | Example | Conversion |\n| --- | --- | --- |\n| Decimal/European | 1.80 | `1 / 1.80 = 55.6%` |\n| Fractional | 4/5 | decimal `1.80`, probability `55.6%` |\n| American negative | -150 | `150 / (150 + 100) = 60.0%` |\n| American positive | +240 | `100 / (240 + 100) = 29.4%` |\n| Hong Kong water | 0.92 | decimal `1.92`, probability `1 / 1.92 = 52.1%` |\n| Malay positive | 0.85 | decimal `1.85`, probability `54.1%` |\n| Malay negative | -0.85 | probability `0.85 / 1.85 = 45.9%` |\n| Indo positive | 1.20 | decimal `2.20`, probability `45.5%` |\n| Indo negative | -1.20 | probability `1.20 / 2.20 = 54.5%` |\n\nThese raw probabilities include bookmaker margin. De-vig each complete bookmaker market before comparing it with another book or fitting the score model.\n\n## Asian Handicap Reading\n\nFor favorites, more negative lines are stronger:\n\n- `-1.0 -> -1.25 -> -1.5` means the favorite cover expectation is strengthening.\n- `-1.5 -> -1.25 -> -1.0` means the market is protecting the underdog or doubting the blowout.\n- If the line strengthens but favorite water rises sharply, cover is not fully confirmed.\n- If the favorite ML strengthens while Asian handicap weakens, split the call: favorite can win, but the handicap may fail.\n\nFor underdogs, more positive protection or falling underdog water is meaningful:\n\n-"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":2388,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:30:32.004Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:30:32.004Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T12:20:30.058Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}