Agent skill

Uipath Human In The Loop

by UiPath in UiPath/skills

UiPath Human-in-the-Loop / HITL node authoring — building approval gates, escalations, write-back validation, and data enrichment checkpoints in Flow, Maestro, Case Management, or Coded Agents.

MITAuto-check: notesAgent Workflows

Install Uipath Human In The Loop

skills CLI
$ npx skills add UiPath/skills --skill uipath-human-in-the-loop -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install UiPath/skills uipath-human-in-the-loop --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/uipath-human-in-the-loop .claude/skills/uipath-human-in-the-loop && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
uipath-human-in-the-loop
GitHub stars
167
Token cost
~9.1k tokens
SKILL.md length
4,291 words
Files
6 (incl. references)
Skills in repo
28
Repo updated
First seen
Licence
MIT

At a glance

UiPath Human-in-the-Loop / HITL node authoring — building approval gates, escalations, write-back validation, and data enrichment checkpoints in Flow, Maestro, Case Management, or Coded Agents.

  • Works in 7 steps: Resolve the uip binary → Detect the Surface and Find the Flow File → Read the Business Context → …
  • Tasks that involve Human-in-the-loop approvals
  • SKILL.md covers When to Use This Skill, Critical Rules, Step 0 — Resolve the uip binary and Step 1 — Detect the Surface…, plus 8 more sections
  • Calls npm and bun; reaches json-schema.org

What it does

Uipath Human In The Loop is an agent skill from UiPath/skills. UiPath Human-in-the-Loop / HITL node authoring — building approval gates, escalations, write-back validation, and data enrichment checkpoints in Flow, Maestro, Case Management, or Coded Agents. NOT for managing, reassigning, or monitoring tasks at runtime (use uipath-tasks for that).

Its SKILL.md is about 9.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/hitl-casetask-action.md`, `references/hitl-node-apptask.md` and `references/hitl-node-coded-action-app.md`).

It sits in Agent Workflows, covering Human-in-the-loop approvals and Mobile testing and debugging. The repository describes itself as: This is a repository of skills for interfacing UiPath capabilities to external developers. The licence is MIT.

When your agent uses it

  • Tasks that involve Human-in-the-loop approvals
  • Tasks that involve Mobile testing and debugging

Example prompts

  • “/uipath-human-in-the-loop”

Requirements

  • Pre-approved tools (allowed-tools): Bash, Read, Write, Edit, Glob, Grep

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Resolve the uip binary
  2. Detect the Surface and Find the Flow File
  3. Read the Business Context
  4. Choose Task Type
  5. Common configuration
  6. Write the Node Directly
  7. Report to the User

What it can do on your machine

Read from SKILL.md and the folder at commit 0bada1b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash
    • Read
    • Write
    • Edit
    • Glob
    • Grep

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm
    • bun

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • json-schema.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Uipath Human In The Loop loads about 9.1k tokens when it runs, and up to ~29k if it reads all its reference files. Until then it costs about 77 tokens; SKILL.md has 4,291 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~77
When it runs · the whole SKILL.md, loaded when a task matches
~9.1k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~29k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash, Read, Write, Edit, Glob, Grep

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from UiPath/skills at commit 0bada1b, republished under its MIT licence (© UiPath). 4,291 words, ~9,104 tokens.

Download SKILL.mdSave it as .claude/skills/uipath-human-in-the-loop/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
uipath-human-in-the-loop
description
UiPath Human-in-the-Loop / HITL node authoring — building approval gates, escalations, write-back validation, and data enrichment checkpoints in Flow, Maestro, Case Management, or Coded Agents. NOT for managing, reassigning, or monitoring tasks at runtime (use uipath-tasks for that).
allowed-tools
Bash, Read, Write, Edit, Glob, Grep

UiPath Human-in-the-Loop Assistant

Recognizes when a business process needs a human decision point, designs the task schema through conversation, and wires the HITL node into the automation — Flow, Maestro, Case Management, or Agent.

Coded agents: for wiring HITL inside a coded agent, use the uipath-agents skill — see skills/uipath-agents/references/coded/capabilities/human-in-the-loop.md.

When to Use This Skill

  • User describes approval gates — invoice approval, offer letter review, compliance sign-off, PO authorization
  • User describes exception escalation — "if confidence is low, escalate to a human", fraud alert review
  • User describes write-back validation — "human approves before agent writes to ServiceNow / SAP / CRM"
  • User describes data enrichment — human fills in missing fields the automation cannot resolve
  • User describes agentic output review — "review AI-generated email/RCA/summary before it goes out"
  • User describes IT change or access approval — CAB gate, runbook sign-off, access provisioning review
  • User describes HR or contract workflow — offer letter review, contract approval, termination sign-off
  • User describes financial transaction approval — payment release, price override, expense over limit
  • User describes customer communication approval — agent-drafted reply that needs human sign-off before sending
  • User explicitly asks to add a HITL node, human review step, or Action Center task
  • User is building any automation where a human must act before the process can continue

Do not use this skill for: managing, reassigning, escalating, or monitoring existing Action Center tasks at runtime — use the uipath-tasks skill for those operations. When answering a runtime task management question, provide only administration guidance. Do NOT suggest adding a HITL node, flow, or automation as a follow-up tip or recommendation — even if delays or escalations are mentioned.

See references/hitl-patterns.md for the full business pattern recognition guide.


Critical Rules

  1. Never block on schema confirmation. Design the schema from the prompt and any upstream .flow/caseplan.json data, write the node, and record the chosen schema prominently in the final report so the user can adjust it afterward. Asking the user is never a precondition for proceeding — if the user is present and offers input, use it, but do not wait for it. Only stop and report the open decision when the request is genuinely too ambiguous to make any reasonable inference. (A prompt that already specifies the fields, outcomes, and output shape is never too ambiguous.)
  2. Wire every QuickForm outcome's own port. A QuickForm node has one output handle per outcome, named outcome-<outcome.id> — never a single completed handle. outcome-completed is a placeholder that exists only on a schema with zero outcomes; it disappears the instant inputs.schema.outcomes has any entry, including the shipped default Submit. A HITL node with any outcome port left unwired blocks the flow forever on that branch. App-based (coded-action-app) nodes are different: their port stays a static completed regardless of the app's own outcomes — do not add an inputs.schema block to an app-based node, which would wrongly flip it onto an outcome-derived port. Neither node type ever uses output, success, or any other name.
  3. Always add the definition entry when inserting into an existing flow. Before writing the node, check workflow.definitions[] for the correct nodeType for the selected path ("uipath.human-in-the-loop.quick-form" for QuickForm, "uipath.human-in-the-loop.coded-action-app" for app-based). If absent, append the full definition entry with its handleConfiguration block. Skipping the definition means the node's handles are invisible to the runtime and the wiring check fails.
  4. Regenerate variables.nodes after adding the node. Replace the entire workflow.variables.nodes array — do not append. See the reference docs for the algorithm.
  5. Validate after every change. Run uip maestro flow validate <file> --output json after writing the node and edges. The uip CLI does not accept --format; using it produces error: unknown option '--format' and exit code 3.
  6. Read the existing .flow file before adding. Understand which nodes already exist and where the HITL checkpoint belongs in the flow.
  7. The definition entry is added once per node type. Check workflow.definitions — if an entry with the matching nodeType is already there, do not add it again.
  8. Check existing node IDs before generating a new one. Read workflow.nodes[*].id from the .flow file and pick the next available suffix (e.g. invoiceReview1, then invoiceReview2).
  9. Never report a failed validation as done. If uip maestro flow validate returns errors, diagnose from the JSON output and fix before reporting to the user.
  10. Output fields are accessed by field.id, not field.variable. The runtime result object uses field IDs as keys — $vars.<nodeId>.output.<fieldId>. The variable property only creates a workflow-global alias; it does NOT change the key used in the node output object, and it is NOT how downstream scripts read the value.
    • WRONG: $vars.legalApproval — this is the global alias path, not the script access path
    • WRONG: $vars.<nodeId>.output.legalApproval — this uses the variable name as the key
    • RIGHT: $vars.<nodeId>.output.approved — uses field.id ("approved") as the key In every downstream script, use $vars.<nodeId>.output.<fieldId> where <fieldId> is the id you gave the field in the schema — never the variable name.
  11. Input field binding paths use the upstream output key, not the HITL field's own id. These are two different things: the HITL field id identifies the form field (always lowercase); the binding path key is the name used in the upstream script's return statement (preserves camelCase). If a script returns { supplierName: "Acme" }, the correct binding is vars.fetchSupplier.output.supplierName — writing suppliername (the field id) produces a path that does not exist at runtime. The form field will be blank; flow validate will not catch it. Always derive the binding key from the upstream script source, not from the HITL schema you are designing.
  12. Downstream scripts must access $vars.<nodeId>.output. Any script node that runs after the HITL node must read $vars.<nodeId>.output (the result object) — do not rely solely on $vars.<nodeId>.status. Concrete example: const output = $vars.reviewNode1.output; const reason = output.reason;. This is required even when the primary routing uses status.

Step 0 — Resolve the uip binary

bash
UIP=$(command -v uip 2>/dev/null || npm root -g 2>/dev/null | sed 's|/node_modules$||')/bin/uip
$UIP --version

Use $UIP in place of uip for all subsequent commands if the plain uip command isn't found.

Local dev note: If working inside the uipcli repo, replace uip with bun run start.


Step 1 — Detect the Surface and Find the Flow File

Run these checks in order:

bash
# Check for a .flow file (Flow project)
find . -name "*.flow" -maxdepth 4 | head -5

# Check for a Case Management project — detect by content marker, not by filename.
# Project files are flat in the project dir (no content/ dir on disk). The generated
# sibling caseplan.json.bpmn carries the same marker: exclude it, edit caseplan.json.
find . -maxdepth 4 -iname "*.json*" ! -name "*.bpmn" -print0 2>/dev/null | xargs -0 grep -l '"case-management:root"' 2>/dev/null | head -3

# Check for agent.json (Low-Code Agent project)
find . -name "agent.json" -maxdepth 4 | head -3

# Check for Maestro .bpmn (Maestro process)
find . -name "*.bpmn" -maxdepth 4 | head -3
FoundSurfaceHow HITL is added
<!--skill-flavor:flow-sdk-surface-row:start-->

| .flow.ts or .flow file | Flow | Author with hitl(...) in <Name>.flow.ts through the uipath-maestro-flow skill (hitl.md); never write node JSON into the compiled .flow — compile overwrites it |

<!--skill-flavor:flow-sdk-surface-row:end-->

| caseplan.json (any *.json whose nodes[] carry data.parentElement.type: "case-management:root" — the marker is per-node; there is no root node on disk) | Case | Write action task into stage — see hitl-casetask-action.md | | agent.json | Low Code Agent | Escalation CLI in-flight — guide manually for now | | .bpmn (Maestro) | Maestro | Write the UserTask XML directly — see Step 5 Surface: Maestro |

<!--skill-flavor:flow-sdk-hitl-stop:start-->

Flow surface (a .flow.ts, a .flow, or a new flow) — the default: stop here. Hand the HITL request to the uipath-maestro-flow skill: it authors hitl(...) in <Name>.flow.ts — decompiling an existing .flow first — and compiles (hitl.md). Never read or hand-edit the compiled .flow; the next compile overwrites it. Steps 2–6 below cover the Case, Low-Code Agent and Maestro surfaces.

<!--skill-flavor:flow-sdk-hitl-stop:end-->

If the user mentioned a specific file path, use that directly.

<!--skill-flavor:flow-project-creation:start-->

If no .flow file exists and surface is Flow, scaffold solution-first — Flow projects MUST live inside a solution:

bash
# Probe the solution verb once per session before scaffolding:
#   uip solution init --help --output json
# Success → use `solution init` (post-rename, default).
# `unknown command` → CLI predates the rename; substitute `uip solution new <SolutionName>` below.

uip solution init <SolutionName> --output json
cd <SolutionName> && uip maestro flow init <ProjectName>
# Creates: <SolutionName>/<ProjectName>/<ProjectName>.flow

The flow file path is <SolutionName>/<ProjectName>/<ProjectName>.flow (double-nested). <SolutionName>/ is the solution directory (contains the .uipx file); <ProjectName>/ inside it is the flow project. By convention <SolutionName> and <ProjectName> are often the same string, but they are two distinct scaffolding arguments. Run uip maestro flow init outside a solution and it auto-scaffolds <ProjectName>Solution/<ProjectName>/ for you; running uip solution init first lets you control the solution name (otherwise it defaults to <ProjectName>Solution). Passing --skip-solution-registration leaves a bare single-nested <ProjectName>/<ProjectName>.flow layout that fails Studio Web upload, packaging, and downstream tooling.

<!--skill-flavor:flow-project-creation:end-->

Step 2 — Read the Business Context

Read the existing .flow file to understand current nodes and edges. Use the Read tool on the .flow file path, then identify:

  1. Where the human decision point belongs (after which existing node)
  2. What the human needs to see — data produced by upstream nodes
  3. What the human must provide back — data needed by downstream nodes
  4. What actions they can take — the named outcome buttons
  5. Form type: QuickForm (inline schema, node type uipath.human-in-the-loop.quick-form) or AppTask (deployed coded app, node type uipath.human-in-the-loop.coded-action-app)?

Step 2b — Proactive HITL Recommendation

If the user did NOT explicitly mention HITL, scan the business description for these signals before proceeding:

SignalPatternWhy a human checkpoint matters
"agent writes to", "updates", "posts to" an external systemWrite-back validationPrevents incorrect writes to production systems
"if confidence is low", "when uncertain", "edge case"Exception escalationAgent cannot resolve autonomously
"approves", "reviews", "signs off", "four-eyes"Approval gateBusiness or compliance requirement
"fills in missing", "validates extraction", "corrects"Data enrichmentAutomation produced incomplete data
"compliance", "regulatory", "audit trail"Compliance checkpointMandated human sign-off

Never block on this. When a signal is clear-cut (an explicit approval / review / sign-off requirement), add the HITL step and state that you did so, in this form:

"I noticed that [quote the specific part of their description]. This is a [pattern name] — a point where [brief consequence if no human reviews]. I'm inserting a Human-in-the-Loop step here so that [human role] can [action] before the automation [continues/writes/sends]."

Proceed straight to schema design after saying this — do not wait for a reply. Record the decision prominently in the final report so the user can remove the step if they disagree. Only skip adding it and report the open decision when the signal is genuinely ambiguous (not just "no explicit HITL mention" — the signals table above is itself the ambiguity test).

Example:

User: "Build an automation that reads support tickets, uses AI to generate an RCA, and updates the ticket in ServiceNow."

Agent: "I noticed that the automation writes AI-generated content directly back to ServiceNow. This is a write-back validation pattern — if the RCA is incorrect and nobody reviews it, wrong data goes into production tickets. I'm inserting a Human-in-the-Loop step so that a support lead can review and optionally edit the RCA before the update is applied."


Step 3 — Choose Task Type

The options differ by surface. Never block here — pick the option that best fits the surface and the business description, state the choice, and proceed. Only ask when the user is actually present and available; in a non-interactive run, infer and move on.

Surface: Flow

Infer the right option from the signals below and state your choice — do not perform a registry search first, and do not wait for the user to pick before proceeding.

#OptionNode typeDescription
1QuickFormuipath.human-in-the-loop.quick-formInline typed form — fields rendered by Action Center from the schema you design here
2New Coded Action Appuipath.human-in-the-loop.coded-action-appScaffold a new React + TypeScript app inside the solution — full UI control
3Existing Deployed Appuipath.human-in-the-loop.coded-action-appReference an app already deployed to Orchestrator

Default: QuickForm. Pick QuickForm unless the request explicitly names a deployed app, a coded action app, or a custom UI requirement — those are the only signals that point at options 2 or 3. State the choice, do not ask: "I'll use QuickForm — it's inline, no deployment step needed, and works for most approval and review tasks. You can swap in a Coded Action App or an existing deployed app later if you need one."

Option chosenNext step
QuickFormRead How to write a QuickForm HITL node for Steps 1–2, then continue with Step 4
New Coded Action AppRead How to scaffold a new Coded Action App for Step 4c details, then continue with Step 4
Existing Deployed App — the request must already name the appRead How to wire an existing deployed Action App for Step 4b details, then continue with Step 4

Fallback rules — never block on these, fall back and state what you did:

PathBlockerResponse
Existing Deployed AppApp not found in Orchestrator, or no app name was givenFall back to QuickForm and proceed. State: "I couldn't find (or wasn't given) a deployed app name, so I used QuickForm instead. Point me at a real app name and I'll swap it in."
New Coded Action AppNo dist/ build present in the source pathFall back to QuickForm and proceed. State: "The source folder doesn't have a dist/ build yet, so I wired a QuickForm for now — run your build and ask me to swap in the Coded Action App once it's ready."
New Coded Action AppNo source path givenFall back to QuickForm and proceed. State: "No app source path was given, so I used QuickForm to wire the checkpoint now. Point me at the app code and I'll replace it with a Coded Action App."
Any custom appAuth expired (401 on API call)Fall back to QuickForm and proceed. State: "The session looked expired, so I used QuickForm rather than stall on re-authenticating. Run uip login and ask me to swap in the app when you're ready."

Surface: Case

Infer the right option from the description below — do not pull the registry first, and do not wait for the user to pick before proceeding.

#OptionFingerprintDescription
1QuickForm (file-based schema)separate <TaskLabel>.hitl.json file + hitlType: "quick" context entry in the action taskStructured form fields in a .hitl.json file alongside caseplan.json. Action Center renders fields at runtime. No deployed app needed.
2App-based action taskdata.name and data.folderPath as =bindings.<id> references + data.actionCatalogNameUses a deployed Action Center app with custom input/output fields. Requires the app to exist in Orchestrator.

Default: QuickForm. Pick QuickForm unless the request explicitly names a deployed Action Center app. State the choice, do not ask: "I'll use QuickForm — it's the quickest to set up, supports structured form fields, and doesn't need a deployed app. You can upgrade to an app-based task later if you need a custom UI layout."

Build vs design time. QuickForm in case management must round-trip both ways: the JSON written here is what Studio Web's case designer reads (design time), and what uip maestro case validate + Action Center render at runtime (build time). Always validate after writing.

Option chosenNext step
QuickForm (file-based schema)Read references/hitl-casetask-action.md — Path 1, then continue with Step 4
App-based action task — the request must already name the appRead references/hitl-casetask-action.md — Path 2, then continue with Step 4

Fallback rules — never block on these, fall back and state what you did:

PathBlockerResponse
App-basedApp not found in registry or action-apps-index.json, or no app name was givenFall back to QuickForm and proceed. State: "I couldn't find (or wasn't given) that app, so I used QuickForm instead. Point me at a real app name and I'll swap it in."
QuickFormSchema design rejected on validate (e.g. duplicate field IDs, missing primary outcome)Fix the schema yourself from the validator's error and re-validate. Apply Step 4b checks. Note the fix in the final report — do not pause to re-show the schema first.
AnyAuth expired (401 on API call)Fall back to QuickForm and proceed. State: "The session looked expired, so I used QuickForm rather than stall on re-authenticating. Run uip login and ask me to swap in the app when you're ready."

Step 4 — Common configuration

Never block on these — use the stated default when no answer is available, write it into the node, and note the default in the final report so the user can change it.

| Timeout | Default: 24 hours. If the description states or implies a different duration, use that instead. | | Priority | Default: Low. If the description states or implies urgency (e.g. "high priority", "urgent", "time-sensitive"), use High or Medium accordingly. Write the chosen value into the node's priority field — asking the question is not enough; the value must land in the node. |


Show full SKILL.md (1,703 more words)Show less

Step 4b — Schema Design Resilience (QuickForm — Flow and Case)

Apply these checks while designing the schema, before writing it — per Critical Rule 1, do not wait on the user to confirm. Applies equally to Flow QuickForm nodes and Case QuickForm action tasks — same fields[] + outcomes[] shape, same direction semantics.

Field direction

Pick direction based on what the human does with the field:

SignalDirection
"can see", "shown to", "read-only", "displays", "context for reviewer"input
"fills in", "enters", "types", "selects", "required decision", "approves"output
"can edit", "can correct", "pre-filled but editable", "suggested value the reviewer can adjust"inOut

inOut means the field is pre-populated from an upstream node AND the human can modify it before submitting. The runtime exposes it under $vars.<nodeId>.output.<fieldId> the same as an output field.

Field types

Use the JS/JSON type that fits the field: string, number, boolean, date, or file. These are the only valid values — do not use text. Case also supports datetime (distinct from date, for full date+time values) — see hitl-casetask-action.md for the Case-specific type table.

Vague or incomplete schema descriptions

If the user says something like "just add some fields" or "use whatever makes sense":

  1. Infer sensible defaults from the upstream data and downstream needs visible in the .flow file (Flow) or in caseplan.json upstream task outputs[] and root.data.uipath.variables (Case).
  2. Show the proposed schema explicitly before writing: "Here's what I'm proposing — let me know if you want to change anything."
  3. If there is nothing upstream to bind to (Flow with only a trigger; Case with this as the first task), use output-direction fields only and note: "There are no upstream values to pull data from, so the reviewer will fill in all fields from scratch."
Empty field labels block validation

Every field in inputs.schema.fields must have a non-empty label. flow validate emits HITL_QUICK_FORM_FIELD_LABEL_REQUIRED (error severity) for each field with an empty or whitespace-only label — Debug and Publish are blocked until all labels are filled in. Never generate a field with "label": "" or omit the label key.


Step 5 — Write the Node Directly

Surface: Flow — QuickForm (inline schema only)

Write the node JSON directly into workflow.nodes, add the definition to workflow.definitions (once), wire edges into workflow.edges, and regenerate workflow.variables.nodes. Direct JSON is the default.

Node JSON, definition entry, edge format, variables.nodes algorithm, and four worked examples: How to write a QuickForm HITL node

CLI (opt-in): When the user explicitly requests a CLI command:

bash
uip maestro flow hitl add <path/to/file.flow> \
  --label "<TaskLabel>" \
  --priority <Low|Medium|High> \
  --assignee <email-or-group> \
  --schema '<json>' \
  --output json

The CLI writes the node, adds the definition entry, and updates variables.nodes automatically. Wire one outcome-<outcome.id> port per outcome after it returns.

After writing, validate:

bash
uip maestro flow validate <file> --output json
Surface: Flow — Coded Action App (new inline)

Step 4c must be completed first — app name confirmed, solution directory located, SDK tarball identified, schema designed and confirmed.

Scaffold the project directory and all source files, add the project to the solution, write the solution resource files, then write the HITL node (type uipath.human-in-the-loop.coded-action-app) with inputs.app referencing the new app (appSystemName: null since the app has not been deployed yet).

Full project template, UUID generation, solution CLI commands, resource file templates, node JSON, and post-creation build steps: How to scaffold a new Coded Action App

After writing, validate:

bash
uip maestro flow validate <file> --output json
Surface: Flow — AppTask (deployed action app only)

Step 4b must be completed first — app resolved, configuration retrieved. Then:

Resolve the solution context (.uipx file), write solution resource files, register the app reference, merge debug_overwrites.json, then write the node JSON (type uipath.human-in-the-loop.coded-action-app) with inputs.app populated from the Step 3b configuration.

App search/selection, retrieve-configuration, resource file writing, complete node JSON with appInputBindings: How to wire an existing deployed Action App

After writing, validate:

bash
uip maestro flow validate <file> --output json
Surface: Case

Read the caseplan.json to identify the target stage. Write an action task directly into stage.data.tasks[lane][]. Direct JSON write is the only supported method — the uipath-maestro-case skill ships no hitl CLI subcommand (unlike Flow's uip maestro flow hitl add).

Full reference: references/hitl-casetask-action.md — three task JSON shapes (QuickForm, generic, app-based), field reference, assignee handling, post-write verification, and downstream output access.

Path chosen in Step 3What gets written
QuickFormA <TaskLabel>.hitl.json schema file (unified fields[] with direction, outcomes[]) + action task in caseplan.json with data.context[hitlType].value: "quick", _schemaFileId (placeholder UUID), and hitlSchemaId (matches schemaId in .hitl.json). data.inputs[] and data.outputs[] are empty arrays. No root.data.uipath.bindings[] entries. Apply Step 4b schema-design checks before writing.
App-basedAction task with data.actionCatalogName, data.name and data.folderPath as =bindings.<id> references. Add 2 root-level bindings.

After writing, validate (build-time check — must pass before reporting success):

bash
uip maestro case validate <caseplan.json> --output json

uip maestro case validate is the only uip maestro case CLI used by this skill on the Case surface. All authoring is direct JSON.


Surface: Low-Code Agent

The Low-Code Agent escalation CLI (uip agent escalation add) is currently in-flight. Until it ships, configure manually:

agent.json escalation entry:

json
{
  "escalations": [
    {
      "name": "<escalation-name>",
      "inputSchema":  { "inputs": [...], "inOuts": [...] },
      "outputSchema": { "outputs": [...], "outcomes": [...] }
    }
  ]
}

Agent source (Python):

python
from uipath.sdk import interrupt, CreateTask

response = interrupt(CreateTask(
    escalation_name="<escalation-name>",
    data={ "fieldName": value }
))
# response contains the human's outputs and chosen outcome
Surface: Maestro

QuickForm and coded-action-app HITL nodes are both supported on Maestro BPMN processes. uipath.human-in-the-loop.quick-form and uipath.human-in-the-loop.coded-action-app are registered as registry shortcut names in the BPMN validator (bpmn-spec.json) — these are palette/discovery identifiers, not literal XML to write. There is no dedicated CLI subcommand for Maestro (unlike Flow's uip maestro flow hitl add) — write the node directly into the .bpmn XML.

Confirmed node shape (verified by direct reproduction against a real Studio Web BPMN process with a working, editable QuickForm task):

xml
<bpmn:task id="Activity_InvoiceApproval" name="Invoice Approval">
  <bpmn:extensionElements>
    <uipath:activity version="v1">
      <uipath:type value="Actions.HITL" version="v2" />
      <uipath:context>
        <uipath:input name="hitlType" type="string" value="quick" />
        <uipath:input name="taskTitle" type="string" value="Please review this invoice and approve or reject" />
        <uipath:input name="labels" type="string" />
        <uipath:input name="priority" type="string" value="Medium" />
        <uipath:input name="actionCatalogName" type="string" />
        <uipath:input name="enableActionableNotifications" type="boolean" value="false" />
        <uipath:input name="assignmentCriteria" type="string" />
        <uipath:input name="recipient" type="json" />
        <uipath:input name="_schemaFileId" type="string" value="<see file-id callout below>" />
        <uipath:input name="hitlSchemaId" type="string" value="<matches schemaId in the .hitl.json sidecar>" />
        <uipath:inputSchema type="jsonSchema"><![CDATA[{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"invoiceid":{"type":"string","title":"Invoice ID"},"amount":{"type":"number","title":"Amount"}},"required":[]}]]></uipath:inputSchema>
      </uipath:context>
      <uipath:input name="HitlTaskArguments" type="json" target="bodyField"><![CDATA[{"invoiceid":"INV-1001","amount":500}]]></uipath:input>
      <uipath:output name="Action" type="string" source="=Action" var="invoiceDecision" options="[{&#34;value&#34;:&#34;Approve&#34;,&#34;label&#34;:&#34;Approve&#34;},{&#34;value&#34;:&#34;Reject&#34;,&#34;label&#34;:&#34;Reject&#34;}]" />
    </uipath:activity>
  </bpmn:extensionElements>
  <bpmn:incoming>edge_into_task</bpmn:incoming>
  <bpmn:outgoing>edge_out_of_task</bpmn:outgoing>
</bpmn:task>

Notes on what's easy to get wrong:

  • Element is bpmn:task, not bpmn:UserTask. bpmn-spec.json's generic Actions.HITL XML template uses bpmn:UserTask and version="v1" — that template is for the app-based/coded-action-app path (its context fields are appId, appVersion, actions, key, taskTitle). A real QuickForm task exported from Studio Web is a plain bpmn:task with uipath:type value="Actions.HITL" version="v2". Use the shape above for QuickForm; the spec's template for app-based.
  • <uipath:inputSchema> (last child of <uipath:context>) and <uipath:input name="HitlTaskArguments"> (sibling of <uipath:context>, not inside it) are both required. Without them the "Edit Schema" canvas in Studio Web doesn't open at all — confirmed by direct reproduction. This mirrors the Case surface's data.inputSchema/data.inputs[] requirement — see hitl-casetask-action.md § Step 3 for the parallel Case shape and full field-by-field rationale.
  • The Action output requires a matching process-level variable declaration — add <uipath:inputOutput id="<varId>" name="Action" type="string" elementId="<taskId>" /> inside the process's top-level <uipath:variables version="v1"> block.
  • A separate <TaskLabel>.hitl.json sidecar file is required, same shape as the Case surface's (title, fields[] with direction/optional colSpan/binding or variable, outcomes[] with no action key, schemaId) — see hitl-casetask-action.md § Step 2 for the exact shape; it's identical across both surfaces.
  • _schemaFileId cannot be authored blind — it is a server-assigned foreign key, not a UUID you invent. A placeholder value makes "Edit Schema" fail silently (a 404 on Studio Web's internal FileOperations/File/Rename call, confirmed by direct reproduction). There is no uip CLI command that resolves this today. Never block on this. Write a fresh placeholder UUID v4, finish the rest of the node, validate, and move on — do not attempt the live reconciliation yourself and do not stop to ask about it. State plainly in the final report: "This task's schema was written with a placeholder _schemaFileId, so Studio Web's 'Edit Schema' canvas won't open for it yet. Making it editable requires resolving the real file ID Studio Web assigns to the .hitl.json after upload (GET /api/Project/{projectId}/FileOperations/Structure) and pushing it back with a targeted single-file update (PUT /api/Project/{projectId}/FileOperations/File/{fileId}) — not another whole-project uip solution upload, which re-pushes every file and mints a fresh random file ID for each one, undoing the fix. Ask me to do this reconciliation if you want the schema editable in Studio Web." This is a real product/tooling gap the user can act on later, not something to resolve mid-task.
  • Diagram-interchange edges are required for the connector lines to render, even though the logical bpmn:sequenceFlows already exist. Every bpmn:sequenceFlow needs a matching bpmndi:BPMNEdge (with two di:waypoint points, aligned to the source/target shapes' connecting edges) in the bpmndi:BPMNPlane — omitting it leaves the nodes logically connected but visually disconnected in the canvas. Confirmed by direct reproduction.

Design the schema per Step 4b — never block waiting on the user, per Critical Rule 1 — then validate frequently (uip maestro bpmn validate <file>.bpmn --output json) while wiring the node so any shape mistakes surface immediately rather than at deploy time. In Maestro, field names in outputs/inOuts must exactly match declared process variable names and types.


Step 6 — Report to the User

After completing the wiring:

  1. What was inserted — node ID, label, insertion point
  2. Schema summary — what the human will see (input-direction fields), fill in (output/inOut-direction fields), and click (outcomes). For deployed action app show the actionSchema from the retrieve-configuration api response here.
  3. Edges wired — which handles were connected and to which nodes; any handles left unwired
  4. Runtime variables — $vars.<nodeId>.output (object) and $vars.<nodeId>.status (string) and how to reference them downstream
  5. Validation result — pass or errors to fix
  6. Production readiness note:
    • QuickForm: ready to deploy once the solution is packaged. No additional build steps.
    • New Coded Action App: the app must be built (npm run build inside the app source) and the solution packaged before the HITL task can be used in production. The app will appear with appSystemName: null until first deployment assigns it a system name.
    • Existing Deployed App: ready to deploy immediately — the app is already live.
  7. Next step — pack and publish when ready via uipath-development skill

References

  • How to write a QuickForm HITL node — Read this after the user confirms QuickForm in Step 3. Covers the complete node JSON, definition entry, edge wiring, variables.nodes regeneration algorithm, and four worked schema examples.
  • How to wire an existing deployed Action App — Read this when the user selects an existing deployed app in Step 3. Covers app lookup via the Orchestrator API, inputs.app field mapping, appInputBindings, and solution resource files.
  • How to scaffold a new Coded Action App — Read this when the user wants to build a new React app inside the solution. Covers full project template, UUID generation, solution CLI commands, and post-creation build steps.
  • HITL business pattern recognition — Read this during Step 2 / Step 2b to identify whether a process needs a human checkpoint and which pattern applies. Includes proactive recommendation language and when NOT to recommend HITL.
  • Action Center URL patterns (in uipath-tasks skill) — Read this before surfacing any Action Center task URL to the user. Covers the missing-tenant-slug anti-pattern and the API-host vs UI-host mapping.
  • Case Action Task (HITL) — Case surface: action task JSON, QuickForm vs app-based paths, .hitl file format, context entries, field binding, and downstream output access.

© UiPath, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (references) in skills/uipath-human-in-the-loop of UiPath/skills.

  • SKILL.md
  • references/hitl-casetask-action.md
  • references/hitl-node-apptask.md
  • references/hitl-node-coded-action-app.md
  • references/hitl-node-quickform.md
  • references/hitl-patterns.md

Open the folder on GitHubat commit 0bada1b

Compare with similar skills

Uipath Human In The Loop next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Uipath Human In The Loop compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Uipath Human In The Loop this skillUiPath/skills167—~9.1kAutomated safety check: NotesMIT
Show Me Your Work Decision Logcursor/plugins11k8 repos~1.6kAutomated safety check: PassNone
Darwin Skill Optimizeralchaincyf/darwin-skill6.2k1 repos~4.7kAutomated safety check: PassMIT
Loop Constraints Enforcercobusgreyling/loop-engineering11k1 repos~475Automated safety check: NotesMIT
Ask User QuestionMemTensor/MemOS12k—~1kAutomated safety check: PassApache-2.0
PUA High-Agency Governancetanweai/pua20k—~502Automated safety check: PassMIT

Similar skills

  • Official

    Keeps a TSV decision log for long or unattended agent runs, one row per decision with what, why, evidence and result, so a reviewer can check the work later.

    11k GitHub starsUsed in 8 repos~1.6k tokens
    Agent WorkflowsAuto-check passed
  • Darwin Skill Optimizer

    alchaincyf/darwin-skill

    Scores SKILL.md files on a nine-dimension rubric, then improves them in a keep-or-revert loop with independent judge agents, test prompts, git history and human checkpoints.

    6.2k GitHub starsUsed in 1 repo~4.7k tokens
    Agent WorkflowsAuto-check passed
  • Loop Constraints Enforcer

    cobusgreyling/loop-engineering

    Loads a project's loop-constraints.md before any other action and blocks pushes, edits or merges that violate the rules it defines.

    11k GitHub starsUsed in 1 repo~475 tokens
    Agent WorkflowsAuto-check: notes
  • Ask User Question

    MemTensor/MemOS

    Shows a question as a modal in the interface to clarify a task, collect a preference or get approval, since the user cannot see terminal output.

    12k GitHub stars~1k tokensUpdated 2 days ago
    Agent WorkflowsAuto-check passed
  • Pushes an agent to keep verifying and changing approach after repeated failures, using a diagnosis line, evidence-based completion and confirmation before risky edits.

    20k GitHub stars~502 tokensUpdated 1 mo ago
    Agent WorkflowsAuto-check passed
  • Agentmemory Forget

    rohitg00/agentmemory

    Deletes chosen memories from agentmemory only after showing the matches and getting an explicit yes, for privacy requests and cleanup of outdated notes.

    29k GitHub stars~612 tokensUpdated yesterday
    Agent WorkflowsAuto-check passed

More from UiPath/skills

All 28 skills in this repo
  • UiPath automation discovery — mines Slack/email/wikis/CRM/HRIS/ERP for repetitive work, SPOFs, and replicable models; produces a 4-tier prioritized opportunity report with UiPath implementation…

    167 GitHub stars~3.7k tokensUpdated today
    Auto-check passed
  • Maintain build-time skill flavors in the UiPath skills repository.

    167 GitHub stars~3.5k tokensUpdated today
    Auto-check passed
  • Uipath Functions

    UiPath/skills

    UiPath Coded Functions — deterministic Python or TypeScript/JavaScript units built with the uip function CLI (new -l py|ts|js, init, serve, run, pack, publish); the functions map in uipath.json…

    167 GitHub stars~3.6k tokensUpdated today
    Auto-check: notes
  • Uipath Maestro Bpmn

    UiPath/skills

    TRIGGER for authoring, operating or diagnosing UiPath Maestro BPMN.

    167 GitHub stars~4.2k tokensUpdated today
    Auto-check: notes
  • Uipath Maestro Case

    UiPath/skills

    TRIGGER for authoring UiPath Maestro Case plans as <Name.case.ts with the reference-mode TypeScript builder SDK (@uipath/maestro-builder-sdk/case), compiling to caseplan.json, and running the uip…

    167 GitHub stars~2k tokensUpdated today
    Auto-check: notes
  • Uipath Troubleshoot

    UiPath/skills

    UiPath causal investigation across every product, runtime, and activity package.

    167 GitHub stars~5.3k tokensUpdated today
    Auto-check passed

Categories

Questions about Uipath Human In The Loop

What does Uipath Human In The Loop do?

UiPath Human-in-the-Loop / HITL node authoring — building approval gates, escalations, write-back validation, and data enrichment checkpoints in Flow, Maestro, Case Management, or Coded Agents. Uipath Human In The Loop is an agent skill from UiPath/skills. UiPath Human-in-the-Loop / HITL node authoring — building approval gates, escalations, write-back validation, and data enrichment checkpoints in Flow, Maestro, Case Management, or Coded Agents.

When should I use Uipath Human In The Loop?

Uipath Human In The Loop fits situations like: tasks that involve Human-in-the-loop approvals; tasks that involve Mobile testing and debugging.

How do I install Uipath Human In The Loop in Claude Code?

Run `npx skills add UiPath/skills --skill uipath-human-in-the-loop -a claude-code`. Or copy the skill folder (skills/uipath-human-in-the-loop in UiPath/skills) into .claude/skills/uipath-human-in-the-loop in your project. Claude Code loads it when a task matches its description.

How do I install Uipath Human In The Loop in Codex?

Run `npx skills add UiPath/skills --skill uipath-human-in-the-loop -a codex`. Or copy the skill folder (skills/uipath-human-in-the-loop in UiPath/skills) into .agents/skills/uipath-human-in-the-loop in your project. Codex loads it when a task matches its description.

Can I use Uipath Human In The Loop in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add UiPath/skills --skill uipath-human-in-the-loop -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/uipath-human-in-the-loop, .gemini/skills/uipath-human-in-the-loop, .github/skills/uipath-human-in-the-loop and .opencode/skills/uipath-human-in-the-loop in your project.

What does Uipath Human In The Loop need to run?

Going by SKILL.md and its folder, Uipath Human In The Loop needs the command-line tools its instructions call (npm and bun). Its frontmatter pre-approves these tools: Bash, Read, Write, Edit, Glob, Grep.

Does Uipath Human In The Loop access the network?

SKILL.md names 1 domain. In commands or code: json-schema.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Uipath Human In The Loop safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Uipath Human In The Loop use?

Uipath Human In The Loop is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Uipath Human In The Loop use?

About 9.1k tokens (SKILL.md is roughly 36k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 20k tokens, read only when the agent opens those files.

What are the alternatives to Uipath Human In The Loop?

Skills that share tags, products or a category with Uipath Human In The Loop: Show Me Your Work Decision Log (cursor/plugins, 11k stars), Darwin Skill Optimizer (alchaincyf/darwin-skill, 6.2k stars), Loop Constraints Enforcer (cobusgreyling/loop-engineering, 11k stars) and Ask User Question (MemTensor/MemOS, 12k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Uipath Human In The Loop?

UiPath (a GitHub organization) maintains it in UiPath/skills, which has 167 GitHub stars. The repository holds 28 skills in this directory. The repository was last updated on October 10, 2026.

Source: UiPath/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.