Borrowing it
Nothing to install: this file belongs to cturkieh/france-data-mcp. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/cturkieh/france-data-mcp/main/.claude/skills/ingestion-crons/SKILL.mdgit clone --depth 1 https://github.com/cturkieh/france-data-mcpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/cturkieh/france-data-mcp/ingestion-crons)<a href="https://agentmods.dev/skills/cturkieh/france-data-mcp/ingestion-crons"><img src="https://agentmods.dev/badge/skills/cturkieh/france-data-mcp/ingestion-crons/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/cturkieh/france-data-mcp/ingestion-crons"><img src="https://agentmods.dev/badge/skills/cturkieh/france-data-mcp/ingestion-crons.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00101 | $0.01263 |
| Opus 5.5 | $0.00040 | $0.00505 |
| Sonnet 5.5 | $0.00020 | $0.00253 |
| Haiku 4.5 | $0.00010 | $0.00126 |
Grade A, and why
ingestion-crons scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 22d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 24 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Ingestion (crons GitHub Actions)
Déplacé verbatim depuis
CLAUDE.mdle 2026-09-06 (budget). Source de vérité pour ce périmètre ;CLAUDE.mdne garde que les règles de tête.
3 sources : FINESS (flux ANS JSON.gz quotidien, cron le 1er et le 15, ~105K), Ameli (hebdo, ~466K), RPPS (mensuel, ~2.28M). Pattern : download → SHA256 short-circuit si identique → COPY staging → validate → atomic swap → canary → ingest_log.
FINESS vient de l'ANS depuis 2026-09-05, plus du CSV DREES (flux arrêté le 2026-07-20 ; le cron a court-circuité en same_checksum/success quatre mois sans signal — d'où last_data_change_at/data_age_days dans data_freshness). Source de vérité : docs/plans/finess-migration-ans.md. Les trois pièges qui ont failli passer en silence, tous testés sur fixtures réelles (finess-ans-parse.test.ts) : (1) adresse géographique = usageAdresse "03", JAMAIS adresse[0] (2 294 EGE ont l'accueil devant) ; (2) deux paires de coordonnées dont le système WGS84/Lambert 93 s'inverse d'un enregistrement à l'autre → resolveCoordinates détecte par plage de valeurs ; (3) seulement 74,9 % des EGE ont des coordonnées → repli previous_ingest (point de la prod par num_finess, tracé raw.geom_source), JAMAIS de centroïde commune dans finess.geom (le RPPS le recopierait en finess_join = tier précis). Parsing en flux obligatoire (715 Mo > limite de chaîne V8). Un débordement de colonne = null compté, jamais tronqué (un téléphone à deux numéros a fait échouer le premier dry-run ; parité DDL↔COLUMN_RULES testée). Les seuils qui décident du swap vivent dans finess-validate.ts (pur, testé sur les chiffres mesurés) — ne pas les réinliner dans main(). FINESS_DRY_RUN=1 = pipeline complet sans swap, staging conservée ; FORCE_REINGEST=1 bypass le checksum.
Service client typage : pour toute RPC ajoutée par migration récente, utiliser getUntypedServiceClient(source) (sinon tsc -p tsconfig.api.json échoue, types Supabase pas regénérés).
Canal d'apply des migrations en prod (V0.20+, débloqué) : MCP Supabase mcp__supabase_france_data__apply_migration({name, query}) — Claude apply directement depuis la session, sans intervention humaine, avec tracking propre dans supabase_migrations.schema_migrations. Workflow validé V0.20 : list_migrations (état) → execute_sql pg_proc (idempotence) → apply_migration({name: snake_case, query: SQL complet}) → execute_sql (tests fonctionnels : signature + appels réels + edge cases) → push code + tag. Le canal CLI supabase db push reste cassé (pattern CLI exige YYYYMMDDHHMMSS_ sans T, le repo a 52 migrations format T) — le MCP contourne en passant directement la chaîne SQL. L'auto-apply via GitHub Actions reste parqué (mémoire migration-autoapply-deferred partiellement obsolète — MCP en supersede pour les sessions Claude). Fallback dashboard SQL editor manuel (https://supabase.com/dashboard/project/_/sql/new) toujours valide si le MCP Supabase est down/non configuré. Le retry défensif PGRST204_RECOVERABLE_FIELDS protège la fenêtre transitoire push code ↔ apply migration (cf. ci-dessous).
Marqueur forced dans ingest_log (V0.12.2) : un run déclenché via FORCE_REINGEST=1 (workflow_dispatch) est marqué forced=true par shortCircuitIfSameChecksum(..., force=true) (chokepoint unique). Audit : SELECT * FROM ingest_log WHERE forced=true. Distingue un run ops manuel d'un cron normal — sinon perdu en audit quand checksums identiques.
Convention PGRST204_RECOVERABLE_FIELDS (V0.12.2) : writeIngestLog retry défensif si PGRST204 sur un champ optionnel récent (fenêtre transitoire push code ↔ apply migration). Tout nouvel ajout de champ optionnel dans IngestLogEntry DOIT être listé dans PGRST204_RECOVERABLE_FIELDS (scripts/ingest/shared.ts) jusqu'à propagation de la migration en prod, puis peut être retiré. Sans cet allow-list, un PGRST204 perdrait silencieusement TOUTE l'entrée ingest_log du run (classe close en V0.12.2). Best-effort doc : appliquer la migration AVANT de déployer le code.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 22d ago Changed · +2 lines 251a4394a1fb
- 2mo ago First seen · 22 lines · 101 tokens per session scan A 4e4c22f09bab
ingestion-crons is a skill published in the GitHub repository cturkieh/france-data-mcp (4 stars, last pushed 22d ago), licensed MIT. It adds 101 tokens to every session and 1,263 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-06.
ingestion-crons compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| ingestion-cronscturkieh/france-data-mcp | Skill | 4 | 22d ago | MIT | A | 101 | Claude Code |
| atlas-onboardariga/atlas | Skill | 8.8k | yesterday | Apache-2.0 | A | 109 | Claude Code, Codex |
| temps-add-migration-and-entitygotempsh/temps | Skill | 903 | yesterday | Apache-2.0 | A | 84 | Claude Code, Codex |
| release-db-config-syncPrismer-AI/PrismerCloud | Skill | 1.4k | 15d ago | MIT | A | 91 | Claude Code |
| neonericrisco/rsc-harness | Skill | 503 | 2d ago | MIT | A | 93 | Claude Code, Codex |
| 513-frameworks-micronaut-db-migrations-flywayjabrena/plinth | Skill | 460 | yesterday | Apache-2.0 | A | 129 | Claude Code, Codex |
| end-to-end-snowflake-pipelineAltimateAI/data-engineering-skills | Skill | 134 | 10d ago | MIT | A | 221 | Claude Code |