- Tiroir : édition du titre et de la description (PATCH
forge, journal 'edited', EVENT_TYPES étendu), création
avec description dépliable.
- Pièces jointes Gitea de bout en bout : client
list/upload/delete/download (le téléchargement suit
browser_download_url — l'endpoint asset ne sert que du
JSON, attrapé au smoke réel), routes proxifiées avec
CSRF et plafond 25 Mio, UI liste/envoi/suppression ;
GitHub : supports_attachments=False, message propre.
- Clic carte en délégation d'événement : les écouteurs par
carte mouraient au premier rafraîchissement live.
- 261 tests verts (7 nouveaux, palier 21) ; cycle réel
complet validé sur une issue jetable du vrai Gitea
(création, édition, envoi, téléchargement, suppression).
Depuis 0.24.0, /mcp exige session ou Basic : le service d'agents s'y
faisait refuser en 401 (vu en production, panneau Spark du 2026-10-21).
- Table api_tokens (empreinte SHA-256 seule), CRUD dans Mon profil
- Bearer honoré par le middleware sur /mcp et /api/ uniquement —
jamais l'interface web ; révocation et désactivation immédiates
- 235 tests verts (3 nouveaux : cycle de vie, compte désactivé,
handshake MCP par jeton quand l'auth est active)
- Comptes en base (PBKDF2), rôles, désactivation qui tue la
session, audit ; secours environnement pour l'opérateur ;
liaison draco par utilisateur ; page /profile.
- Espaces de travail : connexions, membres, sélection de
projets ; board/notes/épingles/journal scopés par espace ;
sélecteur d'espace, badge connexion.
- Panneaux /admin (utilisateurs, connexions, espaces,
paramètres — l'environnement amorce, le panneau gouverne).
- /archives : archive locale réversible, archivage forge
confirmé, purge de l'état local, export Markdown, file
« à archiver ? » avec archivage en lot.
- Correctif session : les comptes membres résolus par la base
(la session n'est plus limitée à l'opérateur d'environnement).
- 231 tests verts (12 nouveaux au palier 19).
- 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.