# #215 — Fusion bloc 1 : barre d'apps commune et références croisées des notes > Programme **Fusion** (accès centralisé entre ObsiGate, Flowdeck, TikTak et > Kanbante). Dépôt programme : `Projets/fusion-trois-apps` (épopée ACC-1, > issues ObsiGate #5, #6, #7). Contrats : `Projets/dracodev-commons` v0.1.0 > (`contrats/liens-profonds.md`, `contrats/external_ref.schema.json`, > snippet `ui/barre-apps/`). ## Ce qui est livré ### ACC-1.1 — Barre d'apps commune (#5) Le snippet figé de commons est **vendangé** (copié, jamais chargé depuis une autre app — la barre survit à l'arrêt des autres applications) : - `frontend/draco-barre.css` / `frontend/draco-barre.js` : copie v0.1.0 ; - markup + configuration dans `frontend/index.html`, au-dessus de `#app` (`body.has-draco-bar` ajuste la hauteur de `.app-container` dans `style.css`). Phase 1 : navigation entre les quatre applications (ObsiGate marquée active), sélecteur de domaine mémorisé en `localStorage` (`draco_domain`, même clé que TikTak), recherche = focus de la recherche native, rail = bouton latéral natif, menu = menu d'en-tête natif. Alertes unifiées et panneau Spark affichent un message d'arrivée (fédération et agent commun : phases ultérieures du programme) plutôt que des boutons morts. Les compteurs croisés viendront avec la fédération ; seul le compteur local de chaque app est alimenté en phase 1. ### ACC-1.3 — Références croisées `external_ref` (#7) - **Modèle** : le schéma figé de commons. La note est propriétaire de ses références (`owner_type = obsigate.note`, `owner_id = ":"`). - **Stockage** : JSON par utilisateur dans `data/external_refs/` (`backend/external_refs.py`, même patron que `backend/history.py` — pas de base de données). Surchargable par `OBSIGATE_EXTERNAL_REFS_DIR`. - **API** (auth + `check_vault_access`) : - `GET /api/refs?vault=&path=` — références d'une note ; - `POST /api/refs` `{vault, path, url, label?}` — création par collage d'URL profonde ; le parseur reconnaît les formes du contrat (TikTak `?task=`/`?list=`, ObsiGate `#file=`, Flowdeck `/pages/`/`/collections/`, issue Gitea = carte Kanbante) et répond **422** explicite sinon ; - `DELETE /api/refs/{id}`. - **UI** : section « Liens » en fin de note — liste avec pastille de couleur de l'app cible, formulaire d'ajout, retrait en un clic. Rendue par le module autonome `frontend/draco-liens.js`, branché sur l'événement `obsigate:file-rendered` que `renderFile` émet (point d'extension documenté dans `frontend/app.js`). ### ACC-1.2 — Notes projetées TikTak (#6) La synchro TikTak ↔ ObsiGate écrit `tiktak_id: ` dans le frontmatter des fichiers projetés. Le module `draco-liens.js` le détecte (lecture du brut via `/api/file/{vault}/raw`) et affiche un bandeau « Tâche TikTak projetée » avec le bouton **« Ouvrir dans TikTak »** (`https://tiktak.dracodev.net/?task=`), au lieu de traiter la note comme une note ordinaire. ## Limites assumées (v1) - Le libellé d'une référence est un instantané (titre par défaut dérivé de l'URL ou libellé libre) ; le rafraîchissement automatique du titre viendra avec la fédération MCP (phase 3 du programme). - Un lien dont la cible a disparu n'est pas détecté automatiquement (`status` reste `ok`) — la marque « cible introuvable » viendra avec la couche données. - La section « Liens » n'apparaît que dans la vue lecture d'une note (pas dans l'éditeur). ## Tests `tests/test_external_refs.py` : parseur (6 formes reconnues, 7 refusées), stockage (cycle + isolation par utilisateur), API (cycle complet, 422, 404, 403 vault inconnu).