/** * Contrat de données du QA Meter temporaire. * * Calqué à l'identique sur les réponses de la spec plateforme (doc 03 §5.1 : * `page-status` + `sitemap`). Le backend temporaire (`backend/src/qa-meter/`) * sert un artefact qui BUNDLE ces deux formes — au swap-out, le widget * plateforme renverra exactement les mêmes objets, endpoint par endpoint, donc * ces types survivent au retrait du meter temporaire. * * AUCUNE couleur n'est calculée ici : la couleur est calculée à la construction * de l'artefact (fonction pure §9.3, côté `qa-build-status`) et stockée. L'UI ne * fait que la rendre, et lit les flags de staleness (`stale`) pour le style * « contredit ». */ type QaColor = 'green' | 'yellow' | 'red' | 'gray'; type QaAutomatedStatus = 'passing' | 'failing' | 'flaky' | 'never_run'; /** Volet « automated » d'un scénario (doc 03 §5.1). */ interface QaAutomatedLane { status: QaAutomatedStatus; at?: string; app_version?: string; /** Résumé de provenance affiché dans le tooltip — ex. « laptop · clone · healed » (doc 03 §1.5). */ provenance?: string; } /** Volet humain (« dev » ou « client ») d'un scénario. */ interface QaHumanLane { validated: boolean; /** Calculé (jamais stocké) : la validation précède un run en échec ou une nouvelle version (doc 03 §9.2/§9.4). */ stale: boolean; /** Posé quand le dernier événement humain est `rejected`. */ rejected?: boolean; by?: string; at?: string; app_version?: string; note?: string; } interface QaScenarioPageRef { pattern: string; role: 'primary' | 'traversed'; } /** Priorité d'un cas de la suite (doc QA `TEST-SUITE-FORMAT.md` §1). */ type QaPriority = 'P0' | 'P1' | 'P2' | 'P3'; /** Statut d'un cas dans la suite (`TEST-SUITE-FORMAT.md` §3) — distinct de la couleur. */ type QaCaseStatus = 'covered' | 'manual' | 'blocked' | 'open-question'; /** Ancrage de l'attendu (`TEST-SUITE-FORMAT.md` §2). */ type QaGrounding = 'verified' | 'confirm-live' | 'product-question'; /** * Groupe d'un scénario = la « suite » de son identifiant `TC-` (lettre + * thème). Sert à replier les pages chargées (ex. un onglet ingrédient ≈ 30 cas) en * quelques en-têtes par thème (nominal, bornes, réseau…) — cf. demande « taille ». */ interface QaScenarioGroup { key: string; label: string; } /** Un scénario QA avec sa trinité de volets (doc 03 §5.1). */ interface QaScenario { id: string; external_key?: string; title: string; color: QaColor; source?: 'reporter' | 'testgen' | 'manual'; spec_path?: string; pages?: QaScenarioPageRef[]; /** Présent pour les cas issus des suites réelles (`test-suite/`) ; absent pour le synthétique. */ group?: QaScenarioGroup; priority?: QaPriority; caseStatus?: QaCaseStatus; grounding?: QaGrounding; automated: QaAutomatedLane; dev: QaHumanLane; client: QaHumanLane; } interface QaCounts { scenarios: number; passing: number; dev_validated: number; client_validated: number; } /** Réponse `GET …/widget/page-status/` (doc 03 §5.1), une par page dans l'artefact temporaire. */ interface QaPageStatus { page: { id: string; path_pattern: string; title: string; } | null; color: QaColor; counts: QaCounts; scenarios: QaScenario[]; } interface QaSitemapRollup { pages_total: number; pages_green: number; scenarios_total: number; scenarios_green: number; } /** Un nœud plat de l'arbre `GET …/widget/sitemap/` (doc 03 §5.1) ; le client reconstruit l'arbre. */ interface QaSitemapNode { id: string; path_pattern: string; title: string; parent_id: string | null; order: number; structural?: boolean; color: QaColor; counts: QaCounts; rollup: QaSitemapRollup; } /** Métrique double (doc 01 D12) : % de pages couvertes / % de scénarios passants à la version courante. */ interface QaMetric { pages_with_scenarios_pct: number; scenarios_passing_pct: number; } /** * L'artefact servi par `GET /qa-meter/status` — bundle de la forme §5.1. * `format: 1` est validé par le backend (B4) et par le store avant rendu. */ interface QaStatusArtifact { format: number; environment: string; app_version: string; generated_at: string; pages: QaPageStatus[]; sitemap: QaSitemapNode[]; metric: QaMetric; } export type { QaStatusArtifact as Q, QaColor as a, QaPageStatus as b, QaScenario as c, QaSitemapNode as d };