- L'encours (colonnes en vol de l'espace) tous projets
actifs, regroupé PAR colonne, trié par âge décroissant
dans la colonne (pipeline _card_ages du board).
- En-tête : total + compteurs par colonne + limite WIP
globale (somme des projets qui en définissent).
- Entrées Pilotage (menu latéral) et palette Ctrl+K ; SSE
/api/stream via live.js comme les autres vues.
- Réutilise _collect_focus_groups : aucun appel forge en
plus. 286 tests verts (5 nouveaux, palier 23) ; vérifié
en Chromium réel (356 cartes en vol sur les vraies
données, dont la carte #24 elle-même).
test_column_entry_times_ignores_comments évaluait _days_ago(3)
à la création puis à l'assertion : une bascule de seconde
entre les deux faisait échouer le run CI 2333 alors que le
run jumeau (tag v0.33.0) et la suite locale passaient.
La dérivation 0.32.1 ne couvrait que les URL sœurs depuis
AGENT_EVENEMENTS_URL, jamais agent_url : sur la dev, le panneau
visait le défaut prod (agent injoignable, prod non installée),
console morte. Désormais, pour tout rendu à une requête (barre,
iframe du panneau, CSP frame-src) : explicite > hôte public au
motif fermé dracodev > dérivation élargie (événements ou base du
service) > défaut officiel. Contextes sans requête inchangés
sinon ; aucun SSO ajouté.
- Carte compositeur : en-tête + colonne d'arrivée, champ
pleine largeur, bouton primaire ; neutralise le
display:flex imposé par .board-toolbar aux formulaires.
- 'Ajouter une description' devient un <details> natif :
aucun JS requis, insensible au cache et aux erreurs de
scripts (le bouton 0.31.0 pouvait rester inerte).
- Assets du board versionnés (?v=APP_VERSION) contre les
mélanges de cache après redéploiement ; Ctrl+Entrée.
- Vérifié en Chromium réel sur le vrai board (captures
contrôlées) ; 261 tests verts.
- 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.