Secteur public — Ingestion batch avec piste d'audit¶
Parcours personas : alice (mise en place) → bob (engineer) → carol (analyste) → alice (audit) · Catalogues :
postgres_oltp_publicsector(96 départements INSEE) · Durée : ~30 min · Difficulté : étoile étoile étoile
Cette démo parcourt un cycle d'ingestion batch complet. Bob dépose un CSV dans la zone d'atterrissage, un DAG d'orchestration le ramasse, la couche Transform le normalise, la nouvelle table est enregistrée dans le Catalogue, et Carol l'interroge. Alice boucle la boucle en inspectant la piste d'audit OCSF.
Ce que la démo prouve¶
- Une ingestion batch CSV est un DAG en 5 étapes : land → validate → transform → register → federate.
- Toute lecture et écriture est capturée sous forme d'événement OCSF dans la piste d'audit.
- Le Catalogue enregistre automatiquement la nouvelle table ; Carol n'a pas besoin de ticket.
- Les événements OCSF sont filtrables par persona et par ressource.
Pré-requis¶
- URL démo :
https://demo.akko-ai.com - Catalogue
postgres_oltp_publicsectordéjà fédéré (96 départements INSEE). - 3 personas provisionnées :
alice,bob,carol. - Bucket de stockage objet
landing-publicsectorexiste (créé parakko-init).
Étape 1 — Alice prépare le bucket et le rôle d'ingestion¶
Se connecter en alice. Aller dans Gouvernance → Stockage objet. Confirmer que le bucket landing-publicsector est présent.
Aller dans Gouvernance → Rôles. Confirmer que akko-engineer a WRITE sur landing-publicsector/inbox/ et READ sur landing-publicsector/processed/.
Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/01-alice-bucket.png
Étape 2 — Bob upload le batch CSV¶
Se déconnecter, se connecter en bob. Aller dans DevHub → Object browser.
Déposer subventions_2026_q1.csv (8 412 lignes, 7 colonnes) dans landing-publicsector/inbox/.
Résultat attendu : un toast Uploaded 8412 rows in 1.2s. La couche Orchestration détecte le nouveau fichier en 30 s.
Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/02-bob-upload.png
Étape 3 — Bob déclenche le DAG d'ingestion¶
Aller dans DevHub → Orchestration. Localiser le DAG publicsector_csv_ingest. Cliquer Trigger.
Résultat attendu : 5 tâches réussissent dans l'ordre :
sense_landing OK (0,8 s)
validate_schema OK (1,2 s) --> 0 ligne rejetée
transform_normalize OK (3,4 s) --> codes région en majuscules, dates parsées
register_catalog OK (0,9 s) --> table postgres_oltp_publicsector.public.subventions_2026_q1 enregistrée
publish_event OK (0,2 s) --> événement OCSF envoyé à l'audit log
Total : 6,5 s.
Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/03-dag-run.png
Étape 4 — Bob lance la transformation¶
Aller dans DevHub → Transform. Le DAG a déjà invoqué dbt run --select +subventions_q1_aggregated. Confirmer que le modèle est vert.
Sortie attendue :
Running with dbt=1.8.0
Found 1 model, 0 tests
1 of 1 START sql view model marts.subventions_q1_aggregated [RUN]
1 of 1 OK created sql view model marts.subventions_q1_aggregated [SELECT in 0.43s]
Completed successfully
Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/04-dbt-run.png
Étape 5 — Carol interroge la nouvelle table¶
Se déconnecter, se connecter en carol. Ouvrir DevHub → Éditeur SQL.
Lancer :
SELECT region_code, count(*) AS n_subventions, sum(amount) AS total_eur
FROM postgres_oltp_publicsector.public.subventions_2026_q1
GROUP BY region_code
ORDER BY total_eur DESC;
Résultat attendu : 96 lignes, une par département, triées par total. Top 5 :
| région | n_subventions | total_eur |
| 75 | 412 | 18 472 000,00 |
| 13 | 289 | 12 105 000,00 |
| 69 | 267 | 11 820 000,00 |
| 33 | 251 | 10 940 000,00 |
| 59 | 244 | 10 612 000,00 |
Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/05-carol-query.png
Étape 6 — Alice inspecte la piste d'audit¶
Se déconnecter, se connecter en alice. Aller dans Gouvernance → Piste d'audit.
Filtrer par resource = postgres_oltp_publicsector.public.subventions_2026_q1.
Résultat attendu : 5 événements OCSF visibles :
| horodatage | acteur | action | ressource | résultat |
| 2026-05-17 10:42:01 | bob | object.put | landing-publicsector/inbox/... | ok |
| 2026-05-17 10:42:31 | system | dag.start | publicsector_csv_ingest | ok |
| 2026-05-17 10:42:38 | system | table.register | postgres_oltp_publicsector... | ok |
| 2026-05-17 10:42:39 | system | transform.run | dbt subventions_q1_aggregated | ok |
| 2026-05-17 10:45:14 | carol | query.execute | postgres_oltp_publicsector... | ok |
Cliquer n'importe quel événement pour voir le JSON OCSF brut.
Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/06-audit-trail.png
Nettoyage¶
- Optionnel : archiver la table en déclenchant le DAG
publicsector_csv_archivequi déplace le CSV verslanding-publicsector/processed/. - Se déconnecter.
Ce que la démo prouve¶
- L'ingestion batch CSV est un DAG self-service, pas un ticket.
- Le Catalogue reste à jour sans enregistrement manuel.
- La piste d'audit capture la chaîne de garde complète, persona par persona, en OCSF.
- Carol tire d'une table fédérée quelques instants après l'upload de Bob.
Fichiers dans le repo¶
| Fichier | Rôle |
|---|---|
airflow/dags/publicsector_csv_ingest.py |
DAG d'ingestion en 5 étapes |
dbt/models/marts/publicsector/subventions_q1_aggregated.sql |
Agrégation curatée |
helm/akko/charts/akko-init/templates/landing-buckets-job.yaml |
Crée le bucket |