2.1 KiB
2.1 KiB
issueRef, version, updatedBy, updatedAt
| issueRef | version | updatedBy | updatedAt | ||||
|---|---|---|---|---|---|---|---|
| #97 | 3 |
|
1784915626417 |
Décision Architect (cadrage validé)
Bug 100% backend, deux défauts composés :
SaveOpenCodeProviderProfile::execute(usecases.rs:364-367) poseopencode_providersansopencode = None.- Invariant
opencode_backend_is_consistent(profile.rs:1220) existe mais jamais appelé (garde morte). Lecture prioriseopencode→ cloud écrasé (lifecycle.rs:2367,assistant/mod.rs:252).
Périmètre du lot (un seul, parallélisable)
- DevBackend :
- Domaine :
with_opencode/with_opencode_provider(profile.rs:1132,1140) imposent l'exclusion mutuelle (chacun efface l'autre). - Infrastructure :
FsProfileStore::saverejette tout profil incohérent →AppError::Invalid(active enfin le prédicat). - Application :
SaveOpenCodeProviderProfilereconstruit via builder (with_opencode_provider) ; idem pourSaveProfile/ConfigureProfiles. - Migration requise : à la lecture (ou passe dédiée), quand
opencodeETopencodeProviderprésents → dropperopencodestale (l'intention est cloud). Sinon ne corrige que les nouveaux profils.
- Domaine :
- DevFrontend : strip de la config inactive au save selon le mode courant (requis pour SaveProfile/ConfigureProfiles qui ne portent pas d'intention explicite ; backend reste autorité via la garde).
- QA : tests unitaires domaine (builders exclusifs) + garde store + intégration création profil cloud + scénario migration profils corrompus.
Décisions de frontière
- DTO
SaveOpenCodeProviderProfileRequestDtoinchangé (whole-profile) ; output = profil normalisé, autorité pour le frontend. - Priorité lecture
opencoded'abord gardée (irrelevant post-exclusion), commenter comme fallback défensif. - Duplication de la résolution (lifecycle.rs:2367 + assistant/mod.rs:252) = dette hexagonale préexistante, hors périmètre de ce lot (suivre, ne pas refactoriser ici).
Voir mémoire projet ticket97-opencode-provider-mutual-exclusion.