Skip to content

Anthropic built Scion for itself. Carbon Forge is yours →

Carbon Forge
Menu

Guide

Règles d'intégration : les code owners gardés au registre, avec un workflow AEGIS comme porte

Un fichier CODEOWNERS nomme des relecteurs, mais l'approbation vit sur une forge et reste attachée à un changement qui a pu bouger depuis. Carbon Forge garde la règle et les approbations dans le registre, liées au changement exact, et laisse un workflow être l'un des approbateurs.

Aussi en: English, Español, Português, 日本語, Deutsch, 한국어, 简体中文, Italiano, हिन्दी · Tous les guides en français

Transparence : nous développons Carbon Forge, et AEGIS à côté, chez 100monkeys.ai ; lisez donc ceci comme le récit du fabricant. Ce guide a été rédigé par l'un de nos agents d'IA à partir de la documentation publique (en anglais), principalement l'étape 8 de Working in lanes, Source control settings, MCP tools catalog: Lanes, continued et Source control: how it is built and why, et relu par l'entreprise ; cette version française est une traduction du guide original en anglais. Le tableau, les appels et le refus sont ceux de la documentation. Là où la documentation laisse une question ouverte, la dernière section le dit.

Pourquoi garder la règle dans le registre

La documentation donne la raison en deux phrases : "Landing rules are the code-owners rule kept in the record. The approvers a path needs are named on a page of the workspace, and each approval binds to the lane's composition hash, so review is the record's and not a forge's." (Les règles d'intégration sont la règle des code owners gardée dans le registre. Les approbateurs dont un chemin a besoin sont nommés sur une page de l'espace de travail, et chaque approbation se lie au hash de composition de la lane : la relecture appartient au registre, pas à une forge.) Sans cela, "a landing can carry code no approver saw." (une intégration peut apporter du code qu'aucun approbateur n'a vu.) Une limite d'emblée : "Carbon runs no review itself." (Carbon ne fait lui-même aucune relecture.) Il enregistre qui a approuvé quoi ; la relecture est faite par des personnes et par les workflows que vous nommez.

Étape 1. Protéger le trunk

Les règles ne sont lues que sur un trunk protégé. Un administrateur de l'espace de travail coche Protect the trunk sous Settings, Workspace, Source control, et en option Protect pages and atoms too. Un agent vérifie le réglage avec :

workspaces.get_settings {}
→ { "workspaceId": "…", "trunkProtected": true, "trunkProtectedEntities": false }

Dès lors "the trunk moves only by a lane's landing" (le trunk ne bouge que par l'intégration d'une lane), et une écriture directe est refusée avec workspace <slug> protects its trunk: the trunk lands by lanes.land only; write on a lane.

Étape 2. Écrire la page .landing-rules

Créez une page au chemin réservé .landing-rules dont le premier tableau Markdown a pour en-tête glob | approvers | gate. L'exemple de la documentation :

| glob | approvers | gate |
| --- | --- | --- |
| app/src/billing/** | <user id>, <user id> | |
| docs/** | <user id> | docs-review |

Seul un administrateur de l'espace de travail écrit cette page, sur le trunk ou sur une lane ; toute autre personne est refusée avec The landing rules page .landing-rules is reserved: only a workspace admin writes it.

Étape 3. Vérifier que le serveur la lit comme valide

La section Landing rules de la boîte de dialogue des réglages affiche <n> rules, valid., ou nomme une ligne mal formée avec Every landing is refused until it is fixed. Une ligne qui nomme un non-membre, ou qui ne nomme ni approbateur ni porte, est mal formée. Une page cassée arrête toute intégration : vérifiez donc ceci avant de vous y fier.

Étape 4. Faire le travail sur une lane

Ouvrez une lane et écrivez dessus comme le montre Working in lanes. À l'intégration, chaque chemin que la lane touche est confronté à chaque ligne : une page par son chemin, une page déplacée par ses deux chemins, un fichier d'arbre sous la forme <tree path>/<entry path>.

Étape 5. Lire ce qui manque encore à la lane

lanes.create { "label": "agent/7/fix-login" }
lanes.get { "label": "agent/7/fix-login" }
lanes.export { "lane": "agent/7/fix-login" }   // header line: # composition: <hash>
lanes.approve { "lane": "agent/7/fix-login" }

lanes.get liste qui a approuvé, qui manque, et si chaque porte est pending ou satisfied. Dans l'application, la vue d'ensemble d'une lane montre la même chose : les règles qu'elle touche, n approbations sur m, et une approbation venue d'une porte marquée "via gate <workflow>".

Étape 6. Approuver le changement exact

Un relecteur lit lanes.export, un unique diff unifié dont l'en-tête est # composition: <hash>, puis appelle lanes.approve. L'approbation se lie à ce hash, si bien que "a reviewer who reads the export and approves at its # composition: value has approved exactly that change." (un relecteur qui lit l'export et approuve à sa valeur # composition: a approuvé exactement ce changement.) Tout patch, résolution ou mouvement du trunk ultérieur qui change ce qui serait intégré change le hash, et les approbations antérieures ne comptent alors plus. Approuvez après le dernier changement, pas avant.

Étape 7. Laisser le workflow AEGIS approuver comme porte

Une porte n'est satisfaite que par le workflow lui-même. Le token de l'exécution est émis par tokens.mint_execution avec l'argument facultatif workflow réglé sur le nom de la porte, de 1 à 128 caractères ; l'exécution appelle ensuite lanes.approve avec ce token. La correspondance est exacte, "case included" (casse comprise). "A person's approval, and one given through a token minted without workflow, satisfies no gate." (L'approbation d'une personne, et celle donnée par un token émis sans workflow, ne satisfont aucune porte.) Le token d'exécution est un enfant du token de l'appelant, limité à un espace de travail, un chemin d'arbre, une lane, une liste d'outils et une journée au plus. Avec AEGIS by 100monkeys.ai, in beta, la porte est un workflow que vous écrivez vous-même : la ligne le nomme, et Carbon Forge vérifie seulement qu'une de ses exécutions a approuvé.

Étape 8. Intégrer

lanes.land { "label": "agent/7/fix-login", "intent": "fix: accept magic links", "dry_run": true }
lanes.land { "label": "agent/7/fix-login", "intent": "fix: accept magic links" }

Une intégration à qui il manque des approbations est refusée en bloc, en nommant ce qui manque :

Lane <label> touches <path> under landing rule <glob> (line <n>), which needs approval from <user ids> and gate <name> at the lane's current composition. Approve with lanes.approve; nothing was written.

Quand elle s'intègre, les approbations consommées, y compris celle de la porte, "follow its intent as Approved-by: lines" (suivent son intention sous forme de lignes Approved-by:), et le changeset est scellé comme n'importe quel autre. Notez qu'une intégration en dry_run ne vérifie pas les règles ; lisez lanes.get pour cela.

Ce que la documentation laisse sans réponse

Guides liés

Gardez la relecture dans le registre.