- Nouveau critère 🔍 En attente de revue ↓ (compteur de la
colonne review exposé en data-review sur les cartes) ;
s'applique à toutes les grilles, Épinglés en tête,
préférence mémorisée comme les autres tris.
- Correctif attrapé au contrôle navigateur réel : le tri
« Issues ouvertes ↓ » historique triait croissant — le
comparateur inversait les clés numériques. Modes open et
review en ka - kb : plus grand compteur en premier.
Vérifié sur données réelles (Épinglés : 196, 95, 32, 5, 4).
- 299 tests verts (3 nouveaux, palier 25).
Le serveur MCP n'exposait en écriture que create_issue et
add_comment : un déplacement approuvé côté service d'agents
(kanbante.move_card, vague H3) aurait échoué faute d'outil.
- move_issue (owner, repo, number, column) réutilise le service
de déplacement de l'interface (_do_move_card, extrait de
POST /api/move sans changement de comportement) : board
local, journal source « mcp », miroir d'étiquette kanban:*
remplacée, autres étiquettes préservées.
- Colonne acceptée par clé, par étiquette de forge ou par
libellé français affiché (définitions de l'espace).
- Garde doctrine : la cible done (« Terminé ») est refusée
avant toute écriture — les agents s'arrêtent en Révision.
- Erreurs propres : colonne inconnue (liste des valides),
dépôt/issue inconnu, pull request refusée.
- 296 tests verts (5 nouveaux + épingles de la liste d'outils
mises à jour).
- Clients : create_milestone / update_milestone (cache
invalidé) ; GitHub hérite des mêmes endpoints.
- API Kanbante : création, modification (titre/échéance,
échéance vidée = retirée), fermeture ; CSRF, validation
de date avant toute écriture, erreurs forge en 502.
- Page Projet : formulaire 'Nouveau jalon' + édition/
fermeture par jalon (project.js versionné).
- Échéance à midi UTC : à minuit, le fuseau de l'instance
Gitea faisait reculer la date affichée d'un jour (réel).
- 291 tests verts (5 nouveaux, palier 24) ; cycle réel
complet sur Projets/kanbante (jalons smoke #37/#38 créés,
dates vérifiées, fermés).
- 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).
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)
from tests.conftest import ... levait ModuleNotFoundError en CI :
le binaire pytest n'ajoute pas le répertoire courant à sys.path,
contrairement à python -m pytest (utilisé en local, qui masquait le
problème). Correctifs : tests/__init__.py (package), pythonpath=[.]
dans la config pytest, et étape CI en python -m pytest.
Vérifié : 36/36 dans les trois modes d'invocation.