Contrôles qa¶
Référence des 14 contrôles disponibles dans
archives-tool controler. Cette page
documente ce que vérifie chaque contrôle, pourquoi, et comment
résoudre s'il échoue. Pour l'usage de la CLI, voir le guide.
Les contrôles sont strictement en lecture seule : aucun
db.add ni db.commit. On peut les exécuter sur une base de
production sans risque, dans une CI, ou sur une copie en cours
d'analyse — la base est garantie inchangée.
Vue d'ensemble¶
Les contrôles sont organisés en 4 familles :
| Famille | Contrôles | Sévérités principales |
|---|---|---|
invariants |
INV1, INV2, INV4, INV6 | erreur (sauf INV6) |
fichiers |
FILE-MISSING, FILE-ITEM-VIDE, FILE-HASH-DUPLIQUE, FILE-HASH-MANQUANT | avertissement / info |
metadonnees |
META-COTE-INVALIDE, META-TITRE-VIDE, META-DATE-INVALIDE, META-ANNEE-IMPLAUSIBLE | erreur / avertissement |
cross |
CROSS-COTE-DUPLIQUEE-FONDS, CROSS-FONDS-VIDE | erreur / info |
Sévérités¶
| Sévérité | Symbole | Comportement |
|---|---|---|
| Erreur | ✗ | Exit code 1 dès qu'une seule erreur remonte. |
| Avertissement | ⚠ | Exit code 0 par défaut ; exit 1 si --strict est passé. |
| Info | ℹ | Jamais d'exit code non-zéro (sauf --strict). |
Tableau récapitulatif¶
| ID | Famille | Sévérité | Vérifie |
|---|---|---|---|
INV1 |
invariants | erreur | Tout fonds a exactement une collection miroir. |
INV2 |
invariants | erreur | Toute miroir a un fonds parent. |
INV4 |
invariants | erreur | Tout item a un fonds parent. |
INV6 |
invariants | avertissement | Tout item est dans la miroir de son fonds. |
FILE-MISSING |
fichiers | avertissement | Fichier référencé en base mais absent du disque. |
FILE-ITEM-VIDE |
fichiers | info | Item sans aucun fichier rattaché. |
FILE-HASH-DUPLIQUE |
fichiers | avertissement | Plusieurs fichiers ACTIF avec même hash SHA-256. |
FILE-HASH-MANQUANT |
fichiers | info | Fichier ACTIF sans hash calculé. |
META-COTE-INVALIDE |
metadonnees | erreur | Cote (fonds/collection/item) hors pattern ^[A-Za-z0-9_-]+$. |
META-TITRE-VIDE |
metadonnees | erreur | Titre vide ou whitespace-only sur fonds, collection ou item. |
META-DATE-INVALIDE |
metadonnees | avertissement | Item.date ne reconnaît pas la syntaxe EDTF tolérante. |
META-ANNEE-IMPLAUSIBLE |
metadonnees | avertissement | Item.annee hors plage [1000, 2100] (configurable). |
CROSS-COTE-DUPLIQUEE-FONDS |
cross | erreur | Plusieurs fonds avec la même cote (filet — UNIQUE en DB). |
CROSS-FONDS-VIDE |
cross | info | Fonds créé mais sans aucun item. |
Détail des contrôles¶
Famille invariants¶
INV1 — Collection miroir unique par fonds¶
Vérifie : pour chaque fonds en base, il existe exactement une collection miroir (ni zéro, ni deux ou plus).
Pourquoi : la miroir est créée automatiquement par le service
creer_fonds. Une violation indique soit une intervention
manuelle directe en base, soit un bug du seeder ou de l'importer.
La miroir est le point d'attache Nakala par défaut, et on ne peut
en avoir qu'un.
Comment résoudre : si zéro miroir, créer manuellement la
collection avec est_miroir=True (et la même cote que le fonds).
Si plusieurs, identifier les doublons via la sortie du contrôle
et en supprimer toutes sauf une (privilégier celle qui contient
le plus d'items).
INV2 — Collection miroir avec fonds parent¶
Vérifie : toute collection avec est_miroir = True a un
fonds_id non null.
Pourquoi : une miroir reflète un fonds par définition. Un
fonds_id NULL la rend orpheline et incohérente avec son rôle.
Comment résoudre : convertir la collection en libre
transversale (est_miroir = False) ou la supprimer si elle est
vide.
INV4 — Item rattaché à un fonds¶
Vérifie : tout item a un fonds_id non null.
Pourquoi : Item.fonds_id est NOT NULL au niveau du
schéma. Ce contrôle est un filet de sécurité — il ne devrait
jamais remonter une erreur. S'il en remonte une, c'est qu'une
intervention SQL directe a corrompu la base (ou un bug
catastrophique).
Comment résoudre : restaurer une sauvegarde. La contrainte
NOT NULL rendant le cas pratiquement impossible sans
intervention SQL directe, il s'agit toujours d'un signe de
corruption.
INV6 — Item dans la collection miroir de son fonds¶
Vérifie : tout item figure dans la miroir de son fonds (via
ItemCollection).
Pourquoi : à la création d'un item, il est ajouté automatiquement à la miroir. Avertissement seulement (pas erreur) car le retrait manuel est explicitement autorisé (invariant 7 du modèle — cf. Concepts).
Comment résoudre : si le retrait est intentionnel (cas rare,
typiquement pour exclure un item d'une publication Nakala),
ignorer l'avertissement. Sinon, ré-ajouter l'item dans la miroir
via l'interface web ou un INSERT dans item_collection.
Famille fichiers¶
FILE-MISSING — Fichier référencé absent du disque¶
Vérifie : tout Fichier en base avec etat = ACTIF a son
fichier physique présent à racine + chemin_relatif.
Pourquoi : décalage base ↔ disque, fréquent quand des scans
ont été déplacés ou supprimés sans passer par
renommer. Bloque la génération de
dérivés et casse la visionneuse.
Comment résoudre :
- vérifier que la racine est bien configurée dans
config_local.yaml(cf. Configuration) ; - si les fichiers ont été déplacés, les remettre en place ou
utiliser
renommerpour aligner la base ; - si les fichiers ont été supprimés, marquer les lignes en base
comme
etat = corbeille(via SQL ou interface).
Sur la base de démonstration (chemins fictifs), tous les
fichiers signalent racine non configurée ou un message
similaire — c'est attendu.
FILE-ITEM-VIDE — Item sans fichier¶
Vérifie : tout item a au moins un Fichier rattaché.
Pourquoi : un item de catalogue sans aucun scan rattaché est souvent un import incomplet ou un placeholder. Info seulement — un item peut légitimement être catalogué sans scan (notice purement bibliographique).
Comment résoudre : ajouter des fichiers via l'interface web (onglet Fichiers de l'item) ou via un ré-import du profil avec les scans en place.
FILE-HASH-DUPLIQUE — Doublons par hash SHA-256¶
Vérifie : aucune paire de Fichier ACTIF n'a le même hash
SHA-256.
Pourquoi : doublons potentiels — soit le même scan a été importé deux fois, soit une copie traîne. Garde-fou contre duplications accidentelles avant publication.
Comment résoudre : examiner chaque paire signalée. Si c'est
bien un doublon, marquer une des deux lignes en
etat = remplace ou etat = corbeille. Si c'est légitime
(scans identiques rattachés à deux items distincts), accepter
l'avertissement.
FILE-HASH-MANQUANT — Fichier sans hash¶
Vérifie : tout Fichier ACTIF a un hash_sha256 calculé.
Pourquoi : le hash sert au contrôle d'intégrité et à la détection de doublons. Calculé à l'import en mode réel, mais pas en dry-run, ni par le seeder de la base demo.
Comment résoudre : sur une base de démonstration, ignorer (attendu). Sur une base réelle, lancer un script de calcul de hash a posteriori (à venir, V0.10) ou ré-importer en mode réel.
Famille metadonnees¶
META-COTE-INVALIDE — Cote hors pattern alphanumérique¶
Vérifie : toute cote (fonds, collection, item) respecte le
pattern ^[A-Za-z0-9_-]+$.
Pourquoi : les cotes apparaissent dans des chemins de fichiers, des URLs, des cotes d'identification. Les caractères spéciaux causent des bugs de templating, d'export Nakala (qui n'aime pas les espaces ni accents), et de résolution de fichiers.
Comment résoudre : renommer l'entité incriminée (interface web : modifier la cote ; CLI : il n'existe pas encore de commande de rename de cote — à venir V0.10). En attendant, SQL direct.
META-TITRE-VIDE — Titre vide¶
Vérifie : Fonds.titre, Collection.titre et Item.titre
ne sont pas vides ni whitespace-only.
Pourquoi : un titre vide casse les exports DC (champ obligatoire) et l'affichage dans l'interface.
Comment résoudre : remplir le titre via l'interface web ou un ré-import.
META-DATE-INVALIDE — Date EDTF non reconnue¶
Vérifie : Item.date (quand renseigné) reconnaît la regex
EDTF tolérante (formes : 1969, 1969-04, 1969?, 192X,
1969/1970, etc.).
Pourquoi : les exports Nakala et DC incluent la date telle quelle. Une date au mauvais format peut être rejetée par Nakala ou mal indexée.
Comment résoudre : ouvrir l'item dans l'interface web,
corriger la date pour qu'elle corresponde à un format EDTF
valide. La regex est tolérante (incertitude ?, troncature X,
ranges /) — voir EDTF.
META-ANNEE-IMPLAUSIBLE — Année hors plage¶
Vérifie : Item.annee (quand renseigné) est dans
[1000, 2100] (plage par défaut).
Pourquoi : une année à 99 ou 20240 est presque toujours
une erreur de saisie ou de parsing.
Comment résoudre : corriger via l'interface. La plage est configurable via les arguments du contrôle si vous travaillez sur des fonds antiques ou anticipés.
Famille cross¶
Ces contrôles opèrent toujours sur la base entière,
indépendamment du périmètre --fonds ou --collection passé en
ligne de commande. Logique : 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 demandé.
CROSS-COTE-DUPLIQUEE-FONDS — Cotes de fonds dupliquées¶
Vérifie : aucune paire de Fonds n'a la même cote.
Pourquoi : la cote de fonds est globalement unique (contrainte UNIQUE en DB). Garde-fou — ne devrait jamais remonter une erreur sauf intervention SQL directe.
Comment résoudre : restaurer une sauvegarde ou renommer une des cotes via SQL.
CROSS-FONDS-VIDE — Fonds sans items¶
Vérifie : tout fonds a au moins un item.
Pourquoi : un fonds sans items est légitime juste après sa création, en attendant l'import. Info seulement.
Comment résoudre : importer les items du fonds, ou supprimer le fonds si la création était une erreur.
Interpréter les avertissements sur la base demo¶
Sur la base de démonstration (archives-tool demo init) :
FILE-MISSING(avertissement) : tous les fichiers signalentracine non configurée→ c'est attendu, la base demo ne pointe vers aucun disque réel.FILE-HASH-MANQUANT(info) : aucun fichier n'a de hash → le seeder ne calcule pas de SHA-256 (gain de temps).INV6(avertissement) : peut remonter si le seeder a retiré un item d'une miroir intentionnellement.
Sur une vraie base, ces mêmes avertissements méritent enquête.
Format JSON¶
Pour intégration CI / outillage, voir
controler --format json.
La structure est documentée et stable — toute évolution
incompatible bumpera le champ version_qa.
Voir aussi¶
- Guide CLI controler — comment invoquer la commande, options et codes de sortie.
- Concepts du modèle — invariants 1 à 10,
fondement des contrôles
invariants.