All AEM 6.5 LTS skills: Workflow model design, development, triggering, launchers, debugging, and triaging; Dispatcher config authoring, advisory, incident response, performance tuning, and security hardening; Replication agent configuration, content activation, API usage, and troubleshooting for AEM 6.5 LTS and AMS environments; Jackrabbit Oak query/index tuning (property, Lucene index definitions); and extracting/inventorying JCR queries (XPath, SQL2, QueryBuilder) across a codebase.
79%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
All mechanisms to start a workflow on AEM 6.5 LTS — from UI, programmatic API, HTTP API, Manage Publication, and replication-linked triggers.
/etc-based workflow packages.| Mechanism | Use Case |
|---|---|
| Timeline UI | One-off manual start on a single page or asset |
| Manage Publication | Multi-page batch, integrates with publish pipeline |
| WorkflowSession API | Backend Java code, scheduled jobs, event handlers |
| HTTP Workflow API | REST calls, scripts, external integrations |
| Classic UI Activate | Replication-linked workflow (legacy) |
| Workflow Launchers | Automatic on JCR events — see workflow-launchers skill |
AEM creates a cq:WorkflowContentPackage under /etc/workflow/packages/ containing all selected pages.
@Component(service = WorkflowStarterService.class)
public class WorkflowStarterService {
@Reference
private ResourceResolverFactory resolverFactory;
public String startWorkflow(String payloadPath, String modelId) throws Exception {
Map<String, Object> auth = Collections.singletonMap(
ResourceResolverFactory.SUBSERVICE, "workflow-starter");
try (ResourceResolver resolver = resolverFactory.getServiceResourceResolver(auth)) {
WorkflowSession wfSession = resolver.adaptTo(WorkflowSession.class);
WorkflowModel model = wfSession.getModel(modelId);
WorkflowData data = wfSession.newWorkflowData("JCR_PATH", payloadPath);
data.getMetaDataMap().put("workflowTitle", "Triggered by batch job");
Workflow instance = wfSession.startWorkflow(model, data);
return instance.getId();
}
}
}Model ID format: /var/workflow/models/my-workflow (runtime path)
For /etc/workflow/models/ legacy models, the ID is /etc/workflow/models/my-workflow.
The API is rooted at /var/workflow/instances (the legacy /etc/workflow/instances path is
still accepted on 6.5 LTS). Do not POST to /api/workflow/instances — no workflow API is
mounted there, so the Sling default POST servlet silently writes stray JCR nodes and returns a
misleading 2xx without starting any workflow (a GET on that path returns 404).
# Start — returns HTTP 201 with an HTML body linking to the new instance path
curl -u admin:admin -X POST \
"http://localhost:4502/var/workflow/instances" \
--data-urlencode "_charset_=utf-8" \
--data-urlencode "model=/var/workflow/models/my-workflow" \
--data-urlencode "payloadType=JCR_PATH" \
--data-urlencode "payload=/content/my-site/en/home" \
--data-urlencode "workflowTitle=My Test Run" \
--data-urlencode "startComment=triggered via HTTP API"
# List instances — filter by state with a selector (.RUNNING.json, .COMPLETED.json, ...)
curl -u admin:admin "http://localhost:4502/var/workflow/instances.json"
curl -u admin:admin "http://localhost:4502/var/workflow/instances.RUNNING.json"
# Instance detail — the id is the path returned at start,
# e.g. /var/workflow/instances/server0/<date>/my-workflow_1
curl -u admin:admin \
"http://localhost:4502/var/workflow/instances/server0/<date>/my-workflow_1.json"
# Terminate (abort) — POST state=ABORTED to the instance path, returns HTTP 200
curl -u admin:admin -X POST \
"http://localhost:4502/var/workflow/instances/server0/<date>/my-workflow_1" \
--data-urlencode "_charset_=utf-8" \
--data-urlencode "state=ABORTED" \
--data-urlencode "terminateComment=cleanup"The start response is HTML, not JSON: parse the instance path from the returned link
(<a id="Location" …> / "Modified Resource"). Instance and model listings (.json) and
instance detail (<instanceId>.json) return JSON.
Configure via Tools → Replication → Agents → default → check Default Agent properties to associate a workflow with replication events. Or use a Workflow Launcher targeting /var/audit/com.day.cq.replication/.
loginAdministrative()./var/workflow/models/ runtime path..tessl-plugin
skills
aem-replication
aem-workflow
dispatcher
ensure-agents-md
references
tuning-oak-query-indexes