workflow-model-design

Designs AEM Workflow models as content package XML for AEM as a Cloud Service.

1|Updated Jun 22, 2026
One-click install
npx skills add https://github.com/aemgdc/aemdev --skill workflow-model-design-aemgdc
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: workflow-model-design
Source: https://github.com/aemgdc/aemdev/tree/main/.agents/skills/workflow-model-design
Command: npx skills add https://github.com/aemgdc/aemdev --skill workflow-model-design-aemgdc

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Authoring AEM Workflow models on AEM as a Cloud Service requires precise knowledge of the design-time /conf XML format, step resource types, and deployment rules, and mistakes like shipping /var runtime content or using deprecated /etc paths break models in the editor. ## Core Features & Use Cases - Model XML Generation: Produces the correct cq:Page / flow parsys structure with nt:unstructured step nodes and proper sling:resourceType values for PROCESS, PARTICIPANT, DYNAMIC_PARTICIPANT, OR_SPLIT, AND_SPLIT, and EXTERNAL_PROCESS steps. - Guardrail Enforcement: Hard-stops forbidden patterns such as cq:WorkflowModel nodes under /conf, /var content in packages, and /etc/workflow/models/ paths. - Design Patterns: Provides reference implementations for linear approval, OR-split decision branches, parallel AND-split reviews, Goto retry loops, and Task Manager integration. - Use Case: A developer needs an approval workflow where content is validated, reviewed by a group, and published on approval. The Skill generates the model XML at /conf/global/settings/workflow/models/, the filter.xml merge entry, and deployment steps through Cloud Manager with post-deploy Sync. ## Quick Start Ask the assistant to design an AEM workflow model with a validation process step, a content-review participant step, and an OR-split that activates the page on approval for AEM as a Cloud Service.

Frequently Asked Questions about workflow-model-design

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I create an AEM workflow model on AEM as a Cloud Service?▼

Create the model XML as a cq:Page with a flow parsys layer under /conf/global/settings/workflow/models/<id>, add it to the ui.content package with a filter.xml merge entry, deploy via Cloud Manager, then open the model in the Workflow Model Editor and click Sync to generate the runtime model at /var.

What step types are available in AEM workflow models?▼

AEM workflow models support PROCESS for auto-executed Java steps, PARTICIPANT and DYNAMIC_PARTICIPANT for human tasks, OR_SPLIT for rule-based decisions, AND_SPLIT for parallel branches, and EXTERNAL_PROCESS for polling external systems. START, END, and AND_JOIN are derived automatically by Sync.

Can I deploy workflow models to /etc/workflow/models on AEMaaCS?▼

No, /etc/workflow/models/ is deprecated and unsupported on AEM as a Cloud Service. All custom models must live at /conf/global/settings/workflow/models/, and /libs is immutable so OOTB paths cannot be modified.

Why does my workflow model not open in the Workflow Model Editor?▼

Common causes include adding a cq:WorkflowModel model/ child under jcr:content at /conf, using cq:WorkflowNode step types in the flow layer, or missing the flow wrapper with sling:resourceType foundation/components/parsys. The design-time layer must use nt:unstructured steps with sling:resourceType only.

Should I ship /var/workflow/models content in my package?▼

Never ship /var content in a content package. AEM Sync owns /var/workflow/models/ entirely and generates the runtime model from the design-time /conf layer when you click Sync in the editor; packaging it causes conflicts and stale runtime state.

How do OR_SPLIT routing rules work in AEM workflows?▼

OR_SPLIT rules are ECMAScript (Rhino) functions configured on outgoing transitions in the runtime model after Sync. They read values via workflowData.getMetaDataMap(), and you should wrap returns in String(...) and use strict equality to avoid Rhino coercion issues.