Aller au contenu

Écrire un worker arka-deck

Un worker est un processus LLM headless à appel unique (1-shot). Il reçoit un JSON structuré, produit un JSON structuré, et s’arrête. Pas de chat, pas de multi-tour, pas d’interface utilisateur directe.


Les workers traitent des tâches qui nécessitent un LLM mais pas d’interaction : analyser un contexte projet, rédiger une note, proposer une composition d’équipe.

Le cycle d’un worker :

  1. Le système d’arka-deck l’invoque avec un payload JSON (via le port for-workers.ts)
  2. Le worker appelle le LLM configuré avec son prompt + le payload
  3. Il retourne un JSON structuré
  4. L’addon parent reçoit le résultat et l’exploite

Les workers existants et leur addon parent :

WorkerAddon parentStatutRôle
cortex-favorites-suggestercortex-actionsactivePropose 5-15 artefacts Cortex pertinents pour un projet
memory-note-writermemory-localactiveRédige une note mémoire L1-L5 depuis un transcript de session
governance-policy-designergouvernance-liteactiveAssiste la conception d’une politique de gouvernance projet
squad-creatorsquad-leaderactivePropose une composition de squad depuis une mission

Un worker est déclaré par un manifest.json. L’implémentation runtime (invocation LLM, parsing JSON) est gérée par arka-deck — le worker lui-même ne contient que sa déclaration et son prompt.

workers/<name>/
├── manifest.json # obligatoire
├── prompt.json # si le prompt est local (optionnel — sinon via Cortex)
└── # description du worker

{
"name": "mon-worker",
"version": "1.0.0",
"description": "Ce que fait le worker en une phrase.",
"status": "active",
"input": "Description du payload JSON attendu en entrée.",
"output": "Description du JSON produit en sortie.",
"addon_parent": "mon-addon",
"runtime": "claude-headless",
"model": "haiku",
"service": {
"famille_cortex": "SERVICE",
"sous_famille_cortex": "service/service/mon_worker",
"tool_name": "mon_worker_template",
"prompt_source": "cortex://atoms/mon_worker_prompt",
"prompt_atom_id": "atom:mon_worker_prompt",
"preferred_model": "haiku",
"model_override_via": "Paramètres > Services (config user)"
}
}
ChampTypeDescription
namestringIdentifiant kebab-case — doit correspondre au nom du dossier
versionstringSemver
descriptionstringCe que fait le worker
statusstring"active" / "draft"
inputstringDescription du JSON d’entrée (format prose ou pseudo-schéma)
outputstringDescription du JSON de sortie
addon_parentstringNom de l’addon qui possède ce worker (null si worker autonome)
runtimestringVoir runtimes disponibles ci-dessous
service.prompt_sourcestringSource du prompt — voir formats ci-dessous
RuntimeDescription
claude-headlessAppel Claude via SDK Anthropic — idéal pour tâches d’analyse courtes
llm-jsonAppel LLM multi-provider en mode JSON strict — retourne un objet JSON parsé
FormatExempleDescription
cortex://atoms/<id>cortex://atoms/notewriter_note_promptAtome Cortex public — récupéré au runtime
Chemin localworkers/squad-creator/prompt.jsonFichier JSON local dans le dépôt

Le format Cortex est préférable pour les workers actifs : le prompt est versionné dans le Cortex et peut être mis à jour sans modifier le dépôt.


{
"name": "cortex-favorites-suggester",
"runtime": "claude-headless",
"model": "haiku",
"input": "JSON : { project: { name, description }, agents: [{label, sourceId}], recentSessions: [{summary, agentLabel}], memorySummary?: string, libraryTree: { modes, blocs: { types: { skill, expertise, tool, methode, scope } } } }",
"output": "JSON : { suggestions: [{ ref: { type: 'atome'|'bloc', id, label }, justification }] } — 5 à 15 items"
}
{
"name": "memory-note-writer",
"runtime": "llm-json",
"model": "service-assigned",
"input": "JSON : { projectPath, sessionId, agentId?, agentLabel?, transcript, recentNotes, profileMemory, projectMemory }",
"output": "JSON : { level: 'L1'|'L2'|'L3'|'L4'|'L5', title, summary?, content, tags?, actions?, decisions? }"
}
{
"name": "squad-creator",
"runtime": "llm-json",
"model": "gemini-2.5-flash",
"addon_parent": "squad-leader",
"input": "Mission en texte libre, contraintes optionnelles, catalogue de profils disponibles",
"output": "Liste d'agents recommandés (profil + justification), leader désigné, résumé stratégie"
}

Un worker doit être déclaré dans le manifest.json de son addon parent :

{
"name": "mon-addon",
"workers": ["mon-worker"]
}

L’addon invoque le worker via le port for-workers.ts (côté use-case) :

const result = await deps.workers.invoke('mon-worker', {
projectPath,
// ... payload JSON selon le manifest du worker
});

Le résultat JSON est directement exploitable par l’addon.


Le manifest déclare un model préférentiel. L’utilisateur peut le surcharger depuis Paramètres → Services.

CasModèle recommandé
Analyse courte, tâche de classementhaiku
Rédaction structurée, extractiongemini-2.5-flash ou haiku
Tâche complexe, raisonnementsonnet

Règle pratique : commencez par haiku — le worker est 1-shot, le coût est proportionnel au modèle choisi.


  • Un worker ne peut pas initier une conversation multi-tour
  • Un worker ne peut pas appeler un autre worker directement
  • Un worker ne peut pas écrire dans .arka-deck/ — c’est l’addon parent qui persiste le résultat
  • Les workers draft peuvent évoluer sans préavis