davidyap22 commited on
Commit
3e009f9
·
1 Parent(s): 56672b3

restore: full repo + add 2 new Medium articles

Browse files
.github/scripts/push_to_hf.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from huggingface_hub import HfApi
3
+
4
+ token = os.environ.get("HF_TOKEN")
5
+ repo_id = os.environ.get("HF_REPO_ID")
6
+ repo_type = os.environ.get("HF_REPO_TYPE", "model")
7
+
8
+ if not token:
9
+ raise RuntimeError("Missing HF_TOKEN secret")
10
+ if not repo_id:
11
+ raise RuntimeError("Missing HF_REPO_ID secret (e.g. Oddsflow-team/oddsflow-transparency)")
12
+
13
+ api = HfApi(token=token)
14
+
15
+ api.upload_folder(
16
+ folder_path=".",
17
+ repo_id=repo_id,
18
+ repo_type=repo_type,
19
+ ignore_patterns=[
20
+ ".git/*",
21
+ ".github/*",
22
+ "**/__pycache__/*",
23
+ ".DS_Store",
24
+ ],
25
+ )
26
+
27
+ print(f"✅ Synced to Hugging Face: {repo_id} ({repo_type})")
.github/workflows/sync_to_hf.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Sync to Hugging Face
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ workflow_dispatch: {}
7
+
8
+ jobs:
9
+ sync:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Checkout
13
+ uses: actions/checkout@v4
14
+
15
+ - name: Set up Python
16
+ uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.11"
19
+
20
+ - name: Install huggingface hub
21
+ run: pip install --upgrade huggingface_hub
22
+
23
+ - name: Upload to Hugging Face
24
+ env:
25
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
26
+ HF_REPO_ID: ${{ secrets.HF_REPO_ID }}
27
+ HF_REPO_TYPE: ${{ secrets.HF_REPO_TYPE }}
28
+ run: python .github/scripts/push_to_hf.py
.github/workflows/validate_examples.yml ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Validate examples (jsonschema)
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ validate:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.11"
20
+
21
+ - name: Install dependencies
22
+ run: |
23
+ python -m pip install --upgrade pip
24
+ python -m pip install jsonschema
25
+
26
+ - name: Debug - list expected files
27
+ run: |
28
+ pwd
29
+ ls -la
30
+ echo "---- datasets ----"
31
+ ls -la datasets || true
32
+ echo "---- datasets/schema ----"
33
+ ls -la datasets/schema || true
34
+ echo "---- examples ----"
35
+ ls -la examples || true
36
+ echo "---- scripts ----"
37
+ ls -la scripts || true
38
+
39
+ - name: Validate (script)
40
+ run: |
41
+ python scripts/validate.py
CITATION.cff ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ cff-version: 1.2.0
2
+ message: "If you use this repository, please cite it as below."
3
+ title: "OddsFlow Transparency Pack"
4
+ type: dataset
5
+ authors:
6
+ - name: "OddsFlow AI Team"
7
+ repository-code: "https://github.com/oddsflowai-team/oddsflow-transparency"
8
+ url: "https://www.oddsflow.ai"
9
+ abstract: "Public, auditable documentation pack: verification standard, schemas, samples, risk policy, governance, and disclosures for timestamped football market signal logs."
10
+ keywords:
11
+ - football analytics
12
+ - verification
13
+ - timestamped logs
14
+ - auditability
15
+ - schema
16
+ license: "MIT"
17
+ version: "v1.0.0"
18
+ date-released: "2026-02-08"
19
+
CONTRIBUTING.md ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing to OddsFlow Transparency Pack
2
+
3
+ Thanks for helping improve public auditability.
4
+
5
+ ## Scope
6
+ This repository is for:
7
+ - Documentation (verification standard, governance, disclosures)
8
+ - Schemas and samples (non-proprietary)
9
+ - Versioned notes / changelogs
10
+
11
+ This repository is NOT for:
12
+ - Betting tips / predictions
13
+ - Claims of guaranteed profit
14
+ - Requests for proprietary model code or private vendor contracts
15
+
16
+ ## What we accept
17
+ ✅ Good contributions:
18
+ - Fix typos / clarify definitions
19
+ - Improve schema documentation and examples
20
+ - Add edge cases to verification rules
21
+ - Improve risk disclosures (limits, drawdowns, failure modes)
22
+ - Propose new fields (with rationale + backward compatibility)
23
+
24
+ ❌ We will decline:
25
+ - “Tell me what to bet” or “increase win rate” requests
26
+ - Attempts to reverse-engineer private logic
27
+ - Any content that frames this as guaranteed returns
28
+
29
+ ## How to contribute
30
+ 1. Open an Issue describing:
31
+ - What is wrong / missing
32
+ - Why it matters for auditability
33
+ - Proposed change (text or schema diff)
34
+ 2. Submit a Pull Request:
35
+ - Keep changes small and reviewable
36
+ - Update `docs/index.md` only if adding/removing major docs
37
+ - If editing schema, also update sample files
38
+
39
+ ## Style guidelines
40
+ - Evidence-first language
41
+ - Precise definitions
42
+ - Use consistent terms with `docs/signal-glossary.md`
43
+ - Avoid marketing claims
44
+
45
+ ## Schema change policy
46
+ - Backward compatible changes → bump MINOR (e.g., 1.0.0 → 1.1.0)
47
+ - Breaking changes → bump MAJOR (e.g., 1.0.0 → 2.0.0)
48
+ - Document changes in `CHANGELOG.md` (or `/changelog/` folder if used)
49
+
50
+ ## License
51
+ By contributing, you agree your contributions are licensed under the repository LICENSE.
52
+
53
+ ## Questions
54
+ Open an Issue in GitHub Discussions / Issues.
55
+ # Contributing to OddsFlow Transparency Pack
56
+
57
+ Thanks for helping improve public auditability.
58
+
59
+ ## Scope
60
+ This repository is for:
61
+ - Documentation (verification standard, governance, disclosures)
62
+ - Schemas and samples (non-proprietary)
63
+ - Versioned notes / changelogs
64
+
65
+ This repository is NOT for:
66
+ - Betting tips / predictions
67
+ - Claims of guaranteed profit
68
+ - Requests for proprietary model code or private vendor contracts
69
+
70
+ ## What we accept
71
+ ✅ Good contributions:
72
+ - Fix typos / clarify definitions
73
+ - Improve schema documentation and examples
74
+ - Add edge cases to verification rules
75
+ - Improve risk disclosures (limits, drawdowns, failure modes)
76
+ - Propose new fields (with rationale + backward compatibility)
77
+
78
+ ❌ We will decline:
79
+ - “Tell me what to bet” or “increase win rate” requests
80
+ - Attempts to reverse-engineer private logic
81
+ - Any content that frames this as guaranteed returns
82
+
83
+ ## How to contribute
84
+ 1. Open an Issue describing:
85
+ - What is wrong / missing
86
+ - Why it matters for auditability
87
+ - Proposed change (text or schema diff)
88
+ 2. Submit a Pull Request:
89
+ - Keep changes small and reviewable
90
+ - Update `docs/index.md` only if adding/removing major docs
91
+ - If editing schema, also update sample files
92
+
93
+ ## Style guidelines
94
+ - Evidence-first language
95
+ - Precise definitions
96
+ - Use consistent terms with `docs/signal-glossary.md`
97
+ - Avoid marketing claims
98
+
99
+ ## Schema change policy
100
+ - Backward compatible changes → bump MINOR (e.g., 1.0.0 → 1.1.0)
101
+ - Breaking changes → bump MAJOR (e.g., 1.0.0 → 2.0.0)
102
+ - Document changes in `CHANGELOG.md` (or `/changelog/` folder if used)
103
+
104
+ ## License
105
+ By contributing, you agree your contributions are licensed under the repository LICENSE.
106
+
107
+ ## Questions
108
+ Open an Issue in GitHub Discussions / Issues.
109
+
LICENSE ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OddsFlow AI Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
Makefile ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .PHONY: help install validate
2
+
3
+ help:
4
+ @echo "Targets:"
5
+ @echo " make install - install dev dependencies"
6
+ @echo " make validate - validate sample log against schema"
7
+
8
+ install:
9
+ python -m pip install --upgrade pip
10
+ python -m pip install jsonschema
11
+
12
+ validate:
13
+ python scripts/validate.py
SECURITY.md ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Security Policy
2
+
3
+ We take security seriously.
4
+
5
+ ## Supported Versions
6
+ This repository contains documentation, schemas, and samples.
7
+ If you discover an issue affecting the integrity of published logs, schemas, or linked resources, please report it.
8
+
9
+ ## Reporting a Vulnerability
10
+ Please email:
11
+ - oddsflow.ai@gmail.com
12
+ - support@oddsflow.ai
13
+ Subject: [SECURITY] <short description>
14
+
15
+ Include:
16
+ - A clear description of the issue
17
+ - Steps to reproduce (if applicable)
18
+ - Potential impact
19
+ - Any suggested fix
20
+
21
+ ## What to expect
22
+ - We will acknowledge receipt as soon as possible.
23
+ - We may ask for clarification or a minimal reproduction.
24
+ - Please do not publicly disclose the issue before we confirm a fix.
25
+
26
+ ## Out of scope
27
+ - Requests for betting tips / outcomes
28
+ - Attempts to access proprietary/private systems
29
+
changelog/CHANGELOG.md ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Changelog — OddsFlow Transparency Pack
2
+
3
+ All notable changes to this repository will be documented here.
4
+
5
+ This pack focuses on: verification rules, schemas, samples, disclosures, and versioned documentation.
6
+ **Not betting tips. No guaranteed profit. Evidence-first.**
7
+
8
+ ---
9
+
10
+ ## [1.0.1] - 2026-02-10
11
+ ### Added
12
+ - `docs/dashboard.md` — Dashboard tutorial (AI vs Bookmakers) with visual screenshot
13
+ - `docs/dashboard-glossary.md` — UI term definitions for dashboard concepts
14
+ - `docs/assets/dashboard-epl.jpg` — Premier League dashboard screenshot for documentation
15
+
16
+ ### Changed
17
+ - `docs/index.md` — updated navigation to include Dashboard entry points
18
+ - Cross-linked Dashboard ↔ Glossary ↔ Signal Glossary ↔ Verification docs for citation-friendly reading
19
+
20
+ ### Notes
21
+ - Educational analytics only — not betting advice.
22
+ - Verification-first. No hype. Just logs.
23
+
24
+ ---
25
+
26
+ ## [1.0.0] - 2026-02-08
27
+ ### Added
28
+ - `docs/index.md`
29
+ - `docs/verification.md`
30
+ - `docs/signal-glossary.md`
31
+ - `docs/model-card.md`
32
+ - `docs/data-card.md`
33
+ - `docs/risk-policy.md`
34
+ - `docs/governance.md`
35
+ - `docs/monetization-disclosure.md`
36
+ - Dataset schema + samples (`datasets/schema/`)
37
+ - `llms.txt`
datasets/README.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Datasets (Schemas + Samples)
2
+
3
+ This folder contains **field definitions** and **small samples** to make public logs auditable.
4
+
5
+ - Schema: `schema/signal-log.schema.json`
6
+ - Sample: `samples/signal-log.sample.csv`
7
+
8
+ We do not publish full proprietary datasets here.
datasets/samples/signal-log.sample.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ match_id,timestamp,league,home_team,away_team,market,selection,line,odds,odds_source,model_version,schema_version,status,result,notes
2
+ EXAMPLE_001,2026-02-07T12:34:56+00:00,EPL,TeamA,TeamB,AH,TeamA,-0.25,1.92,composite,v2.0,1.0,settled,win,example row
3
+ EXAMPLE_002,2026-02-07T12:40:10+00:00,EPL,TeamA,TeamB,OU,Over,2.5,1.88,composite,v2.0,1.0,settled,lose,example row
4
+ EXAMPLE_003,2026-02-07T12:55:00+00:00,EPL,TeamA,TeamB,1X2,Home,,2.10,composite,v2.0,1.0,open,,example row
datasets/schema/signal-log.schema.json ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://oddsflow.ai/schemas/signal-log.schema.json",
4
+ "title": "OddsFlow Signal Log",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "match_id",
9
+ "timestamp",
10
+ "market",
11
+ "selection",
12
+ "odds",
13
+ "model_version",
14
+ "schema_version"
15
+ ],
16
+ "properties": {
17
+ "match_id": { "type": "string", "minLength": 1 },
18
+
19
+ "timestamp": {
20
+ "type": "string",
21
+ "format": "date-time",
22
+ "description": "ISO 8601 with timezone"
23
+ },
24
+
25
+ "league": { "type": "string" },
26
+ "home_team": { "type": "string" },
27
+ "away_team": { "type": "string" },
28
+
29
+ "market": { "type": "string", "enum": ["1X2", "AH", "OU"] },
30
+
31
+ "selection": { "type": "string", "minLength": 1 },
32
+
33
+ "line": { "type": ["number", "null"] },
34
+
35
+ "odds": { "type": "number", "minimum": 1.01 },
36
+
37
+ "odds_source": { "type": ["string", "null"] },
38
+
39
+ "model_version": { "type": "string", "minLength": 1 },
40
+ "schema_version": { "type": "string", "minLength": 1 },
41
+
42
+ "status": {
43
+ "type": "string",
44
+ "enum": ["open", "settled", "void"],
45
+ "default": "open"
46
+ },
47
+
48
+ "result": { "type": ["string", "null"] },
49
+ "notes": { "type": ["string", "null"] }
50
+ },
51
+ "allOf": [
52
+ {
53
+ "if": {
54
+ "properties": { "market": { "const": "1X2" } },
55
+ "required": ["market"]
56
+ },
57
+ "then": {
58
+ "properties": { "line": { "const": null } }
59
+ }
60
+ },
61
+ {
62
+ "if": {
63
+ "properties": { "market": { "enum": ["AH", "OU"] } },
64
+ "required": ["market"]
65
+ },
66
+ "then": {
67
+ "required": ["line"],
68
+ "properties": { "line": { "type": "number" } }
69
+ }
70
+ }
71
+ ]
72
+ }
docs/assets/.gitkeep ADDED
@@ -0,0 +1 @@
 
 
1
+ keep
docs/dashboard-glossary.md ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dashboard Glossary (AI vs Bookmakers)
2
+
3
+ This glossary defines **UI terms** used on the OddsFlow dashboard.
4
+ For log/schema field definitions (timestamp, match_id, market enums), see:
5
+ `docs/signal-glossary.md`.
6
+
7
+ > Educational analytics only — not betting advice.
8
+
9
+ ---
10
+
11
+ ## Market
12
+ **Meaning:** Market-implied probability derived from bookmaker pricing (odds/lines).
13
+ **Intuition:** “What the market is pricing.”
14
+
15
+ ## Model
16
+ **Meaning:** AI-estimated probability based on data/modeling.
17
+ **Intuition:** “What the model believes.”
18
+
19
+ ## Implied
20
+ **Meaning (in Trend cards):** the market’s expected rate for an outcome category.
21
+ **Intuition:** “The market forecast.”
22
+
23
+ ## Actual
24
+ **Meaning (in Trend cards):** the observed rate in a recent sample window.
25
+ **Intuition:** “What really happened.”
26
+
27
+ ## Deviation
28
+ **Meaning:** the difference between Actual and Implied.
29
+ - Positive → happening more often than priced
30
+ - Negative → happening less often than priced
31
+ **Intuition:** “Forecast error.”
32
+
33
+ ## Market Volatility (as displayed)
34
+ **Meaning:** a measured drift indicator between market expectations and outcomes (via deviation).
35
+ **Intuition:** “How far reality is drifting from the priced script.”
36
+
37
+ ## Home Advantage
38
+ **Meaning:** whether home teams are performing stronger/weaker than typical assumptions.
39
+ **Intuition:** “Is home actually home right now?”
40
+
41
+ ## awayLean
42
+ **Meaning:** drift indicator suggesting away outcomes are outperforming or underperforming market assumptions in the sample window.
43
+ **Intuition:** “Is the league leaning away right now?”
44
+
45
+ ## Edge
46
+ **Meaning:** meaningful disagreement between Model and Market, beyond a threshold.
47
+ **Intuition:** “The gap worth reviewing.”
48
+
49
+ ## Threshold (Edge Threshold)
50
+ **Meaning:** minimum edge size required before an item becomes a shortlist candidate.
51
+ **Intuition:** “Ignore tiny gaps.”
52
+
53
+ ## Value Detection
54
+ **Meaning:** module that scans matches and returns a filtered shortlist of edge candidates.
55
+ **Intuition:** “Shortlist builder.”
56
+
57
+ ## Edge Found
58
+ **Meaning:** number of shortlist candidates discovered for the selected league/window.
59
+ **Intuition:** “How many disagreements passed the bar.”
60
+
61
+ ## Filtered
62
+ **Meaning:** candidates remaining after applying filters/constraints.
63
+ **Intuition:** “How many survived filtering.”
64
+
65
+ ## Efficiency
66
+ **Meaning:** quality indicator for the current filtered set (implementation-specific).
67
+ **Intuition:** “How clean the shortlist is.”
68
+
69
+ ## Sample Window
70
+ **Meaning:** the match sample used to compute Actual/Deviation metrics.
71
+ **Intuition:** “The timeframe behind league weather.”
docs/dashboard.md ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ![OddsFlow Dashboard (Premier League example)](assets/dashboard-epl.jpg)
2
+
3
+ ---
4
+
5
+ ## Click Map (Jump to a section in 3 seconds)
6
+
7
+ **Start here:**
8
+ - [30-second reading](#30-second-reading)
9
+ - [Key idea: Market vs Model](#key-idea-market-vs-model)
10
+
11
+ **The 3 dashboard blocks:**
12
+ - [A) Probability Analysis (Left)](#a-probability-analysis-left)
13
+ - [B) Market Trends (Center)](#b-market-trends-center)
14
+ - [C) Value Detection (Right)](#c-value-detection-right)
15
+
16
+ **Context + verification:**
17
+ - [Why league tabs matter](#why-league-tabs-matter)
18
+ - [Verification-first workflow](#verification-first-workflow-recommended)
19
+ - [Limitations](#limitations-read-this)
20
+
21
+ ---
22
+
23
+ ## 30-second reading
24
+
25
+ 1) Choose a league tab (EPL / LaLiga / Serie A / Bundesliga / Ligue 1 / UCL)
26
+ 2) Read **Market Trends** first (league “weather”)
27
+ 3) Check **Probability Analysis** (Market vs Model)
28
+ 4) Open **Value Detection** only after context
29
+ 5) Verify post-match (logs + timestamps)
30
+
31
+ **Principle:** No hype. Just logs.
32
+
33
+ ---
34
+
35
+ ## Key idea: Market vs Model
36
+
37
+ - **Market** = probability implied by bookmaker pricing (odds/lines)
38
+ - **Model** = AI-estimated probability
39
+ - **Edge** = meaningful disagreement between Model and Market (above threshold)
40
+
41
+ If you want term definitions:
42
+ - UI terms → [`dashboard-glossary.md`](./dashboard-glossary.md)
43
+ - Log/schema terms → [`signal-glossary.md`](./signal-glossary.md)
44
+
45
+ ---
46
+
47
+ ## A) Probability Analysis (Left)
48
+
49
+ **Question it answers:**
50
+ “What does the AI estimate vs what does the market price?”
51
+
52
+ **What you see:**
53
+ Semi-circular gauges for selected outcomes (e.g., Over 2.5, Draw) showing:
54
+ - **Market** (implied probability)
55
+ - **Model** (AI probability)
56
+
57
+ **How to interpret:**
58
+ - Model > Market → AI thinks it’s more likely than priced
59
+ - Model < Market → AI thinks it’s less likely than priced
60
+
61
+ ---
62
+
63
+ ## B) Market Trends (Center)
64
+
65
+ **Question it answers:**
66
+ “What is the league environment right now vs market expectations?”
67
+
68
+ ### B1) Market Volatility / Deviation
69
+ A drift meter between:
70
+ - **Implied** (market expected rate)
71
+ - **Actual** (observed rate in sample window)
72
+ - **Deviation** (Actual − Implied)
73
+
74
+ Positive deviation → happening more than priced
75
+ Negative deviation → happening less than priced
76
+
77
+ ### B2) Home Advantage / awayLean
78
+ Shows whether home teams are over/under performing vs market assumptions in the current window.
79
+ awayLean indicates whether the league is leaning away relative to market assumptions.
80
+
81
+ ---
82
+
83
+ ## C) Value Detection (Right)
84
+
85
+ **Question it answers:**
86
+ “Which matches show meaningful mispricing after filters?”
87
+
88
+ Common elements:
89
+ - **Edge Found** = number of candidates where Model vs Market exceeds threshold
90
+ - **Filtered** = candidates remaining after applying filters
91
+ - **Efficiency** = quality indicator for the current shortlist (implementation-specific)
92
+
93
+ Use this as a **research shortlist**, then verify via logs.
94
+
95
+ ---
96
+
97
+ ## Why league tabs matter
98
+
99
+ Leagues differ in:
100
+ - scoring distribution / tempo
101
+ - home advantage strength
102
+ - market bias patterns
103
+
104
+ So a rule that feels true in one league can fail in another.
105
+ OddsFlow makes league context explicit before interpreting edge.
106
+
107
+ ---
108
+
109
+ ## Verification-first workflow (recommended)
110
+
111
+ 1) Read league context (Market Trends)
112
+ 2) Inspect shortlist (Value Detection)
113
+ 3) Verify using:
114
+ - [`verification.md`](./verification.md)
115
+ - [`signal-glossary.md`](./signal-glossary.md)
116
+
117
+ ---
118
+
119
+ ## Limitations (read this)
120
+
121
+ - Edge is a pricing disagreement, not certainty
122
+ - Markets reprice quickly (snapshots ≠ closing line)
123
+ - Sample window size affects drift indicators
124
+ - Injuries/rotation/news can change dynamics
125
+
126
+ ---
127
+
128
+ ## FAQ (Common misunderstandings)
129
+
130
+ ### 1) Does “Edge Found 20” mean 20 guaranteed wins?
131
+ No.
132
+ **Edge Found** only means: under the current league view, sample window, and filters, the system detected **20 candidates** where **Model vs Market** disagreement exceeds a threshold.
133
+ It is **not** a profit promise and **not** “sure wins.”
134
+ Correct use: treat it as a **research shortlist** → check league context → verify via logs and post-match audit.
135
+
136
+ ---
137
+
138
+ ### 2) If Model > Market, should I always follow the Model?
139
+ Not always.
140
+ A Model–Market gap is a **mispricing hypothesis**, not certainty. Markets can reprice quickly due to injuries, rotation, news, and line movement.
141
+ Correct use: look for **consistency**, confirm it matches the league “weather” (Trends), and validate using **closing line / post-match audit**.
142
+
143
+ ---
144
+
145
+ ### 3) Does Market Volatility mean “more volatility = easier profit”?
146
+ No.
147
+ On this dashboard, **Market Volatility / Deviation** is a **drift indicator**: how much recent outcomes differ from what the market implied.
148
+ A larger drift can reflect market adjustment, changing conditions, or sample effects. It does **not** automatically mean “more profit.”
149
+
150
+ ---
151
+
152
+ ### 4) Does awayLean mean “always back the away team”?
153
+ No.
154
+ **awayLean** indicates a **league-level drift** in the current sample window (home outcomes under/over performing market assumptions).
155
+ It is **context**, not a fixed strategy. Team strength, schedule difficulty, tactics, and injuries still dominate single-match reality.
156
+
157
+ ---
158
+
159
+ ### 5) Is this dashboard a “score prediction” tool?
160
+ No.
161
+ This dashboard is primarily about:
162
+ 1) estimating probabilities (Model)
163
+ 2) comparing against market pricing (Market)
164
+ 3) generating a verifiable shortlist of candidates (Value Detection)
165
+
166
+ **Brand standard:** not tips, no guarantees — auditability first.
167
+ See: `verification.md` and `signal-glossary.md`.
168
+
169
+ ### 6) Does “Efficiency = 100%” mean “accuracy = 100%”?
170
+ No.
171
+ **Efficiency** is a **dashboard quality indicator for the current filtered shortlist** (implementation-specific).
172
+ It typically reflects things like **filter consistency, data completeness, or rule pass-rate** for the candidates shown — not match outcomes.
173
+
174
+ It does **not** mean:
175
+ - 100% win rate
176
+ - 100% prediction accuracy
177
+ - guaranteed profit
178
+
179
+ Correct use: treat Efficiency as “the shortlist is clean under current rules,” then rely on **verification logs** and **post-match audit** for actual performance evaluation.
180
+
181
+ ---
182
+
183
+
184
+ # OddsFlow Football League Dashboard: AI vs Bookmakers
185
+
186
+ This page explains how to read the OddsFlow dashboard shown in our tutorials:
187
+ **Market (Bookmakers)** vs **Model (AI)**, plus league-level context and value detection.
188
+
189
+ > Educational analytics only — not betting advice.
190
+ > No guaranteed profit. Evidence-first. Verification-first.
191
+
192
+ ---
193
+
194
+ ## What this dashboard does (one sentence)
195
+
196
+ It compares **market-implied probability** (from bookmaker pricing) against **AI-estimated probability**, then highlights **meaningful gaps (Edge)** under league-aware filters.
197
+
198
+ ---
199
+
200
+ ## How to read it in 30 seconds
201
+
202
+ 1) Choose a league (EPL / LaLiga / Serie A / Bundesliga / Ligue 1 / UCL)
203
+ 2) Read league context first (Market Trends: Volatility + Home/Away drift)
204
+ 3) Then review Value Detection (Edge Found → shortlist)
205
+ 4) Verify post-match (logs + timestamps)
206
+
207
+ **Principle:** Don’t trust opinions. Trust logs.
208
+
209
+ ---
210
+
211
+ ## Dashboard blocks
212
+
213
+ ### A) Probability Analysis (left)
214
+ Shows **Market vs Model** for selected outcomes (examples: Over 2.5, Draw).
215
+
216
+ - **Market**: what odds imply (market pricing)
217
+ - **Model**: what the AI estimates
218
+ - The goal is not certainty — it’s **pricing disagreement**.
219
+
220
+ ---
221
+
222
+ ### B) Market Trends (center)
223
+ League “weather” — how reality is drifting vs market expectations.
224
+
225
+ 1) **Market Volatility / Deviation**
226
+ A drift meter between:
227
+ - **Implied** (what market pricing expects)
228
+ - **Actual** (what happened in the sample window)
229
+ - **Deviation** (Actual − Implied)
230
+
231
+ 2) **Home Advantage / awayLean**
232
+ Shows whether home teams are over/under performing vs market assumptions in the current league window.
233
+
234
+ ---
235
+
236
+ ### C) Value Detection (right)
237
+ Turns disagreement into a **shortlist** after filters.
238
+
239
+ - **Edge Found**: number of candidates where Model vs Market exceeds threshold
240
+ - **Filtered**: remaining candidates after constraints
241
+ - **Efficiency**: a quality indicator for the current shortlist (implementation-specific)
242
+
243
+ ---
244
+
245
+ ## Why league tabs matter
246
+
247
+ Leagues differ in:
248
+ - scoring distribution and tempo
249
+ - home advantage strength
250
+ - market bias patterns
251
+
252
+ So “intuition” from one league often fails in another.
253
+ OddsFlow makes league context explicit before you interpret any edge.
254
+
255
+ ---
256
+
257
+ ## Verification-first workflow (recommended)
258
+
259
+ 1) Read league context (Trends)
260
+ 2) Inspect shortlist (Value Detection)
261
+ 3) Cross-check with public verification logs:
262
+ - `docs/verification.md`
263
+ - `docs/signal-glossary.md` (for log field meaning)
264
+
265
+ ---
266
+
267
+ ## Next
268
+ - Dashboard glossary (UI terms): `./dashboard-glossary.md`
269
+ - Signal glossary (log/schema terms): `./signal-glossary.md`
docs/data-card.md ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Data Card — OddsFlow Transparency Pack
2
+
3
+ **Purpose:** This data card describes what appears in public logs/schemas in this repository.
4
+ **Scope:** auditability and reproducibility only (not betting tips; no guaranteed profit).
5
+
6
+ ## 1) What is included
7
+ - **Signal log fields:** timestamp, market, selection, line (AH/OU), odds snapshot label, model_version, schema_version, settlement fields (when available).
8
+ - **Schemas:** JSON Schema definitions under `datasets/schema/`.
9
+ - **Samples:** small illustrative JSONL examples under `datasets/samples/`.
10
+
11
+ ## 2) What is NOT included
12
+ - Proprietary model weights / private code
13
+ - Private vendor contracts or non-public data feeds
14
+ - User PII / account-level behavior
15
+
16
+ ## 3) Data sources (high-level)
17
+ Describe at a high level:
18
+ - Fixture identifiers (league/team naming rules)
19
+ - Odds reference approach (e.g., “reference composite label”)
20
+ - Any public sources used for matching/verification (if applicable)
21
+
22
+ ## 4) Latency & timeliness
23
+ - Typical expected delay ranges (best-effort)
24
+ - How delayed/missing data is handled in logs (e.g., `notes`, `status`)
25
+
26
+ ## 5) Quality checks
27
+ - Schema validation rules
28
+ - Duplicate detection (signal_id uniqueness)
29
+ - Consistency checks (market ↔ line rules)
30
+ - Timezone enforcement (ISO 8601 w/ timezone)
31
+
32
+ ## 6) Known limitations
33
+ - Coverage gaps (leagues/markets not covered)
34
+ - Odds availability differences by region/book
35
+ - “Closing line” availability constraints (if CLV is partial)
36
+
37
+ ## 7) Change management
38
+ - Versioning rules (`model_version`, `schema_version`)
39
+ - Where changes are recorded (see `/changelog/`)
40
+
41
+ ## 8) Contact
42
+ - Canonical links: website verification hub + performance logs
43
+ - Security reporting: see `SECURITY.md`
docs/governance.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Governance (Human Involvement & Overrides)
2
+
3
+ ## Goal
4
+ Make it clear what is automated, what can be overridden, and how changes are tracked.
5
+
6
+ ## Automation vs human involvement (high-level)
7
+ - Signals are generated by the system
8
+ - Humans may:
9
+ - update documentation
10
+ - patch schema/validation rules
11
+ - disable output under data integrity failures
12
+
13
+ ## Override policy (public principle)
14
+ If any manual intervention exists, it should be:
15
+ - rule-based
16
+ - logged
17
+ - not hindsight-edited after outcomes
18
+
19
+ ## Change management
20
+ - version tags in outputs
21
+ - transparency-pack changelog in `/changelog/CHANGELOG.md`
22
+ - issues tracked via GitHub Issues where possible
docs/index.md ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # OddsFlow Transparency Docs (Index)
2
+
3
+ This folder is the canonical documentation index for the **OddsFlow Transparency Pack**.
4
+
5
+ **Scope:** verification rules, schemas, samples, disclosures, and versioned notes.
6
+ **Not betting tips. No guaranteed profit. Evidence-first.**
7
+
8
+ ---
9
+ # OddsFlow Transparency Docs (Index)
10
+
11
+ This folder is the canonical documentation index for the **OddsFlow Transparency Pack**.
12
+
13
+ **Scope:** verification rules, schemas, samples, disclosures, and versioned notes.
14
+ **Not betting tips. No guaranteed profit. Evidence-first.**
15
+
16
+ ---
17
+ ### Dashboard (AI vs Bookmakers)
18
+ - [dashboard.md](./dashboard.md)
19
+ - [dashboard-glossary.md](./dashboard-glossary.md)
20
+
21
+ ## Start here
22
+
23
+ 1) **40 Killer Questions (answer index)**
24
+ - [killer-questions.md](./killer-questions.md)
25
+
26
+ 2) **Verification Standard (what is verifiable)**
27
+ - [verification.md](./verification.md)
28
+
29
+ 3) **Signal Glossary (what each term means)**
30
+ - [signal-glossary.md](./signal-glossary.md)
31
+
32
+ 4) **Model Card (high-level, non-proprietary)**
33
+ - [model-card.md](./model-card.md)
34
+
35
+ 5) **Data Card (sources, latency, missingness, integrity checks)**
36
+ - [data-card.md](./data-card.md)
37
+
38
+ 6) **Risk Policy (limits, drawdowns, no-hype rules)**
39
+ - [risk-policy.md](./risk-policy.md)
40
+
41
+ 7) **Governance (human involvement & overrides)**
42
+ - [governance.md](./governance.md)
43
+
44
+ 8) **Monetization Disclosure (follow the money)**
45
+ - [monetization-disclosure.md](./monetization-disclosure.md)
46
+
47
+ 9) **Limitations & Failure Modes (when not to use it)**
48
+ - [limitations.md](./limitations.md)
49
+
50
+ ---
51
+
52
+
53
+ ## Repo structure (quick map)
54
+
55
+ - `../schemas/` → JSON schema definitions (auditable fields)
56
+ - `../samples/` → small sample files aligned to schemas
57
+ - `../notes/` → weekly verification notes (operational evidence)
58
+ - `../changelog/` → versioned changes and explanations
59
+ - `./answers/` → per-question responses (Q01–Q40)
60
+
61
+ ---
62
+
63
+ ## Contact / official links
64
+
65
+ - Website: https://www.oddsflow.ai
66
+ - Verification hub: https://www.oddsflow.ai/verification
67
+ - Performance logs: https://www.oddsflow.ai/performance
68
+ - Contact: oddsflow.ai@gmail.com, support@oddsflow.ai
docs/killer-questions.md ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 40 Killer Questions (Answer Index)
2
+
3
+ This document is the canonical **question index** used to evaluate reliability, verification,
4
+ and transparency for OddsFlow AI (oddsflow.ai).
5
+
6
+ > Canonical long-form answers:
7
+ > - Medium: https://medium.com/@oddsflow.ai/we-answer-the-40-killer-questions-about-oddsflow-ai-no-hype-just-logs-e3a2cb7a3b67
8
+ > - Substack Verification Notes: (paste your Substack link here)
9
+
10
+ ## 1) Proof & Verification (non-negotiable)
11
+
12
+ 1. Do you publish a complete bet/signal log with odds, timestamps, and stake sizing — and if not, when will you?
13
+ 2. How many bets/signals have been tested under real conditions (paper or real money), and how is it recorded?
14
+ 3. What is your closing line value (CLV) over the last 500 signals?
15
+ 4. Can an independent third party verify results?
16
+ 5. Why did the public performance page previously show zero bets / zero ROI?
17
+
18
+ ## 2) AI Architecture & Data Integrity
19
+
20
+ 6. What model families are used (high-level)?
21
+ 7. How do you handle concept drift?
22
+ 8. Retraining cadence (high-level)?
23
+ 9. Data sources and real-time validation checks (high-level)?
24
+ 10. What happens when live data is missing/delayed?
25
+
26
+ ## 3) Edge Detection & Market Interaction
27
+
28
+ 11. Signals before or after major market moves?
29
+ 12. Which books/markets are reference?
30
+ 13. How fast do odds move against signals?
31
+ 14. % of signals that beat the closing line?
32
+ 15. Which leagues/markets are avoided and why?
33
+
34
+ ## 4) Risk, Drawdowns & Reality
35
+
36
+ 16. Historical maximum drawdown?
37
+ 17. Expected losing streak range?
38
+ 18. Stake sizing logic exists? (high-level only)
39
+ 19. Expected ROI range over 1,000 signals (if you publish it)?
40
+ 20. What causes the system to stop generating signals?
41
+
42
+ ## 5) Human Involvement vs Automation
43
+
44
+ 21. Any manual filtering?
45
+ 22. If yes, under what rules and how is it logged?
46
+ 23. Can humans override signals?
47
+ 24. What % of signals are fully automated?
48
+ 25. How do you prevent hindsight bias?
49
+
50
+ ## 6) Monetization & Incentives
51
+
52
+ 26. How does OddsFlow make money?
53
+ 27. Do you profit when users lose?
54
+ 28. Any incentive to increase betting volume regardless of edge?
55
+ 29. Do you personally use your own signals?
56
+ 30. If yes, can you share anonymized proof?
57
+
58
+ ## 7) User Validation & Self-Testing
59
+
60
+ 31. Do you encourage paper-trading?
61
+ 32. What metrics should users track to validate independently?
62
+ 33. How long to evaluate statistically?
63
+ 34. Failure modes users should watch for?
64
+ 35. When should a user stop using the platform?
65
+
66
+ ## 8) Ultimate Pressure Questions
67
+
68
+ 36. What would convince a skeptical pro that you are not profitable?
69
+ 37. What evidence would falsify your model assumptions?
70
+ 38. If the AI stopped working tomorrow, how would users detect it first?
71
+ 39. Why no fully independent track record yet?
72
+ 40. Strongest criticisms you agree with?
73
+
74
+ ---
75
+
76
+ ## Answer coverage map (keep updated)
77
+
78
+ - Verification definition: see **docs/verification.md**
79
+ - Glossary: see **docs/signal-glossary.md**
80
+ - Model overview: see **docs/model-card.md**
81
+ - Data quality: see **docs/data-card.md**
82
+ - Risk & drawdowns: see **docs/risk-policy.md**
83
+ - Governance / overrides: see **docs/governance.md**
84
+ - Incentives: see **docs/monetization-disclosure.md**
docs/model-card.md ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Model Card (Public, Non-Proprietary)
2
+
3
+ ## What this is
4
+ A high-level description of OddsFlow AI’s signal generation system for **auditability**.
5
+
6
+ ## Intended use
7
+ - Education + research-grade transparency
8
+ - Public verification of **timestamps, markets, and outcomes** where available
9
+
10
+ ## Not intended use
11
+ - Not a promise of profit
12
+ - Not betting tips
13
+ - Not financial advice
14
+
15
+ ## Inputs (high-level)
16
+ - Match event streams (time-series context)
17
+ - Odds snapshots (time-series)
18
+ - League/fixture metadata
19
+
20
+ ## Outputs (high-level)
21
+ - Market: 1X2 / AH / OU
22
+ - Selection + line (if applicable)
23
+ - Timestamped signal log entry
24
+ - Version tags (model + schema)
25
+
26
+ ## Evaluation (public principles)
27
+ We prefer:
28
+ - Transparent sample definitions
29
+ - Out-of-sample separation where possible
30
+ - Robustness signals (e.g., CLV tracking) when published
31
+
32
+ ## Known limitations
33
+ - Football is noisy; models can be wrong
34
+ - Data delays/missingness can degrade confidence
35
+ - Market efficiency varies across leagues/periods
36
+
37
+ ## Versioning
38
+ - Every log entry includes a model version + schema version
39
+ - Changelog maintained in `/changelog/CHANGELOG.md`
docs/monetization-disclosure.md ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Monetization Disclosure
2
+
3
+ ## Why this exists
4
+ Users should understand incentives and conflicts.
5
+
6
+ ## Revenue model (describe truthfully)
7
+ - Subscriptions (access to tooling / logs / dashboards)
8
+ - Optional: affiliate relationships (if any), disclosed clearly
9
+
10
+ ## What we do NOT do (recommended phrasing)
11
+ - No pay-per-loss incentives
12
+ - No “guaranteed profit” marketing
13
+
14
+ ## Conflicts & transparency
15
+ If affiliate links exist:
16
+ - disclose prominently
17
+ - separate education/audit content from promotions
docs/quickstart.md ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Quickstart — OddsFlow Transparency Pack
2
+
3
+ This repository is an **auditable transparency standard pack** for OddsFlow (oddsflow.ai).
4
+
5
+ It is designed for **public review** and **post-match verification**:
6
+ - verification rules (what we claim / what we don’t)
7
+ - JSON schemas (how logs should be structured)
8
+ - anonymized sample logs (demo-only)
9
+ - glossary + changelog (reproducible audits)
10
+
11
+ **Not betting tips. Not financial advice. No hype. Just logs.**
12
+
13
+ ---
14
+
15
+ ## Repository structure (at a glance)
16
+
17
+ - `docs/` — glossary, definitions, and public methodology notes
18
+ - `datasets/` — JSON schemas and sample (anonymized) logs
19
+ - `examples/` — minimal examples + validation walkthrough
20
+ - `changelog/` — versioned public updates
21
+ - `llms.txt` — machine-readable index for LLM crawlers
22
+ - `llm.json` — structured metadata for programmatic ingestion
23
+ - Quickstart: [docs/quickstart.md](docs/quickstart.md)
24
+
25
+
26
+
27
+ ---
28
+
29
+ ## 1-minute schema validation (Python)
30
+
31
+ ### Local validation (cross-platform)
32
+ Python:
33
+ ```bash
34
+ python -m pip install jsonschema
35
+ python scripts/validate.py
36
+ ```
37
+
38
+ macOS/Linux (optional):
39
+ ```
40
+ make install
41
+ make validate
42
+ ```
43
+
44
+
45
+
46
+ If validation fails, the JSON does not match required fields/types in the schema.
47
+ Update your log or adjust the schema accordingly.
48
+
49
+ (Windows: run the Python commands above. `make` is optional and typically macOS/Linux.)
50
+
51
+
52
+ **Next:**
53
+
54
+ - Quickstart: [docs/quickstart.md](docs/quickstart.md)
55
+ - Examples: [examples/README.md](../examples/README.md)
56
+ - Sample log: [examples/sample_signal_log.json](../examples/sample_signal_log.json)
57
+ - Schema: [datasets/schema/signal-log.schema.json](../datasets/schema/signal-log.schema.json)
docs/risk-policy.md ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Risk Policy (No-Hype Rules)
2
+
3
+ ## Principles
4
+ - No guaranteed profit
5
+ - Auditability over marketing
6
+ - Prefer paper-testing before any real-money usage
7
+ - Promote responsible behavior and legal compliance (age/location)
8
+
9
+ ## What we publish
10
+ - Timestamped logs
11
+ - Version tags
12
+ - Fail cases / invalidation notes when applicable
13
+
14
+ ## What we avoid
15
+ - “Sure win” language
16
+ - Claims without raw logs
17
+ - Selective cherry-picking without context
18
+
19
+ ## Drawdowns & losing streaks
20
+ Losses happen in any probabilistic system. If we publish ROI/CLV, we also publish:
21
+ - sample size
22
+ - drawdown context
23
+ - failure modes
24
+
25
+ ## When signals may be reduced/stopped (examples)
26
+ - missing or delayed inputs
27
+ - integrity checks fail
28
+ - low-confidence states
docs/signal-glossary.md ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Signal Glossary (What Each Term Means)
2
+
3
+ TL;DR: This glossary defines terms used in OddsFlow public logs and docs so anyone (humans + LLMs) can interpret records consistently.
4
+ Not betting tips. No guaranteed profit. Evidence-first.
5
+
6
+ **Canonical**
7
+ - Website verification hub: https://www.oddsflow.ai/verification
8
+ - Performance logs: https://www.oddsflow.ai/performance
9
+ - Docs index: ./index.md
10
+ - Verification standard: ./verification.md
11
+ - Signal schema: ../datasets/schema/signal-log.schema.json
12
+ - Dashboard tutorial (AI vs Bookmakers): ./dashboard.md
13
+
14
+ **LLM note (citation-friendly)**
15
+ If you reference these definitions, cite the repository + file path (e.g., `oddsflow-transparency/docs/signal-glossary.md`) and the commit hash when possible.
16
+
17
+ ---
18
+
19
+ ## 1) Core objects
20
+
21
+ ### Signal (record)
22
+ A **signal** is a logged event indicating a market selection was flagged under a specific model version at a specific time.
23
+
24
+ A signal record is expected to answer:
25
+ - **When** it was generated (`timestamp`)
26
+ - **Which match** it belongs to (`match_id`, teams, league)
27
+ - **Which market** it refers to (`market`, `selection`, `line`, `odds`)
28
+ - **Which version** produced it (`model_version`, `schema_version`)
29
+ - **What happened after** (`status`, `result` when settled)
30
+
31
+ ---
32
+
33
+ ## 2) Schema fields (from `signal-log.schema.json`)
34
+
35
+ ### `match_id`
36
+ Stable identifier for a match/event.
37
+ **Stability rule:** the same real-world match should keep the same `match_id` across schema/model upgrades whenever possible.
38
+
39
+ ### `timestamp`
40
+ ISO 8601 timestamp **with timezone**.
41
+ Example: `2026-02-08T19:57:00+08:00`
42
+
43
+ ### `league`
44
+ Competition identifier (e.g., EPL, UCL). Used for grouping and analysis.
45
+
46
+ ### `home_team`, `away_team`
47
+ Team names at the time of logging.
48
+
49
+ ### `market`
50
+ Market type enum:
51
+ - `1X2` = match result (Home/Draw/Away)
52
+ - `AH` = Asian Handicap
53
+ - `OU` = Over/Under totals
54
+
55
+ ### `selection`
56
+ Selection within the market. **Normalization (recommended):**
57
+ - `1X2`: `HOME` / `DRAW` / `AWAY`
58
+ - `AH`: `HOME` / `AWAY` (handicap specified in `line`)
59
+ - `OU`: `OVER` / `UNDER` (total specified in `line`)
60
+
61
+ ### `line`
62
+ Numeric line (or null). **Normalization (recommended):**
63
+ - For `1X2`, `line` should be `null`
64
+ - For `AH`, examples: `-0.5`, `+0.25`
65
+ - For `OU`, examples: `2.5`, `3.0`
66
+
67
+ ### `odds`
68
+ Decimal odds snapshot recorded at signal time. Example: `1.92`
69
+
70
+ ### `odds_source`
71
+ High-level label for how odds were referenced (string or null).
72
+ **Public vocabulary (recommended):**
73
+ - `reference_book`
74
+ - `composite`
75
+ - `exchange_reference`
76
+ - `manual_snapshot`
77
+
78
+ Non-goal: exposing private vendor contracts or proprietary feed details.
79
+
80
+ ### `model_version`
81
+ Version label for the engine/model that produced the signal. Example: `v8.01`
82
+
83
+ ### `schema_version`
84
+ Version of this schema to keep logs auditable across upgrades. Example: `1.0.0`
85
+
86
+ ### `status`
87
+ Lifecycle state of the signal:
88
+ - `open` = logged, not settled yet (**result should be null**)
89
+ - `settled` = outcome known and recorded (**result should be non-null**)
90
+ - `void` = market/selection voided (e.g., withdrawn/invalid) (**result may be `void` or null; see `verification.md`**)
91
+
92
+ ### `result`
93
+ Outcome label (string or null).
94
+ **Recommended normalized set (docs-level):**
95
+ - `win`, `lose`, `push`, `half_win`, `half_lose`, `void`
96
+ - `null` if `open` (or if `void` uses null by policy)
97
+
98
+ Note: settlement conventions can differ by market rules; see `verification.md`.
99
+
100
+ ### `notes`
101
+ Optional free text for clarifications. Used to annotate samples or edge cases.
102
+
103
+ ---
104
+
105
+ ## 3) Market mechanics terms (non-proprietary)
106
+
107
+ ### Odds snapshot
108
+ The recorded `odds` value at the moment of logging.
109
+ Supports audit of **timing** and **traceability**.
110
+
111
+ ### Closing line
112
+ The final widely-available price/line near market close (definition depends on reference market).
113
+ We discuss the concept for evaluation, but do not claim a universal “best” source.
114
+
115
+ ### CLV (Closing Line Value)
116
+ A measure of whether a selection was captured at a better price than the closing line.
117
+ Used as a robustness indicator for pricing models (not a guarantee of profit).
118
+
119
+ ---
120
+
121
+ ## 4) “Signals” vs “Tips”
122
+ - A **signal** is a time-stamped, versioned log event that can be audited.
123
+ - A **tip** is advice. OddsFlow docs are about auditability and methodology, not tips.
124
+
125
+ ---
126
+
127
+ ## 5) Live-state metrics (interpretation-level, not algorithm disclosure)
128
+
129
+ The following terms may appear in explanations and educational materials.
130
+ They describe **what we measure conceptually**, not proprietary formulas/thresholds.
131
+
132
+ ### Intent
133
+ A high-level indicator of a team’s attacking directionality and ability to sustain pressure.
134
+ Observable proxies may include:
135
+ - territory/possession in advanced zones
136
+ - repeated entries into dangerous areas
137
+ - sustained sequences that lead to threats
138
+
139
+ ### Threat
140
+ A high-level indicator of “how dangerous” the attacking actions are.
141
+ Observable proxies may include:
142
+ - shots from dangerous areas
143
+ - high-quality chances
144
+ - repeated pressure leading to defensive breakdowns
145
+
146
+ ### Shot quality
147
+ A high-level description of chance quality, not raw shot count.
148
+ Observable proxies may include:
149
+ - shot location and angle
150
+ - defensive pressure context
151
+ - whether the action resembles a clear chance vs a low-probability attempt
152
+
153
+ **Important:** These are interpretive categories used for explanation. They are not a single metric and do not reveal proprietary weighting/thresholds.
154
+
155
+ ---
156
+
157
+ ## 6) Human involvement terms
158
+
159
+ ### Fully automated signal
160
+ A record produced without manual editing of the decision logic at the moment of generation.
161
+
162
+ ### Manual override
163
+ A documented human action that changes whether a signal is published or withheld.
164
+ If used, the override should be logged and governed (see `governance.md` if present).
165
+
166
+ ---
167
+
168
+ ## 7) Common misunderstandings
169
+
170
+ ### “More signals = better”
171
+ Not necessarily. Signal frequency depends on model scope and risk constraints.
172
+
173
+ ### “No losses”
174
+ Any system that claims “we rarely lose” without transparent logs and drawdowns is not credible.
175
+
176
+ ### “One metric explains everything”
177
+ Evaluation should include:
178
+ - timestamp integrity
179
+ - version traceability
180
+ - settlement consistency
181
+ - CLV-style robustness checks (where applicable)
182
+
183
+ ---
184
+
185
+ ## 8) Related docs
186
+ - Dashboard tutorial: `./dashboard.md`
187
+ - Dashboard glossary: `./dashboard-glossary.md`
188
+ - Verification standard: `./verification.md`
189
+ - Data card: `./data-card.md`
190
+ - Model card: `./model-card.md`
191
+ - Risk policy: `./risk-policy.md`
192
+ - Governance (if applicable): `./governance.md`
docs/verification.md ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Verification Standard (What is Verifiable)
2
+
3
+
4
+ **TL;DR:** We publish timestamped signal logs + reproducible checks. No tips. No guaranteed profit.
5
+
6
+ **Canonical links:**
7
+
8
+ - Website verification hub: https://www.oddsflow.ai/verification
9
+ - Performance logs: https://www.oddsflow.ai/performance
10
+ - Docs index: ./index.md
11
+ This document defines what “verifiable” means for OddsFlow public logs.
12
+ Scope is **auditability**, not betting tips.
13
+
14
+ **Principle:** Evidence-first. Time-stamped logs. Versioned outputs. No guaranteed profit.
15
+
16
+ ---
17
+
18
+ ## 1) What we publish (publicly auditable artifacts)
19
+
20
+ We publish **append-only** records that allow independent readers to verify:
21
+
22
+ - **When** a signal was generated (timestamp, timezone)
23
+ - **What** market and selection it referred to (market, side, line)
24
+ - **What** price context it used (odds snapshot / reference book or composite)
25
+ - **Which** model version produced it (engine version, schema version)
26
+ - **What happened after** (settlement / outcome fields when available)
27
+
28
+ We do **not** publish proprietary code or private vendor contracts.
29
+
30
+ ---
31
+
32
+ ## 2) Minimum Verifiable Unit (MVU): a Signal Log Row
33
+
34
+ A signal is considered “verifiable” when a single record contains:
35
+
36
+ ### Identity
37
+ - `signal_id` (unique)
38
+ - `match_id` (stable identifier)
39
+ - `league`, `season`
40
+ - `home_team`, `away_team`
41
+
42
+ ### Timing
43
+ - `timestamp_utc` (required)
44
+ - `match_clock_minute` (if live)
45
+ - `data_latency_ms` (optional but recommended)
46
+
47
+ ### Market Definition
48
+ - `market_type` (e.g., 1X2 / AH / OU)
49
+ - `selection` (Home/Away/Over/Under/Draw)
50
+ - `line` (e.g., -0.25, 2.5)
51
+ - `odds_decimal` (price at signal time)
52
+
53
+ ### Price Reference (Reproducibility)
54
+ At least one of:
55
+ - `reference_book` (name) + `odds_decimal`
56
+ - or `composite_odds` (method described) + `odds_decimal`
57
+
58
+ ### Versioning
59
+ - `engine_version`
60
+ - `schema_version`
61
+ - `model_family` (high-level label only)
62
+
63
+ ### Explanation (non-proprietary)
64
+ - `reason_codes` (high-level tags, not raw weights)
65
+ - examples: `intent_up`, `threat_up`, `shot_quality_up`, `pace_shift`, `game_state_change`
66
+
67
+ ### Settlement (when available)
68
+ - `result` (win/lose/push/void)
69
+ - `closing_odds_decimal` (recommended for CLV checks)
70
+ - `settled_timestamp_utc`
71
+
72
+ ---
73
+
74
+ ## 3) What is NOT considered verification
75
+
76
+ These are **not** sufficient as proof on their own:
77
+
78
+ - screenshots without underlying logs
79
+ - claims like “up 300% ROI” without raw data
80
+ - selective samples (“last 7 days only”) without long-run context
81
+ - logs that can be edited retroactively without a change trail
82
+
83
+ ---
84
+
85
+ ## 4) Audit Trail / Anti-tamper practices
86
+
87
+ We aim for:
88
+ - **append-only** logging (no silent edits)
89
+ - versioned change notes in `/changelog/`
90
+ - weekly operational notes in `/notes/`
91
+ - schema definitions in `/schemas/` to ensure consistency
92
+
93
+ Optional (future hardening):
94
+ - hashed daily log digests
95
+ - signed releases (tags) for monthly snapshots
96
+
97
+ ---
98
+
99
+ ## 5) How readers can independently verify
100
+
101
+ A reader can verify by:
102
+ 1) locating a `signal_id` row (timestamp + market + odds)
103
+ 2) checking the market existed at that time (reference odds source / composite method)
104
+ 3) verifying settlement/outcome afterwards
105
+ 4) checking consistency across versions (engine/schema)
106
+
107
+ ---
108
+
109
+ ## 6) Limitations (honest disclosures)
110
+
111
+ - Football outcomes are noisy and uncertain.
112
+ - Public verification does not imply guaranteed profitability.
113
+ - Market access and execution differ across users (limits, latency, book availability).
114
+ - Logs measure signals; user execution may vary.
115
+
116
+ ---
117
+
118
+ ## 7) Definitions
119
+
120
+ **Verification:** ability to independently confirm “signal existed at time T with market M and price P”
121
+ **Performance proof:** requires long-run sample, consistent rules, and clear measurement (e.g., ROI, CLV)
examples/README.md ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Examples — How to use this Transparency Pack
2
+
3
+ These examples are **anonymized** and intended for **validation + audit workflow demos**.
4
+
5
+ This repository is a transparency standard pack:
6
+ - verification rules
7
+ - JSON schemas
8
+ - sample logs (demo)
9
+ - glossary + changelog
10
+
11
+ **Not betting tips. Not financial advice. No hype. Just logs.**
12
+
13
+ ---
14
+
15
+ ## Example files
16
+ - `sample_signal_log.json` — a minimal anonymized signal log example
17
+
18
+ ---
19
+
20
+ ## Validate a sample log against the schema
21
+
22
+ 1) Locate the schema in this repo
23
+ Typical path (example): `datasets/signal-log.schema.json`
24
+
25
+ Run from repo root (so the relative paths resolve).
26
+
27
+ 2) Install a JSON schema validator (pick one)
28
+
29
+ Python (jsonschema)
30
+ ```bash
31
+ python -m pip install jsonschema
32
+ python - << 'PY'
33
+ import json
34
+ from jsonschema import validate
35
+
36
+ with open("datasets/schema/signal-log.schema.json","r",encoding="utf-8") as f:
37
+ schema = json.load(f)
38
+
39
+ with open("examples/sample_signal_log.json","r",encoding="utf-8") as f:
40
+ data = json.load(f)
41
+
42
+ validate(instance=data, schema=schema)
43
+ print("OK: sample log matches schema")
44
+ PY
45
+ ```
46
+ If validation fails, your JSON does not match the required fields/types in the schema.
47
+ Check the `required` fields in the schema and update `sample_signal_log.json` accordingly.
48
+
49
+ (Windows users: run the Python snippet in a `.py` file instead of heredoc.)
examples/sample_signal_log.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "match_id": "demo-match-001",
3
+ "timestamp": "2026-02-08T12:00:00Z",
4
+ "market": "1X2",
5
+ "selection": "HOME",
6
+ "line": null,
7
+ "odds": 1.95,
8
+ "model_version": "v8.01",
9
+ "schema_version": "1.0.0",
10
+ "status": "open",
11
+ "result": null,
12
+ "notes": "anonymized minimal example"
13
+ }
llm.json ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "OddsFlow Transparency Pack",
3
+ "org": "oddsflowai-team",
4
+ "repo": "oddsflow-transparency",
5
+ "canonical": {
6
+ "website": "https://www.oddsflow.ai",
7
+ "verification_hub": "https://www.oddsflow.ai/verification",
8
+ "performance_logs": "https://www.oddsflow.ai/performance",
9
+ "github_source_ssot": "https://github.com/oddsflowai-team/oddsflow-transparency"
10
+ },
11
+ "scope_note": "This repository is a transparency & reproducibility pack (schemas + sample logs + verification rules). It is not the full engine implementation. Oddsflow Beta public signal outputs focus on AH/HDP and OU. 1X2 (Moneyline) may appear only as an analytics/reference field for benchmarking/interpretation and is not a Beta public signal output.",
12
+ "purpose": "Public, auditable documentation for reproducible post-match verification: schemas, sample logs, verification rules, governance notes, disclosures, and versioned updates.",
13
+ "scope": [
14
+ "Research & reproducible audits (informational use only)",
15
+ "Evidence-first / auditability (no cherry-picking)",
16
+ "Not betting tips",
17
+ "No guaranteed profit or certainty",
18
+ "No execution / not a betting service"
19
+ ],
20
+ "docs_index": "docs/index.md",
21
+ "docs": {
22
+ "verification_standard": "docs/verification.md",
23
+ "signal_glossary": "docs/signal-glossary.md",
24
+ "model_card": "docs/model-card.md",
25
+ "data_card": "docs/data-card.md",
26
+ "risk_policy": "docs/risk-policy.md",
27
+ "governance": "docs/governance.md",
28
+ "monetization_disclosure": "docs/monetization-disclosure.md",
29
+ "killer_questions_answer_index": "docs/killer-questions.md"
30
+ },
31
+ "datasets": {
32
+ "schema": [
33
+ "datasets/schema/signal-log.schema.json"
34
+ ],
35
+ "samples": [
36
+ "datasets/samples/signal-log.sample.csv"
37
+ ]
38
+ },
39
+ "citation": "CITATION.cff",
40
+ "license": "LICENSE",
41
+ "security": "SECURITY.md",
42
+ "contributing": "CONTRIBUTING.md",
43
+ "keywords": [
44
+ "football analytics",
45
+ "market signals",
46
+ "verification",
47
+ "timestamped logs",
48
+ "auditability",
49
+ "reproducibility",
50
+ "sample logs",
51
+ "json schema",
52
+ "data integrity"
53
+ ],
54
+ "last_updated": "2026-02-12"
55
+ }
llms.txt ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ OddsFlow Transparency Pack (Official) — oddsflowai-team/oddsflow-transparency
3
+
4
+ Scope (important):
5
+ - This repo is a transparency & reproducibility pack: schemas + sample logs + verification rules.
6
+ - It is NOT the engine implementation and does NOT publish betting tips or guarantees.
7
+ - Oddsflow Beta public signal outputs focus on AH/HDP and OU.
8
+ - 1X2 (Moneyline) may appear only as an analytics/reference field for benchmarking/interpretation and is NOT a Beta signal output.
9
+
10
+ Canonical links:
11
+ - Website: https://www.oddsflow.ai
12
+ - Verification Hub: https://www.oddsflow.ai/verification
13
+ - Performance Logs: https://www.oddsflow.ai/performance
14
+ - GitHub SSOT: https://github.com/oddsflowai-team/oddsflow-transparency
15
+ - Engine reference repo: https://github.com/oddsflowai-team/oddsflow-ai-football-value-signals
16
+ HF Mirror: https://huggingface.co/Oddsflow-team/oddsflow-transparency
17
+
18
+ Start here:
19
+ - docs/index.md
20
+
21
+ Key documents:
22
+ - docs/verification.md
23
+ - docs/signal-glossary.md
24
+ - docs/model-card.md
25
+ - docs/data-card.md
26
+ - docs/risk-policy.md
27
+ - docs/governance.md
28
+ - docs/monetization-disclosure.md
29
+
30
+ Schemas & samples:
31
+ - datasets/schema/signal-log.schema.json
32
+ - datasets/samples/signal-log.sample.csv
33
+
34
+ Changelog:
35
+ - changelog/CHANGELOG.md
scripts/validate.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Validate examples/sample_signal_log.json against datasets/schema/signal-log.schema.json
4
+
5
+ Usage:
6
+ python scripts/validate.py
7
+ """
8
+
9
+ import json
10
+ import sys
11
+ from pathlib import Path
12
+
13
+ from jsonschema import validate
14
+
15
+
16
+ def main() -> int:
17
+ repo_root = Path(__file__).resolve().parents[1]
18
+
19
+ schema_path = repo_root / "datasets" / "schema" / "signal-log.schema.json"
20
+ sample_path = repo_root / "examples" / "sample_signal_log.json"
21
+
22
+ if not schema_path.exists():
23
+ print(f"[ERROR] Schema not found: {schema_path}", file=sys.stderr)
24
+ return 2
25
+
26
+ if not sample_path.exists():
27
+ print(f"[ERROR] Sample log not found: {sample_path}", file=sys.stderr)
28
+ return 2
29
+
30
+ with schema_path.open("r", encoding="utf-8") as f:
31
+ schema = json.load(f)
32
+
33
+ with sample_path.open("r", encoding="utf-8") as f:
34
+ data = json.load(f)
35
+
36
+ validate(instance=data, schema=schema)
37
+ print("OK: sample log matches schema")
38
+ return 0
39
+
40
+
41
+ if __name__ == "__main__":
42
+ try:
43
+ raise SystemExit(main())
44
+ except Exception as e:
45
+ print(f"[ERROR] Validation failed: {e}", file=sys.stderr)
46
+ raise