> ⚠️ **GAB SENSIBLE — VALIDATION BOSS OBLIGATOIRE avant tout usage.** (child-safety / RGPD / orientation / career). Contenu extrait sans invention ; à relire par un humain.

# GAB-338 · MetacognitionLearningHelpRequestBuilder — « Formuler une demande d'aide »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechMetacognitionLearning
**Critère validé :** changer le JSON change la demande d'aide sans modifier le HTML. ✅ check.py 12/12.

## ⚠️ GAB SENSIBLE — revue Boss requise
Ce GAB touche au **child-safety / RGPD** : il s'agit de la formulation d'une demande d'aide d'un élève (potentiellement mineur) envoyée à un destinataire (professeur).
- `do_not_use_when` inclut **« exposer des infos sensibles »** et **« journal privé (→ GAB-337) »**.
- `child_safety.no_sensitive_info: true` est posé dans l'instance.
- **À faire valider par Boss avant toute mise en prod** : politique destinataire, traitement des données saisies par l'élève, et stockage/transmission de la demande. Aucune logique de stockage/envoi réel n'est implémentée ici (rendu pédagogique uniquement).

## Pack (structure officielle par-GAB)
```
GAB-338/
  renderer.html            ← moteur constructeur de demande (ne pas modifier par instance)
  instance.example.json    ← SOURCE DE VÉRITÉ (contenu réel, à plat)
  schema.contract.json     ← contrat de validation
  README-contract.md       ← ce fichier
```

## Champs requis (instance, à plat)
`gab_id` · `help_request_id` · `title` · `blocks[]{key,label,text}` · `primary_cta{label,action,confirmed_label}` · `confirm_message`
Optionnels : `intro`, `draft_label`, `draft_empty`, `slots[]{name,required}`, `use_when[]`, `do_not_use_when[]`, `child_safety{no_sensitive_info,note}`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque bloc cliquable (label affiché + texte ajouté au brouillon), le libellé du brouillon, l'intro, le **libellé** du bouton + son libellé confirmé, le message de confirmation, les slots, use_when/do_not_use_when.
- **HTML** : synthétiseur de blocs (grille), zone brouillon, bouton structurel, panels, layout, responsive.

## Logique interactive (extraite du source)
1. L'élève clique chaque bloc → il passe en `done`, son `text` s'ajoute au brouillon (`parts.join(' · ')`).
2. Quand **tous** les blocs sont ajoutés → le bouton « Confirmer la demande » s'active (état `draft_ready`).
3. Clic confirmer → `confirm_message` affiché, bouton passe à `confirmed_label` et se désactive.

## Garde-fous (child_safety)
- **Anti-invention** : tout le contenu vient de l'instance (blocs, libellés, messages), jamais codé en dur.
- **Pas d'infos sensibles** : `do_not_use_when` rappelle de ne pas exposer d'infos sensibles ni rendre une demande publique.
- **BLOCKED** si `blocks` vide / `title` absent / `primary_cta` absent / `confirm_message` absent.

## QA à vérifier
1. Modifier un `blocks[].text`/`label` → rendu change sans toucher au HTML (critère d'or). 2. `blocks:[]` → BLOCKED propre. 3. Ajout des 3 blocs → bouton activé. 4. Confirmation → message OK + bouton désactivé `confirmed_label`. 5. Responsive 375/768/1024.

## external_refs / dependencies
- **Hors-lot référencé** : `do_not_use_when` mentionne `GAB-337` (journal privé de la réflexion) comme alternative quand la demande n'a pas vocation à être envoyée. Aucune dépendance de code — simple renvoi pédagogique texte. GAB-337 vit dans le même lot `LOT-metacognitionlearning-GAB-336-340`.

## Source
`INDEX-300-metacognitionlearning-GAB-336-340-PLAYABLE.html` (stage `data-tpl="338"`, handlers `d338Add` / `d338Confirm`).
