UIAP Workflow Extension
UIAP Workflow Extension v0.1
Abschnitt betitelt „UIAP Workflow Extension v0.1“| Feld | Wert |
|---|---|
| Status | Draft |
| Version | 0.1 |
| Datum | 2026-03-27 |
| Abhängigkeiten | [UIAP-CORE], [UIAP-CAP], [UIAP-WEB], [UIAP-ACTION], [UIAP-POLICY] |
| Editoren | Patrick |
Die Schlüsselwörter MUSS, DARF NICHT, SOLLTE, KANN in diesem Dokument sind normativ gemäss RFC 2119 und BCP 14 zu interpretieren, wenn und nur wenn sie in GROSSBUCHSTABEN erscheinen.
1. Zweck und Geltungsbereich
Abschnitt betitelt „1. Zweck und Geltungsbereich“UIAP Workflow Extension v0.1 definiert, wie eine Anwendung oder ein UIAP-kompatibler Agent mehrschrittige, semantische Abläufe beschreibt, startet, ausführt, pausiert, fortsetzt und beendet.
Die Extension ist für Dinge wie:
- Onboarding-Flows
- Guided Setup
- wiederkehrende Produktaufgaben
- Support-/Recovery-Abläufe
- Mischformen aus Erklären, Zeigen, Eingeben und Hand-off
Sie baut auf diesen Teilen auf:
- UIAP Core v0.1
- UIAP Capability Model v0.1
- UIAP Web Profile v0.1
- UIAP Action Runtime Spec v0.1
- UIAP Policy Extension v0.1
Die Workflow Extension definiert nicht:
- wie DOM oder UI technisch gelesen werden
- wie Actions technisch ausgeführt werden
- wie Policy intern implementiert ist
- wie ein LLM plant oder formuliert
Sie definiert den Vertrag für strukturierte Abläufe, nicht das Gehirn und nicht die Browsermechanik.
2. Kennung und Aushandlung
Abschnitt betitelt „2. Kennung und Aushandlung“type ExtensionId = "uiap.workflow";type ExtensionVersion = "0.1";Eine Gegenstelle, die diese Extension anbietet, MUSS sie im Handshake deklarieren.
Beispiel:
{ "id": "uiap.workflow", "versions": ["0.1"], "required": false}3. Grundprinzipien
Abschnitt betitelt „3. Grundprinzipien“- Ein Workflow MUSS als strukturierte, maschinenlesbare Definition vorliegen.
- Ein Workflow MUSS aus klaren Schritten bestehen.
- Ein Workflow DARF Actions nicht direkt „magisch“ ausführen, sondern MUSS dafür die Action Runtime verwenden.
- Ein Workflow MUSS Inputs, Bedingungen, Erfolgsdefinition und Recovery explizit modellieren.
- Ein Workflow MUSS pausierbar und fortsetzbar sein.
- Ein Workflow SOLLTE gegen UI-Drift robust sein, also nicht nur auf rohe Klickfolgen setzen.
- Ein Workflow DARF deklarativ sein, aber nicht beliebig. Sonst hat man am Ende eine Programmiersprache und nennt es aus Höflichkeit „Extension“.
4. Kernbegriffe
Abschnitt betitelt „4. Kernbegriffe“4.1 Workflow
Abschnitt betitelt „4.1 Workflow“Ein Workflow ist eine versionierte Definition eines fachlichen oder UX-seitigen Ablaufs.
Beispiele:
workspace.initial_setupvideo.create_first_videoteam.invite_memberbilling.connect_payment_method
4.2 Workflow Instance
Abschnitt betitelt „4.2 Workflow Instance“Eine Workflow Instance ist eine laufende oder pausierte Ausführung eines Workflows.
4.3 Step
Abschnitt betitelt „4.3 Step“Ein Step ist ein einzelner ausführbarer oder prüfbarer Teil eines Workflows.
4.4 Input
Abschnitt betitelt „4.4 Input“Ein Input ist ein benötigter Parameter, der von User, App, Kontext oder Ableitung kommen kann.
4.5 Checkpoint
Abschnitt betitelt „4.5 Checkpoint“Ein Checkpoint ist ein deklarierter Wiederaufsetzpunkt.
4.6 Interaction Mode
Abschnitt betitelt „4.6 Interaction Mode“Der Interaction Mode beschreibt, wie aktiv der Workflow handeln darf.
type WorkflowInteractionMode = | "explain" // nur erklären | "guide" // zeigen, highlighten, navigieren, aber nicht schreiben | "assist" // sichere Eingaben / Entwürfe / reversible Schritte | "auto"; // alle erlaubten Actions gemäß Policy4.7 Start Mode
Abschnitt betitelt „4.7 Start Mode“Der Start Mode beschreibt, wie ein Workflow initiiert wird.
type WorkflowStartMode = | "manual" // explizit vom Nutzer gestartet | "suggested" // vorgeschlagen, aber nicht automatisch gestartet | "automatic"; // darf automatisch starten, sofern Policy es erlaubt5. Workflow-Zustände
Abschnitt betitelt „5. Workflow-Zustände“type WorkflowStatus = | "validating" | "running" | "waiting_input" | "waiting_confirmation" | "waiting_user" | "paused" | "succeeded" | "failed" | "cancelled";Zustandsregeln
Abschnitt betitelt „Zustandsregeln“validating: Definition, Applicability, Inputs und Policy werden geprüft.running: Workflow arbeitet aktiv Schritte ab.waiting_input: Benötigte Werte fehlen.waiting_confirmation: Bestätigung ist nötig.waiting_user: Human Handoff oder User-Aktion erforderlich.paused: bewusst unterbrochen, später fortsetzbar.succeeded: erfolgreich abgeschlossen.failed: beendet mit Fehler.cancelled: durch Nutzer, Policy oder System beendet.
6. Datenmodell
Abschnitt betitelt „6. Datenmodell“6.1 Workflow Catalog
Abschnitt betitelt „6.1 Workflow Catalog“interface WorkflowCatalog { modelVersion: "0.1"; extension: "uiap.workflow"; revision?: string; workflows: WorkflowDefinition[]; metadata?: Record<string, unknown>;}6.2 Workflow Definition
Abschnitt betitelt „6.2 Workflow Definition“interface WorkflowDefinition { id: string; version: string;
title: LocalizedText; description?: LocalizedText; category?: WorkflowCategory;
startMode?: WorkflowStartMode; interactionModes: WorkflowInteractionMode[];
intents?: WorkflowIntent[]; triggers?: WorkflowTrigger[]; applicability?: WorkflowApplicability;
inputs?: WorkflowParameter[]; outputs?: WorkflowOutput[];
requiredGrants?: PolicyGrant[];
initialStepId: string; steps: WorkflowStep[];
success?: WorkflowSuccessCriteria; failure?: WorkflowFailurePolicy;
metadata?: Record<string, unknown>;}type WorkflowCategory = | "onboarding" | "setup" | "task" | "support" | "education" | "recovery" | "custom";type LocalizedText = | string | { default: string; byLocale?: Record<string, string>; };idMUSS innerhalb eines Katalogs eindeutig sein.versionMUSS für semantische Änderungen erhöht werden.initialStepIdMUSS auf einen vorhandenen Step zeigen.- Jeder Workflow MUSS mindestens einen terminalen
complete- oderhandoff-/failed-Pfad haben. - Zyklische Abläufe SIND NUR zulässig, wenn sie explizit begrenzt sind, etwa über Retry-Limits.
6.3 Intent Model
Abschnitt betitelt „6.3 Intent Model“interface WorkflowIntent { phrases: string[]; locale?: string; weight?: number; // default 1.0}Intents dienen dem Matching von Nutzerabsichten auf Workflows.
Beispiele:
{ "phrases": [ "hilf mir beim ersten video", "erstes video anlegen", "video erstellen" ], "locale": "de-CH", "weight": 1.0}6.4 Trigger Model
Abschnitt betitelt „6.4 Trigger Model“type WorkflowTrigger = | { kind: "intent"; intents?: string[]; } | { kind: "route.entered"; routeIds: string[]; } | { kind: "first_run"; feature?: string; } | { kind: "signal"; signalKinds: string[]; } | { kind: "custom"; name: string; payload?: Record<string, unknown>; };- Trigger beschreiben wann ein Workflow vorgeschlagen oder gestartet werden kann.
- Ein Trigger allein DARF keinen Start erzwingen, wenn Policy oder Applicability entgegenstehen.
6.5 Applicability
Abschnitt betitelt „6.5 Applicability“interface WorkflowApplicability { routeIds?: string[]; scopeIds?: ScopeId[]; principalRoles?: string[]; requiredGrants?: PolicyGrant[]; requiredActions?: ActionId[]; conditions?: WorkflowCondition[];}- Ein Workflow ist nur applicable, wenn alle gesetzten Applicability-Bedingungen erfüllt sind.
requiredActionsMUSS gegen das Capability Model geprüft werden.requiredGrantsMUSS gegen die aktuelle Policy-/Principal-Lage geprüft werden.
6.6 Parameter / Inputs
Abschnitt betitelt „6.6 Parameter / Inputs“interface WorkflowParameter { name: string; title?: LocalizedText; description?: LocalizedText;
type: WorkflowValueType; required?: boolean;
meaning?: string; sensitive?: boolean;
sourceOrder?: WorkflowValueSource[]; default?: WorkflowValueExpr;
validation?: ParameterValidation[]; prompt?: LocalizedText;
bindTo?: ParameterBinding;}type WorkflowValueType = | "string" | "number" | "boolean" | "enum" | "object" | "array";type WorkflowValueSource = | "provided" | "context" | "route" | "derive" | "suggest" | "user";interface ParameterBinding { stableIds?: StableId[]; actionArg?: string;}interface ParameterValidation { kind: "required" | "minLength" | "maxLength" | "pattern" | "enum" | "custom"; value?: unknown; message?: LocalizedText;}sourceOrderdefiniert die Reihenfolge, in der Werte beschafft werden.providedmeint Werte ausworkflow.start.inputs.contextmeint Werte aus Session-, Route- oder App-Kontext.derivemeint maschinenlesbare Ableitung aus aktuellem UI-/State-Kontext.suggestmeint vom Agenten oder Template erzeugte Vorschläge.usermeint explizit vom Nutzer gelieferte Werte.- Sensitive Inputs SOLLTEN automatisch mit Policy- und Redaction-Regeln verknüpft werden.
6.7 Outputs
Abschnitt betitelt „6.7 Outputs“interface WorkflowOutput { name: string; type: WorkflowValueType; from: WorkflowValueExpr;}6.8 Value Expressions
Abschnitt betitelt „6.8 Value Expressions“type WorkflowValueExpr = | { from: "literal"; value: unknown } | { from: "param"; name: string } | { from: "route"; path: string } | { from: "context"; path: string } | { from: "actionResult"; stepId: string; path?: string } | { from: "signal"; stepId?: string; kind?: string; path?: string };Diese Ausdrücke werden für Action-Argumente, Defaults und Outputs verwendet.
7. Step Model
Abschnitt betitelt „7. Step Model“7.1 Gemeinsame Step-Basis
Abschnitt betitelt „7.1 Gemeinsame Step-Basis“interface WorkflowStepBase { id: string; type: WorkflowStepType;
title?: LocalizedText; if?: WorkflowCondition[];
timeoutMs?: number; checkpoint?: boolean;
next?: string; onError?: WorkflowRecoveryRule[];
metadata?: Record<string, unknown>;}type WorkflowStepType = | "instruction" | "collect" | "suggest" | "action" | "ensure" | "branch" | "handoff" | "complete";idMUSS innerhalb eines Workflows eindeutig sein.- Wenn
ifgesetzt ist und nicht erfüllt wird, gilt der Step als skipped und der Flow geht zunextoder zum lexikalisch nächsten Step. checkpoint=truemarkiert einen potenziellen Resume-Punkt.onErrordefiniert step-lokale Recovery.
7.2 Instruction Step
Abschnitt betitelt „7.2 Instruction Step“interface InstructionStep extends WorkflowStepBase { type: "instruction"; text: LocalizedText; presentation?: PresentationHints;}Semantik
Abschnitt betitelt „Semantik“- Reine Erklärung oder Einordnung.
- Darf Overlay-/Narration-Hinweise enthalten.
- Verändert keinen fachlichen Zustand.
7.3 Collect Step
Abschnitt betitelt „7.3 Collect Step“interface CollectStep extends WorkflowStepBase { type: "collect"; parameters: string[]; prompt?: LocalizedText; allowPartial?: boolean; autoAcceptIfResolved?: boolean;}Semantik
Abschnitt betitelt „Semantik“- Beschafft fehlende Parameter.
- Prüft zuerst
sourceOrder. - Falls danach noch Werte fehlen, geht der Workflow in
waiting_inputund sendetuiap.workflow.input.request.
7.4 Suggest Step
Abschnitt betitelt „7.4 Suggest Step“interface SuggestStep extends WorkflowStepBase { type: "suggest"; parameter: string; source: "agent" | "template" | "app"; template?: string; confirm?: "always" | "if_changed" | "never";}Semantik
Abschnitt betitelt „Semantik“- Erzeugt einen Vorschlagswert für genau einen Parameter.
- Die konkrete Generierung ist Implementierungssache.
confirm="always"verlangt explizite Übernahme des Vorschlags.confirm="never"ist nur für nicht-sensitive, reversible oder klar unkritische Fälle zu empfehlen.
7.5 Action Step
Abschnitt betitelt „7.5 Action Step“interface WorkflowActionStep extends WorkflowStepBase { type: "action"; actionId: ActionId;
target?: ActionTarget; args?: Record<string, WorkflowValueExpr>;
preferredExecutionModes?: ExecutionMode[]; verification?: VerificationSpec; presentation?: PresentationHints;
saveResultAs?: string;}Semantik
Abschnitt betitelt „Semantik“- Delegiert an die UIAP Action Runtime.
- Policy MUSS vor Ausführung geprüft werden.
saveResultAsspeichert strukturierte Rückgabedaten für spätere Steps.
7.6 Ensure Step
Abschnitt betitelt „7.6 Ensure Step“interface EnsureStep extends WorkflowStepBase { type: "ensure"; conditions: WorkflowCondition[]; policy?: "all" | "any"; waitFor?: boolean; pollMs?: number;}Semantik
Abschnitt betitelt „Semantik“-
Prüft Bedingungen.
-
Wenn
waitFor=true, DARF auf Eintreten der Bedingungen gewartet werden. -
Typische Verwendungen:
- „Dialog ist offen“
- „Route ist gewechselt“
- „Toast wurde gezeigt“
- „Feld ist nicht mehr invalid“
7.7 Branch Step
Abschnitt betitelt „7.7 Branch Step“interface BranchStep extends WorkflowStepBase { type: "branch"; branches: Array<{ when: WorkflowCondition[]; next: string; }>; otherwise?: string;}Semantik
Abschnitt betitelt „Semantik“- Prüft Branches in deklarierter Reihenfolge.
- Der erste passende Branch gewinnt.
- Wenn kein Branch passt, wird
otherwisegenutzt. - Fehlt
otherwise, MUSS der Workflow fehlschlagen.
7.8 Handoff Step
Abschnitt betitelt „7.8 Handoff Step“interface HandoffStep extends WorkflowStepBase { type: "handoff"; reason: LocalizedText; message?: LocalizedText; resumeWhen?: WorkflowCondition[];}Semantik
Abschnitt betitelt „Semantik“- Erzwingt Nutzerübernahme oder externen Eingriff.
- Der Workflow wechselt in
waiting_user. - Fortsetzung erfolgt über
workflow.resume,workflow.input.provideoder durch erfüllteresumeWhen-Bedingungen.
Typische Fälle:
- Login / Re-Auth
- CAPTCHA
- Zahlungsfreigabe
- juristische Bestätigung
- Browser- oder Plattformgrenzen
7.9 Complete Step
Abschnitt betitelt „7.9 Complete Step“interface CompleteStep extends WorkflowStepBase { type: "complete"; summary?: LocalizedText; outputs?: Record<string, WorkflowValueExpr>;}Semantik
Abschnitt betitelt „Semantik“- Finalisiert den Workflow.
- Setzt Status auf
succeeded, sofern keine globalen Success-Regeln verletzt sind. - Liefert Outputwerte zurück.
8. Conditions
Abschnitt betitelt „8. Conditions“type WorkflowCondition = | { kind: "param.present"; name: string } | { kind: "param.equals"; name: string; value: unknown } | { kind: "route.is"; routeId: string } | { kind: "scope.present"; scopeId: ScopeId } | { kind: "element.present"; target: TargetRef } | { kind: "element.state"; target: TargetRef; state: Partial<UIState> } | { kind: "signal.observed"; signal: SuccessSignal } | { kind: "action.status"; stepId: string; status: "succeeded" | "failed" | "cancelled" } | { kind: "policy.effect"; effect: PolicyEffect } | { kind: "custom"; name: string; args?: Record<string, unknown> };- Conditions MÜSSEN deterministisch auswertbar sein.
customist erlaubt, aber nur für Implementierungen, die es kennen.- Unbekannte
custom-Conditions DÜRFEN nicht stillschweigend als wahr gelten.
9. Erfolgs- und Fehlermodell
Abschnitt betitelt „9. Erfolgs- und Fehlermodell“9.1 Workflow Success Criteria
Abschnitt betitelt „9.1 Workflow Success Criteria“interface WorkflowSuccessCriteria { policy?: "all" | "any"; conditions?: WorkflowCondition[]; signals?: SuccessSignal[];}Semantik
Abschnitt betitelt „Semantik“Ein Workflow ist erfolgreich, wenn:
- ein
complete-Step erreicht wurde, und - globale Success-Kriterien erfüllt sind, sofern definiert.
9.2 Workflow Failure Policy
Abschnitt betitelt „9.2 Workflow Failure Policy“interface WorkflowFailurePolicy { onUnhandledError: "fail" | "handoff" | "cancel"; maxWorkflowRetries?: number; resumable?: boolean;}9.3 Recovery Rules
Abschnitt betitelt „9.3 Recovery Rules“interface WorkflowRecoveryRule { on: WorkflowFailureMatcher; strategy: "retry_step" | "goto_step" | "handoff" | "cancel" | "fail"; gotoStepId?: string; maxAttempts?: number; note?: LocalizedText;}interface WorkflowFailureMatcher { runtimeCodes?: string[]; verificationFailed?: boolean; timeout?: boolean; policyEffects?: PolicyEffect[]; statuses?: Array<"failed" | "cancelled">;}- Recovery wird step-lokal vor globaler Failure Policy ausgewertet.
- Nicht-idempotente Actions DÜRFEN NICHT blind per
retry_stepwiederholt werden, wennsideEffectState="unknown"war. goto_stepMUSS auf einen vorhandenen Step zeigen.maxAttemptsbegrenzt lokale Wiederholungen.
10. Workflow Instance Model
Abschnitt betitelt „10. Workflow Instance Model“interface WorkflowInstance { instanceId: string; workflowId: string; workflowVersion: string;
status: WorkflowStatus; mode: WorkflowInteractionMode;
currentStepId?: string; completedStepIds: string[];
inputs: Record<string, unknown>; outputs?: Record<string, unknown>;
checkpoint?: WorkflowCheckpoint; history?: WorkflowHistoryEntry[];
metadata?: Record<string, unknown>;}interface WorkflowCheckpoint { checkpointId: string; stepId: string; createdAt: string;}interface WorkflowHistoryEntry { stepId: string; status: "started" | "skipped" | "succeeded" | "failed" | "cancelled"; startedAt?: string; finishedAt?: string; note?: string;}11. Nachrichtentypen
Abschnitt betitelt „11. Nachrichtentypen“11.1 uiap.workflow.get
Abschnitt betitelt „11.1 uiap.workflow.get“Request
Abschnitt betitelt „Request“interface WorkflowGetPayload { category?: WorkflowCategory; ids?: string[];}Response: uiap.workflow.document
Abschnitt betitelt „Response: uiap.workflow.document“interface WorkflowDocumentPayload { catalog: WorkflowCatalog;}11.2 uiap.workflow.match
Abschnitt betitelt „11.2 uiap.workflow.match“Dient zum Matching von Nutzerintention und aktuellem Kontext auf Workflow-Kandidaten.
Request
Abschnitt betitelt „Request“interface WorkflowMatchPayload { intent?: string; routeId?: string; mode?: WorkflowInteractionMode; maxResults?: number;}Response: uiap.workflow.matches
Abschnitt betitelt „Response: uiap.workflow.matches“interface WorkflowMatchCandidate { workflowId: string; score: number; reason?: string; missingInputs?: string[]; blockedByPolicy?: boolean;}interface WorkflowMatchesPayload { candidates: WorkflowMatchCandidate[];}scoreSOLLTE zwischen0und1liegen.blockedByPolicy=truebedeutet: fachlich passend, aber derzeit nicht startbar.
11.3 uiap.workflow.start
Abschnitt betitelt „11.3 uiap.workflow.start“Request
Abschnitt betitelt „Request“interface WorkflowStartPayload { workflowId: string; mode?: WorkflowInteractionMode; inputs?: Record<string, unknown>; resumeFromCheckpointId?: string;}Response: uiap.workflow.started
Abschnitt betitelt „Response: uiap.workflow.started“interface WorkflowStartedPayload { instance: WorkflowInstance;}- Der Workflow MUSS existieren.
- Applicability MUSS erfüllt sein.
modeMUSS im Workflow erlaubt sein.- Policy DARF Start verhindern oder auf
confirm/handoffsetzen.
11.4 uiap.workflow.progress
Abschnitt betitelt „11.4 uiap.workflow.progress“interface WorkflowProgressPayload { instanceId: string; workflowId: string; status: WorkflowStatus;
currentStepId?: string; currentStepType?: WorkflowStepType;
completedStepIds?: string[]; missingInputs?: string[];
note?: string; checkpointId?: string;}- Progress SOLLTE bei jedem Statuswechsel und jedem Stepwechsel emittiert werden.
11.5 uiap.workflow.input.request
Abschnitt betitelt „11.5 uiap.workflow.input.request“interface WorkflowInputRequestPayload { instanceId: string; parameters: WorkflowParameter[]; prompt?: LocalizedText;}11.6 uiap.workflow.input.provide
Abschnitt betitelt „11.6 uiap.workflow.input.provide“Request
Abschnitt betitelt „Request“interface WorkflowInputProvidePayload { instanceId: string; values: Record<string, unknown>;}Response: uiap.workflow.input.accepted
Abschnitt betitelt „Response: uiap.workflow.input.accepted“interface WorkflowInputAcceptedPayload { instanceId: string; accepted: string[]; rejected?: Array<{ name: string; reason: string; }>;}11.7 uiap.workflow.pause
Abschnitt betitelt „11.7 uiap.workflow.pause“Request
Abschnitt betitelt „Request“interface WorkflowPausePayload { instanceId: string; reason?: string;}Response: uiap.workflow.paused
Abschnitt betitelt „Response: uiap.workflow.paused“interface WorkflowPausedPayload { instanceId: string; status: "paused";}11.8 uiap.workflow.resume
Abschnitt betitelt „11.8 uiap.workflow.resume“Request
Abschnitt betitelt „Request“interface WorkflowResumePayload { instanceId: string;}Response: uiap.workflow.resumed
Abschnitt betitelt „Response: uiap.workflow.resumed“interface WorkflowResumedPayload { instanceId: string; status: "running"; currentStepId?: string;}11.9 uiap.workflow.cancel
Abschnitt betitelt „11.9 uiap.workflow.cancel“Request
Abschnitt betitelt „Request“interface WorkflowCancelPayload { instanceId: string; reason?: string;}Response: uiap.workflow.cancelled
Abschnitt betitelt „Response: uiap.workflow.cancelled“interface WorkflowCancelledPayload { instanceId: string; status: "cancelled";}11.10 uiap.workflow.result
Abschnitt betitelt „11.10 uiap.workflow.result“interface WorkflowResultPayload { instanceId: string; workflowId: string; status: "succeeded" | "failed" | "cancelled";
outputs?: Record<string, unknown>; finalStepId?: string;
error?: { code: string; message: string; };
summary?: LocalizedText;}11.11 uiap.workflow.changed
Abschnitt betitelt „11.11 uiap.workflow.changed“interface WorkflowChangedPayload { revision: string; catalog: WorkflowCatalog;}12. Ausführungssemantik
Abschnitt betitelt „12. Ausführungssemantik“12.1 Startphase
Abschnitt betitelt „12.1 Startphase“Beim Start MUSS der Executor:
- Workflow finden
- Applicability prüfen
- Interaction Mode prüfen
- initiale Inputs übernehmen
- Inputs gegen Schema validieren
- Start-Policy prüfen
- Instance erzeugen
- bei Erfolg
uiap.workflow.startedsenden
Wenn ein Schritt davon scheitert, MUSS der Start mit Fehler enden.
12.2 Step-Reihenfolge
Abschnitt betitelt „12.2 Step-Reihenfolge“Die Abarbeitung beginnt bei initialStepId.
Für jeden Step gilt:
ifprüfen- Falls
if=false: Step überspringen - Step ausführen
- Erfolg, Fehler oder Handoff behandeln
- Nächsten Step bestimmen
Wenn next gesetzt ist, MUSS es verwendet werden.
Wenn next fehlt, SOLLTE der lexikalisch nächste Step im Workflow verwendet werden.
branch bestimmt den nächsten Step selbst.
complete beendet den Workflow.
12.3 Step-spezifische Semantik
Abschnitt betitelt „12.3 Step-spezifische Semantik“Instruction
Abschnitt betitelt „Instruction“- erzeugt höchstens Erklärung/Präsentation
- geht direkt weiter
Collect
Abschnitt betitelt „Collect“- löst fehlende Inputs auf
- geht bei fehlenden Pflichtwerten in
waiting_input
Suggest
Abschnitt betitelt „Suggest“- berechnet Vorschlag
- bestätigt oder übernimmt je nach
confirm
- delegiert an
action.request - spiegelt Action-Runtime-Status im Workflow-Status
- übernimmt Resultat in History und optional in
saveResultAs
- evaluiert Bedingungen
- wartet optional
- scheitert bei Timeout oder Nichterfüllung
- bestimmt Pfad
- wenn nichts passt und
otherwisefehlt: Fehler
Handoff
Abschnitt betitelt „Handoff“- setzt
waiting_user - Fortsetzung nur nach Resume oder erfüllten Bedingungen
Complete
Abschnitt betitelt „Complete“- finalisiert Outputs
- prüft globale Success-Kriterien
- sendet
workflow.result
12.4 Policy-Integration
Abschnitt betitelt „12.4 Policy-Integration“Vor jeder action-Ausführung MUSS Policy evaluiert werden.
Regeln:
allow→ Step darf weiterlaufenconfirm→ Workflow MUSS inwaiting_confirmationgehendeny→ Step schlägt fehlhandoff→ Workflow MUSS inwaiting_usergehen
Ein Workflow DARF außerdem eine strengere eigene Interaktionslogik haben als die aktuelle Policy, aber nie eine lockerere.
Beispiel:
Ein Workflow im Modus guide DARF trotz allow keine schreibenden Actions ausführen.
12.5 Checkpoints und Resume
Abschnitt betitelt „12.5 Checkpoints und Resume“Wenn ein Step checkpoint=true hat, SOLLTE nach erfolgreichem Abschluss ein Checkpoint erzeugt werden.
Ein Resume MUSS:
- den letzten gültigen Checkpoint laden oder
- den angegebenen
resumeFromCheckpointIdverwenden
Ein Resume DARF nicht vor einen nicht abgeschlossenen, potenziell nicht-idempotenten Side-Effect zurückspringen, ohne dass die Implementierung dessen Zustand sicher kennt. Menschen nennen so etwas sonst später „Datenproblem“.
13. Minimaler Konformitätsumfang
Abschnitt betitelt „13. Minimaler Konformitätsumfang“Eine konforme [email protected]-Implementierung MUSS:
uiap.workflow.getuiap.workflow.startuiap.workflow.progressuiap.workflow.input.requestuiap.workflow.input.provideuiap.workflow.pauseuiap.workflow.resumeuiap.workflow.canceluiap.workflow.result
unterstützen.
Sie MUSS außerdem mindestens diese Step-Typen unterstützen:
instructioncollectactionbranchhandoffcomplete
Sie SOLLTE zusätzlich unterstützen:
ensuresuggest
14. Referenzbeispiel
Abschnitt betitelt „14. Referenzbeispiel“14.1 Workflow Definition
Abschnitt betitelt „14.1 Workflow Definition“{ "id": "video.create_first_video", "version": "0.1.0", "title": { "default": "Erstes Video erstellen", "byLocale": { "de-CH": "Erstes Video erstellen" } }, "description": "Führt den Nutzer durch das Anlegen des ersten Videos.", "category": "onboarding", "startMode": "suggested", "interactionModes": ["guide", "assist", "auto"], "intents": [ { "phrases": [ "hilf mir beim ersten video", "erstes video erstellen", "video anlegen" ], "locale": "de-CH", "weight": 1 } ], "applicability": { "routeIds": ["dashboard", "videos", "videos.new"], "requiredActions": [ "nav.navigate", "ui.enterText", "ui.activate", "video.create" ] }, "inputs": [ { "name": "title", "title": "Videotitel", "type": "string", "required": true, "meaning": "title", "sourceOrder": ["provided", "user"], "prompt": "Wie soll dein erstes Video heissen?" }, { "name": "useCase", "title": "Anwendungszweck", "type": "string", "required": false, "meaning": "use_case", "sourceOrder": ["provided", "suggest", "user"], "prompt": "Wofür soll das Video verwendet werden?" } ], "outputs": [ { "name": "videoId", "type": "string", "from": { "from": "actionResult", "stepId": "create_video", "path": "id" } } ], "initialStepId": "intro", "steps": [ { "id": "intro", "type": "instruction", "text": "Ich helfe dir, dein erstes Video anzulegen.", "next": "collect_title" }, { "id": "collect_title", "type": "collect", "parameters": ["title"], "next": "suggest_use_case" }, { "id": "suggest_use_case", "type": "suggest", "parameter": "useCase", "source": "agent", "confirm": "if_changed", "next": "go_to_form" }, { "id": "go_to_form", "type": "action", "actionId": "nav.navigate", "args": { "routeId": { "from": "literal", "value": "videos.new" } }, "checkpoint": true, "next": "fill_title" }, { "id": "fill_title", "type": "action", "actionId": "ui.enterText", "target": { "ref": { "by": "stableId", "value": "video.title" } }, "args": { "text": { "from": "param", "name": "title" } }, "next": "branch_use_case" }, { "id": "branch_use_case", "type": "branch", "branches": [ { "when": [ { "kind": "param.present", "name": "useCase" } ], "next": "fill_use_case" } ], "otherwise": "create_video" }, { "id": "fill_use_case", "type": "action", "actionId": "ui.enterText", "target": { "ref": { "by": "stableId", "value": "video.use_case" } }, "args": { "text": { "from": "param", "name": "useCase" } }, "next": "create_video" }, { "id": "create_video", "type": "action", "actionId": "video.create", "target": { "ref": { "by": "stableId", "value": "video.submit" } }, "verification": { "policy": "all", "signals": [ { "kind": "route.changed", "pattern": "/videos/:id" }, { "kind": "toast.contains", "text": "erstellt" } ], "timeoutMs": 10000, "requireRevisionAdvance": true }, "checkpoint": true, "saveResultAs": "create_video_result", "onError": [ { "on": { "policyEffects": ["handoff"] }, "strategy": "handoff", "note": "Bitte übernimm den Bestätigungsschritt selbst." }, { "on": { "runtimeCodes": ["verification_failed"] }, "strategy": "goto_step", "gotoStepId": "verify_result" } ], "next": "verify_result" }, { "id": "verify_result", "type": "ensure", "conditions": [ { "kind": "signal.observed", "signal": { "kind": "route.changed", "pattern": "/videos/:id" } } ], "policy": "all", "waitFor": true, "timeoutMs": 4000, "next": "done" }, { "id": "done", "type": "complete", "summary": "Dein erstes Video wurde angelegt.", "outputs": { "videoId": { "from": "actionResult", "stepId": "create_video", "path": "id" } } } ], "success": { "policy": "all", "signals": [ { "kind": "route.changed", "pattern": "/videos/:id" } ] }, "failure": { "onUnhandledError": "handoff", "maxWorkflowRetries": 0, "resumable": true }}14.2 Beispielhafter Start
Abschnitt betitelt „14.2 Beispielhafter Start“{ "uiap": "0.1", "kind": "request", "type": "uiap.workflow.start", "id": "msg_301", "sessionId": "sess_123", "ts": "2026-03-26T15:10:00.000Z", "source": { "role": "agent", "id": "onboarding-agent" }, "payload": { "workflowId": "video.create_first_video", "mode": "assist", "inputs": { "title": "Produktdemo für Kunde A" } }}14.3 Beispielhafter Progress
Abschnitt betitelt „14.3 Beispielhafter Progress“{ "uiap": "0.1", "kind": "event", "type": "uiap.workflow.progress", "id": "msg_302", "sessionId": "sess_123", "ts": "2026-03-26T15:10:01.200Z", "source": { "role": "bridge", "id": "web-runtime" }, "payload": { "instanceId": "wf_991", "workflowId": "video.create_first_video", "status": "running", "currentStepId": "fill_title", "currentStepType": "action", "completedStepIds": ["intro", "collect_title", "suggest_use_case", "go_to_form"], "checkpointId": "cp_2" }}14.4 Beispielhafter Abschluss
Abschnitt betitelt „14.4 Beispielhafter Abschluss“{ "uiap": "0.1", "kind": "event", "type": "uiap.workflow.result", "id": "msg_303", "sessionId": "sess_123", "ts": "2026-03-26T15:10:08.900Z", "source": { "role": "bridge", "id": "web-runtime" }, "payload": { "instanceId": "wf_991", "workflowId": "video.create_first_video", "status": "succeeded", "outputs": { "videoId": "vid_12345" }, "finalStepId": "done", "summary": "Dein erstes Video wurde angelegt." }}15. Empfohlene Implementierungsregeln
Abschnitt betitelt „15. Empfohlene Implementierungsregeln“Damit das in echten Produkten nicht nach der dritten UI-Änderung stirbt, würde ich diese Regeln als quasi-verbindlich behandeln:
-
Workflows zuerst deklarativ, nicht promptbasiert Prompts dürfen Formulierungen liefern, aber nicht die einzige Wahrheit über Ablauf und Erfolg sein.
-
Action Steps nur über Runtime Kein Workflow-Step darf die UI direkt „irgendwie“ verändern, ohne über Action Runtime und Policy zu gehen.
-
Use Cases in Pakete schneiden Lieber 20 kleine, belastbare Workflows als 3 allwissende Monsterabläufe.
-
Checkpoints nach Seiteneffekten Besonders nach
app.invoke,submit,create,delete,publish. -
Guide/Assist/Auto strikt trennen Sonst wird aus „zeigen” plötzlich „versehentlich abgesendet”.
Normative Referenzen
Abschnitt betitelt „Normative Referenzen“- [UIAP-CORE] UIAP Core v0.1
- [UIAP-CAP] UIAP Capability Model v0.1
- [UIAP-WEB] UIAP Web Profile v0.1
- [UIAP-ACTION] UIAP Action Runtime v0.1
- [UIAP-POLICY] UIAP Policy Extension v0.1
- [RFC2119] Key words for use in RFCs to Indicate Requirement Levels, BCP 14
Security Considerations
Abschnitt betitelt „Security Considerations“- Workflow-Definitionen SOLLTEN nur von vertrauenswürdigen Quellen geladen werden.
- Workflows DÜRFEN Policy-Entscheidungen nicht umgehen; jeder Schritt MUSS individuell gegen die Policy geprüft werden.
- Recovery-Mechanismen MÜSSEN sicherstellen, dass teilweise ausgeführte Workflows keine inkonsistenten Zustände hinterlassen.
- Workflow-Variablen KÖNNEN sensitive Daten enthalten und SOLLTEN im Audit-Log redaktiert werden.
Changelog
Abschnitt betitelt „Changelog“| Version | Datum | Änderungen |
|---|---|---|
| 0.1 | 2026-03-27 | Initialer Entwurf |