ceres-publish-dataset — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ceres-publish-dataset (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Recurring monthly workflow to export the Ceres open data index to HuggingFace as a curated Parquet dataset.
Tracking issue: https://github.com/AndreaBozzo/Ceres/issues/89
ceres export --format parquet --output ~/ceres-open-data-indexREADME.md dataset card (counts, portal table, snapshot date, bias notes)ceres export --format parquet --output ~/ceres-open-data-indexThe export streams all non-stale datasets from PostgreSQL, applies curation, and writes:
all.parquet — Complete flattened datasetdata/<portal-name>.parquet — Per-portal subsetsmetadata.json — Snapshot metadata with counts and portal breakdownPortal names are resolved from ~/.config/ceres/portals.toml. Portals not in the config fall back to hostname-based naming (e.g. https://data.gov.ro becomes data-gov-ro).
The export takes ~30-40 minutes for 900k+ datasets due to JSONB flattening.
| Column | Type | Description |
|---|---|---|
original_id | string | Dataset ID from source portal |
source_portal | string | Portal base URL |
portal_name | string | Human-readable portal name |
url | string | Direct URL to dataset page |
title | string | Dataset title |
description | string | Dataset description (nullable) |
tags | string | Comma-separated tag names (nullable) |
organization | string | Publishing organization (nullable) |
license | string | License title or identifier (nullable) |
metadata_created | string | Original creation date ISO 8601 (nullable) |
metadata_modified | string | Last modification date ISO 8601 (nullable) |
first_seen_at | string | When Ceres first indexed this dataset (RFC 3339) |
language | string | Primary language code (nullable) |
is_duplicate | boolean | True if same title appears in another portal |
is_duplicate=true. Duplicates are kept, not removed. SQL: SELECT LOWER(title) FROM datasets GROUP BY LOWER(title) HAVING COUNT(DISTINCT TRIM(TRAILING '/' FROM source_portal)) > 1metadata.tags[].name, organization from metadata.organization.title, license from metadata.license_title~/ceres-open-data-indexhttps://huggingface.co/datasets/AndreaBozzo/ceres-open-data-indexmain*.parquet tracked via Git-LFS (configured in .gitattributes)cd ~/ceres-open-data-index
git add all.parquet data/ metadata.json README.md
git commit -m "vN: Month Year export (X portals, Yk datasets)"
git tag vN
git push origin main
git push origin vNThe README at ~/ceres-open-data-index/README.md uses HuggingFace dataset card format with YAML frontmatter. Update these sections:
language list (add new language codes), size_categories, tags### Splits by portal): Add new portals, update all counts, sort by count descendingAll numbers come from metadata.json (generated by the export).
| Version | Date | Exported | Filtered | Duplicates | Portals | Countries |
|---|---|---|---|---|---|---|
| v1 | 2026-02-12 | 230,315 | 4,693 | 58,364 | 23 | 8 + intl |
| v2 | 2026-02-25 | 349,836 | 6,532 | 59,062 | 25 | 9 + intl |
| v3 | 2026-03-30 | 890,143 | 10,331 | 75,527 | 32 | 13 + intl |
| File | Purpose |
|---|---|
~/.config/ceres/portals.toml | Portal config — controls name resolution during export |
~/ceres-open-data-index/README.md | HuggingFace dataset card |
~/ceres-open-data-index/metadata.json | Export metadata (generated, do not edit) |
crates/ceres-core/src/parquet_export.rs | Export logic (noise filter, dedup, flattening) |
crates/ceres-db/src/repository.rs | SQL queries (duplicate detection, dataset streaming) |
The visualization dashboard at https://huggingface.co/spaces/AndreaBozzo/Ceres is a static Plotly site generated from the exported data.
~/Documenti/Ceres(huggingfacespace)~/Documenti/open-data-galaxy/galaxy_constellation.py# Overall stats
ceres stats
# Check noise candidates in DB (optional)
docker exec ceres_db psql -U ceres_user -d ceres_db -c "
SELECT COUNT(*) FILTER (WHERE LENGTH(title) < 5) as tiny_titles,
COUNT(*) FILTER (WHERE description IS NULL OR TRIM(description) = '') as empty_desc,
COUNT(*) FILTER (WHERE LOWER(title) LIKE '%test%' OR LOWER(title) LIKE '%prova%' OR LOWER(title) LIKE '%esempio%') as noise_titles
FROM datasets WHERE NOT is_stale;
"~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.