@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,380 +0,0 @@
1
- ---
2
- name: industries-catalog-process-attributes-products-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, attributes, product, collection, 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 Attributes And Product Collection
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 define or edit the intake CONTENT — attributes and/or product collections — on a service process that ALREADY EXISTS, whether it was created from scratch or from a template. E.g. "add a Priority picklist and a laptops product collection to this service process". DONE when the chosen attributes and/or product collections read back on the verify GET with the anchor still intact. Org-gated on Unified Catalog. It does NOT create the process — run the create SOR first and pass its catalogItemId. The child lists (attributes, product collections) are MERGE-BY-ID — send only what you touch (see EDIT SEMANTICS in agent_guidance) — but the item's identity fields (anchor + intake container) ARE full-overwrite and must be re-sent every PATCH: see the content_patch_resends_anchor_and_container precondition and write-intake-content step for the DETACH TRAP; choice-backed-option rules are in the choice_backed_attributes_carry_inline_options precondition.
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 and to capture the anchor + intake container before any write; a 404 there means the id is wrong or the process was never created — create the process first, then re-run here with its catalogItemId.
23
- (check: `process_exists_with_known_catalog_item_id`)
24
- - HARD CONSTRAINT — the FIRST thing you ask each loop is the CONTENT TYPE: ATTRIBUTES (input fields), PRODUCT COLLECTION (products the requester picks), or DONE. This is the parent decision — it comes before any per-attribute detail. It is NOT either/or: the question repeats each loop, so a process can end up with BOTH attributes and product collections (add one this pass, the other next). Do NOT assume attributes and skip straight to defining fields; always offer the choice.
25
- (check: `user_has_chosen_content_type`)
26
- - HARD CONSTRAINT — inside the ATTRIBUTES branch, each attribute's binding mode is the user's choice, never inferred: for every attribute the user picks ANCHOR-mapped (writes to a real anchor field) vs CUSTOM (intake-only). A single attribute is one or the other, never both — but the loop re-asks this every iteration, so the same process can freely mix anchor-mapped AND custom attributes. Do NOT auto-classify attributes or invent an attribute list. Ask one attribute at a time, not as an upfront questionnaire.
27
- (check: `user_has_chosen_attribute_binding_modes`)
28
- - HARD CONSTRAINT — anchor-mapped attributes MUST use a real createable field on the process's anchor object (targetObject, captured on resolve-catalog-item), taken from describe-anchor-fields. The anchor object is one of three valid values the API accepts: Case, Incident, or ServiceRequest (a closed enum — the backend rejects any other SObject). Never guess an anchor field apiName.
29
- (check: `anchor_attributes_use_real_createable_fields`)
30
- - HARD CONSTRAINT — every choice-backed attribute (dataType Picklist / MultiSelectPicklist / RadioButton) MUST carry a NON-EMPTY picklistOptions[], whether it is anchor-mapped or custom. The backend does NOT inline a field's own values: an anchor-mapped picklist sent BARE (isMappedAnchorField:true with no picklistOptions) persists with picklistOptions:[], so the later generate-intake-form step builds an optionless ChoiceSet and fails "The data type of ChoiceSet_<field> can't be Picklist". Anchor-mapping a choice-backed field is FINE as long as you ALSO send its options inline: keep isMappedAnchorField:true + apiName AND populate picklistOptions[] from the describe projection's picklistOptions (the field's own picklistValues). A CUSTOM choice-backed attribute (no binding flags) likewise MUST carry user-typed picklistOptions[]. Either way every option needs a non-empty, distinct displayName.
31
- (check: `choice_backed_attributes_carry_inline_options`)
32
- - HARD CONSTRAINT — every REQUIRED attribute field must be collected non-empty from the user and saved. Required when defining an attribute: Name, API Name, Data Type, and (for choice-backed types Picklist / MultiSelectPicklist / RadioButton) a non-empty picklistOptions[] where EVERY option carries a non-empty, distinct displayName (blank displayNames make the later intake generate fail "Duplicate developer name: Choice_null_<apiName>"). Description is OPTIONAL. Do NOT skip, default, or invent a required field. Every required field the user supplied must read back on verify-content.
33
- (check: `required_attribute_fields_collected_and_persisted`)
34
- - HARD CONSTRAINT — an attribute's dataType MUST be one the intake BUILDER supports, NOT merely one the write API accepts. The write accepts a wider set of data types than the builder does; four values — Boolean, Password, List, Map — are write-accepted yet UI-UNSUPPORTED. Sending one persists silently but leaves the builder's Data Type UNSET (blank "Select an Option"), so the process later fails activation with INPUTPARAM_INCOMPATIBLE_DATATYPE, which also blocks binding any agent action. Use only the builder-supported set: Text, Number, Currency, Percentage, CheckBox, Date, Datetime, Time, Email, Url, Phone, Range, Lookup, Attachment, Picklist, MultiSelectPicklist, RadioButton, ListOfString, ListOfInteger, ListOfDouble, ListOfBoolean, ListOfMaps, ListOfAttachment. For a true/false field the builder value is CheckBox — there is NO Boolean option.
35
- (check: `custom_attribute_datatype_is_ui_supported`)
36
- - HARD CONSTRAINT — on the content PATCH (write-intake-content), the item's IDENTITY FIELDS are full-overwrite (unlike the child lists, which merge by id — see EDIT SEMANTICS). It MUST re-send those identity fields (targetObject, name, usedFor, isActive) captured on resolve-catalog-item, and carry the existing intake container forward as intakeForm:{id, operationType:"Update"} (plus intakeFormId + type when a Flow/OmniScript surface is already attached). Omitting targetObject CLEARS the anchor (it reads back absent on the next GET — NOT reset to a default); omitting the intakeForm block detaches the intake surface. The verify GET confirms the anchor and container are intact.
37
- (check: `content_patch_resends_anchor_and_container`)
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. RESOLVE the process first — run resolve-catalog-item (GET) and capture its identity
43
- fields (name, usedFor, isActive, targetObject), its intakeForm (id + any attached
44
- surface intakeFormId/type), and its CURRENT sections[].attributes + productRequests[]
45
- (so you can show the user what already exists and target an edit/removal at the right
46
- child by its id — the child lists are MERGE-BY-ID, see EDIT SEMANTICS). A 404 means
47
- the catalogItemId is wrong or the process was never created; do NOT proceed.
48
- [precondition: process_exists_with_known_catalog_item_id]
49
- 2. ASK the CONTENT TYPE (attributes / product-collection / done) first each loop —
50
- never assume attributes. [precondition: user_has_chosen_content_type]
51
- 3. Per attribute, ASK anchor-mapped vs custom every iteration — never infer.
52
- [precondition: user_has_chosen_attribute_binding_modes]
53
- 4. COPY anchor-mapped dataType from the describe; never author it. A CUSTOM attribute's
54
- dataType MUST be one the intake builder supports (never Boolean/Password/List/Map; a
55
- true/false field is CheckBox). For choice-backed attributes
56
- (Picklist/MultiSelectPicklist/RadioButton), apply the inline-options rule.
57
- [preconditions: custom_attribute_datatype_is_ui_supported,
58
- choice_backed_attributes_carry_inline_options]
59
- 5. COLLECT every required attribute field non-empty (per the
60
- required_attribute_fields_collected_and_persisted precondition) and verify round-trip.
61
- 6. WRITE via the single write-intake-content PATCH — see the DETACH TRAP.
62
- [precondition: content_patch_resends_anchor_and_container]
63
- - TIMING: resolve first, then run the content loop interactively, then write once, then verify. Ask every decision as you go, never as one upfront questionnaire.
64
- ASK MODALITY: use a structured picker only for small bounded choices (it caps at a few options). Anchor fields are a BOUNDED palette (the object's createable fields the user chooses from) — list the COMPLETE set as numbered text and NEVER truncate or top-slice, so no valid field is hidden. For unbounded record lists (products), also list the fetched set as numbered text but 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.
65
- EDIT SEMANTICS: the child lists (sections[].attributes and productRequests[]) are MERGE-BY-ID, not overwrite. Send ONLY what you touch: add with operationType:"Create", change an existing child with operationType:"Update" by its id, remove one with operationType:"Delete" by its id. Untouched children persist on their own — do NOT re-send them (a stale or wrong id on a needless re-send risks a bad Update or Delete). This is the OPPOSITE of the item's identity fields (name, targetObject, usedFor, isActive) and the intake container, which ARE full-overwrite and MUST be re-sent every PATCH — see write-intake-content for the DETACH TRAP.
66
- LOOP:
67
- (a) Ask (yes/no) "Add or edit intake content now?" No -> done.
68
- (b) Ask the CONTENT TYPE (choose-content-type; options in choice_points): ATTRIBUTES,
69
- PRODUCT COLLECTION, or DONE. Never assume attributes. Not either/or — a process can
70
- have both (see the user_has_chosen_content_type precondition).
71
- (c) Collect per the chosen type. When the type is ATTRIBUTES, run an ATTRIBUTE LOOP:
72
- each iteration FIRST asks the sub-kind (attribute-source) — "Select an existing
73
- field (anchor-mapped) or type your own (custom)?" — then collects ONE attribute,
74
- then asks "Add another attribute?" and REPEATS from the sub-kind question until
75
- the user says no. Do NOT stay in one branch; do NOT stop after one attribute.
76
- - ATTRIBUTES, anchor-mapped ("select existing"): run describe-anchor-fields and
77
- list ALL createable fields as numbered text (label, API name, type); let the
78
- user type which to add (they may pick several). The set is org/object-specific;
79
- take it from the describe, never a fixed list. Build each attribute by copying
80
- from the describe — do NOT ask the user for Name/API Name/Data Type/Description:
81
- name = field label
82
- apiName = field name
83
- dataType = field dataType from the describe (never chosen by you)
84
- isMappedAnchorField = true
85
- description defaults to the field label. The only things worth asking are
86
- behavior flags (Required, Visible, Read-only), and only if they matter.
87
- CHOICE-BACKED ANCHOR FIELDS (dataType Picklist / MultiSelectPicklist / RadioButton,
88
- i.e. describe projection isChoiceBacked==true): see the
89
- choice_backed_attributes_carry_inline_options precondition for the inline-options rule.
90
- - ATTRIBUTES, custom ("type your own"): collect ONE custom attribute (fields
91
- below). Collect a non-empty value for every required field; do NOT skip,
92
- default, or invent, and do NOT save until all are filled. Fields in order:
93
- 1. Name
94
- 2. API Name
95
- 3. Data Type — single-select; send the enum string exactly, and it MUST be one the
96
- intake BUILDER supports (see the custom_attribute_datatype_is_ui_supported
97
- precondition for the allowed set). For a true/false field use CheckBox — there is
98
- NO "Boolean" option.
99
- 4. Description — OPTIONAL. Goes in the attribute's `description` property.
100
- Offer it; do not block or fail if the user skips it.
101
- 5. Option values — REQUIRED when Data Type is Picklist, MultiSelectPicklist, or
102
- RadioButton: elicit them via an "add value / add more" loop and send as
103
- non-empty picklistOptions[]. Empty options break the later generate step.
104
- Omit picklistOptions for all other types. A user-typed-options picklist is
105
- custom (set NO binding flags).
106
- Send each option with BOTH name AND a non-empty, distinct displayName (set
107
- displayName to the option label). Blank displayNames break the later generate
108
- step. displayName sets only on Create, not Update — to fix an option saved
109
- blank, Delete it then re-Create it with displayName in a SEPARATE PATCH (a
110
- combined delete+create in one PATCH drops the creates). A picklistOptions entry
111
- may read back isVisible:false on a GET, but the runtime intake form renders it
112
- regardless — do NOT treat that as a bug or fire follow-up Updates to flip it.
113
- 6. Required — ALWAYS ASK (yes/no) -> isMandatory (default false).
114
- 7. Visible to Requester — ALWAYS ASK (yes/no) -> isHidden INVERTED (there is no
115
- isVisible field; Visible=yes means isHidden:false, default false).
116
- 8. Read-only (optional) -> isReadOnly (default false). Optionally defaultValue
117
- and displayWidth (LayoutWidth enum: one, two, three, four, five, six, seven,
118
- eight, nine, ten, eleven, twelve; default "twelve").
119
- Set no binding flags on custom attributes.
120
- - PRODUCT COLLECTION (one per section): Section Name; Products — query the
121
- selectable Product2 records via `GET /services/data/v67.0/query?q=` with
122
- `SELECT Id, Name, ProductCode FROM Product2 WHERE UsedFor != 'ServiceProcess'
123
- ORDER BY Name` (this matches the UI's picker exactly — it EXCLUDES products
124
- that are themselves service processes; `!=` intentionally KEEPS UsedFor=null
125
- products, and the picker is NOT active-only, so do not add an IsActive filter).
126
- Present the results as numbered text (name + id) and let the user type which to
127
- include. Each chosen -> productDetails
128
- {productId, operationType:"Create"}, never send `id`. Min/Max count
129
- (sectionMinCount >= 0, sectionMaxCount > 0 and >= min — elicit both, don't
130
- default); optional Section Description. Set `sequence` on every productRequests[]
131
- entry you send (a 0-based ordinal ordering the sections — first section 0, next
132
- 1, ...), on Create AND Update. When you Update an existing section, re-send its
133
- existing sequence (from resolve-catalog-item) so the Update does not null it;
134
- sections you do not touch keep their sequence untouched (MERGE-BY-ID).
135
- DEDICATED PRODUCT PAGE — REQUIRED for the runtime product picker. A collection
136
- only renders a product-selection screen in the generated intake Flow when it sits
137
- on its OWN layout page of type ProductRequestSection — NOT on an attribute section,
138
- and NOT left in the "Existing Product Collection" bucket (a collection sent with no
139
- page placement lands in that bucket, and generate-intake-form then produces a Flow
140
- with NO product screen). So for every NEW collection, in the SAME write PATCH also
141
- emit a sections[] entry: operationType:"Create", a client-chosen sectionUuid (any
142
- unique string), a name, description "", a sequence, and attributes:[] — the empty
143
- attributes array is MANDATORY (omitting it 400s UNKNOWN_EXCEPTION "Cannot invoke
144
- List.iterator()"; empty attributes + a linked product group is how the server infers
145
- Type=ProductRequestSection). Link the collection to that page by setting
146
- svcProcessLayoutSectionUuid on its productRequests[] entry to the SAME sectionUuid
147
- (use svcProcessLayoutSectionUuid, NOT svcProcessLayoutSectionId — the latter refers
148
- to an already-existing section). When EDITING a collection that is ALREADY on a page,
149
- do NOT create a new page — Update the productRequests[] entry by its sectionId; its
150
- page persists. After this PATCH, the generate step (configure-intake SOR) will
151
- include the product picker automatically.
152
- (d) After each batch, ask "Add more content?" — LOOP back to (b) until the user says
153
- done.
154
- (e) Write the collected content in a SINGLE write step (write-intake-content) — never
155
- one call per item. First prepare each content type that applies (prepare-attributes
156
- shapes sections[]; prepare-product-collection shapes productRequests[]). Then
157
- write-intake-content fires ONE PATCH: sections when attributes were defined,
158
- productRequests when collections were defined, both together when both — always
159
- re-sending the anchor identity fields and the existing intake container.
160
-
161
- ## Verification Checklist
162
-
163
- After every write operation, confirm the effect by re-reading state:
164
-
165
- - After `resolve-catalog-item`, `write-intake-content`: call `verify-content` (`GET /connect/service-automation/catalog/catalog-item/{catalogItemId}`)
166
-
167
- ## Operations Reference
168
-
169
- Operations grouped by purpose. Use these as the building blocks for the workflows above.
170
-
171
- ### Summary
172
-
173
- | Operation | Purpose | Status | Call | Depends on |
174
- |-----------|---------|--------|------|------------|
175
- | `resolve-catalog-item` | read | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | — |
176
- | `describe-anchor-fields` | read | implemented | `GET /services/data/v67.0/sobjects/{targetObject}/describe` | `resolve-catalog-item` |
177
- | `choose-content-type` | read | — | — | `resolve-catalog-item` |
178
- | `prepare-attributes` | read | — | — | `resolve-catalog-item`, `choose-content-type`, `describe-anchor-fields` |
179
- | `prepare-product-collection` | read | — | — | `resolve-catalog-item`, `choose-content-type` |
180
- | `assemble-sections` | read | — | — | `prepare-attributes`, `prepare-product-collection` |
181
- | `write-intake-content` | write | implemented | `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `choose-content-type`, `prepare-attributes`, `prepare-product-collection`, `assemble-sections` |
182
- | `verify-content` | verify | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `write-intake-content` |
183
-
184
- ### Dependency graph
185
-
186
- ```mermaid
187
- graph TD
188
- resolve_catalog_item["resolve-catalog-item (read)"]
189
- describe_anchor_fields["describe-anchor-fields (read)"]
190
- choose_content_type["choose-content-type (read)"]
191
- prepare_attributes["prepare-attributes (read)"]
192
- prepare_product_collection["prepare-product-collection (read)"]
193
- assemble_sections["assemble-sections (read)"]
194
- write_intake_content["write-intake-content (write)"]
195
- verify_content["verify-content (verify)"]
196
- resolve_catalog_item --> describe_anchor_fields
197
- resolve_catalog_item --> choose_content_type
198
- resolve_catalog_item --> prepare_attributes
199
- choose_content_type --> prepare_attributes
200
- describe_anchor_fields --> prepare_attributes
201
- resolve_catalog_item --> prepare_product_collection
202
- choose_content_type --> prepare_product_collection
203
- prepare_attributes --> assemble_sections
204
- prepare_product_collection --> assemble_sections
205
- resolve_catalog_item --> write_intake_content
206
- choose_content_type --> write_intake_content
207
- prepare_attributes --> write_intake_content
208
- prepare_product_collection --> write_intake_content
209
- assemble_sections --> write_intake_content
210
- resolve_catalog_item --> verify_content
211
- write_intake_content --> verify_content
212
- ```
213
-
214
- ### Read operations
215
-
216
- #### `resolve-catalog-item`
217
-
218
- CONFIRM + CAPTURE — GET the existing service process to prove it exists and to capture the identity fields the write must re-send (name, usedFor, isActive, targetObject), the intake container (intakeForm.id and any attached surface intakeFormId/type), and the CURRENT sections[].attributes + productRequests[] (so you can show the user what exists and target an edit/removal at the right child by its id — the child lists are MERGE-BY-ID, see EDIT SEMANTICS). Fails fast (404) if the catalogItemId is wrong or the process was never created.
219
-
220
-
221
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
222
-
223
- **Inputs:**
224
-
225
- - `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.
226
-
227
- #### `describe-anchor-fields`
228
-
229
- DISCOVERY — describe the process's anchor object (resolve-catalog-item.target_object) to get the valid anchor fields, on demand whenever the user picks an anchor-mapped attribute. The fields and their count are org/object-specific, never a fixed list. Filter to createable=true — those are the valid anchor targets. The sobject describe is a LARGE payload: do NOT read the whole thing into context or hand it to a model to eyeball — that drops fields non-deterministically. Extract with the filter below so the field list is complete and reproducible, then build the picker from the small projection. The projection gives, per createable field, a dataType (the agent copies it, never chooses it), an isChoiceBacked flag (true only for real picklist/multipicklist fields), and its picklistOptions. Filter to run:
230
- jq --argjson sys '["Id","IsDeleted","CreatedById","CreatedDate","LastModifiedById","LastModifiedDate","SystemModstamp","OwnerId"]' '
231
- [.fields[] | select(.createable==true and .type!="address" and .type!="location" and .type!="base64") | {
232
- name, label, type, nillable, defaultedOnCreate, nameField,
233
- dataType: (if .type=="picklist" then "Picklist"
234
- elif .type=="multipicklist" then "MultiSelectPicklist"
235
- elif .type=="boolean" then "CheckBox"
236
- elif .type=="currency" then "Currency"
237
- elif .type=="percent" then "Percentage"
238
- elif (.type=="double" or .type=="int") then "Number"
239
- elif .type=="date" then "Date"
240
- elif .type=="datetime" then "Datetime"
241
- elif .type=="time" then "Time"
242
- elif .type=="reference" then "Lookup"
243
- elif .type=="phone" then "Phone"
244
- elif .type=="email" then "Email"
245
- elif .type=="url" then "Url"
246
- else "Text" end),
247
- isChoiceBacked: (.type=="picklist" or .type=="multipicklist"),
248
- referenceObject: (if .type=="reference" then ((.referenceTo // []) | join(";")) else null end),
249
- picklistOptions: [ .picklistValues[]? | select(.active==true) | {name: .value, displayName: .label} ]
250
- }]'
251
-
252
-
253
- **Call:** `GET /services/data/v67.0/sobjects/{targetObject}/describe` — status: `implemented`
254
-
255
- **Inputs:**
256
-
257
- - `targetObject` *(`String`)* — The anchor object of the process — one of the three valid values the API accepts: Case, Incident, or ServiceRequest (a closed enum enforced by the backend). Captured on resolve-catalog-item. Must be that SAME value.
258
-
259
-
260
- **Depends on:** `resolve-catalog-item`
261
-
262
- #### `choose-content-type`
263
-
264
- DECISION STEP (no API call) — a real walked step, not prose. At the top of every content iteration, ASK the choice in choice_points[id=content-type] and record the answer; collect that content, then loop back until the user answers "done". The WRITE happens after the loop and depends on WHAT WAS COLLECTED across all iterations. Set has_attributes / has_product_collections to reflect the full collected set; those booleans gate the prep + write steps.
265
-
266
-
267
- **Depends on:** `resolve-catalog-item`
268
-
269
- #### `prepare-attributes`
270
-
271
- ASSEMBLY STEP (no API call) — shape the collected attributes into the sections[] payload write-intake-content sends (attributes nested under sections[].attributes; each with operationType Create/Update/Delete). Field order and wire mapping are in agent_guidance step (c) ATTRIBUTES. Enforce the required-field rule (see required_attribute_fields_collected_and_persisted precondition) HERE, before the write: do not emit any attribute missing a required field — go back and collect it. For every anchor-mapped attribute (isMappedAnchorField==true), copy dataType AND referenceObject from the matching describe-anchor-fields entry (dataType = projection[name==apiName].dataType, referenceObject = projection[name==apiName].referenceObject); do NOT re-derive them or accept a model-authored value. Only CUSTOM attributes take a user-supplied dataType. MERGE-BY-ID (see EDIT SEMANTICS): the sections[] this emits carries ONLY the attributes the user actually touched — new ones as operationType:"Create", an edited existing one as operationType:"Update" by its id (matched from resolve-catalog-item.existing_attributes by apiName), a removed one as operationType:"Delete" by its id. Do NOT re-emit untouched existing attributes — they persist on their own, and re-sending them risks a stale-id bad Update.
272
-
273
-
274
- **Inputs:**
275
-
276
- - `attributes` *(`array`)* — The attributes the user added or edited in the loop (anchor-mapped and/or custom).
277
-
278
- - `existing_attributes` *(`array`)* — The attributes already on the process (from resolve-catalog-item). Used to LOOK UP the id of an attribute the user edits or removes (match by apiName) — NOT re-sent wholesale. Untouched existing attributes persist on their own (MERGE-BY-ID, see EDIT SEMANTICS).
279
-
280
- - **Source:** output of `resolve-catalog-item`
281
- - `anchor_field_projection` *(`array`)* — The per-field projection (name, label, type, dataType, isChoiceBacked, picklistOptions). For anchor-mapped attributes, dataType is copied from here by matching projection.name == attribute.apiName — never assumed by the agent. A choice-backed field (isChoiceBacked==true), whether anchor-mapped or custom, sources its picklistOptions from this entry's picklistOptions.
282
-
283
-
284
- **Depends on:** `resolve-catalog-item`, `choose-content-type`, `describe-anchor-fields`
285
-
286
- #### `prepare-product-collection`
287
-
288
- ASSEMBLY STEP (no API call) — runs only if the user defined or edited one or more product collections. Assemble the productRequests[] payload from the collections collected in the loop, AND (for new collections) the ProductRequestSection page entries that go in sections[] (see agent_guidance DEDICATED PRODUCT PAGE). Product collections do NOT touch the ATTRIBUTE sections[], but each NEW collection DOES emit its own sections[] entry of type ProductRequestSection (operationType:"Create", a client sectionUuid, attributes:[]) so it lands on a real page and the generated Flow renders a product picker; the collection's productRequests[] entry links to it via svcProcessLayoutSectionUuid. MERGE-BY-ID (see EDIT SEMANTICS): emit ONLY the collections the user touched — new ones as operationType:"Create" (WITH a new page entry + svcProcessLayoutSectionUuid), an edited existing one as operationType:"Update" by its sectionId (re-sending that section's existing `sequence` so the Update does not null it, and NO new page — its page persists), a removed one as operationType:"Delete" by its sectionId. Do NOT re-emit untouched existing collections — they persist on their own.
289
-
290
-
291
- **Inputs:**
292
-
293
- - `collections` *(`array`)* — The product collections collected or edited in the loop (section name, chosen products, min/max count, optional description).
294
-
295
- - `existing_product_requests` *(`array`)* — The product collections already on the process (from resolve-catalog-item). Used to LOOK UP the sectionId (and existing sequence) of a collection the user edits or removes — NOT re-sent wholesale. Untouched existing collections persist on their own (MERGE-BY-ID, see EDIT SEMANTICS).
296
-
297
- - **Source:** output of `resolve-catalog-item`
298
-
299
- **Depends on:** `resolve-catalog-item`, `choose-content-type`
300
-
301
- #### `assemble-sections`
302
-
303
- ASSEMBLY STEP (no API call) — build the SINGLE sections[] array the write PATCH sends by CONCATENATING the attribute sections (prepare-attributes.sections, present when attributes were defined) and the ProductRequestSection page entries for new collections (prepare-product-collection.product_sections, present when a NEW collection was defined). Either source may be absent: in the product-collection-only path prepare-attributes does NOT run, so sections is just the product page entries; in the attributes-only path it is just the attribute sections; when both ran, it is both. If BOTH are empty, emit nothing (write-intake-content then omits the sections field entirely). This is the ONLY place the two section sources are merged — write-intake-content reads sections from HERE, never from prepare-attributes directly, so a new product page is guaranteed into the payload even when no attributes were touched (the product-collection-only path that would otherwise drop the ProductRequestSection page and leave the collection unplaced → no runtime picker).
304
-
305
-
306
- **Inputs:**
307
-
308
- - `attribute_sections` *(`array`)* — The attribute sections[] from prepare-attributes (attributes nested under sections[].attributes). Absent when has_attributes == false (that step did not run) — treat as empty.
309
-
310
- - **Source:** output of `prepare-attributes`
311
- - `product_sections` *(`array`)* — The ProductRequestSection page entries (one per NEW collection) from prepare-product-collection. Absent when has_product_collections == false or the user only edited/removed existing collections — treat as empty.
312
-
313
- - **Source:** output of `prepare-product-collection`
314
-
315
- **Depends on:** `prepare-attributes`, `prepare-product-collection`
316
-
317
- ### Write operations
318
-
319
- #### `write-intake-content`
320
-
321
- THE SINGLE WRITE — one PATCH that persists whatever content was prepared. Send only the blocks that apply: sections (from prepare-attributes) when attributes were defined; productRequests (from prepare-product-collection) when collections were defined; both together when both. Send intakeForm:{id, operationType:"Update"} using resolve-catalog-item.intake_form_id — the item always has a container here (resolve stopped if it did not). DETACH TRAP (see content_patch_resends_anchor_and_container precondition): for the item's IDENTITY FIELDS (targetObject + the intakeForm block), operationType:"Update" is a FULL overwrite — an omitted identity field is cleared. (The child lists are separate: they merge by id — see EDIT SEMANTICS.) Two identity levels to guard:
322
- (1) intakeForm: if resolve-catalog-item captured intake_surface_form_id + intake_surface_type
323
- (a Flow/OmniScript attached by a prior configure-intake run), carry them forward —
324
- intakeForm:{id, operationType:"Update", intakeFormId:<surface id>, type:<type>} —
325
- or the attached surface is silently detached. Omit intakeFormId/type ONLY when no
326
- surface is attached yet.
327
- (2) ANCHOR: this PATCH MUST re-send the item's identity fields — targetObject (the
328
- anchor), name, usedFor, isActive — sourced from resolve-catalog-item, every time.
329
- Omitting targetObject CLEARS the anchor (it reads back absent on the next GET, NOT
330
- reset to a default), and any anchor-mapped attributes in this same payload then have
331
- no valid object to bind to. Confirm on the post-PATCH verify GET that targetObject
332
- is unchanged.
333
-
334
-
335
- **Call:** `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
336
-
337
- **Inputs:**
338
-
339
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to update.
340
- - `targetObject` *(`String`)* — The anchor object — one of the three valid values the API accepts: Case, Incident, or ServiceRequest (a closed enum enforced by the backend). Captured on resolve-catalog-item. MUST be re-sent on every Update or the anchor is CLEARED — it reads back absent, not reset to a default (see DETACH TRAP).
341
-
342
- - `name` *(`String`)* — The process name — re-sent to preserve identity on this full-overwrite Update.
343
- - `usedFor` *(`String`)* — The usedFor value (ServiceProcess) — re-sent to preserve identity.
344
- - `isActive` *(`Boolean`)* — The isActive flag — re-sent to preserve identity.
345
- - `intakeFormId` *(`String`)* — The intake container id (from resolve-catalog-item), sent as intakeForm:{id:<this>, operationType:"Update"}. Carry intake_surface_form_id + intake_surface_type forward too when a surface is attached (see DETACH TRAP).
346
-
347
- - **Source:** output of `resolve-catalog-item`
348
- - `intakeSurfaceFormId` *(`String`)* — The attached surface's intakeFormId (from resolve-catalog-item), when a Flow/OmniScript is already bound. Included in the intakeForm block ONLY when present — the container block is a full overwrite, so sending id alone while a surface is attached detaches it (see DETACH TRAP). Empty (no surface attached yet) → omit intakeFormId + type entirely.
349
-
350
- - **Source:** output of `resolve-catalog-item`
351
- - `intakeSurfaceType` *(`String`)* — The attached surface's type (Flow or Omniscript, from resolve-catalog-item). Carried forward alongside intakeSurfaceFormId under the same present/absent rule (see DETACH TRAP).
352
-
353
- - **Source:** output of `resolve-catalog-item`
354
- - `sections` *(`array`)* — The single combined sections[] for the PATCH, from assemble-sections — the concatenation of the attribute sections (prepare-attributes.sections) AND the ProductRequestSection page entries for new collections (prepare-product-collection.product_sections). Sourced from assemble-sections (NOT prepare-attributes directly) so the product page entries reach this PATCH even in the product-collection-only path where prepare-attributes did not run. If assemble-sections produced nothing (neither source had entries), omit sections entirely.
355
-
356
- - **Source:** output of `assemble-sections`
357
- - `productRequests` *(`array`)* — The assembled productRequests[] from prepare-product-collection. Every entry carries `sequence` (0-based ordinal ordering the sections), on Create AND Update; a new collection also carries svcProcessLayoutSectionUuid matching its page entry in sections[].
358
-
359
- - **Source:** output of `prepare-product-collection`
360
-
361
- **Depends on:** `resolve-catalog-item`, `choose-content-type`, `prepare-attributes`, `prepare-product-collection`, `assemble-sections`
362
-
363
- **Rollback:** To undo content written here, re-invoke this same PATCH with operationType=Delete on the specific children to remove (attributes, sections, and/or product-collection sections) — each identified by its server-assigned id, 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. Removal is always via this PATCH; the catalog-item resource has no DELETE method.
364
-
365
- ### Verify operations
366
-
367
- #### `verify-content`
368
-
369
- Read the definition back and confirm the attributes and/or product collections are in place and the anchor + intake container held.
370
-
371
-
372
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
373
-
374
- **Inputs:**
375
-
376
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to verify.
377
- - `isRuntime` *(`boolean`)* — Whether to fetch the runtime (intake) view. For design-time verification leave false/omit to read the full definition as authored.
378
-
379
-
380
- **Depends on:** `resolve-catalog-item`, `write-intake-content`
@@ -1,216 +0,0 @@
1
- ---
2
- name: industries-catalog-process-fulfillment-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, fulfillment, 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 Fulfillment
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 associate a fulfilment flow with a service process that ALREADY EXISTS — e.g. "attach my order-fulfilment Flow Orchestrator to this service process" or "wire up the stage-management process for my replacement request". DONE when a Flow / Flow Orchestrator / Stage Management surface is bound to the process and reads back on the verify GET with the anchor still intact. Org-gated on Unified Catalog. One user decision drives the branch — the fulfilment type (Flow / FlowOrchestrator / StageManagement) — enforced in preconditions and a choice_point; step mechanics and the DETACH TRAP are in agent_guidance and step assertions. This attaches an EXISTING flow; it does not author the flow, orchestrator, or stage definition.
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 FULFILMENT TYPE (Flow vs FlowOrchestrator vs StageManagement) MUST be elicited from the user, never defaulted. It changes which list endpoint runs and the `type` sent when binding. Do NOT assume Flow.
25
- (check: `user_has_chosen_fulfillment_type`)
26
- - HARD CONSTRAINT — the fulfilment surface to attach MUST be a real id taken from the matching list step (list-fulfillment-flows for Flow, list-flow-orchestrations for FlowOrchestrator, list-stage-definitions for StageManagement) for THIS org. Never guess or hand-construct an id. List the eligible records, let the user pick one, and bind that exact id as fulfillmentFlow.fulfillmentFlowId.
27
- (check: `attached_surface_is_a_real_listed_id`)
28
- - HARD CONSTRAINT — 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 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
- - HARD CONSTRAINT — the fulfillmentFlow block's operationType is COMPUTED, not fixed. The bind follows a Create/Update split (same as the intake container): if resolve-catalog-item returned NO fulfillmentFlow (nothing bound yet), send operationType:"Create" with NO fulfillmentFlow.id — this mints the ProductFulfillmentScenario and binds the flow. If a fulfillmentFlow IS already bound, send operationType:"Update" AND carry resolve-catalog-item.existing_fulfillment_scenario_id forward as fulfillmentFlow.id — this repoints the existing scenario. A hardcoded operationType:"Update" on a first attach SILENTLY NO-OPS: the PATCH returns 200 but the fulfillmentFlow never persists (reads back absent on the verify GET). Determine Create-vs-Update from the presence of an existing fulfillmentFlow on resolve-catalog-item; never assume.
31
- (check: `bind_fulfillment_operation_type_rule`)
32
- - HARD CONSTRAINT — if resolve-catalog-item shows a fulfilment flow is ALREADY bound, binding a different one REPLACES it (the existing ProductFulfillmentScenario is repointed to the new flow). Before replacing, CONFIRM with the user that they want to swap the currently-bound flow; do NOT silently overwrite. First attach (no existing fulfillment flow) needs no confirmation.
33
- (check: `replace_existing_fulfillment_confirmed`)
34
-
35
- **Operational rules:**
36
-
37
- - MUST-DO CONTRACT (read before executing — each rule is enforced by the named precondition/step; do NOT skip because the detail is further down):
38
- 1. CONFIRM the process exists first — run resolve-catalog-item (GET) and capture its
39
- identity fields (name, usedFor, isActive, targetObject), its current intakeForm.id,
40
- and its current fulfillmentFlow (if any). A 404 means the catalogItemId is wrong; do
41
- NOT proceed. [precondition: process_exists_with_known_catalog_item_id]
42
- 2. ELICIT the fulfilment type (Flow / FlowOrchestrator / StageManagement) up front.
43
- Never default it. [precondition: user_has_chosen_fulfillment_type]
44
- 3. LIST via the matching step (list-fulfillment-flows for Flow, list-flow-orchestrations
45
- for FlowOrchestrator, list-stage-definitions for StageManagement), present the
46
- COMPLETE set as numbered text, and let the user type their pick.
47
- [precondition: attached_surface_is_a_real_listed_id]
48
- 4. IF a fulfilment flow is ALREADY bound (resolve-catalog-item returned a fulfillmentFlow),
49
- CONFIRM with the user before replacing it — binding a different flow repoints the
50
- existing scenario. First attach (nothing bound) needs no confirmation.
51
- [precondition: replace_existing_fulfillment_confirmed]
52
- 5. BIND that exact id via patchCatalogItemGet, sending fulfillmentFlow:{fulfillmentFlowId,
53
- type, operationType}. COMPUTE operationType: "Create" when NOTHING is bound yet (omit
54
- fulfillmentFlow.id) — a hardcoded "Update" on first attach silently no-ops (200 but the
55
- flow never persists); "Update" when replacing an existing binding, carrying
56
- resolve-catalog-item.existing_fulfillment_scenario_id forward as fulfillmentFlow.id.
57
- The PATCH is a FULL overwrite — ALWAYS re-send targetObject + name + usedFor + isActive.
58
- The intakeForm block is ALSO a full overwrite: when the item has an intake surface,
59
- re-send the FULL block — intakeForm.id AND intakeForm.intakeFormId AND intakeForm.type
60
- (operationType:Update). Sending only {id} preserves the container but WIPES the bound
61
- surface. Omit intakeForm only when the item has no surface. Otherwise the
62
- anchor clears (reads back absent) and/or the intake surface detaches.
63
- [precondition: bind_fulfillment_operation_type_rule]
64
- [precondition: bind_patch_resends_anchor_identity_fields]
65
- 6. VERIFY: GET the item and confirm fulfillmentFlow.fulFillmentFlowId + fulfillmentFlow.type
66
- are the chosen surface AND targetObject is unchanged. [step: verify-fulfillment]
67
- - ASK MODALITY: use a structured picker for the one bounded choice (fulfilment type). For the fulfilment surface list (Flows / Orchestrations / Stage Definitions), which is unbounded, list the COMPLETE set as numbered text (label, apiName/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 and Orchestration lists are paged GraphQL queries (first:N + pageInfo.hasNextPage/endCursor) — page through to completeness before asking.
68
- TIMING: ask fulfilment type up front (it selects the branch), then run only the lister that applies (the other two are guarded by applies_when), then the single shared bind.
69
- BRANCHES (exactly one lister runs, then the shared bind):
70
- - Flow -> list-fulfillment-flows -> bind-fulfillment-flow (type=Flow)
71
- - FlowOrchestrator -> list-flow-orchestrations -> bind-fulfillment-flow (type=FlowOrchestrator)
72
- - StageManagement -> list-stage-definitions -> bind-fulfillment-flow (type=StageManagement)
73
- Every branch ends with verify-fulfillment. EXTENDING to a new fulfilment type: add it to choice_points[fulfillment-type].options, add its own lister step (guarded by applies_when on the new type value), and ensure bind-fulfillment-flow.fulfillmentType accepts the new wire value. No change to the anchor handling or verify.
74
-
75
- ## Verification Checklist
76
-
77
- After every write operation, confirm the effect by re-reading state:
78
-
79
- - After `resolve-catalog-item`, `bind-fulfillment-flow`: call `verify-fulfillment` (`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-fulfillment-flows` | read | implemented | `queryFulfillmentFlows` | `resolve-catalog-item` |
91
- | `list-flow-orchestrations` | read | implemented | `queryFlowOrchestrations` | `resolve-catalog-item` |
92
- | `list-stage-definitions` | read | implemented | `queryStageDefinitions` | `resolve-catalog-item` |
93
- | `bind-fulfillment-flow` | write | implemented | `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `list-fulfillment-flows`, `list-flow-orchestrations`, `list-stage-definitions` |
94
- | `verify-fulfillment` | verify | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `bind-fulfillment-flow` |
95
-
96
- ### Dependency graph
97
-
98
- ```mermaid
99
- graph TD
100
- resolve_catalog_item["resolve-catalog-item (read)"]
101
- list_fulfillment_flows["list-fulfillment-flows (read)"]
102
- list_flow_orchestrations["list-flow-orchestrations (read)"]
103
- list_stage_definitions["list-stage-definitions (read)"]
104
- bind_fulfillment_flow["bind-fulfillment-flow (write)"]
105
- verify_fulfillment["verify-fulfillment (verify)"]
106
- resolve_catalog_item --> list_fulfillment_flows
107
- resolve_catalog_item --> list_flow_orchestrations
108
- resolve_catalog_item --> list_stage_definitions
109
- resolve_catalog_item --> bind_fulfillment_flow
110
- list_fulfillment_flows --> bind_fulfillment_flow
111
- list_flow_orchestrations --> bind_fulfillment_flow
112
- list_stage_definitions --> bind_fulfillment_flow
113
- resolve_catalog_item --> verify_fulfillment
114
- bind_fulfillment_flow --> verify_fulfillment
115
- ```
116
-
117
- ### Read operations
118
-
119
- #### `resolve-catalog-item`
120
-
121
- 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), the current intake surface (intakeForm.id AND intakeForm.intakeFormId + intakeForm.type — the bound Flow/OmniScript, NOT just the container id, so the bind carries the WHOLE surface forward) and the current fulfillmentFlow (to show what is already attached, if anything) — the bind step re-sends the identity fields to avoid the DETACH TRAP.
122
-
123
-
124
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
125
-
126
- **Inputs:**
127
-
128
- - `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.
129
-
130
- #### `list-fulfillment-flows`
131
-
132
- ATTACH, FLOW — list the org's autolaunched Flows selectable as a fulfilment flow via UIAPI GraphQL: FlowRecord filtered to a non-draft ProgressStatus and an autolaunched FlowType. Present the COMPLETE set as numbered text (FlowLabel, FlowRecord_ApiName, and the bindable 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 ProgressStatus/FlowType 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: bind the node.Id (the FlowRecord version id, 2aF-prefix), read from the chosen edge. node.Id is present for EVERY listed flow — including managed/packaged flows — and is the value the ProductFulfillmentScenario actually stores. A node.FlowDefinition.value (300-prefix definition id) ALSO binds when present, but managed/packaged flows carry a null FlowDefinition.value, so node.Id is the universal choice that matches what the "Associate a Fulfilment flow" modal binds. The catalog-item bind resolves either id form; only a value that is not a resolvable flow id (e.g. a namespaced DeveloperName string) is rejected.
133
-
134
-
135
- **Call:** `queryFulfillmentFlows` — status: `implemented`
136
-
137
- **Depends on:** `resolve-catalog-item`
138
-
139
- #### `list-flow-orchestrations`
140
-
141
- ATTACH, FLOW ORCHESTRATOR — list the org's Flow Orchestrations selectable as a fulfilment flow via UIAPI GraphQL: FlowOrchestration filtered to a non-draft Status. Present the COMPLETE set as numbered text (OrchestrationLabel, 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 orchestration, add a label predicate to the where filter — {OrchestrationLabel: {like: "%<name>%"}}, AND-combined with the Status 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.Id (the FlowOrchestration record id, 1Fe-prefix), read from the chosen edge. node.Id is present for EVERY listed orchestration — including managed/packaged ones — and is what the ProductFulfillmentScenario stores. A node.OrchestrationDefinition.value (300-prefix definition id) ALSO binds when present, but managed/packaged orchestrations carry a null OrchestrationDefinition.value, so node.Id is the universal choice.
142
-
143
-
144
- **Call:** `queryFlowOrchestrations` — status: `implemented`
145
-
146
- **Depends on:** `resolve-catalog-item`
147
-
148
- #### `list-stage-definitions`
149
-
150
- ATTACH, STAGE MANAGEMENT — list the org's Stage Definitions selectable as a fulfilment flow via a SOQL query over the StageDefinition SObject (Id, MasterLabel, DeveloperName, IsActive). Present the COMPLETE set as numbered text (MasterLabel, 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: when the user has already NAMED the stage definition, append AND MasterLabel LIKE '%<name>%' to the SOQL WHERE 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. The chosen record's Id becomes fulfillmentFlow.fulfillmentFlowId on the bind.
151
-
152
-
153
- **Call:** `queryStageDefinitions` — status: `implemented`
154
-
155
- **Inputs:**
156
-
157
- - `q` *(`string`)*
158
-
159
- **Depends on:** `resolve-catalog-item`
160
-
161
- ### Write operations
162
-
163
- #### `bind-fulfillment-flow`
164
-
165
- ATTACH BIND — bind the chosen Flow / Flow Orchestrator / Stage Definition to the process via patchCatalogItemGet, sending fulfillmentFlow:{fulfillmentFlowId:<chosen id>, operationType:<computed>, type:<Flow|FlowOrchestrator|StageManagement>}. OPERATIONTYPE IS COMPUTED (Create/Update split, same as the intake container): if resolve-catalog-item returned NO fulfillmentFlow, send operationType:"Create" with NO fulfillmentFlow.id — this mints the ProductFulfillmentScenario and binds the flow. A hardcoded operationType:"Update" on a first attach SILENTLY NO-OPS (the PATCH 200s but the flow never persists — reads back absent on the verify GET). If a fulfillmentFlow is already bound, send operationType:"Update" AND carry resolve-catalog-item.existing_fulfillment_scenario_id forward as fulfillmentFlow.id to repoint the existing scenario. [precondition: bind_fulfillment_operation_type_rule] DETACH TRAP: the PATCH is a FULL overwrite — it 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 on the next GET, not reset to a default); omitting name/usedFor nulls them too. 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.
166
-
167
-
168
- **Call:** `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
169
-
170
- **Inputs:**
171
-
172
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to bind the fulfilment flow to.
173
- - `fulfillmentFlowId` *(`String`)* — The chosen fulfilment surface id — for a Flow, the node.Id (2aF-prefix FlowRecord version id) from list-fulfillment-flows.flows; present for every flow including managed/packaged ones and what the scenario stores (node.FlowDefinition.value, the 300-prefix definition id, also binds when non-null but is absent for managed flows); for a Flow Orchestrator, the node.Id (1Fe-prefix record id) from list-flow-orchestrations.orchestration_record_ids (present for every orchestration; OrchestrationDefinition.value also binds when non-null but is absent for managed orchestrations); for Stage Management, an Id from list-stage-definitions.stage_definition_ids. MUST be one of the listed ids for this org, never hand-constructed. Sent as fulfillmentFlow.fulfillmentFlowId.
174
-
175
- - **Source:** output of `list-fulfillment-flows`, `list-flow-orchestrations`, `list-stage-definitions`
176
- - `fulfillmentType` *(`String`)* — "Flow", "FlowOrchestrator", or "StageManagement" (the FulfillmentFlowEnums value) — the chosen fulfilment type. Sent as fulfillmentFlow.type.
177
-
178
- - `fulfillmentOperationType` *(`String`)* — COMPUTED — "Create" when resolve-catalog-item returned NO fulfillmentFlow (first attach; mints the ProductFulfillmentScenario), "Update" when a fulfillmentFlow is already bound (repoints the existing scenario). Sent as fulfillmentFlow.operationType. A hardcoded "Update" on first attach silently no-ops. [precondition: bind_fulfillment_operation_type_rule]
179
-
180
- - `fulfillmentScenarioId` *(`String`)* — The existing ProductFulfillmentScenario id (fulfillmentFlow.id, 1ax-prefix) from resolve-catalog-item — carried forward as fulfillmentFlow.id ONLY on the replace path (fulfillmentOperationType=="Update"). Omit fulfillmentFlow.id entirely on the first-attach (Create) path.
181
-
182
- - **Source:** output of `resolve-catalog-item`
183
- - `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.
184
-
185
- - **Source:** output of `resolve-catalog-item`
186
- - `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.
187
-
188
- - **Source:** output of `resolve-catalog-item`
189
- - `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.
190
-
191
- - **Source:** output of `resolve-catalog-item`
192
- - `targetObject` *(`String`)* — The anchor object — a CLOSED enum: Case, Incident, or ServiceRequest (TargetObjectEnums; other SObjects are rejected). Re-sent on this full-overwrite Update 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.
193
-
194
- - **Source:** output of `resolve-catalog-item`
195
- - `name` *(`String`)* — The process name — re-sent to preserve identity on this full-overwrite Update.
196
- - `usedFor` *(`String`)* — The usedFor value (ServiceProcess) — re-sent to preserve identity.
197
- - `isActive` *(`Boolean`)* — The isActive flag — re-sent to preserve identity.
198
-
199
- **Depends on:** `resolve-catalog-item`, `list-fulfillment-flows`, `list-flow-orchestrations`, `list-stage-definitions`
200
-
201
- **Rollback:** To unbind, re-invoke patchCatalogItemGet with fulfillmentFlow:{id:<the 1ax scenario id from fulfillment_scenario_id>, fulfillmentFlowId, type, operationType:"Delete"}, always re-sending the anchor identity fields AND the full intakeForm block (id + intakeFormId + type when a surface exists) — the unbind PATCH is the same full-overwrite, so anchor-only re-send would wipe the surface; the verify GET then shows no fulfillmentFlow. To swap instead of remove, re-bind a different surface with operationType:"Update" carrying the same scenario id. The catalog-item resource itself has no DELETE method.
202
-
203
- ### Verify operations
204
-
205
- #### `verify-fulfillment`
206
-
207
- Read the process back and confirm the fulfilment flow is bound and the anchor held. Works for every branch (Flow / FlowOrchestrator / StageManagement).
208
-
209
-
210
- **Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
211
-
212
- **Inputs:**
213
-
214
- - `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to verify.
215
-
216
- **Depends on:** `resolve-catalog-item`, `bind-fulfillment-flow`