# Changelog — ObsiGate
Toutes les modifications notables d'ObsiGate sont documentées dans ce fichier.
Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
> **En cours de développement** : les changements à venir sont listés dans la section
> [Unreleased](#unreleased). La dernière version livrée est **2.75.0**.
---
## [Unreleased]
---
## [2.75.0] — 2026-10-22
### Ajouté
- **Panneau Spark v2 (#219, Fusion — Lot 1)** — les assets partagés
`frontend/draco-panneau.js` / `frontend/draco-panneau.css` passent
en v2, à l'identique dans les quatre applications : réponses de
l'agent en **Markdown rendu** (HTML produit par le service
d'agents 0.10.0, sanitizé côté serveur), **largeur réglable**
persistée, **thème clair/sombre** aligné sur l'application hôte
(suivi en direct de `html[data-theme]`), et **discussions façon
Muse** — discussion principale perpétuelle et discussions
parallèles créées, archivées, supprimées depuis le tiroir du
panneau. Aucun code propre à ObsiGate n'est modifié ;
redéploiement Docker requis.
---
## [2.74.0] — 2026-10-22
### Ajouté
- **Panneau Spark intégré (#218, Fusion)** — le bouton Spark de la
barre commune ouvre le panneau de l'agent commun (conversation,
Aujourd'hui, approbations, missions longues), comme dans TikTak,
Flowdeck et Kanbante : assets partagés `frontend/draco-panneau.js`
et `frontend/draco-panneau.css` vendangés à l'identique, action
`spark` branchée sur `DRACO_PANNEAU.toggle()`. La CSP nomme
`https://agent.dracodev.net` en `connect-src` (seul hôte ajouté).
Redéploiement Docker requis.
---
## [2.73.1] — 2026-10-21
### Corrigé
- **Barre commune v0.1.4 — palier mobile élargi de 700 à 900 px**
(suite de BUG-118) : entre les deux seuils, la barre complète
ne tenait pas (fenêtres réduites, tablettes, webviews) alors
que les apps sont déjà en mise en page mobile ; le resserré
(app courante, alertes, Spark, avatar) s'applique maintenant
dès 900 px, et le décalage de `.app-container` suit le même
seuil. Le changement d'app reste assuré par le menu du ✦.
---
## [2.73.0] — 2026-10-21
### Ajouté
- **Menu des applications par la marque ✦** (barre commune
**v0.1.3**, #215) : cliquer le ✦ — un peu plus gros (24 px) —
ouvre le menu des 4 applications (liens, icônes, badges), sur
mobile comme sur bureau. C'est le changement d'app en mobile,
où les onglets sont repliés depuis la v0.1.2. Fermeture au
clic extérieur ou à Échap. Choix de Bruno (2026-10-21).
---
## [2.72.1] — 2026-10-21
### Corrigé
- **BUG-118 — barre d'apps Fusion en mobile** : la barre commune
passe en **v0.1.2** (dracodev-commons) — au palier ≤ 700 px elle
ne garde que la marque, l'onglet de l'app courante, les alertes,
Spark et l'avatar (avant : onglets et pastilles domaines entiers,
barre débordante sur téléphone). Le bouton ☰ de la barre pilote
désormais le bon bouton selon la largeur : barre latérale bureau
au-delà de 768 px, **vrai hamburger mobile** (tiroir) en dessous —
avant, il cliquait le bouton bureau et ne faisait rien sur
téléphone, donnant l'impression d'un hamburger mort à côté de
celui d'ObsiGate. Test : `tests/test_draco_barre.py`.
---
## [2.72.0] — 2026-10-20
### Ajouté
- **Fusion ACC-3.2 (#217) — validation locale du jeton
`draco_session`** : `get_current_user` accepte le cookie partagé à
défaut de jeton natif valide ; le `sub` étant l'identifiant
ObsiGate, la correspondance vers le compte local est directe
(compte actif et garde-fou « changement de mot de passe » exigés).
Fiche : `docs/features/fusion-acc32-validation-locale-217.md`.
---
## [2.71.0] — 2026-10-20
### Ajouté
- **Fusion ACC-3.1 (#216) — émettrice SSO `draco_session`** : ObsiGate
émet le cookie de session partagé de l'écosystème dracodev (JWS
HS256, claims minimaux, 12 h, domaine `.dracodev.net`) à chaque
connexion, le renouvelle de façon glissante (middleware dédié), le
révoque à la déconnexion (liste des `jti` exposée aux autres apps
sous clé machine) et offre `GET /sso/authorize` avec `return_to`
en liste blanche anti open-redirect. Inerte tant que
`DRACO_SESSION_SECRET` n'est pas configuré. Fiche :
`docs/features/fusion-acc31-sso-draco-session-216.md`.
---
## [2.70.1] — 2026-10-20
### Corrigé
- **Sécurité des dépendances (CI `pip-audit` rouge sur 2.70.0)** —
planchers relevés dans `backend/requirements.txt`, selon le patron
déjà en place dans le fichier : `aiohttp>=3.14.4` (8 CVE corrigées en
3.14.4, dont CVE-2026-111063/111064), `mcp==1.30.0` (CVE-2026-59951),
`pillow>=13.0.0` (8 CVE corrigées en 13.0.0, dont CVE-2026-112895) et
plancher explicite `certifi>=2026.10.19` (PYSEC-2026-4320, dépendance
transitive). `pip-audit` redevient vierge ; aucune ligne de code
applicatif n'est touchée.
---
## [2.70.0] — 2026-10-20
### Ajouté
- **#215 — Fusion bloc 1 : barre d'apps commune et références croisées des
notes** (programme Fusion, issues Gitea #5/#6/#7 ; contrats
`dracodev-commons` v0.1.0) :
- **Barre d'apps commune** en tête de l'interface (snippet figé vendangé :
`frontend/draco-barre.css/.js`, markup dans `index.html`) — navigation
vers ObsiGate, Flowdeck, TikTak et Kanbante, ObsiGate marquée active,
sélecteur de domaine mémorisé ; la recherche, le rail et le menu délèguent
aux contrôles natifs d'ObsiGate.
- **Références croisées `external_ref`** : section « Liens » dans la vue
d'une note — coller une URL profonde (Flowdeck, TikTak, issue Gitea =
carte Kanbante, ObsiGate) crée la référence (libellé automatique ou
libre, pastille de couleur de l'app cible). Backend : stockage JSON par
utilisateur (`backend/external_refs.py`), endpoints `GET/POST /api/refs`
et `DELETE /api/refs/{id}`, parseur d'URL conforme au contrat figé
(422 explicite sinon), schémas et tag OpenAPI « ExternalRefs ».
- **Notes projetées TikTak reconnues** (frontmatter `tiktak_id`) : bandeau
« Tâche TikTak projetée » et bouton « Ouvrir dans TikTak » dans la même
section (module `frontend/draco-liens.js`, point d'extension
`obsigate:file-rendered` émis par `renderFile`).
- i18n FR/EN (clés `draco.links.*`) ; tests `test_external_refs.py`.
---
## [2.69.0] — 2026-10-15
### Ajouté
- **#201 — menu contextuel « Déplacer » / « Dupliquer »** (fichiers *et* dossiers) dans la
sidebar : le modal de destination réutilise `promptTargetFolder` (celui de l'import, même
thème, sélecteur de voute + arbo filtrable), généralisé par un paramètre `opts` optionnel
(titre, résumé, libellé du bouton) ; l'emplacement actuel est pré-sélectionné ; cross-vault
refusé proprement. Nouveau endpoint `POST /api/duplicate/{vault}` (`duplicate_path` : copie
`X copie.ext`, collisions `copie 2`, `copie 3`… ; répertoires récursifs ; refus de dupliquer
un dossier dans lui-même ; index incrémental, SSE + webhooks). i18n FR/EN.
### Corrigé
- **BUG-117** — drag & drop interne de la sidebar (déplacement d'un fichier/dossier vers un
autre) inopérant et silencieux depuis #89 : la détection « dépôt externe » dans `onDrop`
testait `items.length > 0`, qui comptait aussi les formats *string* (`tree:*`) posés par
`setData` au `dragstart` interne → chaque déplacement basculait dans la branche upload et
disparaissait sans appel API ni toast. Restreinte aux vrais fichiers (`kind === 'file'`,
type `Files`, `files` non vide), avec priorité au `dragState`.
---
## [2.68.6] — 2026-10-14
---
## [2.68.5] — 2026-10-14
---
## [2.68.4] — 2026-10-14
### Corrigé
- **BUG-116** — éditeur Forge : après insertion d'un tableau (ou bloc de code,
diagramme), la textarea restait d'une seule ligne — les mutations
programmatiques de `ta.value` ne déclenchent pas l'événement `input`, seul
chemin qui rappelait `autoHeight()`. `insertAtCursor` et `wrapSelection` (les
deux points de passage de toutes les insertions) appellent désormais
`autoHeight()` + `updateLineNumbers()` — le nombre de lignes du gutter suit.
Vérifié en Playwright : tableau 4 lignes sur document d'une ligne → hauteur
51 → 189 px, gutter cohérent.
- **BUG-115** — éditeur Forge (aperçu et menus) : trois défauts —
(1) collure case à cocher/texte dans l'aperçu des checklists : le HTML du
serveur ne sépare pas l'`` du texte et `editor-poc.html` n'avait pas
la règle `.task-list-item` de `style.css` (ajoutée à son `