@uipath/skills 1.199.0 → 1.200.0

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.
Files changed (345) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CODEOWNERS +14 -8
  4. package/README.md +18 -3
  5. package/assets/skill-status.json +9 -1
  6. package/assets/uip-catalog-snapshot.json +227 -21
  7. package/package.json +11 -2
  8. package/scripts/npm-package-lifecycle.mjs +46 -0
  9. package/skills/uipath-admin/SKILL.md +5 -1
  10. package/skills/uipath-admin/references/audit-commands.md +1 -1
  11. package/skills/uipath-admin/references/audit-workflow-guide.md +9 -0
  12. package/skills/uipath-agents/SKILL.md +2 -2
  13. package/skills/uipath-agents/references/lowcode/capabilities/context/index.md +7 -0
  14. package/skills/uipath-agents/references/lowcode/capabilities/integration-service/integration-service.md +5 -6
  15. package/skills/uipath-agents/references/lowcode/critical-rules/critical-rules.md +1 -1
  16. package/skills/uipath-agents/references/lowcode/evaluations/evaluation-sets.md +5 -0
  17. package/skills/uipath-agents/references/lowcode/project-lifecycle.md +3 -3
  18. package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +3 -2
  19. package/skills/uipath-api-workflow/SKILL.md +2 -1
  20. package/skills/uipath-api-workflow/references/cli-reference.md +3 -3
  21. package/skills/uipath-coded-apps/SKILL.md +3 -2
  22. package/skills/uipath-coded-apps/assets/fixtures/governance-dashboard-starter-kit.tar.gz +0 -0
  23. package/skills/uipath-coded-apps/assets/templates/web-app-template.md +1 -1
  24. package/skills/uipath-coded-apps/references/create-web-app.md +60 -48
  25. package/skills/uipath-coded-apps/references/dashboards/CAPABILITY.md +2 -2
  26. package/skills/uipath-coded-apps/references/dashboards/plugins/build/impl.md +2 -2
  27. package/skills/uipath-coded-apps/references/dashboards/primitives/tier-resolution.md +16 -16
  28. package/skills/uipath-coded-apps/references/oauth-scopes.md +28 -272
  29. package/skills/uipath-coded-apps/references/sdk/action-center.md +26 -243
  30. package/skills/uipath-coded-apps/references/sdk/agents.md +20 -130
  31. package/skills/uipath-coded-apps/references/sdk/conversational-agent.md +52 -706
  32. package/skills/uipath-coded-apps/references/sdk/data-fabric.md +20 -237
  33. package/skills/uipath-coded-apps/references/sdk/feedback.md +4 -139
  34. package/skills/uipath-coded-apps/references/sdk/governance-traces.md +7 -55
  35. package/skills/uipath-coded-apps/references/sdk/governance.md +4 -44
  36. package/skills/uipath-coded-apps/references/sdk/imports.md +77 -35
  37. package/skills/uipath-coded-apps/references/sdk/maestro.md +29 -406
  38. package/skills/uipath-coded-apps/references/sdk/orchestrator.md +30 -324
  39. package/skills/uipath-coded-apps/references/sdk/pagination.md +9 -67
  40. package/skills/uipath-coded-apps/references/sdk/traces.md +8 -43
  41. package/skills/uipath-functions/SKILL.md +23 -23
  42. package/skills/uipath-governance/SKILL.md +5 -4
  43. package/skills/uipath-governance/references/cli-cheatsheet.md +2 -1
  44. package/skills/uipath-governance/references/compliance-pack/coverage/impl.md +143 -58
  45. package/skills/uipath-governance/references/compliance-pack/restore/impl.md +61 -0
  46. package/skills/uipath-human-in-the-loop/SKILL.md +4 -2
  47. package/skills/uipath-insights/SKILL.md +17 -18
  48. package/skills/uipath-ixp/SKILL.md +12 -7
  49. package/skills/uipath-ixp/references/cli-reference.md +71 -9
  50. package/skills/uipath-ixp/references/improve-prompts-guide.md +23 -9
  51. package/skills/uipath-ixp/references/label-documents-guide.md +33 -5
  52. package/skills/uipath-maestro-bpmn/SKILL.md +15 -14
  53. package/skills/uipath-maestro-bpmn/references/cli-conventions.md +15 -6
  54. package/skills/uipath-maestro-bpmn/references/structural-bpmn.md +18 -17
  55. package/skills/uipath-maestro-case/SKILL.md +46 -33
  56. package/skills/uipath-maestro-case/assets/templates/sdd-template.md +77 -37
  57. package/skills/uipath-maestro-case/assets/templates/sdd-viewer.html +0 -2
  58. package/skills/uipath-maestro-case/references/bindings-and-expressions.md +3 -1
  59. package/skills/uipath-maestro-case/references/bindings-v2-sync.md +2 -2
  60. package/skills/uipath-maestro-case/references/brownfield.md +15 -5
  61. package/skills/uipath-maestro-case/references/case-commands.md +19 -3
  62. package/skills/uipath-maestro-case/references/case-editing-operations.md +24 -21
  63. package/skills/uipath-maestro-case/references/case-schema.md +38 -16
  64. package/skills/uipath-maestro-case/references/connector-trigger-common.md +15 -8
  65. package/skills/uipath-maestro-case/references/evals/evals.json +35 -18
  66. package/skills/uipath-maestro-case/references/implementation.md +86 -71
  67. package/skills/uipath-maestro-case/references/phase-0-interview.md +92 -23
  68. package/skills/uipath-maestro-case/references/phased-execution.md +70 -55
  69. package/skills/uipath-maestro-case/references/placeholder-tasks.md +5 -5
  70. package/skills/uipath-maestro-case/references/planning.md +57 -9
  71. package/skills/uipath-maestro-case/references/plugins/case/impl-json.md +7 -5
  72. package/skills/uipath-maestro-case/references/plugins/case/planning.md +1 -1
  73. package/skills/uipath-maestro-case/references/plugins/conditions/case-exit-conditions/impl-json.md +5 -5
  74. package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/impl-json.md +41 -5
  75. package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/planning.md +27 -3
  76. package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/impl-json.md +6 -6
  77. package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/planning.md +3 -1
  78. package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/impl-json.md +20 -7
  79. package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/planning.md +37 -4
  80. package/skills/uipath-maestro-case/references/plugins/sla/impl-json.md +24 -13
  81. package/skills/uipath-maestro-case/references/plugins/sla/planning.md +9 -3
  82. package/skills/uipath-maestro-case/references/plugins/stages/impl-json.md +4 -0
  83. package/skills/uipath-maestro-case/references/plugins/stages/planning.md +4 -1
  84. package/skills/uipath-maestro-case/references/plugins/tasks/action/impl-json.md +3 -1
  85. package/skills/uipath-maestro-case/references/plugins/tasks/action/planning.md +2 -0
  86. package/skills/uipath-maestro-case/references/plugins/tasks/agent/impl-json.md +3 -2
  87. package/skills/uipath-maestro-case/references/plugins/tasks/agent/planning.md +4 -2
  88. package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/impl-json.md +3 -2
  89. package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/planning.md +4 -2
  90. package/skills/uipath-maestro-case/references/plugins/tasks/case-management/impl-json.md +3 -2
  91. package/skills/uipath-maestro-case/references/plugins/tasks/case-management/planning.md +4 -2
  92. package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/impl-json.md +1 -1
  93. package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/planning.md +2 -0
  94. package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/impl-json.md +1 -1
  95. package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/planning.md +2 -0
  96. package/skills/uipath-maestro-case/references/plugins/tasks/create-inline-common.md +1 -1
  97. package/skills/uipath-maestro-case/references/plugins/tasks/process/impl-json.md +3 -2
  98. package/skills/uipath-maestro-case/references/plugins/tasks/process/planning.md +6 -4
  99. package/skills/uipath-maestro-case/references/plugins/tasks/rpa/impl-json.md +3 -2
  100. package/skills/uipath-maestro-case/references/plugins/tasks/rpa/planning.md +4 -2
  101. package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/impl-json.md +4 -3
  102. package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/planning.md +4 -0
  103. package/skills/uipath-maestro-case/references/plugins/triggers/event/impl-json.md +17 -14
  104. package/skills/uipath-maestro-case/references/plugins/triggers/event/planning.md +1 -1
  105. package/skills/uipath-maestro-case/references/plugins/triggers/manual/impl-json.md +13 -10
  106. package/skills/uipath-maestro-case/references/plugins/triggers/timer/impl-json.md +18 -16
  107. package/skills/uipath-maestro-case/references/plugins/triggers/timer/planning.md +2 -2
  108. package/skills/uipath-maestro-case/references/plugins/variables/bindings/impl-json.md +1 -1
  109. package/skills/uipath-maestro-case/references/plugins/variables/global-vars/impl-json.md +11 -9
  110. package/skills/uipath-maestro-case/references/plugins/variables/io-binding/impl-json.md +6 -2
  111. package/skills/uipath-maestro-case/references/plugins/variables/io-binding/planning.md +19 -1
  112. package/skills/uipath-maestro-case/references/registry-discovery.md +3 -3
  113. package/skills/uipath-maestro-case/references/sdd-generation-rules.md +155 -51
  114. package/skills/uipath-maestro-case/references/sla-response-shapes.md +74 -0
  115. package/skills/uipath-maestro-flow/SKILL.md +4 -3
  116. package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +3 -0
  117. package/skills/uipath-maestro-flow/references/author/references/editing-operations-json.md +10 -17
  118. package/skills/uipath-maestro-flow/references/author/references/editing-operations.md +1 -1
  119. package/skills/uipath-maestro-flow/references/author/references/greenfield.md +8 -6
  120. package/skills/uipath-maestro-flow/references/author/references/planning-impl.md +1 -1
  121. package/skills/uipath-maestro-flow/references/author/references/plugins/agent/impl.md +4 -9
  122. package/skills/uipath-maestro-flow/references/author/references/plugins/agentic-process/impl.md +3 -7
  123. package/skills/uipath-maestro-flow/references/author/references/plugins/api-workflow/impl.md +5 -8
  124. package/skills/uipath-maestro-flow/references/author/references/plugins/connector/impl.md +11 -4
  125. package/skills/uipath-maestro-flow/references/author/references/plugins/flow/impl.md +3 -7
  126. package/skills/uipath-maestro-flow/references/author/references/plugins/inline-agent/impl.md +14 -17
  127. package/skills/uipath-maestro-flow/references/author/references/plugins/ixp/impl.md +60 -13
  128. package/skills/uipath-maestro-flow/references/author/references/plugins/queue/impl.md +2 -14
  129. package/skills/uipath-maestro-flow/references/author/references/plugins/rpa/impl.md +4 -9
  130. package/skills/uipath-maestro-flow/references/author/references/plugins/script/impl.md +3 -0
  131. package/skills/uipath-maestro-flow/references/author/references/plugins/subflow/impl.md +5 -9
  132. package/skills/uipath-maestro-flow/references/author/references/plugins/transform/impl.md +13 -0
  133. package/skills/uipath-maestro-flow/references/shared/action-nodes.md +2 -2
  134. package/skills/uipath-maestro-flow/references/shared/file-format.md +16 -12
  135. package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +3 -3
  136. package/skills/uipath-planner/SKILL.md +1 -1
  137. package/skills/uipath-planner/references/non-pdd-lane-guide.md +1 -1
  138. package/skills/uipath-platform/SKILL.md +1 -1
  139. package/skills/uipath-platform/references/data-fabric/bulk-import.md +10 -27
  140. package/skills/uipath-platform/references/data-fabric/choice-sets.md +7 -64
  141. package/skills/uipath-platform/references/data-fabric/data-fabric.md +76 -267
  142. package/skills/uipath-platform/references/data-fabric/entity-schema.md +23 -99
  143. package/skills/uipath-platform/references/data-fabric/file-attachments.md +5 -28
  144. package/skills/uipath-platform/references/data-fabric/filter-platform-contract.md +2 -2
  145. package/skills/uipath-platform/references/data-fabric/records-query.md +11 -32
  146. package/skills/uipath-platform/references/integration-service/reference-resolution.md +6 -2
  147. package/skills/uipath-platform/references/licensing/consumables-report.md +18 -0
  148. package/skills/uipath-platform/references/licensing/licensing.md +1 -1
  149. package/skills/uipath-platform/references/orchestrator/run-jobs.md +9 -2
  150. package/skills/uipath-platform/references/orchestrator/setup-environment.md +9 -0
  151. package/skills/uipath-platform/references/traces/feedback.md +4 -1
  152. package/skills/uipath-process-mining/SKILL.md +97 -0
  153. package/skills/uipath-process-mining/references/app-types.md +66 -0
  154. package/skills/uipath-process-mining/references/data-model.md +130 -0
  155. package/skills/uipath-process-mining/references/lifecycle-and-rbac.md +67 -0
  156. package/skills/uipath-process-mining/references/model-editing.md +112 -0
  157. package/skills/uipath-process-mining/references/pre-flight.md +119 -0
  158. package/skills/uipath-process-mining/references/querying.md +66 -0
  159. package/skills/uipath-process-mining/references/transformations.md +80 -0
  160. package/skills/uipath-process-mining/references/uip-pm-cli.md +145 -0
  161. package/skills/uipath-review/SKILL.md +23 -18
  162. package/skills/uipath-review/references/agents/agent-grading-rubric.md +1 -1
  163. package/skills/uipath-review/references/agents/agent-review-checklist.md +0 -4
  164. package/skills/uipath-review/references/agents/agents-coded-rules.md +1 -10
  165. package/skills/uipath-review/references/agents/agents-lowcode-rules.md +3 -6
  166. package/skills/uipath-review/references/agents/guardrails/coded-guardrails-review.md +62 -14
  167. package/skills/uipath-review/references/agents/guardrails/guardrails-review.md +60 -4
  168. package/skills/uipath-review/references/review-workflow-guide.md +3 -2
  169. package/skills/uipath-review/references/rule-catalog-workflow.md +4 -5
  170. package/skills/uipath-rpa/.maintenance/pattern-card-maintenance.md +20 -0
  171. package/skills/uipath-rpa/SKILL.md +57 -55
  172. package/skills/uipath-rpa/agents/uipath-project-discovery-agent.md +75 -19
  173. package/skills/uipath-rpa/assets/codedworkflow-template.md +245 -11
  174. package/skills/uipath-rpa/references/cli-reference.md +229 -6
  175. package/skills/uipath-rpa/references/coded/codedworkflow-reference.md +158 -2
  176. package/skills/uipath-rpa/references/coded/integration-service-guide.md +6 -5
  177. package/skills/uipath-rpa/references/coded/operations-guide.md +273 -5
  178. package/skills/uipath-rpa/references/coded-vs-xaml-guide.md +3 -3
  179. package/skills/uipath-rpa/references/common-pattern-card.md +303 -0
  180. package/skills/uipath-rpa/references/data-manipulation-guide.md +18 -3
  181. package/skills/uipath-rpa/references/debugging.md +0 -2
  182. package/skills/uipath-rpa/references/environment-setup.md +309 -1
  183. package/skills/uipath-rpa/references/error-handling-guide.md +1 -1
  184. package/skills/uipath-rpa/references/execution-maps-guide.md +110 -0
  185. package/skills/uipath-rpa/references/is-connector-xaml-guide.md +58 -4
  186. package/skills/uipath-rpa/references/legacy/activity-docs/Excel.md +1 -1
  187. package/skills/uipath-rpa/references/legacy/activity-docs/_DU-PROCESS.md +0 -2
  188. package/skills/uipath-rpa/references/legacy/activity-docs/_INDEX.md +2 -2
  189. package/skills/uipath-rpa/references/legacy/activity-docs/_PATTERNS.md +1 -1
  190. package/skills/uipath-rpa/references/legacy/activity-docs/_REFRAMEWORK.md +2 -7
  191. package/skills/uipath-rpa/references/legacy/cli-reference.md +599 -0
  192. package/skills/uipath-rpa/references/legacy/error-handling-guide.md +2 -2
  193. package/skills/uipath-rpa/references/legacy/legacy-mode-guide.md +16 -16
  194. package/skills/uipath-rpa/references/legacy/project-organization-guide.md +2 -2
  195. package/skills/uipath-rpa/references/legacy/selector-guide.md +163 -1
  196. package/skills/uipath-rpa/references/legacy/testing-guide.md +246 -3
  197. package/skills/uipath-rpa/references/legacy/xaml-basics-and-rules.md +267 -2
  198. package/skills/uipath-rpa/references/library-authoring-guide.md +4 -3
  199. package/skills/uipath-rpa/references/testing-guide.md +2 -28
  200. package/skills/uipath-rpa/references/trigger-pattern-guide.md +1 -1
  201. package/skills/uipath-rpa/references/xaml/canvas-layout-guide.md +140 -33
  202. package/skills/uipath-rpa/references/xaml/common-pitfalls.md +57 -240
  203. package/skills/uipath-rpa/references/xaml/csharp-activity-binding-guide.md +42 -2
  204. package/skills/uipath-rpa/references/xaml/long-running-workflow-guide.md +1 -1
  205. package/skills/uipath-rpa/references/xaml/xaml-basics-and-rules.md +194 -228
  206. package/skills/uipath-solution/references/activate-and-manage.md +22 -0
  207. package/skills/uipath-solution/references/develop-solution.md +26 -2
  208. package/skills/uipath-solution/references/pack-and-deploy.md +43 -9
  209. package/skills/uipath-test/SKILL.md +4 -4
  210. package/skills/uipath-test/references/playwright-first-mile-guide.md +5 -4
  211. package/skills/uipath-test/references/publish-and-link-guide.md +2 -2
  212. package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/playbooks/click-silent-no-op.md +5 -5
  213. package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/playbooks/queue-operation-failed.md +20 -4
  214. package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/summary.md +1 -1
  215. package/skills/uipath-troubleshoot/references/activity-packages/csv-activities/playbooks/read-csv-file-not-found.md +12 -0
  216. package/skills/uipath-troubleshoot/references/activity-packages/mail-activities/playbooks/send-outlook-mail-failures.md +12 -1
  217. package/skills/uipath-troubleshoot/references/activity-packages/system-activities/playbooks/get-asset-activity-bug-silent-failure.md +2 -1
  218. package/skills/uipath-troubleshoot/references/activity-packages/terminal-activities/playbooks/terminal-session-connection-failed.md +5 -1
  219. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/click-silent-no-op.md +5 -5
  220. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/dependency-version-conflict.md +27 -6
  221. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/napplicationcard-view-generation-failed.md +10 -0
  222. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/scope-container-wrong-page.md +1 -1
  223. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/summary.md +1 -1
  224. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/overview.md +4 -0
  225. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-auth-401-403.md +44 -0
  226. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-connection-failure.md +2 -1
  227. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-content-type-rejected.md +37 -0
  228. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-proxy-blocked.md +39 -0
  229. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/package-version-mismatch.md +42 -0
  230. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/securestring-misuse-analyzer.md +41 -0
  231. package/skills/uipath-troubleshoot/references/activity-packages/web-activities/summary.md +5 -0
  232. package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/connector-null-reference.md +14 -1
  233. package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/connector-runtime-exception.md +2 -0
  234. package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/is-activities-prerelease-not-found.md +39 -0
  235. package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/response-content-too-large.md +41 -0
  236. package/skills/uipath-troubleshoot/references/products/integration-service/summary.md +9 -0
  237. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/console-conflict-login-to-console.md +40 -0
  238. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/credential-store-unavailable.md +42 -0
  239. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/executor-start-transient-rerun.md +49 -0
  240. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-consecutive-system-exceptions.md +47 -0
  241. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-faulted-session-timeout.md +19 -19
  242. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-output-too-large.md +47 -0
  243. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-stopped-generic-exit-code.md +55 -0
  244. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/known-issue-robot-defect.md +40 -0
  245. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/platform-incident-correlation.md +45 -0
  246. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/screen-capture-handle-invalid.md +43 -0
  247. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/serverless-license-quota.md +43 -0
  248. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/serverless-time-limit-exceeded.md +34 -0
  249. package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/workstation-in-use-machine-slots.md +40 -0
  250. package/skills/uipath-troubleshoot/references/products/orchestrator/summary.md +13 -1
  251. package/version-manifest.json +2 -2
  252. package/skills/uipath-maestro-bpmn/validator/README.md +0 -224
  253. package/skills/uipath-maestro-bpmn/validator/model.mjs +0 -419
  254. package/skills/uipath-maestro-bpmn/validator/package.json +0 -17
  255. package/skills/uipath-maestro-bpmn/validator/rules.mjs +0 -1403
  256. package/skills/uipath-maestro-bpmn/validator/samples/invalid-conditional-and-variable.bpmn +0 -25
  257. package/skills/uipath-maestro-bpmn/validator/samples/valid-baseline.bpmn +0 -52
  258. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/A.2.0.bpmn +0 -157
  259. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/A.2.1.bpmn +0 -333
  260. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/B.1.0.bpmn +0 -598
  261. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/B.2.0.bpmn +0 -1709
  262. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.2.0.bpmn +0 -564
  263. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.3.0.bpmn +0 -671
  264. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.4.0.bpmn +0 -1045
  265. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.5.0.bpmn +0 -1176
  266. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.6.0.bpmn +0 -670
  267. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.7.0.bpmn +0 -466
  268. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Can_Parse_Complex_Process_With_Task_Gateway_BoundaryEvent_etc.bpmn +0 -74
  269. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/ExclusiveGatewayDefaultFlow.bpmn +0 -32
  270. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/ExternalAgentWorkflow.bpmn +0 -62
  271. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Golden_Scenario.initial.bpmn +0 -361
  272. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/InclusiveJoinRouteAwayBranch.bpmn +0 -62
  273. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_AsyncExecution_And_Create_CorrectModel.bpmn +0 -74
  274. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_ExtractionValidation_And_Create_CorrectModel.bpmn +0 -35
  275. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_Extraction_FileUpload_And_Create_CorrectModel.bpmn +0 -33
  276. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_Extraction_JobAttachment_And_Create_CorrectModel.bpmn +0 -35
  277. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_SubProcess_With_Multiple_Element_Types.bpmn +0 -76
  278. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/StartEventWithOutputs.bpmn +0 -36
  279. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/StartGatewayEnd.bpmn +0 -44
  280. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/all elements.bpmn +0 -516
  281. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/all_sequence_flow_types.bpmn +0 -173
  282. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/demo.bpmn +0 -181
  283. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-001-collapsed.bpmn +0 -126
  284. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-001-expanded.bpmn +0 -122
  285. package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-003-collapsed_deeply-nested.bpmn +0 -438
  286. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/A.1.0.bpmn +0 -87
  287. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/A.3.0.bpmn +0 -165
  288. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ApiWorkflow.bpmn +0 -39
  289. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnNestedSubProcessTests.bpmn +0 -102
  290. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnTimerBoundaryEvents.bpmn +0 -160
  291. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnXmlWithCatchAllErrorEventSubProcess.bpmn +0 -45
  292. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnXmlWithSpecificErrorEventSubProcess.bpmn +0 -46
  293. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/CaseManagementWithConstantIdentifier.bpmn +0 -218
  294. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ErrorBoundary.bpmn +0 -78
  295. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ErrorPropagationInEventSubprocess.bpmn +0 -340
  296. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/EventBasedGatewayFirstCatcherWins.bpmn +0 -56
  297. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Example-EventBasedGateway.bpmn +0 -117
  298. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveGatewayConditional.bpmn +0 -45
  299. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveGatewaySharedEndEvent.bpmn +0 -45
  300. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveWithParallelGateway.bpmn +0 -68
  301. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/FourScriptTasks.bpmn +0 -84
  302. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/HitlTaskOnly.bpmn +0 -55
  303. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/InclusiveGatewayForkJoin.bpmn +0 -69
  304. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_BPMN_Elements_And_Create_CorrectModel.bpmn +0 -20
  305. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_HttpRequest_ServiceTask_And_Create_Correct_Model.bpmn +0 -34
  306. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_MessageBoundaryEvent_And_Create_CorrectModel.bpmn +0 -87
  307. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_Script_Task_V2_And_Create_Correct_Model.bpmn +0 -31
  308. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_Sets_Containers_Properly.bpmn +0 -129
  309. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ScriptWritesVariableThenGatewayBranches.bpmn +0 -59
  310. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/boundaryevent.bpmn +0 -30
  311. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/collapsed-subprocess.bpmn +0 -83
  312. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/connectable-types.bpmn +0 -85
  313. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/extensions-orchestrator-start-job.bpmn +0 -80
  314. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/multiparticipantpool.bpmn +0 -77
  315. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/nestedsubprocess.bpmn +0 -36
  316. package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/simple.bpmn +0 -59
  317. package/skills/uipath-maestro-bpmn/validator/test/integration.test.mjs +0 -146
  318. package/skills/uipath-maestro-bpmn/validator/test/model-helpers.mjs +0 -42
  319. package/skills/uipath-maestro-bpmn/validator/test/ported-rule-tests.mjs +0 -983
  320. package/skills/uipath-maestro-bpmn/validator/test/run-tests.mjs +0 -530
  321. package/skills/uipath-maestro-bpmn/validator/uipath-moddle.v1.json +0 -715
  322. package/skills/uipath-maestro-bpmn/validator/validate-bpmn.mjs +0 -164
  323. package/skills/uipath-review/references/agents/agents-common-rules.md +0 -32
  324. package/skills/uipath-rpa/assets/before-after-hooks-template.md +0 -115
  325. package/skills/uipath-rpa/assets/helper-utility-template.md +0 -22
  326. package/skills/uipath-rpa/assets/testcase-template.md +0 -92
  327. package/skills/uipath-rpa/references/coded/coding-guidelines.md +0 -255
  328. package/skills/uipath-rpa/references/coded/inspect-package-guide.md +0 -80
  329. package/skills/uipath-rpa/references/coded/third-party-packages-guide.md +0 -67
  330. package/skills/uipath-rpa/references/connector-capabilities.md +0 -79
  331. package/skills/uipath-rpa/references/legacy/activity-docs/Testing.md +0 -95
  332. package/skills/uipath-rpa/references/legacy/activity-docs/UIAutomation.md +0 -159
  333. package/skills/uipath-rpa/references/legacy/common-pitfalls.md +0 -318
  334. package/skills/uipath-rpa/references/legacy/discovery-workflow.md +0 -147
  335. package/skills/uipath-rpa/references/legacy/environment-setup.md +0 -78
  336. package/skills/uipath-rpa/references/legacy/project-structure.md +0 -206
  337. package/skills/uipath-rpa/references/legacy/test-data-guide.md +0 -142
  338. package/skills/uipath-rpa/references/legacy/validation-and-fixing.md +0 -154
  339. package/skills/uipath-rpa/references/project-structure-guide.md +0 -168
  340. package/skills/uipath-rpa/references/project-structure.md +0 -135
  341. package/skills/uipath-rpa/references/publishing-guide.md +0 -80
  342. package/skills/uipath-rpa/references/validation-guide.md +0 -170
  343. package/skills/uipath-rpa/references/xaml/csharp-expression-pitfalls.md +0 -43
  344. package/skills/uipath-rpa/references/xaml/flowchart-guide.md +0 -113
  345. package/skills/uipath-rpa/references/xaml/workflow-guide.md +0 -258
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: uipath-process-mining
3
+ description: "UiPath Process Mining via `uip pm` — build and operate a process app end-to-end from a CSV / event log: templates, data mapping, upload, ingest, the dbt (Snowflake) transformation layer, publish, and query it (metrics, percentiles, RCA). Covers `uipath.custom`, the `Cases.sql` optional-column gotcha, Case-linked data-model tables (add-table + re-ingest), the apply-not-reingest fix loop, fixing a wrong mapping in place via `apps data-mapping get|update` (no app rebuild), and editing the app model via `apps model fields` — a field's data kind / calculated fields, including the numeric→duration mismatch that locks dashboards open (DNA-46960). For Orchestrator/Data Fabric/Integration Service→uipath-platform. For `.flow`/Maestro→uipath-maestro-flow. For IXP→uipath-ixp."
4
+ when_to_use: "User mentions process mining, a process app, an event log, `uip pm`, mining a CSV/log, ingesting data into one, dbt/SQL transformations, steps-to-resolution / throughput / variant / rework analysis, or querying one. Also 'build a process app from this data', 'ingest this log', 'fix my Cases.sql', 'why can't I query my custom table', 'add a table to the data model', 'group by X average Y', 'fix/change/read my data mapping', 'wrong date format in the mapping', 'change a field's data kind', 'set a field to duration', 'add a calculated field/metric', 'my dashboards won't open', 'Must be duration not numeric (DNA-46960)'. For Orchestrator/Data Fabric→uipath-platform; `.flow`→uipath-maestro-flow; IXP→uipath-ixp."
5
+ allowed-tools: Bash, Read, Write, Glob, Grep
6
+ ---
7
+
8
+ # UiPath Process Mining — `uip pm` Assistant
9
+
10
+ Build and operate a UiPath Process Mining process app end-to-end from the terminal with `uip pm`: from a raw CSV to a queryable process model. The whole loop — templates, data mapping, upload, ingest, the dbt/Snowflake transformation layer, and querying — is scriptable; **use the CLI, don't hand-roll the Process Mining REST API.**
11
+
12
+ **This works for every app type**, not just `uipath.custom`: the pipeline (mapping → upload → ingest → transform → data model → query) is identical across the `uipath.custom` event-log template and the source-system templates (P2P / O2C / IM / AP / … on SAP, Oracle, NetSuite, ServiceNow, Salesforce, …). Only **what the data mapping / extract must contain** differs. See [`references/app-types.md`](references/app-types.md).
13
+
14
+ This skill is the **process-mining domain layer** — *what* to build and *why*. The
15
+ low-level mechanics of driving the tool — the command-group map, the `Result`/`Code`/`Data`
16
+ output envelope, the ETag get-modify-put pattern, `--wait`, `--stage`, and field-id
17
+ discovery — are one layer down in [`references/uip-pm-cli.md`](references/uip-pm-cli.md).
18
+ The rules below carry the headline command and link down to it and to the domain
19
+ references for the full detail.
20
+
21
+ ## When to Use This Skill
22
+
23
+ - **Build a process app from data** — you have a CSV / event log and want a mined process (throughput, variants, rework, steps-to-resolution).
24
+ - **Author the transformation layer** — edit the dbt (Snowflake) SQL models that produce the process model, then re-run.
25
+ - **Query a process app** — pull numbers out: aggregate group-by + metrics, raw detail rows, percentiles, root-cause analysis, process insights.
26
+ - **Expose custom analysis** — surface your own analytical table (a weekly aggregate, an impact study) as a queryable entity.
27
+ - **Edit the app model** — change a field's data kind, add calculated fields, or fix a data-kind mismatch that locks dashboards open (DNA-46960).
28
+ - **Manage the app lifecycle** — stages (dev → published), RBAC, deletion.
29
+
30
+ ## App lifecycle
31
+
32
+ An app moves through: **create** (from a template + data mapping) → **load** (upload + ingest) → **transform** on the **dev** stage (the ELT/dbt layer) → **publish** to the **published** stage → **query** / build dashboards. Develop against a small subset on `dev`, then publish the full dataset for real analysis ([`references/lifecycle-and-rbac.md`](references/lifecycle-and-rbac.md)). The **ELT editor** is the `transformations` command group over the dbt (Snowflake) model tree that turns loaded source tables into the process model — its command surface and the apply-vs-run distinction are in [`references/transformations.md`](references/transformations.md).
33
+
34
+ ## Critical Rules
35
+
36
+ 1. **To make a custom analytical table queryable, register it as a Case-linked data-model table, then RE-INGEST.** Process Mining is **case-centric**: a queryable table must be the `Cases` root or reach `Cases` via a foreign key — an unlinked table is rejected at query time (`UserError_TableIsDeleted`). First check the built-in Case-child slots: **`Tags`** (multi-valued per-case labels: `Tag`/`Tag_type`) and **`Due_dates`** (per-case SLA/deadline: `Expected_date`/`Actual_date`/`On_time`/`Cost`) — populate their dbt models rather than adding a table when your data fits. Otherwise register a custom table with **`uip pm apps data-model add-table <app> --file <table.json>`**, where the file is a DataModelDto entry `{ name, primaryKey, foreignKeys:[{table:"Cases",column:"Case_ID"}] }` (loose-link a standalone aggregate with a surrogate PK + nullable `Case_ID`). `add-table` edits `/dev/dataModel` (upsert, ETag-safe) then `applyCurrentDatamodel`; the table only becomes queryable after **`ingestions create --wait`** (a data-model edit takes effect only on the next ingestion). Full recipe + Tags/Due_dates decision table in [`references/data-model.md`](references/data-model.md).
37
+
38
+ 2. **Match the template to the data — the rest of the pipeline is identical for all app types.** A single denormalized log (Case, Activity, Timestamp [+ attributes]) ⇒ `uipath.custom` ("Event log"). Otherwise pick the `<process>.<system>` template matching your source system AND process (Purchase-to-Pay on SAP ⇒ `uipath.p2p.sap`; incidents from ServiceNow ⇒ `uipath.im.servicenow`) — but only when you actually have that system's **full multi-table extract**, not a single log you exported from it. Every template shares the same model shape and the same mapping→ingest→transform→query machinery; only the expected input tables differ. Discover with `app-types list`, inspect a template with `app-types get`. See [`references/app-types.md`](references/app-types.md).
39
+
40
+ 3. **Patch the `uipath.custom` `Cases.sql` optional-column gotcha (custom-only).** Source-system templates ship their own correct transformations — this gotcha is specific to the `uipath.custom` event-log template. The template's `models/Cases.sql` references `Event_log."Case"`, `"Case_status"`, `"Case_type"`, `"Case_value"`. A minimal mapping (Case_ID/Activity/timestamp only) doesn't produce those ⇒ dbt `000904 invalid identifier`. Fix: pull the file, replace the missing refs with `cast(null as varchar/float)`, push, and **`transformations apply`**. `Tags.sql`/`Due_dates.sql` are safe `where 1=0` stubs.
41
+
42
+ 4. **After a transform-only failure, `apply` — don't re-ingest.** The data is already loaded. Fix SQL (`transformations get` → edit → `transformations update --etag '<the get's ETag>'`, or `create` for a new file, which needs none) then `transformations apply` (re-transforms loaded data). Re-ingest only when the raw data or the mapping/parse settings change.
43
+
44
+ 5. **A wrong data mapping does NOT mean recreating the app — fix it in place with `apps data-mapping`.** The mapping is not create-only: `uip pm apps data-mapping get <app> --destination ./mapping.json` → edit → `uip pm apps data-mapping update <app> --file ./mapping.json --etag '<etag>'` replaces it on an existing app. **`--etag` is required** — pass the `Data.ETag` that *your* `get` returned, which is what proves the edit was based on the version you read; a lost race is refused `409 UserError_ETagFileConflict` (re-`get` for the new version **and** ETag, re-apply, retry), and a table-less file is refused rather than wiping the stored mapping. Unlike a SQL fix (Rule 4), a **mapping** change is a parse-setting change, so it takes effect only on the **next ingestion** — re-`files upload` if the source columns changed, then `ingestions create`. Only `dev` is writable (`published` is read-only). Facts + failure modes in [`references/pre-flight.md`](references/pre-flight.md).
45
+
46
+ 6. **Use `--wait` on async commands.** `ingestions create --wait` and `transformations apply --wait` block to a terminal state, print the dbt/loader error on failure, and exit non-zero — no hand-rolled `apps list` poll loop.
47
+
48
+ 7. **Query field ids come from `query info`, not column names.** `query run`/`percentile` bodies take the hashed `F__<Table>__<Col>__<hash>` ids. Prefer the sugar: `query run <app> --group-by <col> --metric <col>:<fn>` resolves human names for you (fn ∈ `average|count|sum|min|max`).
49
+
50
+ 8. **Develop on `dev` with a data subset; publish the full dataset.** The `dev` stage is for iterating on the mapping and transformations — keep it fast by loading a **small representative subset** of the data. Once the model is right, **publish** so the **published** stage carries the **full** dataset for the dashboards and sharing. Query/transform against `--stage dev`; consumers read the **published dashboards**. Note CLI `query --stage published` is currently unreachable (no `uip pm` path completes a published-stage ingestion) — do CLI querying on `dev` ([`references/lifecycle-and-rbac.md`](references/lifecycle-and-rbac.md)).
51
+
52
+ 9. **RBAC is folder/role-based at the platform layer, not the process app itself.** A process app lives in a folder; who can view vs. edit vs. publish is governed by Orchestrator/Identity roles and folder assignments — configure it with [`uipath-admin`](/uipath:uipath-admin) (roles, role assignments, effective-access) and [`uipath-platform`](/uipath:uipath-platform) (folders). See [`references/lifecycle-and-rbac.md`](references/lifecycle-and-rbac.md). `uip pm` itself does not grant access.
53
+
54
+ 10. **Edit a field's data kind / calculated fields with `apps model fields` — and a data-kind mismatch can lock the app open.** Change a field's kind (e.g. numeric→duration), rename it, or add a calculated field with `uip pm apps model fields set <app> <field> [--kind|--display-name|--expression]` (the **semantic** model; dev-only, and **no `--etag`** — it merges into the version it just read, so a lost race is fixed by re-running it; a whole-document `apps model update` does require `--etag`). Relational/arithmetic operators require both operands to share a data kind, so flipping a field to `duration` while a metric / calculated field / dashboard filter still compares it to a `numeric` constant persists an invalid model that throws at dashboard open — the *"Must be duration, not numeric, for the 'lt' input"* lockout (DNA-46960), which leaves only the data-upload module reachable. `fields set`/`update` validate and refuse such an edit with a hint; fix an already-broken app by making the comparison consistent (re-type the field or the constant). Full surface + the data-kind rule in [`references/model-editing.md`](references/model-editing.md).
55
+
56
+ ## Quick Start
57
+
58
+ The end-to-end CSV → queryable-app command sequence (discover template → create →
59
+ upload → ingest → patch transform / fix mapping → query) is in
60
+ [`references/uip-pm-cli.md`](references/uip-pm-cli.md#quick-start--csv--queryable-process-app).
61
+
62
+ ## Extending the model with custom analysis
63
+
64
+ The killer use case is your own SQL. Add analytical dbt models with `transformations create <path> --file` (use `update` for existing files; inline intermediates as CTEs if you prefer fewer files), then **register each queryable output as a Case-linked data-model table + re-ingest (Rule 1)** so `query` can read it. Full recipe + the DataModelDto entry shape (`type`/`name`/`primaryKey`/`foreignKeys`) and the Tags/Due_dates decision table in [`references/data-model.md`](references/data-model.md); the transformation dev loop and dbt/pm_utils notes in [`references/transformations.md`](references/transformations.md); the query AST and sugar in [`references/querying.md`](references/querying.md).
65
+
66
+ ## Reference Navigation
67
+
68
+ Two layers: the **`uip pm` CLI** reference (how to drive the tool) and the
69
+ **process-mining domain** references (what to build and why). Start with a domain
70
+ reference for the decision; drop into the CLI reference for the mechanics it uses.
71
+
72
+ | File | Read when |
73
+ |------|-----------|
74
+ | [`references/uip-pm-cli.md`](references/uip-pm-cli.md) | **CLI mechanics (low-level)** — the command-group map, the `Result`/`Code`/`Data` envelope + exit codes, the ETag get-modify-put pattern, `--wait`, `--stage`, `IngestionNeeded`, field-id discovery, and the CSV→queryable-app Quick Start |
75
+ | [`references/app-types.md`](references/app-types.md) | choosing/targeting a template — custom vs source-system, why the pipeline is the same for all, what the mapping/extract must contain per family |
76
+ | [`references/pre-flight.md`](references/pre-flight.md) | before any upload — encoding/delimiter/date-format/empty-row checks and the minimal `mapping.json` recipe; **also** the post-create mapping fix loop (`apps data-mapping get`/`update`) and its failure modes |
77
+ | [`references/transformations.md`](references/transformations.md) | authoring/fixing dbt models — the `Cases.sql` patch, apply-vs-run, pm_utils macros, Snowflake identifier quoting |
78
+ | [`references/data-model.md`](references/data-model.md) | exposing a custom table to `query`/dashboards — the case-centric add-table pattern (DataModelDto + re-ingest) and the Tags/Due_dates decision table |
79
+ | [`references/model-editing.md`](references/model-editing.md) | editing the app model — a field's **data kind** (e.g. numeric→duration), calculated fields, the two models (semantic `apps model` vs structural `apps data-model`), and the data-kind comparison rule that locks an app open (DNA-46960) |
80
+ | [`references/querying.md`](references/querying.md) | pulling numbers out — the aggregate body AST, the `--group-by/--metric` sugar, the `AggregationFunction` enum, and the event-table restriction |
81
+ | [`references/lifecycle-and-rbac.md`](references/lifecycle-and-rbac.md) | dev vs published stages, publishing, and where process-app RBAC is configured |
82
+
83
+ ## Anti-patterns — what NOT to do
84
+
85
+ - **Repurposing `Tags.sql`/`Due_dates.sql`** to smuggle an *unrelated* analytics table through a pre-registered entity. Fine — intended, even — to populate them with their real semantics (per-case labels; per-case SLAs); wrong to jam a weekly aggregate into `Due_dates` to dodge add-table. It corrupts those features and fights their primary key. Register a real Case-linked table instead (Rule 1).
86
+ - **Adding a data-model table with no link to `Cases`** — it registers but every query fails `UserError_TableIsDeleted`. Give a standalone table a surrogate PK + nullable `Case_ID` FK to `Cases` (Rule 1).
87
+ - **Forgetting to re-ingest after `add-table`.** The data-model edit is inert until the next `ingestions create` re-materializes the tables (Rule 1).
88
+ - **Re-uploading + re-ingesting after a transform-only failure.** The data is loaded; fix the SQL and `transformations apply`. Re-ingest only when raw data or parse settings change (Rule 4).
89
+ - **Deleting and recreating an app to fix a mapping mistake** (or telling the user that's the only option). The mapping is editable after creation — `apps data-mapping get`/`update` (Rule 5). Recreating also throws away the transformations you already patched.
90
+ - **`transformations apply` after a mapping change.** `apply` only re-runs SQL over *already-parsed* data; a new mapping changes how the raw file is parsed, so it needs `ingestions create` (Rule 5). This is the mirror of Rule 4 — get the direction wrong and the edit silently appears to do nothing.
91
+ - **Re-`get`ting a resource just to harvest a fresh `--etag` for a rejected write.** That defeats the `If-Match` guard — it makes the precondition pass no matter who wrote in between, silently overwriting them. A 409/412 means the resource moved: re-`get` the latest **document**, re-apply your change on top of *that*, then write with the ETag that read returned. Never pair a stale local file with a freshly fetched ETag ([`references/uip-pm-cli.md`](references/uip-pm-cli.md)).
92
+ - **Hand-rolling an `apps list` poll loop.** Use `--wait` on `ingestions create` / `transformations apply` (Rule 6).
93
+ - **Passing column names in a raw `query run` body**, or hand-writing the aggregate AST. Bodies take hashed field ids from `query info`; use the `--group-by/--metric` sugar (Rule 7).
94
+ - **Patching `Cases.sql` on a source-system template.** That gotcha is `uipath.custom`-only; source templates ship correct transformations — feed the expected extract and extend, don't rewrite (Rule 3).
95
+ - **Using a source template for a single flat log** (or `uipath.custom` for a full multi-table extract). Match the template to the data shape (Rule 2).
96
+ - **Iterating on the full dataset.** Develop on `dev` with a small subset; publish the full data (Rule 8).
97
+ - **Changing a field's data kind while a comparison still uses the old kind.** Flipping a field to `duration` (or any kind) while a metric / calculated field / dashboard filter compares it to a constant of the old kind persists an invalid model that locks the app open (Rule 10). Reconcile the comparison first — re-type the field or the constant.
@@ -0,0 +1,66 @@
1
+ # App types — the pipeline is template-agnostic
2
+
3
+ Everything in this skill — data mapping, `files upload`, `ingestions create`,
4
+ the `transformations` (ELT) layer, the data model + **add-table**, dev/published
5
+ stages, and `query` — works for **every** app type, not just `uipath.custom`.
6
+ What changes between templates is only **what the data mapping / extract must
7
+ contain**. The machinery around it is identical.
8
+
9
+ ## The two families
10
+
11
+ | Family | Examples | What you feed it |
12
+ |--------|----------|------------------|
13
+ | **Custom event log** | `uipath.custom` ("Event log") | ONE flat log you build: Case_ID, Activity, Event_end (+ attributes). You construct the event log. |
14
+ | **Source-system templates** | `uipath.p2p.sap`, `uipath.o2c.oraclecloud`, `uipath.im.servicenow`, `uipath.im.salesforce`, `uipath.ap.sap`, `uipath.q2c.netsuite`, … (P2P / O2C / IM / AP / Q2C / … across SAP, Oracle EBS/JDE/Cloud, NetSuite, ServiceNow, Salesforce, Coupa, Ariba) | The source system's **full multi-table extract**, mapped to the template's expected input tables. The template already contains the extraction + event-log construction as dbt models. |
15
+
16
+ Discover the full list per tenant:
17
+
18
+ ```bash
19
+ uip pm app-types list --output-filter "[].{Key:AppTypeKey,Version:Version,Name:DefaultName}"
20
+ ```
21
+
22
+ ## Same model shape everywhere
23
+
24
+ Every template's `model` has the same top-level shape — `Processes`, `Metrics`,
25
+ **`Tables`**, `Automations`, `DefaultObject` — only the contents differ. The
26
+ semantic entities (`model.Tables[]`) are template-specific: `uipath.custom` ships
27
+ `Cases`/`Event_log`/`Tags`/`Due_dates`; `uipath.im.servicenow` ships
28
+ `Incidents`/`Tags`/`Due_dates`/`__Incident_process_Events`; a P2P template ships
29
+ its purchase-order entities. Inspect a template's model + metrics with:
30
+
31
+ ```bash
32
+ uip pm app-types get <key> <version>
33
+ ```
34
+
35
+ Because the shape is uniform, **the data-model rules generalize**: `query info`
36
+ exposes whatever is in `Tables[]`, and you expose a custom analytical table on
37
+ **any** app type by adding a `Tables[]` entry (see [`data-model.md`](data-model.md)) —
38
+ add-table is not custom-only.
39
+
40
+ ## Choosing and targeting a template
41
+
42
+ 1. **Pick the template.** A single denormalized event log ⇒ `uipath.custom`.
43
+ Otherwise pick the `<process>.<system>` template that matches your source
44
+ system AND process (e.g. Purchase-to-Pay on SAP ⇒ `uipath.p2p.sap`). Use a
45
+ source template only when you actually have that system's expected multi-table
46
+ extract — not a single log you happened to export from it.
47
+ 2. **Learn the expected input.** For a source template, the expected **input
48
+ tables** (what your extract must provide) are defined by the template's
49
+ transformation layer, not the `model` object. Create the app, then read the
50
+ generated sources with `transformations list`/`get` (look at
51
+ `models/schema/sources.yml`), or follow the template's extractor docs. Build
52
+ the `--data-mapping` to match those input tables + fields.
53
+ 3. **Everything else is identical.** `files upload --input-table <name>` per
54
+ table, `ingestions create --wait`, fix transforms with `apply` (not re-ingest),
55
+ extend with custom models + add-table, develop on `dev` (subset) and publish
56
+ the full dataset, and `query` with the `--group-by/--metric` sugar.
57
+
58
+ ## What is template-specific
59
+
60
+ - **The `Cases.sql` optional-column gotcha** ([`transformations.md`](transformations.md))
61
+ is a **`uipath.custom`** issue. Source templates ship their own (already-correct)
62
+ transformations — you don't patch their event-log construction; you feed the
63
+ expected extract and, if needed, **extend** with extra models + data-model tables.
64
+ - The set of shipped `Metrics` and semantic entities differs per template — always
65
+ `query info` (on a built app) or `app-types get` (on the template) to see what's
66
+ available before writing query bodies.
@@ -0,0 +1,130 @@
1
+ # Data model — making tables queryable (the add-table pattern)
2
+
3
+ Process Mining is **case-centric**. A table is queryable only if it is the **Cases**
4
+ root or reaches `Cases` through a foreign key. A standalone dbt model with no link
5
+ to `Cases` is treated as disconnected and rejected at query time
6
+ (`UserError_TableIsDeleted`).
7
+
8
+ ## Two models — do not confuse them
9
+
10
+ | Model | Endpoint | Shape | Role |
11
+ |-------|----------|-------|------|
12
+ | **Data model** (structural) | `/apps/{id}/{stage}/dataModel` | `tables[]` of `{ type, name, primaryKey, foreignKeys }` | What tables exist + how they link. **`apps data-model add-table` edits this; `apps data-model get` reads it.** |
13
+ | **Semantic model** | `/apps/{id}/{stage}/model` | `Processes` / `Metrics` / `Tables[].Fields[]` | Field-level view `query info` (and `apps model get`) reads; edited by `apps model fields …` ([`model-editing.md`](model-editing.md)). `applyCurrentDatamodel` **reconciles** structural changes into it, preserving your semantic edits (calculated fields, metrics, data-kind overrides) — so add-table won't wipe them; just don't hand-author its per-column fields, edit the structural model. |
14
+
15
+ Edit the structural data model; `applyCurrentDatamodel` regenerates the semantic
16
+ model (its per-column fields) from it. `add-table` does both.
17
+
18
+ ## The built-in Case-child tables — use these before adding your own
19
+
20
+ The `uipath.custom` template ships four data-model tables. Two are the process
21
+ backbone; two are ready-made Case-child extension slots. **Check whether your data
22
+ fits Tags or Due_dates before hand-rolling a custom table** — they exist to save you
23
+ the add-table round-trip.
24
+
25
+ | Table | PK / link | Fields | Use it for |
26
+ |-------|-----------|--------|------------|
27
+ | **Cases** | `Case_ID` (root) | case attributes | One row per process instance (the case). The root everything links to. |
28
+ | **Event_log** | FK→Cases | activity, timestamp, resource… | The event log — one row per activity. The process itself. Not directly group-by-able (it drives the process graph). |
29
+ | **Tags** | `Tag_ID`, FK→Cases | `Tag` (label), `Tag_type` (category) | **Multi-valued categorical labels per case.** A case can carry many tags. Use for flags/segments/attributes that don't fit one Case column — e.g. `Tag_type="Region", Tag="EU"`; `Tag_type="Flag", Tag="Escalated"`. Filter/group cases by tag. |
30
+ | **Due_dates** | `Due_date_ID`, FK→Cases | `Due_date`/`Due_date_type` (which deadline), `Expected_date`, `Actual_date`, `On_time` (bool), `Cost` (currency), `Difference` (duration) | **Per-case SLA / deadline / milestone tracking.** A case can have many due dates (multiple SLAs/milestones). Use for on-time %, SLA-breach counts, cost-of-breach, expected-vs-actual gaps. |
31
+
32
+ Both `Tags` and `Due_dates` are themselves Case-child tables (FK→`Cases`) — they are
33
+ the template's built-in example of the loose-link pattern below. Populate them by
34
+ authoring their dbt models (`Tags.sql` / `Due_dates.sql`) to emit real rows keyed on
35
+ `Case_ID`. This is the **intended** use — distinct from the anti-pattern of
36
+ repurposing them to smuggle unrelated analytics through (see Anti-patterns).
37
+
38
+ **Decision:**
39
+ - Per-case label / category, possibly many per case → **Tags**.
40
+ - Per-case deadline / SLA / milestone with target vs actual → **Due_dates**.
41
+ - Per-case fact that fits one column → add a column to `Cases` (via `Event_log`).
42
+ - Anything not one-row-per-case (a weekly aggregate, a cross-case study) → a **custom
43
+ Case-child table** via `add-table` (loose-linked; below).
44
+
45
+ ## Why a bare dbt model is not queryable
46
+
47
+ `transformations create models/Workload_weekly.sql` builds a physical Snowflake
48
+ table, but `query info` will not list it and `query run` cannot group by it. Two
49
+ gates:
50
+
51
+ 1. **Not in the data model.** dbt produces tables; the data model decides which
52
+ become queryable entities. Register it (`add-table`).
53
+ 2. **Not linked to Cases.** Even once registered, a table with no path to `Cases` is
54
+ disconnected → `UserError_TableIsDeleted`. Give it a foreign key to `Cases`.
55
+
56
+ And one timing gate: `existingTables` (what the query layer treats as "live") is
57
+ derived from the **last successful ingestion's** materialization — so a data-model
58
+ edit only takes effect after a **re-ingest**.
59
+
60
+ ## The data-model table entry (DataModelDto)
61
+
62
+ ```json
63
+ {
64
+ "type": "Object",
65
+ "name": "Workload_weekly",
66
+ "primaryKey": "Workload_ID",
67
+ "foreignKeys": [{ "table": "Cases", "column": "Case_ID" }]
68
+ }
69
+ ```
70
+
71
+ | Key | Meaning |
72
+ |-----|---------|
73
+ | `type` | `"Object"` (default if omitted). |
74
+ | `name` | MUST equal the dbt model / physical table name. |
75
+ | `primaryKey` | A column that uniquely identifies a row — add a surrogate (`{{ pm_utils.id() }}`) if the table has none. |
76
+ | `foreignKeys` | `[{ table, column }]` links to a parent. For a standalone analytical table, link **loosely** to `Cases` on a nullable `Case_ID` column. |
77
+
78
+ Per-column display/kind is derived by `applyCurrentDatamodel` — you do **not**
79
+ hand-author a `Fields[]` array.
80
+
81
+ ## Loose-link recipe: expose a custom analytical table
82
+
83
+ The table isn't one-row-per-case, but must still reach `Cases`. Give it a **surrogate
84
+ PK** and a **nullable `Case_ID`** carrying the FK — a null FK is enough to satisfy the
85
+ case-centric graph; aggregate queries don't need it to resolve to real cases.
86
+
87
+ **Caveat — a null `Case_ID` makes the table analytically disconnected.** Case-level
88
+ filters/selections (how PM dashboards normally scope data) won't propagate to it, and
89
+ it can't be joined back to real cases. Use the null-FK loose link **only** for a
90
+ genuinely case-independent aggregate (a weekly total, a cross-case study). If its rows
91
+ *do* correspond to real cases, populate `Case_ID` with the real key so case filtering
92
+ flows through.
93
+
94
+ 1. Author the dbt model. First two selected columns:
95
+
96
+ ```sql
97
+ select
98
+ {{ pm_utils.id() }} as "Workload_ID", -- surrogate PK
99
+ cast(null as varchar) as "Case_ID", -- loose FK to Cases
100
+ ... -- your real columns
101
+ ```
102
+
103
+ 2. Build, register, **re-ingest**, query:
104
+
105
+ ```bash
106
+ uip pm transformations create <app> models/Workload_weekly.sql --file ./Workload_weekly.sql
107
+ uip pm transformations apply <app> --wait
108
+ uip pm apps data-model add-table <app> --file ./Workload_weekly.table.json # edits /dev/dataModel + applyCurrentDatamodel
109
+ uip pm ingestions create <app> --wait # REQUIRED — materializes the table
110
+ uip pm query run <app> --group-by Service_Component --metric Closed_Interactions:sum --output table
111
+ ```
112
+
113
+ Where `Workload_weekly.table.json` is the DataModelDto entry above.
114
+
115
+ `add-table` GETs `/dev/dataModel` (with its ETag), **upserts** the table by name
116
+ (replace if present, else append), PUTs it back `If-Match`-guarded, then POSTs
117
+ `applyCurrentDatamodel`. Because it merges into exactly the document it just read,
118
+ that ETag is a genuine compare-and-swap — so **`add-table` takes no `--etag`**, unlike
119
+ `data-mapping update` / `model update` / `transformations update`, which replace a file
120
+ you edited locally and therefore require it. A concurrent edit surfaces as `412`; **just
121
+ re-run** — `add-table` re-reads and re-applies on top of the other write. (A data model
122
+ returned without an ETag fails the command rather than writing unguarded.) It returns
123
+ `IngestionNeeded: true` — the entity is not queryable until the re-ingest completes.
124
+
125
+ ## Publish vs re-ingest
126
+
127
+ - **Re-ingest** (`ingestions create`) materializes the table so **dev** `query` sees
128
+ it. Required for add-table.
129
+ - **Publish** (`apps publish`) pushes dev changes to the **dashboards / published**
130
+ stage. Separate step; not needed just to query in dev.
@@ -0,0 +1,67 @@
1
+ # Stages (dev vs published) & RBAC
2
+
3
+ ## The two stages
4
+
5
+ A process app has two stages, selected by `--stage` on data / transformation /
6
+ query commands (default `dev`):
7
+
8
+ - **`dev`** — the development stage. Iterate on the data mapping and the dbt
9
+ transformations here. **Keep it fast by loading a small, representative subset**
10
+ of the data: ingest a sample, get the mapping + `Cases.sql` + your custom models
11
+ and data-model tables right, verify with `query`, then move on. Short feedback
12
+ loops matter — a full re-transform on a large dataset is slow.
13
+ - **`published`** — the stage consumers use through the **dashboards / shared UI**,
14
+ carrying the **full dataset**. `apps publish` promotes the definition here.
15
+
16
+ Typical loop: develop and validate on `--stage dev` with a subset → publish → let
17
+ consumers read the **dashboards** on the published data.
18
+
19
+ > **CLI caveat:** `uip pm query --stage published` is currently **not reachable** —
20
+ > `/query/{id}/published` needs a completed ingestion on that stage and no `uip pm`
21
+ > path produces one (`apps publish` answers `IngestionNeeded: true`, but a following
22
+ > `ingestions create --wait` still leaves published querying at
23
+ > `UserError_InvalidOrNoIngestion`; verified against a live tenant). So publishing
24
+ > promotes the app to the **dashboards**, but **CLI-driven `query` stays on `dev`**.
25
+
26
+ ## Publishing
27
+
28
+ **`uip pm apps publish <app-id>`** promotes the validated dev app (mapping +
29
+ transformations + data model) to the published stage, so dashboards and the query
30
+ layer see it.
31
+
32
+ The command reads the app's current model version off the data-model ETag and
33
+ sends it as the publish precondition, so a stale caller fails instead of
34
+ clobbering a newer model. The result envelope carries:
35
+
36
+ - **`Changes`** — what the publish moved.
37
+ - **`IngestionNeeded`** — when `true`, the published stage still needs a
38
+ re-ingestion before the change reaches the **data**. Dev transformation *or*
39
+ data-model changes (including `apps data-model add-table`) only become queryable
40
+ after a re-ingest; publishing alone promotes the definition, not the rows.
41
+
42
+ So the full promote loop is: validate on `dev` → `uip pm apps publish <app>` →
43
+ `uip pm ingestions create <app> --wait` when `IngestionNeeded` → analyse on
44
+ `--stage published`.
45
+
46
+ ## RBAC — configured at the platform layer, not in `uip pm`
47
+
48
+ Access to a process app is **not** granted by `uip pm`. A process app lives in a
49
+ **folder**, and who can see / edit / publish it is governed by Orchestrator +
50
+ Identity **roles and folder assignments**:
51
+
52
+ - **Roles & assignments** — create/inspect roles and assign them to users/groups,
53
+ and check effective access, with [`uipath-admin`](/uipath:uipath-admin)
54
+ (Identity Server, Authorization, check-access PDP).
55
+ - **Folders** — organize apps and scope access with folders via
56
+ [`uipath-platform`](/uipath:uipath-platform).
57
+
58
+ Quick guidance:
59
+
60
+ 1. Put the process app in a dedicated folder for the audience that should see it.
61
+ 2. Assign a **view** role to consumers (they read published dashboards / run
62
+ `query --stage published`) and an **edit/publish** role to the small team that
63
+ maintains the mapping and transformations.
64
+ 3. Verify with an effective-access / check-access query before sharing.
65
+
66
+ Keep least privilege: most users need view on published only; editing dev
67
+ transformations is a maintainer capability.
@@ -0,0 +1,112 @@
1
+ # Editing the Process Mining app model
2
+
3
+ There are **two** models behind a process app. Editing the wrong one is the most common source
4
+ of confusion, so be precise about which you mean.
5
+
6
+ | | `apps model` (semantic) | `apps data-model` (structural) |
7
+ | --- | --- | --- |
8
+ | Endpoint | `/apps/{id}/{stage}/model` | `/apps/{id}/{stage}/dataModel` |
9
+ | Contains | `data` → tables → **fields with their `kind`** (data kind), **calculated fields**, **metrics**; plus `view` → dashboards, charts, `metricFilters` | Tables with `primaryKey`/`foreignKeys` and the process-mining **role columns** (`activityColumn`, `endColumn`, …) |
10
+ | Think of it as | "the app definition" the user sees and edits | "the table plumbing" — which tables exist and how they join to `Cases` |
11
+ | Edited by | `fields set/remove`, `update`; the data manager & dashboard editor | `add-table`; the data-model editor |
12
+
13
+ `query info` shows the resolved *query* model (field ids, physical `ColumnDataType`, metrics) — useful
14
+ to discover the exact field ids to pass to `fields set` and `query`.
15
+
16
+ ## Field editing surface
17
+
18
+ ```bash
19
+ uip pm apps model fields list <app-id> [--stage dev|published]
20
+ uip pm apps model fields set <app-id> <field-id> [--kind <k>] [--display-name <t>] [--expression <json|@file>] [--table <table-id>]
21
+ uip pm apps model fields remove <app-id> <field-id>
22
+ ```
23
+
24
+ - **Upsert semantics.** If `<field-id>` exists, its `--kind` / `--display-name` are updated, and
25
+ passing `--expression` turns it into (or updates) a **calculated field**. If it does not exist, a
26
+ new **calculated field** is created in `--table` — so `--table` + `--expression` (+ `--kind`) are
27
+ required to create. Mapped *column* fields can't be created through the model; they come from the
28
+ ingested data.
29
+ - **Data kinds you can set (`--kind`):** `ordinal, nominal, numeric, datetime, boolean, percentage, currency, duration`
30
+ — the union of the data manager's field-type options (FE `ColumnDataTypeFieldCompatibilityMap`).
31
+ `duration`, `currency`, `percentage` are **user choices stored in the model `kind`** (a number column
32
+ defaults to `numeric` — the user upgrades it). `id` and `ref` are **structural** (system-assigned to
33
+ key/reference columns) and not settable, though `fields list` may report a field that already has them.
34
+ - **Expressions** are JSON expression-node trees, the same shape the app model stores. A comparison:
35
+ ```json
36
+ {"type":"operator","operation":"lt",
37
+ "left": {"type":"reference","referenceType":"field","reference":"<field-id>"},
38
+ "right": {"type":"constant","dataType":"duration","value":86400000}}
39
+ ```
40
+ Operators: `lt le gt ge eq ne and or add subtract multiply divide percentage`. Constant
41
+ `dataType` **must match** the data kind of what it's compared to (see below). Reference a field
42
+ with `{type:"reference","referenceType":"field","reference":"<field-id>"}`.
43
+
44
+ Every edit is `If-Match`-guarded and applies on `dev`, returning the new edit `Versions` — but the two
45
+ routes differ in who supplies the ETag:
46
+
47
+ - **`fields set` / `fields remove` take no `--etag`.** They read the model and merge your change into
48
+ exactly that version, so the read's own ETag is a real compare-and-swap. On a lost race, **just
49
+ re-run** — they re-read and re-apply. (They refuse to write at all if the read came back without an
50
+ ETag, rather than writing unguarded.)
51
+ - **`apps model update` REQUIRES `--etag`** — it replaces a document you edited locally, so it must
52
+ carry the `Data.ETag` that `apps model get` returned. On 409/412, re-`get` for the latest model
53
+ **and its new ETag**, re-apply your change on top, then update again with the new `--etag`.
54
+
55
+ ```bash
56
+ uip pm apps model get <app> --destination model.json # prints Data.ETag
57
+ uip pm apps model update <app> --file model.json --etag 'W/"3"'
58
+ ```
59
+
60
+ Prefer `fields set` for a targeted change: no ETag to thread, and it can't clobber unrelated parts of
61
+ the model. After editing, `publish` to reach the dashboards, and re-ingest if a data kind changed.
62
+
63
+ ## The data-kind rule
64
+
65
+ Relational/arithmetic operators require their operands to share a data kind (backend
66
+ `OperatorRelationalOrdering` / `CheckFunctionArguments`). So a comparison like `field < constant` is
67
+ only valid when the constant's `dataType` equals the field's `kind`. If they differ the model fails
68
+ validation with:
69
+
70
+ ```
71
+ UserError_UnsupportedOperatorArgumentDataKind
72
+ { argument:"right", operation:"lt", actual:"numeric", expected:"duration" }
73
+ → "Must be duration, not numeric, for the 'lt' input."
74
+ ```
75
+
76
+ The `fields set` / `update` commands **run this validation synchronously** and refuse an edit that
77
+ would create the mismatch, surfacing a hint that names the conflicting comparison. So via the CLI you
78
+ cannot flip a field to `duration` while a calculated field / metric compares it to a numeric constant —
79
+ update or remove that comparison first, or make the constant a `duration`. This synchronous check is
80
+ exactly what the **data-manager UI does not do** (it defers the kind change to the next re-ingestion —
81
+ the footgun below), so `fields set` is the *safe* way to change a kind. Caveat: the check covers
82
+ comparisons in the typed model `data` (calculated fields, metrics); a kind change that conflicts only
83
+ with an opaque dashboard **view** filter/chart is not caught, so publish and re-open to confirm.
84
+
85
+ ## The data-kind footgun (DNA-46960)
86
+
87
+ A customer's app failed to open with exactly the error above. Root cause, from their exported app:
88
+ a metric **`% Tijdigheid`** was `PERCENTAGE( DOORLOOPTIJD[duration] lt 864000000[numeric] )` — a
89
+ throughput-time field (kind **duration**) compared to a **numeric** constant (10 days in ms). That
90
+ `lt(duration, numeric)` is evaluated when the query model is built at open, so it blocks every
91
+ dashboard (the data-upload module stays reachable — hence "I can only reach the data upload module").
92
+
93
+ How an app reaches this state via the **data-manager UI** (not the CLI, which validates synchronously):
94
+
95
+ 1. Field is **numeric**; a metric/calculated field compares it to a numeric constant → valid.
96
+ 2. The field's type is changed to **duration** in the *data manager*. This is applied in a
97
+ **deferred** way — it is not written to the app model synchronously; it is baked in when the app
98
+ model is regenerated at the **next re-ingestion**.
99
+ 3. On re-ingest the field becomes `duration`, so the pre-existing comparison is now
100
+ `lt(duration, numeric)` — and the ingestion-time regeneration does **not** re-run the edit
101
+ validation, so the now-invalid model is persisted → the app won't open.
102
+
103
+ Takeaways when working with an app in this state:
104
+ - To reproduce/inspect: `apps model get` / `fields list` shows the field `kind` and the offending
105
+ calculated field/metric; the mismatch is a comparison whose constant `dataType` ≠ the field `kind`.
106
+ - **Range filters do not trigger it** — filters on a field go through a coercing path, so a numeric
107
+ range filter on a now-duration field still opens. Only real expressions (calculated fields, metrics)
108
+ hit the operator data-kind check.
109
+ - The fix for a broken app is to make the comparison consistent: either revert the field to the kind
110
+ the constant expects, or re-type the constant to match the field (e.g. a `duration` constant).
111
+ - Import (`.pmapp`) does not re-run this expression validation (exports are trusted), so importing a
112
+ broken app reproduces the broken state; that is expected and not the bug.
@@ -0,0 +1,119 @@
1
+ # Pre-flight data checks + the minimal data mapping
2
+
3
+ Cheap local checks before any upload — each one saves a multi-minute ingest
4
+ round-trip.
5
+
6
+ ## Inspect the file first
7
+
8
+ 1. **Encoding / BOM** — non-UTF-8 (Windows-1252 / ISO-8859-1) must be declared via
9
+ `ingestions create --encoding` (or the mapping's `SourceSettings.Encoding`), or
10
+ the load mangles/fails.
11
+ 2. **Delimiter + field regularity** — stream the file and assert every line splits
12
+ into the same field count (catches embedded-delimiter / quoting issues). CSVs
13
+ here are often `;`-delimited.
14
+ 3. **Junk rows** — strip fully-empty trailing rows (`;;;;…`). Combined with a
15
+ NotNull-error on the key column they cause the whole table to
16
+ `Failed to load datasources`.
17
+ 4. **Date format** — inspect token ranges to tell `dd-mm` from `mm-dd` (token1 max
18
+ > 12 ⇒ day-first). Feeds `DateTimeFormatString`. Formats vary **per file** in
19
+ the same dataset — check each.
20
+ 5. **Cardinality** — distinct case ids and activities, to sanity-check the mapping.
21
+
22
+ ## Minimal `mapping.json`
23
+
24
+ ```json
25
+ { "Tables": [ {
26
+ "SourceName": "Event_log", "TargetName": "Event_log", "Source": "blob",
27
+ "SourceSettings": { "Encoding": "utf-8", "FieldDelimiter": ";", "QuoteCharacter": "\"" },
28
+ "IsMandatory": true, "ValidationType": "specificationOnly",
29
+ "Fields": [
30
+ { "DataType": "text", "SourceName": "Incident ID", "TargetName": "Case_ID", "IsMandatory": true, "ValidationType": "specificationOnly" },
31
+ { "DataType": "text", "SourceName": "IncidentActivity_Type","TargetName": "Activity", "IsMandatory": true, "ValidationType": "specificationOnly" },
32
+ { "DataType": "datetime", "DataTypeSettings": { "DateTimeFormatString": "dd-mm-yyyy hh:mm:ss" },
33
+ "SourceName": "DateStamp", "TargetName": "Event_end", "IsMandatory": true, "ValidationType": "specificationOnly" }
34
+ ] } ] }
35
+ ```
36
+
37
+ Rules:
38
+
39
+ - Core `uipath.custom` event-log targets: **`Case_ID`**, **`Activity`**,
40
+ **`Event_end`** (datetime). Optional: `Event_start`, `User`.
41
+ - `DateTimeFormatString` is lowercase, non-strftime: `dd-mm-yyyy hh:mm:ss`
42
+ (`.nnn` for milliseconds).
43
+ - **`IsNotNull` / `IsUnique` now default** per field (the CLI fills
44
+ `{ Enabled: false, Severity: "warning" }` when omitted) — you no longer need to
45
+ hand-write them on every field. `data-mapping update` applies the same defaults,
46
+ so one mapping file works in both commands. Set them explicitly
47
+ (`{ Enabled: true, Severity: "error" }`) on `Case_ID`/`Activity`/`Event_end` when
48
+ you want a null there to fail the load rather than warn.
49
+ - **Map risky columns as `text` and parse in SQL** (dates with odd formats,
50
+ decimal-comma numbers). Only `Event_end` must be a real `datetime`. Unmapped
51
+ columns still load under their raw source names and are usable as attributes.
52
+ - **Multi-table apps**: add more `Tables[]` entries (Incidents, Interactions,
53
+ Changes, …). All load; the template models only reference `Event_log`; your
54
+ custom models `source('sources', '<Table>')` the rest and join on a shared key.
55
+
56
+ ## Fixing the mapping after the app exists
57
+
58
+ A mapping mistake is **not** a reason to delete the app and start over. `apps
59
+ data-mapping` reads and replaces the mapping of an existing app:
60
+
61
+ ```bash
62
+ uip pm apps data-mapping get <app> --destination ./mapping.json # download the mapping + note Data.ETag
63
+ # ...edit: fix the DateTimeFormatString, move a column to the right TargetName, map one more column...
64
+ uip pm apps data-mapping update <app> --file ./mapping.json --etag 'W/"639…"' # --etag REQUIRED
65
+ uip pm files upload <app> ./data.csv --input-table Event_log # ONLY if the source columns changed
66
+ uip pm ingestions create <app> --wait # the mapping applies to the NEXT ingestion
67
+ ```
68
+
69
+ `get` without `--destination` inlines the mapping in the envelope as `Data.Mapping`
70
+ (useful with `--output-filter`, e.g.
71
+ `--output-filter "Mapping.Tables[0].Fields[].{Src:SourceName,Tgt:TargetName}"`).
72
+
73
+ Facts worth not re-learning:
74
+
75
+ - **A mapping change needs a re-ingest, not `transformations apply`.** `apply`
76
+ re-runs SQL over already-parsed data; the mapping governs *parsing*. Editing the
77
+ mapping and then running `apply` looks successful and changes nothing.
78
+ - **`dev` only.** The backend allows `PUT` on the dev stage; `published` is
79
+ read-only, and the CLI restricts `update --stage` to `dev` up front.
80
+ - **`--etag` is REQUIRED on `update`, and it must be the one *your* `get` returned.**
81
+ You edited the file locally, so only that ETag proves the edit was based on the
82
+ version you read; the CLI deliberately does not fetch a fresh one before the `PUT`
83
+ (which would make the `If-Match` pass no matter who wrote in between). A concurrent
84
+ edit (someone in the UI's mapping editor) is therefore rejected `409
85
+ UserError_ETagFileConflict` — recover by re-running `get` for the latest version
86
+ **and its new ETag**, re-applying your change on top of that, then updating with the
87
+ new `--etag`. Re-running the same `update` unchanged just fails again.
88
+ - `update` reports `Tables` (the mapped table names) and `IngestionNeeded: true`, not
89
+ an ETag; to confirm a write landed, `get` again and diff — the `get` ETag is a
90
+ **content checksum**, so re-pushing an identical mapping leaves it unchanged.
91
+ - **A table-less mapping is refused locally.** `{ "Tables": [] }` (or any file with
92
+ no usable table) fails `No tables found in …` before any API call, so a bad file
93
+ cannot overwrite and wipe the stored mapping.
94
+ - **Either key casing works** — PascalCase (`{"Tables":[…]}`, what the recipe above
95
+ and `apps create --data-mapping` use) and the camelCase the API returns. Note
96
+ `get --destination` writes the API's response **verbatim**, so the downloaded file
97
+ is camelCase (`{"tables":[…]}`) while the envelope's `Data.Mapping` is PascalCased
98
+ like every other envelope — same document, two casings. Either can be fed back to
99
+ `update --file` or to `apps create --data-mapping` on another app.
100
+ - **A structurally invalid mapping fails safe**: `400
101
+ UserError_DatapipelineBadRequest` / `INVALID_DATASOURCE_ARGUMENT`, and the stored
102
+ mapping is left untouched.
103
+ - **An app id you can't see answers `403 UserError_NotAuthorized`, not `404`** —
104
+ don't read that as a permissions problem on the mapping itself; check the id with
105
+ `apps list`.
106
+ - Reading the `published` stage of an app that was **never published** still
107
+ succeeds — you get the *template's* mapping with `ETag: W/"0"` and
108
+ `UseInLoad: false`. Don't mistake it for the app's real mapping.
109
+
110
+ ## Other app types
111
+
112
+ The mapping above targets the `uipath.custom` `Event_log`. For a **source-system
113
+ template** (`uipath.p2p.sap`, `uipath.im.servicenow`, …) the same `mapping.json`
114
+ shape applies, but you map your extract to the **template's expected input
115
+ tables** instead — create the app, then read `models/schema/sources.yml`
116
+ (`transformations get <app> models/schema/sources.yml`) to see the exact input
117
+ tables and columns the template's transformations consume, and match your
118
+ `Tables[]`/`Fields[]` to them. The pre-flight checks (encoding, delimiter, dates,
119
+ empty rows) are the same. See [`app-types.md`](app-types.md).