Mode local : grimoire serve et les blueprints¶
Cette page décrit l'outil ; le langage est ailleurs
Ici : les pages de l'atelier, les gestes, ce que fait chaque bouton. Pour ce qu'un blueprint contient — nodes, pins, contrats, canaux, portes — voir Le système nodal, et Votre premier blueprint pour le parcourir en ligne de commande.
grimoire serve ouvre la vue de travail sur
http://127.0.0.1:4173/workspace/index.html : la coque unique décrite par
l'ADR de la vue de travail, avec l'espace
Concevoir pour l'éditeur de blueprints. L'UI complète reste embarquée dans le
paquet. Le serveur est lié à 127.0.0.1 — c'est un outil local, pas un
service.
Le site public (GitHub Pages) et l'atelier local sont la même UI : sans
API locale, les pages « atelier » affichent l'écran de premier lancement avec
les commandes ci-dessus ; avec grimoire serve, elles se branchent sur le
projet réel.
Les pages ci-dessous restent servies
atelier.html, blueprints.html, patterns.html et extensions.html
répondent toujours, mais redirigent désormais vers l'espace de la vue de
travail qui les remplace (Concevoir, pour les trois derniers). Ajouter
?legacy=1 à l'URL les sert sans redirection — c'est ce que décrit le
reste de cette page.
Options utiles : grimoire serve --port 8080, --project-root <chemin>,
--no-open (ne pas ouvrir le navigateur).
Principe non négociable : le serveur lit, valide et écrit des artefacts ; il n'exécute rien. L'exécution appartient au runtime existant et passe par ses gates.
Les pages¶
| Page | Rôle |
|---|---|
atelier.html |
Hub du projet : premier lancement, wizard de setup, blueprints, extensions et artefacts |
patterns.html |
Catalogue des 78 patterns (familles, contrats échangés, fiches) |
extensions.html |
Marketplace : extensions publiées, recherche, filtres par famille, blueprints publiés |
blueprints.html |
Éditeur de flows (Studio) : composer, connecter, valider, simuler, compiler |
memory.html · kanban.html · observability.html |
Observer : mémoire, tableau gouverné, télémétrie — du projet servi, ou rien |
Les pages partagées avec le site publié — accueil, portefeuille — gardent leur
habillage vitrine, mais l'atelier sait qu'il est servi en local : ni lien vers
la démo publique, ni invitation à installer ce qui tourne déjà. Le passage vers
atelier.html reste offert en un lien.
Changer de projet¶
Le bouton de projet, en haut de la barre latérale, ouvre le sélecteur : les projets connus de la machine, une navigation dossier par dossier (ou un chemin collé), et un scan borné d'une racine qui propose sans enrôler. Choisir un projet re-route le serveur en cours — pas de second processus à lancer.
Le registre est celui de grimoire cockpit (~/.grimoire/cockpit/registry.json) :
un projet ouvert dans l'atelier apparaît dans le portefeuille, et
réciproquement. Ouvrir un projet n'écrit rien dans son arbre : la couche de
données générée vit sous ~/.grimoire/cockpit/atelier/<slug>/data/.
La découverte ne regarde pas partout. Un chemin venu d'une requête HTTP ne doit pas pouvoir désigner n'importe quel dossier du système, même derrière un garde d'hôte. Sont autorisés :
- le répertoire personnel ;
- le projet servi et son dossier parent — de quoi scanner ses voisins dès le premier lancement ;
- le dossier parent de chaque projet déjà enrôlé, ce qui garde atteignable un
dépôt hors de
$HOME.
Une racine entièrement nouvelle s'ouvre par grimoire cockpit add <chemin>,
qui n'est pas exposé au réseau.
Ce que montrent Observatoire, Mémoire et Kanban¶
Une couche générée sur le projet servi (gen-site-data.py, régénérée en
arrière-plan au démarrage et à chaque changement de projet), jamais
l'instantané de la vitrine publique embarqué dans la wheel. Un projet qui n'a
lancé aucun agent a un observatoire vide, et le dit — afficher des traces
inventées horodatées à l'instant serait pire. La chip données du tableau de
bord montre l'état de la couche ; un clic la régénère.
Mémoire multi-projets¶
memory_link_status() reste mono-projet ; l'espace Mémoire de la vue de
travail ajoute un onglet Flotte qui agrège côté serveur, sans écriture ni
fusion de stores (issue #172, dernier volet de « du générateur statique au
portefeuille actif ») :
- le zoom du docbar bascule entre « Ce projet » et « Tous les projets » —
sans
projects=, la réponse ne porte que le projet déjà servi ; - le tableau agrégé montre, par projet du registre, backend configuré et résolu, nombre d'entrées, dernière écriture et état de l'index lexical (primaire, compagnon d'une fusion hybride, ou absent) ; un projet illisible apparaît avec sa raison, jamais comme un store vide ;
- la recherche croisée interroge la même chaîne que
grimoire memory searchpour chaque projet sélectionné et fusionne uniquement la LISTE des résultats, étiquetés par leur projet d'origine — jamais leur contenu ; cliquer un résultat l'ouvre dans le panneau d'inspection.
Le board (espace Exécuter)¶
kanban.html reste servi comme vitrine statique (lecture du JSON plat du
projet primaire, sans écriture), mais le board vivant est dans l'espace
Exécuter de la vue de travail : workspace/index.html#executer, sur
grimoire serve comme sur grimoire cockpit serve. Il lit les tâches
réelles du Mission Ledger (ADR-005) plutôt qu'un task-board.yaml écrit à la
main, et change de contenu avec le projet sélectionné — sur le cockpit,
?project=<slug> cible un autre board à chaque lecture, jamais « le dernier
projet regardé ».
Lecture — chaque carte porte son corps réel : description, critères
d'acceptation, garde-fous, preuves attendues, dépendances (et les blocages
qu'elles impliquent). Rien de tout cela n'existait dans task-board.yaml,
qui ne connaît qu'un titre, un owner et des références de fichiers ; c'est le
MissionTask du ledger qui les porte, et l'inspecteur les affiche tel quel.
Commandes d'intention, jamais de mutation libre — une carte ne s'édite
pas par glisser-déposer. Le bouton « Réaliser » de l'inspecteur propose une
transition (réclamer, avancer, bloquer, clôturer) au même service que la CLI
(grimoire task …, voir référence CLI) : la machine à
états puis le gate de preuve s'appliquent avant toute écriture. Un gate rouge
répond 200 avec blocked: true et nomme l'artefact manquant et son remède
— ce n'est pas une panne du serveur, c'est la réponse ; la carte ne bouge
pas. Exactement le principe qu'ADR-007 pose pour toute webview du kit : la
webview n'est jamais une autorité causale.
Restriction d'écriture — comme le reste de la vue de travail, ces
commandes ne s'exécutent que pour le projet que l'hôte sert en direct
(grimoire serve, ou le projet de lancement de grimoire cockpit serve) ;
regarder un autre projet du registre depuis le cockpit reste une lecture
seule, refusée en 403 côté serveur si on tente d'agir dessus — pas
seulement grisée côté client.
Timeline par tâche (#139) — le drill-down vers la timeline complète d'une
tâche est un onglet séparé du même espace (« Voir la timeline » depuis
l'inspecteur d'une carte, ou onglet « Timeline » du docbar), décrit par
l'ADR de la vue de travail. Elle assemble, triés
dans le temps, tout ce que grimoire task trace <id> lit déjà côté CLI
(Mission Ledger, TraceLedger des hooks — outils, gates rouges, dispatch
d'agent —, RuntimeKernel, EvidenceService) et, s'il en existe un, l'export
OTel du TraceLedger (grimoire task trace-export, #322) : c'est la même
donnée, projetée en spans GenAI, affichée comme une source à part (« otel »)
plutôt qu'ignorée. Chaque ligne est filtrable par source et par gravité, et
s'ouvre pour montrer son détail brut (identifiants de trace, tags, span) dans
le panneau d'inspection — jamais le contenu d'un prompt. L'espace Observer
ouvre la même timeline depuis un span OTel qui porte grimoire.task_id (panneau
« Spans lents » ou « Traces par agent »). Comme le reste de la vue de travail,
c'est une lecture : aucune de ces deux entrées ne crée ni ne modifie quoi que
ce soit (ADR-007).
Une tâche sans aucun événement montre « aucun événement », jamais un board
imaginé : la timeline nomme les sources qu'elle a lues et celles qui
manquent, comme grimoire task trace le fait déjà en CLI.
L'éditeur de blueprints¶
Un blueprint (_grimoire/blueprints/*.blueprint.json) décrit un flow
agentique comme un graphe de nodes typés.
Composer — la palette latérale ajoute d'un clic : patterns du catalogue, use-cases composites, artefacts du projet, nodes d'extensions.
Connecter — Maj + glisser d'un node vers un autre : la connexion se crée si un contrat commun existe entre pins (task envelope, handoff packet...), sinon elle est refusée. Une connexion sans contrat commun ne compile pas.
Propriétés — sélectionner un node : label éditable, contrats des pins modifiables depuis la liste du catalogue, suppression. Ctrl+Z annule, RÉORGANISER applique un layout dirigé.
Valider — lint normatif dérivé du catalogue : dépendances de patterns absentes du flow, heuristique « Faux Done » (aucun pattern de preuve QUA-*), nodes isolés.
Simuler — dry-run sans effet : ordre topologique, cycles bloquants, prérequis par node (contrôles du pattern, artefact présent, extension installée), verdict prêt/bloqué.
Compiler — un blueprint prêt devient un mission pack
.github/prompts/{id}.blueprint.prompt.md exécutable par l'orchestrateur :
plan d'exécution ordonné, obligations par pattern, contrats aux frontières.
La section compiled du blueprint trace le hash (détection de dérive).
Aucun apply automatique : le diff git reste la revue.
Rejouer — la télémétrie (events.jsonl) se rejoue sur le graphe via les
bindings du blueprint.
API locale¶
| Route | Rôle |
|---|---|
GET /api/status |
Racine projet, version kit, UI servie |
GET /api/setup · POST /api/setup |
Vue des artefacts / plan d'init (wizard) |
GET /api/archetypes |
Archetypes du kit (wizard) |
GET /api/extensions · POST /api/extensions/add · /remove |
Gestion des extensions |
GET/PUT /api/blueprints/<id> |
CRUD des blueprints |
POST /api/blueprints/<id>/validate · /simulate · /compile |
Lint, dry-run, compilation |
GET /api/events (SSE) · GET /api/events/log |
Télémétrie live et replay |
GET /api/stigmergy |
Vue live du tableau phéromonique (signaux actifs, trails, métriques) — beta |
GET /api/projects · POST /api/projects/select |
Registre de la machine · re-router le serveur sur un autre projet |
POST /api/projects/add · /scan |
Enrôler un chemin · découvrir les projets sous une racine (sans enrôler) |
GET /api/fs/browse?path= |
Navigation dossier par dossier, pour désigner un projet à la main — bornée aux racines permises |
(cockpit) GET /api/fs/browse · POST /api/projects/add\|scan |
Même découverte depuis le portefeuille : peupler le registre de la machine n'est pas une écriture sur un projet |
GET /api/data/status · POST /api/data/refresh |
État et régénération de la couche de données du projet servi |
GET /api/health |
Alignement kit, flows composés, exécutions en vol et activité réelle du projet |
POST /api/projects/update |
grimoire up sur le projet — aperçu par défaut, écriture sur confirm: true |
GET /api/workspace/memory/overview?projects=all\|<slugs> |
Agrégation mémoire multi-projets (#172) : backend, entrées, dernière écriture, index lexical, par projet du registre |
GET /api/workspace/memory/search?q=…&projects=… |
Recherche croisée en lecture seule — même moteur que grimoire memory search, résultats étiquetés par projet, jamais fusionnés |
Le bloc behavior de GET /api/stigmergy porte les métriques de promotion
beta→stable et la thèse qu'elles testent (QUA-13, mesure-sans-hypothèse) :
usefulRatio— part des signaux émis ayant produit une coordination utile (résolution ou relais) ;targetUsefulRatio(0.4) — seuil de promotion visé ;minEmitted(20) — volume minimal d'émissions pour que la mesure compte ;hypothesis— l'hypothèse testée, en clair ;promotionReady—truequandusefulRatio >= targetUsefulRatiosur au moinsminEmittedémissions : la mesure sert une décision.
Chaque mutation servie (POST /api/extensions/add|remove, toggle de feature,
PUT et compile de blueprint) est tracée en JSONL dans
_grimoire-runtime-output/hook-runtime/serve-mutations.jsonl (QUA-08) ; les
GET restent silencieux. La sélection d'un projet ne l'est pas : ouvrir un
dépôt n'est pas le modifier, et journaliser dans son arbre salirait le
git status de tout projet qu'on se contente de regarder.
Les blueprints du Studio (format v2, positionné) sont acceptés directement : le serveur en dérive la projection compilable (pins typés depuis les contrats, sous-flows aplatis) pour valider, simuler et compiler.
Pour un contrôle fin (UI custom, racine du kit), la forme longue reste
disponible : python -m grimoire.tools.forge_server --ui-dir <dir> --kit-root <dir>.