diff --git a/docs/dnn/RUNBOOKS-GATED-OPS.md b/docs/dnn/RUNBOOKS-GATED-OPS.md
new file mode 100644
index 00000000..d0362061
--- /dev/null
+++ b/docs/dnn/RUNBOOKS-GATED-OPS.md
@@ -0,0 +1,38 @@
+# Runbooks gated-ops — Index (pré-armement au GO jsboige)
+
+> **But** : au GO jsboige, exécution des ops gated = **copier-coller, zéro réflexion**. Cet index consolide les 3 runbooks gated-ops DNN.
+> **Contrainte** : rien d'exécuté sans GO jsboige explicite. DNN publish écrase `web.config` prod — ne pas publier. Verdict QA visuelle = ai-01.
+> **Auteur** : po-2023 (dispatch ai-01 `msg-20260722T144728-h7msce`).
+
+---
+
+## Index des runbooks
+
+| # | Runbook | Couverture | Statut |
+|---|---------|-----------|--------|
+| 1 | **Apply Manifests Δ #490/#682** | [`go-live-turnkey-checklist.md`](go-live-turnkey-checklist.md) | ✅ existant (prêt) |
+| 2 | **Option C connection-string** | [`dnn-hang-option-c-connection-string-prep.md`](dnn-hang-option-c-connection-string-prep.md) | ✅ existant (prêt) |
+| 3 | **Fix skin `tabid=138` (Opt 1)** | [`skin-tabid138-diagnostic-runbook.md`](skin-tabid138-diagnostic-runbook.md) | ⚠ **diagnostic-only** (fix diff deferred au GO, nécessite stack trace live) |
+
+---
+
+## Pré-requis commun aux 3 ops
+
+- **Sauvegarde pré-op** horodatée + hashée (`web.config`, `bin/`, DB). Cf `[[reference-dnn-bin-restore-surgical]]` (restore chirurgical, pas rsync brutal).
+- **Backup naming hygiene** : ne JAMAIS restaurer un backup sur la base du nom/date seul — **vérifier la connection string + le count de `dependentAssembly` AVANT** (`[[feedback-dnn-webconfig-bak-trap]]`). `web.config.bak-20260717` = pré-migration IIS, trompeur.
+- **CS verification** : la connection string actuelle est `localhost\SQLEXPRESS` (correcte). Ne pas restaurer un backup LocalDB par erreur (`[[feedback-dnn-webconfig-secret-tracked]]`).
+- **Runtime** : .NET Framework 4.8 (pas .NET 8/9 — les redirects 9.0.0.0 sont BCL 2sxc-21, cf `[[reference-dnn-2sxc-net48-bcl-stack]]`).
+
+---
+
+## Décisions jsboige en attente (bloqueurs DNN)
+
+1. **Rotation machineKey** (urgent — clés exposées sur branche feature `4b0297ee`). Ops serveur seul.
+2. **Skin `tabid=138` Opt 1/2** (reco Opt 1 = v0.9.1, tag non bloqué).
+3. **#681 2sxc App export** (hard-unblocker DNN i18n #682-#685). Contenu vit dans DB 2sxc live, aucun worker ne peut le faire.
+
+---
+
+## Post-exec smoke
+
+[`go-live-smoke-test.md`](go-live-smoke-test.md) — homepage 200, `/Argumentum` + `/Règles` rendent 2sxc content, 0 `JsonOptions`/conn-string error, `tabid=138` (post-fix Opt 1).
diff --git a/docs/dnn/skin-tabid138-diagnostic-runbook.md b/docs/dnn/skin-tabid138-diagnostic-runbook.md
new file mode 100644
index 00000000..51872f91
--- /dev/null
+++ b/docs/dnn/skin-tabid138-diagnostic-runbook.md
@@ -0,0 +1,92 @@
+# Skin `tabid=138` — Diagnostic Runbook (HTTP 500, gated v0.9.1)
+
+> **Scope** : diagnostic + pistes de résolution à exécuter au **GO jsboige avec accès serveur VPS**.
+> **Statut** : **REPORTED, non reproduit**. Ce document pré-arme le diagnostic ; il n'est PAS un diff fix copy-paste garanti (voir §4).
+> **Auteur** : po-2023 (dispatch ai-01 `msg-20260722T144728-h7msce`, secondaire « runbooks gated-ops staged »).
+> **Non-bloquant v0.9.0** (reco Opt 1 : fix reporté v0.9.1, tag non bloqué).
+
+---
+
+## 1. Symptôme rapporté
+
+| Champ | Valeur |
+|-------|--------|
+| URL | `dnn.argumentum.myia.io` page `tabid=138` |
+| HTTP | **500** |
+| Exception | `HttpParseException` sur le contrôle **`lblBreadCrumb`** |
+| Description reçue | « Type `Literal` incompatible avec `Label` (.NET 9 BCL). Skin non re-compilée post-migration IIS 2026-07-01. » |
+| Source | status dashboard workspace-Argumentum (reported, pas vérifié par reproduction locale) |
+
+**Runtime DNN = .NET Framework 4.8** (vérifié `DotNetNuke.dll` FileVersion `10.3.2+...`, repo-runtime sandbox `dnn/sandbox-runtime-1032`). La mention « .NET 9 BCL » dans le symptôme reçu est **à qualifier** au diagnostic (le runtime n'est pas .NET 9 — possiblement confusion BCL des redirects 9.0.0.0 vs runtime net48, cf `[[reference-dnn-2sxc-net48-bcl-stack]]`).
+
+---
+
+## 2. Constat dans le repo (code = truth)
+
+Le contrôle `lblBreadCrumb` vit dans le **skin object DNN core** :
+
+```
+DNNPlatform/admin/Skins/breadcrumb.ascx
+```
+
+```aspx
+<%@ Control Language="C#" AutoEventWireup="false" Inherits="DotNetNuke.UI.Skins.Controls.BreadCrumb" Codebehind="BreadCrumb.ascx.cs" %>
+
+```
+
+**Le markup utilise déjà ``** (pas `Literal`). Donc l'exception « Literal incompatible avec Label » ne provient **pas** du markup tel que commité. Le code-behind `BreadCrumb.ascx.cs` **n'est pas dans le repo** (compilé dans `DotNetNuke.dll`).
+
+Skins présents dans le repo (`DNNPlatform/Portals/_default/Skins/`) : `2shineBS5`, `Bootstrap 4 Instant`, `DnnBootsterV2`, `DnnContra`, `OpenStoreBO`, `Xcillion`, `_default`, `nvQuickTheme`. Le skin appliqué à `tabid=138` est à confirmer côté serveur (DB DNN `Tabs.SkinSrc` pour le tab 138).
+
+---
+
+## 3. Pourquoi pas de fix copy-paste maintenant
+
+Un diff « Literal → Label » ne peut pas être préparé en staged sans risque de **fabriquer un fix non vérifié** car :
+
+1. **Pas de stack trace live** → le contrôle `.ascx` exact qui plante n'est pas localisé (le message pointe `lblBreadCrumb`, mais le markup core est déjà `Label`).
+2. **Code-behind absent du repo** → le mismatch `Literal`/`Label` est probablement dans `BreadCrumb.ascx.cs` (compilé) ou dans un binding d'un custom skin, non inspectable depuis le repo seul.
+3. **Symptôme reçu ambigu** (`.NET 9 BCL` vs runtime net48 réel).
+
+Conformément à la discipline **Code = Truth** (VERIFIE / RAPPORTE / SUPPOSE), ce runbook reste **diagnostic** tant que le stack trace live n'a pas été capturé.
+
+---
+
+## 4. Pistes de diagnostic à exécuter au GO (avec accès serveur VPS)
+
+Ordre recommandé :
+
+1. **Capturer le stack trace `HttpParseException` exact** :
+ - Event Viewer Windows → Journaux Windows → Application (filtrer source *ASP.NET* sur l'heure du 500).
+ - Ou DNN event log : `DNNPlatform/Portals/_default/Logs/` + table `EventLog`.
+ - Objectif : identifier le **chemin `.ascx` exact** + la ligne + le type fautif (`Literal` vs `Label`).
+
+2. **Confirmer le skin appliqué au tab 138** (DB DNN) :
+ ```sql
+ SELECT TabID, TabName, SkinSrc, ContainerSrc FROM Tabs WHERE TabID = 138;
+ ```
+ + `PortalSettings.SkinSrc` par défaut si `SkinSrc` est NULL.
+
+3. **Selon le contrôle fautif** :
+ - **Si skin object core `breadcrumb.ascx`** → le mismatch est dans `BreadCrumb.ascx.cs` compilé (déclare `protected Literal lblBreadCrumb` alors que le markup dit `Label`). Fix : aligner la déclaration code-behind → recompiler `DotNetNuke.dll` (territoire core DNN, pas custom). **Alternative plus rapide** : surcharger le skin object dans le skin custom pour éviter le core fautif.
+ - **Si custom skin (`2shineBS5` / `Bootstrap 4 Instant`)** → corriger le `.ascx` du custom skin (diff trivial une fois le fichier localisé), re-publier le skin.
+ - **Si post-migration (skin non recompilée 2026-07-01)** → recompiler / re-publier le skin concerné (le `bin/` runtime sandbox `4b0297ee` est la référence net48 propre, cf `[[reference-dnn-bin-restore-surgical]]`).
+
+4. **Smoke post-fix** : recharger `tabid=138` → HTTP 200, breadcrumb rendu visible. Puis `docs/dnn/go-live-smoke-test.md`.
+
+---
+
+## 5. Recommandation produit
+
+- **Opt 1 (reco ai-01 + jsboige)** : le fix skin **ne bloque pas le tag v0.9.0**. Gater le tag, traiter le skin en **v0.9.1**. Le rendu de `tabid=138` est une page secondaire ; la homepage et `/Argumentum` + `/Règles` rendent (2sxc content OK, cf B2.5 smoke).
+- **Opt 2 (écarté)** : scope creep skin maintenant (retarde le tag pour un fix non-bloquant).
+
+---
+
+## 6. Cross-refs
+
+- `[[feedback-dnn-webconfig-secret-tracked]]` — web.config runtime-expanded (gated ops).
+- `[[reference-dnn-2sxc-net48-bcl-stack]]` — runtime net48 vs redirects 9.0.0.0 (contexte « .NET 9 BCL »).
+- `docs/dnn/go-live-turnkey-checklist.md` — Manifests Δ #490/#682 (couvert).
+- `docs/dnn/dnn-hang-option-c-connection-string-prep.md` — Option C connection-string (couvert).
+- `docs/dnn/UPGRADE-ASSESSMENT.md` — cible DNN 10.3.2 + 2sxc 21.