Concerne #20, #21 (cote ObsiGate), #22 (cote ObsiGate). Ne ferme aucune issue (fermeture = decision de Bruno, validation sur instance reelle en attente).
Contenu : backend/coffre_migration.py (apercu/import/purge + consommateurs avec octrois) ; routes GET migration/api-keys, POST import, POST purger (refusee sans confirmer: true), POST consommateurs/avec-octrois ; /distribuer accepte aussi le contexte imbrique {type, id} (cas Spark plat existait deja) ; bouton 'Importer l'existant' (admin, apercu -> import -> purge proposee ensuite) + 11 cles coffres.import_* fr/en ; docs COFFRE-sauvegarde-restauration.md (2 fichiers = sauvegarde chiffree, KEK externe hors serveur, perte de KEK = perte d'acces assumee) et COFFRE-contrat-distribution.md (erreurs -> acces_requis Spark) ; section Coffre dans .env.example.
Correctif UI : la modale de creation de secret depassait l'ecran (aucune borne de hauteur ni scroll interne). .obsigate-modal a desormais max-height: calc(100dvh - 32px), display:flex, flex-direction:column, .obsigate-modal-body overflow-y:auto, header/footer flex-shrink:0, padding overlay. Usages verifies sains (seuls coffres.js et ui.js utilisent ces classes).
BLOQUANT D'USAGE A CONNAITRE (pas un blocage de merge) : backend/ai.py et backend/tools/secrets.py lisent encore api_keys.json en clair et ne sont pas branches sur le coffre. Ne pas purger avant ce branchement (branche + PR separee a venir), sinon l'IA et les outils perdraient leurs cles. L'avertissement est dans l'UI et les docs.
Verifie : 35/35 pytest (26 + 9 nouveaux), ruff 0 erreur sur backend/, mypy 0 erreur sur 4 fichiers, py_compile + node --check OK, 10/10 fichiers re-telecharges identiques. Non verifie : CI Gitea de la branche, import/purge reels, restauration reelle sur instance vierge.
Concerne #20, #21 (cote ObsiGate), #22 (cote ObsiGate). Ne ferme aucune issue (fermeture = decision de Bruno, validation sur instance reelle en attente).
Contenu : backend/coffre_migration.py (apercu/import/purge + consommateurs avec octrois) ; routes GET migration/api-keys, POST import, POST purger (refusee sans confirmer: true), POST consommateurs/avec-octrois ; /distribuer accepte aussi le contexte imbrique {type, id} (cas Spark plat existait deja) ; bouton 'Importer l'existant' (admin, apercu -> import -> purge proposee ensuite) + 11 cles coffres.import_* fr/en ; docs COFFRE-sauvegarde-restauration.md (2 fichiers = sauvegarde chiffree, KEK externe hors serveur, perte de KEK = perte d'acces assumee) et COFFRE-contrat-distribution.md (erreurs -> acces_requis Spark) ; section Coffre dans .env.example.
Correctif UI : la modale de creation de secret depassait l'ecran (aucune borne de hauteur ni scroll interne). .obsigate-modal a desormais max-height: calc(100dvh - 32px), display:flex, flex-direction:column, .obsigate-modal-body overflow-y:auto, header/footer flex-shrink:0, padding overlay. Usages verifies sains (seuls coffres.js et ui.js utilisent ces classes).
BLOQUANT D'USAGE A CONNAITRE (pas un blocage de merge) : backend/ai.py et backend/tools/secrets.py lisent encore api_keys.json en clair et ne sont pas branches sur le coffre. Ne pas purger avant ce branchement (branche + PR separee a venir), sinon l'IA et les outils perdraient leurs cles. L'avertissement est dans l'UI et les docs.
Verifie : 35/35 pytest (26 + 9 nouveaux), ruff 0 erreur sur backend/, mypy 0 erreur sur 4 fichiers, py_compile + node --check OK, 10/10 fichiers re-telecharges identiques. Non verifie : CI Gitea de la branche, import/purge reels, restauration reelle sur instance vierge.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Concerne #20, #21 (cote ObsiGate), #22 (cote ObsiGate). Ne ferme aucune issue (fermeture = decision de Bruno, validation sur instance reelle en attente).
Contenu : backend/coffre_migration.py (apercu/import/purge + consommateurs avec octrois) ; routes GET migration/api-keys, POST import, POST purger (refusee sans confirmer: true), POST consommateurs/avec-octrois ; /distribuer accepte aussi le contexte imbrique {type, id} (cas Spark plat existait deja) ; bouton 'Importer l'existant' (admin, apercu -> import -> purge proposee ensuite) + 11 cles coffres.import_* fr/en ; docs COFFRE-sauvegarde-restauration.md (2 fichiers = sauvegarde chiffree, KEK externe hors serveur, perte de KEK = perte d'acces assumee) et COFFRE-contrat-distribution.md (erreurs -> acces_requis Spark) ; section Coffre dans .env.example.
Correctif UI : la modale de creation de secret depassait l'ecran (aucune borne de hauteur ni scroll interne). .obsigate-modal a desormais max-height: calc(100dvh - 32px), display:flex, flex-direction:column, .obsigate-modal-body overflow-y:auto, header/footer flex-shrink:0, padding overlay. Usages verifies sains (seuls coffres.js et ui.js utilisent ces classes).
BLOQUANT D'USAGE A CONNAITRE (pas un blocage de merge) : backend/ai.py et backend/tools/secrets.py lisent encore api_keys.json en clair et ne sont pas branches sur le coffre. Ne pas purger avant ce branchement (branche + PR separee a venir), sinon l'IA et les outils perdraient leurs cles. L'avertissement est dans l'UI et les docs.
Verifie : 35/35 pytest (26 + 9 nouveaux), ruff 0 erreur sur backend/, mypy 0 erreur sur 4 fichiers, py_compile + node --check OK, 10/10 fichiers re-telecharges identiques. Non verifie : CI Gitea de la branche, import/purge reels, restauration reelle sur instance vierge.