| schema_version | base.resource.v1 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| id | le-standard | ||||||||
| type | document | ||||||||
| title | Le standard BASE: base.resource.v1 | ||||||||
| description | La page citable du standard que BASE propose: le format base.resource.v1, sa portée, son modèle d'objet, les deux séparations, les conventions de routage, sa conformité vérifiable, sa promesse de stabilité et son implémentation de référence. | ||||||||
| scope | public | ||||||||
| status | active | ||||||||
| sensitivity | public | ||||||||
| license | CC-BY-4.0 | ||||||||
| keywords |
|
||||||||
| audience |
|
||||||||
| learning_level | intermediate |
BASE n'est pas une plateforme de plus: c'est un standard ouvert que nous proposons, avec son
implémentation de référence. Il ne standardise pas seulement la connaissance qu'une IA consulte:
il standardise l'articulation du travail entre l'humain et l'IA, quel agent, quel process, quelles
données, quelle vérification. Cette page est l'endroit citable du standard. Elle en nomme chaque
pièce et renvoie vers sa source de vérité, sans en copier aucune: une copie locale dériverait, et la
règle d'anti-dérive (specs/current/30_schemas) veut qu'il n'existe qu'une seule vérité machine.
Ce standard est encore jeune. Il est stabilisé et versionné, il a une implémentation de référence et une conformité vérifiable, mais il n'est pas ratifié par un organisme tiers. Cette page dit ce que le format garantit aujourd'hui, et ne présente rien d'autre comme acquis.
Le standard couvre le format d'une ressource et les conventions qui la rendent utile à un agent: comment un fichier se déclare, comment il se valide, comment un routeur le choisit. Il ne définit ni les règles métier d'une organisation, ni un moteur d'exécution, ni un modèle: ces choix restent au-dehors, et l'implémentation de référence les traite comme des points d'extension ou des briques remplaçables. La place de BASE parmi les autres outils, et ce qu'il ne prétend pas être, sont détaillés dans Positionnement; cette page-ci décrit le format lui-même.
L'identité du format est portée par un seul champ, requis dans chaque ressource:
schema_version: base.resource.v1La vérité machine est base.schema.json, sous l'identifiant stable
https://a-i.swiss/base/schemas/base.resource.v1.json. Cet identifiant ne change qu'avec une version
majeure du format. Le format suit le versionnage sémantique (voir Sa promesse de stabilité):
un ajout rétrocompatible reste base.resource.v1; une rupture incrémenterait le v.
base.resource.v1 est le schéma qu'un auteur écrit. Il appartient à une petite famille versionnée:
base.config.v1 et base.workspace.v1 décrivent la configuration d'un BASE, base.manifest.v1 et
base.routing.v1 sont des projections générées (jamais une source de vérité), et
base.trace_event.v1 décrit les traces. Chacun porte son propre $id stable.
Une ressource est un fichier Markdown (ou JSON) portant un petit en-tête typé. Le principe est la
métadonnée progressive: peu de champs sont requis, le reste s'ajoute quand un mécanisme ou un
signal en a besoin. La grammaire complète du frontmatter est spécifiée dans
specs/current/10_core/frontmatter.md, assez
précisément pour être réimplémentée: un sous-ensemble strict, documenté, qui rejette bruyamment tout
ce qui en sort, plutôt qu'un moteur YAML complet.
Quatre champs, et seulement quatre, sont exigés dès que schema_version est présent:
| Champ | Contrainte | Rôle |
|---|---|---|
schema_version |
constante base.resource.v1 |
déclare le format et sa version |
id |
^[a-z0-9][a-z0-9-]*$, unique dans un BASE |
nomme la ressource de façon stable |
type |
énumération fermée (voir ci-dessous) | dit ce qu'est la ressource |
description |
chaîne non vide | une phrase de sens, aussi utile au routeur |
Le type est une énumération fermée, et volontairement courte: six valeurs, chacune justifiée
par un comportement distinct dans l'implémentation. Une liste fermée est un contrat, pas un catalogue
d'illustrations; un type qui ne changerait rien au comportement ne serait pas un type, mais une
étiquette.
- La méthode, comment le travail s'articule:
agent,process,competence. L'agent(un rôle) et leprocess(une unité de travail) sont les seuls types routables, ceux vers lesquels un routeur choisit. Lacompetenceest le savoir qu'un process consulte; elle n'est jamais routée pour elle-même. - L'opération:
toolest le seul type exécutable,base invokeexigetype: toolet unexecution.entrypoint.templateest un artefact à remplir; sa seule singularité est d'être signalé quand aucune ressource ne le référence, la même lentille de maintenance quecompetence. - Le contexte:
document, ce qu'un agent consulte une fois la route choisie. Il ne déclenche aucune opération; il est inventorié, ouvert, validé, daté, et retenu côté local s'il estconfidential, comme toute ressource.
La distinction méthode / opération / contexte est opérable, pas décorative: c'est ce que le routeur, la CLI et le vérificateur traitent réellement.
Le reste est progressif, et chaque champ sert un mécanisme précis, jamais la décoration. Groupés par ce qu'ils activent:
- Routage:
use_when,routing.examples,routing.avoid_when(voir ci-dessous).titlereste optionnel, mais il est vivement conseillé sur une ressource partagée: il nourrit la découverte et le rappel. - Contrôle d'egress:
confidential, un booléen posé par un humain, jamais inféré. C'est le seul champ de ressource qui empêche un envoi vers un modèle distant. - Classification:
sensitivity,scope,license. Ils décrivent une ressource, etsensitivityest le champ que la couche de politiques peut lire pour filtrer une action. Mais la classification ne pilote pas l'egress: seulsconfidential: true, ou une racine déclaréelocal-only, retiennent une ressource côté local. Unsensitivity: confidential, qui n'est qu'une valeur de classification, ne retient donc rien par lui-même: le booléen d'egress estconfidential. - Vieillissement:
review_by,valid_from,valid_until, lus parbase doctoret par le contexte, pour qu'une ressource périmée soit signalée au lieu de circuler en silence. - Cycle de vie:
status(draft,active,deprecated,archived). Une ressource dépréciée ou archivée n'est jamais candidate au routage; le corpus vieillit explicitement. - Points d'extension:
execution(les tools),requires(les dépendances),source(la provenance). On les ajoute quand un mécanisme les appelle.
Le contrat autorise les clés supplémentaires (additionalProperties: true): un producteur enrichit
sans casser un consommateur. Une application peut donc poser ses propres clés (cette page, servie par
le site de documentation, porte ainsi audience et learning_level): ce sont des extensions d'un
modèle applicatif, pas du format, et elles n'engagent pas le standard. Les champs de gouvernance
d'une organisation (owner, review_date, policy, trace, governance…) suivent la même voie:
le contrat ne les schématise pas, et la couche de validation permet de les exiger là où votre
contexte le demande (requireFields(["owner", "review_date"], { whenScope: "team" }), le motif du
kit enterprise). Un fichier qui les porte reste valide; ce que le schéma reconnaît, lui, se limite
aux champs qu'un mécanisme lit. Ce que BASE reconnaît,
en revanche, est contraint et vérifié: c'est là qu'il prend ses quelques opinions, précisément celles
qui activent un mécanisme.
Trois choses distinctes se recouvrent souvent à tort. Le type est l'ontologie, ce qu'est la
ressource. Le nom de fichier est une convention d'interopérabilité: un process s'écrit dans un
SKILL.md, le format natif reconnu par la convention Agent Skills, et un agent dans un AGENT.md.
L'emplacement est la grammaire de chemins que suit un BASE: .ai/agents/<id>/AGENT.md, ses
process sous .ai/agents/<id>/skills/processes/<id>/SKILL.md, ses compétences sous
.ai/agents/<id>/skills/competences/<id>/, plus les templates/ et tools/ de l'agent. Ces noms et
ces segments servent aussi de clés: quand le frontmatter ne déclare pas le type, il est dérivé
du chemin (un AGENT.md est un agent, un SKILL.md sous processes/ un process, et ainsi de suite).
La grammaire complète est dans specs/.
Les marqueurs de corps ([A VALIDER], [DECISION], [A COMPLETER], [ATTENTION]) relèvent de la
même logique: une convention de méthode, relevée par base doctor, et non des champs du format.
Ce que le format seul ne dit pas, et que BASE ajoute, tient en deux frontières.
- Les instructions séparées des données. C'est la frontière de sécurité: ce qui guide le modèle
ne se mélange pas à ce qui n'est que lu. Un contrôle d'egress s'y appuie (le champ
confidential). - Le savoir-faire séparé du savoir. Dans les instructions, le process (comment faire) est distinct de la compétence (ce qu'il faut savoir): c'est la frontière de maintenabilité.
Un format de connaissance voisin fait cohabiter un mode opératoire et la description d'une table avec le même statut de contenu consultable. BASE les sépare, parce que la sécurité et la maintenabilité en dépendent. Ces frontières sont posées dans ARCHITECTURE.md et le README.
Un standard qui décrit une unité de travail doit dire comment la choisir. Le standard définit les signaux de routage (ci-dessous); une demande choisit un agent et un process entiers, ou s'abstient, sans récupérer des fragments par similarité. Dans un outil d'IA, le modèle décide d'après ces signaux; l'implémentation de référence fournit aussi un plancher déterministe et explicable pour les appels sans modèle. Les signaux vivent dans le fichier lui-même:
use_when: une phrase courte sur quand utiliser la ressource, le signal le plus fort.routing.examples: de vraies formulations d'utilisateur, pour améliorer le rappel.routing.avoid_when: des contre-exemples, qui écartent une ressource mal appariée sans la rendre opaque.
Ces champs sont progressifs: une ressource route déjà depuis son titre et sa description seuls. La
décision retourne l'un de quatre statuts, routed, ambiguous, needs_clarification,
out_of_scope, jamais une confiance opaque, et s'abstient plutôt que de fabriquer une route depuis du
bruit. La spécification normative est routing.md; le
guide d'écriture est Écrire pour le routeur.
Ici le standard se distingue nettement d'un format à consommation permissive. base validate est le
vérificateur de conformité, et il bloque: sur une violation d'un champ requis, d'un id, d'un
type ou d'une date, il refuse au lieu d'accepter au mieux. Les diagnostics sont des codes
stables, sur lesquels une CI et des extensions peuvent réagir, avec la ligne fautive; le message
lisible est découplé du code.
- Erreurs de grammaire du frontmatter:
base.yaml.*(par exemplebase.yaml.duplicate_key,base.yaml.tab_indent,base.yaml.unterminated_quote). - Erreurs de conformité du modèle:
base.field.required,base.id.invalid,base.id.duplicate,base.type.invalid,base.schema.unsupported,base.confidential.type,base.validity.order, entre autres. - Règle d'or, la même que le parseur: sur erreur, aucune valeur devinée. Le code est enregistré, la clé omise, et la validation échoue proprement.
Le cœur ne valide que le minimum que BASE requiert. Les règles d'une organisation (champs obligatoires
par périmètre, détection de données personnelles, rétention) sont des validateurs opt-in qui
enregistrent leurs propres codes: le cœur ne prétend jamais connaître les règles d'une organisation.
La spécification est validator.md.
Le format suit le versionnage sémantique: aucun changement incompatible sans dépréciation préalable
et incrément majeur. C'est l'engagement NFR-CORE-002, dit «pas de rupture», détaillé dans
Versions et stabilité. L'identifiant base.resource.v1 ne change qu'avec
une version majeure du format. Un élément stable qui doit disparaître est d'abord déprécié, maintenu
fonctionnel sur au moins une version mineure, avant tout retrait. Un standard jeune assume une taille
de plus: une valeur que rien ne consomme (aucun mécanisme derrière elle, aucun fichier connu ne s'y
appuie) peut être retirée en version mineure, dite telle quelle dans le CHANGELOG: la 1.2.0 l'a fait
pour onze valeurs de type spéculatives. La surface stable englobe le format et ses six type, les
commandes CLI et outils MCP existants, et les schémas des projections (base.manifest.v1,
base.routing.v1).
Le dépôt fournit l'implémentation de référence: la CLI base, le Studio et le serveur MCP, tous sur
le même cœur (Node.js ≥ 18, sans dépendance tierce au cœur). Les spécifications
(specs/) sont écrites pour permettre une réimplémentation indépendante:
changer de langage ou de bibliothèques et reconstruire des fonctionnalités équivalentes reste possible
à partir d'elles. Le standard, c'est le format et ses conventions; la CLI, le Studio et le serveur MCP
n'en sont qu'une implémentation.
Un process, la plus petite ressource routable utile:
---
schema_version: base.resource.v1
id: rediger-un-devis
type: process
description: "Rédiger un devis client à partir du catalogue de prix en vigueur."
use_when: "l'utilisateur veut établir ou chiffrer un devis pour un client"
---
# Rédiger un devis
1. ...Quatre champs requis, un signal de routage, et le corps en Markdown. Le reste s'ajoute quand un besoin
l'appelle: confidential: true pour retenir une ressource côté local, valid_until pour dater un
tarif, sensitivity pour une ressource partagée (et owner en clé d'extension, si votre organisation l'exige via requireFields).
Une ressource BASE est déjà lisible par les formats ouverts voisins (AGENTS.md, Agent Skills,
CLAUDE.md, Open Knowledge Format): c'est un simple fichier Markdown à frontmatter. Les CLAUDE.md,
AGENTS.md et règles Cursor d'un BASE sont des adaptateurs générés depuis la source que vous
possédez (base build), et le SKILL.md est le format natif des process. Là où un format de
connaissance décrit ce qu'un agent peut consulter, BASE articule comment un humain et une IA
travaillent: il ajoute les deux séparations, le routage vers un agent et un process entiers (guidé par le «Quand l'utiliser»), le contrôle d'egress, l'écriture
médiée et la boucle de vérification par l'humain. Le positionnement complet face à ces formats:
Positionnement. D'autres cibles d'export ne sont pas implémentées à ce jour et ne
sont pas présentées comme acquises.
BASE est un cadre porté par AI Swiss. Cas d'usage en partenariat avec Innovaud.