# Observer un fonctionnement dégradé explicite

Public : développeur JavaScript. Prérequis : Node >= 20 ; aucune dépendance à installer.
Depuis la racine, exécuter `node examples/degraded/main.js`.

Le programme construit une composition qui référence volontairement une scène absente.

1. Sans politique de repli, le chargement retourne `blocked` et le diagnostic
   `E_REFERENCE_NOT_FOUND` : il ne publie pas de composition disponible.
2. Un second contexte autorise explicitement cette seule référence optionnelle,
   par son identité exacte et sa catégorie. Le chargement retourne `degraded`.
3. La cible absente reste `null`, avec un descripteur d’indisponibilité. Aucune
   définition ni représentation fictive n’est créée.
4. Les diagnostics restent contextualisés et les données d’entrée inchangées.

Résultat attendu : la ligne `Sans contrat de repli : blocked ; avec autorisation
ciblée : degraded ; aucune définition inventée.`, suivie des diagnostics et d’un
code de sortie 0. Les assertions signalent tout résultat inattendu.

Le repli est du code de confiance fourni par l’application. Il n’est pas une
permission tirée du JSON et ne doit être accordé que si le contrat de l’usage
autorise cette absence. Les collisions, cycles et erreurs de type ne deviennent
pas récupérables par cette politique. Supprimer l’option rétablit le refus.

## Vérification dans Firefox ou Chromium

Servir la racine du paquet avec un serveur HTTP local, puis ouvrir
`examples/degraded/index.html`.

1. **Charger sans autorisation** : état `blocked`, diagnostic visible, aucun encadré.
2. **Autoriser et présenter** : état `degraded`, encadré **Acte manqué**, référence
   `tutorial:optional_scene`, catégorie `scene` et motif `E_REFERENCE_NOT_FOUND`.
3. **Retirer la présentation** : l’encadré disparaît, le contenu de l’application reste.
4. Répéter les étapes : un seul encadré, aucun doublon.

## API de présentation

```js
import {presentMissingAct} from '../../src/index.js';
const view = presentMissingAct({loaded, unavailable: loaded.unavailable[0], container});
view.destroy(); // répétable, ne retire que la présentation possédée
```

`loaded` doit être un résultat réussi de chargement dégradé ; `unavailable` doit
être le descripteur récupérable exact présent dans ce résultat. Une copie du
descripteur, un chargement bloqué ou un conteneur invalide entraîne un `TypeError`
avant tout changement du DOM. Les textes sont affichés sans interprétation HTML.
La classe `.alloframe-missing-act` identifie l’encadré accessible (`role="status"`).
Chaque appel crée une présentation indépendante ; l’application en assure la destruction.

Cette API présente une absence explicitement autorisée par `allowMissingReference`.
Elle ne crée aucune définition, aucune capacité d’acteur et aucune instance de composition.
Le montage d’une composition exige toujours ses définitions ; une panne de média
n’est pas automatiquement transformée en acte manqué. Ce parcours ne constitue donc
pas une preuve de couverture de tous les cas contractuels.

Voir [le chargement et son repli contractuel](../../docs/common/loading.md).
