Scrydon

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 zod
import {
  defineProcessFlow,
  defineStage,
  defineTask,
  defineAction,
  definePersona,
  defineVoiceTrigger,
} from '@scrydon/sdk-authoring/process-flows'

Anatomie d'un modèle

ÉlémentRôle
PackageIdentité de l'archive : id, name, version
TemplateLe flow lui-même — vue par défaut, configuration d'exécution, métadonnées
PersonaRôles auxquels une tâche peut être assignée (one, many ou system)
StageUne 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 TemplateCe que la tâche demande à l'utilisateur de faire — checklist, document, approval, workflow, entity_link, file_upload, distribution, voice_trigger
Voice TriggerBloc 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'actionUtiliser pour
checklistUne tâche simple que l'utilisateur marque comme terminée
documentUn document que l'utilisateur doit produire ou joindre
approvalUne porte d'approbation — assignée à un persona, bloque les tâches en aval jusqu'à l'accord
workflowRé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_linkLier la tâche à une instance d'objet typé via l'ontologie
file_uploadUn dépôt de fichier — les octets sont ingérés dans la KB de l'instance
distributionEnvoyer vers un canal (email, slack, teams) ; supporte le quorum, fire-and-forget, all-acknowledged
voice_triggerCapturer 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,
    },
  },
})
ChampSignification
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.inputDocMaxCharsEntier 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.
outputSurfaceOptionnel. 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 de instances/ — 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 template conservent 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 },
  },
}
  • maxCycles est un entier de 0 à 10 ; 0 désactive la reprise.
  • Omettez priorCycles pour 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 avec excludeContext: ["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 terminer
  • unlockAfterTaskSlug + 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 :

CodeSignification
task_cycleUne arête de dépendance participe à un cycle
unknown_dep_slugdependsOnTaskSlugs référence un slug de tâche inconnu
stage_unknowntaskTemplates[].stageSlug ne correspond à aucune étape

Construire, inspecter, téléverser

bunx @scrydon/sdk-authoring extension validate src/extension.ts
bunx @scrydon/sdk-authoring extension build src/extension.ts --outDir dist
# → dist/<package.id>-<package.version>.scrydon-extension.tar.gz
bunx @scrydon/sdk-authoring extension inspect dist/acme-kickoff-1.0.0.scrydon-extension.tar.gz

Connectez-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 :

LimiteSeuilCode d'échec
Archive compressée5 Moarchive_too_large
Total non compressé10 Mototal_size_exceeded
Taille par fichier5 Mofile_too_large
Nombre de fichiers200too_many_files
Lien symbolique / lien durn/asymlink_rejected
Chemin absolun/aabsolute_path_rejected
Traversée de cheminn/apath_traversal_rejected
Répertoire de niveau supérieur non autorisén/adisallowed_path
Extension non autoriséen/adisallowed_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

Sur cette page

Sur cette page