/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)

  1. Flag CLI --register (priorité absolue)
  2. Sinon, si CLAUDE-{slug}.md a register: board|console → utiliser
  3. Sinon, table TFD-018 (HLSD client = board, vigie/dashboard = console)
  4. 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 § NN pour les sections
  • SVG diagrammes inline (depuis svg-components/)
  • Optimisé pour impression (@media print actif, 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

  1. Lis intrants/intrant-{slug}_*.md
  2. Lis out/{slug}-objects.csv, out/{slug}-relations.csv
  3. Vérifie que out/{slug}-architecture.html existe
  4. Si CLAUDE-{slug}.md présent → extrais client, title, sponsor, et override register: (ou legacy style:)
  5. Résous le registre selon la précédence définie plus haut :
    • Flag CLI --register > CLAUDE-{slug}.md register: > table TFD-018 > défaut board
    • Si --style est passé sans --register, mapper → board et émettre le warning de dépréciation
  6. 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 : lire template-dae-index.html, template-page1-solution.html, template-page2-feuille-de-route.html, template-page3-analyse-couts.html
  • Si register == console : lire les variantes template-*-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) :

  1. <body class="register-board"> (ou register-console si register=console). La classe est obligatoire — elle gate le CSS du template.
  2. Header — gradient navy, tag, h1, subtitle (A100/A280 — DAE-NNNN · {title}), meta (auteur, direction, date)
  3. Sommaire exécutif — table 7 lignes : Objectif, Organisation, Processus, Solution, Applications, Intégrations, Données. Colonne droite : badge impact (existant/modifié/nouveau).
  4. 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).
  5. Architecture applicative — grid de cartes (3 cols min), une par application de l'intrant. Chaque carte : nom, badge impact (new/mod/exist), description courte.
  6. Intégrations de données — table (Source / Cible / Protocole / Type) depuis l'intrant + relations.csv.
  7. Architecture contextuelle SVG (register=board uniquement) — inliner svg-components/architecture-context.html avec les données de l'intrant.
  8. 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). Pour register=console, remplacer par une table cliquable avec les mêmes deep-links.
  9. Processus — process-flow horizontal (5 steps + arrows) si l'intrant a un processus séquentiel décrit, sinon table simple.
  10. Cas d'usage — uc-grid (4 cartes max). Si l'intrant a moins de 4 cas d'usage, n'émettre que ceux présents.
  11. 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).
  12. 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 :

  1. Header — tag "A270 — Feuille de route" en jaune, gradient navy, h1, subtitle (DAE-NNNN · Stratégie de livraison), auteur.
  2. Contexte — context-box (navy-light, border-left navy-mid) avec un paragraphe de positionnement.
  3. 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.
  4. Chemin critique — critical-path-wrapper avec cp-flow : séquence de cp-nodes colorés par catégorie, avec cp-parallel brackets pour les étapes parallèles.
  5. Timeline / phases — table (Phase / Objectif / Éléments livrés / Dépendances / Date cible) depuis l'intrant section "Stratégie de livraison".
  6. Risques — risk-grid (cartes catégorisées par severity : critical/moderate/low) si l'intrant a une section "Risques".
  7. 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 :

  1. Header — tag "A290 — Analyse des coûts", gradient navy, subtitle (DAE-NNNN · Coûts/bénéfices).
  2. KPI exécutifs — 4 cards : Budget total, OpEx annuel, Économies annuelles attendues, Période de retour.
  3. Tagline exécutive — phrase italique synthétisant le business case.
  4. Breakdown par catégorie — table (Catégorie / Montant / % / Notes).
  5. Coût par composant — table avec filtres phase + hosting (si l'intrant les a).
  6. Bénéfices — split en deux : bénéfices quantitatifs (cards), bénéfices qualitatifs (liste).
  7. 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 :

  1. Hero — gradient navy, badge animé status (DRAFT / EN REVUE / PUBLIÉ), titre du DAE, méta (DAE-NNNN, date, client, sponsor).
  2. Description — 2-3 phrases résumant la mission EA.
  3. 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 →"
  4. Diagramme thumbnail — preview de architecture.html (image PNG si générée, sinon link card) + bouton "Vue interactive →" vers architecture.html.
  5. Catalogue — carte unique "Catalogue des objets et relations" → bouton "Explorer le catalogue →" vers catalog/browser.html. Stats : N objets, M relations.
  6. 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

  1. 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.
  2. 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).
  3. 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.
  4. Pas d'invention. Donnée manquante = "À compléter" visible. Pas de KPI fantôme. Pas de cas d'usage inventé.
  5. Conditionnel. N'émettre une page que si l'intrant a des données pour elle. Pas de page vide.
  6. Esthétique cohérente. Utiliser EXACTEMENT les tokens du style choisi. Pas de couleurs ad hoc. Tokens identiques entre les 4 pages.
  7. 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-visible global (outline jaune) sur tous les éléments interactifs
    • Contraste AA respecté (byline rgba(255,255,255,0.75) min, labels en --ink-3 #4B5563 min)
    • SVG : <svg role="img"> + <title> + <desc> ; décoratifs en aria-hidden="true"
    • Keyboard a11y sur SVG interactif : nodes avec tabindex="0" + handlers focus/blur
    • Badges TBA / TBD avec aria-label explicite
    • Alt sur images, ARIA sur iframes Un livrable qui rate un seul point ne passe pas la quality gate.
  8. 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).
  9. Inter-linking. Chaque page (page1/2/3) a un lien retour vers index.html en header (sauf index lui-même). index.html linke les 3 pages + architecture.html + catalog/browser.html.
  10. 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)