# GAB-260 · CollaborationLearningTeamChallenge — « Défi pédagogique en petit groupe »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechCollaborationLearning
**Critère validé :** changer le JSON change le titre, les étapes, le format enum et le libellé du bouton sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-260/
  renderer.html            ← moteur défi équipe (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
```

## Archétype pédagogique
**TeamChallenge** : défi collaboratif en petit groupe (3-4 élèves), score **collectif et anonyme**, gamification encadrée.
- Variante active par défaut : `sprint_team` (Sprint Pythagore, 10 min, 5 problèmes)
- 3 autres variantes pilotées par `challenge_format` : `escape_team`, `quiz_team`, `project_team`
- Chaîne module 17 vague 2 : GAB-256 ParentChild → 257 Explain → 258 Correction → 259 Oral → **260 TeamChallenge**
- Référence post-défi recommandée : GAB-255 GroupReflection (step 4 des items)

## Champs requis (instance, à plat)
`gab_id` · `challenge_id` · `items[]{step,label,body}` · `team_size` · `primary_cta{label,action}`

Optionnels : `title`, `subtitle`, `challenge_format`, `challenge_format_enum`, `challenge_count`, `estimated_duration`, `scoring_rule`, `safety_note`, `challenge_variants`, `secondary_cta`, `next_action`, `use_when`, `do_not_use_when`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, sous-titre, étapes du sprint, format enum, variantes, libellé des boutons, note garde-fou, règle de score.
- **HTML** : grille équipe (slots), score affiché, bloc étapes, sélecteur enum, CTA structurels, layout.

## Garde-fous (child_safety — V1_X)
- `child_safety.public_ranking` **DOIT être `false`** — pas de classement public entre équipes d'élèves.
- `child_safety.score_visibility = "team_only"` — chaque équipe voit uniquement son propre score.
- `child_safety.anonymous_score = true` — aucun membre n'est comparé individuellement.
- **BLOCKED** si `items` vide / `challenge_id` absent / `team_size` absent / `primary_cta` absent.

## QA à vérifier
1. Modifier `title`/`subtitle`/`items` → rendu change sans toucher au HTML (critère d'or).
2. `items:[]` → BLOCKED propre.
3. Clic enum `escape_team` → titre + CTA changent (via `challenge_variants`).
4. Clic primary CTA → panel ok "Défi lancé".
5. Clic secondary CTA → panel note avec `scoring_rule`.
6. Responsive 375 → `team-grid` passe en 2 colonnes, 0 débordement.
7. `ENGINE.init(extInstance)` → rendu piloté par instance externe.

## Source
`INDEX-300-collaborationlearning-GAB-256-260-PLAYABLE.html` (stage `data-tpl="260"`, handlers `tcPick`, objet `TC_TYPES`).

## external_refs / dependencies
- **GAB-255** (`CollaborationLearningGroupReflection`) : référencé comme `next_action` après le TeamChallenge (step 4 "Reflection"). Hors-lot — lot GAB-251-255.
- **Module EdTechCollaborationLearning** : partagé avec GAB-256 à GAB-259 du même lot.
