About uipath-maestro-case
A UiPath Case Management authoring skill for building definitions from an SDD and making targeted edits to existing case plans. It resolves tenant resources and converts the SDD into the case artifact before remaining details are filled in.
Key features
- 01Build case definitions from an SDD
- 02Resolve tenant resources into a ledger
- 03Convert the SDD into a case artifact
- 04Make targeted edits to existing case plans
Use cases
- 01Create a Case Management project from an SDD
- 02Change stages, tasks, conditions, or triggers in a case plan
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ uipath/ skills --skill uipath-maestro-caseAfter installing, type/uipath-maestro-casein Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/bindings-and-expressions.mdbindings-v2-sync.mdbrownfield.mdcase-commands.mdcase-editing-operations.mdcase-schema.mdcase-spec-input-details.mdconnector-integration.mdconnector-trigger-impl.mdconnector-trigger-planning.mdedit-recipes-guide.mdentry-points-sync.mdimplementation.mdphased-execution.mdplaceholder-tasks.mdplanning.mdreferences/evals/evals.jsonreferences/plugins/case/impl-json.mdplanning.mdreferences/plugins/conditions/case-exit-conditions/impl-json.mdplanning.mdreferences/plugins/conditions/stage-entry-conditions/impl-json.mdplanning.mdreferences/plugins/conditions/stage-exit-conditions/impl-json.mdplanning.mdreferences/plugins/conditions/task-entry-conditions/impl-json.mdplanning.mdreferences/plugins/logging/impl-json.mdreferences/plugins/sla/impl-json.mdplanning.mdDetails
From the project READMEUiPath Case Management Authoring Assistant
Build UiPath Case Management definitions from sdd.md. Resolve tenant resources into tasks/registry-resolved.json, then emit caseplan.case with uip maestro case sdd convert and fill what the document cannot determine, using the applicable per-plugin JSON recipes. The SDD is the plan — there is no intermediate plan file, and the converted caseplan.case is not one: it is the artifact itself, derived rather than restated.
Authoring invariant: Never use mutating
uip maestro casecommands (cases|stages|tasks|*-conditions ... add|update|remove, includingtasks add-connector) or explore them with--help. Use the CLI only for scaffolding, metadata reads, validation/debug, runtime operations, and solution sync/upload. Consult case-commands.md only when exact syntax is needed. CLI availability or a finalvalidaterequirement never overrides this rule.
When sdd.md is absent, case design belongs exclusively to uipath-planner, which runs its Case Design Lane in this conversation. This skill never designs independently. The lane uses best-assumption design, Listen → Sketch → full design-time tenant resolution, a mandatory other-path sweep, and one decision-first eight-section Case Review. Its Build answer is consent; it writes template-conformant sdd.md, then this skill continues immediately with
uip solution init, Phase 1,
and later phases. The same handoff applies to sdd.draft.md finalization. Never overwrite an existing sdd.md.
Scope: greenfield builds from sdd.md and brownfield targeted edits to an existing caseplan.case; see references/brownfield.md. For Studio Web cases, pull current server state first with uip solution download or solution projects resync so publishing cannot clobber server changes.
When to Use This Skill
Use for:
- Building a Case Management project from
sdd.md. - Creating a case when no SDD exists; hand design to
uipath-plannerin this conversation. - Generating implementation tasks from an SDD.
- Editing an existing
caseplan.caseby targeted intent: stage/task changes, conditions, or triggers. - Questions about case JSON schema, nodes, transitions, tasks, rules, SLA, or runtime case instances.
Do not use for .xaml → uipath-rpa, .flow → uipath-maestro-flow, or standalone agents/APIs/processes outside case context.
Critical Rules
- Design handoff and SDD authority. If
sdd.mdis absent, immediately invokeuipath-planner’s Case Design Lane in this conversation, before reading references or running tenant commands. Do not improvise interviews, design subagents, generic Build Plan approvals, or design-only behavior here. The lane’s single Case Review has exactly these sections: Case Snapshot; Primary Journey; Other Paths Considered; SLA and Escalations; Rules and Outcomes; Resources and Integrations with design-time resolutions; Decisions I Made; Review Flags. It names every stage/task, type, activation/grouping, required status, routing/outcome, and SLA context;sdd.mdseparately contains the complete data contract, variables, and task inputs/outputs. The Build options incorporate Rule 12, and the Build answer is the sole consent. Corrections re-show only changed review sections. Before approval, everyselected-tasks-completedselector must resolve to a non-adhoc sibling in the same stage. The lane writessdd.mdearly, then this skill runs
uip solution init <SolutionName> and Phase 1
without another prompt unless explicitly requested. A design-only request stops after sdd.md per Rule 3's design-only exception. If sdd.draft.md is to be finalized, use the lane fast path with target basename sdd.md. Never overwrite sdd.md.
2. SDD is the sole post-design input, across sessions. Trust user-provided or previously written sdd.md; do not validate, gap-fill, or silently infer it. In the same conversation as design approval, use the in-memory model that wrote it rather than rereading mid-phase — except at Rule 8's Phase 2 and Phase 3 entry checkpoints, which always re-read because context may have compacted. Use AskUserQuestion for build-phase ambiguity. Before reading an SDD not watched being written, Read its first 40 lines as the receipt: the <!-- planner-handoff:v1 --> marker and a Template validation header value of passed must both be present. Anything else goes back through the planner's template conformance checklist.
3. Phase 1 registry gate.
Run uip login status --output json, then
uip maestro case registry pull, before cache inspection, carryover, resolution, or Phase 1 writes. Pull at most once per session, unless the user selects Force pull and re-resolve at Rule 18's empty-lookup gate, or sdd resolve reports a stale cache (below). If the planner lane ran in this session, its pull succeeded, and it wrote the SDD, reuse the cache. With the lane’s in-context resolution outcomes, use verify-only planning: persist them verbatim to tasks/registry-resolved.json, spot-check cache entries, execute gate decisions, and re-resolve only stale/missing entries. Otherwise run the full gate. Login/pull failure stops Phase 1. Outside that fast path, resolve with uip maestro case sdd resolve "<SDD_PATH>" --out tasks/registry-resolved.json --output json: it picks each task type's index, runs the exact-name search and the folder narrowing, and writes the Rule 10 ledger for every task in one call. When its Data.Warnings reports a stale cache (Data.Scope.cache.stale: true), run uip maestro case registry pull --force --output json once, without asking, then run sdd resolve again. A plain pull reuses any cache under 24 hours old, so only --force refreshes it, and the warning is the evidence of staleness the --force confirmation otherwise asks for. If it is still stale after the forced pull, report it and continue. Never hand-author that ledger — resolve writes it in well under a second, where hand-writing it has measured ~50 seconds and recorded selected: null for resources the same run then bound. Its Data.Unresolved[] is the only work left, and only that work is done by hand: an absent entry runs registry-discovery.md's cross-type fallback and in-solution sibling check before Rule 18's gate; an ambiguous entry — several exact-name matches the SDD's folder did not narrow — is never settled by picking one: it goes to Rule 18's gate like an absent one, and without an answer it stays <UNRESOLVED> and becomes a placeholder. For those manual lookups, uip maestro case registry search "<Name>" --type <type> --output json and ~/.uip/case-resources/<type>-index.json return the same records, not the same shape: the index file is a flat list of camelCase objects (entityKey, folders); registry search wraps each hit as Data.Resources[] = {ResourceType, Resource: {…}} with PascalCase keys (EntityKey, Folders). If the CLI reports sdd resolve as an unknown command (ErrorCode: "invalid_argument", exit 3), resolve every task by hand per registry-discovery.md and say so in one line. Before a successful pull, missing cache files are failed refresh preconditions, never zero matches; only after success may empty exact-name matches or absent indexes enter empty-lookup handling. Trust the SDD; the pull refreshes discovery only. The planner lane owns design-time resolution, lazily starting login/pull when tenant-bound work first appears, resolving identities with one batched Case Review gate, and recording SDD cells plus its resolution ledger. No schema discovery occurs there.
Design-only exception: when explicitly stopping at sdd.md or sdd.draft.md without caseplan.case, solution, or build, do not run tenant registry, connection, schema, or user-discovery commands. Preserve intended names, leave identities <UNRESOLVED>, and report deferred wiring in the reply — never in a substitute plan file. This exception does not apply when the user requests resource/identity resolution, registry refresh, stale-audit replacement, tasks/registry-resolved.json, or tasks/recipients-resolved.json; then run the normal gate, resolve identities, write the ledger, and stop before Phase 2.
4. Convert before authoring. At the top of Phase 2, after the Rule 3 registry gate, emit the plan with uip maestro case sdd convert "<SDD_PATH>" --resolved tasks/registry-resolved.json --out "<SolutionName>/<ProjectName>/<PLAN_FILE>" --output json, where <PLAN_FILE> is the plan file case init seeded (Rule 14: caseplan.case, or caseplan.json from a CLI that predates the .case name). The plan lives two levels down — inside the project directory Rule 24 creates, never at the solution root and never beside sdd.md. Writing it shallow either leaves nothing where every grader, validate, bindings sync and solution pack look, or leaves two caseplan.case files and an ambiguous build. The SDD determines most of caseplan.case; deriving it once beats re-deriving it element by element, and hand-authoring what the parser already emits is the expensive path and the one that drifts from the document. Its Data.Unresolved[] is the work list — resource-binding closes at Phase 1 bindings, output-type at uip maestro case splice --described (Step 9.8), connector-context at Check 12 — and it is a floor, never a ceiling: it names what convert knew it skipped, never what it emitted wrongly. Known gap it does not name: every jsonSchema variable arrives with body: null; fill body and _jsonSchema from the SDD row per global-vars/impl-json.md § jsonSchema type. Data.Unresolved[] is the complete list of what is left to do. Read the emitted plan once, close those entries, and stop; do not re-derive, re-verify, or re-read references for anything convert already emitted. A shape that arrived in the converted plan is settled — reopening it costs more than the whole conversion saved. Convert before you author any element. Scaffold the project first per Rule 24 — case init refuses a non-empty directory, so converting first leaves the project with no project.uiproj and an unregistered manifest. Then run convert immediately; never hand-build stages, tasks, conditions, or variables first and convert second. Full procedure, including the mandatory task-entry-rule check that nothing upstream catches, in references/phased-execution.md.
Version guard. If the CLI reports
sddorconvertas an unknown command (ErrorCode: "invalid_argument", exit 3), author Phase 2 by hand, say so in one line, and continue. Exit 3 without that message is a real failure, not a fallback. Never install, reinstall or change the CLI.
-
Parsed reads require
--output json. -
Use plugin references for what you author, not for what convert emitted. During planning,
catthe matching pluginplanning.md. During execution,cata plugin'simpl-json.mdbefore authoring or repairing that plugin's shape by hand — the shapesData.Unresolved[]names (Rule 4), anything Step 12 reports, and any pluginsdd convertdoes not cover. A shape that arrived in the converted plan needs noimpl-json.mdread: convert emitted it, Rule 4 settles it, and opening the recipe for it costs a whole-file read that changes nothing. Whatever you open, read the section you need per Rule 25; never guess JSON shapes. -
The build is lossless against the SDD. Never author an intermediate plan file:
sdd.mdis the plan, and restating it drifts from it.caseplan.casemust end with one element for every SDD stage, task, trigger, condition, SLA rule, variable, and argument, including explicit defaults — most of them emitted bysdd convert(Rule 4) and the rest filled in after; this rule is about what the finished artifact contains, never about writing each element by hand. Preserve every valid explicit rule/selector exactly; reject and repair invalidselected-tasks-completedselectors. Copy a stage or task's**Description:**line into the element'sdescription, word for word; use its**Design Rationale:**there only when the block writes no**Description:**. Rationales otherwise, the SLA rationale, and condition routing/activation rationales go intobuild-issues.md, which is also where a**Description:**goes when the element has nodescriptionslot. Preserve every Inputs row, binding mode, and value. Preserve JSON object literals exactly: native object or JSON-encoded string ininput.value; add=js:/=jsonString:only when explicitly present in the SDD. Project Outputs throughplugins/variables/io-binding/planning.md, preserving operator and operands. SDD output rows require->or=; schema-discovered bare outputs are not authored SDD rows. Never simplify equal-name->rows;greeting -> greetingdiffers from schema-discovered baregreeting.—placeholders are not operands. AskUserQuestion for unrecognized or ambiguous rows; never omit silently. Regenerate greenfield builds from scratch; brownfield edits preserve IDs. Every task node carries its ownentryConditionsderived from its SDD Entry Condition table and Activation Mode — write it per task, never once for a group of similar tasks;validateonly warnsTask has no entry rules, while a miss hangscase debugindefinitely. See references/implementation.md.Completion is
--strict --sdd, never a default-profileValid. At Step 12 runuip maestro case validate <caseplan.case> --strict --sdd sdd.mdand close everySTRICT_SDD_*finding and everysdd convertData.Unresolved[]entry before reporting the build complete. PlainvalidatereturnsValidon a plan missing stages, tasks, conditions, SLA rules and output types; never report thatValidas the build's result. -
Build gate. Phase 1 auto-proceeds to Phase 2. Stop after resolution only when the request explicitly says design-only, Phase 1 only, review first, or not to build. Re-read
sdd.mdandtasks/registry-resolved.jsonat Phase 2 and Phase 3 entry — context may have compacted. -
Unresolved resources. Never fabricate IDs. Keep
<UNRESOLVED: ...>intasks/registry-resolved.json. A placeholder task hastype,displayName, structural fields, anddata: {}; conditions still reference its TaskId. A placeholder event trigger keeps its render fields anddata.inputswith onlyserviceType,entryPointId, and theobjectNamecontext entry (the SDD Source) thatsdd convertemits; append itsentry-points.jsonentry and create no trigger edge. See references/placeholder-tasks.md and impl-json.md § Placeholder fallback. -
Resolution audit.
tasks/registry-resolved.jsonholds one object per task with exact keysstage,task,taskType,cacheFile,searchQuery,matches,selected, andrationale, plus resolved I/O/review metadata.uip maestro case sdd resolve --outwrites it (Rule 3): an object whoseresolvedarray holds those entries, besideunresolvedandscope. Keep that shape — never re-wrap it, nest it deeper, or flatten it by hand. Consumers search for the entries, but that search is depth-bounded: a ledger it cannot find is indistinguishable from no ledger, and a justified placeholder then fails validation instead of warning. Resolve records each resource normalized as{name, identifierField, identifier, folder}; read a task's identity from those fields and never re-copy the cache object into them. Everything else in the ledger is added with Edit to the entry it belongs to:gateDecision, the identity-slot marker below,wiringNotes, and one entry each for triggers and connector-bound conditions, which resolve does not cover. A same-session planner ledger is persisted verbatim instead (Rule 3), in whatever shape it arrived; consumers read both. AddgateDecisiononly when the user answered the design-time resource gate; default deferrals have none.matchesis the complete exact-name set from the refreshed cache;selectedis a match ornullafter a genuine empty lookup. A genuine miss — an entry resolve lists inunresolved[], or one a manual lookup left empty — MUST also carry the identity slot for its task type —taskTypeIdfor non-connector tasks,typeId/connectionIdfor connector tasks and triggers — holding the<UNRESOLVED: <reason>>text Rule 9 requires. Await-for-timerentry, which resolve records withselected: nullbecause it runs no tenant resource, is never a miss and takes no marker. A connector entry is resolved by the connector pipeline (connector-integration.md), not by resolve, so its marker follows that pipeline's outcome — resolve'sselected: nullon it means only that resolve did not look.selected: nullon its own does not record the miss: the marker is what Phase 2 reads to emit a placeholder instead of fetching a schema. Same-session planner ledgers are persisted verbatim, then verified/extended under Rule 3. The resolution ledger andregistry-resolved.jsonare machine-only — never shown to the user, including in the Case Review. -
Cross-task references. Use
"Stage Name"."Task Name".output_nameand the common output-reference-ID algorithm inplugins/variables/io-binding/impl-json.md. Use the source output’s.id; only a custom=output without.iduses its verified root companion’s.id. Never use a reassigned output’s.var. Discover names withuip maestro case specfor connector tasks oruip maestro case tasks describefor non-connectors. In larger=js:expressions usevars.$xref('Stage','Task','output'), resolved at Step 11.5. See references/bindings-and-expressions.md. -
Build-review preference. Capture once at journey start. Design handoff folds it into the Case Review Build options (
Build it — straight throughorBuild it — pause at the build preview); provided SDD asks once after the roadmap. Non-interactive and resumed runs without a preference default to straight-through. At Phase 2→3, tryvalidate --skeleton-v2; fall back once to legacy--skeletononly when the response explicitly says v2 is unknown/unsupported, typically invalid_argument/exit 3. Exit 3 alone is insufficient; real v2 failures are reported. Validation findings do not halt this advisory gate. Straight-through continues without prompting. Pause-at-preview follows references/phased-execution.md: AskUserQuestionPublish for review/Skip publish and continue/Abort; on publish, refresh resources, upload with the required filter, printDesignerUrlbefore the follow-up, then askContinue to implementation/Abort. Hard stops always remain at Phase 4 retry exhaustion, Phase 5, Phase 6, Phase 7, and any re-publish after a Phase 6 fix. -
Never auto-debug or publish to Orchestrator.
uip maestro case debugexecutes real emails, messages, and API calls. Phase 7 (case pack→solution pack→solution publish) ships to the tenant. Each requires its own AskUserQuestion consent. -
Artifact I/O. The plan file is
caseplan.case. Name a plan you createcaseplan.case, with entry points namingcaseplan.case.bpmnand the package descriptor naming both. If the project already holds a plan under another Studio Web name —caseplan.json,case.stage.json,default.stage.json, for example one an oldercase initseeded — that file is the plan: write and validate it, and never create a second plan file beside it, because the CLI and Studio Web read only the newest name present andcase packrefuses an entry point naming another plan's sidecar. Whencase initis unavailable and the T01 direct-JSON scaffold creates the project (Rule 24), the CLI predates.casesupport, so name that plancaseplan.json. Everycaseplan.casein this skill means that file. Forcaseplan.case,sdd.md,sdd.draft.md,tasks/registry-resolved.json,tasks/trigger-spec-cache.json,tasks/spec-cache.<elementId>.json,id-map.json,entry-points.json, andbuild-issues.md, use only your harness's file tools (bindings_v2.jsonis the exception:uip maestro case bindings syncgenerates it; never write it by hand.caseplan.casehas one sanctioned generator too —uip maestro case sdd convert --outemits the initial plan fromsdd.mdat the top of Phase 2; every edit after that emission is Write/Edit like any other.tasks/registry-resolved.jsonhas one as well —uip maestro case sdd resolve --outwrites it in Phase 1 (Rule 3); every addition after that is Edit.tasks/spec-cache.<elementId>.jsonis the third exception: redirectuip maestro case spec --output jsoninto it, because a hand-copy of the tens-of-KB response drops subtrees silently. That redirect is write-once and the only one this rule permits; never edit the file afterward or redirect into any other covered artifact. Each event trigger merges its T-number key intotasks/trigger-spec-cache.jsonwith Write/Edit): mutate only with Write / Edit (orapply_patch). The ban is on the write path only. Never mutate one of these files by script: nosed -i,perl -pi,awk,jq, Python or Node rewrite, shell redirection,tee,cp,mv,install,rsync, or agent-authored script of any kind, including under/tmp. Reading is unrestricted —cat,sed -n,head,rg,jqprojections,python3 -creads are all allowed, on these artifacts and on~/.uip/case-resources/. This rule stops an artifact being AUTHORED or EDITED by script, never CHECKED; the caseplan's own check isuip maestro case validate --strict --sdd(Rule 7). Ifcaseplan.caseexceeds about 30KB, read it by the preview/detail cadence in case-editing-operations.md rather than whole. Bash is allowed for read-only inspection, UUID v4 generation without filesystem access, CLI metadata, validate,format,bindings sync,splice,sdd parse,sdd resolve,sdd convert, debug, and solution scaffold/upload. Prefixed IDs are chosen inline. Writecaseplan.casepretty-printed, and runuip maestro case format "<caseplan.case path>" --output jsonafter every write — the only sanctioned reformat. A compact plan cannot be patched by Edit/apply_patch, and every observedperl -pi/sed -iviolation of this rule started from a compact file. Format's exact output and idempotency: case-commands.md § uip maestro case format. -
Runnable resources and sidecars. Before Phase 4, run Step 12 Checks 7, 9, 11, and 12 even when publish, debug, or resource refresh is skipped. A non-null
selectedresource must not become a placeholder: retaindata.nameanddata.folderPathwith complete root bindings, regenerate the sidecar withuip maestro case bindings sync, and make itsresourceKeyself-consistent with its own defaults, never a copied tenant identity/UUID. Per-check scope and repairs are in implementation.md § Step 12. Every connector context'sconnectionentry must resolve to a declared Connection root binding — connector tasks get it fromuip maestro case splice, which writes the=bindings.<id>reference and both root bindings from the saved spec in one call; the event-trigger node and connector-bound rules take the spec's=bindings.<id>reference and the ConnectionId and FolderKey root bindings in the same edit; afolderKeyholding the connection id, or a connector with no Connection binding inbindings[], is a resource that will never resolve. Completion is--strict --sddper Rule 7; which profile runs in which phase, the don't-chain rule and the CLI 1.202 version guard are in case-commands.md § uip maestro case validate. Repair and recheck mismatches; halt before Phase 4 if they remain. Repeat Check 7 before everyresources refresh. Runuip solution resources refreshwhenever the plan binds a connector connection — not only before an upload or a debug, and again before every upload or debug: it is what emitsresources/*/connection/*.json, and without it a plan that validates clean packs a solution that cannot connect (bindings-v2-sync.md). Upload flags and the DesignerUrl report are in phased-execution.md § Phase 5. -
Handoff contract. Invoke
uipath-planner’s Case Design Lane in this conversation, never as a subagent. It owns design, resolution, review, and SDD writing; this skill resumes at solution initialization. User-facing language presents one continuous flow and never mentions the handoff. If unavailable, say so in one line, requestsdd.mdor an approved pasted design, and stop. Cross-product planning remains a plain-text suggestion to the planner. Apply the Rule 2 receipt spot-check before unobserved SDD reads. -
Closed task types.
caseplan.casetasktypemust be exactly one of:process,agent,rpa,action,api-workflow,function,business-rule,case-management,execute-connector-activity,flow-process,http-request,document-extraction,wait-for-connector,external-agent,external-workflow,wait-for-timer. Never use plugin folder or CLI names,wait-for-event, or other invented values. The unsupported types remain unsupported. See references/case-schema.md and the Plugin Index. -
Empty lookup gate. If the same-session ledger has a user
gateDecision, execute it without asking again:resolve-at-build→ placeholder;create-during-build→ inline create;pick:<name>→ bind it. A missing decision is a default deferral, not consent; run the full gate. For zero matches, use one batched AskUserQuestion grouped by(name,type)with:Force pull and re-resolve;Use placeholders for all; and, only when creatable resources exist andregistry --localis supported,Create missing resources inline. For several exact-name matches the SDD's folder did not narrow, never pick one by position: the cache lists resources in the order the tenant registered them, so the first is whichever was deployed earliest — often another team's fixture or a debug copy. Ask in the same batch which candidate is meant, one option per candidate named by its folder, plusUse a placeholder; unanswered or non-interactive, it stays<UNRESOLVED>. Create only selectedagent,api-workflow, orbusiness-ruleresources, invokinguipath-agents,uipath-api-workflow, oruipath-rules; never infer Create from SDD content. Other empty types remain placeholder-only. Selected resources with identical I/O may share one build; differing I/O splits later with the anchor retaining the name, and SDD updates require permission. See registry-discovery.md § 1c, Create-on-Missing, and § MUST Confirm. -
Layout. Emit top-level
layout: {}only. Do not emit nodeposition,style,measured,width,height,zIndex, or edgedata.waypoints; do not compute positions. -
Global output IDs. Run Step 12 Check 8 once at Phase 3 exit. It is mandatory; do not enter Phase 4 until it passes and do not substitute CLI validate.
-
No authored edges. Keep
schema.edgesas[]; never author TriggerEdge/Edge objects. Conditions provide stage flow; the first stage usescase-entered. Read-only edge shapes are documented in case-schema.md Appendix. -
Global events and SLA responses. Model a global external event once as an interrupting secondary-stage
wait-for-connectorentry. Choose SLA response explicitly:notify-only,start-task,enter-stage,exit-stage, orexit-case. Astart-taskresponse belongs on the follow-up task’s ownsla-status-changeentry, not a stage entry. Interrupting depends on whether active work stops, pauses, or reroutes; parallel oversight usesInterrupting: Noand remains secondary.sla-status-changenamesslaId; addescalationIdonly for at-risk responses. Without a stated response, at-risk and breach are notifications. Do not replicate rules across primary stages. See references/sla-response-shapes.md and the SLA Response Map. -
Formal argument IDs.
variables.inputs[].idandvariables.outputs[].idmust be syntheticv+ 8 characters and distinct fromname/var; never copy companion names. Run Step 12 Check 10 once at Phase 3 exit and non-interactively re-mint violations. CLI validate does not check this. See global-vars/impl-json.md § Formal-arg slot ID format.
- Scaffold with
uip solution init, thenuip maestro case initfrom inside the solution directory.cd <SolutionDir>first;&&-chaining afteruip solution initdoes not satisfy it and lands the project outside the solution, auto-scaffolding a second one. ConfirmData.SolutionRegistration.StatusisRegisteredorAlreadyRegistered. Use the T01 direct-JSON scaffold in implementation.md § Step 6 only whencase initis unavailable. See case-commands.md § case init.
- Read the passage a mutation uses before making it. Before the first Write/Edit that uses a shape, procedure, constraint, or verification rule from a reference, read the section that states it, whole: find it by its heading (the reference's headings, or a search for the term), then read from that heading to the next heading of the same level. A whole-file read is not required, and the file's
<!-- END: <filename> -->marker need not appear. Exception — brownfield recipes: an edit covered by a recipe in edit-recipes-guide.md needs only that recipe; read another reference only when the recipe names it. A search hit alone, memory, and a sibling reference do not satisfy this. When the section you read points to another section, read that one too. Reopen a section after compaction or when the prior read is unavailable. - Unique labels and task names. Stage
data.labelvalues are unique case-wide; taskdisplayNamevalues are unique across all stages, exact and untrimmed, and contain no:. A missing display name binds to the resource name and participates in uniqueness. ConditiondisplayNamevalues are unique case-wide across all four condition scopes, except the frontend's own default names (Entry rule <N>,Exit rule <N>,Completion rule <N>,Stage complete,Stage exit,Tasks completed rule,Previous task completed), which repeat freely and are never renumbered. Number the names you author yourself with a case-wide counter per label kind, never a per-stage or per-task one (case-schema.md § Condition name uniqueness). Assign names in Phase 1; later renaming touches the SDD, plan, ID map, and name-keyed references.
Routing
| Condition | Journey |
|---|---|
| New case, SDD provided, no caseplan, or rebuild from spec | Greenfield: handoff if needed, then Phases 1–7 |
| Existing caseplan and targeted edit intent | Brownfield: skip handoff and Phases 1–7; use brownfield.md |
Brownfield still requires latest-state pull, debug consent, and Orchestrator-publish consent, and reuses Phase 5–7 contracts.
User-Facing Roadmap
Print once, after routing and before detailed work, in five lines or fewer. Do not expose phases, modes, filenames, or implementation mechanics.
- New case without SDD:
1. I read your request and make the design calls, checking your UiPath tenant along the way. 2. One review packet: case snapshot, primary journey, other paths, SLA responses, business rules, resources, and every decision I made — you confirm or correct. 3. Build and validate without interruptions; the full technical design doc is saved alongside for reference. 4. Pause for your call before any run or publish. - New case with SDD:
1. Read the design and verify available UiPath resources. 2. One question: build straight through, or pause at a mid-build preview. 3. Plan, build, and validate without further interruptions. 4. Pause for your call before any run or publish. - Targeted edit:
1. Pull the latest case. 2. Apply the requested change. 3. Validate the updated case. 4. Ask before running or publishing anything.
Workflow
Front-load decisions, then run unattended to consent gates:
Design handoff when required → Phase 1 Planning → Phase 2 Prototyping → Phase 3 Implementation → Phase 4 Validate → Phase 5 Publish → Phase 6 Debug → Phase 7 Publish to Orchestrator.
At invocation start, present once the matching kickoff block below, at handoff start or Phase 1 start. Status text must follow the Anti-patterns limits.
Greenfield kickoff:
Here's how I'll build this case, and where I'll stop for your call:
- Planning — I draft a task plan from the spec and continue; ask up front if you want to review it first.
- Prototyping — I build the reviewable case flow (stages, tasks, triggers, rules, SLA/escalation; connector rules use stubs). Whether I pause here for a Studio Web preview is your up-front call — asked once at the start, never mid-build.
- Implementation — I wire task inputs/outputs, connector schemas, and resolved connector-rule details.
- Validate — I run validation and fix errors.
- Publish (optional) — you choose whether to upload to Studio Web.
- Debug (optional) — you choose whether to run the case for real (live emails / API calls).
- Publish to Orchestrator (optional) — you choose whether to publish the case to Orchestrator.
For handoff, prefix: First I'll design the case from what you've given me — checking your UiPath tenant along the way — and show one decision-first review packet with the case snapshot, primary journey, other paths, SLA responses, business rules, resources, and every decision made — one confirmation, then I build; the full technical design doc (sdd.md) is saved alongside for reference.
For brownfield, use the short entry flow in references/brownfield.md.
Design handoff
The trigger is binary: if no .md whose basename contains sdd exists at the resolved path, hand off. If the prompt names another SDD basename, copy it to ./sdd.md using Read + Write; do not invoke the lane. If no .md is named, use ./sdd.md. Do not read planning/plugin references or run tenant commands before the Case Review. For an explicit no-build design request, write sdd.md after approval, without plugin references, schema, registry, connection, or user discovery, then stop — do not author a plan file in place of the build. Planner-owned drafts and sdd-viewer.html stay with the planner. If unavailable, request an SDD and stop.
Phase 1 — Resolution
Read references/planning.md to produce:
tasks/registry-resolved.json: complete resolution audit — tenant identities only, never a copy of the SDD's structure or contract.- If Create is selected at Rule 18: build selected agents/API workflows/business rules as in-solution siblings through the permitted sub-agent paths, ensure a solution exists, register them, refresh resources, rediscover, and bind them. See registry-discovery.md § Create-on-Missing.
tasks/ is adjacent to sdd.md, never inside the solution/project. Auto-proceed to Phase 2 unless the request explicitly asks to stop before the build. Re-read sdd.md and the ledger first.
Phase 2 — Prototyping
Read references/implementation.md and references/phased-execution.md. Follow Steps 6–11.9:
- Step 6:
uip solution init, thenuip maestro case initfrom inside the solution directory (Rule 24), thensdd convert --outthe caseplan into the plan filecase initseeded (Rule 4). The T01 direct-JSON recipe in plugins/case/impl-json.md is the fallback when the installed CLI has nocase initor nosdd convert, and the reference for the root shape either way.
- Step 6.1: manual, timer, and event triggers, including Rule 9 placeholders; capture trigger IDs.
- Step 6.2: global variables and arguments; In-argument
elementIdreferences the trigger named bysourceTriggers, or the primary trigger when blank. - Step 6.3: synchronize
entry-points.jsonfrom declared In/Out arguments per entry-points-sync.md. Emit thejob-attachmentdefinitionsblock byte-for-byte from that reference — reproduce itsMimeType.descriptioninner quotes exactly (single-\"escaping); never re-escape (\\") or rebalance them, or the JSON breaks. - Step 7: stages.
- Step 9: task shapes; non-connectors get complete
data.inputs[]with empty values, connectors onlytypeId/connectionId, unresolved resources use placeholders. - Step 11: SLA/escalation objects with stable IDs.
- Step 10: all four condition scopes; connector waits use canonical stubs regardless of resolution.
- Step 11.9: informational skeleton validation with Rule 12 fallback behavior.
- Apply the Phase 2→3 preference. Preview branch uses resource refresh, filtered solution upload, printed DesignerUrl, and the prescribed continuation gate; Abort writes
build-issues.mdand exits.
Phase 3 — Implementation
Re-read the SDD's task detail blocks, tasks/registry-resolved.json, and caseplan.case (Step 9.6), then follow Steps 9.7, 9.8, 10.5, and 11.5:
- Resolve connector schemas/defaults with
uip maestro case spec. - Bind I/O for all task classes using io-binding/impl-json.md.
- Upgrade resolved connector-bound condition stubs in place; unresolved connectors retain stubs and are reported.
- Resolve in-expression
vars.$xrefmarkers. - Perform resolved-resource emission, preservation, resourceKey, and connector completeness checks.
Proceed directly to Phase 4 after the Phase 3 checks pass.
Phase 4 — Validate
Run Step 12 once at the Phase 3 boundary. It performs Checks 1–15, including Check 7 sidecar parity, Check 8 global output-ID uniqueness, Check 9 resource emission/preservation, Check 10 formal-arg IDs, Check 11 resourceKey consistency, Check 12 connector completeness, and Check 15 every task carrying a non-empty entry rule (validate only warns on a missing one). Then run full uip maestro case validate. Retry at most three times, with an edit before every retry; on the third failure, hard-stop with AskUserQuestion: Retry with fix / Pause for manual edit / Abort. Summarize build-issues.md using Step 12.1.
Phase 5 — Publish
Provide the completion report, then hard-stop AskUserQuestion: Publish to Studio Web / Skip to Debug (Step 13). On publish, refresh resources and upload with the mandatory output filter, print DesignerUrl, and continue to Phase 6 either way.
Phase 6 — Debug
Hard-stop AskUserQuestion (Step 15): Run debug session / Continue to publish. On Run, refresh resources, run uip maestro case debug, and loop after completion until Continue to publish. Never run debug automatically.
Phase 7 — Publish to Orchestrator
Hard-stop AskUserQuestion (Step 16): Publish to Orchestrator / Done. On publish, run in order:
uip solution resources refreshuip maestro case pack <SolutionDir>/<ProjectName> <SolutionDir>/dist --output jsonuip solution pack <SolutionDir> <SolutionDir>/dist --output jsonuip solution publish <packagePath> --wait --output json
case pack is mandatory because it creates caseplan.case.bpmn; validate does not. Publish the solution pack .zip, not the case .nupkg; read <packagePath> from Data.Packages, never guess. Done exits.
Reference Navigation
| Need | Reference |
|---|---|
| Design without SDD | uipath-planner Case Design Lane; Rule 16 |
| Resolve resources from SDD | references/planning.md |
| Build caseplan from SDD | references/implementation.md |
| Brownfield edit | references/brownfield.md; common edits: references/edit-recipes-guide.md |
| Phase contracts | references/phased-execution.md |
| Edit mechanics | references/case-editing-operations.md |
| Schema | references/case-schema.md |
| Allowed CLI | references/case-commands.md |
| Troubleshooting | references/troubleshooting-guide.md |
| Registry resolution | references/registry-discovery.md |
| Bindings/expressions | references/bindings-and-expressions.md |
| Connector integration | references/connector-integration.md |
| Case spec input details | references/case-spec-input-details.md |
| Placeholders | references/placeholder-tasks.md |
| Bindings sidecar | references/bindings-v2-sync.md |
| Prune orphaned solution resource | bindings-v2-sync.md § Prune orphaned solution resources |
| Entry points | references/entry-points-sync.md |
| SLA responses | references/sla-response-shapes.md |
Plugin Index
Structural: case/planning.md, stages/planning.md, sla/planning.md, global-vars/planning.md, io-binding/planning.md, and logging/impl-json.md.
Tasks:
Schema type / SDD value | Plugin planning reference | CLI describe type |
|---|---|---|
process | process | process |
agent | agent | agent |
rpa | rpa | rpa |
action | action | action |
api-workflow | api-workflow | api-workflow |
function | function | function |
business-rule | business-rule | business-rule |
case-management | case-management | case-management |
execute-connector-activity | connector-activity | connector-activity |
flow-process | flow-process | flow-process |
http-request | http-request | — (sdd convert writes it) |
document-extraction | document-extraction | — (sdd convert writes it) |
wait-for-connector | connector-trigger | connector-trigger |
external-agent | connector-activity § External agents and automations | external-agent |
external-workflow | connector-activity § External agents and automations | external-workflow |
wait-for-timer | wait-for-timer | wait-for-timer |
Schema-kebab is the only JSON value; plugin and CLI names are not interchangeable. Unsupported types include wait-for-event.
Triggers: manual, timer, and event.
Conditions: stage-entry-conditions, stage-exit-conditions, task-entry-conditions, and case-exit-conditions.
Connector-bound rules in any condition scope require rule.uipath built from case spec --type trigger; bare connector rules are invalid in Studio Web even when CLI validate passes. See connector-trigger-impl.md.
Anti-patterns
- Do not leave a regular stage without an entry condition. The first stage uses
case-entered; every other regular stage needs a reachable predecessor. Edges are retired.validateerrors on this (CASE_MGMT_STAGE_ENTRY_CONDITION_MISSING). - Do not design here, start Phase 1 before Case Review approval, or build from a summary SDD. The planner owns design, other-path analysis, and template conformance.
- Do not validate after each element or validate twice without an intervening edit. Phase 2 validation is informational; Phase 4 validation is authoritative and runs
--strict— do not finish on a default-profileValid. - Do not author
tasks/tasks.md, a T-numbered task list, or any other restatement of the SDD. The SDD is the plan; Phase 2 derivescaseplan.casefrom it withsdd convert(Rule 4) and completes the remainder, and Step 12'svalidate --strict --sdd sdd.mdaudits the artifact against it. A generatedcaseplan.caseis the artifact, not a restatement — this prohibition is about prose plans, never about the converter's output. - Never one Write for the whole
caseplan.case:sdd convertemits it and every change after that is a targeted Edit preserving untouched siblings. Re-read the plan andsdd.mdafter an interruption. Write cadence for the cases that still need one — brownfield section rewrites, acase init-unavailable scaffold — is in case-editing-operations.md § Per-section batch write contract. - Do not emit standalone narration between tool calls. Bundle status with the next tool call; keep ordinary text under 200 tokens and allow-listed kickoff, hard-stop preambles, completion reports, DesignerUrl prints, and validation summaries under 500. Do not announce imminent actions with verbs such as
Building,Composing,Writing,Drafting,Generating,Now I'll,Next,Approach,Strategy,Plan,Let me, or equivalent. - Preserve ordered task semantics. Sequential mode uses ordered
data.taskssets and oneruns-sequentiallyrule per task; do not addcurrent-stage-enteredalongside it. Use parallelcurrent-stage-enteredonly for independent work andselected-tasks-completedonly for required fan-in. Event-triggered tasks use event/condition rules; manually triggered/adhoc tasks use oneadhocrule,isRequired: false, and no additional entry event.adhocis an activation mode, not a task type. - Model secondary stages as interrupting exception lanes:
case-management:Stage,data.stageType: "secondary",isRequired: false, andInterrupting: Yeson stage and entries. UseInterrupting: Noonly for parallel SLA oversight. Usereturn-to-origin; do not connect secondary stages as normal flow or count them in required completion. - Do not replicate global events or SLA rules across primary stages. Case completion requires a root
metadata.caseExitRules[]rule withmarksCaseComplete: true; stage completion alone is insufficient. Non-completing outcomes usemarksCaseComplete: false. - Do not edit generated
caseplan.case.bpmn; do not placecaseplan.caseundercontent/; do not fabricate conditional-SLA expression syntax —validate --stricterrors on a namespace-less=js:identifier (STRICT_JS_UNKNOWN_IDENTIFIER); describe conditions naturally until execution resolves them. - Do not place
tasks/in the solution/project; it stays besidesdd.md. - Do not invoke other skills automatically except Rule 16 design handoff and Rule 18’s gate-selected inline creation of agents/API workflows/business rules. Do not spawn subagents for design, draft finalization, or plan-only documents.
- Do not read the installed CLI to interpret its own output.
validatefindings name the element path and the repair; the fix is in the caseplan or the reference that owns that shape, never innode_modules/@uipath/**/dist. Grepping a bundled chunk, or reimplementing a compare innode -eto predict it, spends the turn budget on the tool instead of the plan — one nightly task spent 56 of its 151 commands there and ran out of clock. If a finding is unclear after re-reading the named element and its reference, repair what the message names and move on; if it still fires, report it with/uipath-feedback. - Use
uipath-feedbackfor trouble.
Trouble? Use
/uipath-feedbackto send a report.