ADR-0158 : Provenance SLSA, portes G6/G9, contenus de pack, kill switch et import hors ligne de la marketplace
Contexte
La référence d'architecture demande pour la marketplace (B7.4, B8.1, B8.3, B8.4, B8.5, B10.3, G6, G9, G11) : une provenance vérifiable de chaque version, des portes de confidentialité et de résilience, l'identité du paquet (espace de noms, catégorie, éditeur, nom affiché), l'installation de tous les contenus d'un pack (règles, modèles OpenFGA, serveurs MCP, workflows, modèles RAG, tableaux de bord, alertes, migrations), un test de connexion MCP réel, une configuration validée, une suspension immédiate d'un pack ou d'une de ses capacités, la supervision d'une installation et un dépôt local pour les sites isolés.
Avant cette décision, la publication vérifiait dix portes (schéma, signature, SBOM, vulnérabilités, tests, évaluations, licence, permissions, docs, secrets) ; les règles, modèles OpenFGA, workflows, modèles RAG, tableaux de bord, alertes et serveurs MCP restaient dans l'archive sans registre ; aucune route ne suspendait un pack installé.
Décision
- Provenance : le corps de publication porte
provenance: {statement, signature}, un in-toto Statement v1 au prédicat SLSA provenance v1 dont le sujet est l'empreinte de l'archive et dont les sous-produits lient le SBOM et les rapports.enterprise-ai plugin publish --keyle produit et le signe avec la clé de l'éditeur ; la porteprovenancerevérifie l'empreinte, le sujet, le SBOM et la signature avec la clé d'éditeur enregistrée.eai.marketplace_versions.provenanceetprovenance_status(V190) la gardent. - Six portes de plus :
provenance,privacy(G6 : détection et masquage des données personnelles, DLP, résidence,externalExportDefault: deny),security(artefact signé, bac à sable, autorisation dynamique, audit),approvals(requiredForcouvre install, upgrade, sensitivePermissions, production, resume),configuration(configSchemaJSON Schema),resilience(G9 : délai borné, effets de bord idempotents avec clé, workflows qui s'arrêtent ou compensent). Le schémaplugin-manifestgagnenamespace,category,publisher,displayName,security,testFlags,configSchemaetapprovals.requiredFor, copiés à l'identique dans les quatre SDK. - Contenus sans registre propre :
eai.marketplace_assets(V191, RLS forcée) garde par installation chaque règle, modèle OpenFGA, serveur MCP, workflow, modèle RAG, tableau de bord, alerte et migration, avec son empreinte et son état (active,blocked,pending_endpoint,suspended). Un serveur MCP dont l'adresse est donnée en configuration est enregistré dans la passerelle MCP (eai.mcp_servers) et testé par un vraiinitializepuis la liste des outils ; un modèle RAG crée sa base de connaissances. - La configuration d'une installation est validée contre le
configSchemadu pack (config_invalid). - Kill switch :
POST /v1/marketplace/installations/{id}/statussuspend tout de suite une installation ou certaines de ses permissions (outils bloqués, agents suspendus, serveurs MCP désactivés, contenus suspendus) ;POST /v1/marketplace/packages/{name}/statussuspend d'un coup toutes les installations d'un paquet et refuse installations, mises à niveau, publications et mises en production. La reprise passe toujours par une approbation de deux autres personnes. GET /v1/marketplace/installations/{id}/supervisionagrège activité, qualité, coûts et incidents à partir des enregistrements de la plateforme.- Import hors ligne : le corps
--body-out, l'artefact et sa signature cosign voyagent dans une disposition OCI (oras), sont poussés dans le registre local puis importés (client.marketplace.import_publication). Toutes les portes sont revérifiées hors ligne.
Les cœurs restent sous MIT ou Apache-2.0 ; in-toto, SLSA, cosign, oras et zot sont des projets open source sous Apache-2.0.
Conséquences
- Un pack sans provenance signée, sans
configSchemaou qui désactive une exigence de sécurité n'est plus publiable. - Les packs existants (
packs/hr,packs/finance,packs/templates/*) portent les nouveaux champs. - Les migrations V190 et V191 étendent les tables marketplace (V130) sans les recréer.
Preuves
services/control-plane/tests/test_marketplace_governance.py (portes pures, provenance enregistrée et falsifiée, contenus installés, configuration refusée, connexion MCP réelle, suspension et reprise à quatre yeux, kill switch du paquet, isolation, supervision, import par disposition OCI dans un second registre zot), services/control-plane/tests/test_marketplace.py, sdks/python/tests/test_governance_clients.py, sdks/go/endpoints_v13_test.go.