Contrôles de cohérence¶
Le module qa permet de vérifier la cohérence d'une base
archives-tool. Tous les contrôles sont en lecture seule : aucun
db.add ni db.commit. On peut les exécuter sur une base de
production sans risque.
Pour la référence détaillée des 14 contrôles (ce qui est vérifié, pourquoi, comment résoudre) voir reference/controles.md. Cette page-ci documente l'usage de la CLI.
Familles de contrôles¶
14 contrôles répartis en 4 familles : invariants (4),
fichiers (4), metadonnees (4), cross (2). Le détail
ID + sévérité + ce qui est vérifié + comment résoudre est dans
la référence des contrôles qa.
CLI¶
# Contrôle complet, sortie texte avec couleurs.
uv run archives-tool controler
# Restreint à un fonds.
uv run archives-tool controler --fonds HK
# Restreint à une collection (avec --fonds pour désambiguïser si
# la cote est partagée).
uv run archives-tool controler --collection HK-FAVORIS --fonds HK
# Sortie JSON pour CI / outillage.
uv run archives-tool controler --format json > rapport.json
# Strict : exit 1 dès qu'un avertissement OU info remonte.
uv run archives-tool controler --strict
# Limiter le nombre d'exemples affichés (compteurs restent exacts).
uv run archives-tool controler --max-exemples 10
Options¶
| Option | Défaut | Sens |
|---|---|---|
--fonds COTE |
(base entière) | Limite aux entités du fonds. Mutex avec --collection. |
--collection COTE |
(base entière) | Limite aux items de la collection. Mutex avec --fonds. |
--format text\|json |
text |
Format de sortie. |
--strict |
False |
Exit 1 dès qu'un avertissement / info remonte. |
--max-exemples N |
5 |
Tronque l'échantillon des exemples (text seulement). |
--db-path PATH |
data/archives.db |
Chemin de la base SQLite. |
--config PATH |
config_local.yaml |
Config locale (racines). Optionnelle. |
Codes de sortie¶
| Code | Sens |
|---|---|
0 |
Aucune erreur (les avertissements/infos passent en mode normal). |
1 |
Erreur métier détectée OU --strict avec avertissement/info OU collection/fonds introuvable. |
2 |
Erreur de saisie (--fonds + --collection, format invalide, base absente). |
Format JSON (intégration CI)¶
Structure stable, documentée pour intégration CI. Pas de breaking
change avant V1.0 ; toute évolution incompatible bumpera
version_qa.
{
"version_qa": "0.9.0",
"horodatage": "2026-05-10T14:23:00+00:00",
"perimetre": {
"type": "base_complete",
"fonds_id": null,
"collection_id": null,
"fonds_count": 5,
"collections_count": 10,
"items_count": 333,
"fichiers_count": 1298
},
"controles": [
{
"id": "INV1",
"famille": "invariants",
"severite": "erreur",
"libelle": "Collection miroir unique par fonds",
"passe": true,
"compte_total": 5,
"compte_problemes": 0,
"exemples": []
},
{
"id": "INV6",
"famille": "invariants",
"severite": "avertissement",
"libelle": "Item dans la collection miroir de son fonds",
"passe": false,
"compte_total": 333,
"compte_problemes": 1,
"exemples": [
{
"message": "Item FA-OEUVRES-005 retiré de la miroir du fonds FA",
"references": {
"item_cote": "FA-OEUVRES-005",
"item_id": 142,
"fonds_cote": "FA"
}
}
]
}
],
"bilan": {
"erreurs": 0,
"avertissements": 1,
"infos": 1
}
}
Sémantique du périmètre¶
--fonds et --collection filtrent les contrôles qui peuvent
l'être (familles invariants, fichiers, metadonnees). Les
contrôles cross opèrent toujours sur la base entière : la
duplication de cote ou un fonds vide sont des problèmes globaux
dont la détection ne dépend pas du périmètre.
Composabilité depuis Python¶
Chaque contrôle est appelable individuellement :
from archives_tool.qa import (
composer_perimetre,
controler_inv1_miroir_unique,
)
perimetre = composer_perimetre(session)
resultat = controler_inv1_miroir_unique(session, perimetre)
print(resultat.passe, resultat.compte_problemes)
Toute la suite est exportée depuis archives_tool.qa. Les
ResultatControle sont immuables (@dataclass(frozen=True)) et
sérialisables JSON via formatter_rapport_json.
Lecture seule garantie¶
Aucun contrôle ne fait db.add ni db.commit. On peut exécuter
archives-tool controler sur une base de production sans risque.