Process Flows
Créer des Process Flows avec le SDK — étapes, tâches, personas, modèles d'actions et déclencheurs vocaux — et les distribuer sous forme de extensions
Cet artefact est distribué dans un Extension. Pour le cycle de vie partagé — installation, extension build, upload — voir Extensions & SDK d'authoring.
Un Process Flow est un workflow structuré et reproductible avec des étapes, des tâches et des personas — lancements de projets, audits, onboarding, revues de due-diligence. Vous le créez une fois comme Process Flow avec ce SDK et le distribuez dans un .scrydon-extension.tar.gz ; la plateforme l'instancie à chaque exécution comme un Process Flow.
Le SDK et l'extension sont le seul chemin d'authoring. Les Process Flows sont définis en code avec ce SDK et installés via le téléversement Paramètres → Plateforme → Extensions → Sources de la plateforme. Il n'y a pas d'éditeur in-app. Une fois une extension installé, les administrateurs d'espace de travail activent le modèle pour un environnement depuis Extensions, le rendant instanciable dans les Process Flows.
Vous ne voulez pas écrire ce code à la main ? Voir Créer un Extension avec un agent de codage IA — décrivez les étapes, tâches et approbations en langage courant et laissez un outil comme Claude Code, Cursor ou GitHub Copilot faire le travail avec le SDK.
Les archives de process flow sont des données pures. L'archive est du JSON — aucun code exécutable ne figure jamais dans l'archive. La logique personnalisée est référencée par ID contre des workflows système ou organisationnels.
Scrydon extension archives. Les process flows sont distribués sous forme d'archives .scrydon-extension.tar.gz qui regroupent le flow avec son ontologie (et, dans les prochaines versions, les seeds KB et les block extensions). L'extension s'importe atomiquement — installation de l'ontologie, rebind slug → class ID tenant, matérialisation du process flow, le tout en une seule transaction. Construisez avec bunx @scrydon/sdk-authoring extension build ; inspectez avec bunx @scrydon/sdk-authoring extension inspect. Voir la spec et packages/sdk-authoring/src/extensions/examples/ai-boardroom/ pour un exemple fonctionnel.
Installation
bun add -d @scrydon/sdk-authoring zodimport {
defineProcessFlow,
defineStage,
defineTask,
defineAction,
definePersona,
defineVoiceTrigger,
} from '@scrydon/sdk-authoring/process-flows'Anatomie d'un modèle
| Élément | Rôle |
|---|---|
| Package | Identité de l'archive : id, name, version |
| Template | Le flow lui-même — vue par défaut, configuration d'exécution, métadonnées |
| Persona | Rôles auxquels une tâche peut être assignée (one, many ou system) |
| Stage | Une phase ordonnée. Les transitions sont manual, automatic ou approval |
| Task Template | Éléments de travail à l'intérieur des étapes. Portent des actions, des dépendances, des attributs par défaut |
| Action Template | Ce que la tâche demande à l'utilisateur de faire — checklist, document, approval, workflow, entity_link, file_upload, distribution, voice_trigger |
| Voice Trigger | Bloc d'enrichissement vocal optionnel délimité à un chemin |
Un exemple complet
import {
defineProcessFlow,
defineStage,
defineTask,
defineAction,
definePersona,
} from '@scrydon/sdk-authoring/process-flows'
export default defineProcessFlow({
manifestVersion: 1,
package: {
id: 'acme.kickoff',
name: 'Acme Customer Kickoff',
version: '1.0.0',
},
template: {
slug: 'acme-kickoff',
name: 'Customer Kickoff',
description: 'Standard onboarding flow for new enterprise customers',
version: '1.0.0',
defaultView: 'tracker',
executionConfig: {
stageFlow: 'sequential',
taskFlow: 'parallel',
allowRuntimeTaskCreation: true,
},
metadata: {
icon: 'rocket',
color: '#2563eb',
tags: ['onboarding', 'sales'],
},
personas: [
definePersona({ slug: 'csm', displayName: 'Customer Success Manager', cardinality: 'one' }),
definePersona({ slug: 'champion', displayName: 'Customer Champion', cardinality: 'one' }),
definePersona({ slug: 'system', displayName: 'System', cardinality: 'system' }),
],
stages: [
defineStage({
slug: 'discovery',
name: 'Discovery',
transitionMode: 'manual',
estimatedDuration: { value: 5, unit: 'days' },
}),
defineStage({
slug: 'rollout',
name: 'Rollout',
transitionMode: 'approval',
}),
],
taskTemplates: [
defineTask({
slug: 'collect-stakeholders',
stageSlug: 'discovery',
name: 'Collect stakeholders',
defaultAssignedRoleSlug: 'csm',
actions: [
defineAction({
name: 'Stakeholder list',
actionType: 'document',
isRequired: true,
metadata: { persona: 'csm' },
}),
],
}),
defineTask({
slug: 'kickoff-call',
stageSlug: 'discovery',
name: 'Kickoff call',
dependsOnTaskSlugs: ['collect-stakeholders'],
actions: [
defineAction({
name: 'Record kickoff call',
actionType: 'voice_trigger',
isRequired: true,
metadata: { triggerPath: '/kickoff/' },
}),
defineAction({
name: 'Capture summary to KB',
actionType: 'workflow',
isRequired: false,
workflowId: 'system.summarize-meeting',
metadata: { promoteToCorpus: 'summary' },
}),
],
}),
defineTask({
slug: 'rollout-plan',
stageSlug: 'rollout',
name: 'Approve rollout plan',
dependsOnTaskSlugs: ['kickoff-call'],
actions: [
defineAction({
name: 'Approve plan',
actionType: 'approval',
isRequired: true,
metadata: { persona: 'champion' },
}),
],
}),
],
voiceTriggers: [],
},
})Types d'actions
| Type d'action | Utiliser pour |
|---|---|
checklist | Une tâche simple que l'utilisateur marque comme terminée |
document | Un document que l'utilisateur doit produire ou joindre |
approval | Une porte d'approbation — assignée à un persona, bloque les tâches en aval jusqu'à l'accord |
workflow | Référencer un workflow exécutable — soit par workflowId (un workflow système ou org déjà existant dans le tenant) soit par workflowSlug (un workflow distribué dans le même Extension — voir Workflows). Les deux sont mutuellement exclusifs |
entity_link | Lier la tâche à une instance d'objet typé via l'ontologie |
file_upload | Un dépôt de fichier — les octets sont ingérés dans la KB de l'instance |
distribution | Envoyer vers un canal (email, slack, teams) ; supporte le quorum, fire-and-forget, all-acknowledged |
voice_trigger | Capturer de l'audio contre un chemin — le STT s'exécute et la transcription alimente la KB |
Voir Types d'actions pour une analyse approfondie par type avec des exemples prêts à copier-coller, des notes sur l'UX à l'exécution, et les champs de métadonnées que chaque type lit.
Ancrer une étape IA dans les documents de l’espace de travail (metadata.retrieval)
La direction inverse : une action workflow qui exécute un agent — un agent intégré
@system/* ou un workflow de extension/canvas (inline ou frère) — peut être
ancrée dans un ou plusieurs documents téléversés plus tôt dans le flow, de sorte que l’agent raisonne sur des entrées réelles plutôt que sur le nom de la tâche seul. Déclarez-le avec
metadata.retrieval sur l'action :
defineAction({
name: "AI Qualification Assessment",
actionType: "workflow",
isRequired: false,
executionMode: "automatic", // run when the stage is entered
workflowId: "@system/agent-project-qualifier",
metadata: {
aiAgent: "project-qualifier",
// Where the agent result lands, by target ACTION TYPE (see below):
// an assessment on this workflow step itself, and an advisory banner
// on the flow's human approval action.
outputSurface: [
{
kind: "workflow",
contentType: "project_qualification_assessment",
pageTitle: "AI Qualification Assessment",
},
{
kind: "approval",
targetTaskSlug: "go-no-go-decision",
advisorySource: "ai-qualification",
},
],
retrieval: {
// The document(s) the agent must judge. `fromTask` is the slug of an
// earlier task: its completed document action's page, its file_upload
// action's ingested documents, and/or its workflow (agent) action's
// assessment page are resolved as stable, source-level entries.
inputs: [{ fromTask: "upload-source", mode: "full" }],
// Maximum optionnel par source. Le budget exact du bloc rendu partagé
// peut attribuer moins après comptage des titres, états et marqueurs.
// Valeur omise → full : 24 000 ; summary : 4 000.
inputDocMaxChars: 60_000,
},
},
})| Champ | Signification |
|---|---|
retrieval.inputs[] | { fromTask, mode }. Charge les documents sources produits à fromTask (un slug de tâche) : page de l'action document, pages issues de ses téléversements file_upload et/ou page d'évaluation de son action workflow agent. Les emplacements connus de la tâche font autorité ; la sélection lexicale dans la KB n'est utilisée qu'en l'absence d'emplacement déterministe et porte la mention Documents pertinents sélectionnés, sans prétendre représenter l'inventaire complet. Une étape agent amont doit déclarer outputSurface: "workflow" pour créer la page que l'étape aval peut charger. mode: "full" (par défaut) livre un préfixe textuel fidèle et n'est jamais résumé. mode: "summary" condense chaque source trop longue séparément ; en cas d'absence, d'échec, de capacité épuisée ou de délai dépassé du résumé, un extrait local clairement marqué est utilisé. |
retrieval.inputDocMaxChars | Entier positif optionnel (maximum 200 000). Il s'agit d'un maximum par source : plafond du préfixe fidèle en mode full, ou cible de condensation en mode summary. Le budget partagé, adapté à la fenêtre du modèle, compte le bloc rendu exact — titre de section, état de couverture, titres des sources, séparateurs, corps et marqueurs de troncature — ; une source peut donc recevoir moins que ce maximum. Valeur omise → full : 24 000 ; summary : 4 000. Si la fenêtre du modèle est inconnue, l'interface signale une estimation opérationnelle fixe sans affirmer que l'invite entière tient. |
outputSurface | Optionnel. Une sélection ou un tableau. Le kind de chaque sélection est le type d'action cible sur lequel le résultat atterrit, plus la configuration par surface. kind: "workflow" écrit l'évaluation sur l'étape agent elle-même ET comme page plafonnée par habilitation dans la KB d'instance (contentType, pageTitle) : une réponse au format verdict (JSON {verdict, confidence, rationale, …}) rend la mise en page verdict ; toute autre réponse (prose, autres schémas JSON) rend le texte propre de l'agent comme corps de page. kind: "approval" fusionne un conseil d'une ligne sur l'action d'approbation de la tâche nommée par targetTaskSlug (advisorySource étiquette sa provenance). Les autres types d'action sont réservés pour les futures surfaces. Les surfaces ne sont jamais implicites — une étape agent sans outputSurface n'écrit aucune page d'évaluation. |
mode: "summary" entraîne des pertes : ne l'utilisez pas pour une notation
critique de conformité. Pour une évaluation stricte d'appel d'offres, juridique
ou contractuelle, combinez mode: "full" avec le canal de lecture à la demande
(<start.processFlow.knowledgeBaseId> et les outils RAG de connaissance). Le mode
full peut lui aussi être tronqué ou omis par la capacité partagée exacte ; toute
perte est explicitement signalée.
Le panneau Invite & Contexte affiche une ligne pour chaque source connue et stable, y compris les documents homonymes. Il distingue les sources représentées, omises faute de capacité, illisibles et livrées par extrait après échec du résumé ; seules les sources dont du contenu a été livré contribuent aux références de sortie. La préparation est limitée à 500 sources inventoriées, 1 Mo par corps chargé, 8 Mo pour l'ensemble des entrées déclarées, 24 appels de résumé avec une concurrence de 6 et 60 secondes. Si l'inventaire autorisé ne peut pas être achevé dans sa limite de sources ou de temps, la préparation s'arrête avec une erreur générique avant l'exécution du modèle agent. Une fois l'inventaire achevé, l'expiration du délai de résumé utilise le repli local et clairement marqué décrit ci-dessus.
Aujourd'hui workflow (évaluation sur l'étape) et approval (conseil sur une action d'approbation cible) sont les surfaces de sortie implémentées. La spécification retrieval elle-même est générique et fonctionne pour toute étape workflow portant un agent nécessitant un ancrage — les agents intégrés @system/* reçoivent automatiquement le contexte assemblé comme message utilisateur, tandis que les workflows de extension/canvas doivent en plus référencer <start.processFlowContext> dans un bloc pour le recevoir (voir Recevoir le contexte du process flow — sans cette référence, le contexte assemblé est perdu).
Une base de connaissances pour chaque exécution (knowledge.scope)
Par défaut, chaque exécution d'un process flow obtient sa propre base de
connaissances. Définissez knowledge.scope: "template" et chaque exécution de
ce flow dans un environnement d'espace de travail écrit alors dans une seule
base de connaissances partagée :
template: {
// …
knowledge: { scope: "template" },
}- La base partagée est créée lors de la première exécution du flow dans un environnement et apparaît dans la liste des bases de connaissances de l'espace de travail, avec le badge Process flow.
- Chaque exécution possède un dossier,
instances/<date>-<nom de l'exécution>-<id>/, qui contient ses téléversements, documents, transcriptions et résumé de clôture. Les étapes IA lisent le dossier de leur propre exécution ainsi que tout ce qui se trouve en dehors deinstances/— le matériel de référence téléversé à la racine de la base par les membres est donc disponible pour toutes les exécutions. - Les exécutions précédentes déjà terminées servent d'ancrage aux exécutions suivantes via leurs propres dossiers.
- Supprimer une exécution ne supprime que son dossier ; supprimer la base depuis la page de connaissances est autorisé et l'exécution suivante en provisionne une nouvelle.
- Les exécutions démarrées avant que le flow ne déclare
templateconservent leur propre base.
scope: "instance" (la valeur par défaut) conserve le comportement actuel.
Reprendre les exécutions précédentes (knowledge.priorCycles)
Une nouvelle exécution peut s'appuyer sur ce que les exécutions précédentes du même flow ont décidé. Par défaut, elle reprend les cinq exécutions terminées les plus récentes du même environnement d'espace de travail :
- ses étapes IA reçoivent les extraits pertinents de ces exécutions, et
- les conversations partagées de ses étapes reçoivent le résumé de clôture de chaque exécution et peuvent rechercher dans leurs pages ; une question comme « qu'avons-nous décidé la dernière fois ? » reçoit une réponse fondée sur ces exécutions, qui les cite.
Définissez le nombre par flow :
template: {
// …
knowledge: {
scope: "template",
priorCycles: { maxCycles: 3 },
},
}maxCyclesest un entier de0à10;0désactive la reprise.- Omettez
priorCyclespour suivre la valeur par défaut de la plateforme (actuellement 5). - La valeur est figée dans chaque exécution à son démarrage : publier une nouvelle version de l'extension ne modifie pas une exécution en cours.
- Une étape IA peut toujours la remplacer avec
metadata.priorCycles.maxCycles, ou s'en exclure avecexcludeContext: ["priorCycles"]. - Fonctionne avec les deux valeurs de
scope. Les exécutions en cours, les exécutions annulées et les pages classifiées au-dessus de l'habilitation du lecteur ne sont jamais reprises.
Validation du DAG de tâches
Les tâches peuvent déclarer :
dependsOnTaskSlugs— d'autres tâches qui doivent d'abord se terminerunlockAfterTaskSlug+unlockDelay— une porte douce qui s'ouvre N jours/semaines après la fin d'un prédécesseur
Les tâches différées s'ouvrent d'elles-mêmes
Une tâche assortie d'un unlockDelay devient active à l'échéance prévue, que
quelqu'un ouvre le flux ou non. Un balayage de fond s'exécute toutes les heures :
il active chaque tâche dont le délai est écoulé, déclenche ses actions
automatic et notifie l'approbateur lorsque la tâche porte une étape
d'approbation.
C'est déterminant en fin de flux, là où vivent la plupart des tâches différées : un point à J+7 ou une revue à J+30 est en général la dernière tâche de son instance — aucune tâche ultérieure ne peut la déclencher, et personne n'a de raison de rouvrir un flux dont le travail visible est terminé. Comptez au plus une heure après l'échéance.
Le CLI inspect exécute la détection de cycle DFS (BLANC/GRIS/NOIR) et échoue fermement sur tout cycle. Codes d'erreur stables :
| Code | Signification |
|---|---|
task_cycle | Une arête de dépendance participe à un cycle |
unknown_dep_slug | dependsOnTaskSlugs référence un slug de tâche inconnu |
stage_unknown | taskTemplates[].stageSlug ne correspond à aucune étape |
Construire, inspecter, téléverser
bunx @scrydon/sdk-authoring extension validate src/extension.tsbunx @scrydon/sdk-authoring extension build src/extension.ts --outDir dist
# → dist/<package.id>-<package.version>.scrydon-extension.tar.gzbunx @scrydon/sdk-authoring extension inspect dist/acme-kickoff-1.0.0.scrydon-extension.tar.gzConnectez-vous en tant qu'administrateur de l'organisation et ouvrez Paramètres → Plateforme → Extensions → Sources dans l'application plateforme. Cliquez sur Téléverser une extension (ponctuel) et déposez votre .scrydon-extension.tar.gz. Quand l'extension contient un workflow, la boîte de dialogue vous demandera de choisir un environnement d'espace de travail — les définitions de workflow s'installent dans cet environnement. Le contenu ontologie et process-flow s'installe au niveau organisation quel que soit le sélecteur.
Le flux de téléversement de la plateforme est le point d'entrée canonique pour tous les types de contenu de extension depuis l'ADR 2026-05-21 Unified extension upload surface.
Après l'installation de l'extension, un administrateur d'espace de travail ouvre Extensions dans la barre latérale agentic et clique sur Activer sur la ligne Process Flow pour le rendre disponible dans cet environnement. Une fois activé, tout membre de l'espace de travail peut démarrer un nouveau Process Flow à partir de celui-ci. Voir Extensions.
Pour l'automatisation, la route agentic sous-jacente accepte toujours les téléversements. Passez workspaceEnvironmentId uniquement si l'extension contient du contenu workflow ; sinon c'est optionnel.
curl -X POST "$AGENTIC_URL/api/extensions/import?organizationId=$ORG_ID&workspaceEnvironmentId=$ENV_ID" \
-H "Cookie: $SESSION_COOKIE" \
-F "file=@dist/acme-kickoff-1.0.0.scrydon-extension.tar.gz"Structure de l'extension
<extension>.scrydon-extension.tar.gz
├── extension.json # top-level extension manifest (ExtensionArchiveManifestSchema)
├── ontology/
│ └── manifest.json # OntologyManifestSchema — may be empty for flow-only extensions
├── workflow-<slug>/ # optional — zero or more workflow subdirs
│ └── manifest.json # WorkflowManifestSchema
└── process-flow/
├── manifest.json # ProcessFlowManifestSchema
├── assets/ # optional — JSON / image assets referenced by the flow
│ ├── icon.svg
│ └── preview.png
└── meta/ # optional — non-functional metadata (e.g. sbom.cdx.json)Chaque sous-répertoire fait l'aller-retour comme un artefact autonome valide. Extensions d'assets autorisées : .json, .svg, .png, .jpg, .jpeg, .gif, .md. Les liens symboliques, liens durs, chemins absolus et traversées de chemin (..) sont rejetés par l'inspecteur.
Quand une extension contient des workflows, l'importateur les exécute dans leur propre phase avant l'installation du process-flow — de cette façon, chaque workflowSlug sur un modèle d'action se résout en un workflowId matérialisé avant que le process flow atterrisse dans la base de données. Voir Workflows pour le contrat de rebind de slug.
Limites de sécurité
L'inspecteur runtime lit l'archive en mode streaming (analyseur tar.list uniquement — n'extrait jamais sur disque) et applique des limites strictes :
| Limite | Seuil | Code d'échec |
|---|---|---|
| Archive compressée | 5 Mo | archive_too_large |
| Total non compressé | 10 Mo | total_size_exceeded |
| Taille par fichier | 5 Mo | file_too_large |
| Nombre de fichiers | 200 | too_many_files |
| Lien symbolique / lien dur | n/a | symlink_rejected |
| Chemin absolu | n/a | absolute_path_rejected |
| Traversée de chemin | n/a | path_traversal_rejected |
| Répertoire de niveau supérieur non autorisé | n/a | disallowed_path |
| Extension non autorisée | n/a | disallowed_extension |
La route /import retourne 413 pour les violations de taille et 400 pour les violations de structure ou de graphe.
Pourquoi pas de code exécutable
Les process flows sont déclaratifs. La logique personnalisée est référencée — par workflowId (un workflow déjà présent dans le tenant) ou par workflowSlug (un workflow distribué avec le modèle dans le même Extension) — pas bundlée. Même quand un Extension distribue des workflows dans des sous-répertoires workflow-<slug>/, la représentation sur disque est du JSON pur ; le catalogue de blocs runtime réside dans la plateforme. Cela rend la surface déterministe, reproductible et téléversable par des auteurs non-ingénieurs.
Où aller ensuite
Types d'actions
Référence par type — une page par actionType avec des exemples, des champs de métadonnées et l'UX runtime.
Extensions
Après l'installation d'une extension, les administrateurs d'espace de travail activent des Process Flows pour un environnement et déploient des Workflows depuis Extensions.
Exemples
Téléchargez des archives de process-flow prêtes à l'emploi — Revue trimestrielle ISO, Revue annuelle ISO.
Ontologies
Les process flows produisent des instances typées contre l'ontologie — créez d'abord le système de types.
Workflows
Distribuez des actions actionType: workflow et les workflows qu'elles référencent dans le même Extension via workflowSlug.
Intégrations
Les workflows référencés par actionType: workflow sont construits à partir de blocs — dont beaucoup proviennent d'intégrations.