fonzarely/regine-photos-archiverpublic Fork
⑂ main
Commits
⬇ Clone ▾
git clone https://git.rickub.com/fonzarely/regine-photos-archiver.git
git clone ssh://git@rickub.com/fonzarely/regine-photos-archiver.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP
specs 88ae6fa · on main · Fabien Champigny · Sep 18, 2026
spec.md · 103 lines · 12.0 KBmarkdown
Blame HistoryOpen raw

Feature Specification: Profil de boîtiers optionnel, déclaré à la demande

Feature Branch: [002-profil-boitiers-optionnel]

Created: 2026-09-18

Status: Draft

Input: User description: "Par defaut on a pas besoin d'avoir sepcifié le les models de boitiers qu'il possède. Ceci est necessaire pour les photogrpahes avancés qui ont plusieurs fois le même modèle ou bien si il y a confusion entre les boitier dont il n'y a pas d'identifiant unique des boitiers de la même marque"

User Scenarios & Testing (mandatory)

User Story 1 - Premier import sans configuration préalable (Priority: P1)

Un photographe installe Régine et importe sa première carte mémoire sans avoir rien déclaré au sujet de son matériel. Il possède un seul boîtier, ou plusieurs boîtiers de marques/modèles différents. L'import se déroule normalement, sans qu'aucune question sur le profil de boîtiers ne lui soit posée.

Why this priority: C'est le cas le plus fréquent (un ou plusieurs boîtiers facilement distingués par leur modèle) et la friction à éliminer en priorité : obliger tout le monde à déclarer son matériel avant le premier import pénaliserait la majorité des utilisateurs pour un besoin qui ne concerne qu'une minorité de cas avancés.

Independent Test: Peut être testé en installant Régine sans déclarer aucun boîtier, puis en important une carte mémoire d'un seul appareil (ou de plusieurs appareils de modèles différents, sans collision de nom de fichier) : l'import doit aboutir sans qu'aucune étape de configuration de profil ne soit demandée.

Acceptance Scenarios:

  1. Given aucun profil de boîtiers déclaré, When l'utilisateur importe une carte provenant d'un seul boîtier, Then l'import se déroule normalement sans qu'aucune question relative aux boîtiers ne soit posée.
  2. Given aucun profil de boîtiers déclaré, When l'utilisateur importe des fichiers provenant de deux boîtiers de modèles différents sans collision de nom de fichier, Then l'import se déroule normalement, chaque fichier étant associé à son modèle lu directement dans ses métadonnées.

User Story 2 - Résolution ponctuelle d'une collision réelle entre boîtiers (Priority: P2)

Un photographe importe deux cartes mémoire (deux boîtiers, ou un boîtier et une carte de secours) dont certains fichiers portent le même nom d'origine. Le système détecte cette collision et ne demande de précision à l'utilisateur qu'à ce moment précis, pas avant.

Why this priority: C'est la valeur centrale de la fonctionnalité : la désambiguïsation ne doit intervenir qu'au moment où elle est réellement nécessaire, jamais en amont sous forme de configuration obligatoire.

Independent Test: Peut être testé en import et deux jeux de fichiers partageant un même nom d'origine mais un contenu différent (somme de contrôle différente), et en vérifiant qu'une question de désambiguïsation n'apparaît qu'à cet instant, jamais avant l'import ni pour des fichiers sans collision.

Acceptance Scenarios:

  1. Given deux fichiers de même nom d'origine mais de contenu différent (somme de contrôle différente), When leurs métadonnées EXIF indiquent des modèles de boîtier différents, Then le système les distingue automatiquement par ce tag, sans poser de question à l'utilisateur.
  2. Given deux fichiers en collision de nom, When leurs métadonnées EXIF indiquent le même modèle de boîtier ou n'indiquent aucun modèle, Then le système signale la collision à l'utilisateur et demande une résolution, uniquement à cet instant.
  3. Given une source de boîtier résolue une première fois (par modèle, numéro de série ou étiquette manuelle), When l'utilisateur importe ultérieurement d'autres fichiers du même boîtier, Then le système réutilise cette résolution sans reposer la question.

User Story 3 - Repli sur numéro de série pour deux boîtiers identiques (Priority: P3)

Un photographe avancé possède deux exemplaires du même modèle de boîtier (même marque, même modèle) utilisés en parallèle. Le tag de modèle seul ne suffit plus à les distinguer en cas de collision ; le système doit s'appuyer sur un identifiant plus précis, ou, à défaut, demander un étiquetage manuel.

Why this priority: C'est le cas avancé explicitement à l'origine de cette demande — moins fréquent que les deux histoires précédentes, mais celui qui justifie l'existence même d'un mécanisme de résolution au-delà du simple tag de modèle.

Independent Test: Peut être testé en simulant une collision entre deux fichiers partageant le même modèle de boîtier dans leurs métadonnées mais un numéro de série différent et exploitable : le système doit les distinguer automatiquement. Un second test, avec numéro de série absent ou inexploitable pour les deux fichiers, doit à la place déclencher une demande d'étiquetage manuel.

Acceptance Scenarios:

  1. Given une collision entre deux fichiers de même modèle de boîtier, When leurs métadonnées EXIF contiennent chacune un numéro de série de boîtier présent et exploitable, Then le système les distingue automatiquement à partir de ce numéro, sans intervention de l'utilisateur.
  2. Given une collision entre deux fichiers de même modèle de boîtier, When le numéro de série est absent, vide ou non exploitable pour l'un des deux fichiers ou les deux, Then le système demande à l'utilisateur d'étiqueter manuellement la source de chaque fichier concerné.
  3. Given un étiquetage manuel effectué pour résoudre une collision, When l'utilisateur revient consulter ou modifier son profil de boîtiers, Then il retrouve cette entrée et peut la modifier librement (ex. après la revente d'un des deux boîtiers).

Edge Cases

  • Que se passe-t-il si un modèle de boîtier jamais rencontré auparavant apparaît dans les métadonnées d'un import, sans qu'aucune collision de nom ne survienne ? Le système ne DOIT poser aucune question et ne DOIT PAS interrompre l'import : l'absence de collision signifie l'absence de besoin de désambiguïsation.
  • Que se passe-t-il si les métadonnées EXIF d'un fichier ne contiennent aucun tag de modèle (métadonnées effacées ou boîtier atypique) ? Ce fichier est traité comme non désambiguïsable par le modèle ; en cas de collision réelle, le système passe directement au repli sur numéro de série puis, à défaut, à l'étiquetage manuel.
  • Que se passe-t-il si plus de deux fichiers entrent en collision sous le même nom d'origine (rare, trois boîtiers ou plus) ? Le même mécanisme de résolution (modèle, puis numéro de série, puis étiquetage manuel) s'applique à chaque source impliquée dans la collision, pas seulement à une paire.
  • Que se passe-t-il si l'utilisateur modifie son profil de boîtiers (achat, revente, prêt) entre deux imports ? Les résolutions déjà établies pour les boîtiers toujours déclarés restent valables ; un boîtier retiré du profil redevient sujet à une nouvelle résolution s'il réapparaît dans une collision future.

Requirements (mandatory)

Functional Requirements

  • FR-001: Le système DOIT permettre de réaliser un import complet sans qu'aucun profil de boîtiers n'ait été déclaré au préalable.
  • FR-002: Le système DOIT désambiguïser par défaut deux fichiers de même nom d'origine à partir du tag EXIF de modèle de chaque fichier, sans exiger que ce modèle soit préalablement enregistré dans un profil déclaré.
  • FR-003: Le système DOIT ne demander une résolution à l'utilisateur qu'au moment où une collision réelle de nom de fichier est détectée entre des fichiers dont le tag de modèle est identique ou absent — jamais par anticipation avant qu'une collision ne survienne.
  • FR-004: Lorsqu'une collision oppose deux fichiers indiquant le même modèle de boîtier, le système DOIT tenter de les distinguer automatiquement à partir du numéro de série de boîtier lu dans les métadonnées, quand celui-ci est présent et exploitable (non vide, non valeur générique), sans intervention de l'utilisateur.
  • FR-005: Lorsque le numéro de série est absent, vide ou inexploitable pour une collision réelle, le système DOIT demander à l'utilisateur d'étiqueter manuellement la source de chaque fichier concerné.
  • FR-006: Une fois une source de boîtier résolue (par modèle, numéro de série ou étiquetage manuel), le système DOIT réutiliser automatiquement cette résolution pour les imports ultérieurs du même boîtier, sans reposer la question.
  • FR-007: L'utilisateur DOIT pouvoir consulter, ajouter ou modifier les boîtiers déclarés à tout moment, indépendamment de tout import en cours — cette action reste disponible bien qu'elle ne soit jamais une étape obligatoire avant un import.
  • FR-008: La détection d'un modèle de boîtier jamais rencontré auparavant dans les métadonnées d'un fichier ne DOIT, en l'absence de toute collision réelle, ni interrompre l'import ni exiger une action sur le profil.

Key Entities

  • Profil de boîtiers (optionnel) : liste facultative d'appareils associés à des identifiants de résolution (modèle, numéro de série, ou étiquette manuelle), alimentée à la demande plutôt qu'en prérequis d'installation.
  • Collision de nom d'origine : événement déclencheur, détecté lorsque deux fichiers partagent un même nom de fichier d'origine mais un contenu différent (somme de contrôle différente).
  • Tag de modèle (métadonnées) : source primaire et silencieuse de désambiguïsation entre boîtiers de modèles différents.
  • Numéro de série de boîtier (métadonnées) : source de repli pour distinguer deux boîtiers strictement identiques (même marque, même modèle).
  • Étiquette manuelle de source : dernier recours attribué par l'utilisateur quand aucune métadonnée ne permet de distinguer deux boîtiers en collision.

Success Criteria (mandatory)

Measurable Outcomes

  • SC-001: 100% des imports sans collision de nom de fichier se terminent sans qu'aucune question relative aux boîtiers ne soit posée à l'utilisateur.
  • SC-002: Un photographe découvrant Régine peut réaliser son premier import sans jamais avoir eu à ouvrir ou configurer un profil de boîtiers.
  • SC-003: 100% des collisions réelles de nom de fichier sont résolues automatiquement (par modèle ou numéro de série) dès que cette information est présente et exploitable dans les métadonnées, sans intervention de l'utilisateur.
  • SC-004: 100% des collisions non résolvables automatiquement déclenchent une demande d'étiquetage manuel plutôt qu'un classement erroné silencieux.
  • SC-005: Une fois une source désambiguïsée pour un boîtier donné, aucune nouvelle question n'est posée pour ce même boîtier lors des imports ultérieurs.

Assumptions

  • Cette spécification révise le comportement décrit dans specs/001-import-photos/spec.md (exigences FR-015 et FR-016, ainsi que l'hypothèse selon laquelle le profil de boîtiers est un prérequis existant avant le premier import) : le profil devient une capacité optionnelle alimentée à la demande, et la détection d'un modèle inconnu sans collision ne déclenche plus de signalement systématique. Un alignement de la spécification 001 sur ce comportement révisé est nécessaire avant ou pendant la planification de l'import.
  • Le mécanisme de détection de collision par somme de contrôle et le tag EXIF de numéro de série de boîtier restent ceux déjà décrits dans les notes de conception du projet ; seule la condition de déclenchement de la question posée à l'utilisateur change.
  • Un boîtier qui ne rencontre jamais de collision réelle ne nécessite jamais d'entrée dans le profil : celui-ci peut rester vide indéfiniment pour un utilisateur qui n'a pas besoin de désambiguïsation.
  • Cette fonctionnalité s'applique dans le contexte du module d'import (specs/001-import-photos) ; elle n'introduit pas de nouveau canal d'import ni de nouvelle destination de dossier.
  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
# Feature Specification: Profil de boîtiers optionnel, déclaré à la demande

**Feature Branch**: `[002-profil-boitiers-optionnel]`

**Created**: 2026-09-18

**Status**: Draft

**Input**: User description: "Par defaut on a pas besoin d'avoir sepcifié le les models de boitiers qu'il possède. Ceci est necessaire pour les photogrpahes avancés qui ont plusieurs fois le même modèle ou bien si il y a confusion entre les boitier dont il n'y a pas d'identifiant unique des boitiers de la même marque"

## User Scenarios & Testing *(mandatory)*

### User Story 1 - Premier import sans configuration préalable (Priority: P1)

Un photographe installe Régine et importe sa première carte mémoire sans avoir rien déclaré au sujet de son matériel. Il possède un seul boîtier, ou plusieurs boîtiers de marques/modèles différents. L'import se déroule normalement, sans qu'aucune question sur le profil de boîtiers ne lui soit posée.

**Why this priority**: C'est le cas le plus fréquent (un ou plusieurs boîtiers facilement distingués par leur modèle) et la friction à éliminer en priorité : obliger tout le monde à déclarer son matériel avant le premier import pénaliserait la majorité des utilisateurs pour un besoin qui ne concerne qu'une minorité de cas avancés.

**Independent Test**: Peut être testé en installant Régine sans déclarer aucun boîtier, puis en important une carte mémoire d'un seul appareil (ou de plusieurs appareils de modèles différents, sans collision de nom de fichier) : l'import doit aboutir sans qu'aucune étape de configuration de profil ne soit demandée.

**Acceptance Scenarios**:

1. **Given** aucun profil de boîtiers déclaré, **When** l'utilisateur importe une carte provenant d'un seul boîtier, **Then** l'import se déroule normalement sans qu'aucune question relative aux boîtiers ne soit posée.
2. **Given** aucun profil de boîtiers déclaré, **When** l'utilisateur importe des fichiers provenant de deux boîtiers de modèles différents sans collision de nom de fichier, **Then** l'import se déroule normalement, chaque fichier étant associé à son modèle lu directement dans ses métadonnées.

---

### User Story 2 - Résolution ponctuelle d'une collision réelle entre boîtiers (Priority: P2)

Un photographe importe deux cartes mémoire (deux boîtiers, ou un boîtier et une carte de secours) dont certains fichiers portent le même nom d'origine. Le système détecte cette collision et ne demande de précision à l'utilisateur qu'à ce moment précis, pas avant.

**Why this priority**: C'est la valeur centrale de la fonctionnalité : la désambiguïsation ne doit intervenir qu'au moment où elle est réellement nécessaire, jamais en amont sous forme de configuration obligatoire.

**Independent Test**: Peut être testé en import et deux jeux de fichiers partageant un même nom d'origine mais un contenu différent (somme de contrôle différente), et en vérifiant qu'une question de désambiguïsation n'apparaît qu'à cet instant, jamais avant l'import ni pour des fichiers sans collision.

**Acceptance Scenarios**:

1. **Given** deux fichiers de même nom d'origine mais de contenu différent (somme de contrôle différente), **When** leurs métadonnées EXIF indiquent des modèles de boîtier différents, **Then** le système les distingue automatiquement par ce tag, sans poser de question à l'utilisateur.
2. **Given** deux fichiers en collision de nom, **When** leurs métadonnées EXIF indiquent le même modèle de boîtier ou n'indiquent aucun modèle, **Then** le système signale la collision à l'utilisateur et demande une résolution, uniquement à cet instant.
3. **Given** une source de boîtier résolue une première fois (par modèle, numéro de série ou étiquette manuelle), **When** l'utilisateur importe ultérieurement d'autres fichiers du même boîtier, **Then** le système réutilise cette résolution sans reposer la question.

---

### User Story 3 - Repli sur numéro de série pour deux boîtiers identiques (Priority: P3)

Un photographe avancé possède deux exemplaires du même modèle de boîtier (même marque, même modèle) utilisés en parallèle. Le tag de modèle seul ne suffit plus à les distinguer en cas de collision ; le système doit s'appuyer sur un identifiant plus précis, ou, à défaut, demander un étiquetage manuel.

**Why this priority**: C'est le cas avancé explicitement à l'origine de cette demande — moins fréquent que les deux histoires précédentes, mais celui qui justifie l'existence même d'un mécanisme de résolution au-delà du simple tag de modèle.

**Independent Test**: Peut être testé en simulant une collision entre deux fichiers partageant le même modèle de boîtier dans leurs métadonnées mais un numéro de série différent et exploitable : le système doit les distinguer automatiquement. Un second test, avec numéro de série absent ou inexploitable pour les deux fichiers, doit à la place déclencher une demande d'étiquetage manuel.

**Acceptance Scenarios**:

1. **Given** une collision entre deux fichiers de même modèle de boîtier, **When** leurs métadonnées EXIF contiennent chacune un numéro de série de boîtier présent et exploitable, **Then** le système les distingue automatiquement à partir de ce numéro, sans intervention de l'utilisateur.
2. **Given** une collision entre deux fichiers de même modèle de boîtier, **When** le numéro de série est absent, vide ou non exploitable pour l'un des deux fichiers ou les deux, **Then** le système demande à l'utilisateur d'étiqueter manuellement la source de chaque fichier concerné.
3. **Given** un étiquetage manuel effectué pour résoudre une collision, **When** l'utilisateur revient consulter ou modifier son profil de boîtiers, **Then** il retrouve cette entrée et peut la modifier librement (ex. après la revente d'un des deux boîtiers).

---

### Edge Cases

- Que se passe-t-il si un modèle de boîtier jamais rencontré auparavant apparaît dans les métadonnées d'un import, sans qu'aucune collision de nom ne survienne ? Le système ne DOIT poser aucune question et ne DOIT PAS interrompre l'import : l'absence de collision signifie l'absence de besoin de désambiguïsation.
- Que se passe-t-il si les métadonnées EXIF d'un fichier ne contiennent aucun tag de modèle (métadonnées effacées ou boîtier atypique) ? Ce fichier est traité comme non désambiguïsable par le modèle ; en cas de collision réelle, le système passe directement au repli sur numéro de série puis, à défaut, à l'étiquetage manuel.
- Que se passe-t-il si plus de deux fichiers entrent en collision sous le même nom d'origine (rare, trois boîtiers ou plus) ? Le même mécanisme de résolution (modèle, puis numéro de série, puis étiquetage manuel) s'applique à chaque source impliquée dans la collision, pas seulement à une paire.
- Que se passe-t-il si l'utilisateur modifie son profil de boîtiers (achat, revente, prêt) entre deux imports ? Les résolutions déjà établies pour les boîtiers toujours déclarés restent valables ; un boîtier retiré du profil redevient sujet à une nouvelle résolution s'il réapparaît dans une collision future.

## Requirements *(mandatory)*

### Functional Requirements

- **FR-001**: Le système DOIT permettre de réaliser un import complet sans qu'aucun profil de boîtiers n'ait été déclaré au préalable.
- **FR-002**: Le système DOIT désambiguïser par défaut deux fichiers de même nom d'origine à partir du tag EXIF de modèle de chaque fichier, sans exiger que ce modèle soit préalablement enregistré dans un profil déclaré.
- **FR-003**: Le système DOIT ne demander une résolution à l'utilisateur qu'au moment où une collision réelle de nom de fichier est détectée entre des fichiers dont le tag de modèle est identique ou absent — jamais par anticipation avant qu'une collision ne survienne.
- **FR-004**: Lorsqu'une collision oppose deux fichiers indiquant le même modèle de boîtier, le système DOIT tenter de les distinguer automatiquement à partir du numéro de série de boîtier lu dans les métadonnées, quand celui-ci est présent et exploitable (non vide, non valeur générique), sans intervention de l'utilisateur.
- **FR-005**: Lorsque le numéro de série est absent, vide ou inexploitable pour une collision réelle, le système DOIT demander à l'utilisateur d'étiqueter manuellement la source de chaque fichier concerné.
- **FR-006**: Une fois une source de boîtier résolue (par modèle, numéro de série ou étiquetage manuel), le système DOIT réutiliser automatiquement cette résolution pour les imports ultérieurs du même boîtier, sans reposer la question.
- **FR-007**: L'utilisateur DOIT pouvoir consulter, ajouter ou modifier les boîtiers déclarés à tout moment, indépendamment de tout import en cours — cette action reste disponible bien qu'elle ne soit jamais une étape obligatoire avant un import.
- **FR-008**: La détection d'un modèle de boîtier jamais rencontré auparavant dans les métadonnées d'un fichier ne DOIT, en l'absence de toute collision réelle, ni interrompre l'import ni exiger une action sur le profil.

### Key Entities

- **Profil de boîtiers (optionnel)** : liste facultative d'appareils associés à des identifiants de résolution (modèle, numéro de série, ou étiquette manuelle), alimentée à la demande plutôt qu'en prérequis d'installation.
- **Collision de nom d'origine** : événement déclencheur, détecté lorsque deux fichiers partagent un même nom de fichier d'origine mais un contenu différent (somme de contrôle différente).
- **Tag de modèle (métadonnées)** : source primaire et silencieuse de désambiguïsation entre boîtiers de modèles différents.
- **Numéro de série de boîtier (métadonnées)** : source de repli pour distinguer deux boîtiers strictement identiques (même marque, même modèle).
- **Étiquette manuelle de source** : dernier recours attribué par l'utilisateur quand aucune métadonnée ne permet de distinguer deux boîtiers en collision.

## Success Criteria *(mandatory)*

### Measurable Outcomes

- **SC-001**: 100% des imports sans collision de nom de fichier se terminent sans qu'aucune question relative aux boîtiers ne soit posée à l'utilisateur.
- **SC-002**: Un photographe découvrant Régine peut réaliser son premier import sans jamais avoir eu à ouvrir ou configurer un profil de boîtiers.
- **SC-003**: 100% des collisions réelles de nom de fichier sont résolues automatiquement (par modèle ou numéro de série) dès que cette information est présente et exploitable dans les métadonnées, sans intervention de l'utilisateur.
- **SC-004**: 100% des collisions non résolvables automatiquement déclenchent une demande d'étiquetage manuel plutôt qu'un classement erroné silencieux.
- **SC-005**: Une fois une source désambiguïsée pour un boîtier donné, aucune nouvelle question n'est posée pour ce même boîtier lors des imports ultérieurs.

## Assumptions

- Cette spécification révise le comportement décrit dans `specs/001-import-photos/spec.md` (exigences FR-015 et FR-016, ainsi que l'hypothèse selon laquelle le profil de boîtiers est un prérequis existant avant le premier import) : le profil devient une capacité optionnelle alimentée à la demande, et la détection d'un modèle inconnu sans collision ne déclenche plus de signalement systématique. Un alignement de la spécification 001 sur ce comportement révisé est nécessaire avant ou pendant la planification de l'import.
- Le mécanisme de détection de collision par somme de contrôle et le tag EXIF de numéro de série de boîtier restent ceux déjà décrits dans les notes de conception du projet ; seule la condition de déclenchement de la question posée à l'utilisateur change.
- Un boîtier qui ne rencontre jamais de collision réelle ne nécessite jamais d'entrée dans le profil : celui-ci peut rester vide indéfiniment pour un utilisateur qui n'a pas besoin de désambiguïsation.
- Cette fonctionnalité s'applique dans le contexte du module d'import (`specs/001-import-photos`) ; elle n'introduit pas de nouveau canal d'import ni de nouvelle destination de dossier.