#0. Pourquoi ce document existe
Un dossier produit qui ne décrit que les chemins heureux ne décrit pas un produit : il décrit une démonstration. Les dix-huit scénarios ci-dessous sont les chemins non heureux de KySpectra — ceux que rencontrent réellement les équipes, et qui décident de la confiance qu'elles accordent à la plateforme.
Chaque scénario porte quatre informations qui manquent d'ordinaire :
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Le message et l'écran effectivement affichés |
| Code d'erreur réel | Le code HTTP et, quand il existe, l'identifiant typé du problème |
| Trace laissée | Ce qui reste dans le journal, la base ou le résumé de travail |
| Procédure de reprise | La suite d'actions qui remet le système en état |
#0.1 La doctrine de dégradation de la plateforme
| Principe | Traduction observable |
|---|---|
| Honnêteté d'ingénierie | Une capacité non configurée répond 501 Not Implemented avec un message explicite. Elle ne simule jamais un succès. |
| Échec fermé sur les écritures gouvernées | Une fonction payante ou sensible refuse plutôt que d'accorder par défaut. |
| Échec ouvert sur les plafonds d'usage en cours d'exécution | Le plafond journalier d'appels d'outil laisse passer en cas de dégradation du plan de contrôle, pour ne pas casser un travail en cours. |
| Repli d'autonomie vers le bas | Toute incertitude sur le plafond d'autonomie ramène à N1, jamais vers un niveau supérieur. |
| Masquage d'existence | Un identifiant de locataire discordant renvoie 404, pas 403. |
| Jamais de montant inventé | Sans service de facturation joignable, le reçu porte metered=false. |
| Jamais de vert fabriqué | Un scanner absent produit un 501 qui nomme l'outil manquant. |
#0.2 Carte des dix-huit exceptions
Aucun diagramme à afficher
Diagramme 1 — flowchart
#0.3 Index
| ID | Scénario | Code dominant | Statut du comportement |
|---|---|---|---|
| EX-01 | Échec de construction d'image | 501 / 502 |
🟢 Livré |
| EX-02 | Échec de déploiement et retour arrière | 409 / 501 |
🟢 Livré, prouvé en production |
| EX-03 | Agent en boucle interrompu | 200 sur interruption |
🟢 Livré |
| EX-04 | Budget épuisé en cours d'exécution | 402 |
🟢 Livré |
| EX-05 | Plan rétrogradé | 402 / 403 |
🟢 Livré |
| EX-06 | Locataire suspendu | 403 / 404 |
🟡 En cours côté interface d'administration |
| EX-07 | Service en panne et dégradation gracieuse | 503 |
🟢 Livré |
| EX-08 | Jeton expiré en cours de session | 401 |
🟢 Livré |
| EX-09 | Conflit de modification concurrente | 409 |
🟢 Livré |
| EX-10 | Quota d'appels d'outil atteint | 402 |
🟢 Livré |
| EX-11 | Secret introuvable dans le coffre | 503 / 502 |
🟢 Livré |
| EX-12 | Dépôt non supporté par la rétro-ingénierie | 422 |
🟢 Livré |
| EX-13 | Approbation refusée | 409 |
🟢 Livré |
| EX-14 | Auto-approbation tentée et bloquée | 409 / 400 |
🟢 Livré |
| EX-15 | Perte de connexion pendant un long traitement | — | 🟢 Livré |
| EX-16 | Mise en ligne désactivée par drapeau | 501 |
🟢 Livré |
| EX-17 | Sonde de vivacité couplée à la base | 503 |
🟢 Corrigé, à auditer sur tous les services |
| EX-18 | Politique réseau de refus par défaut | 503 en cascade |
🟢 Corrigé et vérifié en production |
#EX-01 · Échec de construction d'image
| Élément | Valeur |
|---|---|
| Contexte | WF-18 · un ingénieur lance la construction et la publication d'une image. |
| Cause typique | Outil de construction absent, espace de noms d'exécution non configuré, secret de registre manquant, ou cluster refusant la création de la tâche. |
| Statut | 🟢 Livré — le refus est explicite, jamais un faux succès. |
Aucun diagramme à afficher
Diagramme 2 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Bandeau d'erreur nommant précisément la capacité absente | Refuse d'agir plutôt que de tenter une construction locale approximative |
| 2 | Si la tâche démarre : progression puis verdict | Réinterroge le statut terminal de la tâche — la fin de tâche est la seule preuve acceptée |
| 3 | Extrait de journal du pod de construction | Conserve la queue de journal comme évidence |
| 4 | Bouton de relance | Reconstruit un secret de registre éphémère à chaque tentative |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | « Construction impossible : exécuteur non configuré » ou « exécution en cluster indisponible », avec le nom de la configuration manquante. |
| Code d'erreur réel | 501 exec/incluster-unavailable · 501 build/runner-unconfigured · 501 exec/tool-unavailable en mode local · 502 si le cluster refuse la création. |
| Trace laissée | Verdict d'étape avec la queue de journal, le code de retour et la ligne de commande utilisée ; aucun secret n'y figure. |
| Procédure de reprise | 1. Vérifier la configuration de l'espace de noms d'exécution et du secret de registre. 2. Redéposer les identifiants de registre au coffre — WF-30. 3. Vérifier le lien au registre par la poignée de main réelle. 4. Relancer la construction. Aucune étape antérieure du pipeline n'est perdue. |
#EX-02 · Échec de déploiement et retour arrière
| Élément | Valeur |
|---|---|
| Contexte | WF-19 · un déploiement est lancé et le rollout ne converge pas. |
| Cause typique | Image inexistante, sonde d'état du produit en échec, ressources insuffisantes, portes non franchies. |
| Statut | 🟢 Livré et prouvé en production. |
Aucun diagramme à afficher
Diagramme 3 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Liste nominative des portes non franchies | Refuse le déploiement sans jamais toucher au cluster |
| 2 | Message d'approbation manquante | Vérifie l'approbation avant toute étape lorsque le drapeau est actif |
| 3 | État de convergence du rollout | Ne pose le statut vivant que si les quatre compteurs de répliques coïncident |
| 4 | Bouton de retour arrière | Recalcule l'ensemble de répliques précédent puis réapplique son image |
| 5 | Historique des déploiements | Marque l'original comme annulé et crée une ligne portant sa référence |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Un message typé, jamais un simple « erreur » : portes non franchies avec leur liste, approbation requise, ou déploiement réel désactivé. |
| Code d'erreur réel | 409 gate/not-passed · 409 deploy/approval-required · 409 deploy/already-recorded · 409 deploy/via-deploy-endpoint · 501 deploy/live-not-enabled. |
| Trace laissée | Le run conserve ses six étapes avec leurs verdicts et leurs évidences ; le déploiement échoué reste en base ; le retour arrière crée une ligne distincte reliée à l'original. |
| Procédure de reprise | 1. Lancer la simulation, qui ne touche rien et liste les bloqueurs. 2. Corriger la cause. 3. Relancer l'exécution. 4. Si le produit est déjà dégradé en service, déclencher le retour arrière avant de corriger, pour restaurer d'abord. |
#EX-03 · Agent en boucle interrompu
| Élément | Valeur |
|---|---|
| Contexte | WF-06 et WF-13 · une exécution d'agent ne converge pas et consomme des jetons. |
| Cause typique | Invite ambiguë, outil renvoyant systématiquement une erreur, tâche mal bornée. |
| Statut | 🟢 Livré — l'interruption est une route réelle, côté copilote comme côté exécution d'agent. |
Aucun diagramme à afficher
Diagramme 4 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Flux d'événements en direct : étapes, appels d'outil, complétions | Émet chaque événement dans le flux du run |
| 2 | Répétition visible du même triplet d'étapes | Ne détecte pas la boucle sémantiquement : c'est un jugement humain |
| 3 | Bouton d'arrêt sur l'exécution du copilote | Arrête l'exécution et conserve les événements déjà émis |
| 4 | Confirmation modale d'interruption dans la flotte d'agents | Exige la capacité plateforme d'interruption |
| 5 | Compteur de consommation mis à jour | Règle la consommation réellement engagée, jamais une estimation |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | L'exécution passe à l'état interrompu ; les événements antérieurs restent consultables. |
| Code d'erreur réel | Aucun : l'interruption réussit en 200. Un appelant sans la capacité d'interruption reçoit 403. |
| Trace laissée | L'exécution reste en base avec ses événements, son motif d'arrêt et son acteur. Le journal d'audit conserve la décision. |
| Procédure de reprise | 1. Lire les derniers événements pour identifier l'outil ou l'étape fautive. 2. Vérifier la politique d'exécution : durée maximale, liste d'autorisations de sortie. 3. Reformuler la tâche avec une borne explicite. 4. Relancer. Un plafond d'autonomie plus bas est le premier réglage à essayer. |
#EX-04 · Budget épuisé en cours d'exécution
| Élément | Valeur |
|---|---|
| Contexte | WF-24 · un travail long consomme le budget de jetons avant d'aboutir. |
| Cause typique | Plafond journalier ou mensuel atteint, budget de portée trop bas. |
| Statut | 🟢 Livré. |
Aucun diagramme à afficher
Diagramme 5 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Jauges dépensé, restant, pourcentage sur l'écran de consommation | Publie la consommation réelle par portée et par modèle |
| 2 | Alerte au seuil d'avertissement | N'interrompt rien à ce stade |
| 3 | Alerte critique | N'interrompt toujours rien : c'est un signal, pas une porte |
| 4 | Refus au franchissement de la limite | Ne procède à aucun appel de modèle |
| 5 | Date de réinitialisation de la fenêtre | Affiche la date réelle, pas une estimation |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | « Budget épuisé » avec le seuil atteint et la portée concernée. |
| Code d'erreur réel | 402. |
| Trace laissée | La consommation engagée avant l'épuisement est réglée avec les jetons réellement consommés. Si le service de facturation est injoignable, le reçu porte metered=false — jamais un montant inventé. |
| Procédure de reprise | 1. Relever la limite du budget concerné. 2. Ou attendre la réinitialisation de la fenêtre de quota. 3. Ou monter de palier — WF-25. 4. Relancer l'exécution : les étapes déjà réalisées sont conservées. |
#EX-05 · Plan rétrogradé
| Élément | Valeur |
|---|---|
| Contexte | WF-25 · un essai expire ou un abonnement est annulé. |
| Cause typique | Fin de la période d'essai de quatorze jours sans carte, annulation en fin de période, ou échec de paiement. |
| Statut | 🟢 Livré. Les profils d'inscription configurés prévoient des rappels à J-7, J-3 et J-1 avant l'échéance. |
Aucun diagramme à afficher
Diagramme 6 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Rappels d'échéance d'essai | Applique le calendrier de rappel du profil d'inscription |
| 2 | Bandeau de rétrogradation | Bascule l'abonnement vers le palier gratuit |
| 3 | Quotas visiblement réduits | Ramène les six quotas de registre aux valeurs du palier gratuit, dont deux cents appels d'outil par jour |
| 4 | Plafond d'autonomie affiché à N1 | Le plafond effectif est le minimum du plafond de rôle et du plafond de plan |
| 5 | Refus sur une écriture payante | Les écritures gouvernées échouent en position fermée vers le palier gratuit |
| 6 | Lecture inchangée | Aucune donnée n'est supprimée |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Un bandeau de palier gratuit, des quotas réduits, et un refus explicite lorsqu'une fonction payante est sollicitée. |
| Code d'erreur réel | 402 sur un quota dépassé, 403 sur une fonctionnalité non incluse. Si la résolution des droits est désactivée par drapeau, la route répond 404 — comportement identique à l'absence de la fonction. |
| Trace laissée | Le changement d'abonnement est enregistré ; les événements du prestataire de paiement sont journalisés et dédupliqués par un journal d'événements. |
| Procédure de reprise | 1. Ajouter une méthode de paiement. 2. Changer de plan — la proratisation est réelle. 3. Vérifier que le plafond d'autonomie est remonté au niveau attendu. |
#EX-06 · Locataire suspendu
| Élément | Valeur |
|---|---|
| Contexte | Un locataire est suspendu pour impayé, incident de sécurité ou décision contractuelle. |
| Cause typique | Décision d'exploitation ou de conformité. |
| Statut | 🟡 En cours. La route de suspension existe et écrit un statut avec audit ; le portail d'administration affiche explicitement l'absence de commande de suspension dans son écran des locataires — un écart assumé, visible dans l'interface. |
Aucun diagramme à afficher
Diagramme 7 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Authentification qui réussit normalement | Keycloak n'est pas au courant de la suspension : elle est applicative |
| 2 | Refus à l'accès aux ressources du locataire | Le statut de l'organisation porte la suspension et son motif |
| 3 | Message explicite invitant à contacter l'administration | Aucune donnée n'est supprimée |
| 4 | Réactivation | Rétablit le statut actif avec une ligne d'audit |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Un refus d'accès aux ressources, jamais une page blanche ni une erreur générique. |
| Code d'erreur réel | 403 sur une ressource du locataire suspendu ; 404 si l'identifiant de locataire de la requête est discordant avec le jeton — masquage d'existence. |
| Trace laissée | Statut de l'organisation, date de suspension, motif de suspension, et ligne d'audit de la décision. |
| Procédure de reprise | 1. Traiter la cause : régularisation, incident clos. 2. Réactiver l'organisation. 3. Vérifier que les membres retrouvent leurs capacités effectives. |
Action de pré-lancement : exposer la commande de suspension dans l'écran des locataires du portail d'administration, aujourd'hui déclarée manquante dans l'interface elle-même.
#EX-07 · Service en panne et dégradation gracieuse
| Élément | Valeur |
|---|---|
| Contexte | Un service en amont ne répond plus. |
| Cause typique | Base de données injoignable, pod redémarrant, dépendance externe indisponible. |
| Statut | 🟢 Livré. L'agrégat de santé est honnête : il ne répond 200 que si tous les services sondés répondent 200. |
Aucun diagramme à afficher
Diagramme 8 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Portail d'administration : état de santé par service | Sonde chaque service enregistré, hors ceux volontairement exclus de l'agrégat |
| 2 | Bandeau de dégradation | L'agrégat répond 503 dès qu'un service ne répond pas 200 |
| 3 | Une lecture peut renvoyer une liste vide | Repli de lecture seule volontaire lorsque le disjoncteur est ouvert |
| 4 | Une écriture échoue franchement | Garde explicite : les écritures exposent le vrai code d'erreur |
| 5 | Rétablissement automatique | Le disjoncteur tente une récupération après une trentaine de secondes |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Un bandeau de dégradation nommant le service concerné ; une lecture peut être vide, une écriture échoue explicitement. |
| Code d'erreur réel | 503 sur l'agrégat de santé et sur un service dont la sonde de base échoue, avec l'identifiant health/db-unavailable. 502 ou 504 remontés depuis la passerelle. |
| Trace laissée | Journal de la passerelle avec l'identifiant de requête, état du disjoncteur, et compteur d'échecs. |
| Procédure de reprise | 1. Identifier le service en défaut dans l'agrégat. 2. Vérifier sa base de données et sa politique réseau de sortie. 3. Attendre la fermeture du disjoncteur ou redémarrer le service. 4. Rejouer les écritures échouées : elles n'ont pas été appliquées. |
#EX-08 · Jeton expiré en cours de session
| Élément | Valeur |
|---|---|
| Contexte | Une personne travaille depuis plus d'une heure sans rafraîchissement. |
| Cause typique | Durée de vie du jeton d'accès du realm fixée à une heure. |
| Statut | 🟢 Livré. |
Aucun diagramme à afficher
Diagramme 9 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Une action qui semble ne rien faire | Le premier appel repart en 401 |
| 2 | Renouvellement invisible dans le cas nominal | Le portail utilise le jeton de rafraîchissement puis rejoue l'appel |
| 3 | Redirection vers Keycloak si le rafraîchissement échoue | Le garde d'authentification du portail déclenche le flux d'autorisation |
| 4 | Retour sur la page d'origine | L'état de la vue est porté par la chaîne de requête, donc restauré |
| 5 | Les pages publiques restent lisibles | Le garde exempte explicitement les routes publiques |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Au mieux rien du tout ; au pire un retour à l'écran de connexion suivi d'un retour à la page consultée. |
| Code d'erreur réel | 401 sur l'appel expiré. 428 tenant_required si le contexte de locataire est perdu au retour. |
| Trace laissée | Journal d'authentification côté serveur d'identité ; aucune écriture partielle côté applicatif — l'appel a été refusé avant traitement. |
| Procédure de reprise | 1. Se réauthentifier. 2. Revenir à la vue, restaurée depuis la chaîne de requête. 3. Rejouer l'action : rien n'a été écrit. |
Écart connu : dans le portail d'administration, le flux d'activité fonctionne par sondage et un jeton expiré s'y traduit par une série de 401 jusqu'au renouvellement.
#EX-09 · Conflit de modification concurrente
| Élément | Valeur |
|---|---|
| Contexte | Deux personnes ou deux onglets agissent en même temps sur le même objet. |
| Cause typique | Double soumission de revue, double déploiement sur un même run, double clic sur une création. |
| Statut | 🟢 Livré. Un intergiciel d'idempotence est présent sur les créations. |
Aucun diagramme à afficher
Diagramme 10 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Un message de conflit nommant la cause | Refuse la seconde opération plutôt que de l'appliquer en double |
| 2 | Rechargement de l'écran | Affiche l'état réel après la première écriture |
| 3 | Double clic sur une création | La clé d'idempotence évite la double création lorsque le magasin est disponible |
| 4 | Comportement dégradé sans magasin | La clé est acceptée mais non dédupliquée : le comportement est documenté, pas silencieux |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Un message typé : revue déjà en attente, aucune revue en attente, déploiement déjà enregistré, tâche déjà décidée. |
| Code d'erreur réel | 409 avec l'un des identifiants review/already-pending, review/none-pending, deploy/already-recorded, ou un conflit de décision de tâche de validation. |
| Trace laissée | La première écriture est intacte et journalisée ; la seconde n'a rien écrit. |
| Procédure de reprise | 1. Recharger la vue. 2. Constater l'état réel. 3. Agir sur cet état, pas sur l'état supposé. Aucune réconciliation manuelle n'est nécessaire. |
#EX-10 · Quota d'appels d'outil atteint
| Élément | Valeur |
|---|---|
| Contexte | WF-13 et WF-26 · un agent appelle un outil externe au-delà du plafond journalier de son palier. |
| Cause typique | Palier gratuit limité à deux cents appels d'outil par jour ; palier Équipe à cinq mille. |
| Statut | 🟢 Livré. |
Aucun diagramme à afficher
Diagramme 11 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Compteur d'appels d'outil du jour | Publie la consommation par portée |
| 2 | Refus au franchissement | Répond 402 au point de décision de politique |
| 3 | Aucun refus si le plan de contrôle est dégradé | Le plafond journalier échoue en position ouverte : c'est un choix assumé pour ne pas casser une exécution en cours |
| 4 | Ligne d'audit de chaque appel | Journalise par empreinte seulement, par minimisation des données personnelles |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | « Quota d'appels d'outil épuisé pour aujourd'hui », avec le plafond du palier. |
| Code d'erreur réel | 402 sur le quota ; 403 si aucune règle d'autorisation explicite n'existe pour l'outil — c'est le refus par défaut, qui n'a rien à voir avec le quota. |
| Trace laissée | Ligne d'audit d'appel d'outil avec verdict blocked ou allowed, sans exposer le contenu. |
| Procédure de reprise | 1. Distinguer un refus de politique d'un dépassement de quota : les deux messages sont différents. 2. Pour un quota, attendre la réinitialisation quotidienne ou monter de palier. 3. Pour un refus de politique, accorder une permission d'outil explicite sur la portée — WF-26. |
#EX-11 · Secret introuvable dans le coffre
| Élément | Valeur |
|---|---|
| Contexte | WF-16, WF-17, WF-18, WF-26, WF-30, WF-31 · une opération a besoin d'un identifiant. |
| Cause typique | Chemin de coffre erroné, secret jamais déposé, identifiants d'accès au coffre absents de l'environnement. |
| Statut | 🟢 Livré — aucun repli n'est prévu, et c'est délibéré. |
Aucun diagramme à afficher
Diagramme 12 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Message nommant la référence attendue | Rappelle la convention de chemin, sans jamais échoer une valeur |
| 2 | Refus immédiat si le coffre n'est pas configuré | Aucun repli vers un stockage local ou une variable d'environnement improvisée |
| 3 | Message de clonage refusé en rétro-ingénierie | Refuse explicitement plutôt que de tenter un accès anonyme silencieux |
| 4 | Sortie d'erreur d'un outil externe | Caviarde le jeton, y compris ses formes encodées, et tronque le message |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | « Coffre non configuré » ou « identifiants non configurés pour cette source », avec le chemin attendu. |
| Code d'erreur réel | 503 sur le dépôt et la lecture d'identifiants ; 502 reverse/git-credentials-not-configured sur un clonage ; 422 registry/tool-auth-missing-ref si une configuration d'outil déclare une authentification sans référence de coffre. |
| Trace laissée | Journal du service avec le chemin demandé, jamais la valeur. Aucun secret n'entre jamais en base. |
| Procédure de reprise | 1. Construire le chemin normalisé. 2. Déposer la valeur — WF-30. 3. Relire la référence renvoyée et son numéro de version. 4. Relancer l'opération. |
Cas connexe bloqué : la sauvegarde de nouvelles configurations de facturation échoue en position fermée tant que la clé de chiffrement n'est pas provisionnée du coffre vers le cluster. 🔴 Bloqué — c'est une action d'exploitation, et l'échec fermé est le comportement voulu.
#EX-12 · Dépôt non supporté par la rétro-ingénierie
| Élément | Valeur |
|---|---|
| Contexte | WF-04 · une équipe soumet un dépôt qui n'est pas écrit en Python. |
| Cause typique | Patrimoine en JavaScript, TypeScript, Go, Java, Ruby ou C#. |
| Statut | 🟢 Livré — la limite est dite, jamais contournée par une analyse approximative. |
Aucun diagramme à afficher
Diagramme 13 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Progression normale du travail | Clone et parcourt le dépôt sans échouer |
| 2 | Résumé du travail listant les fichiers non supportés | Ne fabrique aucun fait pour ces fichiers |
| 3 | Artefacts honnêtement vides si aucun fait ne les alimente | Un modèle sans fait support dégrade en modèle vide plutôt qu'en modèle inventé |
| 4 | Refus explicite sur un système de source sans analyseur | Le vocabulaire accepté est plus large que les analyseurs réels, et le dit |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Le travail réussit, mais son résumé liste nommément les fichiers non supportés. Les artefacts correspondants sont vides. |
| Code d'erreur réel | 422 reverse/source-system-unsupported pour un système déclaré sans analyseur ; 422 reverse/remote-source-unfetched pour une source distante autre qu'un dépôt git. |
| Trace laissée | Le résumé du travail conserve la liste des éléments non supportés ; les faits produits pour le reste sont persistés normalement. |
| Procédure de reprise | 1. Déclarer d'autres sources exploitables : schéma de base, contrat d'interface, manifestes d'infrastructure, documents, historique du dépôt. 2. Compléter par une spécification saisie ou assistée par IA — WF-06. 3. Ne pas attendre d'analyse profonde d'un code non Python : elle n'existe pas. |
#EX-13 · Approbation refusée
| Élément | Valeur |
|---|---|
| Contexte | WF-11, WF-13, WF-19, WF-27 · une porte humaine est franchie par un refus. |
| Cause typique | Portes de qualité insuffisantes, désaccord de conception, risque de sécurité non attesté. |
| Statut | 🟢 Livré. |
Aucun diagramme à afficher
Diagramme 14 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Verdict de rejet avec le nom du décideur et le motif | Enregistre la décision de façon attribuable et horodatée |
| 2 | Pour une revue de spécification : l'objet reste modifiable | Aucune donnée n'est supprimée |
| 3 | Pour un déploiement : aucune étape de déploiement n'est franchie | Le run conserve ses verdicts d'étape antérieurs |
| 4 | Pour une extension du registre : retour à l'état enregistré | Un rejet ramène un serveur d'outils à son état d'enregistrement, il n'existe pas d'état rejeté durable pour ce genre |
| 5 | Nouvelle soumission possible | Une seule revue peut être en attente à la fois |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Le motif du rejet, le nom du décideur et l'horodatage. |
| Code d'erreur réel | Le rejet lui-même réussit en 200 ou 201 : c'est une décision, pas une erreur. Une tentative d'avancer malgré le rejet renvoie 409 deploy/approval-required ou 409 gate/not-passed. |
| Trace laissée | Ligne de décision en base, entrée au journal d'audit chaîné, historique de revue consultable. |
| Procédure de reprise | 1. Lire le motif. 2. Corriger le sujet. 3. Resoumettre : une nouvelle revue s'ouvre, la précédente reste dans l'historique. |
#EX-14 · Auto-approbation tentée et bloquée
| Élément | Valeur |
|---|---|
| Contexte | WF-11, WF-19, WF-26, WF-27 · la même personne soumet puis tente d'approuver. |
| Cause typique | Équipe réduite, urgence, méconnaissance de la règle. |
| Statut | 🟢 Livré. La règle est appliquée à trois niveaux : interface, service, base de données. |
Aucun diagramme à afficher
Diagramme 15 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Bouton d'approbation désactivé avec un motif nommé | L'interface bloque avant tout appel serveur |
| 2 | Refus en cas d'appel direct à l'interface de programmation | Le service reste autoritatif et refuse |
| 3 | Refus même en cas de contournement applicatif | Une contrainte de base de données nommée interdit l'égalité entre soumissionnaire et décideur |
| 4 | Refus si aucune identité d'acteur n'est portée | Une décision doit être attribuable, sans exception |
| 5 | Cas particulier des sujets à risque élevé | L'approbation exige en plus une attestation explicite de revue de sécurité |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | « Vous ne pouvez pas approuver votre propre soumission », avec le motif nommé. |
| Code d'erreur réel | 409 sod/self-approval-forbidden sur le registre d'extensions · 409 deploy/approval-self sur un déploiement · 400 actor/required sans identité d'acteur · 428 actor_required au refus local du portail · 422 ext/security-review-required sur un sujet à risque élevé sans attestation. |
| Trace laissée | La tentative refusée est journalisée ; aucune décision n'est enregistrée. |
| Procédure de reprise | 1. Désigner une seconde personne disposant du rang requis. 2. Pour un sujet à risque élevé, joindre l'attestation de revue de sécurité. 3. Faire prendre la décision par cette personne. Il n'existe aucun contournement, y compris pour un administrateur de plateforme. |
#EX-15 · Perte de connexion pendant un long traitement
| Élément | Valeur |
|---|---|
| Contexte | WF-04, WF-06, WF-19 · le navigateur perd la connexion pendant une analyse, une génération ou un déploiement. |
| Cause typique | Réseau instable, fermeture d'onglet, veille de la machine. |
| Statut | 🟢 Livré. Le traitement long ne dépend pas de la connexion du navigateur. |
Aucun diagramme à afficher
Diagramme 16 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Réponse immédiate avec un identifiant de travail | Planifie le traitement en tâche de fond et répond sans attendre |
| 2 | Flux d'événements interrompu | Le traitement continue côté serveur |
| 3 | À la reconnexion, l'état réel s'affiche | La vue et l'objet consulté sont portés par la chaîne de requête, donc restaurables par simple lien |
| 4 | En cas d'échec, un motif lisible | Toute exception marque le travail en échec dans une session neuve, avec un résumé sanitisé |
| 5 | Bouton de relance | Une reprise manuelle est possible ; un travail resté en file peut être replanifié en lot |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | À la reconnexion, l'état réel du travail — en cours, prêt ou en échec — jamais une page bloquée. |
| Code d'erreur réel | Aucun côté client : la coupure n'est pas une erreur applicative. Une relance sur un travail déjà en cours renvoie 409 ; sur un travail déjà prêt, l'appel est sans effet. |
| Trace laissée | Le travail conserve son état, son horodatage de début et de fin, et son résumé. Le message d'erreur éventuel est caviardé de tout secret et tronqué. |
| Procédure de reprise | 1. Rouvrir le portail et le lien profond du projet. 2. Lire l'état du travail. 3. Relancer si l'état est en échec. 4. Utiliser la replanification en lot si plusieurs travaux sont restés en file. |
#EX-16 · Mise en ligne désactivée par drapeau
| Élément | Valeur |
|---|---|
| Contexte | WF-20 · une équipe demande la mise en ligne d'un produit dans un environnement où l'interrupteur est fermé. |
| Cause typique | Interrupteur maître à false par défaut, jeton de compte de service non monté. |
| Statut | 🟢 Livré — c'est le comportement voulu, pas un défaut. |
Aucun diagramme à afficher
Diagramme 17 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Message explicite de fonction désactivée | Refuse sans rien simuler |
| 2 | Aucun manifeste appliqué | Le rendu des manifestes est pur : il n'a aucun effet de bord |
| 3 | Distinction entre drapeau et capacité | Deux refus distincts : drapeau fermé, ou capacité en cluster absente |
| 4 | Cas du fournisseur d'identité du produit | Réponse honnête portant applied=false et un motif de blocage |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | « Mise en ligne désactivée » ou « capacité indisponible », jamais un faux succès ni une adresse fictive. |
| Code d'erreur réel | 501 exec/tool-unavailable pour le drapeau fermé ; 501 pour l'applieur indisponible ; réponse 200 portant applied=false avec motif de blocage pour le fournisseur d'identité, dont le serveur d'identité renvoie 403. |
| Trace laissée | La demande est journalisée avec son refus typé. Aucune ressource n'est créée. |
| Procédure de reprise | 1. Faire activer l'interrupteur pour l'environnement visé — action d'exploitation. 2. Vérifier le montage du jeton de compte de service. 3. Relancer. Pour le fournisseur d'identité du produit client, la levée du blocage passe par l'élargissement des droits d'administration sur le serveur d'identité : c'est une action d'exploitation, pas de développement. |
#EX-17 · Sonde de vivacité couplée à la base de données
| Élément | Valeur |
|---|---|
| Contexte | Exploitation · un service à réplique unique oscille et provoque des erreurs en cascade. |
| Cause typique | Sonde de vivacité qui interroge la base : une latence de base entraîne le redémarrage du pod, donc l'indisponibilité du service. |
| Statut | 🟢 Corrigé — le motif est identifié et le correctif appliqué. Un audit reste à mener sur l'ensemble des services, le défaut étant systémique par nature. |
Aucun diagramme à afficher
Diagramme 18 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Le portail affiche des erreurs intermittentes | La passerelle ne trouve aucune réplique disponible |
| 2 | L'agrégat de santé bascule en dégradé | Il ne répond 200 que si tous les services sondés répondent 200 |
| 3 | Le pod redémarre en boucle | La sonde de vivacité couplée à la base le tue à chaque latence |
| 4 | Rétablissement après correctif | Sonde de vivacité découplée, sonde de disponibilité laissée couplée, deux répliques minimum |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Des erreurs intermittentes du portail, souvent confondues avec un problème de navigateur. |
| Code d'erreur réel | 503 sur l'agrégat de santé et sur le service concerné, avec l'identifiant health/db-unavailable. |
| Trace laissée | Compteur de redémarrages du pod, journal de la sonde, journal de la passerelle avec l'identifiant de requête. |
| Procédure de reprise | 1. Découpler la sonde de vivacité de la base : la vivacité ne mesure que le processus. 2. Laisser la sonde de disponibilité vérifier la base. 3. Porter le service à deux répliques minimum. 4. Auditer les autres services : le défaut est systémique par construction. |
#EX-18 · Politique réseau de refus par défaut
| Élément | Valeur |
|---|---|
| Contexte | Exploitation en production · une politique de refus par défaut sur les sorties réseau bloque un appel légitime. |
| Cause typique | Absence d'une règle de sortie explicite vers le serveur d'identité, ou vers les hôtes de dépôts publics. |
| Statut | 🟢 Corrigé et vérifié en production sur les deux cas rencontrés. |
Aucun diagramme à afficher
Diagramme 19 — flowchart
Déroulé
| # | Ce que voit l'utilisateur | Ce que fait le système |
|---|---|---|
| 1 | Portail entièrement inutilisable, message évoquant une origine croisée | Le symptôme visible masque une panne serveur : la passerelle ne démarre pas |
| 2 | Redémarrages en boucle de la passerelle | Le point de vérification des jetons est injoignable |
| 3 | Échec de tout travail de rétro-ingénierie sur un dépôt public | Le clonage sortant est refusé par la politique de refus par défaut |
| 4 | Rétablissement après ajout des règles | Les règles de sortie sont additives à la politique de refus, sans l'affaiblir |
| Rubrique | Contenu |
|---|---|
| Ce que voit l'utilisateur | Un portail hors service dont le message parle de politique d'origine croisée — un faux ami classique — ou un travail d'analyse qui échoue au clonage. |
| Code d'erreur réel | 503 en cascade sur la passerelle et l'agrégat de santé ; 502 reverse/remote-clone-failed sur le clonage, avec sortie d'erreur caviardée et tronquée. |
| Trace laissée | Journal du pod, compteur de redémarrages, résumé du travail portant l'erreur sanitisée. |
| Procédure de reprise | 1. Diagnostiquer depuis l'intérieur du pod, jamais depuis le navigateur : un message d'origine croisée cache très souvent une erreur serveur. 2. Ajouter la règle de sortie manquante, restreinte au pod concerné. 3. Vérifier le redémarrage propre de la passerelle. 4. Relancer le travail bloqué. |
Dette déclarée : la règle de sortie du service de rétro-ingénierie ouvre aujourd'hui le port 443 vers l'ensemble des adresses publiques, en excluant les plages privées. Le durcissement prévu consiste à router ces clonages par un proxy de sortie limité aux hôtes de dépôts connus.
#19. Synthèse
#19.1 Les codes d'erreur réels, par famille
| Code | Signification chez KySpectra | Exemples d'identifiants typés |
|---|---|---|
400 |
Décision non attribuable | actor/required |
401 |
Aucun contexte d'authentification | — |
402 |
Budget ou quota épuisé | Budget de jetons, appels d'outil du jour |
403 |
Rang insuffisant, ou refus de politique | registry/platform-scope-required, refus sous deny-by-default |
404 |
Ressource absente ou masquage d'existence d'un autre locataire ou fonction désactivée par drapeau | registry/virtual-roles-disabled, registry/tiered-scopes-disabled |
409 |
Conflit d'état ou porte de gouvernance | sod/self-approval-forbidden, deploy/approval-self, gate/not-passed, gate/out-of-order, deploy/via-deploy-endpoint, deploy/already-recorded, review/already-pending, review/none-pending |
422 |
Charge utile refusée par une règle nommée | reverse/source-system-unsupported, skill/secret-in-content, registry/tool-auth-secret, uml/type-unknown, cicd/vcs-provider |
428 |
Prérequis d'appel manquant, refusé localement | tenant_required, actor_required |
429 |
Limite de débit atteinte | 300 requêtes par minute par défaut, 20 sur les endpoints d'IA, 5 sur l'authentification |
501 |
Capacité non configurée — jamais une simulation | deploy/live-not-enabled, exec/tool-unavailable, exec/incluster-unavailable, build/runner-unconfigured, discovery/browser-unavailable |
502 |
Dépendance externe en échec | reverse/remote-clone-failed, reverse/git-credentials-not-configured |
503 |
Dépendance interne indisponible | health/db-unavailable, capbind/session-store-unavailable |
#19.2 Ce que l'utilisateur ne voit jamais
| Jamais affiché | Pourquoi |
|---|---|
| Un succès de déploiement non vérifié | Le statut vivant exige la coïncidence de quatre compteurs de répliques, réinterrogés après application. |
| Un montant de consommation estimé | Sans service de facturation joignable, le reçu porte explicitement la mention de non-mesure. |
| Une analyse de code non Python | Les fichiers concernés sont listés comme non supportés. |
| Un résultat d'analyse de sécurité vert alors qu'un scanner manque | Le refus nomme les scanners absents. |
| Un secret dans un message d'erreur | Double caviardage, y compris des formes encodées, et troncature. |
| L'existence d'une ressource d'un autre locataire | Réponse 404, jamais 403. |
#19.3 Arbre de décision pour un incident
Aucun diagramme à afficher
Diagramme 20 — flowchart
#19.4 Les cinq exceptions à traiter avant le jour J
| # | Exception | Action |
|---|---|---|
| 1 | EX-06 · Locataire suspendu | Exposer la commande de suspension dans l'écran des locataires du portail d'administration. |
| 2 | EX-17 · Sonde de vivacité | Auditer tous les services : découpler la vivacité de la base, porter à deux répliques. |
| 3 | EX-05 · Plan rétrogradé | Nettoyer le catalogue de plans — trois jeux de données de démarrage incompatibles coexistent. |
| 4 | EX-16 · Interrupteurs fermés | Décider et documenter l'état attendu de chaque interrupteur par environnement. |
| 5 | EX-08 · Session | Fixer explicitement le mode d'authentification strict par manifeste, la valeur par défaut du code étant le mode permissif. |
KySpectra — Plateforme agentique SDD/SDLC · par Kyrieva
Documentation : kyspectradoc.kyrieva.com ·
Dossier de lancement : Strategielancement/
Document interne de pré-lancement — version 1.0 du 2026-08-17. Les données marquées
« [Gabarit : … ] » doivent être renseignées ou revalidées avant diffusion externe.