@uipath/skills 1.200.0 → 1.201.0-preview.433
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +32 -0
- package/CODEOWNERS +25 -4
- package/README.md +1 -0
- package/assets/skill-status.json +8 -0
- package/assets/uip-catalog-snapshot.json +113 -41
- package/assets/uipath-icon.png +0 -0
- package/commands/install-permissions.md +1 -0
- package/package.json +3 -2
- package/skills/uipath-admin/SKILL.md +1 -1
- package/skills/uipath-admin/references/authorization/permission-catalog.md +61 -1
- package/skills/uipath-admin/references/authorization/role-management.md +3 -1
- package/skills/uipath-admin/references/diagnose/references/failure-modes.md +29 -4
- package/skills/uipath-admin/references/diagnose/references/troubleshooting-guide.md +13 -0
- package/skills/uipath-agents/SKILL.md +1 -0
- package/skills/uipath-agents/references/coded/capabilities/context-grounding.md +3 -3
- package/skills/uipath-agents/references/coded/capabilities/guardrails/guardrails-recommend.md +6 -1
- package/skills/uipath-agents/references/coded/capabilities/guardrails/guardrails.md +89 -1
- package/skills/uipath-agents/references/coded/embedding-in-flows.md +17 -1
- package/skills/uipath-agents/references/coded/frameworks/llamaindex-integration.md +64 -2
- package/skills/uipath-agents/references/coded/lifecycle/deployment.md +3 -0
- package/skills/uipath-agents/references/coded/lifecycle/environment-variables.md +90 -0
- package/skills/uipath-agents/references/coded/lifecycle/file-sync.md +3 -1
- package/skills/uipath-agents/references/coded/quickstart.md +10 -6
- package/skills/uipath-agents/references/lowcode/capabilities/guardrails/guardrails-recommend.md +20 -5
- package/skills/uipath-agents/references/lowcode/capabilities/guardrails/guardrails.md +13 -0
- package/skills/uipath-agents/references/lowcode/capabilities/inline-in-flow/inline-in-flow.md +1 -3
- package/skills/uipath-api-workflow/references/operating-published-workflows.md +17 -6
- package/skills/uipath-automationhub/SKILL.md +58 -0
- package/skills/uipath-automationhub/references/api-endpoints.md +140 -0
- package/skills/uipath-automationhub/references/get-process.md +69 -0
- package/skills/uipath-automationhub/references/publish-process.md +171 -0
- package/skills/uipath-coded-apps/SKILL.md +24 -11
- package/skills/uipath-coded-apps/references/commands-reference.md +29 -29
- package/skills/uipath-coded-apps/references/create-action-app.md +4 -0
- package/skills/uipath-coded-apps/references/create-web-app.md +10 -0
- package/skills/uipath-coded-apps/references/debug.md +16 -0
- package/skills/uipath-coded-apps/references/oauth-client-setup.md +3 -1
- package/skills/uipath-coded-apps/references/oauth-scopes.md +39 -4
- package/skills/uipath-coded-apps/references/pack-publish-deploy.md +37 -21
- package/skills/uipath-coded-apps/references/sdk/conversational-agent.md +2 -0
- package/skills/uipath-coded-apps/references/sdk/data-fabric.md +2 -0
- package/skills/uipath-coded-apps/references/sdk/orchestrator.md +2 -0
- package/skills/uipath-coded-apps/references/widgets/conversational-agent-chat.md +90 -0
- package/skills/uipath-coded-apps/references/widgets/datatable.md +97 -0
- package/skills/uipath-coded-apps/references/widgets/external-auth.md +97 -0
- package/skills/uipath-coded-apps/references/widgets/multi-file-upload.md +98 -0
- package/skills/uipath-coded-apps/references/widgets/pdf-viewer.md +122 -0
- package/skills/uipath-coded-apps/references/widgets/validation-station.md +1 -1
- package/skills/uipath-functions/SKILL.md +11 -0
- package/skills/uipath-insights/SKILL.md +52 -247
- package/skills/uipath-insights/references/filter-discovery-guide.md +106 -0
- package/skills/uipath-insights/references/investigation-playbook-guide.md +24 -16
- package/skills/uipath-insights/references/jobs-commands-guide.md +196 -53
- package/skills/uipath-ixp/SKILL.md +10 -4
- package/skills/uipath-ixp/references/cli-reference.md +59 -5
- package/skills/uipath-ixp/references/label-documents-guide.md +12 -5
- package/skills/uipath-maestro-bpmn/SKILL.md +27 -9
- package/skills/uipath-maestro-bpmn/references/diagnose/references/failure-modes.md +6 -3
- package/skills/uipath-maestro-bpmn/references/operate/CAPABILITY.md +1 -1
- package/skills/uipath-maestro-bpmn/references/operate/references/ship.md +9 -3
- package/skills/uipath-maestro-bpmn/references/registry-workflow.md +1 -1
- package/skills/uipath-maestro-bpmn/references/shared/local-metadata-regeneration-guide.md +18 -11
- package/skills/uipath-maestro-bpmn/references/structural-bpmn.md +13 -7
- package/skills/uipath-maestro-case/SKILL.md +138 -170
- package/skills/uipath-maestro-case/references/bindings-and-expressions.md +14 -1
- package/skills/uipath-maestro-case/references/bindings-v2-sync.md +25 -1
- package/skills/uipath-maestro-case/references/brownfield.md +7 -3
- package/skills/uipath-maestro-case/references/case-commands.md +63 -8
- package/skills/uipath-maestro-case/references/case-editing-operations.md +11 -8
- package/skills/uipath-maestro-case/references/case-schema.md +5 -3
- package/skills/uipath-maestro-case/references/case-spec-input-details.md +4 -0
- package/skills/uipath-maestro-case/references/connector-integration.md +3 -1
- package/skills/uipath-maestro-case/references/connector-trigger-impl.md +236 -0
- package/skills/uipath-maestro-case/references/connector-trigger-planning.md +300 -0
- package/skills/uipath-maestro-case/references/entry-points-sync.md +2 -0
- package/skills/uipath-maestro-case/references/evals/evals.json +33 -40
- package/skills/uipath-maestro-case/references/implementation.md +58 -13
- package/skills/uipath-maestro-case/references/phased-execution.md +87 -20
- package/skills/uipath-maestro-case/references/placeholder-tasks.md +3 -1
- package/skills/uipath-maestro-case/references/planning.md +26 -16
- package/skills/uipath-maestro-case/references/plugins/case/impl-json.md +2 -5
- package/skills/uipath-maestro-case/references/plugins/case/planning.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/conditions/case-exit-conditions/impl-json.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/conditions/case-exit-conditions/planning.md +5 -3
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/impl-json.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/planning.md +6 -4
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/impl-json.md +6 -4
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/planning.md +6 -4
- package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/impl-json.md +42 -3
- package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/planning.md +6 -4
- package/skills/uipath-maestro-case/references/plugins/logging/impl-json.md +50 -32
- package/skills/uipath-maestro-case/references/plugins/sla/impl-json.md +2 -4
- package/skills/uipath-maestro-case/references/plugins/sla/planning.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/stages/impl-json.md +1 -4
- package/skills/uipath-maestro-case/references/plugins/stages/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/action/impl-json.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/action/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/agent/impl-json.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/agent/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/impl-json.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/planning.md +5 -3
- package/skills/uipath-maestro-case/references/plugins/tasks/case-management/impl-json.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/case-management/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/impl-json.md +43 -13
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/impl-json.md +10 -7
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/planning.md +5 -3
- package/skills/uipath-maestro-case/references/plugins/tasks/create-inline-common.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/process/impl-json.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/process/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/rpa/impl-json.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/rpa/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/impl-json.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/triggers/event/impl-json.md +9 -6
- package/skills/uipath-maestro-case/references/plugins/triggers/event/planning.md +5 -3
- package/skills/uipath-maestro-case/references/plugins/triggers/manual/impl-json.md +1 -4
- package/skills/uipath-maestro-case/references/plugins/triggers/manual/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/triggers/timer/impl-json.md +1 -4
- package/skills/uipath-maestro-case/references/plugins/triggers/timer/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/variables/bindings/impl-json.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/variables/global-vars/impl-json.md +40 -2
- package/skills/uipath-maestro-case/references/plugins/variables/global-vars/planning.md +12 -2
- package/skills/uipath-maestro-case/references/plugins/variables/io-binding/impl-json.md +8 -6
- package/skills/uipath-maestro-case/references/plugins/variables/io-binding/planning.md +17 -3
- package/skills/uipath-maestro-case/references/registry-discovery.md +9 -5
- package/skills/uipath-maestro-case/references/sla-response-shapes.md +3 -1
- package/skills/uipath-maestro-case/references/troubleshooting-guide.md +2 -0
- package/skills/uipath-maestro-case/scripts/audit_plan.py +231 -0
- package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +8 -4
- package/skills/uipath-maestro-flow/references/author/references/editing-operations-cli.md +5 -3
- package/skills/uipath-maestro-flow/references/author/references/editing-operations-json.md +14 -4
- package/skills/uipath-maestro-flow/references/author/references/editing-operations.md +3 -3
- package/skills/uipath-maestro-flow/references/author/references/greenfield.md +12 -3
- package/skills/uipath-maestro-flow/references/author/references/planning-arch.md +17 -13
- package/skills/uipath-maestro-flow/references/author/references/planning-impl.md +1 -1
- package/skills/uipath-maestro-flow/references/author/references/plugins/agent/impl.md +49 -4
- package/skills/uipath-maestro-flow/references/author/references/plugins/connector/impl.md +59 -17
- package/skills/uipath-maestro-flow/references/author/references/plugins/connector-trigger/impl.md +3 -3
- package/skills/uipath-maestro-flow/references/author/references/plugins/http/impl-connector.md +3 -1
- package/skills/uipath-maestro-flow/references/author/references/plugins/http/impl-manual.md +3 -1
- package/skills/uipath-maestro-flow/references/author/references/plugins/http/impl.md +5 -2
- package/skills/uipath-maestro-flow/references/author/references/plugins/inline-agent/impl.md +31 -16
- package/skills/uipath-maestro-flow/references/author/references/plugins/ixp/impl.md +13 -4
- package/skills/uipath-maestro-flow/references/author/references/plugins/loop/impl.md +185 -25
- package/skills/uipath-maestro-flow/references/author/references/plugins/loop/planning.md +18 -10
- package/skills/uipath-maestro-flow/references/author/references/plugins/rpa/impl.md +9 -3
- package/skills/uipath-maestro-flow/references/author/references/plugins/terminate/impl.md +6 -3
- package/skills/uipath-maestro-flow/references/diagnose/references/failure-modes.md +68 -0
- package/skills/uipath-maestro-flow/references/shared/cli-commands.md +2 -1
- package/skills/uipath-maestro-flow/references/shared/file-format.md +36 -9
- package/skills/uipath-maestro-flow/references/shared/node-output-wiring.md +1 -1
- package/skills/uipath-maestro-flow/references/shared/ux-narration-and-todos.md +1 -1
- package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +77 -20
- package/skills/uipath-planner/SKILL.md +30 -12
- package/skills/{uipath-maestro-case/assets/templates/sdd-template-examples.md → uipath-planner/assets/templates/case-sdd-examples.md} +18 -32
- package/skills/uipath-planner/assets/templates/case-sdd-template.md +289 -309
- package/skills/uipath-planner/references/case-design-lane-guide.md +288 -0
- package/skills/uipath-planner/references/multi-skill-patterns-guide.md +1 -1
- package/skills/uipath-planner/references/package-selection-guide.md +2 -2
- package/skills/uipath-planner/references/pdd-driven-lane-guide.md +5 -1
- package/skills/uipath-planner/references/product-selection-guide.md +2 -2
- package/skills/uipath-planner/references/sdd-generation-guide.md +16 -15
- package/skills/uipath-planner/scripts/audit_sdd.py +437 -0
- package/skills/uipath-platform/SKILL.md +7 -2
- package/skills/uipath-platform/references/data-fabric/choice-sets.md +1 -1
- package/skills/uipath-platform/references/data-fabric/data-fabric.md +1 -1
- package/skills/uipath-platform/references/data-fabric/entity-schema.md +37 -21
- package/skills/uipath-platform/references/data-fabric/file-attachments.md +1 -1
- package/skills/uipath-platform/references/guardrails/byo-configurations.md +205 -0
- package/skills/uipath-platform/references/traces/feedback.md +4 -2
- package/skills/uipath-platform/references/uip-commands.md +2 -2
- package/skills/uipath-review/SKILL.md +55 -52
- package/skills/uipath-review/references/agents/agent-grading-rubric.md +62 -40
- package/skills/uipath-review/references/agents/agents-coded-rules.md +7 -1
- package/skills/uipath-review/references/agents/agents-lowcode-rules.md +21 -2
- package/skills/uipath-review/references/agents/guardrails/coded-guardrails-review.md +78 -13
- package/skills/uipath-review/references/agents/guardrails/guardrails-review.md +11 -4
- package/skills/uipath-review/references/architecture-assessment-guide.md +1 -1
- package/skills/uipath-review/references/review-workflow-guide.md +19 -10
- package/skills/uipath-review/references/rule-catalog-workflow.md +6 -6
- package/skills/uipath-review/references/rule-format.md +1 -1
- package/skills/uipath-rpa/SKILL.md +1 -1
- package/skills/uipath-solution/SKILL.md +4 -4
- package/skills/uipath-solution/references/solution-overview.md +7 -2
- package/skills/uipath-tasks/SKILL.md +27 -1
- package/skills/uipath-tasks/references/task-catalogs.md +79 -0
- package/skills/uipath-tasks/references/task-data.md +45 -0
- package/skills/uipath-tasks/references/task-metadata.md +69 -0
- package/skills/uipath-test/SKILL.md +3 -3
- package/skills/uipath-test/references/test-result-report-guide.md +16 -1
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/ambiguous-selector.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/scope-container-wrong-page.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/verify-execution-failure.md +2 -2
- package/skills/uipath-troubleshoot/references/products/agents/playbooks/guardrail-violation.md +12 -0
- package/version-manifest.json +2 -2
- package/skills/uipath-maestro-case/assets/templates/sdd-template.md +0 -667
- package/skills/uipath-maestro-case/references/connector-trigger-common.md +0 -511
- package/skills/uipath-maestro-case/references/phase-0-interview.md +0 -279
- package/skills/uipath-maestro-case/references/sdd-generation-rules.md +0 -1026
- package/skills/uipath-review/references/agents/agent-common-issues.md +0 -401
- package/skills/uipath-review/references/agents/agent-review-checklist.md +0 -379
- /package/skills/{uipath-maestro-case → uipath-planner}/assets/templates/sdd-viewer.html +0 -0
|
@@ -1,667 +0,0 @@
|
|
|
1
|
-
# SDD Template — Case Definition Blueprint
|
|
2
|
-
# Purpose: Defines the output format for sdd.md — a case definition blueprint
|
|
3
|
-
# that a developer can directly implement in the UiPath Case Designer.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Instructions for SDD Generation
|
|
8
|
-
|
|
9
|
-
You are generating an **SDD — a case definition blueprint** (NOT a traditional solution design document). Every section maps directly to what the UiPath Case Designer actually consumes. A developer reading this document should be able to build the case in the Case Designer without guessing.
|
|
10
|
-
|
|
11
|
-
**Inputs:**
|
|
12
|
-
- Phase 0 interview answers (free-text + AskUserQuestion picks) — primary source
|
|
13
|
-
- This template — defines the output structure
|
|
14
|
-
- See [references/case-schema.md](../../references/case-schema.md) for the JSON schema reference (types, rules, SLA model)
|
|
15
|
-
|
|
16
|
-
**Optional enrichment sources:**
|
|
17
|
-
- CLI registry cache at `~/.uip/case-resources/` (deployed processes, connectors, action apps from the user's tenant — flat `<type>-index.json` files per resource type, populated by `uip maestro case registry pull`)
|
|
18
|
-
- IS connector cache at `~/.uipath/cache/integrationservice/<connectorKey>/` (`connections.json`, `activities.json`) for connection + operation metadata
|
|
19
|
-
|
|
20
|
-
**Output:** `sdd.md`
|
|
21
|
-
|
|
22
|
-
### Key Rules
|
|
23
|
-
|
|
24
|
-
1. **SLA placement and response:** SLA is supported on the **case**, on **stages**, and on **`action` tasks only**. Do NOT put SLA on `process`, `agent`, `rpa`, `api-workflow`, `wait-for-timer`, `wait-for-connector`, `execute-connector-activity`, or `case-management` tasks. Separate the SLA clock from its response: notify-only stays in escalation actions; every other response (`start-task`, `enter-stage`, `exit-stage`, `exit-case`) is explicit in the SLA Response Map, with its own interrupting decision.
|
|
25
|
-
|
|
26
|
-
2. **No skip conditions:** Stage skip conditions are NOT supported in the schema. Do not generate them. Use task-level `shouldRunOnlyOnce` for re-entry behavior.
|
|
27
|
-
|
|
28
|
-
3. **Rule types:** Use only actual rule types from the schema:
|
|
29
|
-
- `case-entered` — case has been created/entered
|
|
30
|
-
- `selected-stage-completed` — a specific stage has completed
|
|
31
|
-
- `selected-stage-exited` — a specific stage has exited (not necessarily completed)
|
|
32
|
-
- `selected-tasks-completed` — specific tasks have completed
|
|
33
|
-
- `current-stage-entered` — the current stage has been entered
|
|
34
|
-
- `required-stages-completed` — all required stages completed
|
|
35
|
-
- `required-tasks-completed` — all required tasks in stage completed
|
|
36
|
-
- `wait-for-connector` — an Integration Service event received
|
|
37
|
-
- `adhoc` — ad-hoc / manually triggered task entry
|
|
38
|
-
- `runs-sequentially` — runs sequentially
|
|
39
|
-
- `user-selected-stage` - target of an upstream `wait-for-user` exit
|
|
40
|
-
- `sla-status-change` — a referenced case/stage SLA changed status (stage entry for an `enter-stage` response, task entry for `start-task`; 2 args for a breach, 3 for at-risk — see the reference contract under Stage Entry Conditions)
|
|
41
|
-
|
|
42
|
-
4. **Exit conditions:** Every exit condition MUST specify:
|
|
43
|
-
- **Exit Type:** `exit-only` | `return-to-origin` | `wait-for-user`
|
|
44
|
-
- **Marks Stage Complete:** Yes | No
|
|
45
|
-
These are separate concepts. A stage can exit without completing (exit-only + No).
|
|
46
|
-
|
|
47
|
-
**WHEN ↔ Marks Complete pairing (hard constraint — schema-enforced; applies identically to STAGE exit and CASE exit):**
|
|
48
|
-
|
|
49
|
-
*Stage exit:*
|
|
50
|
-
- `Marks Stage Complete: Yes` → WHEN MUST be `required-tasks-completed` (typical) or `wait-for-connector` (stage completes when the bound connector event arrives). **NEVER** `required-stages-completed` or `selected-tasks-completed(...)`.
|
|
51
|
-
- `Marks Stage Complete: No` (routing / divergent exits) → WHEN may be `selected-tasks-completed("TaskA")`, `wait-for-connector`, etc.
|
|
52
|
-
- Same stage may carry one completion exit (`Yes` + `required-tasks-completed` / `wait-for-connector`) plus zero or more routing exits (`No` + `selected-tasks-completed` / `wait-for-connector`).
|
|
53
|
-
- `return-to-origin` is a completion exit: use `Marks Stage Complete: Yes` with `required-tasks-completed` (or `wait-for-connector`). Never pair it with `No` + `selected-tasks-completed`.
|
|
54
|
-
- **Stage-picker repair is a replacement, never a duplicate:** when `user-selected-stage` requires picker exposure from an origin, replace that origin's `required-tasks-completed | exit-only | Yes` completion row with `required-tasks-completed | wait-for-user | Yes`. Keep exactly one `required-tasks-completed` row; never add a second `Marks Stage Complete: No` row.
|
|
55
|
-
|
|
56
|
-
*Case exit (preferred pattern: one row, `Yes` + `required-stages-completed`):*
|
|
57
|
-
- `Marks Case Complete: Yes` → WHEN MUST be `required-stages-completed` or `wait-for-connector`. **NEVER** `selected-stage-completed(...)` / `selected-stage-exited(...)`.
|
|
58
|
-
- `Marks Case Complete: No` (case exits without closing — rare) → WHEN may be `selected-stage-completed(...)`, `selected-stage-exited(...)`, or `wait-for-connector`.
|
|
59
|
-
|
|
60
|
-
5. **Descriptions and rationale are mandatory:** Every case, stage, and task MUST have a prose description. Every stage/task and configured case/stage SLA MUST also preserve a concrete Design Rationale explaining the selected kind/type, activation/sequencing, and routing/threshold choices. No empty or placeholder descriptions/rationales.
|
|
61
|
-
|
|
62
|
-
6. **Entry/exit conditions use WHEN + IF format:**
|
|
63
|
-
- **WHEN** = the rule type (event that triggers evaluation, e.g., `selected-stage-completed("Intake")`)
|
|
64
|
-
- **IF** = the optional `conditionExpression` (JavaScript expression evaluated against case variables, e.g., `applicationStatus == "Approved"`). To gate on an upstream task's output without a middle case variable, embed `vars.$xref('Stage','Task','output')` directly in the IF expression — see [bindings-and-expressions.md § In-expression references](../../references/bindings-and-expressions.md#in-expression-references-varsxref).
|
|
65
|
-
- **Display Name** (optional) = human-readable label for the condition row. Leave blank (`—`) to let the skill default it: entry/task-entry conditions → `Entry Rule {N}`; stage-exit/case-exit conditions → `Complete Rule {N}` when Marks Complete is `Yes`, `Exit Rule {N}` when `No`. `N` is the 1-based index within the same label kind in the stage / task / case container. Set a value only to override the default.
|
|
66
|
-
- **`wait-for-connector` WHEN** binds an Integration Service connector event. Name it inline in the WHEN cell (e.g. `wait-for-connector (Outlook "Email Received", Inbox)`) AND add a **Connector Rule Detail** block under the condition table. Applies to stage-entry, stage-exit, case-exit, and task-entry conditions. The IF cell is then an optional `=js:` gate on **case state** (`=js:vars.X`); the event payload is NOT directly accessible (no `event` namespace). **In-rule event-payload gating is NOT supported at runtime** — same-rule extract-then-gate (`response.X -> caseVar` on outputs + `=js:vars.caseVar` in IF) does not work; the case-backend evaluates the gate before the extract runs. To condition on the event payload, extract `response.field -> caseVar` on the connector rule and place the case-state gate on the DOWNSTREAM stage-entry / task-entry condition (where the extract has already populated the case var).
|
|
67
|
-
|
|
68
|
-
**Connector Rule Detail block** — reproduce under any condition table whose WHEN is `wait-for-connector`:
|
|
69
|
-
```markdown
|
|
70
|
-
**Connector Rule Detail:**
|
|
71
|
-
- Connector: {e.g., Microsoft Outlook 365}
|
|
72
|
-
- Connection: {instance name, or "Tenant default"}
|
|
73
|
-
- Event: {e.g., Email Received}
|
|
74
|
-
- Filter: {filter in business terms, or "—"}
|
|
75
|
-
- Event Parameters: {name=value pairs, e.g., parentFolderId="Inbox"; or "—"}
|
|
76
|
-
|
|
77
|
-
**Connector Rule Outputs:** *(optional — omit when the rule is gate-only; target case variable MUST exist in the Case Variables table)*
|
|
78
|
-
|
|
79
|
-
| Field | Binding / Value |
|
|
80
|
-
|-------|------------------|
|
|
81
|
-
| {schema field name, e.g., response.subject} | -> {case variable that receives this value} |
|
|
82
|
-
| — | {case variable} = {literal, =js:expression, or =js:vars.X.Y for dotted access} |
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
7. **Task types — this skill generates 9 of the CLI's 10 task types. Choose based on WHAT THE TASK DOES, not its surface label.** The 10th CLI type, `external-agent`, has no generation plugin here — model it as `api-workflow` / `execute-connector-activity` instead (see below). Values like `connector-activity` or `wait-for-event` are not CLI task types at all. Emitting anything outside these 9 breaks downstream JSON generation. Consider all 9 for every task:
|
|
86
|
-
- `action` — a human must review, approve, or make a judgment call. The task PAUSES for a person.
|
|
87
|
-
- `agent` — AI reasoning: classification, criteria application, document analysis, risk assessment, triage. Use for any semi-structured reasoning.
|
|
88
|
-
- `process` — deterministic multi-step BPMN: routing, orchestration, batch processing, report generation. No judgment (human or AI).
|
|
89
|
-
- `rpa` — UI automation for legacy systems without APIs. An attended or unattended robot drives a desktop/web app.
|
|
90
|
-
- `api-workflow` — structured API call with defined I/O. System-to-system.
|
|
91
|
-
- `wait-for-timer` — waits for a duration, date, or schedule.
|
|
92
|
-
- `wait-for-connector` — waits for an Integration Service event from an external system (in-stage trigger).
|
|
93
|
-
- `execute-connector-activity` — executes a pre-built IS connector operation. Prefer over `api-workflow` when a connector exists.
|
|
94
|
-
- `case-management` — starts a child case with its own lifecycle.
|
|
95
|
-
|
|
96
|
-
**A well-designed SDD uses a MIX of types.** If all tasks are `action`, the SDD is wrong — most processes have automated steps. If no tasks are `agent`, consider whether any task involves classification, criteria application, or document analysis.
|
|
97
|
-
|
|
98
|
-
**Externally-hosted AI agents** (CrewAI, Salesforce Einstein, Databricks, LangChain, etc.) have no first-class type in this skill. Model them as `api-workflow` (system-to-system invocation) or `execute-connector-activity` if a connector exists. Do not invent `external-agent`.
|
|
99
|
-
|
|
100
|
-
### Naming Conventions
|
|
101
|
-
|
|
102
|
-
- **Case names:** PascalCase (e.g., `MortgageLoanOrigination`)
|
|
103
|
-
- **Case identifier prefix:** UPPER, 2-4 characters (e.g., `MLO`)
|
|
104
|
-
- **Variable names:** camelCase (e.g., `applicationStatus`, `loanAmount`)
|
|
105
|
-
- **Workflows/Processes:** PascalCase (e.g., `ValidateEligibility`)
|
|
106
|
-
- **Entity names:** PascalCase (e.g., `LoanApplication`)
|
|
107
|
-
- **Entity fields:** camelCase (e.g., `applicantName`)
|
|
108
|
-
- **Case Designer display names:** stages, tasks, condition rule names, SLA rule titles, and escalation titles use only letters, numbers, spaces, hyphen (`-`), and underscore (`_`). Do not generate colons, periods, slashes, backslashes, quotes, parentheses, ampersands, commas, semicolons, emoji, or other symbols. Normalize unsafe display punctuation to spaces, collapse spaces, and disclose any changed display names in the Case Review.
|
|
109
|
-
- **External lookup names:** do not normalize deployed resource names, connector names, Action App titles, API/process/agent names, queue names, or bucket names used for tenant lookup. Keep a separate safe Case Designer display name when an external lookup name contains punctuation.
|
|
110
|
-
|
|
111
|
-
### Output Structure
|
|
112
|
-
|
|
113
|
-
The rendered `sdd.md` must preserve this structure. Do not replace it with a summary, build plan, source trace, or abbreviated stage/task list; every section and every modeled stage/task detail block below is part of the authoring contract.
|
|
114
|
-
|
|
115
|
-
The generated SDD must start with:
|
|
116
|
-
|
|
117
|
-
1. **Title** — `# SDD — {Case Name}`
|
|
118
|
-
2. **Subtitle** — Case Definition Blueprint blurb
|
|
119
|
-
3. **(optional) Version / Change Log** — a single blockquote under the subtitle when the SDD is revised: `> **Version: vN** — <one-line what-changed-and-why>`. Use it to record material build-driven corrections (e.g. "rebound `caseId` to `=metadata.ExternalId` — the workflow does not return it") so a reader/coding-agent sees the rationale, not just the result. Omit on a first draft.
|
|
120
|
-
4. **Table of Contents** — Numbered list with markdown anchor links. Use plain numbered list items with links, NOT headings (no `###`). Format:
|
|
121
|
-
```markdown
|
|
122
|
-
## Table of Contents
|
|
123
|
-
|
|
124
|
-
1. [Case Definition](#section-1-case-definition) — Metadata, SLA, Triggers, Exit Conditions, Variables
|
|
125
|
-
2. [Stages & Tasks](#section-2-stages--tasks)
|
|
126
|
-
- [Stage 1: {Name}](#stage-1-{slug}) — {N} tasks
|
|
127
|
-
- [Stage 2: {Name}](#stage-2-{slug}) — {N} tasks
|
|
128
|
-
...
|
|
129
|
-
3. [Personas & App Views](#section-3-personas--app-views) — {N} Personas, Process App Views
|
|
130
|
-
4. [Integrations](#section-4-integrations) — IS Connectors, API Workflows, Agents, Processes & RPA, Child Cases, External Agents
|
|
131
|
-
```
|
|
132
|
-
Anchor slugs must match the actual heading text: lowercase, spaces→hyphens, strip special chars (e.g., `### Stage 1: Request Intake & Triage` → `#stage-1-request-intake--triage`).
|
|
133
|
-
|
|
134
|
-
### Output Rules (applies to every section of the rendered SDD)
|
|
135
|
-
|
|
136
|
-
- The SDD is a standalone developer artifact. It must NOT reference its own generation sources. Forbidden phrases anywhere in the output: `interview answers`, `from cache`, `from the registry`, `from state.*`, `REVIEW:`, `wiki/`, `PDD`, `pdd.md`, or any chain-of-thought explanation of how a value was derived.
|
|
137
|
-
- State every fact directly. If mock substitution is permitted, say "Mock Connector substitution is permitted until a live connection is provisioned" — do not attribute the decision to a generation source.
|
|
138
|
-
- Unknown values render as `—`, not as REVIEW markers. Review items belong in the Phase 0 round-4 summary or post-build loop, not in the document body.
|
|
139
|
-
- **Express author intent, not skill implementation.** The SDD describes the business case; the skill is responsible for translating that into the plan and the JSON. The author should not need to know how the skill internally builds anything. Prose in Descriptions, subtitles, and any narrative cells MUST follow these rules:
|
|
140
|
-
- **No explanatory Notes about column semantics or skill internals.** Forbidden: `> **Note:**` blocks (or any prose) that justify why a row is shaped a certain way using skill vocabulary — e.g., "this Variable has no `sourceTriggers` because its producer is a task," or "the `->` operator captures the response field into the case variable." The columns and operator notation are the agreed authoring shapes; the skill's validator enforces correctness. Authors do not document their own conformance.
|
|
141
|
-
- **No raw structured formats inline.** Forbidden: `FilterTree` JSON, payload schema JSON, expression-language ASTs, `=jsonString:` blobs, or other plugin-internal data shapes embedded in the SDD body. Filters, payloads, and expressions belong as plain English. The skill builds the structured form. Canonical filter expression:
|
|
142
|
-
```
|
|
143
|
-
**Filter:** Subject contains "urgent" AND From is "alice@example.com".
|
|
144
|
-
```
|
|
145
|
-
The wait-for-connector / connector-activity plugin builds the FilterTree from this prose, validates the field/operator pair against the trigger spec, and AskUserQuestion's if a clause is unsupported.
|
|
146
|
-
- **No skill-internal vocabulary in prose.** Forbidden in any narrative cell: `Pattern C`, `bridge`, `companion`, `inputOutputs[]`, `=jsonString:`, `groupOperator`, `essentialConfiguration`, `savedFilterTrees`, `dispatcher`, `Phase 2 validator`, `Phase 3 dispatcher`, `Q10 II`, `Finding #N`, `io-binding`, `aliased into`, `aliased from`, `aliased back into`, `reassign`, `originalVar`, `auto-mint`. These are internal terms used inside the skill's references — not the author's vocabulary. Describe outcomes in business terms instead. Examples:
|
|
147
|
-
- **Bad:** `Slack message timestamp aliased into the messageTs Variable.`
|
|
148
|
-
- **Good:** `Slack message timestamp.` (the Binding column already declares the wiring visually)
|
|
149
|
-
- **Bad:** `INVALID (Finding #6): In-argument with event-trigger source — Dispatcher must reject.`
|
|
150
|
-
- **Good:** `Subject sourced from the trigger. (Misclassified: trigger-sourced rows are Variables, not In-arguments.)`
|
|
151
|
-
- **What stays:** column headers (`sourceTriggers`, `sourceFields`, `Category`, etc.), the `->` operator in Outputs Binding cells (extract), the `=` operator in Outputs Binding cells (set/compute/copy), and `=vars.X` / `=metadata.X` / `=js:(...)` expressions in Input Binding cells and IF columns. These are the *agreed authoring shapes*, not skill internals.
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
## Section 1: Case Definition
|
|
156
|
-
|
|
157
|
-
**Purpose:** Top-level case configuration — what appears at the root of the case plan. This section defines the case identity, SLA, triggers, exit conditions, and the complete variable inventory.
|
|
158
|
-
|
|
159
|
-
### Case Metadata
|
|
160
|
-
|
|
161
|
-
| Property | Value |
|
|
162
|
-
|----------|-------|
|
|
163
|
-
| Case Name | {PascalCase name} |
|
|
164
|
-
| Case Description | {2-3 sentence description of what the case manages} |
|
|
165
|
-
| Case Identifier | Type: {constant \| external}. Constant → Prefix: {2-4 char UPPER prefix}. External → Source: {=vars.<In/InOut variable> \| =js:`expression`} |
|
|
166
|
-
| Case-Level SLA | {count} {unit: min/h/d/w/m} |
|
|
167
|
-
| SLA Type | {time-based \| condition-based} |
|
|
168
|
-
| SLA Title | {non-empty title, no `:`; omit this row when `Case-Level SLA` is `—`} |
|
|
169
|
-
| Case App | {Enabled \| Disabled} — whether the in-product Case App UI is on (`caseAppEnabled`; default Disabled) |
|
|
170
|
-
| Task-output passing | {Direct \| Shared} — `caseDirectlyPassTaskOutputs` (Direct = a task's outputs flow straight to downstream tasks; default Direct) |
|
|
171
|
-
| Case Identifier source | {`=metadata.ExternalId` (platform-generated — the default) \| custom} — what every `caseId` task input binds to |
|
|
172
|
-
|
|
173
|
-
> **Case App validation contract:** Stage names must be non-empty, unique, and safe for Case Designer display. Task names and condition display names must be safe. Every SLA rule and escalation needs a non-empty, target-unique safe title/display name. Safe display characters are letters, numbers, spaces, hyphen, and underscore. SLA durations must be positive; minute-based SLAs must be 15–1000 minutes. Non-default SLA rows need an expression; escalations need a recipient, and at-risk escalations need a percentage.
|
|
174
|
-
|
|
175
|
-
### Case-Level SLA Escalation Rules
|
|
176
|
-
|
|
177
|
-
**Design Rationale:** {Why this target, at-risk threshold, recipients, and breach behavior fit the case requirement; name any stage entered through `sla-status-change` and whether that response interrupts active work.}
|
|
178
|
-
|
|
179
|
-
| SLA Status | Threshold | Action | Display Name |
|
|
180
|
-
|------------|-----------|--------|--------------|
|
|
181
|
-
| At-Risk | {percentage}% of SLA duration | {Notify: recipient or group} | {escalation title, root-unique, no `:`} |
|
|
182
|
-
| Breached | 100% of SLA duration | {Notify: recipient or group} | {escalation title, root-unique, no `:`} |
|
|
183
|
-
|
|
184
|
-
> `Display Name` is what a `sla-status-change` entry references. `—` → `Escalation Rule {N}`, valid only when nothing references that escalation.
|
|
185
|
-
|
|
186
|
-
### SLA Response Map
|
|
187
|
-
|
|
188
|
-
> **Required whenever any SLA is configured** (case, stage, or `action` task) — one row per `(Scope, SLA, Status)`. This table is the single place breach and at-risk behavior is decided; never leave the response implied by SLA duration text or by an escalation's wording. Omit the whole section only when no SLA exists anywhere in the case.
|
|
189
|
-
|
|
190
|
-
| Scope | SLA | Status | Response | Target | Interrupting | Rationale |
|
|
191
|
-
|-------|-----|--------|----------|--------|--------------|-----------|
|
|
192
|
-
| {case \| stage: `<StageName>` \| task: `<TaskName>`} | {SLA Title} | {At-Risk \| Breached} | {notify-only \| start-task \| enter-stage \| exit-stage \| exit-case} | {`—` for notify-only; task name for start-task; stage name for enter-stage; exit row ref for exit-stage/exit-case} | {`—` for notify-only and for every start-task; Yes \| No otherwise} | {why this response fits the source} |
|
|
193
|
-
|
|
194
|
-
> **Choosing the `Response`** — read it off the source, never off the SLA's scope:
|
|
195
|
-
>
|
|
196
|
-
> | Response | Source says | Where it lands |
|
|
197
|
-
> |---|---|---|
|
|
198
|
-
> | `notify-only` | notify / alert / email / page someone | escalation `Action` row above — no stage, no task, no entry condition |
|
|
199
|
-
> | `start-task` | follow-up work inside the **same** breached stage (reminder, reassignment, manager check, extra approval) — "as part of the review", "the reviewer keeps working and also does X" | the follow-up task in that stage, carrying `sla-status-change` in its own **`Entry Condition:`** block against that stage's own SLA. **No new stage, and no Stage Entry Conditions row** — a stage-entry rule re-enters the stage and re-runs its other tasks. |
|
|
200
|
-
> | `enter-stage` | a separate lane owns it — ownership change, "hand it to", "escalate into `<Lane>`", recovery, visible lifecycle step | the destination stage's Stage Entry Conditions row |
|
|
201
|
-
> | `exit-stage` | the breached stage should end, fail, or route away | that stage's Stage Exit Conditions row |
|
|
202
|
-
> | `exit-case` | the case should close, cancel, fail, or reach an alternate terminal outcome | a §1.4a Case Exit Conditions row |
|
|
203
|
-
>
|
|
204
|
-
> **`start-task` vs `enter-stage` turns on WHERE the work lives, not on whether it interrupts** — `enter-stage` can itself be `Interrupting: No`, so "the team keeps working" does not choose between them. A named **task** ("raise a Senior Assessor Check approval") never justifies a new stage: if the `Target` you are about to write is a task name rather than a lane the source describes in its own right, the response is `start-task`, and the task goes in the breached stage.
|
|
205
|
-
>
|
|
206
|
-
> **Default:** absent a stated response, both statuses are `notify-only` — `Target` and `Interrupting` are `—`. Do NOT invent a stage, task, or routing change for an SLA the source only asks to notify about.
|
|
207
|
-
>
|
|
208
|
-
> **`Interrupting` is a separate decision from scope.** `Yes` when the response stops, pauses, takes over, or reroutes the active work; `No` when the response runs alongside it (parallel oversight). A case-scope SLA does not imply `Yes`. When the response produces a **Stage** Entry Conditions row (`enter-stage`), the value here MUST match that row's `Interrupting` cell. A **`start-task`** response is always `—`: the rule lives in the follow-up task's own `Entry Condition:` block, which has no `Interrupting` column because a task entry interrupts nothing.
|
|
209
|
-
>
|
|
210
|
-
> **A row whose `Response` is not `notify-only` MUST have a matching rule elsewhere in this SDD** — a `sla-status-change` row in a task's **`Entry Condition:`** block for `start-task`, a `sla-status-change` **Stage Entry Conditions** row for `enter-stage`, a stage-exit row, or a §1.4a case-exit row. A `start-task`/`enter-stage` row with no `sla-status-change` entry anywhere is a blocking render error, and so is an `sla-status-change` entry — task or stage scope — with no row here.
|
|
211
|
-
|
|
212
|
-
### Variable SLA Rules
|
|
213
|
-
|
|
214
|
-
> Include this table only if SLA Type is `condition-based`. Each row defines an expression-keyed SLA override; the time-based default lives in the Case Metadata `Case-Level SLA` cell above. FE persists `slaRules[]` with non-empty `conditionExpression` per row (PO.Frontend `CaseManagementSlaProperties.tsx`).
|
|
215
|
-
|
|
216
|
-
| Expression | SLA | Unit | Display Name |
|
|
217
|
-
|------------|-----|------|--------------|
|
|
218
|
-
| {conditionExpression evaluated against case variables} | {count} | {h \| d \| w \| m} | {non-empty root-unique title without `:`} |
|
|
219
|
-
|
|
220
|
-
### Case Triggers
|
|
221
|
-
|
|
222
|
-
> Variable mapping (which trigger payload field populates which case variable) is declared in the **Case Variables** table below via `sourceTriggers` / `sourceFields` columns — NOT here. This table just identifies and configures each trigger.
|
|
223
|
-
|
|
224
|
-
| T# | Trigger Type | Source | Configuration |
|
|
225
|
-
|----|-------------|--------|---------------|
|
|
226
|
-
| T02 | {Manual \| Intsvc.EventTrigger \| Intsvc.TimerTrigger} | {source system, connector, or "Manual"} | {see Configuration rules below} |
|
|
227
|
-
|
|
228
|
-
> Number triggers sequentially starting at T02 (T01 is reserved for the case file). The T-number is referenced by Case Variables rows whose value comes from this trigger's payload.
|
|
229
|
-
>
|
|
230
|
-
> `Manual` is author shorthand — a manual trigger has **no** `serviceType` in the generated JSON (the on-disk serviceType enum is `None` / `Intsvc.EventTrigger` / `timer`; the SDD's `Intsvc.TimerTrigger` maps to on-disk `timer`; never write `serviceType: "Manual"`).
|
|
231
|
-
|
|
232
|
-
**Configuration column — write user-specified intent only:**
|
|
233
|
-
|
|
234
|
-
| Trigger type | What to write |
|
|
235
|
-
|---|---|
|
|
236
|
-
| Event trigger | The operation in business terms (e.g., `Calendar created`, `Email received`, `Record created`). For tenant case-entity / business data-object starts, preserve the object name in Source (e.g., `expense_requests`) and write the business event in Configuration (e.g., `Record created`). Append a filter expression if the user wants filtering (e.g., `Email received in Inbox; filter: subject contains "URGENT"`). Append a required event-param value only when the user supplies it explicitly (e.g., `Email received in folder "<folder name>"`). |
|
|
237
|
-
| Timer trigger | Cycle or duration (e.g., `every 24 hours`, `daily at 09:00 UTC`). |
|
|
238
|
-
| Manual | `N/A` or omit. |
|
|
239
|
-
|
|
240
|
-
DO NOT include in Configuration:
|
|
241
|
-
- CLI enum values like `CALENDAR_CREATED` or `createdRecord` (the skill resolves these from the IS connector cache at planning time).
|
|
242
|
-
- Default modes like `polling` vs `webhook` (the skill defaults; the user only overrides when they care).
|
|
243
|
-
- Meta notes like `No required event parameters` or `No user filter` (absence is the default; the skill discovers required params at `case spec` time).
|
|
244
|
-
- Connector activity slug, HTTP method, or any spec-discovered detail.
|
|
245
|
-
|
|
246
|
-
> **Tenant object starts are still event triggers.** If the user says a case starts when a tenant case-entity / data-object record is created, author `Intsvc.EventTrigger` with that object name as Source. Do NOT downgrade to `Manual` just because the eval sandbox or current tenant may not have the object provisioned. Planning/implementation preserve unresolved event triggers as placeholders.
|
|
247
|
-
|
|
248
|
-
### Case Exit Conditions
|
|
249
|
-
|
|
250
|
-
> **WHEN ↔ Marks Case Complete pairing is a schema constraint (see Key Rule 4):** `Yes` row MUST use `required-stages-completed` (preferred) or `wait-for-connector`; `No` row MAY use `selected-stage-completed(...)` / `selected-stage-exited(...)` / `wait-for-connector`. Mixing `Yes` with a `selected-*` rule is invalid.
|
|
251
|
-
|
|
252
|
-
| WHEN | IF | THEN | Marks Case Complete | Display Name |
|
|
253
|
-
|------|-----|------|---------------------|--------------|
|
|
254
|
-
| {`required-stages-completed` for Yes; `selected-stage-completed("StageName")` or other rule for No} | {conditionExpression, or "—" if none} | Case exited | {Yes \| No} | {optional label, or "—" → defaults to `Complete Rule {N}` (Marks Complete = Yes) / `Exit Rule {N}` (No)} |
|
|
255
|
-
|
|
256
|
-
> If `WHEN` is `wait-for-connector`, add a **Connector Rule Detail** block under this table (see Key Rule 6) — it binds the IS connector event the rule waits for.
|
|
257
|
-
|
|
258
|
-
### Case Variables
|
|
259
|
-
|
|
260
|
-
> This table holds **only**: `In` / `Out` arguments; trigger-payload `Variable`s (`sourceTriggers` + `sourceFields`); and case-level state read by a condition (`IF`) or consumed in **≥ 2 places**. An input that is simply one upstream task's output is **referenced directly** — whole-value `<- "Stage"."Task".out`, or in-expression `vars.$xref('Stage','Task','out')` — and is **NOT** a row here (the emitting task self-declares the output and is its own producer). Minting a row to relay one task's output into one downstream consumer is the **case-var relay anti-pattern**: declare a row for an output only to rename it, set a custom `Default` / `Type` / `Description`, or expose it as case-level state read in multiple places. Every row's `Category` column is REQUIRED — drives classification at build time. Inference from other columns is no longer supported.
|
|
261
|
-
>
|
|
262
|
-
> For worked patterns by use case (single-trigger, multi-trigger, In / Out / Variable, task-local-only via direct xref), see [`sdd-template-examples.md`](sdd-template-examples.md).
|
|
263
|
-
|
|
264
|
-
| Name | Category | Type | sourceTriggers | sourceFields | Default | Description |
|
|
265
|
-
|------|----------|------|----------------|--------------|---------|-------------|
|
|
266
|
-
| {camelCase name} | {In \| Out \| Variable} | {string \| integer \| float \| double \| boolean \| datetime \| date \| jsonSchema \| file} | {`Variable`: single `T<N>` or CSV when multiple triggers feed the same slot. `In`: optional single `T<N>` selecting the bound trigger (blank = primary trigger; never CSV). Empty for pure state / Out-args} | {single payload path when one trigger; keyed `T<N>: <path>; T<M>: <path>` when multiple triggers; empty on `In` rows} | {default value or empty} | {what this variable represents} |
|
|
267
|
-
|
|
268
|
-
**Category semantics (author-facing summary; canonical definition in [`global-vars/impl-json.md` § Pattern shapes by category](../../references/plugins/variables/global-vars/impl-json.md)):**
|
|
269
|
-
|
|
270
|
-
- **`In`** — formal case argument supplied at case start by an external caller (manual trigger via API) OR initialized from `Default` (event / timer triggers, which have no caller). Works with any trigger type. By default an In-arg binds to the primary trigger (T02); to bind it to a specific trigger, put that trigger's single `T<N>` in `sourceTriggers` (one only, never a CSV). `sourceFields` stays empty for `In` rows. For event-trigger-payload-extraction (where the value comes from the event's payload), use `Variable` with `sourceTriggers` + `sourceFields` (Use Case 2) instead — that's a different operation. **File-type In-args:** the runtime caller must pre-create the JobAttachment (`POST /odata/Attachments`, then `PUT` the bytes to the returned blob URI) and pass the resulting `{ID, FullName, MimeType, Metadata}` record as the In-arg value plus the attachment ID in `StartProcessDto.Attachments[]`. The Maestro Studio Web "Start case" dialog handles this automatically when the user picks a file; programmatic callers must do it themselves.
|
|
271
|
-
- **`Out`** — formal case argument returned to the caller at case end. Value comes from a task's Outputs row that targets this Name (the producer) OR from a `Default` value if no task fires. `sourceTriggers` MUST be empty (direction mismatch — values flow case→caller, not trigger→case).
|
|
272
|
-
- **`Variable`** — case-internal state. May be populated by one trigger's payload (single T-number in `sourceTriggers` + single path in `sourceFields`), by multiple triggers' payloads sharing the same slot (CSV in `sourceTriggers` + keyed `T<N>: <path>` format in `sourceFields`), by a task output (use `->` operator in that task's Outputs table — same Name on both sides drives the wiring), or initialized via `Default` only.
|
|
273
|
-
|
|
274
|
-
**`sourceFields` notation:**
|
|
275
|
-
|
|
276
|
-
- **Single-trigger:** bare payload path. Examples: `response.subject`, `response.user.id`, `Error.code`.
|
|
277
|
-
- **Multi-trigger:** keyed format `T<N>: <path>; T<M>: <path>` — every T-number listed in `sourceTriggers` MUST have a matching path entry in `sourceFields` (strict, no defaults). Example: `T02: response.user; T03: response.initiator`. Same Variable Name maps to different payload fields per trigger; whichever trigger fires writes its extracted value to the shared variable slot.
|
|
278
|
-
|
|
279
|
-
Paths support dot-path nesting (e.g., `response.user.email`); array indexing (`items[0]`) not supported in v1.
|
|
280
|
-
|
|
281
|
-
**Out-arg producer rule (validated at end of Phase 3):**
|
|
282
|
-
|
|
283
|
-
Every `Out` row must have at least one of:
|
|
284
|
-
1. A `Default` value (the fallback returned when no task fires)
|
|
285
|
-
2. A task whose `Outputs` table includes a row that targets this Out-arg's Name via `-> {name}` or `{name} = {expression}`
|
|
286
|
-
|
|
287
|
-
If neither holds, the io-binding validator surfaces the misalignment.
|
|
288
|
-
|
|
289
|
-
**Examples:**
|
|
290
|
-
|
|
291
|
-
| Name | Category | Type | sourceTriggers | sourceFields | Default | Description |
|
|
292
|
-
|------|----------|------|----------------|--------------|---------|-------------|
|
|
293
|
-
| caseStatus | Variable | string | | | "Open" | Pure case state, initialized at case start |
|
|
294
|
-
| subject | Variable | string | T02 | response.subject | | Populated by event trigger payload at trigger fire |
|
|
295
|
-
| caseStarter | Variable | string | T02, T03 | T02: response.user; T03: response.initiator | | Shared slot — whichever trigger fires populates it |
|
|
296
|
-
| applicantName | In | string | | | | Formal In-arg supplied by API caller; blank sourceTriggers → bound to primary trigger |
|
|
297
|
-
| reviewerNote | In | string | T03 | | | In-arg bound to the T03 trigger (single T-number; sourceFields stays empty) |
|
|
298
|
-
| finalDecision | Out | string | | | "Pending" | Out-arg; producer is "Approve Decision" task; "Pending" returned if no task fires |
|
|
299
|
-
| reviewCount | Variable | integer | | | 0 | Counter incremented by tasks via `=` operator |
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## Section 2: Stages & Tasks
|
|
304
|
-
|
|
305
|
-
**Purpose:** The case plan — every stage as a self-contained subsection with its own entry/exit conditions, SLA, and task definitions with inline I/O bindings. Stages use the single node type `case-management:Stage`; a secondary stage is distinguished by `data.stageType: "secondary"` (a primary stage omits `stageType`).
|
|
306
|
-
|
|
307
|
-
**I/O bindings — how the Inputs / Outputs tables drive task wiring:**
|
|
308
|
-
|
|
309
|
-
- **Inputs `Binding` column** = the value that feeds this task input at runtime. Accepts a case-variable reference (`=vars.X` — top-level only, no dotted access), a JS expression for dotted/metadata/computed forms (`=js:vars.X.Y`, `=js:metadata.X`, `=js:(...)`), or a literal value (`"50"`, `0`, `true`). The skill translates SDD `=metadata.X` to `=js:metadata.X` at impl time; for dotted case-var access, write `=js:vars.X.Y` directly per [bindings-and-expressions.md § Two evaluator paths](../../references/bindings-and-expressions.md#two-evaluator-paths).
|
|
310
|
-
- **Outputs `Binding / Value` column** uses one of two operators:
|
|
311
|
-
- **`-> caseVar`** (extract): the value at the runtime path in the `Field` column is extracted into the named case variable. `Field` is the **full runtime path relative to the task's root scope** — write `response.status` for a connector payload field, `Action` for an action task's top-level output, `Error.code` for a nested error sub-field, etc. The skill emits `source: "=<Field>"` verbatim; no envelope inference.
|
|
312
|
-
- **`caseVar = <expression>`** (set / compute / copy): the case variable is assigned the result of the expression at task completion. The `Field` column is `—` for `=` rows. Expression can be a literal (`"InReview"`, `5`), a computed value (`=js:(vars.count + 1)`), a top-level case-var copy (`=vars.X`), or a sub-field copy via JS eval (`=js:vars.X.Y`).
|
|
313
|
-
- **In-expression upstream reference (`vars.$xref(...)`)** — inside ANY `=js:` expression (a composite input payload, a computed `=` output, an IF `conditionExpression`, an SLA expression), reference another task's output directly with `vars.$xref('Stage Name','Task Name','output_name')` instead of routing it through a "middle" case variable. Single quotes only. The skill resolves it to the source output's runtime reference ID at build time. Use this whenever a case variable would exist only to carry one task's output into a downstream expression. When the output IS the entire input value (not part of a larger expression), use the whole-value `<- "Stage"."Task".output` form instead. See [bindings-and-expressions.md § In-expression references](../../references/bindings-and-expressions.md#in-expression-references-varsxref).
|
|
314
|
-
|
|
315
|
-
- **Case identity — bind `caseId` to `=metadata.ExternalId`.** The case external id is platform-generated (constant prefix or external expression) and exposed as `metadata.ExternalId`; it is NOT a task output. Every task input named `caseId` binds to `=metadata.ExternalId`. **Never** author a `-> caseId` extraction on a workflow whose result has no `caseId` key — it resolves to runtime null. (`Action` is the conventional top-level output field of an `action` task — its button result — captured via `Action -> <decisionVar>`.)
|
|
316
|
-
|
|
317
|
-
**Authoring rules:**
|
|
318
|
-
|
|
319
|
-
- Every target case variable on the left side of `->` or `=` MUST appear in the Case Variables table. The Outputs table doesn't declare new variables — it wires existing ones.
|
|
320
|
-
- Per task: each target case variable appears in at most one Outputs row. No double-binding.
|
|
321
|
-
- `->` rows require a non-empty `Field` column containing the full runtime path. `=` rows have `Field` as `—`.
|
|
322
|
-
|
|
323
|
-
**Examples (in any task's Outputs table):**
|
|
324
|
-
|
|
325
|
-
```
|
|
326
|
-
| Field | Binding / Value |
|
|
327
|
-
|------------------|-------------------------------------------|
|
|
328
|
-
| response.status | -> sendStatus | ← connector payload field → vars.sendStatus
|
|
329
|
-
| Error | -> sendError | ← top-level Error sibling → vars.sendError
|
|
330
|
-
| Action | -> userDecision | ← action task top-level output → vars.userDecision
|
|
331
|
-
| — | caseStatus = "InReview" | ← set caseStatus literally
|
|
332
|
-
| — | reviewCount = =js:vars.reviewCount + 1 | ← increment counter
|
|
333
|
-
| — | summary = =vars.response.message.text | ← copy another variable's sub-field
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
The runtime engine resolves the binding when the task completes, writing the resolved value into the named case variable's slot.
|
|
337
|
-
|
|
338
|
-
> Repeat the following structure for each stage in the case plan. Number stages sequentially.
|
|
339
|
-
|
|
340
|
-
---
|
|
341
|
-
|
|
342
|
-
### Stage {N}: {Stage Name}
|
|
343
|
-
|
|
344
|
-
> **Heading form:** a **primary** stage uses `### Stage {N}: {Stage Name}` (N = main-flow sequence number); a **secondary** stage uses `### Secondary Stage: {Stage Name}` instead (no number). Both render a `case-management:Stage` node — the kind is set by the `**Stage Kind:**` field below.
|
|
345
|
-
|
|
346
|
-
**Type:** Stage
|
|
347
|
-
**Stage Kind:** {primary \| secondary} _(secondary stages use the `### Secondary Stage:` heading AND set `secondary`; primary stages use `### Stage {N}:` and OMIT this line — default = primary)_
|
|
348
|
-
**Design Rationale:** {Why this stage is primary/secondary and why its entry/exit behavior fits. For a global-event secondary stage, name the event and explain that one interrupting entry replaces per-primary-stage tasks/exits.}
|
|
349
|
-
**Description:** {Prose description of what this stage accomplishes in the case lifecycle}
|
|
350
|
-
**Required for Case Completion:** {Yes \| No}
|
|
351
|
-
**Interrupting:** Yes _(secondary stages only — i.e. Stage Kind: secondary; omit for primary)_
|
|
352
|
-
|
|
353
|
-
#### Stage Entry Conditions
|
|
354
|
-
|
|
355
|
-
> **Valid WHEN rule types for stage entry (strict subset of Key Rule 3):** `case-entered` (first stage of the case — no target), `selected-stage-completed("StageName")`, `selected-stage-exited("StageName")`, `user-selected-stage` (target of an upstream `wait-for-user` exit — no target; stage opts into the picker by declaring this rule), `wait-for-connector` (external/global event interrupt), `sla-status-change("<SLA target>","<SLA Title>")` for a breach / `sla-status-change("<SLA target>","<SLA Title>","<At-Risk Escalation Display Name>")` for at-risk (the **`enter-stage`** SLA response — see the reference contract below). Other rule types from Key Rule 3 are NOT valid here. A `start-task` response does NOT belong in this table: it is a Task Entry Condition on the follow-up task.
|
|
356
|
-
>
|
|
357
|
-
> **Interrupting column:** `Yes` lets the condition fire while another stage is active and interrupt it. Use `Yes` on every secondary-stage entry row, with one carve-out: an `sla-status-change` row whose response is parallel oversight (the breached work keeps running) is `No`, and its lane still stays secondary with `Required for case completion: No`. Otherwise use `No` only for normal entry on regular stages; if the work should not interrupt and is not that SLA carve-out, it is not a secondary stage.
|
|
358
|
-
>
|
|
359
|
-
> Each row is a separate entry condition. List multiple rows when a stage can be entered through more than one path (e.g., normal completion of an upstream stage AND an interrupting connector event).
|
|
360
|
-
|
|
361
|
-
| WHEN | IF | Interrupting | Display Name |
|
|
362
|
-
|------|-----|-------------|--------------|
|
|
363
|
-
| {one of: `case-entered` \| `selected-stage-completed("StageName")` \| `selected-stage-exited("StageName")` \| `user-selected-stage` \| `wait-for-connector` \| `sla-status-change("<SLA target>","<SLA Title>")` \| `sla-status-change("<SLA target>","<SLA Title>","<At-Risk Escalation Display Name>")`} | {conditionExpression, or "—" if none} | {Yes \| No} | {optional label, or "—" → defaults to `Entry Rule {N}`} |
|
|
364
|
-
|
|
365
|
-
> If `WHEN` is `wait-for-connector`, add a **Connector Rule Detail** block under this table (see Key Rule 6).
|
|
366
|
-
>
|
|
367
|
-
> A global `wait-for-connector` / graph-changing `sla-status-change` entry on an interrupting secondary stage applies regardless of which primary stage is active. Do not repeat the event as a task or exit rule on every primary stage. An `sla-status-change` row here is always the `enter-stage` response — it routes the case to *this* stage; a non-interrupting (parallel oversight) response uses `Interrupting: No`. A `start-task` response never appears here.
|
|
368
|
-
>
|
|
369
|
-
> **`sla-status-change` reference contract.** Every arg used must be declared in this SDD — the rule has no duration of its own. `<SLA target>` is `root` (case-level SLA; reserved token) or the SLA-owning stage name, and scopes the lookups to that target's tables: `<SLA Title>` is its `SLA Title` cell (or a Variable SLA Rules `Display Name`). **Arg count carries the status:** two args is a **Breached** rule — a breach references the SLA alone and needs no escalation to exist; three args is an **At-Risk** rule, where `<At-Risk Escalation Display Name>` is one of that same SLA's escalation `Display Name`s with At-Risk status. Use one row per status. Phase 1 resolves the SLA to `slaId`, and the escalation (at-risk only) to `escalationId`; a reference that does not resolve is a blocking error. Adding an escalation to a breach row silently converts it to at-risk — never do it to make a reference "complete". Examples: `sla-status-change("root","Application SLA")` (breach), `sla-status-change("root","Application SLA","Application SLA at risk")` (at-risk).
|
|
370
|
-
|
|
371
|
-
#### Stage Exit Conditions
|
|
372
|
-
|
|
373
|
-
> **WHEN ↔ Marks Stage Complete pairing is a schema constraint (see Key Rule 4):** `Yes` row MUST use `required-tasks-completed` (or `required-stages-completed`); `No` row MAY use `selected-tasks-completed(...)`. Mixing is invalid.
|
|
374
|
-
> Completion (`Yes`) and routing (`No`) rows share this one table. **Regular stage-to-stage routing is expressed by the destination stages' Entry Conditions** (`selected-stage-completed("This Stage")` / `selected-stage-exited("This Stage")`) — one stage can fan out to N stages, each declaring it as their entry trigger. `return-to-origin` returns to the origin stage automatically.
|
|
375
|
-
> **Canonical return shape:** `return-to-origin` requires `required-tasks-completed` (or `wait-for-connector`) + `Marks Stage Complete: Yes`. It is not a `No` + `selected-tasks-completed` routing row.
|
|
376
|
-
> **Exception carve-out:** to route this stage INTO a decision/signal-routed exception lane, add a gated divert row here — `Marks Stage Complete: No`, `selected-tasks-completed("<decider>")`, `IF =js:(<signal> === <exception-value>)`, `exit-only`, with `exitToStageId` → the secondary stage — AND gate this stage's `Yes` completion row with the inverse `IF`. The lane returns via `return-to-origin`. Omitting the divert row → dual-fire or deadlock. See sdd-generation-rules § Logical integrity step 5.
|
|
377
|
-
|
|
378
|
-
| WHEN | IF | Exit Type | Marks Stage Complete | Display Name |
|
|
379
|
-
|------|-----|-----------|---------------------|--------------|
|
|
380
|
-
| {`required-tasks-completed` or `wait-for-connector` for Yes; `selected-tasks-completed("TaskName")` or `wait-for-connector` for No} | {conditionExpression, or "—" if none} | {exit-only \| return-to-origin \| wait-for-user} | {Yes \| No} | {optional label, or "—" → defaults to `Complete Rule {N}` (Marks Complete = Yes) / `Exit Rule {N}` (No)} |
|
|
381
|
-
|
|
382
|
-
> If `WHEN` is `wait-for-connector`, add a **Connector Rule Detail** block under this table (see Key Rule 6).
|
|
383
|
-
|
|
384
|
-
#### Stage SLA
|
|
385
|
-
|
|
386
|
-
> Stage SLA supports the same conditional + default `slaRules[]` model as the case root. For `condition-based`, keep the default row below and add one or more Stage Variable SLA Rules before it.
|
|
387
|
-
|
|
388
|
-
**Design Rationale:** {Why this target, duration, at-risk threshold, recipients, and breach behavior fit the stage requirement; name any escalation stage entered through `sla-status-change`. If the response is local to this stage (`start-task`), say so and name the follow-up task that carries the rule — a task entry has no interrupting decision.}
|
|
389
|
-
**SLA Type:** {time-based | condition-based}
|
|
390
|
-
**SLA Title:** {non-empty stage-unique title, no `:`}
|
|
391
|
-
|
|
392
|
-
| SLA | Unit | At-Risk | At-Risk Action | At-Risk Display Name | Breach Action | Breach Display Name |
|
|
393
|
-
|-----|------|---------|----------------|----------------------|---------------|---------------------|
|
|
394
|
-
| {count} | {min \| h \| d \| w \| m} | {percentage}% | {Notify: recipient or specific action} | {escalation title, stage-unique, no `:`} | {Notify: recipient or specific action} | {escalation title, stage-unique, no `:`} |
|
|
395
|
-
|
|
396
|
-
##### Stage Variable SLA Rules
|
|
397
|
-
|
|
398
|
-
> Include only for a condition-based Stage SLA. Each row is written before that stage's trailing `=js:true` default.
|
|
399
|
-
|
|
400
|
-
| Expression | SLA | Unit | Display Name |
|
|
401
|
-
|------------|-----|------|--------------|
|
|
402
|
-
| {conditionExpression evaluated against case variables} | {count} | {min \| h \| d \| w \| m} | {non-empty stage-unique title without `:`} |
|
|
403
|
-
|
|
404
|
-
#### Tasks
|
|
405
|
-
|
|
406
|
-
> Tasks are listed in the order provided by the source spec / interview answers. Do not add, split, merge, or rename tasks; do not infer new tasks from context.
|
|
407
|
-
|
|
408
|
-
| # | Task Name | Type | Activation Mode | Starts When | Required | Run Only Once | Persona | SLA |
|
|
409
|
-
|---|-----------|------|-----------------|-------------|----------|---------------|---------|-----|
|
|
410
|
-
| 1 | {task name} | {action \| process \| agent \| rpa \| api-workflow \| wait-for-timer \| wait-for-connector \| execute-connector-activity \| case-management} | {sequential \| parallel \| parallel-after-predecessor \| event-triggered \| adhoc \| fan-in \| conditional-gate} | {e.g. "sequential group: A → B → C", "stage enters", "after A+B", "connector event"} | {Yes \| No} | {Yes \| No} | {persona name or "—"} | {count unit or "—" (only for action tasks)} |
|
|
411
|
-
|
|
412
|
-
> After the summary table, provide a detailed subsection for each task.
|
|
413
|
-
> Primary-stage task headings use `##### Task {N}.{M}: {Task Name}`. Secondary-stage task headings use `##### Task S{K}.{M}: {Task Name}` where `K` is the secondary-stage order. Do not use lettered prefixes such as `R.1`, `W.1`, `CC.1`, or `ESC.1`.
|
|
414
|
-
|
|
415
|
-
---
|
|
416
|
-
|
|
417
|
-
##### Task {N}.{M}: {Task Name}
|
|
418
|
-
|
|
419
|
-
**Type:** {exact task type from schema}
|
|
420
|
-
**Activation Mode:** {sequential | parallel | parallel-after-predecessor | event-triggered | adhoc | fan-in | conditional-gate}
|
|
421
|
-
**Design Rationale:** {Why this task type fits the actor/work and why this activation mode fits. For a sequential task, name the stated order/dependency; for a parallel task, state why it is independent.}
|
|
422
|
-
**Description:** {What this task does and why it exists in the case plan}
|
|
423
|
-
|
|
424
|
-
**Entry Condition:**
|
|
425
|
-
|
|
426
|
-
> **Valid WHEN rule types for task entry (strict subset of Key Rule 3):** `current-stage-entered` (fires when the containing stage is entered; use for ungated event/condition-driven tasks, not for the first task in a sequential run), `selected-tasks-completed("TaskA", "TaskB")` (explicit sibling gate, fan-in, branch convergence, or non-immediate dependency), `wait-for-connector` (waits for a connector event), `adhoc` (user-triggered from the case app — task does not auto-start; task-entry only; set `Required: No`; does not determine task type), `runs-sequentially` (sequential ordering within the stage; parallel task sets remain allowed, and the entry rule—not lane placement—carries the sequencing intent), `sla-status-change("<SLA target>","<SLA Title>")` for a breach / `sla-status-change("<SLA target>","<SLA Title>","<At-Risk Escalation Display Name>")` for at-risk (the **`start-task` SLA response** — this task fires on the SLA event itself; reference the containing stage's own SLA, or `root` for a case-scoped response). Other rule types from Key Rule 3 are NOT valid here.
|
|
427
|
-
>
|
|
428
|
-
> Each row is a separate entry condition. List multiple rows when a task can be entered through more than one path. Author a `current-stage-entered` row for any ungated task — including connector tasks (`execute-connector-activity`, `wait-for-connector`) — that should start when its stage is entered.
|
|
429
|
-
>
|
|
430
|
-
> **Sequential normalization:** when the requirement states order/dependency (`then`, `after`, `before`, `in order`, or an upstream prerequisite), write `runs-sequentially` as the only Entry Condition row on every task in that ordered task-set run, including the first task. Do not turn an explicitly ordered run into parallel stage-start tasks merely because no data binding is present. Use `current-stage-entered` in parallel only for explicitly independent stage-start work. When multiple independent tasks start after the same immediate predecessor, place them in the same next task set, mark `Activation Mode: parallel-after-predecessor`, and give each `runs-sequentially` instead of duplicate `selected-tasks-completed("<previous>")` entries. Use `selected-tasks-completed` only for fan-in, branch convergence, condition-result routing, or a non-immediate dependency. It must select only non-adhoc sibling tasks in the same stage.
|
|
431
|
-
|
|
432
|
-
| WHEN | IF | Display Name |
|
|
433
|
-
|------|-----|--------------|
|
|
434
|
-
| {one of: `current-stage-entered` \| `selected-tasks-completed("TaskA", "TaskB")` \| `wait-for-connector` \| `adhoc` \| `runs-sequentially` \| `sla-status-change("<SLA target>","<SLA Title>")` \| `sla-status-change("<SLA target>","<SLA Title>","<At-Risk Escalation Display Name>")`} | {conditionExpression, or "—" if none} | {optional label, or "—" → defaults to `Entry Rule {N}`} |
|
|
435
|
-
|
|
436
|
-
> If `WHEN` is `wait-for-connector`, add a **Connector Rule Detail** block under this table (see Key Rule 6).
|
|
437
|
-
|
|
438
|
-
**Task envelope**
|
|
439
|
-
|
|
440
|
-
> Render the heading above exactly, with no colon. Every task includes this block after the Entry Condition table.
|
|
441
|
-
|
|
442
|
-
| Required | Run Only Once | Skip Condition |
|
|
443
|
-
|----------|---------------|----------------|
|
|
444
|
-
| {Yes \| No} | {Yes \| No} | {`=js:` expression that skips the task when truthy, or `—`} |
|
|
445
|
-
|
|
446
|
-
> `Required: Yes` means the task counts toward the stage's `required-tasks-completed` exit — **at least one task per stage MUST be `Required: Yes`**, or the stage can never complete. `Run Only Once` is a re-entry decision, not a task-type default: use `No` for request/review/decision/validation tasks that must rerun after corrections or resubmission; use `Yes` only for immutable setup or a documented re-evaluate-existing-fact return. `Skip Condition` is the task-level `skipCondition` envelope field (sibling of `data`); use it for "run this task only when X" gating that is not expressible as a task-entry `IF`.
|
|
447
|
-
|
|
448
|
-
---
|
|
449
|
-
|
|
450
|
-
###### Action Task Detail (type: `action`)
|
|
451
|
-
|
|
452
|
-
> Use this block for every task of type `action`. The action plugin authors action tasks ONLY from a deployed Action App registered in `action-apps-index.json`; inline JSON-Schema HITL forms are not authored by the skill (an unresolved app falls back to a Rule-8 placeholder).
|
|
453
|
-
|
|
454
|
-
**HITL Implementation:** Action App: {the concrete intended `deploymentTitle`. REQUIRED and NEVER `<UNRESOLVED>`: use the selected registry entry's canonical title when resolved; otherwise retain the user-requested title so Phase 1 can repeat discovery from this SDD alone.}
|
|
455
|
-
**Action App ID:** {`actionAppId` — concrete deployment id, or `<UNRESOLVED>` when no live app was selected}
|
|
456
|
-
**Deployment Folder:** {`deploymentFolder.fullyQualifiedName`, or `<UNRESOLVED>` when Action App ID is unresolved}
|
|
457
|
-
**actionType:** {the dispatch code the app's code-behind switches on — e.g., `GRNConfirmation`, `ApLeadApproval`. **A recognised code is REQUIRED; passing a human display name instead fails result mapping at runtime.** `—` only when the app is not a code-switched app.}
|
|
458
|
-
**Recipient:** {typed prefix only: `Role:<name>` \| `User:<uuid>` \| `UserGroup:<uuid>` \| `Email:<addr>` \| `Expression:=vars.<id>`}
|
|
459
|
-
**Priority:** {Low \| Medium \| High \| Critical} · **Task Title:** {one-line Action Center prompt} · **Labels:** {csv or `—`}
|
|
460
|
-
|
|
461
|
-
> The Action App title carries portable intent; `Action App ID` carries resolution status. A concrete ID plus the exact folder locates the deployed app, while an unresolved ID plus the intended title lets Phase 1 repeat discovery without `tasks/registry-resolved.json`. `actionType` is the human-decision app's behaviour selector — treat it as a closed enum sourced from the app, not a free-text label.
|
|
462
|
-
|
|
463
|
-
**Input Schema:**
|
|
464
|
-
|
|
465
|
-
| Field | Type | Binding | Required |
|
|
466
|
-
|-------|------|---------|----------|
|
|
467
|
-
| {field name} | {String \| Number \| Boolean \| Date \| ...} | {case variable} | {Yes \| No} |
|
|
468
|
-
|
|
469
|
-
**Output Schema:**
|
|
470
|
-
|
|
471
|
-
| Field | Binding / Value |
|
|
472
|
-
|-------|------------------|
|
|
473
|
-
| {schema field name} | -> {case variable that receives this value} |
|
|
474
|
-
| — | {case variable} = {literal, =js:expression, or =js:vars.X.Y for dotted access} |
|
|
475
|
-
|
|
476
|
-
> The `Field` column is the schema field name from the action's response (or `—` for `=` rows). The `Binding / Value` column uses `-> caseVar` for extraction or `caseVar = expression` for set / compute / copy. Target case variable MUST exist in Case Variables table.
|
|
477
|
-
|
|
478
|
-
**Actions:**
|
|
479
|
-
|
|
480
|
-
| Button | Maps To | Behavior |
|
|
481
|
-
|--------|---------|----------|
|
|
482
|
-
| {button label, e.g., "Approve"} | {variable = value, e.g., reviewDecision = "Approved"} | {Complete task \| Complete task and set variables \| ...} |
|
|
483
|
-
|
|
484
|
-
---
|
|
485
|
-
|
|
486
|
-
###### Connector Task Detail (type: `wait-for-connector` or `execute-connector-activity`)
|
|
487
|
-
|
|
488
|
-
> Use this block for connector-based tasks. Connection + Auth are **tenant-authoritative** and come from the Integration Service CLI cache, not from the user spec:
|
|
489
|
-
> - **Connection** ← `~/.uipath/cache/integrationservice/{connectorKey}/connections.json` — the `name` (and optional `id`) of the default or first enabled entry.
|
|
490
|
-
> - **Auth Method** ← `~/.uipath/cache/integrationservice/connectors.json` — the connector's `defaultAuthenticationType`.
|
|
491
|
-
> - **Operation** ← `~/.uipath/cache/integrationservice/{connectorKey}/activities.json` for the display/operation name; `~/.uip/case-resources/typecache-activities-index.json` (or `typecache-triggers-index.json` for events) for I/O schemas — each is a flat JSON array of activities, filter by connector + operation name.
|
|
492
|
-
> - **Account/Endpoint is not stored** in the compact cache. Render `—` unless the user spec supplies it explicitly.
|
|
493
|
-
> If a cache is unavailable or no enabled connection is found, render `—` rather than inventing values.
|
|
494
|
-
|
|
495
|
-
**Connector:** {connector name from Integration Service, e.g., "Salesforce"} · **Connector Key:** {`connectorKey`, e.g. `salesforce`}
|
|
496
|
-
**Connection:** {connection instance `name` from `connections.json`, e.g., "Salesforce-Prod" — or "Tenant default" when `isDefault: true`} · **Connection ID:** {`connectionId` — concrete, or `<UNRESOLVED>`}
|
|
497
|
-
**Activity Type ID:** {`activityTypeId` from the typecache} · **Service Type:** {`serviceType`, e.g. `Intsvc.WaitForEvent`}
|
|
498
|
-
**Auth Method:** {`defaultAuthenticationType` from `connectors.json`, e.g., OAuth2 \| API Key \| Basic \| Service Account}
|
|
499
|
-
**Account / Endpoint:** {explicit endpoint if supplied — or "—" (not stored in the CLI cache)}
|
|
500
|
-
**Operation:** {`displayName` / `operation` from `activities.json`}
|
|
501
|
-
**Trigger / Event:** {trigger display name for `wait-for-connector`, or "—" for `execute-connector-activity`}
|
|
502
|
-
|
|
503
|
-
> `Connection ID` + `Activity Type ID` are the concrete identities Phase 1 binds — without them the connector cannot resolve at build time; surface them here so the SDD is replicable standalone (missing either → `<UNRESOLVED>` + a high review item).
|
|
504
|
-
|
|
505
|
-
**Inputs:**
|
|
506
|
-
|
|
507
|
-
| Field | Type | Binding |
|
|
508
|
-
|-------|------|---------|
|
|
509
|
-
| {field name} | {type} | {`=vars.X`, `=metadata.X`, `=js:(...)`, or literal} |
|
|
510
|
-
|
|
511
|
-
**Outputs:**
|
|
512
|
-
|
|
513
|
-
| Field | Binding / Value |
|
|
514
|
-
|-------|------------------|
|
|
515
|
-
| {schema field name} | -> {case variable that receives this value} |
|
|
516
|
-
| — | {case variable} = {literal, =js:expression, or =js:vars.X.Y for dotted access} |
|
|
517
|
-
|
|
518
|
-
> Target case variable MUST exist in Case Variables table. See Section 2 I/O bindings explainer for `->` vs `=` operator semantics.
|
|
519
|
-
|
|
520
|
-
---
|
|
521
|
-
|
|
522
|
-
###### Timer Task Detail (type: `wait-for-timer`)
|
|
523
|
-
|
|
524
|
-
> Use this block for timer-based wait tasks.
|
|
525
|
-
|
|
526
|
-
**Timer:** {timeDuration \| timeDate \| timeCycle}
|
|
527
|
-
**Value:** {ISO 8601 expression, e.g., "PT24H" for 24 hours, "P3D" for 3 days, or a variable expression}
|
|
528
|
-
|
|
529
|
-
---
|
|
530
|
-
|
|
531
|
-
###### Child Case Task Detail (type: `case-management`)
|
|
532
|
-
|
|
533
|
-
> Use this block for tasks that spawn a child case.
|
|
534
|
-
|
|
535
|
-
**Child Case:** {the concrete intended child-case resource `name`. REQUIRED and NEVER `<UNRESOLVED>`: use the selected registry entry's canonical name when resolved; otherwise retain the user-requested name so Phase 1 can repeat discovery from this SDD alone.}
|
|
536
|
-
**Folder Path:** {resolved `folders[0].fullyQualifiedName`, or `<UNRESOLVED>` when no live child case was selected}
|
|
537
|
-
**Resource Identity:** {resolved `entityKey`, or `<UNRESOLVED>`; this cell, not `Child Case`, determines whether registry resolution succeeded}
|
|
538
|
-
**Data Passed (parent -> child):**
|
|
539
|
-
|
|
540
|
-
| Parent Variable | Child Variable |
|
|
541
|
-
|----------------|----------------|
|
|
542
|
-
| {parent case variable} | {child case variable} |
|
|
543
|
-
|
|
544
|
-
**Wait for Completion:** {Yes \| No}
|
|
545
|
-
|
|
546
|
-
**Data Returned (child -> parent):**
|
|
547
|
-
|
|
548
|
-
| Child Variable | Parent Variable |
|
|
549
|
-
|----------------|----------------|
|
|
550
|
-
| {child case variable} | {parent case variable} |
|
|
551
|
-
|
|
552
|
-
---
|
|
553
|
-
|
|
554
|
-
###### Process / Agent / RPA / API Workflow Task Detail
|
|
555
|
-
|
|
556
|
-
> Use this block for `process`, `agent`, `rpa`, and `api-workflow` tasks. These tasks do NOT support SLA — SLA column in the task summary should be "—".
|
|
557
|
-
|
|
558
|
-
**Resolved Resource:** {the concrete intended resource `name` — e.g. `AgedInvoiceMockIntegrationApi` (api-workflow), `InvoiceTriageAgent` (agent), `AgedInvoice_StatementReconciliation` (rpa). REQUIRED and NEVER `<UNRESOLVED>`: use the selected registry entry's canonical name when resolved; otherwise retain the user-requested name so Phase 1 can re-run discovery from this SDD alone.}
|
|
559
|
-
**Folder Path:** {resolved `folders[0].fullyQualifiedName` — the `folderPath`-binding default — or `<UNRESOLVED>` when no live resource was selected. A concrete value MUST be the resource's exact folder (never a parent path, or the job faults at runtime).}
|
|
560
|
-
**Resource Identity:** {REQUIRED resolution status: resolved id (+version) — `apiWorkflowId` / `agentId` / `processOrchestrationId` — or `<UNRESOLVED>`. This cell, not `Resolved Resource`, determines whether registry resolution succeeded. Also carried in `tasks/registry-resolved.json` when that optional cache exists.}
|
|
561
|
-
**Binding Sub-Type:** {`Api` (api-workflow) \| `Agent` (agent) \| `ProcessOrchestration` (process) \| `—` (rpa) — the `resourceSubType` on the name/folderPath bindings. Omitting it makes Studio Web report the resource as not found.}
|
|
562
|
-
**Dispatch / Operation:** {when the resource is a shared façade dispatched by a parameter, name the selector and value — e.g. `requestSource = "RegisterCaseShell"`. Render `—` for single-purpose resources. The selector itself is also an Inputs row (a literal binding).}
|
|
563
|
-
|
|
564
|
-
> `Resolved Resource` carries portable intent; `Resource Identity` carries resolution status. A concrete identity plus the exact folder makes the selected deployment replicable, while an unresolved identity plus the intended name lets Phase 1 repeat discovery on another machine without `tasks/registry-resolved.json`. When one façade resource (e.g. a generic mock-integration API, or a code-switched action app) backs many tasks, the **Dispatch / Operation** value is what distinguishes their behaviour — capture it explicitly, not just as an opaque input.
|
|
565
|
-
|
|
566
|
-
**Inputs:**
|
|
567
|
-
|
|
568
|
-
| Field | Type | Binding |
|
|
569
|
-
|-------|------|---------|
|
|
570
|
-
| {input argument name} | {type} | {`=vars.X`, `=metadata.X`, `=js:(...)`, or literal} |
|
|
571
|
-
|
|
572
|
-
**Outputs:**
|
|
573
|
-
|
|
574
|
-
| Field | Binding / Value |
|
|
575
|
-
|-------|------------------|
|
|
576
|
-
| {output argument name} | -> {case variable that receives this value} |
|
|
577
|
-
| — | {case variable} = {literal, =js:expression, or =js:vars.X.Y for dotted access} |
|
|
578
|
-
|
|
579
|
-
> Target case variable MUST exist in Case Variables table. See Section 2 I/O bindings explainer for `->` vs `=` operator semantics.
|
|
580
|
-
|
|
581
|
-
> **I/O completeness (resolved resources).** Once this task binds a deployed resource, every **required** input the resource declares MUST appear as an Inputs row with a value (or `<UNRESOLVED>` + a high review item), and every `-> caseVar` output `Field` MUST be a field the resource actually emits. **An input fed by an upstream task's output is bound directly — `<- "Stage"."Task".out` (whole value) or `vars.$xref('Stage','Task','out')` (inside a `=js:` expression) — and is NOT declared as a Case Variable.** Declare a Case Variable only to rename, default, retype, or expose case-level state.
|
|
582
|
-
|
|
583
|
-
---
|
|
584
|
-
|
|
585
|
-
## Section 3: Personas & App Views
|
|
586
|
-
|
|
587
|
-
**Purpose:** Who interacts with the case and through what interfaces. Maps personas to stage scope and permissions, and defines Process App views.
|
|
588
|
-
|
|
589
|
-
### Personas
|
|
590
|
-
|
|
591
|
-
| Persona | Stage Scope | Permissions | Description |
|
|
592
|
-
|---------|-------------|-------------|-------------|
|
|
593
|
-
| {persona name} | {comma-separated stage names, or "All"} | {comma-separated permission list, e.g., "View, Act, Reassign"} | {description of this persona's role in the process} |
|
|
594
|
-
|
|
595
|
-
### Process App Views
|
|
596
|
-
|
|
597
|
-
> Define the views available in the Case App / Process App. Include case list and case detail views at minimum.
|
|
598
|
-
|
|
599
|
-
| App | View | Persona | Purpose | Key Components |
|
|
600
|
-
|-----|------|---------|---------|----------------|
|
|
601
|
-
| {app name} | {view name, e.g., "Case List", "Case Detail", "Dashboard"} | {persona who uses this view} | {what this view enables} | {key UI components: columns, filters, sections, charts} |
|
|
602
|
-
|
|
603
|
-
---
|
|
604
|
-
|
|
605
|
-
## Section 4: Integrations
|
|
606
|
-
|
|
607
|
-
**Purpose:** The complete inventory of every intended or deployed resource and external system the case binds — **one subsection per resource family**, so the full integration/resource footprint is visible and replicable from the SDD alone. Render only the subsections whose task type appears in the case; for a family with no tasks, either omit the subsection or render the heading with `> None.`. Every runnable resource row always carries its concrete intended **name**; its **folder** and **resource id** are concrete when resolved and `<UNRESOLVED>` otherwise (mirrors the per-task `Resolved Resource` / `Folder Path` / `Resource Identity` cells in Section 2 — this section is the de-duplicated roll-up).
|
|
608
|
-
|
|
609
|
-
### Integration Service Connectors
|
|
610
|
-
|
|
611
|
-
> For `execute-connector-activity` and `wait-for-connector` tasks. `> None.` when the case has neither.
|
|
612
|
-
|
|
613
|
-
| Connector | Connector Key | System | Connection (ID) | Auth Method | Operations Used | Used By Tasks |
|
|
614
|
-
|-----------|---------------|--------|-----------------|-------------|-----------------|---------------|
|
|
615
|
-
| {connector name} | {connectorKey} | {target system} | {connection name (connectionId)} | {OAuth2 \| API Key \| Basic \| Service Account \| ...} | {comma-separated operation names} | {comma-separated task names} |
|
|
616
|
-
|
|
617
|
-
> For each connector, provide operation detail. If CLI registry data is available, include actual I/O fields from the registry.
|
|
618
|
-
|
|
619
|
-
#### {Connector Name}
|
|
620
|
-
|
|
621
|
-
**Operations:**
|
|
622
|
-
|
|
623
|
-
| Operation | Activity Type ID | Method | Input Fields | Output Fields |
|
|
624
|
-
|-----------|------------------|--------|-------------|---------------|
|
|
625
|
-
| {operation name} | {activityTypeId} | {GET \| POST \| PUT \| DELETE \| PATCH \| EVENT} | {field: type, ...} | {field: type, ...} |
|
|
626
|
-
|
|
627
|
-
### API Workflows
|
|
628
|
-
|
|
629
|
-
> For `api-workflow` tasks. One row per **distinct** workflow (de-duplicate across tasks).
|
|
630
|
-
|
|
631
|
-
| Workflow | Folder | Resource ID (+version) | Inputs → Outputs | Used By Tasks |
|
|
632
|
-
|----------|--------|------------------------|------------------|---------------|
|
|
633
|
-
| {workflow name} | {folders[0].fullyQualifiedName} | {apiWorkflowId (+version)} | {in fields → out fields} | {comma-separated task names} |
|
|
634
|
-
|
|
635
|
-
> **Shared-façade note:** when one workflow backs multiple tasks via a dispatch parameter, list the distinct selector values in the `Used By Tasks` cell, e.g. `Start case (requestSource=StartAgedInvoiceCase), Register shell (requestSource=RegisterCaseShell)`.
|
|
636
|
-
|
|
637
|
-
### Agents
|
|
638
|
-
|
|
639
|
-
> First-class UiPath `agent` tasks (NOT externally-hosted agents — those go under **External Agents** below). One row per distinct agent.
|
|
640
|
-
|
|
641
|
-
| Agent | Folder | Resource ID (+version) | Inputs → Outputs (or shared contract) | Used By Tasks |
|
|
642
|
-
|-------|--------|------------------------|----------------------------------------|---------------|
|
|
643
|
-
| {agent name} | {folders[0].fullyQualifiedName} | {agentId (+version)} | {in fields → out fields, or "shared agent contract"} | {comma-separated task names} |
|
|
644
|
-
|
|
645
|
-
### Processes & RPA
|
|
646
|
-
|
|
647
|
-
> For `process` and `rpa` tasks. One row per distinct resource.
|
|
648
|
-
|
|
649
|
-
| Resource | Type | Folder | Resource ID (+version) | Used By Tasks |
|
|
650
|
-
|----------|------|--------|------------------------|---------------|
|
|
651
|
-
| {resource name} | {process \| rpa} | {folders[0].fullyQualifiedName} | {processOrchestrationId (+version)} | {comma-separated task names} |
|
|
652
|
-
|
|
653
|
-
### Child Cases
|
|
654
|
-
|
|
655
|
-
> For `case-management` tasks. Render only if the case launches a child case.
|
|
656
|
-
|
|
657
|
-
| Child Case | Folder | Resource ID | Identifier Prefix | Wait for Completion | Used By Tasks |
|
|
658
|
-
|------------|--------|-------------|-------------------|---------------------|---------------|
|
|
659
|
-
| {child case name} | {folders[0].fullyQualifiedName, or `<UNRESOLVED>`} | {entityKey, or `<UNRESOLVED>`} | {2-4 char prefix} | {Yes \| No} | {comma-separated task names} |
|
|
660
|
-
|
|
661
|
-
### External Agents
|
|
662
|
-
|
|
663
|
-
> Externally-hosted AI agents (CrewAI, Salesforce Einstein, Databricks, LangChain, …), modeled as `api-workflow` / `execute-connector-activity` tasks (the skill has no first-class `external-agent` type). Include this table only if the case uses such an agent.
|
|
664
|
-
|
|
665
|
-
| Agent | Service Type | Endpoint | Used By Tasks |
|
|
666
|
-
|-------|-------------|----------|---------------|
|
|
667
|
-
| {agent name} | {CrewAI \| Salesforce \| ServiceNow \| Custom \| ...} | {endpoint URL or reference} | {comma-separated task names} |
|