@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CODEOWNERS +14 -8
- package/README.md +18 -3
- package/assets/skill-status.json +9 -1
- package/assets/uip-catalog-snapshot.json +227 -21
- package/package.json +11 -2
- package/scripts/npm-package-lifecycle.mjs +46 -0
- package/skills/uipath-admin/SKILL.md +5 -1
- package/skills/uipath-admin/references/audit-commands.md +1 -1
- package/skills/uipath-admin/references/audit-workflow-guide.md +9 -0
- package/skills/uipath-agents/SKILL.md +2 -2
- package/skills/uipath-agents/references/lowcode/capabilities/context/index.md +7 -0
- package/skills/uipath-agents/references/lowcode/capabilities/integration-service/integration-service.md +5 -6
- package/skills/uipath-agents/references/lowcode/critical-rules/critical-rules.md +1 -1
- package/skills/uipath-agents/references/lowcode/evaluations/evaluation-sets.md +5 -0
- package/skills/uipath-agents/references/lowcode/project-lifecycle.md +3 -3
- package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +3 -2
- package/skills/uipath-api-workflow/SKILL.md +2 -1
- package/skills/uipath-api-workflow/references/cli-reference.md +3 -3
- package/skills/uipath-coded-apps/SKILL.md +3 -2
- package/skills/uipath-coded-apps/assets/fixtures/governance-dashboard-starter-kit.tar.gz +0 -0
- package/skills/uipath-coded-apps/assets/templates/web-app-template.md +1 -1
- package/skills/uipath-coded-apps/references/create-web-app.md +60 -48
- package/skills/uipath-coded-apps/references/dashboards/CAPABILITY.md +2 -2
- package/skills/uipath-coded-apps/references/dashboards/plugins/build/impl.md +2 -2
- package/skills/uipath-coded-apps/references/dashboards/primitives/tier-resolution.md +16 -16
- package/skills/uipath-coded-apps/references/oauth-scopes.md +28 -272
- package/skills/uipath-coded-apps/references/sdk/action-center.md +26 -243
- package/skills/uipath-coded-apps/references/sdk/agents.md +20 -130
- package/skills/uipath-coded-apps/references/sdk/conversational-agent.md +52 -706
- package/skills/uipath-coded-apps/references/sdk/data-fabric.md +20 -237
- package/skills/uipath-coded-apps/references/sdk/feedback.md +4 -139
- package/skills/uipath-coded-apps/references/sdk/governance-traces.md +7 -55
- package/skills/uipath-coded-apps/references/sdk/governance.md +4 -44
- package/skills/uipath-coded-apps/references/sdk/imports.md +77 -35
- package/skills/uipath-coded-apps/references/sdk/maestro.md +29 -406
- package/skills/uipath-coded-apps/references/sdk/orchestrator.md +30 -324
- package/skills/uipath-coded-apps/references/sdk/pagination.md +9 -67
- package/skills/uipath-coded-apps/references/sdk/traces.md +8 -43
- package/skills/uipath-functions/SKILL.md +23 -23
- package/skills/uipath-governance/SKILL.md +5 -4
- package/skills/uipath-governance/references/cli-cheatsheet.md +2 -1
- package/skills/uipath-governance/references/compliance-pack/coverage/impl.md +143 -58
- package/skills/uipath-governance/references/compliance-pack/restore/impl.md +61 -0
- package/skills/uipath-human-in-the-loop/SKILL.md +4 -2
- package/skills/uipath-insights/SKILL.md +17 -18
- package/skills/uipath-ixp/SKILL.md +12 -7
- package/skills/uipath-ixp/references/cli-reference.md +71 -9
- package/skills/uipath-ixp/references/improve-prompts-guide.md +23 -9
- package/skills/uipath-ixp/references/label-documents-guide.md +33 -5
- package/skills/uipath-maestro-bpmn/SKILL.md +15 -14
- package/skills/uipath-maestro-bpmn/references/cli-conventions.md +15 -6
- package/skills/uipath-maestro-bpmn/references/structural-bpmn.md +18 -17
- package/skills/uipath-maestro-case/SKILL.md +46 -33
- package/skills/uipath-maestro-case/assets/templates/sdd-template.md +77 -37
- package/skills/uipath-maestro-case/assets/templates/sdd-viewer.html +0 -2
- package/skills/uipath-maestro-case/references/bindings-and-expressions.md +3 -1
- package/skills/uipath-maestro-case/references/bindings-v2-sync.md +2 -2
- package/skills/uipath-maestro-case/references/brownfield.md +15 -5
- package/skills/uipath-maestro-case/references/case-commands.md +19 -3
- package/skills/uipath-maestro-case/references/case-editing-operations.md +24 -21
- package/skills/uipath-maestro-case/references/case-schema.md +38 -16
- package/skills/uipath-maestro-case/references/connector-trigger-common.md +15 -8
- package/skills/uipath-maestro-case/references/evals/evals.json +35 -18
- package/skills/uipath-maestro-case/references/implementation.md +86 -71
- package/skills/uipath-maestro-case/references/phase-0-interview.md +92 -23
- package/skills/uipath-maestro-case/references/phased-execution.md +70 -55
- package/skills/uipath-maestro-case/references/placeholder-tasks.md +5 -5
- package/skills/uipath-maestro-case/references/planning.md +57 -9
- package/skills/uipath-maestro-case/references/plugins/case/impl-json.md +7 -5
- package/skills/uipath-maestro-case/references/plugins/case/planning.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/conditions/case-exit-conditions/impl-json.md +5 -5
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/impl-json.md +41 -5
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/planning.md +27 -3
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/impl-json.md +6 -6
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/planning.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/impl-json.md +20 -7
- package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/planning.md +37 -4
- package/skills/uipath-maestro-case/references/plugins/sla/impl-json.md +24 -13
- package/skills/uipath-maestro-case/references/plugins/sla/planning.md +9 -3
- package/skills/uipath-maestro-case/references/plugins/stages/impl-json.md +4 -0
- package/skills/uipath-maestro-case/references/plugins/stages/planning.md +4 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/action/impl-json.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/action/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/agent/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/agent/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/case-management/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/case-management/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/impl-json.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/impl-json.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/create-inline-common.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/process/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/process/planning.md +6 -4
- package/skills/uipath-maestro-case/references/plugins/tasks/rpa/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/rpa/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/impl-json.md +4 -3
- package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/planning.md +4 -0
- package/skills/uipath-maestro-case/references/plugins/triggers/event/impl-json.md +17 -14
- package/skills/uipath-maestro-case/references/plugins/triggers/event/planning.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/triggers/manual/impl-json.md +13 -10
- package/skills/uipath-maestro-case/references/plugins/triggers/timer/impl-json.md +18 -16
- package/skills/uipath-maestro-case/references/plugins/triggers/timer/planning.md +2 -2
- package/skills/uipath-maestro-case/references/plugins/variables/bindings/impl-json.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/variables/global-vars/impl-json.md +11 -9
- package/skills/uipath-maestro-case/references/plugins/variables/io-binding/impl-json.md +6 -2
- package/skills/uipath-maestro-case/references/plugins/variables/io-binding/planning.md +19 -1
- package/skills/uipath-maestro-case/references/registry-discovery.md +3 -3
- package/skills/uipath-maestro-case/references/sdd-generation-rules.md +155 -51
- package/skills/uipath-maestro-case/references/sla-response-shapes.md +74 -0
- package/skills/uipath-maestro-flow/SKILL.md +4 -3
- package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +3 -0
- package/skills/uipath-maestro-flow/references/author/references/editing-operations-json.md +10 -17
- package/skills/uipath-maestro-flow/references/author/references/editing-operations.md +1 -1
- package/skills/uipath-maestro-flow/references/author/references/greenfield.md +8 -6
- package/skills/uipath-maestro-flow/references/author/references/planning-impl.md +1 -1
- package/skills/uipath-maestro-flow/references/author/references/plugins/agent/impl.md +4 -9
- package/skills/uipath-maestro-flow/references/author/references/plugins/agentic-process/impl.md +3 -7
- package/skills/uipath-maestro-flow/references/author/references/plugins/api-workflow/impl.md +5 -8
- package/skills/uipath-maestro-flow/references/author/references/plugins/connector/impl.md +11 -4
- package/skills/uipath-maestro-flow/references/author/references/plugins/flow/impl.md +3 -7
- package/skills/uipath-maestro-flow/references/author/references/plugins/inline-agent/impl.md +14 -17
- package/skills/uipath-maestro-flow/references/author/references/plugins/ixp/impl.md +60 -13
- package/skills/uipath-maestro-flow/references/author/references/plugins/queue/impl.md +2 -14
- package/skills/uipath-maestro-flow/references/author/references/plugins/rpa/impl.md +4 -9
- package/skills/uipath-maestro-flow/references/author/references/plugins/script/impl.md +3 -0
- package/skills/uipath-maestro-flow/references/author/references/plugins/subflow/impl.md +5 -9
- package/skills/uipath-maestro-flow/references/author/references/plugins/transform/impl.md +13 -0
- package/skills/uipath-maestro-flow/references/shared/action-nodes.md +2 -2
- package/skills/uipath-maestro-flow/references/shared/file-format.md +16 -12
- package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +3 -3
- package/skills/uipath-planner/SKILL.md +1 -1
- package/skills/uipath-planner/references/non-pdd-lane-guide.md +1 -1
- package/skills/uipath-platform/SKILL.md +1 -1
- package/skills/uipath-platform/references/data-fabric/bulk-import.md +10 -27
- package/skills/uipath-platform/references/data-fabric/choice-sets.md +7 -64
- package/skills/uipath-platform/references/data-fabric/data-fabric.md +76 -267
- package/skills/uipath-platform/references/data-fabric/entity-schema.md +23 -99
- package/skills/uipath-platform/references/data-fabric/file-attachments.md +5 -28
- package/skills/uipath-platform/references/data-fabric/filter-platform-contract.md +2 -2
- package/skills/uipath-platform/references/data-fabric/records-query.md +11 -32
- package/skills/uipath-platform/references/integration-service/reference-resolution.md +6 -2
- package/skills/uipath-platform/references/licensing/consumables-report.md +18 -0
- package/skills/uipath-platform/references/licensing/licensing.md +1 -1
- package/skills/uipath-platform/references/orchestrator/run-jobs.md +9 -2
- package/skills/uipath-platform/references/orchestrator/setup-environment.md +9 -0
- package/skills/uipath-platform/references/traces/feedback.md +4 -1
- package/skills/uipath-process-mining/SKILL.md +97 -0
- package/skills/uipath-process-mining/references/app-types.md +66 -0
- package/skills/uipath-process-mining/references/data-model.md +130 -0
- package/skills/uipath-process-mining/references/lifecycle-and-rbac.md +67 -0
- package/skills/uipath-process-mining/references/model-editing.md +112 -0
- package/skills/uipath-process-mining/references/pre-flight.md +119 -0
- package/skills/uipath-process-mining/references/querying.md +66 -0
- package/skills/uipath-process-mining/references/transformations.md +80 -0
- package/skills/uipath-process-mining/references/uip-pm-cli.md +145 -0
- package/skills/uipath-review/SKILL.md +23 -18
- package/skills/uipath-review/references/agents/agent-grading-rubric.md +1 -1
- package/skills/uipath-review/references/agents/agent-review-checklist.md +0 -4
- package/skills/uipath-review/references/agents/agents-coded-rules.md +1 -10
- package/skills/uipath-review/references/agents/agents-lowcode-rules.md +3 -6
- package/skills/uipath-review/references/agents/guardrails/coded-guardrails-review.md +62 -14
- package/skills/uipath-review/references/agents/guardrails/guardrails-review.md +60 -4
- package/skills/uipath-review/references/review-workflow-guide.md +3 -2
- package/skills/uipath-review/references/rule-catalog-workflow.md +4 -5
- package/skills/uipath-rpa/.maintenance/pattern-card-maintenance.md +20 -0
- package/skills/uipath-rpa/SKILL.md +57 -55
- package/skills/uipath-rpa/agents/uipath-project-discovery-agent.md +75 -19
- package/skills/uipath-rpa/assets/codedworkflow-template.md +245 -11
- package/skills/uipath-rpa/references/cli-reference.md +229 -6
- package/skills/uipath-rpa/references/coded/codedworkflow-reference.md +158 -2
- package/skills/uipath-rpa/references/coded/integration-service-guide.md +6 -5
- package/skills/uipath-rpa/references/coded/operations-guide.md +273 -5
- package/skills/uipath-rpa/references/coded-vs-xaml-guide.md +3 -3
- package/skills/uipath-rpa/references/common-pattern-card.md +303 -0
- package/skills/uipath-rpa/references/data-manipulation-guide.md +18 -3
- package/skills/uipath-rpa/references/debugging.md +0 -2
- package/skills/uipath-rpa/references/environment-setup.md +309 -1
- package/skills/uipath-rpa/references/error-handling-guide.md +1 -1
- package/skills/uipath-rpa/references/execution-maps-guide.md +110 -0
- package/skills/uipath-rpa/references/is-connector-xaml-guide.md +58 -4
- package/skills/uipath-rpa/references/legacy/activity-docs/Excel.md +1 -1
- package/skills/uipath-rpa/references/legacy/activity-docs/_DU-PROCESS.md +0 -2
- package/skills/uipath-rpa/references/legacy/activity-docs/_INDEX.md +2 -2
- package/skills/uipath-rpa/references/legacy/activity-docs/_PATTERNS.md +1 -1
- package/skills/uipath-rpa/references/legacy/activity-docs/_REFRAMEWORK.md +2 -7
- package/skills/uipath-rpa/references/legacy/cli-reference.md +599 -0
- package/skills/uipath-rpa/references/legacy/error-handling-guide.md +2 -2
- package/skills/uipath-rpa/references/legacy/legacy-mode-guide.md +16 -16
- package/skills/uipath-rpa/references/legacy/project-organization-guide.md +2 -2
- package/skills/uipath-rpa/references/legacy/selector-guide.md +163 -1
- package/skills/uipath-rpa/references/legacy/testing-guide.md +246 -3
- package/skills/uipath-rpa/references/legacy/xaml-basics-and-rules.md +267 -2
- package/skills/uipath-rpa/references/library-authoring-guide.md +4 -3
- package/skills/uipath-rpa/references/testing-guide.md +2 -28
- package/skills/uipath-rpa/references/trigger-pattern-guide.md +1 -1
- package/skills/uipath-rpa/references/xaml/canvas-layout-guide.md +140 -33
- package/skills/uipath-rpa/references/xaml/common-pitfalls.md +57 -240
- package/skills/uipath-rpa/references/xaml/csharp-activity-binding-guide.md +42 -2
- package/skills/uipath-rpa/references/xaml/long-running-workflow-guide.md +1 -1
- package/skills/uipath-rpa/references/xaml/xaml-basics-and-rules.md +194 -228
- package/skills/uipath-solution/references/activate-and-manage.md +22 -0
- package/skills/uipath-solution/references/develop-solution.md +26 -2
- package/skills/uipath-solution/references/pack-and-deploy.md +43 -9
- package/skills/uipath-test/SKILL.md +4 -4
- package/skills/uipath-test/references/playwright-first-mile-guide.md +5 -4
- package/skills/uipath-test/references/publish-and-link-guide.md +2 -2
- package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/playbooks/click-silent-no-op.md +5 -5
- package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/playbooks/queue-operation-failed.md +20 -4
- package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/summary.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/csv-activities/playbooks/read-csv-file-not-found.md +12 -0
- package/skills/uipath-troubleshoot/references/activity-packages/mail-activities/playbooks/send-outlook-mail-failures.md +12 -1
- package/skills/uipath-troubleshoot/references/activity-packages/system-activities/playbooks/get-asset-activity-bug-silent-failure.md +2 -1
- package/skills/uipath-troubleshoot/references/activity-packages/terminal-activities/playbooks/terminal-session-connection-failed.md +5 -1
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/click-silent-no-op.md +5 -5
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/dependency-version-conflict.md +27 -6
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/napplicationcard-view-generation-failed.md +10 -0
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/scope-container-wrong-page.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/summary.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/overview.md +4 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-auth-401-403.md +44 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-connection-failure.md +2 -1
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-content-type-rejected.md +37 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-proxy-blocked.md +39 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/package-version-mismatch.md +42 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/securestring-misuse-analyzer.md +41 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/summary.md +5 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/connector-null-reference.md +14 -1
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/connector-runtime-exception.md +2 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/is-activities-prerelease-not-found.md +39 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/response-content-too-large.md +41 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/summary.md +9 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/console-conflict-login-to-console.md +40 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/credential-store-unavailable.md +42 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/executor-start-transient-rerun.md +49 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-consecutive-system-exceptions.md +47 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-faulted-session-timeout.md +19 -19
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-output-too-large.md +47 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-stopped-generic-exit-code.md +55 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/known-issue-robot-defect.md +40 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/platform-incident-correlation.md +45 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/screen-capture-handle-invalid.md +43 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/serverless-license-quota.md +43 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/serverless-time-limit-exceeded.md +34 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/workstation-in-use-machine-slots.md +40 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/summary.md +13 -1
- package/version-manifest.json +2 -2
- package/skills/uipath-maestro-bpmn/validator/README.md +0 -224
- package/skills/uipath-maestro-bpmn/validator/model.mjs +0 -419
- package/skills/uipath-maestro-bpmn/validator/package.json +0 -17
- package/skills/uipath-maestro-bpmn/validator/rules.mjs +0 -1403
- package/skills/uipath-maestro-bpmn/validator/samples/invalid-conditional-and-variable.bpmn +0 -25
- package/skills/uipath-maestro-bpmn/validator/samples/valid-baseline.bpmn +0 -52
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/A.2.0.bpmn +0 -157
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/A.2.1.bpmn +0 -333
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/B.1.0.bpmn +0 -598
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/B.2.0.bpmn +0 -1709
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.2.0.bpmn +0 -564
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.3.0.bpmn +0 -671
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.4.0.bpmn +0 -1045
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.5.0.bpmn +0 -1176
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.6.0.bpmn +0 -670
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.7.0.bpmn +0 -466
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Can_Parse_Complex_Process_With_Task_Gateway_BoundaryEvent_etc.bpmn +0 -74
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/ExclusiveGatewayDefaultFlow.bpmn +0 -32
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/ExternalAgentWorkflow.bpmn +0 -62
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Golden_Scenario.initial.bpmn +0 -361
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/InclusiveJoinRouteAwayBranch.bpmn +0 -62
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_AsyncExecution_And_Create_CorrectModel.bpmn +0 -74
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_ExtractionValidation_And_Create_CorrectModel.bpmn +0 -35
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_Extraction_FileUpload_And_Create_CorrectModel.bpmn +0 -33
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_Extraction_JobAttachment_And_Create_CorrectModel.bpmn +0 -35
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_SubProcess_With_Multiple_Element_Types.bpmn +0 -76
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/StartEventWithOutputs.bpmn +0 -36
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/StartGatewayEnd.bpmn +0 -44
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/all elements.bpmn +0 -516
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/all_sequence_flow_types.bpmn +0 -173
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/demo.bpmn +0 -181
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-001-collapsed.bpmn +0 -126
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-001-expanded.bpmn +0 -122
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-003-collapsed_deeply-nested.bpmn +0 -438
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/A.1.0.bpmn +0 -87
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/A.3.0.bpmn +0 -165
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ApiWorkflow.bpmn +0 -39
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnNestedSubProcessTests.bpmn +0 -102
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnTimerBoundaryEvents.bpmn +0 -160
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnXmlWithCatchAllErrorEventSubProcess.bpmn +0 -45
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnXmlWithSpecificErrorEventSubProcess.bpmn +0 -46
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/CaseManagementWithConstantIdentifier.bpmn +0 -218
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ErrorBoundary.bpmn +0 -78
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ErrorPropagationInEventSubprocess.bpmn +0 -340
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/EventBasedGatewayFirstCatcherWins.bpmn +0 -56
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Example-EventBasedGateway.bpmn +0 -117
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveGatewayConditional.bpmn +0 -45
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveGatewaySharedEndEvent.bpmn +0 -45
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveWithParallelGateway.bpmn +0 -68
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/FourScriptTasks.bpmn +0 -84
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/HitlTaskOnly.bpmn +0 -55
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/InclusiveGatewayForkJoin.bpmn +0 -69
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_BPMN_Elements_And_Create_CorrectModel.bpmn +0 -20
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_HttpRequest_ServiceTask_And_Create_Correct_Model.bpmn +0 -34
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_MessageBoundaryEvent_And_Create_CorrectModel.bpmn +0 -87
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_Script_Task_V2_And_Create_Correct_Model.bpmn +0 -31
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_Sets_Containers_Properly.bpmn +0 -129
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ScriptWritesVariableThenGatewayBranches.bpmn +0 -59
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/boundaryevent.bpmn +0 -30
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/collapsed-subprocess.bpmn +0 -83
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/connectable-types.bpmn +0 -85
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/extensions-orchestrator-start-job.bpmn +0 -80
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/multiparticipantpool.bpmn +0 -77
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/nestedsubprocess.bpmn +0 -36
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/simple.bpmn +0 -59
- package/skills/uipath-maestro-bpmn/validator/test/integration.test.mjs +0 -146
- package/skills/uipath-maestro-bpmn/validator/test/model-helpers.mjs +0 -42
- package/skills/uipath-maestro-bpmn/validator/test/ported-rule-tests.mjs +0 -983
- package/skills/uipath-maestro-bpmn/validator/test/run-tests.mjs +0 -530
- package/skills/uipath-maestro-bpmn/validator/uipath-moddle.v1.json +0 -715
- package/skills/uipath-maestro-bpmn/validator/validate-bpmn.mjs +0 -164
- package/skills/uipath-review/references/agents/agents-common-rules.md +0 -32
- package/skills/uipath-rpa/assets/before-after-hooks-template.md +0 -115
- package/skills/uipath-rpa/assets/helper-utility-template.md +0 -22
- package/skills/uipath-rpa/assets/testcase-template.md +0 -92
- package/skills/uipath-rpa/references/coded/coding-guidelines.md +0 -255
- package/skills/uipath-rpa/references/coded/inspect-package-guide.md +0 -80
- package/skills/uipath-rpa/references/coded/third-party-packages-guide.md +0 -67
- package/skills/uipath-rpa/references/connector-capabilities.md +0 -79
- package/skills/uipath-rpa/references/legacy/activity-docs/Testing.md +0 -95
- package/skills/uipath-rpa/references/legacy/activity-docs/UIAutomation.md +0 -159
- package/skills/uipath-rpa/references/legacy/common-pitfalls.md +0 -318
- package/skills/uipath-rpa/references/legacy/discovery-workflow.md +0 -147
- package/skills/uipath-rpa/references/legacy/environment-setup.md +0 -78
- package/skills/uipath-rpa/references/legacy/project-structure.md +0 -206
- package/skills/uipath-rpa/references/legacy/test-data-guide.md +0 -142
- package/skills/uipath-rpa/references/legacy/validation-and-fixing.md +0 -154
- package/skills/uipath-rpa/references/project-structure-guide.md +0 -168
- package/skills/uipath-rpa/references/project-structure.md +0 -135
- package/skills/uipath-rpa/references/publishing-guide.md +0 -80
- package/skills/uipath-rpa/references/validation-guide.md +0 -170
- package/skills/uipath-rpa/references/xaml/csharp-expression-pitfalls.md +0 -43
- package/skills/uipath-rpa/references/xaml/flowchart-guide.md +0 -113
- 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).
|