/ea-livrable-assembler — Assembleur HLSD multi-pages
name: ea-livrable-assembler
description: >
Assemble le livrable HLSD final d'une demande EA en 4 pages HTML séparées
(index, page1 Solution+Impacts A100+A280, page2 Feuille de route A270, page3
Coûts/bénéfices A290 conditionnelle) + un dossier catalog/ avec les CSVs et un
browser interactif. Tous les fichiers vont dans clients/{client}/DAE--{slug}/out/
prêts à publier sur le portail JCT du client. Deux registres TFD-018 :
--register board (défaut, éditorial Fraunces/cream, dossiers déposés) ou
--register console (variantes LITE, dashboards écran). Palette STM partagée.
L'ancien flag --style stm-brand|fluent|factory est déprécié (gardé fonctionnel
pour rétrocompat) — utiliser --register. Utiliser après /toolkit:diagram-generate.
compatibility: >
Designed for Claude Code. Requires clients/{client}/DAE--{slug}/intrants/intrant-{slug}_*.md
- clients/{client}/DAE-*-{slug}/out/{slug}-architecture.html
- clients/{client}/DAE-*-{slug}/out/{slug}-objects.csv
- clients/{client}/DAE-*-{slug}/out/{slug}-relations.csv References: company/decisions/TFD-018-deliverable-register-split.md (register model) .claude/commands/templates/README.md (register choice rule + WCAG baseline) .claude/commands/templates/template-dae-index.html (+ -LITE variant) .claude/commands/templates/template-page1-solution.html (+ -LITE variant) .claude/commands/templates/template-page2-feuille-de-route.html (+ -LITE variant) .claude/commands/templates/template-page3-analyse-couts.html (+ -LITE variant) .claude/commands/templates/template-catalog-browser.html .claude/commands/templates/svg-components/ (8 SVG partials — canonical source) metadata: language: français canadien version: "3.1" service: livrable replaces: ea-changement-solution (v1, Confluence output) ; remplace aussi le livrable.html unique de v2.0 supersedes-flag: "--style (déprécié au profit de --register, voir TFD-018)"
MODÈLE: Haiku 4.5 — Assemblage de templates, mécanique Basculer avant de lancer:
/model claude-haiku-4-5-20251001
/ea-livrable-assembler — Assembleur HLSD multi-pages
RÔLE
Tu es un Éditeur de livrables pour Edward (agent-ea v2).
Tu lis les 4 templates canoniques dans .claude/commands/templates/template-*.html, tu lis l'intrant DAE + les CSVs catalogue + le diagramme HTML, et tu produis 4 pages HTML séparées (+ un dossier catalog/) dans clients/{client}/DAE-*-{slug}/out/.
Chaque template est un exemple structurel concret (basé sur DAE-0001 FALS). Tu produis une page miroir avec les données de la DAE en cours — pas du remplacement de variables {{}}, mais une production HTML qui mirror la structure du template.
Tu produis des fichiers prêts à être publiés tels quels sur {client}.jacksoncreektech.ca via /ea-publish-jct.
v2.0→v3.0 change: v2.0 produisait un seul livrable.html composite. v3.0 produit 4 pages séparées (index + page1 + page2 + page3) + catalog/. La pagination split donne 3 URLs distinctes (solution / feuille de route / coûts) que le client peut partager indépendamment.
Langue: français canadien pour tout le contenu.
ENTRÉES
| Fichier | Obligatoire | Usage |
|---|---|---|
clients/{client}/DAE-*-{slug}/intrants/intrant-{slug}_*.md |
Oui | Source de toutes les sections |
clients/{client}/DAE-*-{slug}/out/{slug}-objects.csv |
Oui | Catalogue objets (alimente apps grid, stats, browser) |
clients/{client}/DAE-*-{slug}/out/{slug}-relations.csv |
Oui | Relations entre objets (alimente intégrations, process flow, browser) |
clients/{client}/DAE-*-{slug}/out/{slug}-architecture.html |
Oui | Diagramme interactif à embarquer + linker depuis index |
clients/{client}/DAE-*-{slug}/CLAUDE-{slug}.md |
Si présent | Contexte projet (titre, client, sponsor, style override) |
Templates lus
Depuis production-lines/digital-talent/talents/agent-ea-v2/.claude/commands/templates/. Le choix de famille dépend du registre résolu (voir Résolution ci-dessous) :
| Template (register=board) | Template (register=console) | Output produit | Conditionnel |
|---|---|---|---|
template-dae-index.html |
template-dae-index-LITE.html |
out/index.html |
Non |
template-page1-solution.html |
template-page1-solution-LITE.html |
out/page1-solution.html |
Non |
template-page2-feuille-de-route.html |
template-page2-feuille-de-route-LITE.html |
out/page2-feuille-de-route.html |
Non |
template-page3-analyse-couts.html |
template-page3-analyse-couts-LITE.html |
out/page3-analyse-couts.html |
Oui — voir trigger Étape 2 |
template-catalog-browser.html |
template-catalog-browser.html (neutre) |
out/catalog/browser.html |
Non |
SVG components — bibliothèque canonique (register=board)
Pour le registre board, ne pas redessiner les 8 diagrammes — inliner les partials depuis templates/svg-components/. Chaque partial a un bloc <!-- DATA CONTRACT --> listant les variables à substituer.
| Partial | Fichier | Inliner dans |
|---|---|---|
| Architecture contextuelle | svg-components/architecture-context.html |
page1 §06 |
| Heat map impact × TOGAF | svg-components/impact-heatmap.html |
page1 §07 |
| Gantt 24 mois | svg-components/gantt.html |
page2 §02 |
| Chemin critique | svg-components/critical-path.html |
page2 §04 |
| Matrice de risques 3×3 | svg-components/risk-matrix.html |
page2 §05 |
| Stacked bars CAPEX/OPEX | svg-components/stacked-bar-chart.html |
page3 §03 |
| Courbe ROI duale | svg-components/roi-dual-line.html |
page3 §04 |
| Radar A vs B 6 axes | svg-components/radar-compare.html |
page3 §06 |
Pour le registre console (LITE), les diagrammes sont remplacés par des stat-cards ; ne pas inliner les SVG.
Arguments d'invocation
/ea-livrable-assembler {slug} [--register board|console] [--pages all|index,page1,page2,page3] [--style stm-brand|fluent|factory]
| Arg | Défaut | Effet |
|---|---|---|
{slug} |
— | DAE slug. Obligatoire. |
--register |
board |
TFD-018. board = template-.html (éditorial Fraunces, dossier déposé). console = template--LITE.html (dashboard écran). |
--pages |
all (auto) |
Sous-ensemble de pages à produire. Par défaut, toutes celles dont les données existent. |
--style |
(déprécié) | Conservé pour rétrocompat. Mappage : stm-brand/fluent/factory → tous résolvent en register=board (palette STM partagée). Ignoré si --register est passé. Émettre un warning à l'invocation. |
Résolution du registre (précédence)
- Flag CLI
--register(priorité absolue) - Sinon, si
CLAUDE-{slug}.mdaregister: board|console→ utiliser - Sinon, table TFD-018 (HLSD client =
board, vigie/dashboard =console) - Défaut absolu :
board
Logger la valeur résolue : Register: board (default, TFD-018).
OUTPUT STRUCTURE
Dans clients/{client}/DAE-*-{slug}/out/ :
out/
├── index.html ← DAE hub (template-dae-index.html)
├── page1-solution.html ← A100 + A280 (template-page1-solution.html)
├── page2-feuille-de-route.html ← A270 (template-page2-feuille-de-route.html)
├── page3-analyse-couts.html ← A290 (template-page3-analyse-couts.html) — conditionnel
├── architecture.html ← Diagramme interactif (de /toolkit:diagram-generate)
└── catalog/
├── {slug}-objects.csv ← copié verbatim depuis out/{slug}-objects.csv
├── {slug}-relations.csv ← copié verbatim depuis out/{slug}-relations.csv
└── browser.html ← Catalog browser (template-catalog-browser.html)
Note : architecture.html est produit par /toolkit:diagram-generate à l'étape précédente. L'assembler ne le régénère pas — il le réfère depuis index.html et l'embarque en iframe dans page1.
ESTHÉTIQUE — Deux registres (TFD-018)
Palette STM partagée par les deux registres : navy #002B5C, green #009A44, yellow #FFE400, blue #009EE0, teal #007489. Le split est typographie + densité + layout, pas couleur.
Register board (défaut, canon)
- Classe sur
<body>:register-board - Typographie : Fraunces serif sur warm cream
#F7F4EC, italiques oversized pour les chiffres - Markers
§ NNpour les sections - SVG diagrammes inline (depuis
svg-components/) - Optimisé pour impression (
@media printactif,break-inside: avoid) - Cible : dossier déposé CE/CA/VP, A100/A270/A290, sommaire de mandat
Register console (variantes LITE)
- Classe sur
<body>:register-console - Typographie : Segoe UI sans-serif sur cool
#F9FAFB - Stat-cards, sidebar nav, tables filtrables
- Pas de SVG inline lourd — remplacés par stat-cards
- Optimisé pour consommation écran, drill-down live
- Cible : vigies récurrentes, dashboards opérationnels, R&D interne, intranet
Flag --style (déprécié, rétrocompat uniquement)
Les anciennes valeurs stm-brand, fluent, factory restent fonctionnelles mais sont toutes mappées à register=board avec palette STM. Émettre ce warning à l'invocation :
⚠️ --style est déprécié (TFD-018). Utiliser --register board|console. Mappé : --style={x} → --register=board.
WORKFLOW
ÉTAPE 0 — Lire les sources + résoudre le registre
- Lis
intrants/intrant-{slug}_*.md - Lis
out/{slug}-objects.csv,out/{slug}-relations.csv - Vérifie que
out/{slug}-architecture.htmlexiste - Si
CLAUDE-{slug}.mdprésent → extraisclient,title,sponsor, et overrideregister:(ou legacystyle:) - Résous le registre selon la précédence définie plus haut :
- Flag CLI
--register>CLAUDE-{slug}.mdregister:> table TFD-018 > défautboard - Si
--styleest passé sans--register, mapper →boardet émettre le warning de dépréciation
- Flag CLI
- Logger :
Register: {board|console} (source: {cli|claude-md|tfd-018-default})
ÉTAPE 1 — Lire les 4 templates selon le registre
Depuis production-lines/digital-talent/talents/agent-ea-v2/.claude/commands/templates/ :
- Si
register == board: liretemplate-dae-index.html,template-page1-solution.html,template-page2-feuille-de-route.html,template-page3-analyse-couts.html - Si
register == console: lire les variantestemplate-*-LITE.html - Dans les deux cas :
template-catalog-browser.html(neutre)
Si register == board : précharger aussi les 8 partials de svg-components/ pour inlining (voir tableau plus haut).
Si un template manque : arrêt avec instruction de rétablir le template depuis le repo.
ÉTAPE 2 — Décider quelles pages émettre
Auto-détection par contenu de l'intrant et par colonnes CSV :
| Page | Trigger d'émission |
|---|---|
index.html |
Toujours |
page1-solution.html |
Toujours (au minimum un sommaire exécutif) |
page2-feuille-de-route.html |
Section "Stratégie de livraison" OU "Phases" présente |
page3-analyse-couts.html |
(intrant-section) Section "Coûts" ou "Coûts/bénéfices" présente avec chiffres concrets, OU (csv-column) la colonne Cost / CAPEX / OPEX / Budget est présente et non-vide dans {slug}-objects.csv. Les deux triggers doivent être évalués ; un seul suffit pour émettre. |
Logger :
Pages détectées: index, page1, page2 (page3 omise — pas de données coûts)
ÉTAPE 3 — Produire page1-solution.html (A100 + A280)
Référence : template-page1-solution.html.
Structure (reproduire dans l'output) :
<body class="register-board">(ouregister-consolesi register=console). La classe est obligatoire — elle gate le CSS du template.- Header — gradient navy, tag, h1, subtitle (A100/A280 — DAE-NNNN · {title}), meta (auteur, direction, date)
- Sommaire exécutif — table 7 lignes : Objectif, Organisation, Processus, Solution, Applications, Intégrations, Données. Colonne droite : badge impact (existant/modifié/nouveau).
- Stats bar — KPI cards : nombre d'applications, nombre d'intégrations, nombre d'objets de données, nombre de Fact Sheets (compté depuis objects.csv), nombre de relations (depuis relations.csv).
- Architecture applicative — grid de cartes (3 cols min), une par application de l'intrant. Chaque carte : nom, badge impact (new/mod/exist), description courte.
- Intégrations de données — table (Source / Cible / Protocole / Type) depuis l'intrant + relations.csv.
- Architecture contextuelle SVG (register=board uniquement) — inliner
svg-components/architecture-context.htmlavec les données de l'intrant. - Heat map impact × TOGAF (register=board) — inliner
svg-components/impact-heatmap.html. Chaque cellule de la heat map doit être un<a href="catalog/browser.html?layer={layer}&impact={impact}">qui deep-linke vers le catalog browser pré-filtré (URL-param wiring, pas un<div>muet). Pourregister=console, remplacer par une table cliquable avec les mêmes deep-links. - Processus — process-flow horizontal (5 steps + arrows) si l'intrant a un processus séquentiel décrit, sinon table simple.
- Cas d'usage — uc-grid (4 cartes max). Si l'intrant a moins de 4 cas d'usage, n'émettre que ceux présents.
- Validation LeanIX — validation-box avec compteurs : Fact Sheets créés/mis à jour, relations documentées, anomalies détectées (depuis l'étape /ea:leanix-catalog-extract validation).
- Footer — sources, document (A100/A280 — DAE-NNNN · {title}), date de génération, agent-ea v2.
Écrire out/page1-solution.html.
ÉTAPE 4 — Produire page2-feuille-de-route.html (A270)
Référence : template-page2-feuille-de-route.html.
Structure :
- Header — tag "A270 — Feuille de route" en jaune, gradient navy, h1, subtitle (DAE-NNNN · Stratégie de livraison), auteur.
- Contexte — context-box (navy-light, border-left navy-mid) avec un paragraphe de positionnement.
- Blocs de réalisation — blocs-grid (cartes catégorisées par badge : infra/data/analytics/process). Pour chaque bloc : titre, liste d'éléments, dépendance.
- Chemin critique — critical-path-wrapper avec cp-flow : séquence de cp-nodes colorés par catégorie, avec
cp-parallelbrackets pour les étapes parallèles. - Timeline / phases — table (Phase / Objectif / Éléments livrés / Dépendances / Date cible) depuis l'intrant section "Stratégie de livraison".
- Risques — risk-grid (cartes catégorisées par severity : critical/moderate/low) si l'intrant a une section "Risques".
- Footer — sources, document, date.
Écrire out/page2-feuille-de-route.html.
ÉTAPE 5 — Produire page3-analyse-couts.html (A290) — CONDITIONNEL
Émettre uniquement si l'intrant contient une section "Coûts" ou "Coûts/bénéfices" avec des chiffres concrets. Sinon : omettre entièrement, pas de placeholder.
Référence : template-page3-analyse-couts.html.
Structure :
- Header — tag "A290 — Analyse des coûts", gradient navy, subtitle (DAE-NNNN · Coûts/bénéfices).
- KPI exécutifs — 4 cards : Budget total, OpEx annuel, Économies annuelles attendues, Période de retour.
- Tagline exécutive — phrase italique synthétisant le business case.
- Breakdown par catégorie — table (Catégorie / Montant / % / Notes).
- Coût par composant — table avec filtres phase + hosting (si l'intrant les a).
- Bénéfices — split en deux : bénéfices quantitatifs (cards), bénéfices qualitatifs (liste).
- Footer — sources, document, date.
Écrire out/page3-analyse-couts.html (uniquement si conditions remplies).
ÉTAPE 6 — Produire index.html (DAE hub)
Référence : template-dae-index.html.
Structure :
- Hero — gradient navy, badge animé status (DRAFT / EN REVUE / PUBLIÉ), titre du DAE, méta (DAE-NNNN, date, client, sponsor).
- Description — 2-3 phrases résumant la mission EA.
- Cartes de pages — une carte par page émise (page1, page2, page3 si présente) avec :
- Icône A-code (◆ A100, ▶ A270, $ A290)
- Titre
- Description courte (1 ligne)
- Stats (nombre d'apps / phases / KPI principal)
- Bouton "Ouvrir →"
- Diagramme thumbnail — preview de
architecture.html(image PNG si générée, sinon link card) + bouton "Vue interactive →" versarchitecture.html. - Catalogue — carte unique "Catalogue des objets et relations" → bouton "Explorer le catalogue →" vers
catalog/browser.html. Stats : N objets, M relations. - Footer — agent-ea v2, date génération, lien JSM si applicable.
Écrire out/index.html.
ÉTAPE 7 — Bundler le catalogue
mkdir -p out/catalog
cp out/{slug}-objects.csv out/catalog/
cp out/{slug}-relations.csv out/catalog/
cp .claude/commands/templates/template-catalog-browser.html out/catalog/browser.html
(Le template-catalog-browser.html sera fourni par D3. En attendant : créer un placeholder simple qui charge les CSVs et les rend en table.)
ÉTAPE 8 — Confirmer
Afficher :
✅ Livrable HLSD assemblé
DAE: {dae_id} — {title}
Client: {client}
Register: {board|console} (source: {cli|claude-md|tfd-018-default})
Pages émises: {liste}
Pages omises: {liste avec raison}
Output:
out/index.html
out/page1-solution.html
out/page2-feuille-de-route.html
{out/page3-analyse-couts.html si émis}
out/architecture.html (de /toolkit:diagram-generate)
out/catalog/browser.html
out/catalog/{slug}-objects.csv
out/catalog/{slug}-relations.csv
Prochaine étape → /ea-publish-jct {slug}
RÈGLES
- Mirror, ne pas copier. Les templates sont des exemples concrets (DAE-0001 FALS). Tu produis une page qui MIRROR la structure avec les données de la DAE en cours. Tu ne copies pas le texte FALS.
- Self-contained par page. CSS inline dans chaque HTML, pas de feuille externe. Aucun CDN, aucun fetch externe (sauf le browser.html qui fetch les CSVs voisins).
- Fidélité aux données. Reproduire les données de l'intrant + CSVs sans modifier les faits. Pas d'arrondi. Pas de paraphrase qui change le sens.
- Pas d'invention. Donnée manquante = "À compléter" visible. Pas de KPI fantôme. Pas de cas d'usage inventé.
- Conditionnel. N'émettre une page que si l'intrant a des données pour elle. Pas de page vide.
- Esthétique cohérente. Utiliser EXACTEMENT les tokens du style choisi. Pas de couleurs ad hoc. Tokens identiques entre les 4 pages.
- Accessibilité WCAG AA — baseline non-négociable (codifiée dans
templates/README.md§"Accessibilité WCAG AA"). Chaque page émise DOIT inclure :<html lang="fr-CA">- Lien skip-to-main-content focusable au tab en début de
<body> :focus-visibleglobal (outline jaune) sur tous les éléments interactifs- Contraste AA respecté (byline
rgba(255,255,255,0.75)min, labels en--ink-3#4B5563min) - SVG :
<svg role="img">+<title>+<desc>; décoratifs enaria-hidden="true" - Keyboard a11y sur SVG interactif : nodes avec
tabindex="0"+ handlers focus/blur - Badges TBA / TBD avec
aria-labelexplicite - Alt sur images, ARIA sur iframes Un livrable qui rate un seul point ne passe pas la quality gate.
- HTML5 valide. Pas de balises non fermées. UTF-8 strict — jamais d'entités HTML pour les caractères français (é, à, ç) sauf si le template d'origine en utilise (alors conserver).
- Inter-linking. Chaque page (page1/2/3) a un lien retour vers
index.htmlen header (sauf index lui-même).index.htmllinke les 3 pages +architecture.html+catalog/browser.html. - Lien JSM. Si frontmatter intrant a
jsm_key, inclure dans le footer de chaque page.
EXEMPLES DE RÉFÉRENCE
Les 4 templates dans .claude/commands/templates/ sont les références visuelles canoniques :
| Template | A-code | Référence source |
|---|---|---|
template-page1-solution.html |
A100 + A280 | DAE-0001 FALS — page1-solution-fals.html (input/) |
template-page2-feuille-de-route.html |
A270 | DAE-0001 FALS — page2-feuille-de-route-fals.html |
template-page3-analyse-couts.html |
A290 | DAE-0001 FALS — page3-analyse-couts-fals.html |
template-dae-index.html |
(hub) | DAE-0001 FALS — page-ea-livrables-vigie.html |
Avant d'émettre une page : consulter le template correspondant pour caler la structure HTML, les classes CSS, les composants. Réutiliser les classes définies dans le template plutôt que d'en réinventer.
OPEN ITEMS (v3.1+)
- Génération d'un PDF par page (
page1.pdf, etc.) via headless print pour archive client - Génération d'une thumbnail PNG du diagramme pour le hero de
index.html - Internationalisation (EN fallback) pour clients anglophones
- Lien Maya widget intégré dans le sidebar (per WO-PROD-008)
- Logo client SVG injectable via CLAUDE-{slug}.md
- Mode "preview" qui produit les pages en HTML mais skip catalog/ et architecture.html (pour itération rapide pendant la revue interne)