Référence de configuration
Chaque clé de emet.config.json, avec sa valeur par défaut et sa signification. La source de vérité est emet/schema/emet.config.schema.json. Les termes suivent GLOSSARY.md. Retour au README.
emet init écrit le fichier. emet preflight et emet doctor le valident. Une clé marquée « prose uniquement » est lue par les prompts de /emet, pas par la CLI. Une clé marquée obsolète est toujours acceptée. Le schéma autorise aussi une clé de texte libre "//" pour des notes (jamais lue par aucun outil) et "version", qui vaut toujours 1.
pr
Comment la PR d’une vague est fusionnée.
{ "pr": { "autoMerge": true, "mergeMethod": "squash", "maxCiFixAttempts": 2 } }autoMerge(par défauttrue) : attend les checks de la PR puis fusionne ; sans checks, fusionne immédiatement. Un check en échec est corrigé et poussé, jusqu’àmaxCiFixAttemptsfois, puis la PR est laissée ouverte à un humain. Une vague avec quoi que ce soit de signalé n’est jamais fusionnée automatiquement.mergeMethod(par défautsquash) :squash,mergeourebase, transmis àgh pr merge.maxCiFixAttempts(par défaut2, minimum0) : combien de fois le coordinateur peut tenter de corriger un check en échec avant de laisser la PR ouverte à un humain.
handoff
Ce qui se passe après la clôture d’une vague, et les limites de taille de la note de handoff d’un worker. Validé par emet preflight.
{ "handoff": { "autoChain": false, "launcher": "auto", "permissionMode": "bypassPermissions" }}-
maxLines(par défaut60) : nombre maximal de lignes qu’une note.emet/handoff-<ticket>.mdpeut avoir avant queemet handoff --checkla rejette. -
maxChars(par défaut8000, environ 2k tokens) : nombre maximal de caractères qu’une note de handoff peut avoir. -
autoChain(par défautfalse) : après une vague propre et fusionnée, s’il reste des vagues, lance la suivante avecclaude --bgau lieu d’afficher/emet:run --dispatch <spec-id>. Inspectez-la avecclaude agentsouclaude attach emet-<spec-id>-w<n>. Prérequis :claudedans le PATH, avec la prise en charge de--bg.- Un espace de travail de confiance.
--bgs’exécute de façon non interactive, donc la boîte de dialogue de confiance ne s’affiche jamais ; ouvrezclaudeen mode interactif dans le dépôt une fois et acceptez-la. - L’avertissement de contournement accepté une fois dans une session interactive (
skipDangerousModePermissionPrompt), puisque la vague suivante s’exécute danshandoff.permissionMode, et non dans le mode de la session qui la lance.
Elle ne se lance que lorsque la PR a été fusionnée et que rien n’a été signalé, et elle est ignorée si une session
emet-<spec-id>-*est déjà active (claude agents --json). Si le lancement échoue, elle se rabat sur l’affichage de/emet:run --dispatch <spec-id>. -
launcher(par défautauto, parmiauto,orca,bg) : ouvre aussi la vague dans un onglet Orca exécutantclaude attach.autointerroge le runtime d’Orca (orca status), donc cela fonctionne aussi depuis des sessionsclaude --bg, qui n’ont pas deTERM_PROGRAM;orcaessaie toujours ;bgjamais. La vague s’exécute en arrière-plan dans tous les cas, et un onglet qui ne s’ouvre pas n’arrête jamais la chaîne.emet launch <spec-id> --wave <n>fait tout le lancement ; voiremet launch. -
permissionMode(par défautbypassPermissions, parmibypassPermissions,auto,acceptEdits) : mode d’autorisation de la session chaînée. Il n’est pas hérité de la session qui la lance, car le classificateur du modeautopeut refuser une étape commegh pr mergeet laisser une vague à moitié terminée. Vos règlespermissions.denys’appliquent toujours, mais l’avertissement de contournement doit avoir été accepté une fois en mode interactif (skipDangerousModePermissionPrompt).
budgets
Tous facultatifs.
{ "budgets": { "workerAttempts": 2, "reviewRounds": 2, "stallNudgeCap": 6 } }workerAttempts(par défaut2, minimum1) : combien de fois un ticket peut échouer àverifyavant que le gate répondedefer. Le ticket reçoit le label différé et le reste de la vague continue. Un défaut d’environnement, comme la commande de tests qui se termine avec 126/127 ou une panne du fournisseur, met l’exécution en pause sans consommer de tentative.reviewRounds(par défaut2, minimum1) : combien de tours de revue/correction un ticket reçoit avant une escalade vers le niveau de modèle suivant. Tout ce qui reste ouvert après cela reçoit une décision.stallNudgeCap(par défaut6, minimum1) : combien de fois un worker bloqué est relancé. Le compteur n’est jamais remis à zéro.
models
Modèle et effort par rôle. Chaque clé est facultative ; omettre la section conserve le worker en sonnet/medium et le relecteur en opus/medium. L’effort est l’un de low, medium, high, xhigh, max.
{ "models": { "worker": { "model": "sonnet", "effort": "medium" }, "reviewer": { "medium": { "model": "opus", "effort": "medium" }, "high": { "model": "opus", "effort": "medium" } }, "triage": "haiku" }}worker.model(par défautsonnet),worker.effort(par défautmedium) : le worker. La ligneModel:d’un ticket remplaceworkerpour ce seul worker.reviewer.mediumetreviewer.high(par défautopus,mediumchacun) : le relecteur de chaque niveau de risque renvoyé paremet assess. Augmentezreviewer.high.effort(par exemple àhigh) pour plus de rigueur sur les vagues risquées.triage(par défauthaiku) : le modèle économique pour le triage des logs de CI et la revue de niveau passif. Un check en échec est confié à un agent sur ce modèle, qui renvoie au plus environ 2k tokens avec des pointeursfile:line.escalation(par défaut{ "sonnet": "opus" }) : le niveau de modèle suivant pour chaque nom de modèle, utilisé lorsqu’un ticket atteint son plafond de corrections.
review
{ "review": { "highRiskPaths": [] } }highRiskPaths(par défaut[]) : sous-chaînes de chemin supplémentaires, insensibles à la casse, qui forcent le niveau de revuehighdansemet assess, en plus de l’ensemble intégré (authentification, sécurité, paiements, webhooks, CI, l’installateur, lockfiles, migrations et points sensibles dangereux comme le SQL brut ou le pipe-to-shell).
landing
mode(par défautpr) :prouvre une pull request (nécessitegh).mergefusionne la branche d’intégration dans la branche principale locale avecemet landet ne pousse jamais,commands.selfChecktenant lieu de CI. Indépendant du tracker. Voir l’ADR-0010.
tracker
Avec quel issue tracker /emet dialogue. La CLI lit kind pour décider quelles vérifications de dépendances s’appliquent ; le reste documente l’adaptateur que suit la commande /emet (voir docs/agents/issue-tracker.md).
kind(obligatoire) :linear,githuboulocal. Pourlocal, voir Tracker local et l’ADR-0011.transitions.onStart,transitions.onPrOpen,transitions.onPrMerge: qui écrit chaque transition d’état du ticket :worker,coordinatorouautomatic(l’intégration du tracker s’en charge, par exemple l’intégration GitHub de Linear à l’ouverture ou à la fusion d’une PR). Le coordinateur n’écrit jamais une transition marquéeautomatic.github.priorityLabels: associe un niveau de priorité ("1"= P0, le plus haut, à"4"= P3) à un nom de label GitHub, par exemple{"1":"P0","2":"P1"}. Sans aucun déclaré, les tickets sont ordonnés parcreatedAtcroissant etemet doctorle signale.github.stateLabels: associe un état du workflow (todo,in-progress,in-review) à un nom de label GitHub, par exemple{"todo":"status:todo"}.doneetcanceledsont déduits de l’état fermé de l’issue et destate_reason.linear: réglages propres à Linear (clé d’équipe, noms des états du workflow). Lus uniquement par le modèle qui suitdocs/agents/issue-tracker.md, jamais par la CLI.local.idPrefix(obsolète) : les ids de tickets locaux sont désormais<feature-slug>-<NN>.readyLabel,triageLabels,prReference(obsolètes) : modèles de labels et de référence de PR, par exempleCloses #{number}(github) ouRefs: {id}(linear).
preflight
requiredFiles(par défaut aucun) : fichiers queemet preflightexige à la racine du dépôt avant la distribution d’une vague, chacun{ "path", "why" };whyapparaît dans le message d’échec. Vide signifie que la vérification ne s’exécute pas.requiredCommands(par défaut aucun) : binaires qui doivent se résoudre dans le PATH avant la distribution.emet preflightéchoue avec le code 1 en nommant ceux qui ne le sont pas, etemet doctorles signale. C’est la liste propre au dépôt, distincte des vérifications de dépendances pilotées par le tracker ;gha déjà une vérification dédiée, donc le lister est facultatif. Ajouts courants :rgetsg.
specs
dir(par défautdocs/specs) : répertoire, relatif au dépôt, des specs vivantes, écrit paremet spec-merge.
map
path(par défautdocs/agents/codebase.md) : chemin, relatif au dépôt, de la carte que génèreemet map.
concurrency
waveSize(par défaut4, minimum1) : nombre maximal d’appels Agent distribués ensemble dans une vague.maxLiveWorkers(par défautauto) : plafond global partagé par tous les coordinateurs/emetqui tournent sur cet hôte, tous dépôts confondus. Le pool de slots se trouve sous~/.local/state/emet/slots, et non dans un dépôt en particulier.autodéduit le plafond du nombre de CPU et de la RAM de l’hôte ; un entier positif le fixe. Une vérification distincte de marge mémoire (EMET_MEM_RESERVE_GIB, par défaut 8 GiB) refuse une acquisition lorsque la mémoire disponible est trop basse, quel que soit ce plafond. La variable d’environnementEMET_MAX_LIVE_WORKERSremplace ce champ et accepte aussiauto.runIdleThresholdMs(par défaut5400000, 90 minutes) : combien de temps une exécution sans ancre vivante est encore classée comme inactive plutôt que morte, d’après la seule fraîcheur de la transcription. La variable d’environnementEMET_RUN_IDLE_THRESHOLD_MSla remplace.
Voir Variables d’environnement.
ticket
idPattern: source d’une regex ancrée à laquelle l’id d’un ticket doit correspondre, par exemple^PROJ-\d+$. Un motif invalide est une erreur de configuration bloquante.branchPrefix: préfixe en minuscules (^[a-z0-9-]+$) pour la branche locale d’un worker. Les branches sont<branchPrefix>-<number>-<slug>, etcleanupbalaie le glob<branchPrefix>-*.idExample(obsolète, prose uniquement) : un exemple d’id correspondant àidPattern.branchPattern(obsolète, prose uniquement) : modèle complet du nom de branche.
commands
Tous en prose uniquement.
selfCheck: commandes qu’un worker exécute avant de considérer son changement terminé, par exemple["npm run check"]. Aveclanding.modeàmerge, elles tiennent lieu de CI.workerScopedSuite: commande qu’un worker exécute pour tester uniquement la zone qu’il a touchée.emet verifyexige qu’elle passe.fullSuite.run: commande de la suite de tout le dépôt, exécutée une fois sur la branche d’intégration après la fusion des branches d’une vague. Une exécution au rouge bloque la PR etautoChain.fullSuite.singleton:truesi un seul worktree peut exécuter la suite à la fois.fullSuite.runInBackground,fullSuite.reset(obsolètes) : indicateur d’arrière-plan et commandes de réinitialisation d’état.
worktree
lockReason: modèle de la raison dugit worktree lockqu’un worker écrit au démarrage, rempli paremet lock-reason. La valeur par défaut estemet run={runId} ticket={ticket} anchor={anchorPid} slug={coordinatorSlug} at={iso}. Ne la remplacez que pour ajouter des champs :emet lock-reasonrefuse un modèle qui omet le jeton littéralemet, ou l’un derun=,ticket=,anchor=,at=ouslug=.copyFromMain(prose uniquement) : chemins copiés depuis le checkout de la branche principale vers un worktree neuf avant le bootstrap, par exemple des fichiers d’environnement non suivis.bootstrap(prose uniquement) : commandes shell exécutées une fois dans un worktree neuf avant le démarrage d’un worker, par exemple["npm ci"]. Exécutées par la phase 6 de/emet, jamais par la CLI.stateDir(obsolète, prose uniquement) : répertoire des logs locaux de l’exécution, par exemple.emet.
usage
oversizedReadLines(par défaut400, minimum1) : un Read sans offset ni limite sur un fichier de plus de ce nombre de lignes compte comme surdimensionné dansemet usage.stalledMinutes(par défaut10, minimum1) : seuil--minutespar défaut deemet usage --stalled.
sizing
inlineMaxLines(par défaut100, minimum1) : le plus grand corps de ticket, en lignes, conservé en ligne dans le prompt d’un worker.
schema
Prose uniquement. La propriété du schéma de données de ce dépôt, utilisée par la règle d’évitement de conflits de la phase 3 lors du découpage des tickets. Vide ou omis, la règle est ignorée.
ownedPaths: chemins qui définissent le schéma partagé, par exemple["prisma/schema.prisma"]. Au plus un worker par vague peut les toucher.sharedDatabase(obsolète) :truesi les workers partagent une même base de données physique.
commit
Prose uniquement.
trailer: clé du trailer git qu’un worker ajoute aux commits référençant le ticket, par exempleRefs.trailerPosition:bodyoufooter.
repo
trunk: la branche vers laquelle les changements de chaque worker sont fusionnés, et la base de toute comparaison git de cleanup et de preflight, par exemplemain.remote(par défautorigin) : le remote git sur lequel se trouvetrunk.integrationBranch(obsolète, prose uniquement) : branche facultative de longue durée sur laquelle une vague s’intègre avant la branche principale.commitTypes(obsolète, prose uniquement) : types de Conventional Commit autorisés pour les commits des workers.
design
Facultatif, prose uniquement. null ou omis, l’étape de design/revue d’UI est ignorée.
canvasIndex(obsolète) : chemin d’un fichier de canevas de design que les workers consultent avant des changements d’UI.