Open-source security posture of the data/ML stack (weekly)
Weekly security-health snapshot of a curated ~138-repository data/ML open-source universe (ML frameworks, LLM tooling, data processing, viz, orchestration, MLOps, serving, vector DBs, ...), from the official keyless OpenSSF Scorecard REST API (CDLA-Permissive-2.0, attribution required). Each repo is deduplicated on its canonical owner/name identity and carries its curated category + criticality tier (1 foundational .. 3 niche), the upstream 0-10 overall score, the scan date, and a 12-check security panel (Code-Review, Maintained, Branch-Protection, Token-Permissions, Signed-Releases, Binary-Artifacts, Dependency-Update-Tool, Vulnerabilities, Dangerous-Workflow, Pinned-Dependencies, Packaging, Fuzzing) where upstream -1 (inconclusive) becomes an honest null. A documented 0-100 security_score = 100 * mean(conclusive checks) / 10 is ranked as security_rank (ties: upstream overall desc, missing last, then repo asc) and bucketed into security_grade A (>= 80), B (>= 65), C (>= 50), D (>= 35), F (< 35). weakest_check names the lowest conclusive check (the highest-leverage fix); repos that 404, are unscanned, or have fewer than 4 conclusive checks are excluded. Week-granular as-of stamping makes same-week re-runs hash-identical. Columns: snapshot week, fetch timestamp, repo, source URL, category, criticality, overall score, scan date, 12 check scores, conclusive-check count, security score/grade/rank, weakest check + score. Primary key: (snapshot_week, repo). Cadence: weekly. Nullability: individual check columns null when Scorecard reports inconclusive (-1); weakest_check_score null only when no conclusive check exists (row excluded). Caveats: only projects scanned by Scorecard appear — the universe is curated, not an exhaustive registry; a Scorecard rescan later in the week can change snapshot content; the composite is an unweighted mean of conclusive checks, a comparison heuristic, not a risk model. Security scores, grades and the ranking are derived signals computed by this connector. Sample use: filter criticality = 1 for the foundational stack, order by security_rank, read weakest_check for the first fix to make.
- Rows
- 108
- Columns
- 26
- Source cadence
- Weekly
- Last refreshed
- Sep 25, 2026
- Theme
- technology
| Column | Type | Description |
|---|---|---|
| snapshot_week | string | ISO week of the fetch day (YYYY-Www); the logical snapshot identity together with repo. (unit: ISO week) |
| fetched_at | string | Fetch timestamp, day-granular: the fetch day at 00:00 UTC. Same-week re-runs produce identical snapshots. (unit: ISO datetime) |
| repo | string | Canonical GitHub repo identity (owner/name); the primary row identity. Deduplicated, never repaired. (unit: id) |
| source_url | string | Canonical repo URL (github.com/owner/name); per-row provenance. (unit: url) |
| category | string | Deterministic data/ML category from the curated taxonomy (ml-frameworks, llm-tooling, data-processing, ...). (unit: category) |
| criticality | integer | Curated criticality tier: 1 foundational (a compromise hits the whole stack), 2 widely deployed, 3 niche/specialized. (unit: tier) |
| score_10 | float | Upstream OpenSSF Scorecard overall score, 0-10; null when the scan is inconclusive. (unit: score) |
| scan_date | string | Date Scorecard scanned the repo (YYYY-MM-DD); scores reflect this commit, not the fetch day. (unit: date) |
| check_code_review | float | OpenSSF Scorecard 'Code-Review' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_maintained | float | OpenSSF Scorecard 'Maintained' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_branch_protection | float | OpenSSF Scorecard 'Branch-Protection' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_token_permissions | float | OpenSSF Scorecard 'Token-Permissions' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_signed_releases | float | OpenSSF Scorecard 'Signed-Releases' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_binary_artifacts | float | OpenSSF Scorecard 'Binary-Artifacts' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_dependency_update_tool | float | OpenSSF Scorecard 'Dependency-Update-Tool' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_vulnerabilities | float | OpenSSF Scorecard 'Vulnerabilities' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_dangerous_workflow | float | OpenSSF Scorecard 'Dangerous-Workflow' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_pinned_dependencies | float | OpenSSF Scorecard 'Pinned-Dependencies' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_packaging | float | OpenSSF Scorecard 'Packaging' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| check_fuzzing | float | OpenSSF Scorecard 'Fuzzing' check, 0-10; null when Scorecard reports inconclusive (-1). CDLA-Permissive-2.0. (unit: score) |
| n_checks_conclusive | integer | Number of panel checks with a conclusive score (>= 0). Rows below 4 are excluded. (unit: count) |
| security_score | float | Documented composite, 0-100: 100 * mean(conclusive check scores) / 10. A comparison heuristic — not a quantified risk measure. (unit: score) |
| security_grade | string | security_score buckets: A (>= 80), B (>= 65), C (>= 50), D (>= 35), F (< 35). (unit: grade) |
| weakest_check | string | Lowest conclusive check (the highest-leverage fix for this project); alphabetical tie-break. (unit: check) |
| weakest_check_score | float | 0-10 score of weakest_check. (unit: score) |
| security_rank | integer | Rank by security_score descending (1 = best posture); ties broken by upstream overall score desc (missing last), then repo. (unit: rank) |
First 10 sample rows — a preview, not the complete dataset.
| snapshot_week | fetched_at | repo | source_url | category | criticality | score_10 | scan_date | check_code_review | check_maintained | check_branch_protection | check_token_permissions | check_signed_releases | check_binary_artifacts | check_dependency_update_tool | check_vulnerabilities | check_dangerous_workflow | check_pinned_dependencies | check_packaging | check_fuzzing | n_checks_conclusive | security_score | security_grade | weakest_check | weakest_check_score | security_rank |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-W39 | 2026-09-25T00:00:00+00:00 | scikit-learn/scikit-learn | https://github.com/scikit-learn/scikit-learn | ml-frameworks | 1 | 9.4 | 2026-09-21 | 10 | 10 | — | — | — | 10 | — | — | — | — | — | 10 | 4 | 100 | A | binary_artifacts | 10 | 1 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | deepset-ai/haystack | https://github.com/deepset-ai/haystack | llm-tooling | 3 | 9.4 | 2026-09-21 | 10 | 10 | 8 | 10 | — | 10 | 10 | 10 | 10 | 5 | 10 | 10 | 11 | 93.64 | A | pinned_dependencies | 5 | 2 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | matplotlib/matplotlib | https://github.com/matplotlib/matplotlib | viz | 2 | 9.1 | 2026-09-21 | 10 | 10 | 8 | 10 | — | 10 | — | — | 10 | 6 | — | 10 | 8 | 92.5 | A | pinned_dependencies | 6 | 3 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | optuna/optuna | https://github.com/optuna/optuna | mlops | 3 | 8.1 | 2026-09-21 | 10 | 10 | — | 9 | — | 10 | — | — | 10 | 10 | 10 | 0 | 8 | 86.25 | A | fuzzing | 0 | 4 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | pymc-devs/pymc | https://github.com/pymc-devs/pymc | probabilistic | 3 | 8 | 2026-09-21 | 10 | 10 | — | 10 | — | 10 | — | — | 10 | 8 | 10 | 0 | 8 | 85 | A | fuzzing | 0 | 5 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | onnx/onnx | https://github.com/onnx/onnx | serving | 2 | 8.7 | 2026-09-25 | 10 | 10 | 8 | 10 | — | 10 | 10 | 0 | 10 | 5 | 10 | 10 | 11 | 84.55 | A | vulnerabilities | 0 | 6 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | keras-team/keras | https://github.com/keras-team/keras | ml-frameworks | 2 | 7.7 | 2026-09-25 | 10 | 10 | 0 | 9 | — | 10 | 10 | 5 | 10 | 5 | 10 | 10 | 11 | 80.91 | A | branch_protection | 0 | 7 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | numpy/numpy | https://github.com/numpy/numpy | ml-frameworks | 1 | 7.9 | 2026-09-25 | 9 | 10 | 3 | 10 | 0 | 10 | 10 | 10 | 10 | 3 | — | 10 | 11 | 77.27 | B | signed_releases | 0 | 8 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | apache/airflow | https://github.com/apache/airflow | orchestration | 2 | 7.3 | 2026-09-21 | 10 | 10 | 6 | — | 8 | 10 | — | — | — | 0 | — | 10 | 7 | 77.14 | B | pinned_dependencies | 0 | 9 |
| 2026-W39 | 2026-09-25T00:00:00+00:00 | openai/openai-python | https://github.com/openai/openai-python | llm-tooling | 2 | 7.9 | 2026-09-21 | 10 | 10 | 1 | 8 | — | 10 | — | — | 10 | 9 | 10 | 0 | 9 | 75.56 | B | fuzzing | 0 | 10 |
Profiled Sep 25, 2026 from snapshot 20260925T162310Z-a3e7d215db4f
Measured- Completeness
- 86.4%
- Rows
- 108
- Columns
- 26
- Columns with gaps
- 8
| Column | Missing | Distinct | Range | Distribution |
|---|---|---|---|---|
| snapshot_weekvarchar | 0% | 1 | — |
|
| fetched_atvarchar | 0% | 1 | — |
|
| repovarchar | 0% | 109 | — |
|
| source_urlvarchar | 0% | 116 | — |
|
| categoryvarchar | 0% | 20 | — |
|
| criticalitybigint | 0% | 3 | 1 → 3median 3 | |
| score_10double | 0% | 43 | 2.6 → 9.4median 5.7 | 4 outside 1st–99th percentile |
| scan_datevarchar | 0% | 6 | — |
|
| check_code_reviewdouble | 0% | 12 | 0 → 10median 8 | |
| check_maintaineddouble | 0% | 10 | 0 → 10median 10 | |
| check_branch_protectiondouble | 50.9% | 7 | 0 → 8median 3 | |
| check_token_permissionsdouble | 4.6% | 6 | 0 → 10median 0 | |
| check_signed_releasesdouble | 63% | 2 | 0 → 8median 0 | |
| check_binary_artifactsdouble | 0% | 6 | 0 → 10median 10 | 2 outside 1st–99th percentile |
| check_dependency_update_tooldouble | 89.8% | 2 | 0 → 10median 10 | |
| check_vulnerabilitiesdouble | 88.9% | 3 | 0 → 10median 10 | |
| check_dangerous_workflowdouble | 3.7% | 2 | 0 → 10median 10 | |
| check_pinned_dependenciesdouble | 4.6% | 11 | 0 → 10median 0 | |
| check_packagingdouble | 49.1% | 1 | 10 → 10median 10 | |
| check_fuzzingdouble | 0% | 2 | 0 → 10median 0 | |
| n_checks_conclusivebigint | 0% | 7 | 4 → 11median 8 | 2 outside 1st–99th percentile |
| security_scoredouble | 0% | 85 | 23.33 → 100median 54.72 | 4 outside 1st–99th percentile |
| security_gradevarchar | 0% | 5 | — |
|
| weakest_checkvarchar | 0% | 9 | — |
|
| weakest_check_scoredouble | 0% | 4 | 0 → 10median 0 | 2 outside 1st–99th percentile |
| security_rankbigint | 0% | 105 | 1 → 108median 54.5 | 4 outside 1st–99th percentile |
- Current
20260925T162310Z-a3e7d215db4f · sha256 a3e7d215db4f…
108 rows · first snapshot
Point any LLM at the metadata endpoint — the documentation above is machine-readable too (JSON-LD + Croissant).
curl "https://datazimuts.com/v1/datasets/ossf_stack_security/ossf_stack_security_weekly" | jq '{title, rows, columns_count, license}'import requests
ds = requests.get("https://datazimuts.com/v1/datasets/ossf_stack_security/ossf_stack_security_weekly").json()
print(ds["title"], ds["rows"], "rows")
# Sample rows for an LLM context window
for row in ds.get("sample_rows", [])[:5]:
print(row)API endpoint: https://datazimuts.com/v1/datasets/ossf_stack_security/ossf_stack_security_weekly
Tip: fetch /llms.txt for the full machine-readable catalog.
Where this data comes from and what was made from it. Other people's work shows as counts; only shared projects are named.
Cite this snapshot
Pinned to snapshot 20260925T162310Z-a3e7d215db4f and its content hash, so readers get exactly the data you used.
OpenSSF Scorecard, data/ML stack posture (agent-curated). (2026). Open-source security posture of the data/ML stack (weekly) [Data set, snapshot 20260925T162310Z-a3e7d215db4f, sha256 a3e7d215db4f]. Datazimuts. Retrieved 2026-09-25, from https://datazimuts.com/en/datasets/ossf_stack_security/ossf_stack_security_weekly?snapshot=20260925T162310Z-a3e7d215db4f
@misc{dz_ossf_stack_security_ossf_stack_security__a3e7d215,
title = {{Open-source security posture of the data/ML stack (weekly)}},
author = {{OpenSSF Scorecard, data/ML stack posture (agent-curated)}},
year = {2026},
publisher = {Datazimuts},
howpublished = {\url{https://datazimuts.com/en/datasets/ossf_stack_security/ossf_stack_security_weekly?snapshot=20260925T162310Z-a3e7d215db4f}},
note = {Snapshot 20260925T162310Z-a3e7d215db4f, sha256 a3e7d215db4fa6341b9b4e09b9cd6c866918d990e36cb541138776328fddab0d; accessed 2026-09-25}
}Embed a table or a chart
Paste this into any page. The embed is pinned to the same snapshot, follows the reader's light or dark setting, and always shows the source, license and a link back.
<iframe src="https://datazimuts.com/embed/chart?dataset=ossf_stack_security%2Fossf_stack_security_weekly&lang=en&theme=auto&snapshot=20260925T162310Z-a3e7d215db4f&x=scan_date&y=criticality&agg=avg" title="Open-source security posture of the data/ML stack (weekly)" width="100%" height="380" style="border:0" loading="lazy"></iframe>
Ask about this dataset. Answers come only from its catalog record, measured profile and change history, and list the facts they used.