Feature Specification: Catégorisation des dossiers à la racine de l'archive
Feature Branch: [004-categorisation-dossiers]
Created: 2026-09-18
Status: Draft
Input: User description: "Emplacement de premier niveau des dossiers à la racine de l'archive (NAS) et, en miroir, à la racine de l'espace de travail local : par défaut un répertoire d'année (ex. 2026/), ou pour certains dossiers relevant d'une catégorie thématique (mariage, vacances, voyage, anniversaire, extensible), directement un répertoire de catégorie à la racine, sans passer par l'année. Choix fait à l'import, une seule fois pour un dossier parent (hérité par ses sous-dossiers). Recatégorisation a posteriori couverte par la détection de déplacement par hash déjà en place. Répertoires de catégorie plats, pas de sous-organisation par année pour l'instant."
User Scenarios & Testing (mandatory)
User Story 1 - Import standard, placement par année par défaut (Priority: P1)
Un photographe importe une carte mémoire pour une sortie ordinaire, sans lien avec un projet particulier. Sans rien choisir de spécial, le dossier résultant est rangé sous un répertoire portant le nom de son année, aussi bien dans l'archive NAS que dans l'espace de travail local.
Why this priority: C'est le comportement par défaut qui doit continuer de fonctionner pour la majorité des imports ; sans lui, rien d'autre n'a de socle sur lequel s'appuyer.
Independent Test: Peut être testé en import et une carte produisant un dossier simple d'une seule journée, sans sélectionner de catégorie, puis en vérifiant que le dossier apparaît sous <racine>/AAAA/AAAA-MM-JJ_Titre/ aussi bien dans l'archive que dans l'espace de travail local.
Acceptance Scenarios:
- Given un groupe d'import ne relevant d'aucune catégorie thématique, When l'utilisateur valide sa destination sans choisir de catégorie, Then le dossier résultant est placé sous un répertoire portant le nom de son année, à la racine de l'archive.
- Given ce même dossier archivé sous un répertoire d'année, When l'utilisateur en fait un checkout, Then l'espace de travail local reproduit le même chemin relatif (répertoire d'année puis dossier), pas seulement le nom du dossier.
User Story 2 - Import relevant d'une catégorie thématique (Priority: P2)
Un photographe importe les photos d'un mariage (ou de vacances, d'un voyage simple, d'un anniversaire). Au moment de choisir la destination du groupe, il indique la catégorie concernée : le dossier résultant est rangé directement sous un répertoire portant le nom de cette catégorie, à la racine de l'archive, sans passer par un répertoire d'année.
Why this priority: C'est la valeur centrale de la fonctionnalité — regrouper les projets thématiques indépendamment de leur année, pour les retrouver facilement (tous les mariages ensemble, tous les voyages ensemble). Dépend du fonctionnement de base (P1) mais ne se limite pas à un raffinement cosmétique.
Independent Test: Peut être testé en import et une carte, en choisissant la catégorie "mariage" pour le groupe résultant, puis en vérifiant que le dossier apparaît sous <racine>/mariage/AAAA-MM-JJ_Titre/ — jamais sous un répertoire d'année — aussi bien dans l'archive que dans l'espace de travail local.
Acceptance Scenarios:
- Given un groupe d'import à l'étape de choix de destination, When l'utilisateur indique qu'il relève d'une catégorie thématique et en choisit une (parmi les catégories déjà utilisées ou une nouvelle), Then le dossier résultant est placé directement sous un répertoire portant le nom de cette catégorie, à la racine de l'archive, sans répertoire d'année intermédiaire.
- Given une catégorie jamais utilisée auparavant (ex. "exposition"), When l'utilisateur la saisit librement à ce moment, Then Régine crée le répertoire de catégorie correspondant sans nécessiter de modification du logiciel ni de configuration préalable.
- Given un événement qui pourrait relever de plusieurs catégories à la fois (ex. un mariage pendant un voyage), When l'utilisateur choisit sa destination, Then il ne peut sélectionner qu'une seule catégorie ; Régine ne propose ni ne devine jamais une double catégorisation.
User Story 3 - Héritage de la catégorie par les sous-dossiers d'un voyage (Priority: P3)
Un photographe est en voyage sur plusieurs étapes, catégorisé "voyage" dès le premier import qui crée le dossier parent. Pour les étapes suivantes, il importe de nouvelles cartes comme sous-dossiers de ce même dossier parent : la catégorie n'est pas redemandée, chaque étape hérite automatiquement du placement choisi au départ.
Why this priority: Raffine le cas déjà couvert par specs/001-import-photos (User Story 3, import multi-étapes) avec la dimension catégorie ; reste secondaire par rapport à P1/P2 puisqu'il ne concerne que les imports en plusieurs étapes.
Independent Test: Peut être testé en import et une première carte comme "nouveau dossier parent avec sa première étape" en choisissant la catégorie "voyage", puis en import et une seconde carte comme nouveau sous-dossier de ce même parent, et en vérifiant que le sous-dossier apparaît sous <racine>/voyage/AAAA-MM_Titre/AAAA-MM-JJ_Titre_Lieu/ sans qu'aucune question de catégorie ne soit reposée.
Acceptance Scenarios:
- Given un dossier parent créé avec une catégorie donnée (ou sans catégorie, donc sous une année) lors du premier import qui l'a fait naître, When l'utilisateur importe une carte supplémentaire et choisit "nouveau sous-dossier dans un dossier parent existant" pour ce même parent, Then le sous-dossier résultant hérite automatiquement du même placement racine (catégorie ou année), sans que la question ne soit reposée.
- Given un dossier parent sous une catégorie, When l'utilisateur consulte sa structure complète (parent + sous-dossiers), Then l'ensemble vit sous le même répertoire de catégorie, cohérent avec la racine du dossier parent servant de planche-contact globale (déjà définie dans les notes de conception).
User Story 4 - Recatégorisation a posteriori (Priority: P4)
Un photographe se rend compte, après coup, qu'un dossier rangé par erreur sous une année aurait dû rejoindre une catégorie thématique (ou inversement). Il déplace le dossier vers le bon emplacement racine ; Régine reconnaît ce déplacement comme tel plutôt que comme une anomalie, grâce au mécanisme de détection par contenu déjà en place.
Why this priority: Cas de correction, moins fréquent que les trois précédents, mais nécessaire pour que la catégorisation ne soit pas une décision figée de façon irréversible dès l'import.
Independent Test: Peut être testé en déplaçant, dans l'espace de travail local, un dossier déjà archivé sous un répertoire d'année vers un répertoire de catégorie, puis en réconciliant : le déplacement doit être détecté par somme de contrôle (contenu inchangé, chemin différent), jamais signalé comme une anomalie de fichier maître modifié.
Acceptance Scenarios:
- Given un dossier déjà archivé sous un répertoire d'année, When l'utilisateur le déplace vers un répertoire de catégorie dans sa copie de travail et réconcilie, Then Régine détecte ce déplacement par somme de contrôle de contenu inchangé et met à jour l'emplacement dans l'archive en conséquence, sans le traiter comme une anomalie.
- Given ce même mécanisme, When le déplacement se fait dans l'autre sens (catégorie vers année) ou d'une catégorie vers une autre, Then il est traité de façon identique, sans mécanisme dédié supplémentaire.
Edge Cases
- Que se passe-t-il si l'utilisateur ne choisit aucune catégorie particulière ? Le dossier est placé par défaut sous un répertoire d'année (comportement de User Story 1).
- Que se passe-t-il si l'utilisateur saisit un nom de catégorie proche d'une catégorie déjà utilisée mais orthographié différemment (ex. "Mariage" vs "mariage") ? Régine DOIT proposer les catégories déjà utilisées comme suggestions au moment de la saisie, pour limiter le risque de créer deux répertoires de catégorie équivalents par erreur.
- Que se passe-t-il si le répertoire de la catégorie choisie n'existe pas encore à la racine de l'archive ? Régine DOIT le créer, selon la même logique que la création de répertoires déjà prévue pour l'import (pas de confirmation distincte au-delà de la confirmation d'archivage déjà prévue).
- Que se passe-t-il si l'utilisateur choisit "fusion dans un dossier existant" (cf.
specs/001-import-photos) pour un dossier déjà catégorisé ? Le placement racine du dossier ciblé ne change pas ; les nouveaux fichiers rejoignent l'emplacement déjà en place.
Requirements (mandatory)
Functional Requirements
- FR-001: À l'étape de choix de la destination de chaque groupe (déjà définie dans
specs/001-import-photos), le système DOIT demander en plus si ce groupe relève d'une catégorie thématique ou s'il doit suivre le placement par défaut (par année). - FR-002: Par défaut, en l'absence de catégorie choisie, le système DOIT placer le dossier ou dossier parent résultant sous un répertoire portant le nom de son année, à la racine de l'archive et, en miroir, à la racine de l'espace de travail local.
- FR-003: Lorsqu'une catégorie thématique est choisie pour un dossier ou un dossier parent, le système DOIT le placer directement sous un répertoire portant le nom de cette catégorie, à la racine de l'archive et de l'espace de travail local, sans passer par un répertoire d'année.
- FR-004: Le système DOIT proposer au minimum les catégories mariage, vacances, voyage et anniversaire comme suggestions, tout en permettant à l'utilisateur de déclarer librement une nouvelle catégorie au moment du choix, sans modification du logiciel ni configuration préalable.
- FR-005: Un dossier ou dossier parent ne DOIT jamais se voir attribuer plus d'une catégorie à la fois ; le système ne DOIT jamais deviner ou assigner automatiquement une catégorie — le choix (catégorie ou année par défaut) reste toujours une décision explicite de l'utilisateur.
- FR-006: Pour un dossier parent, le placement racine (catégorie ou année) choisi lors du premier import qui le crée DOIT être traité comme une propriété de ce dossier de plus haut niveau ; tout sous-dossier ajouté ultérieurement à ce même parent DOIT hériter automatiquement de ce placement, sans que la question ne soit reposée.
- FR-007: Le mécanisme de checkout DOIT conserver et reproduire le chemin relatif complet d'un dossier par rapport à la racine (répertoire d'année ou de catégorie), pas seulement le nom du dossier lui-même.
- FR-008: Un déplacement d'un dossier existant d'un répertoire d'année vers un répertoire de catégorie, ou inversement, ou d'une catégorie vers une autre, DOIT être reconnu par le mécanisme existant de détection de déplacement par somme de contrôle de contenu, sans nécessiter de mécanisme de recatégorisation dédié.
- FR-009: Les répertoires de catégorie à la racine de l'archive DOIVENT rester plats (aucune sous-organisation par année à l'intérieur) pour cette itération.
- FR-010: Le résumé présenté à l'utilisateur avant toute écriture sur l'archive (cf. confirmation explicite déjà requise) DOIT afficher explicitement le répertoire racine de destination (nom de l'année ou de la catégorie), pour que l'utilisateur puisse le vérifier avant de confirmer.
Key Entities
- Catégorie thématique : nom libre choisi par l'utilisateur (ex. mariage, vacances, voyage, anniversaire, ou tout autre nom déclaré), servant de répertoire racine alternatif au répertoire d'année. Liste extensible, jamais figée.
- Répertoire racine (archive) : premier niveau sous lequel vit un dossier ou un dossier parent, à la racine de l'archive et de l'espace de travail local — soit un répertoire d'année (
AAAA), soit un répertoire de catégorie. Un dossier ou dossier parent en a exactement un. À ne pas confondre avec la racine de sélection à l'intérieur d'un dossier (cf.docs/lexique.md). - Dossier / Dossier parent (repris de
specs/001-import-photosetdocs/lexique.md, non redéfinis ici) : hérite d'un répertoire racine (archive) unique, choisi à sa création et conservé jusqu'à un éventuel déplacement explicite.
Success Criteria (mandatory)
Measurable Outcomes
- SC-001: 100% des dossiers importés sans catégorie choisie sont placés sous un répertoire d'année, identique dans l'archive et dans l'espace de travail local.
- SC-002: 100% des dossiers pour lesquels une catégorie est choisie sont placés directement sous le répertoire de cette catégorie, sans jamais passer par un répertoire d'année.
- SC-003: Un utilisateur peut créer et utiliser une catégorie jamais rencontrée auparavant sans aucune modification du logiciel.
- SC-004: 100% des sous-dossiers ajoutés ultérieurement à un dossier parent existant héritent du placement racine choisi à la création du parent, sans qu'aucune nouvelle question ne soit posée.
- SC-005: 100% des déplacements d'un dossier entre un répertoire d'année et un répertoire de catégorie (dans un sens ou dans l'autre) sont détectés comme des déplacements de contenu inchangé, jamais comme des anomalies de fichier maître modifié.
- SC-006: Le répertoire racine de destination (année ou catégorie) est visible dans 100% des résumés présentés avant une écriture sur l'archive.
Assumptions
- Cette spécification étend
specs/001-import-photos(étape "destination de chaque groupe" et nommage/archivage du dossier) : une fois validée,specs/001-import-photosdevra être alignée pour inclure cette question de placement racine dans son propre flux — mise à jour à faire séparément, pas incluse dans cette spécification. - Le mécanisme de détection de déplacement par somme de contrôle de contenu et de réconciliation lors d'un checkout est désormais spécifié et planifié séparément (
specs/005-checkout-reconciliation, cf. son FR-010) ; FR-008 s'appuie dessus sans le redéfinir. Sa validation de bout en bout dépend de l'implémentation despecs/005. - Les conventions déjà spécifiées pour le nom du dossier lui-même (
AAAA-MM-JJ_Titreetc.), sa structure interne par format et sa racine de sélection (docs/archivage-photo-elements-cles.mdsections 9-10,specs/001-import-photos) restent inchangées ; cette spécification ajoute uniquement le niveau racine (année ou catégorie) au-dessus de ces conventions. - Une catégorie est un simple nom de répertoire choisi par l'utilisateur ; Régine n'effectue aucune validation métier de ce qui "compte" comme un mariage ou un voyage, au-delà du nettoyage de nom déjà prévu pour tout nom de dossier (espaces, caractères interdits).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
|