@uipath/skills 1.201.0-preview.591 → 1.201.0-preview.602

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/skills",
3
- "version": "1.201.0-preview.591",
3
+ "version": "1.201.0-preview.602",
4
4
  "description": "UiPath agent skills for Claude Code, Codex, Cursor, Copilot, Gemini and OpenCode — RPA, UI automation, UI testing, coded agents/apps/workflows, and troubleshooting. Distributed as the UiPath Claude Code plugin.",
5
5
  "author": {
6
6
  "name": "UiPath"
@@ -92,7 +92,7 @@
92
92
  "The confirmation includes a complete Decisions I Made table with a plain-language provenance per assumption",
93
93
  "A manually triggered task is presented as optional adhoc worker-launched work without exposing schema mechanics",
94
94
  "The confirmation carries the build continuation choice (build straight through vs pause at the build preview) so it is never asked mid-build",
95
- "On a Build answer the lane writes sdd.md (write-early cadence), then the build starts (solution init + planning); the design doc is mentioned in one line as a reference artifact — never presented for review, and never written before the Build answer"
95
+ "On a Build answer the lane writes sdd.md, then the build starts (solution init + planning); the design doc is mentioned in one line as a reference artifact — never presented for review, and never written before the Build answer"
96
96
  ]
97
97
  },
98
98
  {
@@ -16,7 +16,7 @@ Never execute the work. Outputs are SDD markdown, plan/tasks markdown, and live
16
16
 
17
17
  The skill has three paths, decided by the **Entry Guard**:
18
18
 
19
- - **Phase D — Design.** Input is a PDD, or an explicit "design / architect this" request. Author the SDD; the SDD write ends the turn, and Lane A continues on the next turn. See [sdd-generation-guide.md](references/sdd-generation-guide.md). **Case Management designs run through Phase D's Case Design Lane** ([case-design-lane-guide.md](references/case-design-lane-guide.md)): a conversational design that ends in one Case Review confirmation. The lane defines its own entry modes — direct design, build handoff from `uipath-maestro-case`, and draft finalization.
19
+ - **Phase D — Design.** Input is a PDD, or an explicit "design / architect this" request. Author the SDD; the SDD write ends the turn, and Lane A continues on the next turn. See [sdd-generation-guide.md](references/sdd-generation-guide.md). **Case Management designs run through Phase D's Case Design Lane** ([case-design-lane-guide.md](references/case-design-lane-guide.md)) a conversational design ending in ONE Case Review confirmation.
20
20
  - **Lane A — PDD-driven.** Input is an SDD with the `## Planner Handoff` marker (written by Phase D, or hand-written). Read it, derive tasks, emit live tasks. Zero to two user prompts. See [pdd-driven-lane-guide.md](references/pdd-driven-lane-guide.md).
21
21
  - **Lane B — Non-PDD.** No SDD; a non-PDD multi-project request. Elicit preferences, detect project type, write a plan, emit live tasks. 0–3 prompts (5-call cap). See [non-pdd-lane-guide.md](references/non-pdd-lane-guide.md).
22
22
 
@@ -25,8 +25,6 @@ The skill has three paths, decided by the **Entry Guard**:
25
25
  - User provides a **PDD or any process-knowledge source** — a PDD, Confluence page, BPMN model, meeting/Zoom transcript, SOP, or requirements doc (as PDF / Word / Markdown / `.txt` / `.bpmn` / pasted) — and asks to design or build from it → Phase D
26
26
  - User asks to **design / architect / generate an SDD** for a UiPath automation → Phase D
27
27
  - User provides an **SDD path** → Lane A
28
- - User asks to **design / generate a Case Management SDD** conversationally (no PDD), asks for a reviewable case design draft, or asks to **finalize a case `sdd.draft.md`** → Phase D — Design (Case Design Lane)
29
- - **`uipath-maestro-case` handed a case build request off to this skill** (no `sdd.md` exists yet; same conversation) → Phase D — Design (Case Design Lane, Build handoff: design with the user, Build-option confirmation, write `sdd.md` at the working root, the build continues immediately)
30
28
  - The request is **non-trivial** — spans **separate buildable projects** that each need their own specialist (a Flow orchestrating standalone RPA processes or agents that must themselves be built) → Lane B
31
29
  - The request is **ambiguous** — no single specialist clearly matches, or "what can I build?"
32
30
 
@@ -46,7 +44,7 @@ The skill has three paths, decided by the **Entry Guard**:
46
44
  10. **Fill gaps with `[DEFAULT]` or `[SME REVIEW]` — never silently invent business rules.** `[DEFAULT]` for industry-standard patterns (retry counts, timeouts); `[SME REVIEW]` for business-knowledge gaps. Resolve `[SME REVIEW]` items with the user before writing. For Agent/Coded App gaps, use `AskUserQuestion` (proceed-with-gap-filling vs different product) — never auto-fallback.
47
45
  11. **The terminal artefact of a Solution build is a packed `.uipx`.** The SDD's `## Next Steps` section points the user at the `uipath-solution` skill (`uip solution init` → `project add` per project → `resources refresh` → `pack`). A bare project folder is not the deliverable. Exception: when the Constraint Gate blocks Solutions for the delivery model — standalone, Automation Suite older than 2.2510, or a user exclusion — rewrite Next Steps to per-package Orchestrator publish routed via `uipath-platform`.
48
46
  12. **Never copy SDD architecture into the plan, and never invent selectors or UI targets.** The plan references SDD section paths in skill prompts; it does not duplicate architecture content. Selectors require application inspection at development time — leave them for the specialist.
49
- 13. **This skill is the sole author of Case Management SDDs — it always writes the SDD file.** Every case design path (conversational, build handoff from `uipath-maestro-case`, draft finalization, PDD-driven) runs through the Case Design Lane ([case-design-lane-guide.md](references/case-design-lane-guide.md)) flow, write-early cadence, and the never-overwrite guard on `sdd.md` with the content contract in [references/case/](references/case/) (design-time tenant resolution + its ONE batched gate: [case/grounding.md](references/case/grounding.md)). Design time never runs schema discovery, scaffolds projects, or executes create-on-missing those are build-skill concerns recorded as gate decisions.
47
+ 13. **Sole author of Case Management SDDs.** Every case design path conversational, build handoff from `uipath-maestro-case`, draft finalization, PDD-driven runs the Case Design Lane ([case-design-lane-guide.md](references/case-design-lane-guide.md)), which owns the conversation, the one confirmation, and the write; the case model and its defaults live in [case-design-layers-guide.md](references/case-design-layers-guide.md) and the render contract in the case SDD template. Design time resolves identities only — never schema discovery, project scaffolding, or create-on-missing; those are build concerns, recorded as gate decisions.
50
48
 
51
49
  ## Entry Guard
52
50
 
@@ -147,7 +145,7 @@ High-level view of what each specialist owns. **Do not describe internal flows o
147
145
  | `uipath-functions` | Coded Functions — TypeScript (default), JavaScript, or Python (`uip function new -l ts / js / py`; typed I/O — Pydantic for Python) — atomic deterministic logic: transforms, custom-auth API calls, ERP/IS-connection queries. Runs serverless or on an RPA robot. Invoked from Maestro (Flow/BPMN), agents-as-tools, Orchestrator API. No LLM/agent loop (that → `uipath-agents`) | Yes (`uip login`) | **Yes** — `uip function pack/publish` |
148
146
  | `uipath-maestro-flow` | `.flow` files orchestrating RPA, agents, apps | Yes (`uip login`) | **Partial** — Orchestrator deploy of `.uipx`-wrapped solutions → `uipath-solution`; non-solution single package → `uipath-platform` |
149
147
  | `uipath-maestro-bpmn` | `.bpmn` files — standards-based BPMN 2.0 process orchestration (gateways, events, boundary timeouts, subprocesses, multi-instance) over RPA, agents, APIs, HITL. Authors its own inline userTask/HITL nodes. | Yes (`uip login`) | **Yes** — packages, uploads, publishes/deploys, and runs via `uip maestro bpmn`; Orchestrator deploy of `.uipx`-wrapped solutions → `uipath-solution` |
150
- | `uipath-maestro-case` | Case Management authoring (`caseplan.json` + generated BPMN) from an SDD | Yes (`uip login`) | **No** — deploys via `uipath-solution` (`.uipx`) |
148
+ | `uipath-maestro-case` | Case Management authoring `caseplan.json` from an SDD (`case pack` compiles it to `caseplan.json.bpmn`; authoring `.bpmn` directly is `uipath-maestro-bpmn`) | Yes (`uip login`) | **Partial** — publishes to Studio Web and Orchestrator itself; `.uipx` solution deploy → `uipath-solution` |
151
149
  | `uipath-api-workflow` | API Workflows (JSON `document.dsl`): author, run locally (`uip api-workflow run`), connector activities | Yes (`uip login`) | **No** — `uip solution pack/publish` via `uipath-solution` |
152
150
  | `uipath-human-in-the-loop` | HITL node authoring — approval gates, escalations, write-back validation inside **Flow** projects. Coded-agent HITL → `uipath-agents`; BPMN / Case / RPA own theirs inline (userTask / task type / Action Center) | No (authoring only) | **No** — ships inside the host project |
153
151
  | `uipath-platform` | Auth (`uip login`), Orchestrator (folders, processes, jobs, machines, users, roles), resources (assets, queues, storage buckets + bucket files, libraries, webhooks, triggers), Integration Service (connectors, connections, activities, IS triggers), Data Fabric entities/records/files/choice-sets (`uip df`), traces, licensing | Yes (auth hub) | **Yes** — for non-solution single packages and Orchestrator-side post-deploy ops |
@@ -163,8 +161,8 @@ High-level view of what each specialist owns. **Do not describe internal flows o
163
161
  | File | Purpose |
164
162
  |------|---------|
165
163
  | [SDD Generation Guide](references/sdd-generation-guide.md) | Phase orchestrator — Phase 1, 2, 3 step-by-step instructions |
166
- | [Case Design Lane Guide](references/case-design-lane-guide.md) | Conversational case authoring — entry modes (Build handoff / direct / draft finalization), Listen/Sketch/Case Review single confirmation, full design-time tenant resolution + the resolution gate, template conformance gate, terminal-step fork |
167
- | [Case References](references/case/) | Case SDD content contract, one file per concern: [model](references/case/model.md) (node/task types, lifecycle gates, secondary stages, sequencing, naming) · [variables](references/case/variables.md) (data flow, expressions) · [slas](references/case/slas.md) · [principles](references/case/principles.md) (authority, provenance, review items) · [authoring](references/case/authoring.md) (process → model method, task typing) · [render-case-definition](references/case/render-case-definition.md) + [render-stages-tasks](references/case/render-stages-tasks.md) (SDD §1/§2 cell contracts) · [grounding](references/case/grounding.md) (tenant resolution) · [review](references/case/review.md) (Case Review + finalization gate) |
164
+ | [Case Design Lane Guide](references/case-design-lane-guide.md) | The case design conversation — entry, tenant grounding, authoring policy, the one Case Review, and the write |
165
+ | [Case Design Layers Guide](references/case-design-layers-guide.md) | The case model and every design **Default** skeleton (triggers, stages, the nine task types), gates (lifecycle rules, exits, sequencing, secondary lanes), data (variables, outputs, expressions), time (SLAs, escalations, responses), naming rules, and the closure checklist |
168
166
  | [PDD Analysis Guide](references/pdd-analysis-guide.md) | How to extract structured data from PDDs in any format |
169
167
  | [Product Selection Guide](references/product-selection-guide.md) | **Constraint Gate** (delivery model + exclusions filter), **Level 1** (primary scope), **Level 1.75** (Solution composition), **Level 2.5 Part B** (cross-product project list merge), **Level 3** (capability add-ons), template mapping |
170
168
  | [Platform Availability Guide](references/platform-availability-guide.md) | Product × delivery-model availability matrix (Cloud / Automation Suite / standalone), alternatives for blocked products, verification rule for uncertain cells. Load whenever the Constraint Gate runs — every delivery model: "Cloud is not uniform", variants (GovCloud / Dedicated / Test Cloud) and per-tenant entitlements can block products inside the Cloud column. |
@@ -182,7 +180,6 @@ High-level view of what each specialist owns. **Do not describe internal flows o
182
180
  | [Flow Template](assets/templates/flow-sdd-template.md) | SDD template for Maestro Flow |
183
181
  | [BPMN Template](assets/templates/bpmn-sdd-template.md) | SDD template for Maestro BPMN |
184
182
  | [Case Management Template](assets/templates/case-sdd-template.md) | SDD template for Case Management (downstream Case Definition Blueprint shape) |
185
- | [Case SDD Worked Examples](assets/templates/case-sdd-examples.md) | Worked case-authoring patterns by use case (variables, outputs operators, file In-args, multi-trigger) |
186
183
  | [Agent Template](assets/templates/agent-sdd-template.md) | SDD template for UiPath Agents |
187
184
  | [Coded App Template](assets/templates/coded-app-sdd-template.md) | SDD template for Coded Apps (web) |
188
185
  | [API Workflow Template](assets/templates/api-workflow-sdd-template.md) | SDD template for API Workflows |
@@ -96,6 +96,12 @@ Skip entirely when no review items are open. Blocking = yes keeps Planner Handof
96
96
 
97
97
  ### Case Metadata
98
98
 
99
+ <!-- Required cells never render `—`: Case Name (PascalCase — missing → block, Ask), Identifier prefix
100
+ (missing → derive mechanically from the name + provenance). Case SLA `—` when none — then OMIT the SLA
101
+ Title row entirely. SLA Type: platform persists condition-based whenever ≥1 SLA rule carries a non-empty
102
+ expression; condition-based requires the Variable SLA Rules table. Defaults recorded with provenance:
103
+ Case App Disabled, Task-output passing Direct, SLA Type time-based, SLA Title `SLA Rule 1`. -->
104
+
99
105
  | Property | Value |
100
106
  |----------|-------|
101
107
  | Case Name | <PascalCase name> |
@@ -115,8 +121,27 @@ Skip entirely when no review items are open. Blocking = yes keeps Planner Handof
115
121
 
116
122
  | SLA Status | Threshold | Action | Display Name |
117
123
  |------------|-----------|--------|--------------|
118
- | At-Risk | <percentage>% of SLA duration | Notify: <recipient or group> | <non-empty root-unique escalation title, no `:`> |
119
- | Breached | 100% of SLA duration | Notify: <recipient or group> | <non-empty root-unique escalation title, no `:`> |
124
+ | At-Risk | <percentage>% of SLA duration | Notify: <owner persona's group — never `—`> | <root-unique title, no `:`; `Escalation Rule {N}` only if no sla-status-change row references it> |
125
+ | Breached | 100% of SLA duration | Notify: <one tier up: leadership, or Compliance when regulation-driven — never `—`> | <root-unique title, no `:`; same defaulting rule> |
126
+
127
+ <!-- Whole section required when Case SLA is set; omit it entirely when there is none. A recipient
128
+ filled from the default tiers rather than the source carries provenance `default applied`. -->
129
+
130
+ ### SLA Response Map
131
+
132
+ **THE single authored source of SLA responses.** Every per-stage SLA block carries only its title and
133
+ duration and points here; nothing restates a response.
134
+
135
+ | Scope | SLA | Status | Response | Target | Interrupting | Rationale |
136
+ |-------|-----|--------|----------|--------|--------------|-----------|
137
+ | <case \| stage: <StageName> \| task: <TaskName>> | <that target's SLA Title> | <At-Risk \| Breached> | <notify-only \| start-task \| enter-stage \| exit-stage \| exit-case> | <— for notify-only; else the task name / stage name / produced exit row> | <— for notify-only and for every start-task; else Yes \| No matching the produced stage-entry row> | <why this response fits the source> |
138
+
139
+ <!-- Section required whenever ANY SLA exists (case, stage, or action task); omit only in a case with no
140
+ SLA at all. One row per (Scope, SLA, Status), at-risk and breached separately. Source states no response
141
+ -> both statuses notify-only with Target and Interrupting `—`; never invent a stage, task, or routing
142
+ change to carry a notification. Legal Response values and the Interrupting value each implies:
143
+ case-design-layers-guide.md § Choosing the response. Two-way closure against the SDD's
144
+ `sla-status-change` rows is enforced by audit_sdd.py — it is not re-checked by hand. -->
120
145
 
121
146
  ### Variable SLA Rules
122
147
 
@@ -129,16 +154,31 @@ Skip entirely when no review items are open. Blocking = yes keeps Planner Handof
129
154
  ### Case Triggers
130
155
 
131
156
  <!-- Trigger mapping into variables is declared in Case Variables with sourceTriggers/sourceFields, not here. T01 is reserved for the case file; number runtime triggers from T02.
132
- `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"`).
133
- Tenant object starts are still event triggers: a case that starts when a tenant case-entity / data-object record is created authors `Intsvc.EventTrigger` with that object name as Source — never downgrade to `Manual` because the object is not provisioned; unresolved event triggers survive as placeholders. -->
157
+ `Manual` is author shorthand for "no event source" never a serviceType value. The SDD writes `Manual`, `Intsvc.EventTrigger`, or `Intsvc.TimerTrigger`; the on-disk mapping is the build skill's.
158
+ Tenant object starts are still event triggers: a case that starts when a tenant case-entity / data-object record is created authors `Intsvc.EventTrigger` with that object name as Source — never downgrade to `Manual` because the object is not provisioned; unresolved event triggers survive as placeholders (connectionId/activityTypeId → high review item).
159
+ Configuration cell = user intent in business terms (`Record created`, `Email received in Inbox; filter: subject contains "URGENT"`, `daily at 09:00 UTC`, `N/A`); an event trigger MUST carry a concrete operation phrase. Forbidden here (build-time detail): CLI enum values (`CALENDAR_CREATED`), delivery modes (`polling`/`webhook`), meta notes, activity slugs, HTTP methods. -->
134
160
 
135
161
  | T# | Trigger Type | Source | Configuration |
136
162
  |----|-------------|--------|---------------|
137
163
  | T02 | <Manual \| Intsvc.EventTrigger \| Intsvc.TimerTrigger> | <source system, connector, object, or Manual> | <business event, timer cadence, filter intent, or N/A> |
138
164
 
165
+ ### Trigger Filter
166
+
167
+ | Field | Operator | Value | Literal? |
168
+ |-------|----------|-------|----------|
169
+ | <payload field> | <one of, PascalCase and case-sensitive: Equals \| NotEquals \| Contains \| NotContains \| StartsWith \| EndsWith \| GreaterThan \| GreaterThanOrEqual \| LessThan \| LessThanOrEqual \| In \| NotIn \| IsNull \| IsNotNull> | <value> | <Yes — prefer a literal; No is a lossy fallback, so pair it with a review item> |
170
+
171
+ <!-- Section only when ≥1 trigger declares a filter; omit otherwise. AND/OR tree; nested
172
+ {op, clauses} groups flatten into rows. -->
173
+
139
174
  ### Case Exit Conditions
140
175
 
141
- <!-- WHEN + Marks Case Complete pairing is schema-constrained: Marks Case Complete = Yes normally uses `required-stages-completed`; selected-stage rules are for non-completing exits. -->
176
+ <!-- WHEN + Marks Case Complete pairing is schema-constrained: Yes normally uses `required-stages-completed`;
177
+ selected-stage rules are for non-completing exits (alternate dispositions: Withdrawn / Rejected /
178
+ Cancelled — required when the case has ≥1 secondary stage, else high review item `Alt-disposition exits
179
+ missing`). ≥1 Yes row always. Display Name defaulting (every condition table in this SDD): carry the
180
+ author's value verbatim; blank → `Entry Rule {N}` / `Complete Rule {N}` / `Exit Rule {N}` by table kind,
181
+ N 1-based per label kind — never invent a label otherwise. -->
142
182
 
143
183
  | WHEN | IF | THEN | Marks Case Complete | Display Name |
144
184
  |------|-----|------|---------------------|--------------|
@@ -149,16 +189,17 @@ Tenant object starts are still event triggers: a case that starts when a tenant
149
189
  <!--
150
190
  Only include In/Out arguments, trigger-payload Variables, and true case-level state read by conditions or reused by multiple consumers.
151
191
  Do not mint relay variables for one upstream task output consumed once downstream; bind those directly with `<- "Stage"."Task".out` or `vars.$xref('Stage','Task','out')`.
152
- Every row must have Category.
192
+ Every row must have Category. Name camelCase, no role suffix.
193
+ sourceTriggers/sourceFields grammar — In: optional single T<N> (blank = primary trigger, never CSV), sourceFields always empty (an In-arg selects a trigger, extracts nothing). Variable: single T<N> or CSV; one trigger → bare payload path (`response.subject`); CSV → keyed `T<N>: <path>; T<M>: <path>`, one entry per listed T-number; dot-paths only, no array indexing. Out: both empty; every Out row needs a Default OR a producing task Outputs row.
194
+ Config-as-In: runtime business rules (priority bands, thresholds, taxonomies) ride ONE In variable — string with a JSON Default for opaque rule-sets; jsonSchema + body when downstream picks sub-fields. `json` is not a Type. file = JobAttachment record; a file In-arg triggers the Caller-obligation block in the confirmation.
153
195
  -->
154
196
 
155
197
  | Name | Category | Type | sourceTriggers | sourceFields | Default | Description |
156
198
  |------|----------|------|----------------|--------------|---------|-------------|
157
199
  | <camelCase name> | <In \| Out \| Variable> | <string \| integer \| float \| double \| boolean \| datetime \| date \| jsonSchema \| file> | <T02, blank, or CSV only for Variable rows> | <payload path or keyed T-number paths> | <default or blank — see below> | <what this variable represents> |
158
200
 
159
- > **`Default` is always a string, for every Type.** The downstream `caseplan.json` field is
160
- > string-typed, and a non-primitive value there is **silently deleted** when the case is serialized to
161
- > BPMN — the variable is then null at runtime and the first task that reads it fails. Write a
201
+ > **`Default` is always a string, for every Type.** A non-string default is dropped on the way to
202
+ > runtime, leaving the variable null for the first task that reads it. Write a
162
203
  > `jsonSchema` default as string-encoded JSON in the cell:
163
204
  > `{"employeeName":"Test Employee","amount":125.5}` becomes
164
205
  > `"{\"employeeName\":\"Test Employee\",\"amount\":125.5}"`. Same for numbers and booleans — `"5"`,
@@ -170,10 +211,9 @@ Every row must have Category.
170
211
 
171
212
  **Purpose:** The case plan. Every stage has entry/exit conditions, optional SLA, and complete task detail blocks. Case has no BPMN-style edges; transitions are expressed by stage entry/exit conditions.
172
213
 
173
- **Authoring rules** (owned by the reference files block shape and cell grammar:
174
- [render-stages-tasks.md](../../references/case/render-stages-tasks.md); type enum, gates, sequencing:
175
- [model.md](../../references/case/model.md); task-level SLA surface: [slas.md](../../references/case/slas.md)).
176
- During draft finalization, do NOT open these links — the draft is the settled design and this template is
214
+ **Authoring rules** this template IS the render contract: cell rules live inline at each cell. Design
215
+ semantics (type enum, gates, sequencing, SLA surface): [case-design-layers-guide.md](../../references/case-design-layers-guide.md).
216
+ During draft finalization, do NOT open that link — the draft is the settled design and this template is
177
217
  the complete normalization contract; finalization preserves existing display names verbatim.
178
218
  Template-local rules:
179
219
  - Every stage and task carries a concrete `Design Rationale` and prose `Description`.
@@ -188,7 +228,13 @@ Template-local rules:
188
228
 
189
229
  ---
190
230
 
191
- ### Stage <N>: <STAGE_NAME>
231
+ ### Stage <N>: <STAGE_NAME> (`<stage_id>`)
232
+
233
+ <!-- The trailing code-formatted stage id MUST appear on every stage heading, and every cell that names a
234
+ stage appends it in code-formatted parens — cross-references stay greppable. Required for Case Completion
235
+ is explicit Yes/No (design default: primary Yes, secondary No). Design Rationale is concrete: a
236
+ global-event lane names the event and states that one interrupting entry replaces per-stage duplication;
237
+ an SLA lane names the SLA, the response, and why it interrupts or not. -->
192
238
 
193
239
  **Type:** Stage
194
240
  **Stage Kind:** <primary \| secondary>
@@ -213,11 +259,16 @@ Template-local rules:
213
259
 
214
260
  **Design Rationale:** <Why this duration, threshold, recipients, and breach behavior fit.>
215
261
  **SLA Type:** <time-based \| condition-based>
216
- **SLA Title:** <non-empty stage-unique SLA rule title, no `:` — this exact title is what a `sla-status-change("<Stage>","<SLA Title>")` entry row references>
262
+ **SLA Title:** <non-empty stage-unique SLA rule title, no `:` — this exact title is what a `sla-status-change("<Stage>","<SLA Title>")` entry row references. Unnamed defaults: `<Stage Name> SLA`, at-risk display `<Stage Name> SLA at risk`, breach `<Stage Name> SLA breached`. Keep SLA Type and SLA Title as two separate lines — a collapsed line hides the title from line-start tooling>
263
+
264
+ | SLA | Unit | At-Risk | At-Risk Escalation Display Name | Breach Escalation Display Name |
265
+ |-----|------|---------|----------------------------------|---------------------------------|
266
+ | <count> | <min \| h \| d \| w \| m> | <percentage>% | <stage-unique title, no `:`> | <stage-unique title, no `:`> |
217
267
 
218
- | SLA | Unit | At-Risk | At-Risk Action | At-Risk Escalation Display Name | Breach Action | Breach Escalation Display Name |
219
- |-----|------|---------|----------------|----------------------------------|---------------|---------------------------------|
220
- | <count> | <min \| h \| d \| w \| m> | <percentage>% | Notify: <recipient> | <stage-unique title, no `:`> | Notify: <recipient> | <stage-unique title, no `:`> |
268
+ <!-- Titles and durations only. What HAPPENS at at-risk and breach is authored once, in
269
+ § SLA Response Map — this block never carries a Notify/enter-stage response. The display names above
270
+ are load-bearing: they are the third argument of `sla-status-change("<Stage>","<SLA Title>","<display
271
+ name>")`. -->
221
272
 
222
273
  ##### Stage Variable SLA Rules
223
274
 
@@ -229,6 +280,11 @@ Template-local rules:
229
280
 
230
281
  #### Tasks
231
282
 
283
+ <!-- In plan order, ≥1 task per stage; Persona = persona name or `system`. Stage tables above: ≥1 entry
284
+ row per stage; ≥1 completion (Yes) exit row per primary stage. Call forms with complete args appear ONLY
285
+ in table rows; prose uses bare rule names. sla-status-change target is the literal `root` (case scope) or
286
+ the exact stage display name — never the case name. -->
287
+
232
288
  | # | Task Name | Type | Activation Mode | Starts When | Required | Run Only Once | Persona | SLA |
233
289
  |---|-----------|------|-----------------|-------------|----------|---------------|---------|-----|
234
290
  | 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> | <stage enters, sequential group, after tasks, connector event, etc.> | <Yes \| No> | <Yes \| No> | <persona or —> | <count unit or —> |
@@ -258,7 +314,7 @@ Template-local rules:
258
314
  **Action App ID:** <actionAppId or <UNRESOLVED>>
259
315
  **Deployment Folder:** <folder path or <UNRESOLVED>>
260
316
  **actionType:** <dispatch code or —>
261
- **Recipient:** <Role:name \| User:uuid \| UserGroup:uuid \| Email:addr \| Expression:=vars.id>
317
+ **Recipient:** <Role:name \| User:uuid \| UserGroup:uuid \| Email:addr \| Expression:=vars.id — typed prefix only; none known → drop the cell + high review item>
262
318
  **Priority:** <Low \| Medium \| High \| Critical> · **Task Title:** <one-line Action Center prompt> · **Labels:** <csv or —>
263
319
 
264
320
  **Input Schema:**
@@ -280,16 +336,29 @@ Template-local rules:
280
336
  |--------|---------|----------|
281
337
  | <button label> | <variable = value> | <Complete task \| Complete task and set variables> |
282
338
 
339
+ <!-- Buttons only on a decision task — then ≥2 rows; Maps To LHS = a §1.5 Name, taskOutcome, or this
340
+ task's own output (read downstream via a direct producer reference) — never an identifier occurring
341
+ nowhere else. Input/Output Schema fields MUST be ⊆ the resolved app's schema — a field the app lacks →
342
+ Ask (task-specific app / drop / placeholder), never silently author. Field NAMES are carried verbatim
343
+ from whatever supplied them, never re-cased or convention-converted, and never read off a
344
+ `--output json` envelope's PascalCased keys (layers § External names); unsourced spelling →
345
+ <UNRESOLVED> + review item. Reusing ONE deployed app across
346
+ several action tasks is sanctioned only when each task carries a distinct actionType dispatch value AND
347
+ its fields ⊆ the app schema (code-switched app); otherwise it is the substitute-app defect. -->
348
+
283
349
  ###### Connector Task Detail (type: `wait-for-connector` or `execute-connector-activity`)
284
350
 
285
351
  **Connector:** <connector name> · **Connector Key:** <connectorKey>
286
352
  **Connection:** <connection instance name or Tenant default> · **Connection ID:** <connectionId or <UNRESOLVED>>
287
- **Activity Type ID:** <activityTypeId or <UNRESOLVED>> · **Service Type:** <Intsvc.WaitForEvent \| Intsvc.ExecuteActivity>
353
+ **Activity Type ID:** <activityTypeId or <UNRESOLVED>>
288
354
  **Auth Method:** <OAuth2 \| API Key \| Basic \| Service Account \| ...>
289
355
  **Account / Endpoint:** <explicit endpoint or —>
290
356
  **Operation:** <display/operation name>
291
357
  **Trigger / Event:** <trigger display name for wait-for-connector, or —>
292
358
 
359
+ <!-- Missing Connection ID / Activity Type ID → high review item. Inputs `Field` verbatim to the IS
360
+ activity schema. Operation Configuration carries through as =jsonString: only here. -->
361
+
293
362
  **Inputs:**
294
363
 
295
364
  | Field | Type | Binding |
@@ -305,12 +374,14 @@ Template-local rules:
305
374
 
306
375
  ###### Timer Task Detail (type: `wait-for-timer`)
307
376
 
308
- **Timer:** <timeDuration \| timeDate \| timeCycle>
309
- **Value:** <ISO 8601 expression, date expression, or variable expression>
377
+ **Timer:** <timeDuration (relative) \| timeDate (absolute) \| timeCycle>
378
+ **Value:** <ISO 8601 expression, date expression, or variable expression — NEVER <UNRESOLVED>: a timer cannot fire without it; block approval>
379
+ **Business Calendar:** <calendar name or —>
310
380
 
311
381
  ###### Child Case Task Detail (type: `case-management`)
312
382
 
313
- **Child Case:** <concrete intended child-case resource name; never <UNRESOLVED>>
383
+ **Child Case:** <concrete intended child-case resource name; never <UNRESOLVED>, never the parent task's display name>
384
+ **Child Case Identifier Prefix:** <2-4 char UPPER prefix>
314
385
  **Folder Path:** <folder path or <UNRESOLVED>>
315
386
  **Resource Identity:** <entityKey or <UNRESOLVED>>
316
387
  **Data Passed (parent -> child):**
@@ -321,7 +392,7 @@ Template-local rules:
321
392
 
322
393
  **Wait for Completion:** <Yes \| No>
323
394
 
324
- **Data Returned (child -> parent):**
395
+ **Data Returned (child -> parent):** <!-- only when Wait for Completion: Yes -->
325
396
 
326
397
  | Child Variable | Parent Variable |
327
398
  |----------------|----------------|
@@ -332,8 +403,15 @@ Template-local rules:
332
403
  **Resolved Resource:** <concrete intended resource name; never <UNRESOLVED>>
333
404
  **Folder Path:** <resolved exact folder path or <UNRESOLVED>>
334
405
  **Resource Identity:** <apiWorkflowId / agentId / processOrchestrationId (+version) or <UNRESOLVED>>
335
- **Binding Sub-Type:** <Api \| Agent \| ProcessOrchestration \| —>
336
- **Dispatch / Operation:** <selector and value for shared facades, or —>
406
+ **Dispatch / Operation:** <selector and value for shared facades (`requestSource = "RegisterCaseShell"`) — also an Inputs row; — for single-purpose resources>
407
+
408
+ <!-- Folder Path = the exact resource folder (never a parent), or <UNRESOLVED> when identity is
409
+ unresolved. When a task resolves to a live resource: every REQUIRED declared input has a non-empty
410
+ Binding (any form incl. a direct upstream-output reference — needs no §1.5 row) or <UNRESOLVED> + high
411
+ review item; every Outputs -> Field exists verbatim in the resolved output contract (phantom field → high
412
+ review item). Unresolved-identity tasks have no contract — skipped; portable names stay concrete. Bare
413
+ field-name input lists are forbidden — table form only. No task-level SLA on any non-action type. Deep
414
+ runtime metadata (agent prompts, package versions, endpoints) stays out of the SDD. -->
337
415
 
338
416
  **Inputs:**
339
417
 
@@ -350,7 +428,7 @@ Template-local rules:
350
428
 
351
429
  ---
352
430
 
353
- ### Secondary Stage: <SECONDARY_STAGE_NAME>
431
+ ### Secondary Stage: <SECONDARY_STAGE_NAME> (`<stage_id>`)
354
432
 
355
433
  **Type:** Stage
356
434
  **Stage Kind:** secondary
@@ -395,9 +473,19 @@ Template-local rules:
395
473
 
396
474
  **Operations:**
397
475
 
398
- | Operation | Activity Type ID | Method | Input Fields | Output Fields |
399
- |-----------|------------------|--------|-------------|---------------|
400
- | <operation name> | <activityTypeId or <UNRESOLVED>> | <GET \| POST \| PUT \| DELETE \| PATCH \| EVENT> | <field: type, ...> | <field: type, ...> |
476
+ | Operation | Activity Type ID | Method | Output Fields |
477
+ |-----------|------------------|--------|---------------|
478
+ | <operation name> | <activityTypeId or <UNRESOLVED>> | <GET \| POST \| PUT \| DELETE \| PATCH \| EVENT> | <field: type, ...> |
479
+
480
+ <!-- No Input Fields column: inputs are authored per task in the task's Input Schema table, and
481
+ Phase 3 re-derives the operation's full input shape from the connector spec — design time never
482
+ transcribes it. Output Fields lists ONLY the fields some Section 2 read path actually consumes, and
483
+ lists them with their SCHEMA SPELLING, byte-for-byte: field names are external lookup keys matched
484
+ exactly at runtime, and the `--output json` envelope of `case spec` / `registry search` PascalCases
485
+ object keys recursively (`request_body` -> `RequestBody`), so a name copied from those keys binds to a
486
+ field the resource does not have. Casing not sourced from the user, the source document, or a build-time
487
+ spec -> render the field as <UNRESOLVED> and pair it with a review item; never guess a convention.
488
+ Rule: case-design-layers-guide.md § Layer 3 (External names). -->
401
489
 
402
490
  ### API Workflows
403
491
 
@@ -496,4 +584,51 @@ Implementation tasks **do not live in this SDD** — they live in the planner's
496
584
 
497
585
  ---
498
586
 
587
+ <!-- ============================ VALIDATION (do not render) ============================
588
+ Markers: <UNRESOLVED> renders as plain text — never backtick-wrapped, never annotated in-cell; allowed
589
+ ONLY on registry identity ids (taskTypeId, connectionId, actionAppId, agentId, processOrchestrationId,
590
+ entityKey) and on a schema FIELD NAME whose exact spelling nothing in the conversation supplied,
591
+ each paired with a review item. A field name is an external lookup key matched byte-for-byte at
592
+ runtime — an unsourced one is <UNRESOLVED>, never a plausible guess (layers § External names). `—` allowed only where a cell above says so (optional cells
593
+ the build defaults safely). Narrative cells never carry skill-internal vocabulary (Pattern C, bridge,
594
+ companion, inputOutputs[], groupOperator, essentialConfiguration-as-prose, savedFilterTrees, dispatcher,
595
+ io-binding, aliased into/from, reassign, originalVar, auto-mint).
596
+
597
+ FINALIZING a draft (`sdd.draft.md` -> the final SDD): the render obeys this contract IN FULL — the
598
+ document skeleton above, one `##### Task <n>: <Name>` detail block per task the draft inventories (never
599
+ a stage-level Tasks table standing in for them), `**Type:** Stage` on every stage block, the exact
600
+ type-specific detail headings and bold field labels (`**Timer:**` stays `**Timer:**`), Section 3/4 column
601
+ headers verbatim, real newlines. A task the draft left as a summary still gets its full detail block:
602
+ fill concise defaults, keep every concrete value the draft supplied, and set `**Resolved Resource:**` to
603
+ the draft's intended resource name — or, when it names none, the task display name; never <UNRESOLVED>
604
+ there. Pass --draft so the gate also checks inventory parity, verbatim `=js:` preservation, and
605
+ executable threshold encoding. What the DRAFT specifically needs repaired on the way through is the
606
+ lane guide's § Resumption; the shape is here.
607
+
608
+ Gate: run <py> "<skill folder>/scripts/audit_sdd.py" <sdd path> [--draft <draft path>] on the
609
+ on-disk file BEFORE the Status: ready flip — in every mode. `<py>` = the first of `python3`, `python`,
610
+ `py` that runs (Windows usually has no `python3` alias); only if all three are absent verify manually. RUN it, never open the script source —
611
+ its findings are the interface. Minting charset is ADVISORY — it never gates, and a name the user, the
612
+ source, or a draft supplied is kept verbatim (pass --draft so the validator knows). ':' gates always. Repair findings with Edit, re-run to AUDIT OK
613
+ (max 3 rounds, then stop and present findings). Never ship a summary SDD (top-level headings like
614
+ ## Source / ## Case Objective / ## Stages / ## Task Plan, or build-mode/path narration) even if a later
615
+ caseplan.json would validate — rewrite from the model and this template.
616
+
617
+ The validator's checks, by family — RUN it, do not hand-verify this list. Each name is what a finding
618
+ will refer to; the rules themselves live at the cells above and in case-design-layers-guide.md:
619
+
620
+ 1. Document skeleton · 2. Closed enums + gate-slot pairing · 3. Names (':' ban + case-wide uniqueness;
621
+ charset is advisory)
622
+ 4. SLA references (arity, target, declared title) + stage/task selectors · 5. Data closure + orphan
623
+ Maps To · 6. Typed recipients, non-empty entry tables, forbidden vocabulary · 7. Structure (case-entered,
624
+ ≥1 trigger, ≥1 Marks Case Complete, wait-for-user ↔ user-selected-stage, no duplicate case-exit rows)
625
+ 8. Precedence & liveness (unreachable stage, exit-overrides-completion, self-reference, vacuous
626
+ required-*, SLA bounds) · 9. Draft parity (--draft: inventory, =js: expressions, thresholds encoded
627
+ executably)
628
+
629
+ If no interpreter is available at all, the enforcement detail behind each family is in the cell rules
630
+ above — every one of them must hold.
631
+
632
+ ===================================================================================== -->
633
+
499
634
  **End of Case Definition Blueprint.**