Show Me Your Work Decision Log
cursor/plugins
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.
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.
$ npx skills add UiPath/skills --skill uipath-human-in-the-loop -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install UiPath/skills uipath-human-in-the-loop --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "uipath-human-in-the-loop" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-human-in-the-loop into .claude/skills/uipath-human-in-the-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-human-in-the-loop", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/UiPath/skills/tree/main/skills/uipath-human-in-the-loopType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add UiPath/skills --skill uipath-human-in-the-loop -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install UiPath/skills uipath-human-in-the-loop --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/uipath-human-in-the-loop .agents/skills/uipath-human-in-the-loop && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "uipath-human-in-the-loop" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-human-in-the-loop into .agents/skills/uipath-human-in-the-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-human-in-the-loop", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add UiPath/skills --skill uipath-human-in-the-loop -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install UiPath/skills uipath-human-in-the-loop --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/uipath-human-in-the-loop .cursor/skills/uipath-human-in-the-loop && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "uipath-human-in-the-loop" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-human-in-the-loop into .cursor/skills/uipath-human-in-the-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-human-in-the-loop", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/UiPath/skills.git --path skills/uipath-human-in-the-loop--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add UiPath/skills --skill uipath-human-in-the-loop -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install UiPath/skills uipath-human-in-the-loop --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/uipath-human-in-the-loop .gemini/skills/uipath-human-in-the-loop && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "uipath-human-in-the-loop" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-human-in-the-loop into .gemini/skills/uipath-human-in-the-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-human-in-the-loop", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install UiPath/skills uipath-human-in-the-loopInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add UiPath/skills --skill uipath-human-in-the-loop -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/uipath-human-in-the-loop .github/skills/uipath-human-in-the-loop && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "uipath-human-in-the-loop" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-human-in-the-loop into .github/skills/uipath-human-in-the-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-human-in-the-loop", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add UiPath/skills --skill uipath-human-in-the-loop -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install UiPath/skills uipath-human-in-the-loop --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/uipath-human-in-the-loop .opencode/skills/uipath-human-in-the-loop && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "uipath-human-in-the-loop" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-human-in-the-loop into .opencode/skills/uipath-human-in-the-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-human-in-the-loop", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
uipath-human-in-the-loopUiPath 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. 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.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 0bada1b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteEditGlobGrepFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmbunFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
json-schema.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Write, Edit, Glob, GrepAutomated 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.
The full file from UiPath/skills at commit 0bada1b, republished under its MIT licence (© UiPath). 4,291 words, ~9,104 tokens.
.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.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-agentsskill — seeskills/uipath-agents/references/coded/capabilities/human-in-the-loop.md.
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.
.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.)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.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.variables.nodes after adding the node. Replace the entire workflow.variables.nodes array — do not append. See the reference docs for the algorithm.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..flow file before adding. Understand which nodes already exist and where the HITL checkpoint belongs in the flow.workflow.definitions — if an entry with the matching nodeType is already there, do not add it again.workflow.nodes[*].id from the .flow file and pick the next available suffix (e.g. invoiceReview1, then invoiceReview2).uip maestro flow validate returns errors, diagnose from the JSON output and fix before reporting to the user.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.$vars.legalApproval — this is the global alias path, not the script access path$vars.<nodeId>.output.legalApproval — this uses the variable name as the key$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.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.$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.uip binaryUIP=$(command -v uip 2>/dev/null || npm root -g 2>/dev/null | sed 's|/node_modules$||')/bin/uip
$UIP --versionUse $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
uipwithbun run start.
Run these checks in order:
# 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| Found | Surface | How 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:
# 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>.flowThe 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-->
Read the existing .flow file to understand current nodes and edges. Use the Read tool on the .flow file path, then identify:
uipath.human-in-the-loop.quick-form) or AppTask (deployed coded app, node type uipath.human-in-the-loop.coded-action-app)?If the user did NOT explicitly mention HITL, scan the business description for these signals before proceeding:
| Signal | Pattern | Why a human checkpoint matters |
|---|---|---|
| "agent writes to", "updates", "posts to" an external system | Write-back validation | Prevents incorrect writes to production systems |
| "if confidence is low", "when uncertain", "edge case" | Exception escalation | Agent cannot resolve autonomously |
| "approves", "reviews", "signs off", "four-eyes" | Approval gate | Business or compliance requirement |
| "fills in missing", "validates extraction", "corrects" | Data enrichment | Automation produced incomplete data |
| "compliance", "regulatory", "audit trail" | Compliance checkpoint | Mandated 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."
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.
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.
| # | Option | Node type | Description |
|---|---|---|---|
| 1 | QuickForm | uipath.human-in-the-loop.quick-form | Inline typed form — fields rendered by Action Center from the schema you design here |
| 2 | New Coded Action App | uipath.human-in-the-loop.coded-action-app | Scaffold a new React + TypeScript app inside the solution — full UI control |
| 3 | Existing Deployed App | uipath.human-in-the-loop.coded-action-app | Reference 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 chosen | Next step |
|---|---|
| QuickForm | Read How to write a QuickForm HITL node for Steps 1–2, then continue with Step 4 |
| New Coded Action App | Read 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 app | Read 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:
| Path | Blocker | Response |
|---|---|---|
| Existing Deployed App | App not found in Orchestrator, or no app name was given | Fall 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 App | No dist/ build present in the source path | Fall 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 App | No source path given | Fall 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 app | Auth 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." |
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.
| # | Option | Fingerprint | Description |
|---|---|---|---|
| 1 | QuickForm (file-based schema) | separate <TaskLabel>.hitl.json file + hitlType: "quick" context entry in the action task | Structured form fields in a .hitl.json file alongside caseplan.json. Action Center renders fields at runtime. No deployed app needed. |
| 2 | App-based action task | data.name and data.folderPath as =bindings.<id> references + data.actionCatalogName | Uses 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 chosen | Next 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 app | Read 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:
| Path | Blocker | Response |
|---|---|---|
| App-based | App not found in registry or action-apps-index.json, or no app name was given | Fall 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." |
| QuickForm | Schema 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. |
| Any | Auth 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." |
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. |
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.
Pick direction based on what the human does with the field:
| Signal | Direction |
|---|---|
| "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.
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.
If the user says something like "just add some fields" or "use whatever makes sense":
.flow file (Flow) or in caseplan.json upstream task outputs[] and root.data.uipath.variables (Case).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.
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:
uip maestro flow hitl add <path/to/file.flow> \
--label "<TaskLabel>" \
--priority <Low|Medium|High> \
--assignee <email-or-group> \
--schema '<json>' \
--output jsonThe 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:
uip maestro flow validate <file> --output jsonStep 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:
uip maestro flow validate <file> --output jsonStep 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:
uip maestro flow validate <file> --output jsonRead 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 3 | What gets written |
|---|---|
| QuickForm | A <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-based | Action 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):
uip maestro case validate <caseplan.json> --output json
uip maestro case validateis the onlyuip maestro caseCLI used by this skill on the Case surface. All authoring is direct JSON.
The Low-Code Agent escalation CLI (uip agent escalation add) is currently in-flight. Until it ships, configure manually:
agent.json escalation entry:
{
"escalations": [
{
"name": "<escalation-name>",
"inputSchema": { "inputs": [...], "inOuts": [...] },
"outputSchema": { "outputs": [...], "outcomes": [...] }
}
]
}Agent source (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 outcomeQuickForm 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):
<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="[{"value":"Approve","label":"Approve"},{"value":"Reject","label":"Reject"}]" />
</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:
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.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.<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.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.
After completing the wiring:
$vars.<nodeId>.output (object) and $vars.<nodeId>.status (string) and how to reference them downstreamnpm 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.uipath-development skillvariables.nodes regeneration algorithm, and four worked schema examples.inputs.app field mapping, appInputBindings, and solution resource files.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..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
SKILL.md and 5 other files (references) in skills/uipath-human-in-the-loop of UiPath/skills.
Open the folder on GitHubat commit 0bada1b
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Uipath Human In The Loop this skillUiPath/skills | 167 | — | ~9.1k | Automated safety check: Notes | MIT | |
| Show Me Your Work Decision Logcursor/plugins | 11k | 8 repos | ~1.6k | Automated safety check: Pass | None | |
| Darwin Skill Optimizeralchaincyf/darwin-skill | 6.2k | 1 repos | ~4.7k | Automated safety check: Pass | MIT | |
| Loop Constraints Enforcercobusgreyling/loop-engineering | 11k | 1 repos | ~475 | Automated safety check: Notes | MIT | |
| Ask User QuestionMemTensor/MemOS | 12k | — | ~1k | Automated safety check: Pass | Apache-2.0 | |
| PUA High-Agency Governancetanweai/pua | 20k | — | ~502 | Automated safety check: Pass | MIT |
cursor/plugins
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.
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.
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.
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.
tanweai/pua
Pushes an agent to keep verifying and changing approach after repeated failures, using a diagnosis line, evidence-based completion and confirmation before risky edits.
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.
UiPath/skills
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…
UiPath/skills
Maintain build-time skill flavors in the UiPath skills repository.
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…
UiPath/skills
TRIGGER for authoring, operating or diagnosing UiPath Maestro BPMN.
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…
UiPath/skills
UiPath causal investigation across every product, runtime, and activity package.
Categories
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.
Uipath Human In The Loop fits situations like: tasks that involve Human-in-the-loop approvals; tasks that involve Mobile testing and debugging.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.