- Bouton replier : icône seule dans l'en-tête, gabarit du bouton
recherche ; le pied garde version + fraîcheur + Sortir.
- Une seule section ouverte à la fois (kanbante-nav-open),
amorce serveur selon la page courante, plus de kanbante-nav-closed.
- GET /api/repos exhaustif (épinglés, récents, archivés),
la palette garde son plafond de 60.
- repo-picker.js : liste filtrée sur les deux segments,
complétion Tab façon shell (pr Tab → Projets/ avec le
séparateur posé, kan Tab → kanbante), ↑/↓/Entrée/clic,
avertissement doux si le dépôt n'existe pas.
- tablesort.js : parseFloat lisait l'année des dates ISO (2026)
et mettait toutes les lignes à égalité — comparaison numérique
seulement pour les valeurs entièrement numériques.
- dashboard.js : pinned-grid rejoint les grilles triées et
regroupées (son exclusion rendait les deux outils invisibles
là où l'œil se pose) ; dates comparées via Date.parse.
- data-first-dir=desc sur Dernière activité / Écart / Zombies.
- Titre « Projets » + sous-titre discret (fini le Bonjour 👋),
en-tête deux fois plus compact.
- Les 4 statistiques deviennent une bande KPI bordée unique
(séparateurs fins, chiffres tabulaires, KPI journal cliquables
vers /activity).
- Onglets/filtre/tri/regroupement/vue réunis dans UNE barre :
contrôle segmenté avec pastilles de compte, filtre rectangle.
Crochets JS/Alpine inchangés ; .stat-tile conservée (briefing).
- /forecast : une ligne par jalon, tous projets, triée par
risque (écart décroissant), filtrable, ancres ms-<owner>-<repo>
pointées par le bloc jalon des cartes du dashboard ; débit
par projet conservé en tableau compact.
- /health : tableau trié par sévérité (pastille, zombies,
goulot) ; page détail : sélecteur de projet (health.js).
- Tri des tableaux mutualisé dans static/js/tablesort.js
(dashboard, forecast, health).
- _parallel_map : asyncio.gather borné (16) pour dashboard,
/health, /forecast, /triage et le mur — le patron de /focus,
généralisé. Avant : la page attendait la somme des allers-
retours Gitea de tous les dépôts, en séquentiel.
- Client Gitea : les listes (dépôts, issues, jalons, étoiles)
passent en stale-while-revalidate — une entrée périmée est
servie immédiatement et rafraîchie en tâche de fond. Les
mutations vident le cache et bumpent une génération qui
désarme les rafraîchissements en vol.
- /forecast calcule des lignes de jalons tous projets (écart
ETA/échéance) ; /health trie par sévérité et expose la
pastille ; le détail santé reçoit la liste des projets.
Menu d'actions rapides par carte; barre d'outils tri +
regroupement par propriétaire (sections repliables, préférences
localStorage); bascule Grille/Liste persistée avec tableaux
triables réutilisant jalon/santé des cartes; dashboard.js dédié.
get_project_activity(): fermetures/déplacements 7 j et dernier
événement par dépôt en une seule requête sur board_events;
la page /capture accepte ?repo= pour pré-remplir le dépôt.
Accueil du projet assemblé des briques existantes: jalons
ouverts (progression, échéances, ETA), santé en résumé, débit,
activité récente du journal, notes; actions board/capture/
triage/santé/wallboard/Gitea. Le titre des cartes y pointe.
list_starred/set_starred sur /user/starred (vérité dans la
forge), endpoint POST /api/projects/{o}/{r}/star (CSRF), section
Épinglés hors onglets, bouton étoile sur les cartes et bascule
sans rechargement; les épinglés sortent de leur grille d'onglet.
Bloc jalon (progression Gitea, échéance FR, retard, ETA journal
avec signal après-échéance — mêmes définitions que le bandeau
du board) et point santé vert/orange/rouge dérivé de
_project_health, info-bulle et lien vers /health du projet.
Le bouton Recherche & commandes devient une icône 🔍 seule à
droite du titre (sous le logo en rail replié). Les groupes
deviennent des accordéons: chevron animé, transition douce,
sections fermées mémorisées (appliquées avant le rendu), section
de la page courante toujours ouverte; rail replié = icônes.
La diapositive ne grandit plus au-delà de l'écran: plus de barre
de défilement de page, « Ouvertes »/« Fermées »/« EN DIRECT »
toujours affichés au-dessus de la navigation des diapos; cartes
tronquées en fondu + ligne « +N autres cartes en vol »; mode
compact sous 760px de hauteur (TV 720p).
Retour de Bruno sur la 0.15.0 (disposition pas conviviale, trop
de place, mobile inchangé): la barre horizontale disparaît.
Barre latérale groupée (Principal/Rituels/Pilotage/Outils),
repliable en rail d'icônes mémorisé sur desktop, tiroir
hors-canvas sur mobile; topbar de 52px (fil d'Ariane + actions).
Partiel _header.html unique pour les 19 pages (fin des copies qui
dérivaient): desktop une ligne — primaires + menu Plus + Ctrl K,
page active déduite du gabarit dans render(); mobile ≤900px
burger + panneau ≥44px, Échap/clic extérieur; wallboard sans
header et triage sur le même partiel. nav.js partagé.
app/flow.py: séjours par colonne reconstruits du journal,
médianes, colonne la plus lente; zombies = aucune activité
(journal/Gitea) depuis KANBANTE_ZOMBIE_DAYS (30). Pages /health
et /health/{o}/{r} + actions rapides (commenter/backlog/fermer).
slugify + branch_name_for (issue-<n>-<slug>, reconnu par #1/#2);
client create_branch; POST /api/issues/{o}/{r}/{n}/branch (nom
libre validé, idempotent si existante); la carte passe en En
cours, journalisée source branch, étiquette synchronisée;
formulaire dans la section Code lié du panneau détail.