Aller au contenu

ADR-0017 — Couloir (lane) : unité d'exécution parallèle, explicite et nommée

Date : 2026-06-17 Catégorie : A (convention transverse) Décideur : Lead architecte DYNORS — validé CTO Statut : Acceptée (cible) — implémentation par paliers S'appuie sur : [[0016-nomenclature-environnements-int-rmoa]], [[0018-exposition-hors-prod-sly-edge-chemin]], [[0019-modele-sirrat-dimension-couloir]] Sources : étude environnements §Partie 6 ; SirratEnvironmentStack.java, SirratEnvironmentSlotValue.java ; dynors-ops/charts/dynors-app/values.yaml


Contexte

Dans un même environnement, DYNORS doit exécuter plusieurs ensembles parallèles (combinaisons d'applications, versions, configurations, secrets, données, ressources). Le modèle actuel ne le permet pas : SirratEnvironmentStack et Deployment sont contraints à une instance par (projet, environnement). Les termes pressentis sont déjà pris : socle = fondation plateforme et deployTarget non-K8s (values.yaml) ; slot = variable de configuration (SirratEnvironmentSlotValue) ; stack = agrégat (projet, env).

Décision

  1. Nom de l'unité d'exécution : « couloir » (fonctionnel, UI/doc) / lane (technique : code, API, DB). Identifiant lane_code validant ^[a-z][a-z0-9-]{1,15}$. Termes socle, slot, stack, instance, cluster, namespace interdits pour ce concept.
  2. Toujours explicite, jamais implicite. Le lane_code figure systématiquement dans l'URL hors-prod (cf. [[0018-exposition-hors-prod-sly-edge-chemin]]), y compris le couloir de référence ref : sly-rmoa-ref… est valide, sly-rmoa… (sans couloir) n'existe pas.
  3. Couloir de référence ≠ couloir par défaut. Le champ is_reference (cf. [[0019-modele-sirrat-dimension-couloir]]) est un libellé fonctionnel (« couloir désigné comme référence dans cet environnement ») pour l'UI/gouvernance. Il ne résout JAMAIS une URL incomplète et ne sélectionne aucun couloir : une requête sans lane_code est rejetée (validation SLY / Gate 0), jamais redirigée.
  4. preprod interdit comme lane_code (réservé au futur environnement, ADR-0016). Un couloir de pré-bascule porte un nom fonctionnel : rc, release-candidate, validation.
  5. Le couloir porte une stratégie de données (cf. 0019) : shared | schema | database. Isolation des routes/cookies sans isolation des données ≠ isolation complète.

Conséquences

Positif : versions multiples en parallèle dans un même environnement ; vocabulaire sans collision ; aucune cible implicite (sécurité, traçabilité) ; isolation par hôte (cookies host-only, ADR-0014). Coût : ajout de la dimension lane au modèle SIRRAT (0019), aux URLs (0018), aux manifestes K8s (namespace {env}-{app}-{lane}) et aux chemins Vault ({env}/{lane}/{app}).

Composants impactés : SIRRAT (modèle, Forge), SLY (routes), Helm (namespace/labels), Vault (chemins), conventions d'URL.

Alternatives considérées

  • socle / slot / stack → écartées (collisions prouvées dans le code/docs).
  • slot explicitement proscrit par la demande et par la collision SirratEnvironmentSlotValue.
  • Couloir dans le chemin (/{lane}/{app}/...) → écarté : casse l'isolation des cookies entre couloirs.
  • Couloir « par défaut » implicite → écarté (contrainte forte : aucune cible invisible).

Plan d'exécution

  1. Figer le vocabulaire (couloir/lane, ref, règle d'identifiant). 2. Ajouter la dimension au modèle (0019) et aux URLs (0018). 3. Contraintes de validation refusant toute route sans lane_code. 4. Mettre à jour règles Cursor + docs.

Suivi

Succès : aucune route SLY sans lane_code ; aucune redirection vers ref ; is_reference jamais utilisé pour résoudre une URL ; 0 réutilisation de socle/slot/stack pour désigner un couloir.