@salesforce/afv-skills 1.65.0 → 1.65.1

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 (349) hide show
  1. package/package.json +1 -1
  2. package/skills/field-service-data-capture-form-deployer-configure/SKILL.md +2 -23
  3. package/skills/field-service-data-capture-form-designer-configure/SKILL.md +3 -13
  4. package/skills/field-service-mobile-branding-configure/SKILL.md +3 -17
  5. package/skills/field-service-objective-designer-configure/SKILL.md +379 -72
  6. package/skills/field-service-prework-brief-deployer-configure/SKILL.md +537 -10
  7. package/skills/field-service-scheduling-policy-designer-query/SKILL.md +1093 -65
  8. package/skills/field-service-sobject-create-configure/SKILL.md +213 -13
  9. package/skills/field-service-voice-to-form-configure/SKILL.md +11 -40
  10. package/skills/field-service-work-rule-designer-configure/SKILL.md +95 -121
  11. package/skills/agentforce-gpt-email-generation-configure/SKILL.md +0 -312
  12. package/skills/agentforce-wizard-ui-forecasting-analytics-components-configure/SKILL.md +0 -64
  13. package/skills/agentforce-wizard-ui-sales-einstein-components-configure/SKILL.md +0 -46
  14. package/skills/automation-company-profile-info-query/SKILL.md +0 -51
  15. package/skills/automation-digital-wallet-configure/SKILL.md +0 -689
  16. package/skills/automation-flow-coordinate/SKILL.md +0 -95
  17. package/skills/automation-flow-coordinate/references/elements/action-call/action-call.md +0 -1569
  18. package/skills/automation-flow-coordinate/references/elements/action-call/conversation-messaging.md +0 -96
  19. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-sms-message.json +0 -23
  20. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-to-journey-no-fields.json +0 -31
  21. package/skills/automation-flow-coordinate/references/elements/action-call/send-to-journey.md +0 -179
  22. package/skills/automation-flow-coordinate/references/elements/exit-rule/examples/event-email-link-click.json +0 -13
  23. package/skills/automation-flow-coordinate/references/elements/exit-rule/exit-rule.md +0 -83
  24. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/examples/forward-to-bot-or-agent.json +0 -69
  25. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/forward-to-bot-or-agent.md +0 -274
  26. package/skills/automation-flow-coordinate/references/elements/start/audience-common.md +0 -192
  27. package/skills/automation-flow-coordinate/references/elements/start/automation-event-triggered.md +0 -130
  28. package/skills/automation-flow-coordinate/references/elements/start/data-cloud-data-change-triggered.md +0 -92
  29. package/skills/automation-flow-coordinate/references/elements/start/form-submission-triggered.md +0 -88
  30. package/skills/automation-flow-coordinate/references/elements/start/segment-triggered.md +0 -152
  31. package/skills/automation-flow-coordinate/references/elements/start/start.md +0 -539
  32. package/skills/automation-flow-coordinate/references/elements/subflow/subflow.md +0 -152
  33. package/skills/automation-flow-coordinate/references/elements/wait/wait.md +0 -497
  34. package/skills/automation-flow-coordinate/references/recipes/author/author.md +0 -868
  35. package/skills/automation-flow-coordinate/references/recipes/summarize/element-generic.md +0 -300
  36. package/skills/automation-flow-coordinate/references/recipes/summarize/reference-resolution.md +0 -292
  37. package/skills/automation-flow-coordinate/references/recipes/summarize/summarize.md +0 -323
  38. package/skills/automation-flow-coordinate/references/recipes/testing/examples/debug-output-template.md +0 -109
  39. package/skills/automation-flow-coordinate/references/recipes/testing/shape.md +0 -219
  40. package/skills/automation-flow-coordinate/references/recipes/testing/shared-stages/intent-analyzer.md +0 -180
  41. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/debug.md +0 -175
  42. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/promote.md +0 -255
  43. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/save-debug.md +0 -212
  44. package/skills/automation-flow-coordinate/references/resources/variable/variable.md +0 -171
  45. package/skills/automation-flow-coordinate/references/shared/anti-patterns.md +0 -786
  46. package/skills/automation-flow-coordinate/references/shared/end/end.md +0 -267
  47. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/README.md +0 -69
  48. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/predictions.jsonl +0 -80
  49. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/prompts.jsonl +0 -116
  50. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/flow-type-resolver.md +0 -321
  51. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/taxonomy.json +0 -320
  52. package/skills/automation-flow-coordinate/references/shared/server-functions.md +0 -597
  53. package/skills/automotive-cloud-appraisal-management-settings-configure/SKILL.md +0 -69
  54. package/skills/automotive-cloud-dealer-essentials-configure/SKILL.md +0 -78
  55. package/skills/automotive-cloud-ground-agent-data-pipelines-configure/SKILL.md +0 -373
  56. package/skills/automotive-cloud-ground-mfg-agent-data-pipelines-configure/SKILL.md +0 -273
  57. package/skills/automotive-cloud-mfg-agent-data-pipelines-configure/SKILL.md +0 -259
  58. package/skills/automotive-cloud-mfg-sales-concierge-agent-create/SKILL.md +0 -369
  59. package/skills/automotive-cloud-mfg-sales-concierge-foundation-configure/SKILL.md +0 -542
  60. package/skills/automotive-cloud-mfg-sales-concierge-foundation-coordinate/SKILL.md +0 -159
  61. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-agent-create/SKILL.md +0 -349
  62. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-configure/SKILL.md +0 -505
  63. package/skills/automotive-cloud-sales-concierge-agent-create/SKILL.md +0 -380
  64. package/skills/automotive-cloud-sales-concierge-foundation-configure/SKILL.md +0 -567
  65. package/skills/automotive-cloud-sales-concierge-foundation-coordinate/SKILL.md +0 -159
  66. package/skills/automotive-cloud-sales-concierge-orchestrator-agent-create/SKILL.md +0 -360
  67. package/skills/automotive-cloud-sales-concierge-orchestrator-configure/SKILL.md +0 -539
  68. package/skills/automotive-cloud-sales-concierge-search-grounding-configure/SKILL.md +0 -358
  69. package/skills/commerce-b2b-merchant-quote-configure/SKILL.md +0 -602
  70. package/skills/commerce-b2b-store-configure/SKILL.md +0 -251
  71. package/skills/commerce-credit-memo-create/SKILL.md +0 -139
  72. package/skills/commerce-delivery-business-hours-configure/SKILL.md +0 -277
  73. package/skills/commerce-delivery-estimation-apply/SKILL.md +0 -155
  74. package/skills/commerce-delivery-estimation-configure/SKILL.md +0 -377
  75. package/skills/commerce-delivery-routing-specs-integrate/SKILL.md +0 -174
  76. package/skills/commerce-estimate-bopis-query/SKILL.md +0 -279
  77. package/skills/commerce-estimate-delivery-date-query/SKILL.md +0 -349
  78. package/skills/commerce-fees-apply/SKILL.md +0 -227
  79. package/skills/commerce-fulfillment-routing-analyze/SKILL.md +0 -200
  80. package/skills/commerce-guest-buyer-create/SKILL.md +0 -173
  81. package/skills/commerce-location-bopis-configure/SKILL.md +0 -378
  82. package/skills/commerce-location-business-hours-configure/SKILL.md +0 -235
  83. package/skills/commerce-location-delivery-processing-time-configure/SKILL.md +0 -309
  84. package/skills/commerce-location-graph-integrate/SKILL.md +0 -131
  85. package/skills/commerce-location-shipping-carrier-method-configure/SKILL.md +0 -755
  86. package/skills/commerce-location-temporary-operating-hours-configure/SKILL.md +0 -331
  87. package/skills/commerce-merchant-buyer-groups-configure/SKILL.md +0 -579
  88. package/skills/commerce-merchant-buyer-user-onboarding-create/SKILL.md +0 -626
  89. package/skills/commerce-merchant-catalog-configure/SKILL.md +0 -614
  90. package/skills/commerce-merchant-extension-provider-configure/SKILL.md +0 -368
  91. package/skills/commerce-merchant-insights-account-health-churn-analyze/SKILL.md +0 -118
  92. package/skills/commerce-merchant-insights-inventory-returns-analyze/SKILL.md +0 -65
  93. package/skills/commerce-merchant-insights-order-shopper-get/SKILL.md +0 -90
  94. package/skills/commerce-merchant-insights-product-performance-analyze/SKILL.md +0 -72
  95. package/skills/commerce-merchant-insights-query/SKILL.md +0 -279
  96. package/skills/commerce-merchant-storefront-guest-access-configure/SKILL.md +0 -656
  97. package/skills/commerce-order-summary-change-apply/SKILL.md +0 -375
  98. package/skills/commerce-product-details-get/SKILL.md +0 -363
  99. package/skills/commerce-product-search/SKILL.md +0 -563
  100. package/skills/commerce-react-storefront-create/SKILL.md +0 -350
  101. package/skills/commerce-return-order-summary-create/SKILL.md +0 -513
  102. package/skills/commerce-search-relevance-analyze/SKILL.md +0 -757
  103. package/skills/commerce-temporary-processing-time-override-create/SKILL.md +0 -274
  104. package/skills/communications-initial-setup-configure/SKILL.md +0 -630
  105. package/skills/communications-multisite-configure/SKILL.md +0 -571
  106. package/skills/communications-revenue-cloud-settings-configure/SKILL.md +0 -74
  107. package/skills/communications-smb-fiber-catalog-create/SKILL.md +0 -413
  108. package/skills/communications-tmf-integrate/SKILL.md +0 -1368
  109. package/skills/consumer-goods-visit-activity-act4-questions-assign/SKILL.md +0 -448
  110. package/skills/consumer-goods-visit-activity-act5-standard-create/SKILL.md +0 -269
  111. package/skills/consumer-goods-visit-activity-act6-assortment-configure/SKILL.md +0 -271
  112. package/skills/consumer-goods-visit-activity-act7-account-scoping-create/SKILL.md +0 -382
  113. package/skills/consumer-goods-visit-activity-act8-plan-attach-create/SKILL.md +0 -373
  114. package/skills/consumer-goods-visit-activity-act9-proof-validate/SKILL.md +0 -389
  115. package/skills/consumer-goods-visit-and-activity-act1-specification-create/SKILL.md +0 -338
  116. package/skills/consumer-goods-visit-and-activity-act2-template-create/SKILL.md +0 -547
  117. package/skills/consumer-goods-visit-and-activity-act3-definition-create/SKILL.md +0 -346
  118. package/skills/consumer-goods-visit-and-activity-configure/SKILL.md +0 -1110
  119. package/skills/crm-analytics-adoption-insights-configure/SKILL.md +0 -224
  120. package/skills/crm-analytics-custom-report-type-lightning-configure/SKILL.md +0 -418
  121. package/skills/crm-analytics-dashboards-configure/SKILL.md +0 -731
  122. package/skills/crm-analytics-operational-analytics-metadata-bridge-migrate/SKILL.md +0 -233
  123. package/skills/crm-analytics-report-notifications-ui-configure/SKILL.md +0 -184
  124. package/skills/crm-analytics-sharing-inheritance-coverage-analyze/SKILL.md +0 -167
  125. package/skills/crm-analytics-sonic-getting-started-configure/SKILL.md +0 -55
  126. package/skills/crm-analytics-tableau-next-app-deploy/SKILL.md +0 -1350
  127. package/skills/crm-analytics-tableau-next-c360-basemodel-validate/SKILL.md +0 -1862
  128. package/skills/crm-analytics-tableau-next-datacloud-validate/SKILL.md +0 -83
  129. package/skills/crm-analytics-tableau-next-provisioning-validate/SKILL.md +0 -81
  130. package/skills/data360-activation-create/SKILL.md +0 -104
  131. package/skills/data360-activation-external-platform-get/SKILL.md +0 -49
  132. package/skills/data360-activation-target-create/SKILL.md +0 -93
  133. package/skills/data360-activation-v2-create/SKILL.md +0 -456
  134. package/skills/data360-audience-dmo-get/SKILL.md +0 -38
  135. package/skills/data360-calculated-affinity-create/SKILL.md +0 -82
  136. package/skills/data360-calculated-insight-create/SKILL.md +0 -148
  137. package/skills/data360-catalog-metadata-create/SKILL.md +0 -183
  138. package/skills/data360-code-extension-create/SKILL.md +0 -115
  139. package/skills/data360-communication-capping-create/SKILL.md +0 -227
  140. package/skills/data360-connection-create/SKILL.md +0 -491
  141. package/skills/data360-content-lens-create/SKILL.md +0 -181
  142. package/skills/data360-data-action-create/SKILL.md +0 -126
  143. package/skills/data360-data-action-target-create/SKILL.md +0 -181
  144. package/skills/data360-data-clean-room-create/SKILL.md +0 -238
  145. package/skills/data360-data-governance-create/SKILL.md +0 -746
  146. package/skills/data360-data-graph-create/SKILL.md +0 -82
  147. package/skills/data360-data-harmonized-model-object-reference-create/SKILL.md +0 -38
  148. package/skills/data360-data-lake-object-create/SKILL.md +0 -207
  149. package/skills/data360-data-model-object-catalog-get/SKILL.md +0 -49
  150. package/skills/data360-data-model-object-create/SKILL.md +0 -128
  151. package/skills/data360-data-model-object-mapping-create/SKILL.md +0 -106
  152. package/skills/data360-data-space-create/SKILL.md +0 -161
  153. package/skills/data360-data-streams-create/SKILL.md +0 -324
  154. package/skills/data360-engagement-signal-get/SKILL.md +0 -38
  155. package/skills/data360-experiment-create/SKILL.md +0 -82
  156. package/skills/data360-goal-based-campaign-create/SKILL.md +0 -192
  157. package/skills/data360-harmonization-process-history-get/SKILL.md +0 -38
  158. package/skills/data360-harmonized-unstructured-dmo-create/SKILL.md +0 -84
  159. package/skills/data360-identity-resolution-create/SKILL.md +0 -115
  160. package/skills/data360-intelligent-document-processing-create/SKILL.md +0 -148
  161. package/skills/data360-knowledge-graph-construction-create/SKILL.md +0 -93
  162. package/skills/data360-knowledge-graph-create/SKILL.md +0 -216
  163. package/skills/data360-knowledge-space-mcp-configure/SKILL.md +0 -475
  164. package/skills/data360-machine-learning-mcp-configure/SKILL.md +0 -697
  165. package/skills/data360-multi-org-mcp-configure/SKILL.md +0 -117
  166. package/skills/data360-secondary-index-mcp-configure/SKILL.md +0 -126
  167. package/skills/data360-segment-mcp-configure/SKILL.md +0 -159
  168. package/skills/data360-semantic-calculated-dimension-mcp-configure/SKILL.md +0 -93
  169. package/skills/data360-semantic-calculated-measurement-mcp-configure/SKILL.md +0 -93
  170. package/skills/data360-semantic-data-object-mcp-configure/SKILL.md +0 -93
  171. package/skills/data360-semantic-dimension-mcp-configure/SKILL.md +0 -38
  172. package/skills/data360-semantic-engine-mcp-configure/SKILL.md +0 -62
  173. package/skills/data360-semantic-measurement-mcp-configure/SKILL.md +0 -38
  174. package/skills/data360-semantic-metric-mcp-configure/SKILL.md +0 -93
  175. package/skills/data360-semantic-model-mcp-configure/SKILL.md +0 -115
  176. package/skills/data360-standard-mapping-mcp-configure/SKILL.md +0 -38
  177. package/skills/data360-tenant-lifecycle-mcp-configure/SKILL.md +0 -73
  178. package/skills/experience-afv-query/SKILL.md +0 -234
  179. package/skills/experience-agentforce-vibes-in-react-configure/SKILL.md +0 -63
  180. package/skills/experience-apex-components-configure/SKILL.md +0 -69
  181. package/skills/experience-apex-pages-configure/SKILL.md +0 -107
  182. package/skills/experience-app-home-configure/SKILL.md +0 -76
  183. package/skills/experience-aura-lightning-out-access-configure/SKILL.md +0 -58
  184. package/skills/experience-briefcase-configure/SKILL.md +0 -287
  185. package/skills/experience-community-flexi-page-list-create/SKILL.md +0 -74
  186. package/skills/experience-community-template-definition-list-query/SKILL.md +0 -48
  187. package/skills/experience-community-theme-definition-list-query/SKILL.md +0 -38
  188. package/skills/experience-content-assets-configure/SKILL.md +0 -86
  189. package/skills/experience-custom-domain-create/SKILL.md +0 -727
  190. package/skills/experience-defer-rendering-workspace-page-setup-configure/SKILL.md +0 -41
  191. package/skills/experience-field-service-app-builder-configure/SKILL.md +0 -187
  192. package/skills/experience-flow-category-configure/SKILL.md +0 -117
  193. package/skills/experience-formula-configure/SKILL.md +0 -358
  194. package/skills/experience-global-actions-configure/SKILL.md +0 -69
  195. package/skills/experience-global-publisher-layouts-configure/SKILL.md +0 -79
  196. package/skills/experience-instrumentation-configure/SKILL.md +0 -64
  197. package/skills/experience-lex-engagement-configure/SKILL.md +0 -50
  198. package/skills/experience-lightning-bolt-open/SKILL.md +0 -12
  199. package/skills/experience-lightning-out-configure/SKILL.md +0 -129
  200. package/skills/experience-lightning-preview-configure/SKILL.md +0 -67
  201. package/skills/experience-lightning-types-query/SKILL.md +0 -98
  202. package/skills/experience-malware-scan-configure/SKILL.md +0 -71
  203. package/skills/experience-my-salesforce-configure/SKILL.md +0 -126
  204. package/skills/experience-navigation-menus-configure/SKILL.md +0 -235
  205. package/skills/experience-notification-types-configure/SKILL.md +0 -206
  206. package/skills/experience-notifications-configure/SKILL.md +0 -75
  207. package/skills/experience-record-discovery-query/SKILL.md +0 -227
  208. package/skills/experience-regenerate-previews-open/SKILL.md +0 -94
  209. package/skills/experience-sales-cloud-mab-configure/SKILL.md +0 -254
  210. package/skills/experience-schema-builder-open/SKILL.md +0 -38
  211. package/skills/experience-simple-record-home-configure/SKILL.md +0 -110
  212. package/skills/experience-static-resources-configure/SKILL.md +0 -74
  213. package/skills/field-service-setup-coordinate/SKILL.md +0 -62
  214. package/skills/field-service-work-plan-configure/SKILL.md +0 -253
  215. package/skills/fsc-actionable-segmentation-settings-configure/SKILL.md +0 -180
  216. package/skills/fsc-digital-origination-bre-decision-matrix-foundation-create/SKILL.md +0 -196
  217. package/skills/fsc-digital-origination-bre-disclosures-consent-configure/SKILL.md +0 -106
  218. package/skills/fsc-digital-origination-bre-document-upload-configure/SKILL.md +0 -96
  219. package/skills/fsc-digital-origination-bre-permissions-assign/SKILL.md +0 -111
  220. package/skills/fsc-digital-origination-bre-setup-coordinate/SKILL.md +0 -250
  221. package/skills/fsc-digital-origination-bre-stp-eligibility-configure/SKILL.md +0 -122
  222. package/skills/fsc-digital-origination-coordinate/SKILL.md +0 -653
  223. package/skills/fsc-digital-origination-demo-run/SKILL.md +0 -225
  224. package/skills/fsc-digital-origination-execution-guardrails-validate/SKILL.md +0 -112
  225. package/skills/fsc-digital-origination-initial-setup-configure/SKILL.md +0 -396
  226. package/skills/fsc-digital-origination-pricing-setup-coordinate/SKILL.md +0 -336
  227. package/skills/fsc-digital-origination-pricing-setup-data-foundation-create/SKILL.md +0 -208
  228. package/skills/fsc-digital-origination-pricing-setup-procedure-create/SKILL.md +0 -375
  229. package/skills/fsc-digital-origination-product-setup-act1-permissions-assign/SKILL.md +0 -83
  230. package/skills/fsc-digital-origination-product-setup-coordinate/SKILL.md +0 -248
  231. package/skills/fsc-digital-origination-sample-data-create/SKILL.md +0 -206
  232. package/skills/fsc-document-checklist-settings-configure/SKILL.md +0 -57
  233. package/skills/fsc-flexible-hierarchy-configure/SKILL.md +0 -148
  234. package/skills/fsc-flexible-hierarchy-foundation-configure/SKILL.md +0 -1430
  235. package/skills/fsc-flexible-hierarchy-graph-config-create/SKILL.md +0 -471
  236. package/skills/fsc-flexible-hierarchy-rule-based-graph-deploy/SKILL.md +0 -429
  237. package/skills/fsc-pricing-product-configurator-configure/SKILL.md +0 -150
  238. package/skills/fsc-pricing-salesforce-omnistudio-switch/SKILL.md +0 -123
  239. package/skills/fsc-product-act2-catalog-categories-create/SKILL.md +0 -82
  240. package/skills/fsc-product-act3-attributes-create/SKILL.md +0 -249
  241. package/skills/fsc-product-act4-classification-assignment-create/SKILL.md +0 -196
  242. package/skills/fsc-product-act5-considerations-get/SKILL.md +0 -44
  243. package/skills/fsc-stage-management-apex-flow-deploy/SKILL.md +0 -384
  244. package/skills/fsc-stage-management-compliant-data-sharing-configure/SKILL.md +0 -144
  245. package/skills/fsc-stage-management-decision-matrices-create/SKILL.md +0 -107
  246. package/skills/fsc-stage-management-definition-assignments-create/SKILL.md +0 -189
  247. package/skills/fsc-stage-management-definition-create/SKILL.md +0 -108
  248. package/skills/fsc-stage-management-permissions-assign/SKILL.md +0 -143
  249. package/skills/fsc-stage-management-transitions-configure/SKILL.md +0 -139
  250. package/skills/health-cloud-appt-booking-config-configure/SKILL.md +0 -135
  251. package/skills/health-cloud-appt-booking-url-config-configure/SKILL.md +0 -134
  252. package/skills/health-cloud-care-provider-affl-role-config-configure/SKILL.md +0 -136
  253. package/skills/health-cloud-care-provider-search-config-configure/SKILL.md +0 -134
  254. package/skills/health-cloud-care-requests-create/SKILL.md +0 -178
  255. package/skills/health-cloud-initial-configure/SKILL.md +0 -511
  256. package/skills/health-cloud-patient-appointment-scheduling-configure/SKILL.md +0 -1374
  257. package/skills/health-cloud-provider-search-settings-configure/SKILL.md +0 -924
  258. package/skills/health-cloud-referral-management-coordinate/SKILL.md +0 -513
  259. package/skills/health-cloud-timeline-configure/SKILL.md +0 -622
  260. package/skills/health-cloud-virtual-visit-config-configure/SKILL.md +0 -135
  261. package/skills/industries-account-score-settings-query/SKILL.md +0 -78
  262. package/skills/industries-actionable-list-data-sources-dmo-configure/SKILL.md +0 -177
  263. package/skills/industries-ad-product-availability-search/SKILL.md +0 -399
  264. package/skills/industries-advanced-account-forecast-settings-configure/SKILL.md +0 -628
  265. package/skills/industries-advanced-therapy-management-settings-configure/SKILL.md +0 -73
  266. package/skills/industries-atm-settings-starter-configure/SKILL.md +0 -76
  267. package/skills/industries-batch-document-ai-configure/SKILL.md +0 -196
  268. package/skills/industries-behavioral-health-app-settings-configure/SKILL.md +0 -71
  269. package/skills/industries-branch-management-settings-configure/SKILL.md +0 -89
  270. package/skills/industries-bre-decision-table-access-configure/SKILL.md +0 -367
  271. package/skills/industries-brokerage-settings-configure/SKILL.md +0 -41
  272. package/skills/industries-calendar-sync-settings-configure/SKILL.md +0 -89
  273. package/skills/industries-care-request-settings-configure/SKILL.md +0 -218
  274. package/skills/industries-case-management-intelligence-settings-configure/SKILL.md +0 -54
  275. package/skills/industries-catalog-process-attributes-products-configure/SKILL.md +0 -380
  276. package/skills/industries-catalog-process-fulfillment-configure/SKILL.md +0 -216
  277. package/skills/industries-catalog-process-intake-configure/SKILL.md +0 -219
  278. package/skills/industries-catalog-process-knowledge-configure/SKILL.md +0 -153
  279. package/skills/industries-catalog-process-preprocessor-configure/SKILL.md +0 -168
  280. package/skills/industries-cds-general-settings-configure/SKILL.md +0 -69
  281. package/skills/industries-claim-financial-settings-configure/SKILL.md +0 -169
  282. package/skills/industries-clinical-data-model-settings-configure/SKILL.md +0 -136
  283. package/skills/industries-clinical-data-model-settings-starter-configure/SKILL.md +0 -105
  284. package/skills/industries-collection-plan-settings-configure/SKILL.md +0 -132
  285. package/skills/industries-comms-service-console-settings-configure/SKILL.md +0 -159
  286. package/skills/industries-compliance-configure/SKILL.md +0 -102
  287. package/skills/industries-compliance-document-extraction-setup-configure/SKILL.md +0 -76
  288. package/skills/industries-contact-center-app-layout-configure/SKILL.md +0 -88
  289. package/skills/industries-contact-center-components-configure/SKILL.md +0 -96
  290. package/skills/industries-contact-center-path-knowledge-configure/SKILL.md +0 -95
  291. package/skills/industries-contact-center-user-access-assign/SKILL.md +0 -96
  292. package/skills/industries-course-waitlist-config-configure/SKILL.md +0 -162
  293. package/skills/industries-crisis-center-settings-configure/SKILL.md +0 -84
  294. package/skills/industries-custom-object-settings-configure/SKILL.md +0 -94
  295. package/skills/industries-data-cloud-integration-configure/SKILL.md +0 -88
  296. package/skills/industries-data-space-feature-mappings-configure/SKILL.md +0 -245
  297. package/skills/industries-decision-matrix-builder-configure/SKILL.md +0 -78
  298. package/skills/industries-decision-table-hbase-configure/SKILL.md +0 -87
  299. package/skills/industries-decision-table-version-configure/SKILL.md +0 -74
  300. package/skills/industries-decision-tables-builder-configure/SKILL.md +0 -253
  301. package/skills/industries-decision-tables-configure/SKILL.md +0 -439
  302. package/skills/industries-energy-utilities-configure/SKILL.md +0 -251
  303. package/skills/industries-eu-cloud-multisite-configure/SKILL.md +0 -1008
  304. package/skills/industries-eu-new-connections-configure/SKILL.md +0 -30
  305. package/skills/industries-explainability-msg-template-configure/SKILL.md +0 -135
  306. package/skills/industries-expression-set-message-token-configure/SKILL.md +0 -135
  307. package/skills/industries-field-service-settings-configure/SKILL.md +0 -82
  308. package/skills/industries-form-framework-settings-configure/SKILL.md +0 -30
  309. package/skills/industries-fsc-ai-settings-configure/SKILL.md +0 -57
  310. package/skills/industries-fsc-association-engine-settings-configure/SKILL.md +0 -172
  311. package/skills/industries-fsc-b2b-settings-configure/SKILL.md +0 -61
  312. package/skills/industries-fsc-insurance-settings-configure/SKILL.md +0 -58
  313. package/skills/industries-fsc-visa-fulfillment-setup-configure/SKILL.md +0 -103
  314. package/skills/industries-fsc-wealth-agent-settings-configure/SKILL.md +0 -117
  315. package/skills/industries-fsc-wealth-settings-configure/SKILL.md +0 -99
  316. package/skills/industries-fundraising-gift-entry-settings-configure/SKILL.md +0 -120
  317. package/skills/industries-fundraising-rfm-configure/SKILL.md +0 -128
  318. package/skills/industries-fundraising-settings-configure/SKILL.md +0 -145
  319. package/skills/industries-fundraising-source-code-gen-configure/SKILL.md +0 -299
  320. package/skills/industries-google-maps-api-key-settings-configure/SKILL.md +0 -87
  321. package/skills/industries-grantmaking-intelligence-settings-open/SKILL.md +0 -58
  322. package/skills/industries-hc-score-category-settings-configure/SKILL.md +0 -167
  323. package/skills/industries-health-engagement-settings-configure/SKILL.md +0 -218
  324. package/skills/industries-home-health-agentforce-setup-configure/SKILL.md +0 -131
  325. package/skills/industries-home-health-bundling-policy-create/SKILL.md +0 -50
  326. package/skills/industries-home-health-entity-labels-configure/SKILL.md +0 -29
  327. package/skills/industries-home-health-fsl-package-deploy/SKILL.md +0 -71
  328. package/skills/industries-home-health-fsl-settings-validate/SKILL.md +0 -27
  329. package/skills/industries-home-health-guided-setup-care-and-skill-get/SKILL.md +0 -80
  330. package/skills/industries-home-health-guided-setup-configure/SKILL.md +0 -836
  331. package/skills/industries-home-health-guided-setup-enable-org-fsl-get/SKILL.md +0 -55
  332. package/skills/industries-home-health-guided-setup-get-org-ready-get/SKILL.md +0 -61
  333. package/skills/industries-home-health-licenses-assign/SKILL.md +0 -27
  334. package/skills/industries-home-health-operating-hours-create/SKILL.md +0 -40
  335. package/skills/industries-home-health-scheduling-policy-create/SKILL.md +0 -41
  336. package/skills/industries-home-health-service-objective-create/SKILL.md +0 -22
  337. package/skills/industries-home-health-skills-create/SKILL.md +0 -31
  338. package/skills/industries-home-health-users-create/SKILL.md +0 -29
  339. package/skills/industries-icm-act3-toggles-configure/SKILL.md +0 -198
  340. package/skills/industries-icm-act5-genai-suggested-assessments-configure/SKILL.md +0 -361
  341. package/skills/industries-icm-act6-mcg-integration-configure/SKILL.md +0 -550
  342. package/skills/industries-integrated-care-management-configure/SKILL.md +0 -168
  343. package/skills/industries-object-enablement-configure/SKILL.md +0 -86
  344. package/skills/industries-tpm-system-processing-service-configure/SKILL.md +0 -64
  345. package/skills/integration-apex-settings-configure/SKILL.md +0 -61
  346. package/skills/marketing-e360-email-archiving-configure/SKILL.md +0 -73
  347. package/skills/platform-custom-permissions-configure/SKILL.md +0 -687
  348. package/skills/platform-label-workbench-import-create/SKILL.md +0 -67
  349. package/skills/platform-privacy-agent-settings-configure/SKILL.md +0 -752
@@ -1,219 +0,0 @@
1
- ---
2
- name: industries-catalog-process-intake-configure
3
- description: "Use this skill when users want to cHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Trigger when users mention configure, unified, catalog, service, process, intake, automation, connect, api, service-automation-connect-api."
4
- metadata:
5
- version: "1.0"
6
- accessCheck: "IndustriesEpc.orgHasUnifiedCatalog"
7
- ---
8
-
9
- # Managing Configure Unified Catalog Service Process Intake
10
-
11
- ## When to Use This Skill
12
-
13
- CHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Run standalone against an existing process (supply its catalogItemId), or as the phase that orchestrator routes to; for a NEW end-to-end process start at create-unified-catalog-service-process, which asks the creation fork FIRST.
14
- Use this when an admin wants to add or swap the intake form (request form) on a service process — e.g. "generate a Flow intake form for my order-replacement process" or "attach my existing OmniScript to this service process". DONE when a Flow or OmniScript surface is bound to the process and reads back on the verify GET with the anchor still intact. Org-gated on Unified Catalog. Two user decisions drive the branch — surface type (Flow / OmniScript) and mode (generate-new / attach-existing) — both enforced in preconditions and choice_points; step mechanics and the DETACH TRAP are in agent_guidance and step assertions.
15
-
16
- ## Critical Constraints
17
-
18
- **Preconditions:**
19
-
20
- - Org must have Unified Catalog enabled.
21
- (check: `Unified Product Catalog enabled`)
22
- - HARD CONSTRAINT — the service process must ALREADY EXIST and its catalogItemId (== productId) must be known before this workflow runs. The first step (resolve-catalog-item) GETs the item to confirm it exists and is usedFor=ServiceProcess before any write; a 404 there means the id is wrong or the process was never created — the process must be created first, then re-run here with its catalogItemId.
23
- (check: `process_exists_with_known_catalog_item_id`)
24
- - HARD CONSTRAINT — a service process should have its intake ATTRIBUTES saved before a surface is generated. generate-intake-form-flow builds the surface FROM the process's saved attributes; generating against a process with no attributes yields an empty form, and a malformed attribute can make generation fail. Confirm the process has its attributes (GET the item and check sections[] is non-empty) before choosing generate-new. If generation fails on a malformed attribute, the fix is on the process's attribute definitions, not in this workflow. Attach-existing is unaffected by this — it binds a pre-built surface.
25
- (check: `attributes_saved_before_generate`)
26
- - HARD CONSTRAINT — the SURFACE TYPE (Flow vs OmniScript) MUST be elicited from the user, never defaulted. It changes which generate endpoint / list endpoint is used and the `type` sent when binding. Do NOT assume Flow.
27
- (check: `user_has_chosen_surface_type`)
28
- - HARD CONSTRAINT — the MODE (generate a new surface vs attach an existing one) MUST be elicited from the user, never defaulted. Generate-new mints a fresh surface from the saved attributes; attach-existing binds a surface the org already has. Ask which one.
29
- (check: `user_has_chosen_intake_mode`)
30
- - HARD CONSTRAINT — GENERATE-NEW is supported for Flow ONLY. An OmniScript intake surface can only be ATTACHED from an OmniScript that already exists in the org (attach-existing); there is no supported generate-new-OmniScript path in this workflow (getting OmniScript generation working requires changes in the OmniScript Builder and the Unified Catalog headless design-time experience, out of scope here). If the user chose surface-type Omniscript, the mode MUST be attach-existing — do NOT attempt to generate an OmniScript.
31
- (check: `omniscript_is_attach_existing_only`)
32
- - HARD CONSTRAINT (attach-existing only) — the surface to attach MUST be a real id taken from the matching list step (list-screen-flows for Flow, list-omniscript-records for OmniScript) for THIS org. Never guess or hand-construct a Flow/OmniScript id. List the eligible surfaces, let the user pick one, and bind that exact id as intakeForm.intakeFormId.
33
- (check: `attached_surface_is_a_real_listed_id`)
34
- - HARD CONSTRAINT (every branch — the bind runs in generate-new AND attach-existing) — binding via patchCatalogItemGet with operationType:"Update" is a FULL overwrite: it MUST re-send the item's identity fields (targetObject, name, usedFor, isActive). Omitting targetObject CLEARS the anchor (it reads back absent on the next GET, NOT reset to a default) even after it was set at create time. The bind PATCH always carries these four fields; the verify GET confirms the anchor is unchanged.
35
- (check: `bind_patch_resends_anchor_identity_fields`)
36
- - HARD CONSTRAINT — if the process ALREADY HAS a surface bound (resolve-catalog-item returned a non-empty intakeForm.intakeFormId), binding a new one REPLACES it: the old surface is unbound (and, for a just-generated surface, the previous one is left orphaned in the org). This is a destructive swap of a live request form. CONFIRM with the user before binding — show the currently-bound surface (existing_intake_form_surface / existing_intake_form_type) and ask whether to replace it. If the item has no surface bound, this is a first attach and no confirmation is needed. This applies to EVERY branch, because the replacement always happens at bind-existing-surface (which runs in both generate-new and attach-existing), never at the generate step: a generate call on an already-bound item does NOT overwrite the binding on its own — it mints an orphan surface and leaves the old binding in place; only the follow-up bind performs the swap, which is exactly why the confirmation gates the bind, in whichever mode reached it.
37
- (check: `replace_existing_surface_confirmed`)
38
-
39
- **Operational rules:**
40
-
41
- - MUST-DO CONTRACT (read before executing — each rule is enforced by the named precondition/step; do NOT skip because the detail is further down):
42
- 1. CONFIRM the process exists first — run resolve-catalog-item (GET) and capture its
43
- identity fields (name, usedFor, isActive, targetObject) and current intakeForm.id.
44
- A 404 means the catalogItemId is wrong; do NOT proceed.
45
- [precondition: process_exists_with_known_catalog_item_id]
46
- 2. ELICIT BOTH decisions up front: surface type (Flow / OmniScript) and mode
47
- (generate-new / attach-existing). Never default either.
48
- [preconditions: user_has_chosen_surface_type, user_has_chosen_intake_mode]
49
- 3. GENERATE-NEW (FLOW ONLY): call generate-intake-form-flow with the process's productId
50
- (== catalogItemId) to mint a Flow (type=Flow) FROM the saved attributes; it returns the
51
- id but does NOT reliably attach it — you MUST then run bind-existing-surface with the
52
- returned id to attach it. Confirm the process has attributes first. OmniScript has NO
53
- generate-new path — use attach-existing for OmniScript.
54
- [preconditions: attributes_saved_before_generate, omniscript_is_attach_existing_only]
55
- 4. ATTACH-EXISTING: list via the matching step (list-screen-flows — the UIAPI GraphQL
56
- FlowRecord query the UI itself uses — for Flow; list-omniscript-records for
57
- OmniScript), present the COMPLETE set as numbered text, let the user type their pick,
58
- then bind that exact id via bind-existing-surface. For a Flow, bind the
59
- node.FlowDefinition.value (300-prefix definition id), NOT the 2aF version-view id.
60
- [precondition: attached_surface_is_a_real_listed_id]
61
- 5. The bind PATCH is a FULL overwrite — ALWAYS re-send targetObject + name + usedFor +
62
- isActive, and carry the existing intakeForm.id forward, or the anchor is CLEARED
63
- (reads back absent, not reset to a default) and/or a previously attached surface detaches.
64
- [precondition: bind_patch_resends_anchor_identity_fields]
65
- 6. IF a surface is ALREADY BOUND (resolve-catalog-item.existing_intake_form_surface is
66
- non-empty), binding replaces it — the old surface is unbound (generate-new also leaves
67
- the freshly minted one orphaned until bind swaps it). This is a destructive swap of a
68
- live request form: show the user the currently-bound surface and CONFIRM before binding.
69
- First attach (no surface bound) needs no confirmation.
70
- [precondition: replace_existing_surface_confirmed]
71
- 7. VERIFY: GET the item and confirm intakeForm.intakeFormId + intakeForm.type are the
72
- chosen surface AND targetObject is unchanged. [step: verify-intake]
73
- - ASK MODALITY: use a structured picker for the two small bounded choices (surface type, mode). For the attach-existing surface list (Flows / OmniScripts), which is unbounded, list the COMPLETE set as numbered text (name, apiName/uniqueName, id) and let the user type their selection; PRESENT smartly — match a named target locally, list a small set in full, and narrow a large one (typed name or a recent top slice) rather than dumping every row. The Flow list is a paged GraphQL query (first:2000 + pageInfo.hasNextPage/endCursor) — page through to completeness before asking.
74
- TIMING: ask surface type + mode up front (they select the branch), then run only the steps that apply to the chosen branch (the rest are guarded by applies_when).
75
- BRANCHES (2 modes × N surface types — exactly one surface-source path runs, then a common bind):
76
- - generate-new (FLOW ONLY): call generate-intake-form-flow to MINT the Flow (it returns the
77
- id but does not reliably attach). OmniScript has no generate-new path.
78
- - attach-existing: call the surface-specific lister and let the user pick. Flow ->
79
- list-screen-flows; OmniScript -> list-omniscript-records.
80
- Both modes then converge on bind-existing-surface (the single attach step, runs in every branch) with the surface id + type, and end with verify-intake. EXTENDING to a new surface type (e.g. a future LWC form): add it to choice_points[surface-type].options, add its own generator + lister steps (each guarded by applies_when on the new surface-type value), and ensure bind-existing-surface.surfaceType accepts the new wire value. No change to the mode logic, the anchor handling, or verify.
81
-
82
- ## Verification Checklist
83
-
84
- After every write operation, confirm the effect by re-reading state:
85
-
86
- - After `resolve-catalog-item`, `generate-intake-form-flow`, `bind-existing-surface`: call `verify-intake` (`GET /connect/service-automation/catalog/catalog-item/{catalogItemId}`)
87
-
88
- ## Operations Reference
89
-
90
- Operations grouped by purpose. Use these as the building blocks for the workflows above.
91
-
92
- ### Summary
93
-
94
- | Operation | Purpose | Status | Call | Depends on |
95
- |-----------|---------|--------|------|------------|
96
- | `resolve-catalog-item` | read | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | — |
97
- | `generate-intake-form-flow` | write | implemented | `POST /connect/service-automation/intake-form/generate-intake-form` | `resolve-catalog-item` |
98
- | `list-screen-flows` | read | implemented | `queryScreenFlows` | `resolve-catalog-item` |
99
- | `list-omniscript-records` | read | proposed | `GET /headless/invoke/platform/service-process-wizard-setup/get-omniscript-records` | `resolve-catalog-item` |
100
- | `bind-existing-surface` | write | implemented | `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `generate-intake-form-flow`, `list-screen-flows`, `list-omniscript-records` |
101
- | `verify-intake` | verify | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `generate-intake-form-flow`, `bind-existing-surface` |
102
-
103
- ### Dependency graph
104
-
105
- ```mermaid
106
- graph TD
107
- resolve_catalog_item["resolve-catalog-item (read)"]
108
- generate_intake_form_flow["generate-intake-form-flow (write)"]
109
- list_screen_flows["list-screen-flows (read)"]
110
- list_omniscript_records["list-omniscript-records (read)"]
111
- bind_existing_surface["bind-existing-surface (write)"]
112
- verify_intake["verify-intake (verify)"]
113
- resolve_catalog_item --> generate_intake_form_flow
114
- resolve_catalog_item --> list_screen_flows
115
- resolve_catalog_item --> list_omniscript_records
116
- resolve_catalog_item --> bind_existing_surface
117
- generate_intake_form_flow --> bind_existing_surface
118
- list_screen_flows --> bind_existing_surface
119
- list_omniscript_records --> bind_existing_surface
120
- resolve_catalog_item --> verify_intake
121
- generate_intake_form_flow --> verify_intake
122
- bind_existing_surface --> verify_intake
123
- ```
124
-
125
- ### Read operations
126
-
127
- #### `resolve-catalog-item`
128
-
129
- CONFIRM + CAPTURE — GET the existing service process to prove it exists and to capture the identity fields the later bind must re-send. Fails fast (404) if the catalogItemId is wrong or the process was never created. Capture name, usedFor, isActive, targetObject (the anchor) and the current intakeForm.id (the container minted at create time) — the bind step carries these forward to avoid the DETACH TRAP.
130
-
131
-
132
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
133
-
134
- **Inputs:**
135
-
136
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the EXISTING service process. If the user does not have it, the process must be created first before this workflow can run.
137
-
138
- #### `list-screen-flows`
139
-
140
- ATTACH-EXISTING, FLOW — list the org's active Screen Flows via UIAPI GraphQL: FlowRecord filtered to FlowType=="Screen" AND ProgressStatus=="InProgress" (InProgress is the active-version state). Present the COMPLETE set as numbered text (Name, FlowRecord_ApiName, and the bindable definition id) and let the user type their pick; page via pageInfo.endCursor (first:2000 + hasNextPage) — PRESENT smartly: if the user already NAMED the target, match it in the fetched set and show only the matches; if the set is small (≤ ~25) list it all as numbered text; if it is large, do NOT dump every row — show the most-recently-modified top slice (or ask a narrowing keyword) and invite the user to type a name to search (the full set is already fetched, so the local match stays exact). TARGETED LOOKUP: when the user has already NAMED the flow, add a label predicate to the where filter — {FlowLabel: {like: "%<name>%"}}, AND-combined with the FlowType/ProgressStatus filters above — to fetch just the matches in ONE call instead of paging the whole list; fall back to the full paged listing only when no name was given or the filtered query returns nothing. The list is org-specific — take it from this call, never a fixed list. ID TO BIND: the node.Id here is the FlowRecord (version-view) id (2aF… prefix). The id the catalog-item bind wants as intakeForm.intakeFormId is the FLOW DEFINITION id (300… prefix) — the same shape the generate path returns. Read it from node.FlowDefinition.value; for org-authored flows it is populated (a 300-prefixed FlowDefinition id). Managed-package standard flows show FlowDefinition==null and are generally not offered as custom intake surfaces; prefer flows with a non-null FlowDefinition.value.
141
-
142
-
143
- **Call:** `queryScreenFlows` — status: `implemented`
144
-
145
- **Depends on:** `resolve-catalog-item`
146
-
147
- #### `list-omniscript-records`
148
-
149
- ATTACH-EXISTING, OMNISCRIPT — list the OmniScripts selectable as a service-process intake surface. Present the COMPLETE set as numbered text (name, uniqueName, type/subType, id) and let the user type their pick; PRESENT smartly — match a named target locally, list a small set in full, and narrow a large one (typed name or a recent top slice) rather than dumping every row. TARGETED LOOKUP: this controller returns the full active set with NO server-side name filter, so when the user has already NAMED the OmniScript, match it by name/uniqueName in the returned array and offer just those rows rather than making the user scroll the whole list. The chosen record's id becomes intakeForm.intakeFormId on the bind.
150
-
151
-
152
- **Call:** `GET /headless/invoke/platform/service-process-wizard-setup/get-omniscript-records` — status: `proposed`
153
-
154
- **Depends on:** `resolve-catalog-item`
155
-
156
- ### Write operations
157
-
158
- #### `generate-intake-form-flow`
159
-
160
- GENERATE-NEW, FLOW — mint a new Screen Flow request form from the process's saved attributes. Sends {name, description, productId, type:"Flow"}; the server builds the Flow from the item's sections/attributes and returns 201 with the new Flow definition id (300-prefix). ATTACH IS NOT GUARANTEED BY GENERATE: the mint call does NOT reliably leave the Flow bound to the item — a follow-up bind PATCH (see bind-existing-surface) is required, passing the returned 300-prefix id as intakeForm.intakeFormId with type:"Flow" and re-sending the anchor identity fields (DETACH TRAP). Requires the process to already have its attributes saved (see the attributes_saved_before_generate precondition). PRODUCT-COLLECTION PRECONDITION: if the process uses a product collection, that collection must already sit on its own dedicated ProductRequestSection layout page BEFORE generating (see configure-unified-catalog-service-process-attributes-and-product-collection) — a collection left on the attribute section or in the unplaced bucket generates a Flow with NO product-selection screen.
161
-
162
-
163
- **Call:** `POST /connect/service-automation/intake-form/generate-intake-form` — status: `implemented`
164
-
165
- **Inputs:**
166
-
167
- - `productId` *(`String`)* — The catalogItemId (== productId) of the process to generate the Flow for.
168
- - `name` *(`String`)* — Human-readable name for the generated intake Flow (the request-form label). Elicit it; do not default silently.
169
-
170
- - `description` *(`String`)* — Description of the intake Flow. The Generate Intake Form UI marks this REQUIRED (Form Title + Description are both mandatory in the wizard) — elicit it, do not send empty.
171
-
172
-
173
- **Depends on:** `resolve-catalog-item`
174
-
175
- **Rollback:** Generate only MINTS the Flow; if bind-existing-surface has since attached it, detach via patchCatalogItemGet with intakeForm operationType semantics (see bind-existing-surface — re-send the anchor identity fields); the intake-form resource has no DELETE. If bind has not run, the minted Flow is orphaned metadata. Either way the Flow metadata itself is cleaned up through Flow tooling, not this API.
176
-
177
- #### `bind-existing-surface`
178
-
179
- BIND — attach a Flow/OmniScript surface to the process via patchCatalogItemGet, sending intakeForm:{id:<existing container id>, intakeFormId:<surface id>, operationType:"Update", type:<Flow|Omniscript>}. This is the SINGLE attach mechanism for ALL branches: in generate-new it binds the surface the generate step just minted (generate does NOT auto-attach); in attach-existing it binds the surface the user picked from a list. DETACH TRAP: operationType:"Update" is a FULL overwrite — this PATCH MUST also re-send the item's identity fields (targetObject, name, usedFor, isActive), sourced from resolve-catalog-item. Omitting targetObject CLEARS the anchor (it reads back absent, not reset to a default); omitting name/usedFor clears them too. Carry resolve-catalog-item.intake_form_id forward as intakeForm.id when the item already has a container (it does, if create provisioned one); omit it only if resolve-catalog-item returned no intakeForm.id. REPLACE GUARD: if resolve-catalog-item.existing_intake_form_surface is non-empty, this bind REPLACES the currently-bound surface — confirm the swap with the user first [precondition: replace_existing_surface_confirmed].
180
-
181
-
182
- **Call:** `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
183
-
184
- **Inputs:**
185
-
186
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to bind the surface to.
187
- - `intakeFormSurfaceId` *(`String`)* — The surface id to bind, sourced by mode. GENERATE-NEW (FLOW ONLY): the id returned by generate-intake-form-flow.intake_form_id (a 300-prefix Flow definition id). ATTACH-EXISTING: the user's pick — for a Flow, node.FlowDefinition.value (300-prefix definition id) from list-screen-flows.flow_definition_ids; for an OmniScript, an id from list-omniscript-records.omniscript_ids. In every case it MUST be a real id from the generate response or the org's list, never hand-constructed, and for Flow it must be the definition id (300…), NOT the 2aF version-view id. Sent as intakeForm.intakeFormId.
188
-
189
- - **Source:** output of `list-screen-flows`, `list-omniscript-records`
190
- - `surfaceType` *(`String`)* — "Flow" or "Omniscript" (note the lower-case s on the wire) — the chosen surface type. Sent as intakeForm.type.
191
-
192
- - `containerId` *(`String`)* — The existing intake container id (intakeForm.id) from resolve-catalog-item, carried forward as intakeForm.id so the Update does not orphan the container. Omit only when resolve-catalog-item returned no intakeForm.id.
193
-
194
- - **Source:** output of `resolve-catalog-item`
195
- - `targetObject` *(`String`)* — The anchor object — a CLOSED enum accepting only Case, Incident, or ServiceRequest. Re-sent to avoid the DETACH TRAP [precondition: bind_patch_resends_anchor_identity_fields]. Take the value from resolve-catalog-item, never a fixed assumption.
196
-
197
- - **Source:** output of `resolve-catalog-item`
198
- - `name` *(`String`)* — The process name — re-sent to preserve identity on this full-overwrite Update.
199
- - `usedFor` *(`String`)* — The usedFor value (ServiceProcess) — re-sent to preserve identity.
200
- - `isActive` *(`Boolean`)* — The isActive flag — re-sent to preserve identity.
201
-
202
- **Depends on:** `resolve-catalog-item`, `generate-intake-form-flow`, `list-screen-flows`, `list-omniscript-records`
203
-
204
- **Rollback:** To unbind, re-invoke patchCatalogItemGet clearing/replacing intakeForm.intakeFormId (or binding a different surface), always re-sending the anchor identity fields. The catalog-item resource has no DELETE method.
205
-
206
- ### Verify operations
207
-
208
- #### `verify-intake`
209
-
210
- Read the process back and confirm the intake surface is bound and the anchor held. Works for every branch — generate-new (Flow) and attach-existing (Flow or OmniScript).
211
-
212
-
213
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
214
-
215
- **Inputs:**
216
-
217
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to verify.
218
-
219
- **Depends on:** `resolve-catalog-item`, `generate-intake-form-flow`, `bind-existing-surface`
@@ -1,153 +0,0 @@
1
- ---
2
- name: industries-catalog-process-knowledge-configure
3
- description: "Use this skill when users want to cHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Trigger when users mention configure, unified, catalog, service, process, knowledge, automation, connect, api, service-automation-connect-api."
4
- metadata:
5
- version: "1.0"
6
- accessCheck: "IndustriesEpc.orgHasUnifiedCatalog"
7
- ---
8
-
9
- # Managing Configure Unified Catalog Service Process Knowledge
10
-
11
- ## When to Use This Skill
12
-
13
- CHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Run standalone against an existing process (supply its catalogItemId), or as the phase that orchestrator routes to; for a NEW end-to-end process start at create-unified-catalog-service-process, which asks the creation fork FIRST.
14
- Use this when an admin wants to add (or remove) the Knowledge articles shown on a service process that ALREADY EXISTS — e.g. "attach the reimbursement-policy article to this service process". DONE when the chosen articles read back in associatedArticles on the verify GET with the anchor still intact. Org-gated on Unified Catalog. This attaches EXISTING published articles; it does not author or publish an article. associatedArticles is a DELTA list: send ONLY the change — a new article as operationType:"Create", a removal as operationType:"Delete" carrying that article's association id — never re-send the already-attached ones (re-sending an attached article as "Create" is rejected 400 "already attached"). DETACH-TRAP handling and the delta-list rules are in agent_guidance and step assertions.
15
-
16
- ## Critical Constraints
17
-
18
- **Preconditions:**
19
-
20
- - Org must have Unified Catalog enabled.
21
- (check: `Unified Product Catalog enabled`)
22
- - HARD CONSTRAINT — the service process must ALREADY EXIST and its catalogItemId (== productId) must be known before this workflow runs. The first step (resolve-catalog-item) GETs the item to confirm it exists and is usedFor=ServiceProcess before any write; a 404 there means the id is wrong or the process was never created — the process must be created first, then re-run here with its catalogItemId.
23
- (check: `process_exists_with_known_catalog_item_id`)
24
- - HARD CONSTRAINT — each article to associate MUST be a real KnowledgeArticleId taken from the list step (list-knowledge-articles) for THIS org. Never guess or hand-construct an article id. Only PUBLISHED (Online) articles are listable/associable. List the eligible articles, let the user pick one or more, and bind those exact ids.
25
- (check: `attached_article_is_a_real_listed_id`)
26
- - HARD CONSTRAINT — associatedArticles on patchCatalogItemGet is a DELTA list, NOT a full replacement. Send ONLY the entries that change; the articles already attached stay attached without being re-sent. To ADD an article, send just that one as operationType:"Create". To REMOVE one, send just that one as operationType:"Delete" carrying its association id (the associatedArticles[].id from resolve-catalog-item — a 1WK-prefix id; a Delete without that id is rejected). Do NOT re-send an already-attached article as "Create" — it is rejected 400 "This article is already attached to this record". (An already-attached article re-sent as "Update" does NOT error but CHURNS its association id — the 1WK id is replaced with a fresh one; the end set is unchanged but any 1WK id captured earlier goes stale. Never treat an association id as durable across a re-Update; always re-read it from a fresh GET before a Delete.) Confirm the final set on the verify GET.
27
- (check: `bind_sends_only_changed_articles`)
28
- - HARD CONSTRAINT — patchCatalogItemGet overwrites the item's scalar identity: the bind MUST re-send the item's identity fields (targetObject, name, usedFor, isActive). Omitting targetObject CLEARS the anchor — it reads back absent on the next GET, not reset to a default, even after it was set at create time. The intakeForm block is ALSO a full overwrite: sending it with only {id, operationType:Update} preserves the container but WIPES the bound surface (intakeFormId + type disappear). When the item has an intake surface, the bind MUST re-send intakeForm.intakeFormId AND intakeForm.type alongside the container id, not just the id. The bind PATCH always carries the four identity fields and re-sends the FULL intakeForm (id + intakeFormId + type) when one exists; the verify GET confirms the anchor and intake surface are intact.
29
- (check: `bind_patch_resends_anchor_identity_fields`)
30
-
31
- **Operational rules:**
32
-
33
- - MUST-DO CONTRACT (read before executing — each rule is enforced by the named precondition/step; do NOT skip because the detail is further down):
34
- 1. CONFIRM the process exists first — run resolve-catalog-item (GET) and capture its
35
- identity fields (name, usedFor, isActive, targetObject), its current intakeForm.id,
36
- and its CURRENT associatedArticles[] — each entry is {id, knowledgeArticleId}; the
37
- association id (1WK-prefix) is required to REMOVE that article later. A 404 means the
38
- catalogItemId is wrong; do NOT proceed.
39
- [precondition: process_exists_with_known_catalog_item_id]
40
- 2. LIST the org's PUBLISHED (Online) Knowledge articles via list-knowledge-articles,
41
- present the COMPLETE set as numbered text (Title, KnowledgeArticleId), and let the
42
- user pick one or more. [precondition: attached_article_is_a_real_listed_id]
43
- 3. BIND via patchCatalogItemGet sending ONLY the change — associatedArticles is a DELTA
44
- list, not a full replacement: send each NEWLY chosen article as operationType:"Create"
45
- (its knowledgeArticleId only); to REMOVE an article, send just that one as
46
- operationType:"Delete" carrying its association id from resolve-catalog-item. Do NOT
47
- re-send the already-attached articles — they stay attached, and re-sending an attached
48
- one as "Create" is rejected 400 "already attached".
49
- [precondition: bind_sends_only_changed_articles]
50
- 4. The bind PATCH is a FULL overwrite of the ITEM's scalar identity — ALWAYS re-send
51
- targetObject + name + usedFor + isActive. The intakeForm block is ALSO a full overwrite:
52
- when the item has an intake surface, re-send the FULL block — intakeForm.id AND
53
- intakeForm.intakeFormId AND intakeForm.type (operationType:Update). Sending only {id}
54
- preserves the container but WIPES the bound surface. Omit intakeForm only
55
- when the item has no surface. Otherwise the anchor clears (reads back absent) and/or the intake surface
56
- detaches. (The identity overwrite and the associatedArticles delta are independent: the
57
- scalars are replaced, the article list is a delta.)
58
- [precondition: bind_patch_resends_anchor_identity_fields]
59
- 5. VERIFY: GET the item and confirm associatedArticles contains the intended final set of
60
- knowledgeArticleIds AND targetObject is unchanged. [step: verify-articles]
61
- - ASK MODALITY: for the article list (unbounded), list the COMPLETE set as numbered text (Title, KnowledgeArticleId, LastModifiedDate) and let the user type one or more selections; present smartly (match a named target locally; list small sets in full; narrow a large set with a typed name rather than dumping every row — the full set is already fetched). The list is a paged GraphQL query (first:2000 + pageInfo.hasNextPage/endCursor) — page through to completeness before asking. Only Online (published) articles appear; a draft/archived article will not be listed and cannot be associated until published.
62
- TIMING: resolve → list → bind → verify. There is one write path; the add and remove semantics both flow through the associatedArticles[] delta on the bind — add sends a Create entry, remove sends a Delete entry carrying the association id.
63
-
64
- ## Verification Checklist
65
-
66
- After every write operation, confirm the effect by re-reading state:
67
-
68
- - After `resolve-catalog-item`, `bind-knowledge-articles`: call `verify-articles` (`GET /connect/service-automation/catalog/catalog-item/{catalogItemId}`)
69
-
70
- ## Operations Reference
71
-
72
- Operations grouped by purpose. Use these as the building blocks for the workflows above.
73
-
74
- ### Summary
75
-
76
- | Operation | Purpose | Status | Call | Depends on |
77
- |-----------|---------|--------|------|------------|
78
- | `resolve-catalog-item` | read | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | — |
79
- | `list-knowledge-articles` | read | implemented | `queryKnowledgeArticles` | `resolve-catalog-item` |
80
- | `bind-knowledge-articles` | write | implemented | `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `list-knowledge-articles` |
81
- | `verify-articles` | verify | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `bind-knowledge-articles` |
82
-
83
- ### Read operations
84
-
85
- #### `resolve-catalog-item`
86
-
87
- CONFIRM + CAPTURE — GET the existing service process to prove it exists and to capture the identity fields the later bind must re-send AND the CURRENT associatedArticles[]. Each associatedArticles entry is {id, knowledgeArticleId}: the id (1WK-prefix association id) is what a later Delete must carry to remove that article; the knowledgeArticleId tells you which articles are already attached so you don't try to re-add one (a re-add as "Create" is rejected 400 "already attached"). Fails fast (404) if the catalogItemId is wrong or the process was never created. Capture name, usedFor, isActive, targetObject (the anchor), the current intake surface (intakeForm.id AND intakeForm.intakeFormId + intakeForm.type — the bound Flow/OmniScript, NOT just the container id) and the current associatedArticles.
88
-
89
-
90
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
91
-
92
- **Inputs:**
93
-
94
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the EXISTING service process. If the user does not have it, the process must be created first before this workflow can run.
95
-
96
- #### `list-knowledge-articles`
97
-
98
- LIST — the org's PUBLISHED (Online) Knowledge articles via UIAPI GraphQL: Knowledge__kav filtered to PublishStatus=="Online". Present the COMPLETE set as numbered text (Title, KnowledgeArticleId, LastModifiedDate) and let the user pick one or more; page via pageInfo.endCursor (first:2000 + hasNextPage) — PRESENT smartly: if the user already NAMED the target, match it in the fetched set and show only the matches; if the set is small (≤ ~25) list it all as numbered text; if it is large, do NOT dump every row — show the most-recently-modified top slice (or ask a narrowing keyword) and invite the user to type a name to search (the full set is already fetched, so the local match stays exact). TARGETED LOOKUP: when the user has already NAMED the article, add a title predicate to the where filter — {Title: {like: "%<name>%"}}, AND-combined with the PublishStatus filter above — to fetch just the matches in ONE call instead of paging the whole list; fall back to the full paged listing only when no name was given or the filtered query returns nothing. The list is org-specific — take it from this call, never a fixed list. ID TO BIND: bind the node.KnowledgeArticleId.value (the kA0-prefix KnowledgeArticleId, the stable per-article id across versions), NOT node.Id (the per-version Knowledge__kav row id). associatedArticles.knowledgeArticleId expects the KnowledgeArticleId.
99
-
100
-
101
- **Call:** `queryKnowledgeArticles` — status: `implemented`
102
-
103
- **Depends on:** `resolve-catalog-item`
104
-
105
- ### Write operations
106
-
107
- #### `bind-knowledge-articles`
108
-
109
- ASSOCIATE BIND — change the process's associatedArticles[] via patchCatalogItemGet. DELTA LIST: associatedArticles is a delta, not a full replacement — send ONLY the entries that change. To ADD each newly chosen article, send {knowledgeArticleId, operationType:"Create"}; to REMOVE an article, send {id: <its 1WK association id from resolve-catalog-item>, knowledgeArticleId, operationType:"Delete"}. Do NOT re-send the already-attached articles — they stay attached, and re-sending an attached one as "Create" is rejected 400 "This article is already attached to this record". A Delete without the association id is also rejected — carry the id from resolve-catalog-item.existing_associated_articles. DETACH TRAP: this PATCH is a full overwrite of the ITEM's scalar identity — it MUST also re-send the item's identity fields (targetObject, name, usedFor, isActive), sourced from resolve-catalog-item. The intakeForm block is ALSO a full overwrite: when the item has an intake surface, re-send the FULL block — intakeForm.id (container) AND intakeForm.intakeFormId (the bound Flow/OmniScript) AND intakeForm.type, all from resolve-catalog-item, with operationType:"Update". Sending only {id, operationType:Update} preserves the container but WIPES the bound surface (intakeFormId + type vanish). Omit the intakeForm block only if resolve-catalog-item returned no intake_surface_id. Omitting targetObject CLEARS the anchor (it reads back absent on the next GET, not reset to a default). (The scalar identity is replaced; the associatedArticles list is a delta — the two behave independently in the same PATCH.)
110
-
111
-
112
- **Call:** `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
113
-
114
- **Inputs:**
115
-
116
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to associate the articles with.
117
- - `associatedArticles` *(`Array`)* — The DELTA of articles to change — send ONLY changed entries, never the already-attached ones. To ADD an article: {knowledgeArticleId, operationType:"Create"}, where knowledgeArticleId is a chosen id from list-knowledge-articles.article_ids (kA0-prefix KnowledgeArticleId, never hand-constructed) that is NOT already in resolve-catalog-item.existing_article_ids. To REMOVE an article: {id, knowledgeArticleId, operationType:"Delete"}, where id is that article's association id (1WK-prefix) from resolve-catalog-item.existing_associated_articles. Re-sending an already-attached article as "Create" is rejected 400 "already attached"; a Delete missing the association id is also rejected.
118
-
119
- - **Source:** output of `list-knowledge-articles`, `resolve-catalog-item`
120
- - `intakeContainerId` *(`String`)* — The existing intake container id (intakeForm.id) from resolve-catalog-item, carried forward as intakeForm.id (with operationType:"Update"). NOTE the container id alone is NOT enough — the intakeForm block is a full overwrite, so intakeSurfaceId + intakeSurfaceType below must also be re-sent or the bound surface is wiped. Omit the whole intakeForm block only when resolve-catalog-item returned no intake_surface_id.
121
-
122
- - **Source:** output of `resolve-catalog-item`
123
- - `intakeSurfaceId` *(`String`)* — The bound intake surface id (intakeForm.intakeFormId — the Flow/OmniScript definition id) from resolve-catalog-item. MUST be re-sent alongside the container id: sending intakeForm with only {id} wipes the surface. Present only when the item has a surface.
124
-
125
- - **Source:** output of `resolve-catalog-item`
126
- - `intakeSurfaceType` *(`String`)* — The bound intake surface type (intakeForm.type — "Flow" or "OmniScript") from resolve-catalog-item. Re-sent with intakeSurfaceId to preserve the bound surface.
127
-
128
- - **Source:** output of `resolve-catalog-item`
129
- - `targetObject` *(`String`)* — The anchor object (a closed set — Case, Incident, or ServiceRequest) — re-sent on this identity-overwrite PATCH or the anchor CLEARS — it reads back absent on the next GET, not reset to a default (DETACH TRAP). Take the value from resolve-catalog-item, never a fixed assumption.
130
-
131
- - **Source:** output of `resolve-catalog-item`
132
- - `name` *(`String`)* — The process name — re-sent to preserve identity on this identity-overwrite PATCH.
133
- - `usedFor` *(`String`)* — The usedFor value (ServiceProcess) — re-sent to preserve identity.
134
- - `isActive` *(`Boolean`)* — The isActive flag — re-sent to preserve identity.
135
-
136
- **Depends on:** `resolve-catalog-item`, `list-knowledge-articles`
137
-
138
- **Rollback:** To remove an article added here, re-invoke patchCatalogItemGet with that article as operationType:"Delete" carrying its association id (read it back from the bind response or a fresh GET), always re-sending the anchor identity fields AND the full intakeForm block (id + intakeFormId + type when a surface exists) — the rollback PATCH is the same full-overwrite, so anchor-only re-send would wipe the surface. Because the list is a delta, the other articles are untouched. The catalog-item resource has no DELETE method.
139
-
140
- ### Verify operations
141
-
142
- #### `verify-articles`
143
-
144
- Read the process back and confirm the intended articles are associated and the anchor held.
145
-
146
-
147
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
148
-
149
- **Inputs:**
150
-
151
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to verify.
152
-
153
- **Depends on:** `resolve-catalog-item`, `bind-knowledge-articles`
@@ -1,168 +0,0 @@
1
- ---
2
- name: industries-catalog-process-preprocessor-configure
3
- description: "Use this skill when users want to cHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Trigger when users mention configure, unified, catalog, service, process, preprocessor, automation, connect, api, service-automation-connect-api."
4
- metadata:
5
- version: "1.0"
6
- accessCheck: "IndustriesEpc.orgHasUnifiedCatalog"
7
- ---
8
-
9
- # Managing Configure Unified Catalog Service Process Preprocessor
10
-
11
- ## When to Use This Skill
12
-
13
- CHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Run standalone against an existing process (supply its catalogItemId), or as the phase that orchestrator routes to; for a NEW end-to-end process start at create-unified-catalog-service-process, which asks the creation fork FIRST.
14
- Use this when an admin wants to set (or remove) the Apex preprocessor on a service process that ALREADY EXISTS — e.g. "add a preprocessor that rejects duplicate laptop requests". DONE when the chosen class reads back as the ONE preProcessors entry on the verify GET with the anchor still intact. Org-gated on Unified Catalog. This references an EXISTING Apex class; it does not author or compile one. SINGLE-VALUED: a process has at most ONE preprocessor. To SET when none exists, send the class as operationType:"Create". To CHANGE the existing one, REPLACE — send the current class as operationType:"Delete" (carrying its junction id) AND the new class as operationType:"Create" in the same bind. To REMOVE, send the current class as operationType:"Delete" carrying its junction id. NEVER send a Create while a preprocessor is already attached without also Deleting it: the API accepts the second Create (200) but the extra junction is INVALID — it never renders in the UI and is not honoured. A Delete WITHOUT its junction id does not error: it silently creates a stray entry instead of removing anything, so the junction id is mandatory on every Delete. DETACH-TRAP handling and the single-valued replace rule are in agent_guidance and step assertions.
15
-
16
- ## Critical Constraints
17
-
18
- **Preconditions:**
19
-
20
- - Org must have Unified Catalog enabled.
21
- (check: `Unified Product Catalog enabled`)
22
- - HARD CONSTRAINT — the service process must ALREADY EXIST and its catalogItemId (== productId) must be known before this workflow runs. The first step (resolve-catalog-item) GETs the item to confirm it exists and is usedFor=ServiceProcess before any write; a 404 there means the id is wrong or the process was never created — the process must be created first, then re-run here with its catalogItemId.
23
- (check: `process_exists_with_known_catalog_item_id`)
24
- - HARD CONSTRAINT — the preprocessor to set MUST be a real ApexClass Id taken from the list step (list-apex-classes) for THIS org. Never guess or hand-construct a class id. List the eligible classes, let the user pick ONE, and bind that exact id.
25
- (check: `preprocessor_is_a_real_listed_apex_class`)
26
- - HARD CONSTRAINT — a service process is SINGLE-VALUED for preprocessors: at most ONE. The Connect API UNDER-ENFORCES this — sending a second class as operationType:"Create" while one is already attached is accepted (200) and persists a second junction, but that row is INVALID (never renders in the UI, not honoured). So the bind rule is REPLACE, not add:
27
- - SET (none attached): send the new class as {preProcessorsID, operationType:"Create"}.
28
- - CHANGE (one attached): send the existing class as {id:<its 127-prefix junction id>,
29
- preProcessorsID, operationType:"Delete"} AND the new class as {preProcessorsID,
30
- operationType:"Create"} in the SAME bind.
31
- - REMOVE: send the existing class as {id, preProcessorsID, operationType:"Delete"}.
32
- NEVER send a Create while a preprocessor is already attached without also Deleting it. A Delete WITHOUT its junction id does NOT error — it silently ADDS a stray entry instead of removing anything, so the junction id (preProcessors[].id from resolve-catalog-item, a 127-prefix id) is mandatory on every Delete. Confirm the final set (exactly one, the intended class) on the verify GET.
33
- (check: `bind_replaces_single_preprocessor`)
34
- - HARD CONSTRAINT — patchCatalogItemGet overwrites the item's scalar identity: the bind MUST re-send the item's identity fields (targetObject, name, usedFor, isActive). Omitting targetObject CLEARS the anchor — it reads back absent on the next GET, not reset to a default, even after it was set at create time. The intakeForm block is ALSO a full overwrite: sending it with only {id, operationType:Update} preserves the container but WIPES the bound surface (intakeFormId + type disappear). When the item has an intake surface, the bind MUST re-send intakeForm.intakeFormId AND intakeForm.type alongside the container id, not just the id. The bind PATCH always carries the four identity fields and re-sends the FULL intakeForm (id + intakeFormId + type) when one exists; the verify GET confirms the anchor and intake surface are intact.
35
- (check: `bind_patch_resends_anchor_identity_fields`)
36
-
37
- **Operational rules:**
38
-
39
- - MUST-DO CONTRACT (read before executing — each rule is enforced by the named precondition/step; do NOT skip because the detail is further down):
40
- 1. CONFIRM the process exists first — run resolve-catalog-item (GET) and capture its
41
- identity fields (name, usedFor, isActive, targetObject), its current intakeForm.id,
42
- and its CURRENT preProcessors[] — each entry is {id, preProcessorsID}; the junction id
43
- (127-prefix) is required to REMOVE that preprocessor later. A 404 means the
44
- catalogItemId is wrong; do NOT proceed.
45
- [precondition: process_exists_with_known_catalog_item_id]
46
- 2. LIST the org's Apex classes via list-apex-classes, present the COMPLETE set as numbered
47
- text (Name, ApexClass Id), and let the user pick ONE.
48
- [precondition: preprocessor_is_a_real_listed_apex_class]
49
- 3. BIND via patchCatalogItemGet — SINGLE-VALUED, so REPLACE rather than add. If NONE is
50
- attached, send the chosen class as operationType:"Create" (its preProcessorsID only). If
51
- ONE is already attached and you are CHANGING it, send the existing class as
52
- operationType:"Delete" (carrying its 127-prefix junction id from resolve-catalog-item) AND
53
- the new class as operationType:"Create" in the SAME bind. To REMOVE, send the existing
54
- class as operationType:"Delete" carrying its junction id. NEVER send a Create while a
55
- preprocessor is already attached without also Deleting it — the API accepts it (200) but
56
- the extra junction is INVALID (never shows in the UI, not honoured). A
57
- Delete missing the junction id silently ADDS a stray entry rather than removing; carry the
58
- 127-prefix id.
59
- [precondition: bind_replaces_single_preprocessor]
60
- 4. The bind PATCH is a FULL overwrite of the ITEM's scalar identity — ALWAYS re-send
61
- targetObject + name + usedFor + isActive. The intakeForm block is ALSO a full overwrite:
62
- when the item has an intake surface, re-send the FULL block — intakeForm.id AND
63
- intakeForm.intakeFormId AND intakeForm.type (operationType:Update). Sending only {id}
64
- preserves the container but WIPES the bound surface. Omit intakeForm only
65
- when the item has no surface. Otherwise the anchor clears (reads back absent) and/or the intake surface
66
- detaches. (The identity overwrite and the preProcessors delta are independent: the scalars
67
- are replaced, the preprocessor list is a delta.)
68
- [precondition: bind_patch_resends_anchor_identity_fields]
69
- 5. VERIFY: GET the item and confirm preProcessors contains EXACTLY ONE entry — the intended
70
- class — with no second/stray junction, AND targetObject is unchanged.
71
- [step: verify-preprocessors]
72
- - ASK MODALITY: for the Apex-class list (unbounded), list the COMPLETE set as numbered text (Name, ApexClass Id) and let the user type ONE selection; PRESENT smartly — match a named target locally, list a small set in full, and narrow a large one (typed name or a recent top slice) rather than dumping every row. The list is a paged SOQL query — page through nextRecordsUrl to completeness before asking. The list is org-specific — take it from this call, never a fixed list.
73
- TIMING: resolve → list → bind → verify. There is one write path. SET, CHANGE, and REMOVE all flow through the preProcessors[] delta on the bind — SET sends one Create, CHANGE sends a Delete (of the existing, carrying its junction id) PLUS a Create (of the new) together, REMOVE sends one Delete carrying the junction id.
74
-
75
- ## Verification Checklist
76
-
77
- After every write operation, confirm the effect by re-reading state:
78
-
79
- - After `resolve-catalog-item`, `bind-preprocessors`: call `verify-preprocessors` (`GET /connect/service-automation/catalog/catalog-item/{catalogItemId}`)
80
-
81
- ## Operations Reference
82
-
83
- Operations grouped by purpose. Use these as the building blocks for the workflows above.
84
-
85
- ### Summary
86
-
87
- | Operation | Purpose | Status | Call | Depends on |
88
- |-----------|---------|--------|------|------------|
89
- | `resolve-catalog-item` | read | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | — |
90
- | `list-apex-classes` | read | implemented | `queryApexClasses` | `resolve-catalog-item` |
91
- | `bind-preprocessors` | write | implemented | `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `list-apex-classes` |
92
- | `verify-preprocessors` | verify | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `bind-preprocessors` |
93
-
94
- ### Read operations
95
-
96
- #### `resolve-catalog-item`
97
-
98
- CONFIRM + CAPTURE — GET the existing service process to prove it exists and to capture the identity fields the later bind must re-send AND the CURRENT preProcessors[]. Each preProcessors entry is {id, preProcessorsID}: the id (127-prefix junction id) is what a later Delete must carry to remove that preprocessor; the preProcessorsID (an ApexClass 01p id) tells you which classes are already attached. Fails fast (404) if the catalogItemId is wrong or the process was never created. Capture name, usedFor, isActive, targetObject (the anchor), the current intake surface (intakeForm.id AND intakeForm.intakeFormId + intakeForm.type — the bound Flow/OmniScript, NOT just the container id) and the current preProcessors.
99
-
100
-
101
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
102
-
103
- **Inputs:**
104
-
105
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the EXISTING service process. If the user does not have it, the process must be created first before this workflow can run.
106
-
107
- #### `list-apex-classes`
108
-
109
- LIST — the org's Apex classes via SOQL over ApexClass. Present the COMPLETE set as numbered text (Name, ApexClass Id) and let the user pick ONE; page via nextRecordsUrl — never cap or truncate. TARGETED LOOKUP: when the user has already NAMED the class, append AND Name LIKE '%<name>%' to the SOQL WHERE (alongside Status='Active') to fetch just the matches in ONE call instead of paging the whole list; fall back to the full listing only when no name was given or the filter returns nothing. The list is org-specific — take it from this call, never a fixed list. ID TO BIND: bind the ApexClass Id (01p-prefix). preProcessors.preProcessorsID expects that id.
110
-
111
-
112
- **Call:** `queryApexClasses` — status: `implemented`
113
-
114
- **Inputs:**
115
-
116
- - `q` *(`string`)*
117
-
118
- **Depends on:** `resolve-catalog-item`
119
-
120
- ### Write operations
121
-
122
- #### `bind-preprocessors`
123
-
124
- SET BIND — change the process's single preprocessor via patchCatalogItemGet. SINGLE-VALUED / REPLACE: a process has at most ONE preprocessor. To SET when none is attached, send the chosen class as {preProcessorsID, operationType:"Create"}. To CHANGE the existing one, send the current class as {id:<its 127-prefix junction id from resolve-catalog-item>, preProcessorsID, operationType:"Delete"} AND the new class as {preProcessorsID, operationType:"Create"} in the SAME preProcessors[] array. To REMOVE, send only the current class as {id, preProcessorsID, operationType:"Delete"}. NEVER send a Create while a preprocessor is already attached without also Deleting it — the API accepts the second Create (200) and persists it, but that extra junction is INVALID: it never renders in the UI and is not honoured. A Delete WITHOUT the junction id does NOT error — it silently ADDS a stray entry instead of removing, so carry the id from resolve-catalog-item.existing_preprocessors. DETACH TRAP: this PATCH is a full overwrite of the ITEM's scalar identity — it MUST also re-send the item's identity fields (targetObject, name, usedFor, isActive), sourced from resolve-catalog-item. The intakeForm block is ALSO a full overwrite: when the item has an intake surface, re-send the FULL block — intakeForm.id (container) AND intakeForm.intakeFormId (the bound Flow/OmniScript) AND intakeForm.type, all from resolve-catalog-item, with operationType:"Update". Sending only {id, operationType:Update} preserves the container but WIPES the bound surface (intakeFormId + type vanish). Omit the intakeForm block only if resolve-catalog-item returned no intake_surface_id. Omitting targetObject CLEARS the anchor (it reads back absent on the next GET, not reset to a default). (The scalar identity is replaced; the preProcessors list is a delta — the two behave independently in the same PATCH.)
125
-
126
-
127
- **Call:** `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
128
-
129
- **Inputs:**
130
-
131
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to set the preprocessor on.
132
- - `preProcessors` *(`Array`)* — The preProcessors[] delta for a SINGLE-VALUED preprocessor — REPLACE, not add. SET (none attached): [{preProcessorsID, operationType:"Create"}], where preProcessorsID is the chosen id from list-apex-classes.class_ids (01p-prefix ApexClass id, never hand-constructed). CHANGE (one attached): send BOTH in one array — the existing class as {id, preProcessorsID, operationType:"Delete"} (id = its 127-prefix junction id from resolve-catalog-item.existing_preprocessors) AND the new class as {preProcessorsID, operationType:"Create"}. REMOVE: [{id, preProcessorsID, operationType:"Delete"}]. NEVER send a bare Create while a preprocessor is already attached — the API accepts it (200) but the extra junction is INVALID (invisible in the UI, not honoured). A Delete missing the junction id silently adds a stray entry instead of removing.
133
-
134
- - **Source:** output of `list-apex-classes`, `resolve-catalog-item`
135
- - `intakeContainerId` *(`String`)* — The existing intake container id (intakeForm.id) from resolve-catalog-item, carried forward as intakeForm.id (with operationType:"Update"). NOTE the container id alone is NOT enough — the intakeForm block is a full overwrite, so intakeSurfaceId + intakeSurfaceType below must also be re-sent or the bound surface is wiped. Omit the whole intakeForm block only when resolve-catalog-item returned no intake_surface_id.
136
-
137
- - **Source:** output of `resolve-catalog-item`
138
- - `intakeSurfaceId` *(`String`)* — The bound intake surface id (intakeForm.intakeFormId — the Flow/OmniScript definition id) from resolve-catalog-item. MUST be re-sent alongside the container id: sending intakeForm with only {id} wipes the surface. Present only when the item has a surface.
139
-
140
- - **Source:** output of `resolve-catalog-item`
141
- - `intakeSurfaceType` *(`String`)* — The bound intake surface type (intakeForm.type — "Flow" or "OmniScript") from resolve-catalog-item. Re-sent with intakeSurfaceId to preserve the bound surface.
142
-
143
- - **Source:** output of `resolve-catalog-item`
144
- - `targetObject` *(`String`)* — The anchor object (a closed set — Case, Incident, or ServiceRequest) — re-sent on this identity-overwrite PATCH or the anchor CLEARS — it reads back absent on the next GET, not reset to a default (DETACH TRAP). Take the value from resolve-catalog-item, never a fixed assumption.
145
-
146
- - **Source:** output of `resolve-catalog-item`
147
- - `name` *(`String`)* — The process name — re-sent to preserve identity on this identity-overwrite PATCH.
148
- - `usedFor` *(`String`)* — The usedFor value (ServiceProcess) — re-sent to preserve identity.
149
- - `isActive` *(`Boolean`)* — The isActive flag — re-sent to preserve identity.
150
-
151
- **Depends on:** `resolve-catalog-item`, `list-apex-classes`
152
-
153
- **Rollback:** To undo, re-invoke patchCatalogItemGet with the class added here as operationType:"Delete" carrying its junction id (read it back from the bind response or a fresh GET); if this bind REPLACED a prior preprocessor, also re-Create the prior class to restore it. Always re-send the anchor identity fields AND the full intakeForm block (id + intakeFormId + type when a surface exists) — the rollback PATCH is the same full-overwrite, so anchor-only re-send would wipe the surface. The catalog-item resource has no DELETE method.
154
-
155
- ### Verify operations
156
-
157
- #### `verify-preprocessors`
158
-
159
- Read the process back and confirm the intended preprocessor is the sole entry (or none after a REMOVE) and the anchor held.
160
-
161
-
162
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
163
-
164
- **Inputs:**
165
-
166
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to verify.
167
-
168
- **Depends on:** `resolve-catalog-item`, `bind-preprocessors`