@uipath/skills 1.197.2 → 1.198.0-preview.21

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 (143) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CODEOWNERS +18 -11
  4. package/README.md +1 -0
  5. package/assets/skill-status.json +8 -0
  6. package/hooks/hooks.json +44 -8
  7. package/hooks/send-telemetry.ps1 +392 -0
  8. package/hooks/send-telemetry.sh +118 -86
  9. package/hooks/set-session-env.ps1 +72 -0
  10. package/hooks/set-session-env.sh +64 -0
  11. package/hooks/suggest-permissions.ps1 +45 -0
  12. package/hooks/suggest-permissions.sh +4 -0
  13. package/package.json +1 -1
  14. package/skills/uipath-admin/references/audit-commands.md +2 -2
  15. package/skills/uipath-admin/references/audit-workflow-guide.md +4 -4
  16. package/skills/uipath-agents/references/coded/capabilities/batch-transform/planning.md +1 -1
  17. package/skills/uipath-agents/references/coded/capabilities/deeprag/planning.md +1 -1
  18. package/skills/uipath-agents/references/coded/capabilities/guardrails/guardrails-recommend.md +5 -2
  19. package/skills/uipath-agents/references/coded/capabilities/guardrails/guardrails.md +8 -4
  20. package/skills/uipath-agents/references/coded/embedding-in-flows.md +1 -1
  21. package/skills/uipath-agents/references/coded/flow-integration.md +2 -2
  22. package/skills/uipath-agents/references/coded/lifecycle/build.md +0 -1
  23. package/skills/uipath-agents/references/coded/lifecycle/setup.md +0 -1
  24. package/skills/uipath-agents/references/coded/quickstart.md +1 -1
  25. package/skills/uipath-agents/references/lowcode/agent-definition.md +24 -5
  26. package/skills/uipath-agents/references/lowcode/capabilities/built-in-tools/batch-transform/planning.md +1 -1
  27. package/skills/uipath-agents/references/lowcode/capabilities/built-in-tools/deeprag/planning.md +1 -1
  28. package/skills/uipath-agents/references/lowcode/capabilities/context/attachments.md +1 -0
  29. package/skills/uipath-agents/references/lowcode/capabilities/guardrails/guardrails-recommend.md +1 -0
  30. package/skills/uipath-api-workflow/references/cli-reference.md +1 -1
  31. package/skills/uipath-api-workflow/references/connector-activity-discovery.md +1 -1
  32. package/skills/uipath-api-workflow/references/troubleshooting.md +1 -1
  33. package/skills/uipath-automation-discovery/SKILL.md +26 -1
  34. package/skills/uipath-automation-discovery/assets/templates/estimation-worksheet-template.md +80 -0
  35. package/skills/uipath-automation-discovery/references/estimation-guide.md +104 -0
  36. package/skills/uipath-connector-builder/SKILL.md +6 -4
  37. package/skills/uipath-connector-builder/references/auth.md +137 -13
  38. package/skills/uipath-connector-builder/references/configuration.md +29 -7
  39. package/skills/uipath-connector-builder/references/debugging.md +1 -1
  40. package/skills/uipath-connector-builder/references/standard-resources.md +162 -13
  41. package/skills/uipath-governance/references/cli-cheatsheet.md +3 -3
  42. package/skills/uipath-governance/references/diagnose/references/failure-modes.md +5 -5
  43. package/skills/uipath-insights/SKILL.md +277 -0
  44. package/skills/uipath-insights/references/investigation-playbook-guide.md +145 -0
  45. package/skills/uipath-insights/references/jobs-commands-guide.md +144 -0
  46. package/skills/uipath-ixp/SKILL.md +4 -1
  47. package/skills/uipath-ixp/references/cli-reference.md +18 -3
  48. package/skills/uipath-maestro-bpmn/references/cli-conventions.md +2 -0
  49. package/skills/uipath-maestro-bpmn/validator/README.md +12 -2
  50. package/skills/uipath-maestro-case/SKILL.md +27 -13
  51. package/skills/uipath-maestro-case/assets/templates/sdd-template-examples.md +37 -4
  52. package/skills/uipath-maestro-case/assets/templates/sdd-template.md +20 -9
  53. package/skills/uipath-maestro-case/assets/templates/sdd-viewer.html +8 -7
  54. package/skills/uipath-maestro-case/references/bindings-v2-sync.md +5 -1
  55. package/skills/uipath-maestro-case/references/brownfield.md +86 -0
  56. package/skills/uipath-maestro-case/references/case-commands.md +8 -0
  57. package/skills/uipath-maestro-case/references/case-editing-operations.md +230 -21
  58. package/skills/uipath-maestro-case/references/case-schema.md +29 -11
  59. package/skills/uipath-maestro-case/references/connector-integration.md +1 -1
  60. package/skills/uipath-maestro-case/references/connector-trigger-common.md +1 -1
  61. package/skills/uipath-maestro-case/references/entry-points-sync.md +204 -0
  62. package/skills/uipath-maestro-case/references/implementation.md +19 -9
  63. package/skills/uipath-maestro-case/references/phase-0-interview.md +10 -8
  64. package/skills/uipath-maestro-case/references/phased-execution.md +11 -4
  65. package/skills/uipath-maestro-case/references/placeholder-tasks.md +24 -2
  66. package/skills/uipath-maestro-case/references/planning.md +9 -3
  67. package/skills/uipath-maestro-case/references/plugins/case/planning.md +2 -0
  68. package/skills/uipath-maestro-case/references/plugins/sla/impl-json.md +1 -1
  69. package/skills/uipath-maestro-case/references/plugins/sla/planning.md +1 -1
  70. package/skills/uipath-maestro-case/references/plugins/stages/impl-json.md +11 -10
  71. package/skills/uipath-maestro-case/references/plugins/stages/planning.md +13 -14
  72. package/skills/uipath-maestro-case/references/plugins/tasks/agent/impl-json.md +3 -1
  73. package/skills/uipath-maestro-case/references/plugins/tasks/agent/planning.md +91 -2
  74. package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/impl-json.md +3 -1
  75. package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/planning.md +87 -2
  76. package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/planning.md +1 -1
  77. package/skills/uipath-maestro-case/references/plugins/triggers/event/impl-json.md +1 -1
  78. package/skills/uipath-maestro-case/references/plugins/triggers/manual/impl-json.md +3 -1
  79. package/skills/uipath-maestro-case/references/plugins/triggers/timer/impl-json.md +2 -1
  80. package/skills/uipath-maestro-case/references/plugins/variables/bindings/impl-json.md +2 -0
  81. package/skills/uipath-maestro-case/references/plugins/variables/global-vars/impl-json.md +20 -10
  82. package/skills/uipath-maestro-case/references/plugins/variables/global-vars/planning.md +9 -8
  83. package/skills/uipath-maestro-case/references/plugins/variables/io-binding/impl-json.md +1 -1
  84. package/skills/uipath-maestro-case/references/plugins/variables/io-binding/planning.md +1 -1
  85. package/skills/uipath-maestro-case/references/registry-discovery.md +87 -10
  86. package/skills/uipath-maestro-case/references/sdd-generation-rules.md +34 -26
  87. package/skills/uipath-maestro-flow/SKILL.md +4 -1
  88. package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +1 -2
  89. package/skills/uipath-maestro-flow/references/author/references/editing-operations-json.md +3 -3
  90. package/skills/uipath-maestro-flow/references/author/references/greenfield.md +4 -2
  91. package/skills/uipath-maestro-flow/references/author/references/planning-arch.md +0 -1
  92. package/skills/uipath-maestro-flow/references/author/references/planning-impl.md +0 -1
  93. package/skills/uipath-maestro-flow/references/author/references/plugins/connector/impl.md +1 -0
  94. package/skills/uipath-maestro-flow/references/author/references/plugins/connector-trigger/impl.md +7 -7
  95. package/skills/uipath-maestro-flow/references/author/references/plugins/ixp/impl.md +14 -14
  96. package/skills/uipath-maestro-flow/references/author/references/plugins/script/impl.md +10 -6
  97. package/skills/uipath-maestro-flow/references/shared/cli-conventions.md +7 -0
  98. package/skills/uipath-maestro-flow/references/shared/file-format.md +1 -1
  99. package/skills/uipath-mcp-servers/references/is-activity-workflow.md +3 -3
  100. package/skills/uipath-planner/SKILL.md +1 -1
  101. package/skills/uipath-platform/SKILL.md +4 -14
  102. package/skills/uipath-platform/references/data-fabric/data-fabric.md +1 -1
  103. package/skills/uipath-platform/references/integration-service/agent-workflow.md +4 -4
  104. package/skills/uipath-platform/references/integration-service/reference-resolution.md +1 -1
  105. package/skills/uipath-platform/references/integration-service/resources.md +5 -5
  106. package/skills/uipath-platform/references/integration-service/triggers.md +10 -9
  107. package/skills/uipath-platform/references/orchestrator/setup-environment.md +2 -0
  108. package/skills/uipath-review/SKILL.md +8 -4
  109. package/skills/uipath-review/references/agents/agent-review-checklist.md +1 -22
  110. package/skills/uipath-review/references/agents/agents-coded-rules.md +24 -7
  111. package/skills/uipath-review/references/agents/agents-lowcode-rules.md +0 -1
  112. package/skills/uipath-review/references/agents/guardrails/coded-guardrails-review.md +231 -0
  113. package/skills/uipath-review/references/rule-catalog-workflow.md +4 -2
  114. package/skills/uipath-rpa/SKILL.md +2 -2
  115. package/skills/uipath-rpa/references/activity-docs/UiPath.DataService.Activities/guides/data-service-filter-builder-guide.md +1 -1
  116. package/skills/uipath-rpa/references/activity-docs/UiPath.Web.Activities/2.5/coded/coded-api.md +1 -1
  117. package/skills/uipath-rpa/references/activity-docs/UiPath.Web.Activities/2.5/coded/curl-import.md +3 -3
  118. package/skills/uipath-rpa/references/activity-docs/UiPath.Web.Activities/2.5/coded/http-request-upgrade.md +3 -3
  119. package/skills/uipath-rpa/references/activity-docs/UiPath.Web.Activities/2.5/coded/service-discovery.md +2 -2
  120. package/skills/uipath-rpa/references/coded/coding-guidelines.md +1 -1
  121. package/skills/uipath-rpa/references/ui-automation-guide.md +7 -7
  122. package/skills/uipath-rpa/references/uia-configure-target-workflows.md +5 -5
  123. package/skills/uipath-rpa/references/uia-elements-interaction-guide.md +19 -10
  124. package/skills/uipath-rpa/references/uia-prerequisites.md +7 -7
  125. package/skills/uipath-rpa/references/validation-guide.md +2 -2
  126. package/skills/uipath-rpa/references/xaml/common-pitfalls.md +4 -0
  127. package/skills/uipath-rpa/references/xaml/csharp-activity-binding-guide.md +3 -1
  128. package/skills/uipath-rpa/references/xaml/csharp-expression-pitfalls.md +9 -4
  129. package/skills/uipath-rpa/references/xaml/workflow-guide.md +2 -2
  130. package/skills/uipath-rpa/references/xaml/xaml-basics-and-rules.md +1 -1
  131. package/skills/uipath-solution/SKILL.md +4 -4
  132. package/skills/uipath-solution/references/activate-and-manage.md +6 -1
  133. package/skills/uipath-solution/references/develop-solution.md +24 -5
  134. package/skills/uipath-solution/references/pack-and-deploy.md +5 -2
  135. package/skills/uipath-solution/references/scenarios/manual-edits.md +2 -2
  136. package/skills/uipath-solution/references/solution-overview.md +2 -2
  137. package/skills/uipath-troubleshoot/SKILL.md +3 -3
  138. package/skills/uipath-troubleshoot/references/products/agents/playbooks/context-grounding-index-not-found.md +0 -2
  139. package/skills/uipath-troubleshoot/references/products/maestro/playbooks/personal-automation-quota.md +1 -1
  140. package/version-manifest.json +3 -3
  141. package/hooks/ensure-uip.sh +0 -220
  142. package/skills/uipath-maestro-flow/references/author/references/plugins/connector/data-fabric/impl.md +0 -683
  143. package/skills/uipath-maestro-flow/references/author/references/plugins/connector/data-fabric/planning.md +0 -45
@@ -23,9 +23,8 @@ encrypted — e.g. an OAuth user token (`TEXTFIELD`) or a Google service-account
23
23
 
24
24
  ## Auth types (`auth set --auth-type`)
25
25
 
26
- All 14 types are supported. `init --auth` is sugar for the two most common (`oauth2`,
27
- `customApiKey`) at create time; everything else (and the full flag surface) goes through
28
- `auth set`.
26
+ All 19 types are supported. `init --auth <type>` accepts any of them inline at create
27
+ time (handy for `none`); type-specific flags beyond init's OAuth sugar go through `auth set`.
29
28
 
30
29
  | auth-type | Use when |
31
30
  |-------------------------|-------------------------------------------------|
@@ -33,16 +32,21 @@ All 14 types are supported. `init --auth` is sugar for the two most common (`oau
33
32
  | oauth2Pkce | OAuth 2.0 Authorization Code + PKCE. |
34
33
  | oauth2ClientCredentials | OAuth 2.0 Client Credentials (no user). |
35
34
  | oauth2Password | OAuth 2.0 Resource Owner Password. |
35
+ | oauth2PrivateKeyJwt | OAuth 2.0 Private Key JWT (signed client assertion, e.g. Epic FHIR). |
36
36
  | oauth1 | OAuth 1.0a / Token-Based Authentication (TBA). |
37
37
  | basic | HTTP Basic (username + password). |
38
- | jwtOauth | JWT-bearer OAuth. |
39
- | jwtOauth2 | JWT-bearer OAuth 2.0. |
38
+ | jwtOauth | OAuth 2.0 JWT Bearer (service accounts — Salesforce, Box). |
39
+ | jwtOauth2 | Same contract as jwtOauth (legacy alias — prefer jwtOauth). |
40
40
  | custom | A custom static authorization header. |
41
41
  | customApiKey | Vendor uses a static API key (header or query). |
42
42
  | personalAccessToken | Personal access token authorization header. |
43
43
  | awsv4 | AWS Signature v4. |
44
44
  | googleServiceAccount | Google service-account JSON. |
45
45
  | rsaCertificate | RSA private-key certificate. |
46
+ | none | Open/unauthenticated API (webhooks, public endpoints). |
47
+ | firstPartyService | UiPath internal service — platform-injected service identity. |
48
+ | fpsUserDelegatedAccess | UiPath internal service — acts as the connection's user. |
49
+ | fpsRobotAccess | UiPath internal service — robot access token. |
46
50
 
47
51
  Per-type config key sets (which secrets, which URLs) are in
48
52
  [configuration.md](configuration.md) §"Auth as configuration".
@@ -97,6 +101,114 @@ uip is connectors builder auth set --auth-type oauth2 \
97
101
  --required-scopes read --preselected-scopes read,write
98
102
  ```
99
103
 
104
+ ## JWT Bearer (jwtOauth / jwtOauth2)
105
+
106
+ The connector holds the token URL and the SHAPE of the JWT assertion; the connection user
107
+ supplies the client id/secret, the signing key (`jwt.base64.encoded.key` — PKCS#8 PEM or
108
+ base64), and any user-specific claim values. The runtime builds the assertion from every
109
+ config keyed `jwt.claim.<name>` (payload) / `jwt.header.<name>` (header) — declare each with
110
+ a repeatable flag:
111
+
112
+ ```bash
113
+ uip is connectors builder auth set --auth-type jwtOauth \
114
+ --token-url https://login.salesforce.com/services/oauth2/token \
115
+ --jwt-claim aud=https://login.salesforce.com \
116
+ --jwt-claim iss \
117
+ --jwt-claim sub \
118
+ --scope 'api refresh_token'
119
+ ```
120
+
121
+ - `--token-url` is REQUIRED (the assertion is exchanged there for an access token).
122
+ - `--jwt-claim name=value` pre-fills the claim (still editable at connection time);
123
+ `--jwt-claim name` (bare) creates it required-and-empty — the connection user fills it
124
+ (e.g. Salesforce `iss` = consumer key, `sub` = username).
125
+ - Label/hint the connection-form field inline: `--jwt-claim 'iss;label=Consumer Key;hint=The connected app consumer key'`
126
+ — without a label the field renders as "JWT claim 'iss'".
127
+ - `--jwt-header kid=...` for assertion headers, same syntax (label/hint work too).
128
+ - The runtime ALSO requires `oauth.api.key` (client id) and `oauth.api.secret` — the bundle
129
+ ships both as connection-form fields. For Salesforce-style flows where iss == client id,
130
+ the user enters the same value twice; that is the platform contract, not a bug.
131
+ - jwtOauth intentionally creates NO `oauthOnTokenRefresh` resource — there is no refresh
132
+ token; the runtime signs a fresh assertion when the access token expires. Do not add one.
133
+ - `jwt.base64.encoded.key` (the signing key) is `internal: true, configScreenType: none`
134
+ BY DESIGN — every catalog jwt connector (Box, Salesforce, uipath-http) ships it that way
135
+ and the IS connection UI renders the private-key field for jwt flows itself. Do NOT
136
+ "fix" it to `pre`.
137
+ - Typical claim sets: Salesforce `iss`/`sub` + `aud=https://login.salesforce.com`;
138
+ Box `iss`/`sub` + `aud=<token url>` + `box_sub_type=enterprise`.
139
+ - NEVER write `jwt.oauth.*` config keys (consumer.key/private.key/username) — nothing in
140
+ the platform reads them; a connector built with them can never authenticate.
141
+
142
+ ## OAuth 2.0 Private Key JWT (oauth2PrivateKeyJwt)
143
+
144
+ Client-credentials-style flow where the client authenticates with a SIGNED ASSERTION
145
+ instead of a client secret (Epic FHIR is the catalog reference):
146
+
147
+ ```bash
148
+ uip is connectors builder auth set --auth-type oauth2PrivateKeyJwt \
149
+ --token-url https://fhir.epic.com/interconnect-fhir-oauth/oauth2/token
150
+ ```
151
+
152
+ The bundle ships `oauth.api.key` (client id), `jwk.private.key`, `jwk.kid` as
153
+ connection-form fields — the user pastes the registered key + kid at connection time.
154
+
155
+ ## UiPath First Party Service (firstPartyService / fpsUserDelegatedAccess / fpsRobotAccess)
156
+
157
+ INTERNAL-ONLY — connectors that call UiPath's own services (Orchestrator, Data Fabric,
158
+ Apps…). There are NO credential fields: the platform injects the caller's identity at
159
+ runtime. Choose the flavor by whose token the connector should act with: the service
160
+ (`firstPartyService`), the connection's user (`fpsUserDelegatedAccess`), or a robot
161
+ (`fpsRobotAccess`).
162
+
163
+ ```bash
164
+ uip is connectors builder init --name "My Service" \
165
+ --base-url 'https://{host}/{account}/{tenant}/myservice_'
166
+ uip is connectors builder auth set --auth-type firstPartyService \
167
+ --scope MyServiceApiUserAccess
168
+ ```
169
+
170
+ - `--scope` = the first-party scope the platform token is minted with (e.g.
171
+ `OrchestratorApiUserAccess`, `DataService`); it lands hidden on `oauth.scope` — an
172
+ authoring-time value, never a connection-form field.
173
+ - base.url follows `https://{host}/{account}/{tenant}/<service>_` — `auth set` binds those
174
+ three placeholders to the platform headers (`x-forwarded-host`,
175
+ `x-uipath-internal-accountid`, `x-uipath-internal-tenantid`) automatically, CONVERTING
176
+ any user-fillable configs + configuration-type bindings a prior `init --base-url` seeded
177
+ (they show up under `ConfigChanges.removed`). Either command order works.
178
+ - VERIFY with `auth get`: `FpsBindings` lists each placeholder and the header it resolves
179
+ from (`boundToHeader: null` = broken), and `ConnectionFormFields: []` proves no
180
+ user-facing fields. `validate` errors on any FPS connector whose placeholders are
181
+ user-fillable or configuration-bound.
182
+ - `auth set` also seeds hidden RUNTIME bookkeeping entries (`oauth.user.token`,
183
+ `oauth.user.refresh_time`, `oauth.user.refresh_interval`, `oauth.basic.header`; the
184
+ delegated type adds `oauth.user.refresh_token`) — token storage the platform writes at
185
+ runtime, never credential fields. Leave them alone.
186
+
187
+ ## No authentication (none)
188
+
189
+ ```bash
190
+ uip is connectors builder auth set --auth-type none
191
+ ```
192
+
193
+ Records `authentication.type:"none"` with zero credential configs — for open APIs and
194
+ webhook-style connectors (catalog: http-webhook, generic-webhooks). `validate` requires SOME
195
+ auth type on every connector, so run this even when the API needs no credentials.
196
+
197
+ ## AWS Signature v4 (awsv4)
198
+
199
+ ```bash
200
+ uip is connectors builder init --name "Amazon Connect" \
201
+ --base-url 'https://connect.{aws.region}.amazonaws.com'
202
+ uip is connectors builder auth set --auth-type awsv4 --aws-service-name connect
203
+ ```
204
+
205
+ The bundle ships `aws.api.key` / `aws.api.secret` / `aws.region` as connection-form fields
206
+ plus hidden `aws.service.name` / `aws.host`. `--aws-service-name` sets the per-service
207
+ SigV4 constant (e.g. `polly`, `connect`) — no `state patch` needed. Put `{aws.region}` in
208
+ base.url — the CLI binds it to the region config automatically, and `auth set` silently
209
+ replaces the generic placeholder config `init` seeded with the canonical AWS one (no
210
+ `--force` required).
211
+
100
212
  ## customApiKey
101
213
 
102
214
  ```bash
@@ -139,10 +251,11 @@ rather than hand-editing `configuration[]`.
139
251
  `--validation-vendor-path <path>` (with optional `--validation-method`, default GET) seeds
140
252
  a `provisionAuthValidation` system resource — one read-only call at connection creation that
141
253
  rejects bad creds immediately. The probe must be read-only and must not change vendor data,
142
- so keep it GET. Every non-OAuth/JWT auth type (any whose name isn't `oauth*`/`jwt*` `basic`,
143
- `custom`, `customApiKey`, `personalAccessToken`, `awsv4`, `googleServiceAccount`,
144
- `rsaCertificate`) has no token exchange to catch bad creds, so `validate` flags it as missing
145
- there. Details: [system-resources.md](system-resources.md) §provisionAuthValidation.
254
+ so keep it GET. Credential auth types with no token exchange (`basic`, `custom`,
255
+ `customApiKey`, `personalAccessToken`, `awsv4`, `googleServiceAccount`, `rsaCertificate`)
256
+ get a `validate` warning when it is missing. OAuth/JWT flows (token exchange catches bad
257
+ creds), `none` (no credentials), and the FPS family (platform identity) are exempt —
258
+ `validate` does not ask for a probe there. Details: [system-resources.md](system-resources.md) §provisionAuthValidation.
146
259
 
147
260
  ## System (lifecycle) resources — `auth system`
148
261
 
@@ -150,15 +263,26 @@ Lifecycle/auth-flow endpoints with no SR file (provisionAuthValidation, onProvis
150
263
  oauthOnTokenRefresh, …) are wired with `auth system create --type <type>` / `auth system list`.
151
264
  The full type list, override-path rules, and flags: [system-resources.md](system-resources.md).
152
265
 
153
- ## Base URL derived from a token response (e.g. Salesforce `instance_url`)
266
+ ## Base URL derived from a token response
154
267
 
155
- There is NO vendor-specific base-url flag (`init --base-url` is STATIC only). When the vendor
156
- returns the API host in its token response, it is skill-guided: a `postRequest` hook reads +
157
- validates the host (https scheme, allowlisted), then persists it into THIS connection's config
268
+ There is no service-specific base-url flag (`init --base-url` is STATIC only). When the token
269
+ response returns the API host or another per-connection value, use the generic hook pattern:
270
+ a `postRequest` hook reads + validates the value (scheme, host/id shape, allowlist where applicable), then persists it into THIS connection's config
158
271
  at runtime via `done({configuration})` — NOT `state patch` (that baking-time edit would set one
159
272
  org's URL as everyone's default). Full pattern: [hooks.md](hooks.md) §"Pattern: base URL …
160
273
  derived from a token response".
161
274
 
275
+ ## Verifying auth setup — `auth get`
276
+
277
+ `auth get` returns the full auth read model in one call: the type(s), every auth-related
278
+ config entry (key, label, hint, screen type, hidden/required/encrypted flags, defaults
279
+ with secrets redacted), `ConnectionFormFields` (EVERY visible config across the whole
280
+ connector — the literal connection form; `[]` = empty form), whether
281
+ `oauthOnTokenRefresh` / `provisionAuthValidation` exist, `FpsBindings` (FPS
282
+ placeholder→header map), and `TemplateBindings` (each non-FPS base.url `{placeholder}`
283
+ with whether its backing config entry + path-param binding exist). Use it instead of
284
+ stitching `state query` calls.
285
+
162
286
  ## Re-running auth set
163
287
 
164
288
  Idempotent on identical inputs (returns `unchanged`). If a new input would modify an
@@ -83,14 +83,20 @@ connector; the tenant user supplies the real secret at connection time. Key sets
83
83
  - **OAuth2** (16 entries — canonical list; `auth set` writes all of them):
84
84
  `oauth.api.key`, `oauth.api.secret` (PASSWORD, encrypt, isPrivate), `oauth.callback.url`
85
85
  (auto-set, do NOT hardcode), `oauth.authorization.url`, `oauth.token.url`,
86
- `oauth.token.refresh.url`, `oauth.token.revoke.url`, `oauth.scope`,
87
- `oauth.basic.header`, `oauth.user.token`, `oauth.user.refresh.token`,
88
- `oauth.user.refresh.interval` (sec, default 3600), plus auto-set internals
89
- `oauth.user.refresh.time`, `oauth.decode.authorization.code`, `authentication.time`,
86
+ `oauth.token.refresh_url`, `oauth.token.revoke_url`, `oauth.scope`,
87
+ `oauth.basic.header`, `oauth.user.token`, `oauth.user.refresh_token`,
88
+ `oauth.user.refresh_interval` (sec, default 3600), plus auto-set internals
89
+ `oauth.user.refresh_time`, `oauth.decode.authorization.code`, `authentication.time`,
90
90
  `expires_in`. Sets `authentication.type:"oauth2"`, `typeOauth:true`.
91
+ NOTE the underscore in the last segment of the four refresh/revoke keys
92
+ (`refresh_url`, `refresh_token`, `refresh_time`, `refresh_interval`) — the
93
+ all-dots spellings are dead keys the runtime never reads.
91
94
  - **OAuth2 PKCE** adds `oauth.pkce.code.challenge.verifier`, `oauth.pkce.code.challenge`,
92
95
  `oauth.pkce.code.challenge.method` (`"S256"`).
93
96
  - **OAuth2 Client Credentials**: subset — no auth URL, no refresh token.
97
+ - **oauth2PrivateKeyJwt** (client authenticates with a signed assertion, e.g. Epic FHIR):
98
+ `oauth.api.key`, `oauth.token.url`, `jwk.private.key` (TEXTAREA, encrypt), `jwk.kid` —
99
+ the connection user supplies the key + kid. `typeOauth:true`.
94
100
  - **customApiKey** (the on-disk type for any "API key" auth — the UI labels it "API key",
95
101
  but never use periodic's bare `apiKey`): one PASSWORD secret config (default
96
102
  `custom.api.key`, encrypt, isPrivate, `groupBy:"customApiKey"`) + one `type:"value"`
@@ -98,9 +104,25 @@ connector; the tenant user supplies the real secret at connection time. Key sets
98
104
  `authentication.type:"customApiKey"`, `typeOauth:false`. CLI flow + flags:
99
105
  [auth.md](auth.md) §customApiKey.
100
106
  - **basic**: `username`, `password` (PASSWORD, encrypt).
101
- - **jwtOauth**: `jwt.oauth.consumer.key`, `jwt.oauth.private.key`, `jwt.oauth.username`,
102
- `jwt.oauth.token.url`, `jwt.oauth.scope`. `typeOauth:true`.
103
- - **awsv4**: `aws.api.key`, `aws.api.secret`, `aws.region`, `aws.service.name`, `aws.host`.
107
+ - **jwtOauth / jwtOauth2** (OAuth 2.0 JWT Bearer): `oauth.api.key`, `oauth.api.secret`,
108
+ `oauth.callback.url`, `oauth.token.url`, `jwt.base64.encoded.key` (TEXTAREA — the signing
109
+ key, PKCS#8 PEM or base64), plus one `jwt.claim.<name>` config per assertion claim and
110
+ `jwt.header.<name>` per assertion header (the runtime builds the JWT from every config
111
+ with those prefixes — Salesforce ships `jwt.claim.iss/sub/aud`). Wire claims with
112
+ `auth set --jwt-claim` / `--jwt-header` ([auth.md](auth.md) §"JWT Bearer"). `typeOauth:true`.
113
+ (The old `jwt.oauth.*` keys are read by NOTHING — never write them.)
114
+ - **awsv4**: `aws.api.key`, `aws.api.secret`, `aws.region` (user-filled), `aws.service.name`
115
+ (hidden, per-service constant like `connect`), `aws.host` (hidden). Put the region in the
116
+ base URL as `https://<service>.{aws.region}.amazonaws.com` — the CLI binds `{aws.region}`
117
+ to the config automatically.
118
+ - **none**: no auth configs at all — `authentication.type:"none"` only (open APIs, webhooks).
119
+ - **firstPartyService / fpsUserDelegatedAccess / fpsRobotAccess** (UiPath internal services
120
+ ONLY): no user credentials — the platform injects the caller's identity. `oauth.scope`
121
+ (hidden) carries the service scope (set via `auth set --scope`). base.url uses
122
+ `https://{host}/{account}/{tenant}/<service>_` and the CLI binds those three placeholders
123
+ to the internal headers `x-forwarded-host` / `x-uipath-internal-accountid` /
124
+ `x-uipath-internal-tenantid` (`type:"header"` path params) — they are NOT connection-form
125
+ fields. `fpsUserDelegatedAccess` adds `oauth.user.refresh_token`.
104
126
 
105
127
  ## Multi-auth (groupControl)
106
128
  An `authentication.type` COMBO with `"groupControl": true` plus per-type config entries
@@ -23,7 +23,7 @@ exits non-zero on failure). All run under `uip is connectors builder`.
23
23
  false when it should be true.
24
24
  - **Token exchange fails**: wrong `oauth.token.url`; vendor expects/rejects
25
25
  `oauth.basic.header`; creds in wrong place (body vs header).
26
- - **Works then fails after expiry**: `oauth.token.refresh.url` unset, refresh interval too
26
+ - **Works then fails after expiry**: `oauth.token.refresh_url` unset (NOTE underscore — the all-dots key is dead), refresh interval too
27
27
  long, or wrong param mapping in `oauthOnTokenRefresh`.
28
28
  - **API key unauthorized**: wrong header name, missing prefix (`Bearer `/`Token `), or key
29
29
  sent as query when the vendor wants a header. Re-run `auth set --auth-type customApiKey`.
@@ -57,6 +57,28 @@ defines `GET`/`GETBYID`); a write-only activity keeps its base path. A per-metho
57
57
  is derived from the canonical resource path. Only model GETBYID for TRUE by-id endpoints,
58
58
  not a search/list-by-filter endpoint.
59
59
 
60
+ ### nested / parent-id vendor paths (mid-path `{token}`)
61
+ A path variable is bound on TWO sides: element-side `{name}` in the internal `path`, vendor-side
62
+ `{vendorName}` in the `vendorPath`. When a `{token}` sits **only in the vendor path** — a
63
+ parent-scoped sub-collection like `--vendor-path /issue/{issueId}/comment` whose internal slug is the
64
+ flat `/comments` — it CANNOT be `type:"path"`: element-service looks for the segment in the flat
65
+ element URL, doesn't find it, and 400s **"required parameter '<name>' not found"** at request time
66
+ (reads/writes on comments/transitions/assignee/attachments all fail). `activity create` now emits the
67
+ right shape automatically:
68
+
69
+ - **query→path (default for a vendor-only token):** internal `/comments`, param
70
+ `{ name:"issueId", type:"query", vendorName:"issueId", vendorType:"path" }`. Element-service takes the
71
+ value as a query param and interpolates it into the vendor template. This is how shipped connectors
72
+ (e.g. Jira `curated_add_comment`) declare parent ids. Callers pass it at run time via
73
+ `uip is resources run … --query issueId=<id>`.
74
+ - **path→path (token in the internal path):** pass `--resource-path /comments/{id}` so `{id}` is a real
75
+ element URL segment → `type:"path"`. If the internal and vendor tokens differ in name, the param is
76
+ `{ name:"id", vendorName:"issueId", type:"path", vendorType:"path" }` (name↔internal, vendorName↔vendor);
77
+ the CLI can't auto-derive a differing pair, so author it with `activity param create`.
78
+
79
+ `validate` now flags both failure modes: a `type:"path"` param whose `{name}` is missing from the
80
+ internal path, and a `{token}` in the vendorPath with no param sending it (unbound → 404).
81
+
60
82
  ## metadata.events
61
83
  `{ "eventMode": ["polling"] }` — `trigger create` sets this. Full `eventMode` value set:
62
84
  [events.md](events.md) §"SR-level event metadata".
@@ -68,12 +90,16 @@ you pass win, unspecified keys are kept, and per-method visibility is deep-merge
68
90
  `--type` is required only for a NEW field, optional on a merge.
69
91
 
70
92
  Core: `name`, `type` (string/integer/number/boolean/date/date-time/object/array),
71
- `displayName`, `nativeType`, `format`, `description`, `sampleValue`, `primaryKey`
72
- (`--primary-key`), `sortOrder` (`--sort-order`), `enum` (`--enum '[{"value":"active"}]'`),
73
- `mask` (`--mask`), `custom`. **`enum` MUST be the object form `[{"value":"x"}]`** — the server
74
- SR marshaller rejects a bare string array `["x"]` at PUBLISH time even though `validate` passes.
75
- The CLI auto-normalizes a bare `--enum '["a","b"]'` to the object form, but hand-edited SR/`state
76
- patch` enums must use `[{"value":…}]`.
93
+ `displayName`, `nativeType` (`--native-type`), `format`, `description`, `sampleValue`,
94
+ `defaultValue` (`--default-value`, scalar or JSON), `primaryKey` (`--primary-key`),
95
+ `sortOrder` (`--sort-order`), `enum` (`--enum`), `enhancedEnum` (`--enhanced-enum`),
96
+ `custom`. **`mask` is a date/number FORMAT PATTERN string** (e.g. `yyyy-MM-dd'T'HH:mm:ssZ`),
97
+ NOT a boolean set it with `--mask <pattern>`. **`enum` MUST end up as the object form `[{"value":"x"}]`** the
98
+ server SR marshaller rejects a bare string array `["x"]` at PUBLISH time. Both `--enum` and
99
+ `--fields-file` auto-normalize a bare `["a","b"]` to the object form; and `validate` now FLAGS a
100
+ bare/`!{value}` enum still sitting in an SR (e.g. from a hand `state patch`), so it no longer
101
+ slips through to a publish failure. `--enhanced-enum '[{"name":"Label","value":"V"}]'` writes
102
+ labelled options.
77
103
 
78
104
  **Method visibility** (`field.method` object) controls request/response per method:
79
105
  ```json
@@ -85,22 +111,145 @@ patch` enums must use `[{"value":…}]`.
85
111
  Set it with the visibility flags. `--method` is REPEATABLE and the flags
86
112
  (`--request`/`--response`/`--required`/`--request-curated`/`--response-curated`) apply to
87
113
  EVERY listed method: `--method GET --method POST --response` makes the field a response on
88
- both. Properties: `response`, `request`, `required`, `requestCurated`, `responseCurated`,
114
+ both. For DIFFERENT visibility per method in one call, use the inline form —
115
+ `--method 'GET=response,response-curated' --method 'POST=request,required'` — and prefix a
116
+ flag with `!` to UNSET it on a merge (`--method 'GET=!request'` writes `request: false`
117
+ over an accidental `true`; no `state patch` needed). Bare and inline `--method` forms mix.
118
+ Properties: `response`, `request`, `required`, `requestCurated`, `responseCurated`,
89
119
  `designOverrides`. `requestCurated`/`responseCurated` gate a field's visibility INSIDE a
90
120
  curated activity (plain `request`/`response` is not enough); auto-curation sets them from
91
121
  the field's request/response side.
92
122
 
93
123
  **Searchable**: `searchable` (`--searchable`), `searchableOperators`
94
- (`--searchable-operators '=,!=,like,>,<,>=,<=,in'`), `searchableNames`.
124
+ (`--searchable-operators '=,!=,like,>,<,>=,<=,in'`), `searchableNames` (`--searchable-names`).
95
125
 
96
126
  **design** object (`--design-position primary|secondary|none`, `--component`, `--hidden`):
97
127
  `position`, `component` (FolderPicker, Button, Connectors, Resources, Fields, Processes,
98
- Queues), `hidden` (what `--hidden` writes — the field-level key is `design.hidden`, NOT
99
- `isHidden`), `loadByDefault`, `isMultiSelect`, `enableUserOverride`, `dictionaryWidget`,
100
- `solutionResourceKind`, `fieldActions` (cascading show/hide based on another field's value).
128
+ Queues), `isHidden` (what `--hidden` writes — the key shipped connectors use; a dependent
129
+ dropdown's `--depends-on` writes the same key), `loadByDefault`, `isMultiSelect`,
130
+ `enableUserOverride`, `dictionaryWidget`, `solutionResourceKind`, `fieldActions` (cascading
131
+ show/hide based on another field's value).
132
+
133
+ ### Dropdowns (reference / lookup)
134
+ A dropdown lists rows from a **List resource in this connector** — you choose which field is
135
+ DISPLAYED and which is SENT. A dropdown can live on a **field, a path param, or a query param**, so
136
+ the same flags exist on both `activity field create` and `activity param create`:
137
+
138
+ ```
139
+ --reference-object <name> target List resource's object name (e.g. teams)
140
+ --reference-path <path> its list path (e.g. /teams); use {parent} for a dependent dropdown
141
+ --lookup-value <field> the ONE field sent as the value (e.g. id)
142
+ --lookup-names <csv> display-candidate fields (e.g. id,displayName)
143
+ --display-pattern <p> visible label, e.g. "{displayName}" or "{name} - {id}" (combines lookupNames)
144
+ --filter-pattern <p> server-side type-ahead template with {filter} (optional)
145
+ --load-by-default populate the list on open; --multi-select; --enable-user-override
146
+ ```
147
+
148
+ The reference points at a resource whose GET is `operation:"List"`; `lookupValue`/`lookupNames`
149
+ name fields in that resource's returned records. Raw `--reference '<json>'` (`{objectName,path,
150
+ lookupValue,lookupNames}`) is still accepted as an escape hatch. `objectName`+`path`+`lookupValue`
151
+ are expected; `validate` warns if `lookupValue` is missing.
152
+
153
+ **Dependent dropdowns** (child list scoped by a parent — e.g. Teams channel depends on team): put
154
+ `{<parentName>}` in the child's `--reference-path` (must equal the parent field/param's name) and
155
+ pass `--depends-on <parentName>`. That injects `design.isHidden` + a show/hide `fieldActions` pair,
156
+ so the child appears only after the parent has a value and its list is filtered by the parent:
157
+
158
+ ```
159
+ activity field create --resource messages --name team_id --reference-object teams \
160
+ --reference-path /teams --lookup-value id --lookup-names id,displayName \
161
+ --display-pattern "{displayName}" --load-by-default --method "POST=request,required"
162
+ activity field create --resource messages --name channel_id --depends-on team_id \
163
+ --reference-object "teams::channels" --reference-path "/teams/{team_id}/channels" \
164
+ --lookup-value id --lookup-names id,displayName --display-pattern "{displayName}" \
165
+ --method "POST=request,required"
166
+ ```
167
+
168
+ The parent (`team_id`) must exist as a sibling field/param on the same resource — `validate` warns
169
+ if a dependent path's `{token}` or a rule's `refFieldName` names nothing on the resource.
170
+
171
+ **Show/hide on a value** (conditional field, not a lookup): `--field-actions '<json>'` is the
172
+ escape hatch — an array of `{ actionType: show|hide|required|optional, rules: [{ type:"field",
173
+ refFieldName:"<other>", refFieldValues:["card"], isCleared:false }] }`. Use `refFieldValues:["*"]`
174
+ for "any value", `isCleared:true` to fire when the ref field is empty; multiple rules in one action
175
+ are ANDed. **`--depends-on` vs `--field-actions`:** use `--depends-on` for a dependent dropdown
176
+ (show once the parent has ANY value — it hard-codes `["*"]`); use `--field-actions` when the child
177
+ should appear only for a SPECIFIC parent value (e.g. `refFieldValues:["task"]`).
178
+
179
+ **Dropdowns on path / query params** work identically — the same flags exist on `activity param
180
+ create`. For a **path variable** just pass `--type path`: the CLI auto-encodes it as `type:"query"`
181
+ + `vendorType:"path"` when the variable isn't a segment of the flat internal path (element-service
182
+ interpolates it into the vendor path — a literal `type:"path"` there would 400). Example — a `boardId`
183
+ path-param dependent dropdown scoped by `projectId`:
184
+
185
+ ```
186
+ activity param create --resource cards --method POST --name boardId --type path \
187
+ --reference-object boards --reference-path "/projects/{projectId}/boards" \
188
+ --lookup-value id --lookup-names id,name --display-pattern "{name}" --depends-on projectId
189
+ ```
190
+
191
+ ## Authoring for catalogue parity — the curation layer
192
+ Wiring dropdowns is necessary but NOT sufficient to match a catalogue connector's Studio Web UX.
193
+ Benchmarking generated connectors vs catalogue (Gmail/Outlook/OneDrive) showed the dropdown plumbing
194
+ reaches parity, but four things a blind build usually MISSES — do these to close the gap:
195
+
196
+ 1. **Static / enum-backed pickers.** Not every dropdown is backed by a live vendor list — some are a
197
+ fixed set of literal choices. Two cases:
198
+ - **Small closed choice** (writeMode, valueInputOption, operation, role/type) → use
199
+ `--enum '["A","B"]'` or `--enhanced-enum '[{"name":"Label","value":"V"}]'` on **`field create`
200
+ OR `param create`** (both support it). This renders a static combo directly — do NOT stand up a
201
+ helper List resource for these. (Catalogue puts `enum`/`enhancedEnum` right on the field/param.)
202
+ - **Large / shared / vendor-fetched set** (timezones, currencies) → author a small helper List
203
+ resource holding that set and point a dropdown at it (`--reference-object timezones
204
+ --reference-path /timezones`). The catalogue adds a `timezones` picker on every calendar /
205
+ send-mail activity this way.
206
+ 2. **Curated responses, not raw vendor JSON.** Don't leave an activity's output as raw vendor field
207
+ names. Curate it — friendly output field names + a curated subset — via per-field `responseCurated`
208
+ + `displayName` (e.g. `EventTitle`/`StartDateTime` instead of `subject`/`start`). Set curated
209
+ visibility in the `--fields-file` method map; both `responseCurated` and the kebab
210
+ `response-curated` spelling are accepted (normalized).
211
+ 3. **Scope pickers on list / read verbs.** A list activity should offer the folder / calendar /
212
+ parent **scope** as a dropdown, not just a generic `where` / `pageSize`. e.g. Get Email List →
213
+ an email-folder picker; Get Event List → a calendar picker.
214
+ 4. **Field completeness.** Cover the catalogue's fields, not just the obvious ones (e.g. `Importance`
215
+ / `ReplyTo` on send-email, `ListColumns` on SharePoint list items).
216
+
217
+ **Known CLI limits (catalogue-only for now — can't reach 100% here):** there is no hierarchical
218
+ **tree-picker** reference type (the OneDrive drive→folder→file browser) and no **merged/combined**
219
+ picker (sheets+tables+named-ranges in one dropdown); the SR-level `type:"curated"` + `section` /
220
+ `category` grouping isn't settable (activities still surface as standalone via
221
+ `metadata.method.<VERB>.curated`). Don't try to hand-fake these — note them as gaps.
222
+
223
+ ## Bulk field authoring — `--fields` / `--fields-file`
224
+ `activity create --fields '<json-array>'` (inline) or `--fields-file <path>` seeds the whole
225
+ field schema in one shot. Two shapes are accepted: an ARRAY of field objects
226
+ (`[{ "name": "email", ... }]`), OR a name→spec OBJECT map (`{ "email": { ... } }`) where the KEY
227
+ is the field name — the exact shape a standard-resource stores `fields` under, so you can paste a
228
+ real connector's `fields: {…}` object VERBATIM. Each field object uses the SAME keys as above
229
+ (`name` required in the array form; `type` optional — defaults to `string`). This path is **validated and
230
+ normalized before anything is written** (same engine as `field create`): a bad shape fails
231
+ fast with a `ValidationError` listing EVERY problem, rather than silently authoring a broken
232
+ SR that only fails at publish. Specifically it:
233
+ - normalizes a bare `enum: ["a","b"]` → `[{"value":"a"},…]`;
234
+ - accepts per-method visibility under `method` (canonical) OR `methods` (alias) — but not both;
235
+ - requires `objectName`+`path` on a `reference`; requires `name`+`value` on each `enhancedEnum`;
236
+ - checks `design.position` ∈ {primary,secondary,none} and that boolean flags are booleans;
237
+ - REJECTS unknown top-level keys (typo guard) and duplicate field names.
238
+ Example element: `{ "name": "status", "type": "string", "enum": ["open","closed"],
239
+ "searchable": true, "method": { "GET": { "response": true } } }`. `--fields`/`--fields-file`
240
+ carry the full property set (enum, enhancedEnum, reference, searchable*, primaryKey,
241
+ sortOrder, defaultValue, design, …) — none are dropped.
242
+
243
+ The schema is OPEN: recognized keys are listed by `activity field schema`, but connectors
244
+ carry a vendor long tail (`refName`, `searchableDisplayName`, `isHidden`, …) — those pass
245
+ through with a WARNING, not an error, so real fields are never blocked. Only true
246
+ publish‑breakers hard‑fail: missing `name`, duplicate names, both `method`+`methods`, a
247
+ non‑object `method` map.
101
248
 
102
- **reference** object (lookup dropdown): `{ "lookupNames": ["name"], "lookupValue": "id",
103
- "path": "/accounts" }` set via `state patch` (no field flag).
249
+ Don't guess the shape: `activity field schema` prints the exact accepted keys, types,
250
+ visibility methods, and a copy‑pasteable **valid** example (no connector needed). To
251
+ bulk‑add fields to an EXISTING activity, re‑run `activity create --name <same>
252
+ --fields-file <path>` — it MERGES fields into the existing SR (existing fields kept).
104
253
 
105
254
  ## Rules
106
255
  1. Field dict key MUST equal `field.name`. 2. `fields` is top-level. 3. Only methods in
@@ -97,7 +97,7 @@ Bare `formData` object, NOT wrapped in `{ "data": ... }`. The CLI adds the wrapp
97
97
 
98
98
  ## Deployment (tenant / group / user)
99
99
 
100
- > **All `deployment * configure` commands are FULL REPLACE.** The submitted array rewrites the target's assignment list. Always read current state first, merge new entries in, then configure. See [policy-assign.md](policy-assign.md) for the merge-first pattern.
100
+ > **All `deployment * configure` commands are FULL REPLACE.** The submitted array rewrites the target's assignment list. Always read current state first, merge new entries in, then configure. See `policy-assign.md` for the merge-first pattern.
101
101
  >
102
102
  > **Why this matters:** the previous `assign-tenant` / `assign-group` / `assign-user` commands had a "last deploy wins" bug — sequential single-policy calls each did a full-replace at the API. The new `configure` commands fix this by taking the full assignment list in one atomic call.
103
103
 
@@ -173,8 +173,8 @@ This skill uses only the default caller-own mode. The `--tenant-only` and `--use
173
173
  | `401 / 403` | Session expired or insufficient perms. | Halt. Ask user to `uip login`. |
174
174
  | `404` | Identifier not found. | Halt. Check IDs. (Missing `--input` paths now surface a clear filesystem error, not 404.) |
175
175
  | `409` | Duplicate policy name on create. | Halt. V1 = do NOT retry-as-update. (Critical Rule in SKILL.md) |
176
- | `500` | Often [missing metadata flags on update (known-issue #2)](cli-known-issues.md). | Halt. Re-read policy metadata, pass all flags. |
177
- | `503` with transient `Instructions` text (`template upgrade`, `connection timeout`, `backend temporarily unavailable`) | AOPS is migrating the policy's Form.io template or a dependency is flapping — typically tens of seconds to minutes. | Do NOT use the default 3s retry. Wait 30s before first retry, 60s before second. Or surface to user and offer `retry now` / `cancel`. Only halt after a third failure or if the `Instructions` text shifts to a non-transient error. See [policy-crud.md UPDATE error map](policy-crud.md#update-recipe). |
176
+ | `500` | Often missing metadata flags on update (known-issue #2). | Halt. Re-read policy metadata, pass all flags. |
177
+ | `503` with transient `Instructions` text (`template upgrade`, `connection timeout`, `backend temporarily unavailable`) | AOPS is migrating the policy's Form.io template or a dependency is flapping — typically tens of seconds to minutes. | Do NOT use the default 3s retry. Wait 30s before first retry, 60s before second. Or surface to user and offer `retry now` / `cancel`. Only halt after a third failure or if the `Instructions` text shifts to a non-transient error. See `policy-crud.md` UPDATE error map. |
178
178
  | `5xx` other | Server-side. | Retry once after 3s. Halt on second failure. Surface `Instructions` verbatim. |
179
179
 
180
180
  All halts write a deploy record (Apply) or patch record (Diagnose).
@@ -63,7 +63,7 @@ Named failure patterns with symptom → cause → investigation → fix. Match t
63
63
  ```bash
64
64
  uip gov aops-policy deployment tenant get "$TENANT_ID" --output json
65
65
  ```
66
- 3. Verify the product is included in the target license type (see [aops-policy-deploy-guide.md — License-type → product compatibility](../aops-policy/aops-policy-deploy-guide.md#license-type--product-compatibility)).
66
+ 3. Verify the product is included in the target license type (see [aops-policy-deploy-guide.md — License-type → product compatibility](../../aops-policy/aops-policy-deploy-guide.md#license-type--product-compatibility)).
67
67
 
68
68
  **Fix:** Cause 1 → redeploy to a license type that includes the target product. Cause 2 → deploy to the license type the affected users actually hold. Cause 3 → deploy to all relevant license types.
69
69
 
@@ -100,7 +100,7 @@ Named failure patterns with symptom → cause → investigation → fix. Match t
100
100
  uip gov access-policy list --filter "status in ('Active')" --output json
101
101
  ```
102
102
 
103
- **Fix:** Cause 1 → narrow selector `resourceType`/`tags`. Cause 2 → add the calling user/group to `actorRule`. Cause 3 → add the actor process type to `executableRule`. Cause 4 → adjust tags on the resource or policy. Cause 5 → see [plugins/actor/impl.md — Robot intent](../access-policy/plugins/actor/impl.md) for the User-fallback pattern.
103
+ **Fix:** Cause 1 → narrow selector `resourceType`/`tags`. Cause 2 → add the calling user/group to `actorRule`. Cause 3 → add the actor process type to `executableRule`. Cause 4 → adjust tags on the resource or policy. Cause 5 → see [plugins/actor/impl.md — Robot intent](../../access-policy/plugins/actor/impl.md) for the User-fallback pattern.
104
104
 
105
105
  ---
106
106
 
@@ -133,7 +133,7 @@ Named failure patterns with symptom → cause → investigation → fix. Match t
133
133
  ```
134
134
  4. Verify the resource's tags in the Resource Catalog match the selector's tag filter.
135
135
 
136
- **Fix:** Cause 1 → broaden selector or add a new policy covering the gap. Cause 2 → update status to `Active`. Cause 3 → correct tags on resource or policy. Cause 4 → reframe deny intent as allow-only (see [plugins/tags/planning.md — Deny-to-Allow flip](../access-policy/plugins/tags/planning.md#deny-to-allow-flip)). Cause 5 → use correct enum values from [plugins/selector/impl.md](../access-policy/plugins/selector/impl.md).
136
+ **Fix:** Cause 1 → broaden selector or add a new policy covering the gap. Cause 2 → update status to `Active`. Cause 3 → correct tags on resource or policy. Cause 4 → reframe deny intent as allow-only (see [plugins/tags/planning.md — Deny-to-Allow flip](../../access-policy/plugins/tags/planning.md#deny-to-allow-flip)). Cause 5 → use correct enum values from [plugins/selector/impl.md](../../access-policy/plugins/selector/impl.md).
137
137
 
138
138
  ---
139
139
 
@@ -165,7 +165,7 @@ Named failure patterns with symptom → cause → investigation → fix. Match t
165
165
  uip gov aops-policy deployment user get "$USER_ID" --output json
166
166
  ```
167
167
 
168
- **Fix:** Cause 1 → deploy a policy via [aops-policy-deploy-guide.md](../aops-policy/aops-policy-deploy-guide.md). Cause 2 → redeploy to the correct tenant. Cause 3 → use the product `name` (not label) from `product list`. Cause 4 → remove the `null` override or deploy a policy at a broader scope.
168
+ **Fix:** Cause 1 → deploy a policy via [aops-policy-deploy-guide.md](../../aops-policy/aops-policy-deploy-guide.md). Cause 2 → redeploy to the correct tenant. Cause 3 → use the product `name` (not label) from `product list`. Cause 4 → remove the `null` override or deploy a policy at a broader scope.
169
169
 
170
170
  ---
171
171
 
@@ -198,4 +198,4 @@ Named failure patterns with symptom → cause → investigation → fix. Match t
198
198
  ```
199
199
  4. For Access — check error message in response `Data.errors`.
200
200
 
201
- **Fix:** Cause 1 → use `name` from `product list`. Cause 2 → fix JSON (validate with `jq`). Cause 3 → switch to `enforcement: "Allow"`. Cause 4 → add `"values": ["*"]` to selector entries. Cause 5 → choose a different name. Cause 6 → regenerate from template via [configure-aops-policy-data-guide.md](../aops-policy/configure-aops-policy-data-guide.md).
201
+ **Fix:** Cause 1 → use `name` from `product list`. Cause 2 → fix JSON (validate with `jq`). Cause 3 → switch to `enforcement: "Allow"`. Cause 4 → add `"values": ["*"]` to selector entries. Cause 5 → choose a different name. Cause 6 → regenerate from template via [configure-aops-policy-data-guide.md](../../aops-policy/configure-aops-policy-data-guide.md).