@uipath/skills 1.201.0-preview.614 → 1.201.0-preview.620

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CODEOWNERS CHANGED
@@ -195,5 +195,5 @@
195
195
  /tests/tasks/activation/uipath-process-mining.jsonl @UiPath/team-backendhoven
196
196
 
197
197
  # Automation Hub skills (Open API publish/read of processes via the user's cloud token)
198
- /skills/uipath-automationhub/ @parth-patil-uipath @abhiram-vad
199
- /tests/tasks/uipath-automationhub/ @parth-patil-uipath @abhiram-vad
198
+ /skills/uipath-automationhub/ @UiPath/automationhub @parth-patil-uipath @abhiram-vad
199
+ /tests/tasks/uipath-automationhub/ @UiPath/automationhub @parth-patil-uipath @abhiram-vad
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/skills",
3
- "version": "1.201.0-preview.614",
3
+ "version": "1.201.0-preview.620",
4
4
  "description": "UiPath agent skills for Claude Code, Codex, Cursor, Copilot, Gemini and OpenCode — RPA, UI automation, UI testing, coded agents/apps/workflows, and troubleshooting. Distributed as the UiPath Claude Code plugin.",
5
5
  "author": {
6
6
  "name": "UiPath"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: uipath-automationhub
3
- description: "Publish and read business processes in UiPath Automation Hub via the Open API, using the user's cloud login — no admin OpenAPI token needed. PUBLISH an approved process and its PDD/SDD documents (schema-driven payload, base64 file upload or link) to AH as the system of record — e.g. a process captured/approved by Process Scribe. GET a process back by id or search, list its attached documents, and DOWNLOAD their file bytes (e.g. for dedup / related-idea lookups or retrieving a published PDD). Authenticates with the user's cloud bearer token and NEVER sends the admin `x-ah-openapi-auth` header. Routes by intent to `references/publish-process.md` (publish/create/upload) or `references/get-process.md` (get/read/fetch/list), over the shared auth + endpoint catalog in `references/api-endpoints.md`. Structured to extend to more Automation Hub Open API operations."
3
+ description: "Publish and read business processes in UiPath Automation Hub via the Open API, using the user's cloud login — no admin OpenAPI token needed. PUBLISH an approved process and its PDD/SDD documents (schema-driven payload, base64 file upload or link) to AH as the system of record — e.g. a process captured/approved by Process Scribe. GET a process back by id or search, list its attached documents, and DOWNLOAD their file bytes (e.g. for dedup / related-idea lookups or retrieving a published PDD). Authenticates with the user's cloud bearer token and NEVER sends the admin `x-ah-openapi-auth` header. CLI-first: when the installed `uip` has the `ah` commands, flows run through them (`references/*-cli-guide.md`); otherwise the raw Open API flows apply. Routes by intent to publish (create/upload) or get (read/fetch/download) references over the shared catalogs. Structured to extend to more Automation Hub operations."
4
4
  allowed-tools: Bash, Read, AskUserQuestion
5
5
  user-invocable: true
6
6
  ---
@@ -9,11 +9,18 @@ user-invocable: true
9
9
 
10
10
  Work with business processes in UiPath Automation Hub (AH) through the AH Open API, authenticating with the **user's cloud access token** — the user does **not** need an admin-generated OpenAPI token. This one skill covers both writing a process to AH and reading one back; pick the flow below.
11
11
 
12
- ## Step 0: Read the API reference
12
+ ## Step 0: Preflight — pick the transport once
13
13
 
14
- Always read [`references/api-endpoints.md`](references/api-endpoints.md) first. It is the shared source of truth for the cloud-token auth model, the base/gateway URL, the exact headers (**and which header to never send**), and every endpoint the flows use.
14
+ Run `uip ah --help` once per session:
15
15
 
16
- ## Authentication (sharedboth flows)
16
+ - **Succeeds** → use the **CLI flows**. Read [`references/cli-commands.md`](references/cli-commands.md) (command catalog + auth), then the matching `*-cli-guide.md` flow. Auth is handled by `uip` itself never touch a token.
17
+ - **Fails with `unknown command 'ah'`** (CLI predates the AH surface) → use the **raw Open API flows**. Read [`references/api-endpoints.md`](references/api-endpoints.md) (auth model, gateway URL, exact headers — and the header to never send), then the matching flow.
18
+
19
+ Never mix the two transports in one run. The domain contract — required fields, wrapping rules, document types — is identical either way and lives in `api-endpoints.md`.
20
+
21
+ ## Authentication (raw-API flows only — skip when using the CLI flows)
22
+
23
+ > On the CLI path, `uip` handles auth itself (Delegate env-auth or `uip login`) — never touch a token there; see [`references/cli-commands.md`](references/cli-commands.md). The resolution order below applies **only** to the raw-API flows.
17
24
 
18
25
  Resolve the cloud token + base URL + org + tenant in this **priority order**:
19
26
 
@@ -40,16 +47,23 @@ The platform injects tenant-routing headers from the `{org}/{tenant}` segments
40
47
 
41
48
  ## Routing — pick the flow by intent
42
49
 
43
- Classify what the user wants, then follow the matching reference. All flows share the Authentication section above and the endpoint catalog in `references/api-endpoints.md`.
50
+ Classify what the user wants, then follow the matching reference. The **raw-API flows** share the Authentication section above and the endpoint catalog in `references/api-endpoints.md`; the **CLI flows** never touch either — `uip` handles auth itself (see [`references/cli-commands.md`](references/cli-commands.md)).
44
51
 
45
- | The user wants to... | Follow |
46
- |---|---|
47
- | **Publish / create / upload** a process (+ its PDD/SDD documents) to AH | [`references/publish-process.md`](references/publish-process.md) |
48
- | **Get / read / fetch / list** a process (+ its documents) from AH | [`references/get-process.md`](references/get-process.md) |
49
- | Shared **auth + endpoint catalog** (base URL, headers, every endpoint, error codes) | [`references/api-endpoints.md`](references/api-endpoints.md) |
52
+ | The user wants to... | CLI available (preferred) | CLI unavailable |
53
+ |---|---|---|
54
+ | **Publish / create / upload** a process (+ its PDD/SDD documents) to AH | [`references/publish-process-cli-guide.md`](references/publish-process-cli-guide.md) | [`references/publish-process.md`](references/publish-process.md) |
55
+ | **Get / read / fetch / download** a process (+ its documents) from AH | [`references/get-process-cli-guide.md`](references/get-process-cli-guide.md) | [`references/get-process.md`](references/get-process.md) |
56
+ | Shared **command / endpoint catalog** | [`references/cli-commands.md`](references/cli-commands.md) | [`references/api-endpoints.md`](references/api-endpoints.md) |
50
57
  | _(future AH Open API operation — add a row here)_ <!-- uip-check-skip --> | _add `references/<operation>.md` and route to it_ |
51
58
 
52
- To add a new capability (e.g. a future AH `uip` CLI surface or another Open API operation), keep this skill's product shape: add one `references/<operation>.md`, add a row above, and reuse this shared Authentication section do not create a new per-operation skill.
59
+ **Extending this skill** (new AH operation, new field, new integration like the Studio Web link) keep the shape, and put each kind of change in exactly one home:
60
+
61
+ - **A new domain fact** (a field's format, a required rule, an id table): document it once in [`references/api-endpoints.md`](references/api-endpoints.md) — the transport-independent contract — and have the flow steps *reference* it rather than restate it. Never fork a fact across the CLI and API files.
62
+ - **A new operation / user intent**: add a `references/<operation>-cli-guide.md` flow (and, only while the raw-API fallback still exists, an API twin), plus one row in the routing table above and, if new commands are involved, rows in `cli-commands.md`. Do not create a new per-operation skill.
63
+ - **A new optional capability inside an existing flow** (like Step 6b, Studio Web): add it as an optional step in that flow, with its discovery recipe and a never-invent rule.
64
+ - **When the raw-API fallback retires** (once an `ah`-capable `uip` release is ubiquitous): delete the API flow files and the preflight's fallback arm in one commit — the CLI files are self-contained by design.
65
+
66
+ Every addition keeps the skill's three invariants: collect inputs before the first write, verify before reporting success, and never invent a value the tenant didn't provide.
53
67
 
54
68
  ## Notes
55
69
 
@@ -67,6 +67,8 @@ Body:
67
67
  | `OVR-PROCESS_OWNER` | `ah-section-ovr-0-0` | `"<email>"` (direct string) |
68
68
  | `OVR-OVERVIEW_PROCESS_SUBMITTER` | `ah-section-ovr-0-1` | `"<email>"` (direct string) |
69
69
 
70
+ **Studio Web link** (optional): the schema's `OVR-OVERVIEW_STUDIO_WEB_LINK` question links the process to a Studio Web solution. Its `value` is a JSON **string** — `{"url": "<{baseUrl}/{org}/studio_/designer/{projectId}?solutionId={id}>", "name": "<solution name>", "hasProcessMap": <bool>}` (`url` required; `hasProcessMap: true` only when the solution's orchestration project has a `.bpmn` — it drives AH's Maestro diagram preview). Settable at create or via the update path; empty string unlinks.
71
+
70
72
  When a required field is missing the API may return `errorDetails: {}` (no field named) with `"Please fill in all the required information"` — usually the un-flagged owner/submitter, but **tenant admins can mark additional questions required** (commonly "Applications used"/"Thin applications used"); diff the payload against every `required`-flagged question in the live schema.
71
73
 
72
74
  **Response 201** — the standard envelope with the created process **nested under `data`**: `{ "message": "Resource Created", "statusCode": 201, "data": { "process_id": …, "process_uuid": …, "process_name": … } }`. Read **`data.process_id`** — it is NOT at the top level. If you received a 201 the process WAS created — never re-POST because a field read came back undefined; re-read the response instead. *(Used by the publish flow.)*
@@ -0,0 +1,46 @@
1
+ # Automation Hub via the `uip ah` CLI — Command Catalog
2
+
3
+ > **Preflight (run once per session):** `uip ah --help`. If it errors with `unknown command 'ah'`, the installed CLI predates the Automation Hub surface — tell the user to update `uip` (or follow the raw-API flows in [`api-endpoints.md`](api-endpoints.md) instead). Never mix the two paths in one run.
4
+
5
+ The CLI wraps the same Open API endpoints as [`api-endpoints.md`](api-endpoints.md) — every domain fact there (required fields, wrapping rules, document-type ids, tenant-required questions) still applies. What the CLI adds: auth is handled for you, every response is one uniform JSON envelope, and windowing/projection quirks are absorbed.
6
+
7
+ ## Auth — nothing to do
8
+
9
+ `uip` resolves credentials itself, in this order:
10
+ 1. **Delegate runtime env-auth**: the Delegate injects `UIPATH_CLI_AUTH_TOKEN` + org/tenant vars; `uip` consumes them natively. No setup.
11
+ 2. **`uip login` session** (`~/.uipath/.auth`).
12
+
13
+ If a command fails with an authentication error, tell the user to run `uip login` — never ask for or handle a raw token yourself.
14
+
15
+ ## Output envelope (every command)
16
+
17
+ Always pass `--output json`. Success:
18
+
19
+ ```json
20
+ { "Result": "Success", "Code": "Ah<Group><Verb>", "Data": … }
21
+ ```
22
+
23
+ Failure: `Result` is `Failure`/`ValidationError` with a `Message` and usually an `Instructions` hint — surface both to the user. Exit codes: `0` success, `1` failure, `3` validation.
24
+
25
+ > ⚠️ **`--output-filter` requires an explicit `--limit`.** List commands default to `--limit 20`, and the CLI rejects an output filter on an implicit page (validation error, exit `3`) because it would silently filter only the first 20 records. Whenever you pass `--output-filter`, also pass a `--limit` sized to cover the full result set (the option's `--help` text states the command's maximum).
26
+
27
+ ## Commands used by the flows
28
+
29
+ | Command | Purpose | Data shape notes |
30
+ |---|---|---|
31
+ | `uip ah auth-info get` | connectivity + who/where am I | `Data.Tenant.Url`, `Data.User` |
32
+ | `uip ah idea-flows list` | flow names → ids | entries carry `Id`, `Name`, `Phases` |
33
+ | `uip ah automations schema get --idea-flow-id <id> --destination <file>` | write the flow's schema + `user_inputs` template to a file | same document as the raw `/idea-schema` |
34
+ | `uip ah categories get` | category tree | `Data.Levels` + `Data.Categories` (nested `subcategories`; pick `category_is_active: 1` only) |
35
+ | `uip ah users list --limit 50` | owner/submitter discovery | entries carry `Email`, `IsActive` |
36
+ | `uip ah applications list` | app inventory (tenant-required application questions) | entries carry `Id`, `Name` |
37
+ | `uip ah automations create --from-schema --idea-flow-id <id> --file <answers.json>` | **create the process** | `Data.Id` is the new process id |
38
+ | `uip ah documents create <automation-id> --title <t> --description <d> --document-type-id <n> --file <path>` | **upload a document's bytes** | `Data.Id` (document id) + `Data.FileId`; use `--embed-link <url>` *instead of* `--file` for link-only docs (exactly one of the two) |
39
+ | `uip ah documents list <automation-id>` | verify attachments | entries carry `Id`, `Title`, `FileId` (file-backed) or `EmbedLink` (link-backed) |
40
+ | `uip ah documents download <file-id> --destination <path>` | **download a document's bytes** | takes the `FileId` from `documents list`, **not** the document `Id` |
41
+ | `uip ah automations update <id> --file <answers.json>` | edit assessment answers post-create (e.g. set the Studio Web link) | same `user_inputs` document shape as create |
42
+ | `uip ah automations list --search <text> --limit 20` | name → process id | projected records with `Id`, `Name`, `Phase` |
43
+ | `uip ah automations get <id> [--all-fields]` | one process record | default projection has `Id`/`Name`/`Phase`/`Tags`; `--all-fields` for the raw record (needed for `process_slug`) |
44
+ | `uip ah components list --automation-id <id>` | linked components (optional, get flow) | same record shape as the tenant-wide catalogue |
45
+
46
+ **Version note:** the `ah` surface first appears in `uip` **1.201.0** (as of 2026-08-21 no public release ships it — the latest release is 1.199.0; the Step-0 preflight routes older installs to the raw-API flows). `documents create --file` and `automations create --idea-flow-id` additionally come from CLI PR #3720 — if either flag is rejected as unknown, the installed `uip` has the `ah` surface but predates those flags: tell the user to upgrade `uip` and **stop**. Never switch to the raw-API path mid-run — the transport was already selected at preflight.
@@ -0,0 +1,58 @@
1
+ # Get a Process from Automation Hub — `uip ah` CLI flow
2
+
3
+ Fetches one process (by id or search) and its documents, and downloads document bytes on request. Read-only. Auth is handled by the CLI — you never touch a token.
4
+
5
+ > **Use this flow only after the preflight in [`cli-commands.md`](cli-commands.md) passed.** All commands: append `--output json`.
6
+
7
+ ## Step 1: Resolve the process
8
+
9
+ - Caller gave an **id** → use it.
10
+ - Otherwise search:
11
+ ```bash
12
+ uip ah automations list --search "<name>" --limit 20 --output json
13
+ ```
14
+ One clear match → its `Id`. Several → show name + id + owner, ask. None → say so and stop.
15
+
16
+ ## Step 2: Fetch the process
17
+
18
+ ```bash
19
+ uip ah automations get $PROCESS_ID --output json
20
+ ```
21
+
22
+ `Data` is the projected record (`Id`, `Name`, `Phase`, `PhaseStatus`, `Tags`, …). Add `--all-fields` only when you need the raw record (e.g. `process_slug` for the deep link). `Failure` with not-found → no such process; auth error → `uip login`.
23
+
24
+ ## Step 3: Fetch the documents
25
+
26
+ ```bash
27
+ uip ah documents list $PROCESS_ID --output json
28
+ ```
29
+
30
+ Each entry carries `Id` (document id), `Title`, `TypeId`, and **either** a `FileId` (file-backed — downloadable) **or** an `EmbedLink` (link-backed — show the URL; nothing to download).
31
+
32
+ ## Step 3b: Download a document (when the caller wants the bytes)
33
+
34
+ Only file-backed documents download, and the command takes the **`FileId`** — not the document `Id`:
35
+
36
+ ```bash
37
+ uip ah documents download $FILE_ID --destination "<path>" --output json
38
+ ```
39
+
40
+ > 📁 **Download to the current working directory — never `/tmp`.** Hosted runtimes (e.g. the Delegate) sandbox their file tools to the session workspace: the CLI can write to `/tmp`, but every file-tool access to the download then fails with an access-denied error.
41
+
42
+ - `Data` reports `Destination` and `Bytes` — confirm the file exists and is non-empty before reporting success.
43
+ - Link-backed documents: present the `EmbedLink` instead. Never invent a download path.
44
+
45
+ ## Step 4: Present
46
+
47
+ ```
48
+ Process: <name> (process_id: <id>)
49
+ Status: <phase/status>
50
+ Category: <category>
51
+ Owner: <owner>
52
+ View: {Data.Tenant.Url}/automation-profile/{process_slug}/documentation
53
+ Documents:
54
+ - PDD (document_id 12, file_id 42 — downloadable)
55
+ - SDD (document_id 13, embed_link — link only)
56
+ ```
57
+
58
+ `process_slug` comes from `automations get --all-fields`; the base from `uip ah auth-info get` → `Data.Tenant.Url`, which is **already the full AH tenant base** (`…/{org}/{tenant}/automationhub_`) — append only `/automation-profile/{process_slug}` (+ `/documentation`), never re-append org/tenant segments. Offer the raw JSON, downloads, or components (`uip ah components list --automation-id <id>`) if relevant.
@@ -0,0 +1,104 @@
1
+ # Publish a Process to Automation Hub — `uip ah` CLI flow
2
+
3
+ Creates one process from a schema-driven payload and attaches its documents (PDD/SDD), using `uip ah` commands. Auth is handled by the CLI (Delegate env-auth or `uip login`) — you never touch a token.
4
+
5
+ > **Use this flow only after the preflight in [`cli-commands.md`](cli-commands.md) passed.** All commands: append `--output json`. The domain contract (required fields, wrapping rules, document types) is the same one [`api-endpoints.md`](api-endpoints.md) documents — the CLI only changes the transport.
6
+
7
+ ## Step 1: Verify connectivity (and fetch the idea flows)
8
+
9
+ ```bash
10
+ uip ah idea-flows list --output json
11
+ ```
12
+
13
+ - `Result: Success` → keep `Data` (flow names + ids) and tell the user "Connected to Automation Hub."
14
+ - Auth failure → tell the user to run `uip login` (or, in Delegate, to sign in). Never ask for a raw token.
15
+ - `Failure` mentioning the tenant/enablement → AH is not enabled on this tenant; stop.
16
+
17
+ ## Step 2: Pick the idea flow
18
+
19
+ Default to the entry whose `Name` contains "Business Process" (case-insensitive); take its `Id`. If the caller named a different flow, use that. Several candidates → ask. None → say Business Process flows may not be enabled and stop. Store `IDEA_FLOW_ID`.
20
+
21
+ ## Step 3: Fetch the schema
22
+
23
+ ```bash
24
+ uip ah automations schema get --idea-flow-id $IDEA_FLOW_ID --destination ./ah-schema.json --output json
25
+ ```
26
+
27
+ > 📁 **Working files (`ah-schema.json`, `ah-answers.json`, and any document files you generate for upload) go in the current working directory — never `/tmp`.** Hosted runtimes (e.g. the Delegate) sandbox their file tools to the session workspace: a file written to `/tmp` is readable by the CLI but every file-tool access to it fails with an access-denied error.
28
+
29
+ Read `./ah-schema.json`: the field catalog is under `properties.schema.properties` (Assessment Type > Section > Question; enums carry `answer_option` codes) and `user_inputs` is the payload template.
30
+
31
+ > ⚠️ **Do NOT submit `user_inputs` verbatim** — its example values are placeholders the API rejects (category `1`, placeholder answer codes, example emails). Shape only.
32
+
33
+ ## Step 4: Collect the inputs, then assemble the answers file
34
+
35
+ **Collect every required input BEFORE creating** — same rules as the API flow, with CLI discovery:
36
+
37
+ First **enumerate the tenant's actual required set from the schema file**: every `required`-flagged question, plus owner + submitter (enforced but never flagged). Tenant admins add required questions (commonly "Applications used"/"Thin applications used") — the baseline table is a minimum, never the whole list. Resolve each: from the caller's material, the recipes below, or `AskUserQuestion` — never by inventing.
38
+
39
+ | Input | Recipe |
40
+ |---|---|
41
+ | Process **name** | Ask. Non-empty; duplicates fail with a 409-style error. |
42
+ | **Description** | Ask, or derive from the material and confirm. |
43
+ | **Category id** | `uip ah categories get` → pick from `Data.Categories` (**`category_is_active: 1` only**); several plausible → ask with names. Never the template's `1`. |
44
+ | **Documentation** answer code | The `PROCESS_DOCUMENTS` question's own `enum` in the schema — match by label, send its `answer_option` code. |
45
+ | **Owner email** | `uip ah users list` → must be a listed `Email` (prefer `IsActive: 1`). Default to the signed-in user; confirm. |
46
+ | **Submitter email** | Same as owner; usually the same person. |
47
+ | **Application questions** (when tenant-required) | `uip ah applications list` → valid entries; if the material leaves systems unconfirmed, ask — never record an app the material does not support. Follow the question's own schema shape. |
48
+
49
+ The discovery commands are independent — run the ones you need (`categories get`, `users list`, `applications list`) **in a single shell invocation** rather than one per turn; each is fast, the round-trips between them are not.
50
+
51
+ Write the answers to `./ah-answers.json` as the filled `user_inputs` structure (the CLI accepts the whole schema-get document or just the answers map). Wrapping rules unchanged: most fields `{ "value": <v> }`; owner/submitter are **direct strings**; enum codes from that field's own `enum`; integers as numbers. Show the user a concise preview and get a confirm before writing.
52
+
53
+ ## Step 5: Create the process
54
+
55
+ ```bash
56
+ uip ah automations create --from-schema --idea-flow-id $IDEA_FLOW_ID --file ./ah-answers.json --output json
57
+ ```
58
+
59
+ - `Result: Success` → **`Data.Id`** is the new process id. A success means it WAS created — never re-run on a confusing field read (that duplicates).
60
+ - `ValidationError`/`Failure` → the `Message`/`Instructions` carry the service's validation text; the same causes as the API flow apply (unnamed required field → owner/submitter first, then diff against the schema's required set; `Invalid Category Id`; placeholder answer codes). Fix and retry **once**.
61
+
62
+ ## Step 6: Attach documents (PDD/SDD)
63
+
64
+ Attach every supplied document — default to all; ask only when two files look like the same document in different formats (in the Step 4 round). Per document:
65
+
66
+ ```bash
67
+ uip ah documents create $PROCESS_ID \
68
+ --title "PDD - <name>" --description "<desc>" \
69
+ --document-type-id <n> --file "<path>" --output json
70
+ ```
71
+
72
+ - `--document-type-id` from the fixed platform table in [`api-endpoints.md`](api-endpoints.md) — read it there; do not guess ids.
73
+ - `--file` uploads the bytes (the CLI base64s it; any file type; 200 MB cap). Use `--embed-link <url>` *instead* only when the caller has a URL and no bytes — exactly one of the two, and never invent a URL.
74
+ - Record `Data.Id` (document id) and `Data.FileId` from each response. On a validation error, surface the message and continue with the remaining documents.
75
+
76
+ ## Step 6b (optional): Link a Studio Web solution
77
+
78
+ When the caller wants the process linked to a Studio Web solution (or supplies one), set the `OVR-OVERVIEW_STUDIO_WEB_LINK` question — at create time inside `user_inputs`, or afterwards via `uip ah automations update $PROCESS_ID --file <answers.json>`. The answer's exact value format (JSON-string `value` with a required `url`, `hasProcessMap` semantics, empty string to unlink) is a domain fact — read it in [`api-endpoints.md`](api-endpoints.md) (**Studio Web link**), don't restate it.
79
+
80
+ - **Resolve the solution from the caller — no CLI discovery exists.** No stable `uip` command lists Studio Web solutions today, so ask the user (`AskUserQuestion`) for the solution's **designer URL** — they can copy it from the browser address bar with the solution open in Studio Web. If they instead supply a solution id + project id, build the URL per the catalog's designer-URL shape (`projectId` = the solution's ProcessOrchestration project). **Never invent, guess, or search for a solution id or URL.**
81
+ - If the caller doesn't know whether the solution has a `.bpmn` (the `hasProcessMap` condition), omit that field rather than guessing.
82
+
83
+ ## Step 7: Verify, then report
84
+
85
+ Both verification reads are independent — run them in **one shell invocation**:
86
+
87
+ ```bash
88
+ uip ah documents list $PROCESS_ID --output json
89
+ uip ah automations get $PROCESS_ID --all-fields --output json # read process_slug from Data
90
+ ```
91
+
92
+ Every attached document id must appear in the documents list (file-backed ones with a `FileId`). Missing → report it failed; never claim an attach you didn't see in this list.
93
+
94
+ The report **MUST end with both View deep links** — the URL segment is `process_slug` from the `--all-fields` record.
95
+
96
+ ```
97
+ Published to Automation Hub:
98
+ Process: <name> (process_id: <id>)
99
+ Documents: PDD ✓ (doc 12, file 42), SDD ✓ (doc 13, file 43)
100
+ View process: {Data.Tenant.Url}/automation-profile/{process_slug}
101
+ View documents: {Data.Tenant.Url}/automation-profile/{process_slug}/documentation
102
+ ```
103
+
104
+ Build the links from the tenant the write went to: `uip ah auth-info get` → `Data.Tenant.Url` is **already the full AH tenant base** (`…/{org}/{tenant}/automationhub_`) — append only `/automation-profile/{process_slug}` (+ `/documentation`), never re-append org/tenant segments.
@@ -139,6 +139,20 @@ base64 -i "<FILE_PATH>" | tr -d '\n' # macOS/Linux; use `base64 -w0 "<FILE_PAT
139
139
 
140
140
  Record each returned id — it is nested: read **`data.document_id`** from the response envelope. On 400, surface the validation message and continue with the remaining documents.
141
141
 
142
+ ## Step 6b (optional): Link a Studio Web solution
143
+
144
+ When the caller wants the process linked to a Studio Web solution (or supplies one), set the `OVR-OVERVIEW_STUDIO_WEB_LINK` question — at create time inside `user_inputs` (Step 4), or afterwards:
145
+
146
+ ```bash
147
+ curl -s -w "\n%{http_code}" -X PATCH \
148
+ -H "Authorization: Bearer $ACCESS_TOKEN" \
149
+ -H "Content-Type: application/json" \
150
+ -d '{"user_inputs": { ...only this question, in its Step-4 shape... }}' \
151
+ "$BASE_URL/$ORG/$TENANT/automationhub_/api/v1/openapi/automations/$PROCESS_ID"
152
+ ```
153
+
154
+ The answer's exact value format (JSON-string `value` with a required `url`, `hasProcessMap` semantics, empty string to unlink) is a domain fact — read it in [`api-endpoints.md`](api-endpoints.md) (**Studio Web link**). Resolve the solution from the caller — ask for the designer URL (no discovery API exists on this path either); **never invent, guess, or search for a solution id or URL**, and omit `hasProcessMap` if the caller doesn't know whether the solution has a `.bpmn`.
155
+
142
156
  ## Step 7: Verify, then report
143
157
 
144
158
  **Verify before claiming success** — read the process back and confirm the documents landed:
@@ -58,7 +58,7 @@ Do not answer these from this skill. Re-activate `uipath-maestro-flow` and follo
58
58
  18. **`Occurrence` is scoped to the read that produced it — re-read predictions after every per-occurrence write.** The server pairs annotations with predictions and returns **matched pairs first**, so confirming one row of a repeatable group moves that row to `Occurrence` 0 on the next read and renumbers the rest (the IXP UI shows it first too). Nothing is lost — the row keeps its own values and page location — but the indices you read *before* the write no longer identify the same rows. So: confirm/unconfirm every target in ONE `--updates` call (all its indices resolve against the same read), and when sequential per-occurrence calls are unavoidable, re-run `get-predictions` between them and re-locate each row by its field values, never by the index you saw earlier. Only fully-unannotated and fully-annotated documents read back in document order. Report rows to the user by value ("the freight-surcharge line"), not by index.
59
59
  19. **Confirm against the version you reviewed — pass `--model-version`.** Confirming triggers a retrain, so predictions can drift between your `get-predictions` read and your `confirm`. Pass the read's `ModelVersion` as `confirm -m <N>`; if a retrain changed the version since, the confirm is rejected (`PredictionVersionChangedError`) rather than stamping values you never reviewed as ground truth. On that error, re-read `get-predictions`, re-review, and confirm against the new version. Confirming on a user-supplied review (Rule 15) is no exemption: pin the `ModelVersion` the user names, or run one `get-predictions` to capture it — a read for the version alone is not a re-review.
60
60
  20. **`DeploymentName` ≠ `DeploymentTitle`, and `create` never repoints.** `deployments create --title` sets a free-form `DeploymentTitle`; the name the **runtime** resolves is `DeploymentName`, which the backend slugs and suffixes per deployment (`invoices` → `invoices-08963f00-ixp`) and which **cannot be predicted from the request** — read it off the create response or `deployments list`, never construct it. `create` only ever ADDS: repointing an existing deployment to another version is `deployments upgrade <project-name> <deployment-name>`, which takes `DeploymentName` (passing a title there is a `404`). Run `deployments list` before every `upgrade`. Upgrading changes which model version **every runtime caller of that folder and name** gets — confirm intent before touching a shared folder. See [CLI Reference § Deployments](references/cli-reference.md#deployments).
61
- 21. **`get-metrics` defaults to LATEST, not LIVE — always name the version you report.** A project keeps accumulating trained versions long after its live one was pinned, and the latest can score *worse* than what's deployed — so a bare `get-metrics` pairs the latest version's numbers with the live version identity you read from `list-models`. Resolve the version FIRST (`list-models` → `Tags[]` Name=`live`, else highest `Models[]` `Pinned: true`, else latest), pass it as `get-metrics --model-version <N>`, and state which version the scores belong to.
61
+ 21. **`get-metrics` defaults to LATEST, not LIVE — always name the version you report.** A project keeps accumulating trained versions long after its live one was pinned, and the latest can score *worse* than what's deployed — so a bare `get-metrics` pairs the latest version's numbers with the live version identity you read from `list-models`. Resolve the version FIRST, from what the user is asking — **how is it performing / production**: the live version (`list-models` → `Tags[]` Name=`live`, else highest `Models[]` `Pinned: true`, else latest); **baseline for improving instructions**: the LATEST trained version, because that is the model your edits retrain ([Improve Prompts Guide § 1a](references/improve-prompts-guide.md#1a-get-baseline-metrics)) — then pass it as `get-metrics --model-version <N>`, and state which version the scores belong to.
62
62
 
63
63
  ## Quick Start
64
64
 
@@ -80,9 +80,11 @@ If documents were just labelled (or uploaded, or the taxonomy was edited), wait
80
80
 
81
81
  ```bash
82
82
  mkdir -p /tmp/ixp/<project-name>/{docs,text,taxonomies,prompts}
83
- uip ixp projects get-metrics <project-name> --output json
83
+ uip ixp projects get-metrics <project-name> --model-version latest --output json
84
84
  ```
85
85
 
86
+ `--model-version latest` is deliberate: the baseline is the latest trained version — the model your instruction edits retrain — not the `live` tag (Critical Rule 21: the version follows the question).
87
+
86
88
  Note the `ModelVersion` from this baseline read — later iterations check that it advances after each `fields update-prompts` / `groups update-prompts` (see step 2e). If the value here looks identical to a known pre-labelling version, the retrain may still be in flight; re-fetch under the bounded wait in [Waiting for retrain](#waiting-for-retrain), then proceed with whatever it returns.
87
89
 
88
90
  Save the full per-field `Fields` array as `baseline_metrics`. This is the starting point you compare against. (For a validated model, get-metrics Data is flat — `Fields`/`FieldGroups`/`ValidatedDocuments` are top-level. An unvalidated model returns `Data: { Metrics: null }` instead — re-fetch under the bounded wait above.)
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "skillsVersion": "1.201.0-preview.614",
3
+ "skillsVersion": "1.201.0-preview.620",
4
4
  "targetCli": "^1.201.0"
5
5
  }