@salesforce/afv-skills 1.63.0 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-gpt-email-generation-configure/SKILL.md +312 -0
  3. package/skills/agentforce-offline-experimentation-run/SKILL.md +253 -0
  4. package/skills/agentforce-offline-experimentation-run/scripts/build_report.py +796 -0
  5. package/skills/agentforce-offline-experimentation-run/scripts/resolve-token.sh +111 -0
  6. package/skills/agentforce-offline-experimentation-run/scripts/sfap_replay.py +1053 -0
  7. package/skills/agentforce-wizard-ui-forecasting-analytics-components-configure/SKILL.md +64 -0
  8. package/skills/agentforce-wizard-ui-sales-einstein-components-configure/SKILL.md +46 -0
  9. package/skills/automation-company-profile-info-query/SKILL.md +51 -0
  10. package/skills/automation-digital-wallet-configure/SKILL.md +689 -0
  11. package/skills/automation-flow-coordinate/SKILL.md +95 -0
  12. package/skills/automation-flow-coordinate/references/elements/action-call/action-call.md +1569 -0
  13. package/skills/automation-flow-coordinate/references/elements/action-call/conversation-messaging.md +96 -0
  14. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-sms-message.json +23 -0
  15. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-to-journey-no-fields.json +31 -0
  16. package/skills/automation-flow-coordinate/references/elements/action-call/send-to-journey.md +179 -0
  17. package/skills/automation-flow-coordinate/references/elements/exit-rule/examples/event-email-link-click.json +13 -0
  18. package/skills/automation-flow-coordinate/references/elements/exit-rule/exit-rule.md +83 -0
  19. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/examples/forward-to-bot-or-agent.json +69 -0
  20. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/forward-to-bot-or-agent.md +274 -0
  21. package/skills/automation-flow-coordinate/references/elements/start/audience-common.md +192 -0
  22. package/skills/automation-flow-coordinate/references/elements/start/automation-event-triggered.md +130 -0
  23. package/skills/automation-flow-coordinate/references/elements/start/data-cloud-data-change-triggered.md +92 -0
  24. package/skills/automation-flow-coordinate/references/elements/start/form-submission-triggered.md +88 -0
  25. package/skills/automation-flow-coordinate/references/elements/start/segment-triggered.md +152 -0
  26. package/skills/automation-flow-coordinate/references/elements/start/start.md +539 -0
  27. package/skills/automation-flow-coordinate/references/elements/subflow/subflow.md +152 -0
  28. package/skills/automation-flow-coordinate/references/elements/wait/wait.md +497 -0
  29. package/skills/automation-flow-coordinate/references/recipes/author/author.md +868 -0
  30. package/skills/automation-flow-coordinate/references/recipes/summarize/element-generic.md +300 -0
  31. package/skills/automation-flow-coordinate/references/recipes/summarize/reference-resolution.md +292 -0
  32. package/skills/automation-flow-coordinate/references/recipes/summarize/summarize.md +323 -0
  33. package/skills/automation-flow-coordinate/references/recipes/testing/examples/debug-output-template.md +109 -0
  34. package/skills/automation-flow-coordinate/references/recipes/testing/shape.md +219 -0
  35. package/skills/automation-flow-coordinate/references/recipes/testing/shared-stages/intent-analyzer.md +180 -0
  36. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/debug.md +175 -0
  37. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/promote.md +255 -0
  38. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/save-debug.md +212 -0
  39. package/skills/automation-flow-coordinate/references/resources/variable/variable.md +171 -0
  40. package/skills/automation-flow-coordinate/references/shared/anti-patterns.md +786 -0
  41. package/skills/automation-flow-coordinate/references/shared/end/end.md +267 -0
  42. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/README.md +69 -0
  43. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/predictions.jsonl +80 -0
  44. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/prompts.jsonl +116 -0
  45. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/flow-type-resolver.md +321 -0
  46. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/taxonomy.json +320 -0
  47. package/skills/automation-flow-coordinate/references/shared/server-functions.md +597 -0
  48. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +21 -11
  49. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +10 -0
  50. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
  51. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +44 -1
  52. package/skills/automation-sandbox-post-copy-configure/SKILL.md +132 -124
  53. package/skills/automation-sandbox-post-copy-configure/references/flow_activation_path.md +151 -0
  54. package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +55 -9
  55. package/skills/automotive-cloud-appraisal-management-settings-configure/SKILL.md +69 -0
  56. package/skills/automotive-cloud-dealer-essentials-configure/SKILL.md +78 -0
  57. package/skills/automotive-cloud-ground-agent-data-pipelines-configure/SKILL.md +373 -0
  58. package/skills/automotive-cloud-ground-mfg-agent-data-pipelines-configure/SKILL.md +273 -0
  59. package/skills/automotive-cloud-mfg-agent-data-pipelines-configure/SKILL.md +259 -0
  60. package/skills/automotive-cloud-mfg-sales-concierge-agent-create/SKILL.md +369 -0
  61. package/skills/automotive-cloud-mfg-sales-concierge-foundation-configure/SKILL.md +542 -0
  62. package/skills/automotive-cloud-mfg-sales-concierge-foundation-coordinate/SKILL.md +159 -0
  63. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-agent-create/SKILL.md +349 -0
  64. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-configure/SKILL.md +505 -0
  65. package/skills/automotive-cloud-sales-concierge-agent-create/SKILL.md +380 -0
  66. package/skills/automotive-cloud-sales-concierge-foundation-configure/SKILL.md +567 -0
  67. package/skills/automotive-cloud-sales-concierge-foundation-coordinate/SKILL.md +159 -0
  68. package/skills/automotive-cloud-sales-concierge-orchestrator-agent-create/SKILL.md +360 -0
  69. package/skills/automotive-cloud-sales-concierge-orchestrator-configure/SKILL.md +539 -0
  70. package/skills/automotive-cloud-sales-concierge-search-grounding-configure/SKILL.md +358 -0
  71. package/skills/commerce-b2b-merchant-quote-configure/SKILL.md +602 -0
  72. package/skills/commerce-b2b-store-configure/SKILL.md +251 -0
  73. package/skills/commerce-credit-memo-create/SKILL.md +139 -0
  74. package/skills/commerce-delivery-business-hours-configure/SKILL.md +277 -0
  75. package/skills/commerce-delivery-estimation-apply/SKILL.md +155 -0
  76. package/skills/commerce-delivery-estimation-configure/SKILL.md +377 -0
  77. package/skills/commerce-delivery-routing-specs-integrate/SKILL.md +174 -0
  78. package/skills/commerce-estimate-bopis-query/SKILL.md +279 -0
  79. package/skills/commerce-estimate-delivery-date-query/SKILL.md +349 -0
  80. package/skills/commerce-fees-apply/SKILL.md +227 -0
  81. package/skills/commerce-fulfillment-routing-analyze/SKILL.md +200 -0
  82. package/skills/commerce-guest-buyer-create/SKILL.md +173 -0
  83. package/skills/commerce-location-bopis-configure/SKILL.md +378 -0
  84. package/skills/commerce-location-business-hours-configure/SKILL.md +235 -0
  85. package/skills/commerce-location-delivery-processing-time-configure/SKILL.md +309 -0
  86. package/skills/commerce-location-graph-integrate/SKILL.md +131 -0
  87. package/skills/commerce-location-shipping-carrier-method-configure/SKILL.md +755 -0
  88. package/skills/commerce-location-temporary-operating-hours-configure/SKILL.md +331 -0
  89. package/skills/commerce-merchant-buyer-groups-configure/SKILL.md +579 -0
  90. package/skills/commerce-merchant-buyer-user-onboarding-create/SKILL.md +626 -0
  91. package/skills/commerce-merchant-catalog-configure/SKILL.md +614 -0
  92. package/skills/commerce-merchant-extension-provider-configure/SKILL.md +368 -0
  93. package/skills/commerce-merchant-insights-account-health-churn-analyze/SKILL.md +118 -0
  94. package/skills/commerce-merchant-insights-inventory-returns-analyze/SKILL.md +65 -0
  95. package/skills/commerce-merchant-insights-order-shopper-get/SKILL.md +90 -0
  96. package/skills/commerce-merchant-insights-product-performance-analyze/SKILL.md +72 -0
  97. package/skills/commerce-merchant-insights-query/SKILL.md +279 -0
  98. package/skills/commerce-merchant-storefront-guest-access-configure/SKILL.md +656 -0
  99. package/skills/commerce-order-summary-change-apply/SKILL.md +375 -0
  100. package/skills/commerce-product-details-get/SKILL.md +363 -0
  101. package/skills/commerce-product-search/SKILL.md +563 -0
  102. package/skills/commerce-react-storefront-create/SKILL.md +350 -0
  103. package/skills/commerce-return-order-summary-create/SKILL.md +513 -0
  104. package/skills/commerce-search-relevance-analyze/SKILL.md +757 -0
  105. package/skills/commerce-temporary-processing-time-override-create/SKILL.md +274 -0
  106. package/skills/communications-initial-setup-configure/SKILL.md +630 -0
  107. package/skills/communications-multisite-configure/SKILL.md +571 -0
  108. package/skills/communications-revenue-cloud-settings-configure/SKILL.md +74 -0
  109. package/skills/communications-smb-fiber-catalog-create/SKILL.md +413 -0
  110. package/skills/communications-tmf-integrate/SKILL.md +1368 -0
  111. package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +54 -107
  112. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/copy.json +1 -1
  113. package/skills/consumer-goods-promotion-bo-api-deploy/references/conventions-and-payload-rules.md +82 -5
  114. package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +35 -2
  115. package/skills/consumer-goods-promotion-bo-api-deploy/references/preflight-and-seed-queries.md +149 -0
  116. package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +17 -1
  117. package/skills/consumer-goods-visit-activity-act4-questions-assign/SKILL.md +448 -0
  118. package/skills/consumer-goods-visit-activity-act5-standard-create/SKILL.md +269 -0
  119. package/skills/consumer-goods-visit-activity-act6-assortment-configure/SKILL.md +271 -0
  120. package/skills/consumer-goods-visit-activity-act7-account-scoping-create/SKILL.md +382 -0
  121. package/skills/consumer-goods-visit-activity-act8-plan-attach-create/SKILL.md +373 -0
  122. package/skills/consumer-goods-visit-activity-act9-proof-validate/SKILL.md +389 -0
  123. package/skills/consumer-goods-visit-and-activity-act1-specification-create/SKILL.md +338 -0
  124. package/skills/consumer-goods-visit-and-activity-act2-template-create/SKILL.md +547 -0
  125. package/skills/consumer-goods-visit-and-activity-act3-definition-create/SKILL.md +346 -0
  126. package/skills/consumer-goods-visit-and-activity-configure/SKILL.md +1110 -0
  127. package/skills/crm-analytics-adoption-insights-configure/SKILL.md +224 -0
  128. package/skills/crm-analytics-custom-report-type-lightning-configure/SKILL.md +418 -0
  129. package/skills/crm-analytics-dashboards-configure/SKILL.md +731 -0
  130. package/skills/crm-analytics-operational-analytics-metadata-bridge-migrate/SKILL.md +233 -0
  131. package/skills/crm-analytics-report-notifications-ui-configure/SKILL.md +184 -0
  132. package/skills/crm-analytics-sharing-inheritance-coverage-analyze/SKILL.md +167 -0
  133. package/skills/crm-analytics-sonic-getting-started-configure/SKILL.md +55 -0
  134. package/skills/crm-analytics-tableau-next-app-deploy/SKILL.md +1350 -0
  135. package/skills/crm-analytics-tableau-next-c360-basemodel-validate/SKILL.md +1862 -0
  136. package/skills/crm-analytics-tableau-next-datacloud-validate/SKILL.md +83 -0
  137. package/skills/crm-analytics-tableau-next-provisioning-validate/SKILL.md +81 -0
  138. package/skills/data360-activation-create/SKILL.md +104 -0
  139. package/skills/data360-activation-external-platform-get/SKILL.md +49 -0
  140. package/skills/data360-activation-target-create/SKILL.md +93 -0
  141. package/skills/data360-activation-v2-create/SKILL.md +456 -0
  142. package/skills/data360-audience-dmo-get/SKILL.md +38 -0
  143. package/skills/data360-calculated-affinity-create/SKILL.md +82 -0
  144. package/skills/data360-calculated-insight-create/SKILL.md +148 -0
  145. package/skills/data360-catalog-metadata-create/SKILL.md +183 -0
  146. package/skills/data360-code-extension-create/SKILL.md +115 -0
  147. package/skills/data360-communication-capping-create/SKILL.md +227 -0
  148. package/skills/data360-connection-create/SKILL.md +491 -0
  149. package/skills/data360-content-lens-create/SKILL.md +181 -0
  150. package/skills/data360-data-action-create/SKILL.md +126 -0
  151. package/skills/data360-data-action-target-create/SKILL.md +181 -0
  152. package/skills/data360-data-clean-room-create/SKILL.md +238 -0
  153. package/skills/data360-data-governance-create/SKILL.md +746 -0
  154. package/skills/data360-data-graph-create/SKILL.md +82 -0
  155. package/skills/data360-data-harmonized-model-object-reference-create/SKILL.md +38 -0
  156. package/skills/data360-data-lake-object-create/SKILL.md +207 -0
  157. package/skills/data360-data-model-object-catalog-get/SKILL.md +49 -0
  158. package/skills/data360-data-model-object-create/SKILL.md +128 -0
  159. package/skills/data360-data-model-object-mapping-create/SKILL.md +106 -0
  160. package/skills/data360-data-space-create/SKILL.md +161 -0
  161. package/skills/data360-data-streams-create/SKILL.md +324 -0
  162. package/skills/data360-engagement-signal-get/SKILL.md +38 -0
  163. package/skills/data360-experiment-create/SKILL.md +82 -0
  164. package/skills/data360-goal-based-campaign-create/SKILL.md +192 -0
  165. package/skills/data360-harmonization-process-history-get/SKILL.md +38 -0
  166. package/skills/data360-harmonized-unstructured-dmo-create/SKILL.md +84 -0
  167. package/skills/data360-identity-resolution-create/SKILL.md +115 -0
  168. package/skills/data360-intelligent-document-processing-create/SKILL.md +148 -0
  169. package/skills/data360-knowledge-graph-construction-create/SKILL.md +93 -0
  170. package/skills/data360-knowledge-graph-create/SKILL.md +216 -0
  171. package/skills/data360-knowledge-space-mcp-configure/SKILL.md +475 -0
  172. package/skills/data360-machine-learning-mcp-configure/SKILL.md +697 -0
  173. package/skills/data360-multi-org-mcp-configure/SKILL.md +117 -0
  174. package/skills/data360-secondary-index-mcp-configure/SKILL.md +126 -0
  175. package/skills/data360-segment-mcp-configure/SKILL.md +159 -0
  176. package/skills/data360-semantic-calculated-dimension-mcp-configure/SKILL.md +93 -0
  177. package/skills/data360-semantic-calculated-measurement-mcp-configure/SKILL.md +93 -0
  178. package/skills/data360-semantic-data-object-mcp-configure/SKILL.md +93 -0
  179. package/skills/data360-semantic-dimension-mcp-configure/SKILL.md +38 -0
  180. package/skills/data360-semantic-engine-mcp-configure/SKILL.md +62 -0
  181. package/skills/data360-semantic-measurement-mcp-configure/SKILL.md +38 -0
  182. package/skills/data360-semantic-metric-mcp-configure/SKILL.md +93 -0
  183. package/skills/data360-semantic-model-mcp-configure/SKILL.md +115 -0
  184. package/skills/data360-standard-mapping-mcp-configure/SKILL.md +38 -0
  185. package/skills/data360-tenant-lifecycle-mcp-configure/SKILL.md +73 -0
  186. package/skills/dx-devops-conflict-resolve/SKILL.md +1 -5
  187. package/skills/dx-devops-pipeline-manage/SKILL.md +1 -5
  188. package/skills/dx-devops-project-manage/SKILL.md +1 -5
  189. package/skills/dx-devops-promote/SKILL.md +1 -5
  190. package/skills/dx-devops-request-status/SKILL.md +1 -5
  191. package/skills/dx-lifecycle-center/SKILL.md +120 -0
  192. package/skills/dx-lifecycle-center/examples/workflows.md +175 -0
  193. package/skills/dx-lifecycle-center/references/connect-api.md +123 -0
  194. package/skills/dx-lifecycle-center/references/connect-org.md +184 -0
  195. package/skills/dx-lifecycle-center/references/deploy.md +153 -0
  196. package/skills/dx-lifecycle-center/references/error-handling.md +21 -0
  197. package/skills/dx-lifecycle-center/references/hub-org.md +37 -0
  198. package/skills/dx-lifecycle-center/references/list-orgs.md +99 -0
  199. package/skills/dx-lifecycle-center/references/request-body.md +75 -0
  200. package/skills/dx-lifecycle-center/references/troubleshooting.md +31 -0
  201. package/skills/dx-lifecycle-center/scripts/poll-deploy-status.sh +200 -0
  202. package/skills/dx-lifecycle-center/scripts/resolve-environment.sh +120 -0
  203. package/skills/dx-org-devhub-configure/SKILL.md +1 -3
  204. package/skills/dx-org-shape-manage/SKILL.md +1 -5
  205. package/skills/dx-org-snapshot-manage/SKILL.md +1 -3
  206. package/skills/education-cloud-academic-calendar-generate/SKILL.md +1 -3
  207. package/skills/education-cloud-course-catalog-migrate/SKILL.md +1 -3
  208. package/skills/education-cloud-domain-configure/SKILL.md +1 -3
  209. package/skills/education-cloud-multi-campus-configure/SKILL.md +1 -3
  210. package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +1 -5
  211. package/skills/experience-afv-query/SKILL.md +234 -0
  212. package/skills/experience-agentforce-vibes-in-react-configure/SKILL.md +63 -0
  213. package/skills/experience-apex-components-configure/SKILL.md +69 -0
  214. package/skills/experience-apex-pages-configure/SKILL.md +107 -0
  215. package/skills/experience-app-home-configure/SKILL.md +76 -0
  216. package/skills/experience-aura-lightning-out-access-configure/SKILL.md +58 -0
  217. package/skills/experience-briefcase-configure/SKILL.md +287 -0
  218. package/skills/experience-community-flexi-page-list-create/SKILL.md +74 -0
  219. package/skills/experience-community-template-definition-list-query/SKILL.md +48 -0
  220. package/skills/experience-community-theme-definition-list-query/SKILL.md +38 -0
  221. package/skills/experience-content-assets-configure/SKILL.md +86 -0
  222. package/skills/experience-custom-domain-create/SKILL.md +727 -0
  223. package/skills/experience-defer-rendering-workspace-page-setup-configure/SKILL.md +41 -0
  224. package/skills/experience-field-service-app-builder-configure/SKILL.md +187 -0
  225. package/skills/experience-flow-category-configure/SKILL.md +117 -0
  226. package/skills/experience-formula-configure/SKILL.md +358 -0
  227. package/skills/experience-global-actions-configure/SKILL.md +69 -0
  228. package/skills/experience-global-publisher-layouts-configure/SKILL.md +79 -0
  229. package/skills/experience-instrumentation-configure/SKILL.md +64 -0
  230. package/skills/experience-lex-engagement-configure/SKILL.md +50 -0
  231. package/skills/experience-lightning-bolt-open/SKILL.md +12 -0
  232. package/skills/experience-lightning-out-configure/SKILL.md +129 -0
  233. package/skills/experience-lightning-preview-configure/SKILL.md +67 -0
  234. package/skills/experience-lightning-types-query/SKILL.md +98 -0
  235. package/skills/experience-malware-scan-configure/SKILL.md +71 -0
  236. package/skills/experience-my-salesforce-configure/SKILL.md +126 -0
  237. package/skills/experience-navigation-menus-configure/SKILL.md +235 -0
  238. package/skills/experience-notification-types-configure/SKILL.md +206 -0
  239. package/skills/experience-notifications-configure/SKILL.md +75 -0
  240. package/skills/experience-record-discovery-query/SKILL.md +227 -0
  241. package/skills/experience-regenerate-previews-open/SKILL.md +94 -0
  242. package/skills/experience-sales-cloud-mab-configure/SKILL.md +254 -0
  243. package/skills/experience-schema-builder-open/SKILL.md +38 -0
  244. package/skills/experience-simple-record-home-configure/SKILL.md +110 -0
  245. package/skills/experience-static-resources-configure/SKILL.md +74 -0
  246. package/skills/experience-ui-bundle-2gp-deploy/SKILL.md +1 -3
  247. package/skills/experience-ui-bundle-features-generate/SKILL.md +1 -5
  248. package/skills/experience-ui-bundle-mfa-configure/SKILL.md +1 -3
  249. package/skills/field-service-data-capture-form-deployer-configure/SKILL.md +23 -2
  250. package/skills/field-service-data-capture-form-designer-configure/SKILL.md +13 -3
  251. package/skills/field-service-data-capture-migrate/SKILL.md +1 -3
  252. package/skills/field-service-mobile-branding-configure/SKILL.md +17 -3
  253. package/skills/field-service-objective-designer-configure/SKILL.md +72 -379
  254. package/skills/field-service-prework-brief-deployer-configure/SKILL.md +10 -537
  255. package/skills/field-service-scheduling-policy-designer-query/SKILL.md +65 -1093
  256. package/skills/{field-service-setup-orchestrator-get → field-service-setup-coordinate}/SKILL.md +18 -3
  257. package/skills/field-service-sobject-create-configure/SKILL.md +13 -213
  258. package/skills/field-service-voice-to-form-configure/SKILL.md +40 -11
  259. package/skills/field-service-work-plan-configure/SKILL.md +253 -0
  260. package/skills/field-service-work-rule-designer-configure/SKILL.md +121 -95
  261. package/skills/fsc-actionable-segmentation-settings-configure/SKILL.md +180 -0
  262. package/skills/fsc-digital-origination-bre-decision-matrix-foundation-create/SKILL.md +196 -0
  263. package/skills/fsc-digital-origination-bre-disclosures-consent-configure/SKILL.md +106 -0
  264. package/skills/fsc-digital-origination-bre-document-upload-configure/SKILL.md +96 -0
  265. package/skills/fsc-digital-origination-bre-permissions-assign/SKILL.md +111 -0
  266. package/skills/fsc-digital-origination-bre-setup-coordinate/SKILL.md +250 -0
  267. package/skills/fsc-digital-origination-bre-stp-eligibility-configure/SKILL.md +122 -0
  268. package/skills/fsc-digital-origination-coordinate/SKILL.md +653 -0
  269. package/skills/fsc-digital-origination-demo-run/SKILL.md +225 -0
  270. package/skills/fsc-digital-origination-execution-guardrails-validate/SKILL.md +112 -0
  271. package/skills/fsc-digital-origination-initial-setup-configure/SKILL.md +396 -0
  272. package/skills/fsc-digital-origination-pricing-setup-coordinate/SKILL.md +336 -0
  273. package/skills/fsc-digital-origination-pricing-setup-data-foundation-create/SKILL.md +208 -0
  274. package/skills/fsc-digital-origination-pricing-setup-procedure-create/SKILL.md +375 -0
  275. package/skills/fsc-digital-origination-product-setup-act1-permissions-assign/SKILL.md +83 -0
  276. package/skills/fsc-digital-origination-product-setup-coordinate/SKILL.md +248 -0
  277. package/skills/fsc-digital-origination-sample-data-create/SKILL.md +206 -0
  278. package/skills/fsc-document-checklist-settings-configure/SKILL.md +57 -0
  279. package/skills/fsc-flexible-hierarchy-configure/SKILL.md +148 -0
  280. package/skills/fsc-flexible-hierarchy-foundation-configure/SKILL.md +1430 -0
  281. package/skills/fsc-flexible-hierarchy-graph-config-create/SKILL.md +471 -0
  282. package/skills/fsc-flexible-hierarchy-rule-based-graph-deploy/SKILL.md +429 -0
  283. package/skills/fsc-pricing-product-configurator-configure/SKILL.md +150 -0
  284. package/skills/fsc-pricing-salesforce-omnistudio-switch/SKILL.md +123 -0
  285. package/skills/fsc-product-act2-catalog-categories-create/SKILL.md +82 -0
  286. package/skills/fsc-product-act3-attributes-create/SKILL.md +249 -0
  287. package/skills/fsc-product-act4-classification-assignment-create/SKILL.md +196 -0
  288. package/skills/fsc-product-act5-considerations-get/SKILL.md +44 -0
  289. package/skills/fsc-stage-management-apex-flow-deploy/SKILL.md +384 -0
  290. package/skills/fsc-stage-management-compliant-data-sharing-configure/SKILL.md +144 -0
  291. package/skills/fsc-stage-management-decision-matrices-create/SKILL.md +107 -0
  292. package/skills/fsc-stage-management-definition-assignments-create/SKILL.md +189 -0
  293. package/skills/fsc-stage-management-definition-create/SKILL.md +108 -0
  294. package/skills/fsc-stage-management-permissions-assign/SKILL.md +143 -0
  295. package/skills/fsc-stage-management-transitions-configure/SKILL.md +139 -0
  296. package/skills/health-cloud-appt-booking-config-configure/SKILL.md +135 -0
  297. package/skills/health-cloud-appt-booking-url-config-configure/SKILL.md +134 -0
  298. package/skills/health-cloud-care-provider-affl-role-config-configure/SKILL.md +136 -0
  299. package/skills/health-cloud-care-provider-search-config-configure/SKILL.md +134 -0
  300. package/skills/health-cloud-care-requests-create/SKILL.md +178 -0
  301. package/skills/health-cloud-initial-configure/SKILL.md +511 -0
  302. package/skills/health-cloud-patient-appointment-scheduling-configure/SKILL.md +1374 -0
  303. package/skills/health-cloud-provider-search-settings-configure/SKILL.md +924 -0
  304. package/skills/health-cloud-referral-management-coordinate/SKILL.md +513 -0
  305. package/skills/health-cloud-timeline-configure/SKILL.md +622 -0
  306. package/skills/health-cloud-virtual-visit-config-configure/SKILL.md +135 -0
  307. package/skills/industries-account-score-settings-query/SKILL.md +78 -0
  308. package/skills/industries-actionable-list-data-sources-dmo-configure/SKILL.md +177 -0
  309. package/skills/industries-ad-product-availability-search/SKILL.md +399 -0
  310. package/skills/industries-advanced-account-forecast-settings-configure/SKILL.md +628 -0
  311. package/skills/industries-advanced-therapy-management-settings-configure/SKILL.md +73 -0
  312. package/skills/industries-atm-settings-starter-configure/SKILL.md +76 -0
  313. package/skills/industries-batch-document-ai-configure/SKILL.md +196 -0
  314. package/skills/industries-behavioral-health-app-settings-configure/SKILL.md +71 -0
  315. package/skills/industries-branch-management-settings-configure/SKILL.md +89 -0
  316. package/skills/industries-bre-decision-table-access-configure/SKILL.md +367 -0
  317. package/skills/industries-brokerage-settings-configure/SKILL.md +41 -0
  318. package/skills/industries-calendar-sync-settings-configure/SKILL.md +89 -0
  319. package/skills/industries-care-request-settings-configure/SKILL.md +218 -0
  320. package/skills/industries-case-management-intelligence-settings-configure/SKILL.md +54 -0
  321. package/skills/industries-catalog-process-attributes-products-configure/SKILL.md +380 -0
  322. package/skills/industries-catalog-process-fulfillment-configure/SKILL.md +216 -0
  323. package/skills/industries-catalog-process-intake-configure/SKILL.md +219 -0
  324. package/skills/industries-catalog-process-knowledge-configure/SKILL.md +153 -0
  325. package/skills/industries-catalog-process-preprocessor-configure/SKILL.md +168 -0
  326. package/skills/industries-cds-general-settings-configure/SKILL.md +69 -0
  327. package/skills/industries-claim-financial-settings-configure/SKILL.md +169 -0
  328. package/skills/industries-clinical-data-model-settings-configure/SKILL.md +136 -0
  329. package/skills/industries-clinical-data-model-settings-starter-configure/SKILL.md +105 -0
  330. package/skills/industries-collection-plan-settings-configure/SKILL.md +132 -0
  331. package/skills/industries-comms-service-console-settings-configure/SKILL.md +159 -0
  332. package/skills/industries-compliance-configure/SKILL.md +102 -0
  333. package/skills/industries-compliance-document-extraction-setup-configure/SKILL.md +76 -0
  334. package/skills/industries-contact-center-app-layout-configure/SKILL.md +88 -0
  335. package/skills/industries-contact-center-components-configure/SKILL.md +96 -0
  336. package/skills/industries-contact-center-path-knowledge-configure/SKILL.md +95 -0
  337. package/skills/industries-contact-center-user-access-assign/SKILL.md +96 -0
  338. package/skills/industries-course-waitlist-config-configure/SKILL.md +162 -0
  339. package/skills/industries-crisis-center-settings-configure/SKILL.md +84 -0
  340. package/skills/industries-custom-object-settings-configure/SKILL.md +94 -0
  341. package/skills/industries-data-cloud-integration-configure/SKILL.md +88 -0
  342. package/skills/industries-data-space-feature-mappings-configure/SKILL.md +245 -0
  343. package/skills/industries-decision-matrix-builder-configure/SKILL.md +78 -0
  344. package/skills/industries-decision-table-hbase-configure/SKILL.md +87 -0
  345. package/skills/industries-decision-table-version-configure/SKILL.md +74 -0
  346. package/skills/industries-decision-tables-builder-configure/SKILL.md +253 -0
  347. package/skills/industries-decision-tables-configure/SKILL.md +439 -0
  348. package/skills/industries-energy-utilities-configure/SKILL.md +251 -0
  349. package/skills/industries-eu-cloud-multisite-configure/SKILL.md +1008 -0
  350. package/skills/industries-eu-new-connections-configure/SKILL.md +30 -0
  351. package/skills/industries-explainability-msg-template-configure/SKILL.md +135 -0
  352. package/skills/industries-expression-set-message-token-configure/SKILL.md +135 -0
  353. package/skills/industries-field-service-settings-configure/SKILL.md +82 -0
  354. package/skills/industries-form-framework-settings-configure/SKILL.md +30 -0
  355. package/skills/industries-fsc-ai-settings-configure/SKILL.md +57 -0
  356. package/skills/industries-fsc-association-engine-settings-configure/SKILL.md +172 -0
  357. package/skills/industries-fsc-b2b-settings-configure/SKILL.md +61 -0
  358. package/skills/industries-fsc-insurance-settings-configure/SKILL.md +58 -0
  359. package/skills/industries-fsc-visa-fulfillment-setup-configure/SKILL.md +103 -0
  360. package/skills/industries-fsc-wealth-agent-settings-configure/SKILL.md +117 -0
  361. package/skills/industries-fsc-wealth-settings-configure/SKILL.md +99 -0
  362. package/skills/industries-fundraising-gift-entry-settings-configure/SKILL.md +120 -0
  363. package/skills/industries-fundraising-rfm-configure/SKILL.md +128 -0
  364. package/skills/industries-fundraising-settings-configure/SKILL.md +145 -0
  365. package/skills/industries-fundraising-source-code-gen-configure/SKILL.md +299 -0
  366. package/skills/industries-google-maps-api-key-settings-configure/SKILL.md +87 -0
  367. package/skills/industries-grantmaking-intelligence-settings-open/SKILL.md +58 -0
  368. package/skills/industries-hc-score-category-settings-configure/SKILL.md +167 -0
  369. package/skills/industries-health-engagement-settings-configure/SKILL.md +218 -0
  370. package/skills/industries-home-health-agentforce-setup-configure/SKILL.md +131 -0
  371. package/skills/industries-home-health-bundling-policy-create/SKILL.md +50 -0
  372. package/skills/industries-home-health-entity-labels-configure/SKILL.md +29 -0
  373. package/skills/industries-home-health-fsl-package-deploy/SKILL.md +71 -0
  374. package/skills/industries-home-health-fsl-settings-validate/SKILL.md +27 -0
  375. package/skills/industries-home-health-guided-setup-care-and-skill-get/SKILL.md +80 -0
  376. package/skills/industries-home-health-guided-setup-configure/SKILL.md +836 -0
  377. package/skills/industries-home-health-guided-setup-enable-org-fsl-get/SKILL.md +55 -0
  378. package/skills/industries-home-health-guided-setup-get-org-ready-get/SKILL.md +61 -0
  379. package/skills/industries-home-health-licenses-assign/SKILL.md +27 -0
  380. package/skills/industries-home-health-operating-hours-create/SKILL.md +40 -0
  381. package/skills/industries-home-health-scheduling-policy-create/SKILL.md +41 -0
  382. package/skills/industries-home-health-service-objective-create/SKILL.md +22 -0
  383. package/skills/industries-home-health-skills-create/SKILL.md +31 -0
  384. package/skills/industries-home-health-users-create/SKILL.md +29 -0
  385. package/skills/industries-icm-act3-toggles-configure/SKILL.md +198 -0
  386. package/skills/industries-icm-act5-genai-suggested-assessments-configure/SKILL.md +361 -0
  387. package/skills/industries-icm-act6-mcg-integration-configure/SKILL.md +550 -0
  388. package/skills/industries-integrated-care-management-configure/SKILL.md +168 -0
  389. package/skills/industries-object-enablement-configure/SKILL.md +86 -0
  390. package/skills/industries-tpm-system-processing-service-configure/SKILL.md +64 -0
  391. package/skills/insurance-brokerage-agency-billing-configure/SKILL.md +1 -3
  392. package/skills/integration-apex-settings-configure/SKILL.md +61 -0
  393. package/skills/marketing-e360-email-archiving-configure/SKILL.md +73 -0
  394. package/skills/marketing-message-test/SKILL.md +1 -3
  395. package/skills/nonprofit-fundraising-configure/SKILL.md +240 -0
  396. package/skills/nonprofit-fundraising-configure/references/gotchas.md +26 -0
  397. package/skills/nonprofit-fundraising-configure/references/mcp-invocation.md +678 -0
  398. package/skills/nonprofit-fundraising-configure/references/permission-targeting.md +35 -0
  399. package/skills/nonprofit-volunteer-management-model-get/SKILL.md +166 -0
  400. package/skills/nonprofit-volunteer-management-model-get/references/entities.md +315 -0
  401. package/skills/nonprofit-volunteer-management-model-get/references/relationships.md +175 -0
  402. package/skills/nonprofit-volunteer-management-model-get/references/themes.md +143 -0
  403. package/skills/nonprofit-volunteer-management-records-create/SKILL.md +121 -0
  404. package/skills/nonprofit-volunteer-management-records-create/references/field-guide.md +284 -0
  405. package/skills/nonprofit-volunteer-management-records-create/references/mcp-invocation.md +248 -0
  406. package/skills/nonprofit-volunteer-management-records-create/references/review-format.md +140 -0
  407. package/skills/nonprofit-volunteer-management-records-create/scripts/expand-series.py +632 -0
  408. package/skills/nonprofit-volunteer-management-records-create/scripts/render-review-table.py +419 -0
  409. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_expand_series.py +690 -0
  410. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_render_review_table.py +421 -0
  411. package/skills/nonprofit-volunteer-management-structure-generate/SKILL.md +119 -0
  412. package/skills/nonprofit-volunteer-management-structure-generate/references/configuration-decisions.md +159 -0
  413. package/skills/nonprofit-volunteer-management-structure-generate/references/discovery-interview.md +137 -0
  414. package/skills/nonprofit-volunteer-management-structure-generate/references/edge-cases.md +48 -0
  415. package/skills/nonprofit-volunteer-management-structure-generate/references/mcp-invocation.md +75 -0
  416. package/skills/nonprofit-volunteer-management-structure-generate/references/plan-output.md +141 -0
  417. package/skills/platform-custom-field-generate/SKILL.md +1 -0
  418. package/skills/platform-custom-field-generate/references/advanced-picklists.md +5 -5
  419. package/skills/platform-custom-metadata-type-generate/SKILL.md +3 -0
  420. package/skills/platform-custom-object-generate/SKILL.md +4 -0
  421. package/skills/platform-custom-permissions-configure/SKILL.md +687 -0
  422. package/skills/platform-custom-setting-generate/SKILL.md +3 -0
  423. package/skills/platform-datamask-run/SKILL.md +1 -5
  424. package/skills/platform-label-workbench-import-create/SKILL.md +67 -0
  425. package/skills/platform-permission-set-generate/SKILL.md +3 -0
  426. package/skills/platform-privacy-agent-settings-configure/SKILL.md +752 -0
  427. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +1 -3
  428. package/skills/platform-sandbox-configure/SKILL.md +1 -3
  429. package/skills/platform-value-set-generate/SKILL.md +3 -0
  430. package/skills/sales-call-scoring-configure/SKILL.md +1 -5
  431. package/skills/service-agentforce-channel-configure/SKILL.md +1 -3
  432. package/skills/service-agentforce-human-escalation-configure/SKILL.md +1 -3
  433. package/skills/service-catalog-template-coordinate/SKILL.md +1 -3
  434. package/skills/service-concierge-portal-generate/SKILL.md +1 -3
  435. package/skills/service-email-to-case-configure/SKILL.md +1 -5
  436. package/skills/service-itsm-agentic-setup-agent-runtime-access-assign/SKILL.md +1 -3
  437. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +1 -3
  438. package/skills/service-itsm-agentic-setup-agentforce-studio-configure/SKILL.md +1 -3
  439. package/skills/service-itsm-agentic-setup-agentforce-studio-validate/SKILL.md +1 -3
  440. package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +1 -3
  441. package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -5
  442. package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +1 -3
  443. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +1 -3
  444. package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +1 -3
  445. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +1 -3
  446. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +1 -3
  447. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +1 -0
  448. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/SKILL.md +1 -3
  449. package/skills/service-itsm-agentic-setup-uel-user-create/SKILL.md +1 -9
  450. package/skills/service-itsm-incident-mgmt-configure/SKILL.md +1 -5
  451. package/skills/service-itsm-incident-priority-configure/SKILL.md +1 -3
  452. package/skills/service-itsm-slack-itservice-configure/SKILL.md +1 -3
  453. package/skills/service-itsm-swarming-configure/SKILL.md +1 -3
  454. package/skills/service-itsm-teams-configure/SKILL.md +1 -3
  455. package/skills/service-itsm-teams-debug/SKILL.md +1 -3
  456. package/skills/service-itsm-teams-employee-agent-configure/SKILL.md +1 -3
  457. package/skills/service-itsm-teams-itdesk-configure/SKILL.md +1 -3
  458. package/skills/service-itsm-teams-itservice-configure/SKILL.md +1 -3
  459. package/skills/service-native-voice-recording-transcription-configure/SKILL.md +1 -3
  460. package/skills/service-omni-agent-users-create/SKILL.md +1 -3
  461. package/skills/service-omni-agent-work-sharing-configure/SKILL.md +1 -3
  462. package/skills/service-omni-attribute-routing-configure/SKILL.md +1 -3
  463. package/skills/service-omni-base-settings-configure/SKILL.md +1 -3
  464. package/skills/service-omni-channel-inventory-analyze/SKILL.md +1 -3
  465. package/skills/service-omni-channel-limits-analyze/SKILL.md +1 -3
  466. package/skills/service-omni-channel-setup-coordinate/SKILL.md +1 -3
  467. package/skills/service-omni-command-center-analyze/SKILL.md +1 -3
  468. package/skills/service-omni-command-center-configure/SKILL.md +1 -3
  469. package/skills/service-omni-permission-set-assign/SKILL.md +1 -3
  470. package/skills/service-omni-presence-status-deploy/SKILL.md +1 -3
  471. package/skills/service-omni-presence-user-config-deploy/SKILL.md +1 -3
  472. package/skills/service-omni-queue-deploy/SKILL.md +1 -3
  473. package/skills/service-omni-queue-members-assign/SKILL.md +1 -3
  474. package/skills/service-omni-queue-routing-config-deploy/SKILL.md +1 -3
  475. package/skills/service-omni-routing-flow-deploy/SKILL.md +1 -3
  476. package/skills/service-omni-service-channel-configure/SKILL.md +1 -3
  477. package/skills/service-omni-sidebar-configure/SKILL.md +1 -3
  478. package/skills/service-omni-skills-based-routing-configure/SKILL.md +1 -3
  479. package/skills/service-omni-supervisor-config-deploy/SKILL.md +1 -3
  480. package/skills/service-omni-supervisor-permset-assign/SKILL.md +1 -3
  481. package/skills/service-omni-supervisor-surface-deploy/SKILL.md +1 -3
  482. package/skills/service-omni-supervisor-users-create/SKILL.md +1 -3
  483. package/skills/service-omni-work-skill-routing-configure/SKILL.md +1 -3
  484. package/skills/tableau-next-asset-create/README.md +0 -65
@@ -0,0 +1,1008 @@
1
+ ---
2
+ name: industries-eu-cloud-multisite-configure
3
+ description: "Use this skill when users want to enables Energy & Utilities multisite features on an org that already has E&U Sales configured (or configures it inline if not). Also use when a user says \"enable multisite for Energy and Utilities\" or \"turn on multisite quoting. Trigger when users mention configure, eu, cloud, multisite, industries, energy, utilities, settings, industries energy and utilities settings."
4
+ metadata:
5
+ version: "1.0"
6
+ ---
7
+
8
+ # Managing Configure Eu Cloud Multisite
9
+
10
+ ## When to Use This Skill
11
+
12
+ Enables Energy & Utilities multisite features on an org that already has E&U Sales configured (or configures it inline if not). Use when a user says "enable multisite for Energy and Utilities" or "turn on multisite quoting." Idempotent — reads current pref state first, skips any pref already enabled.
13
+
14
+ ## Workflow
15
+
16
+ If the user just says "enable/configure multisite" (rather than separately running preconfig first), don't stop at the energy-utilities-preconfig precondition check below and hand the user a blocker — call get_sor_detail('energy-utilities-preconfig') and run its steps first. It's fully idempotent (read-verify-first at every step per its own agent_guidance), so running it against an org where it already ran is safe and a no-op; there's no need to pre-check whether it ran before deciding to run it. Only after that returns clean should this SOR's steps run. Pattern for this SOR's own steps: read getIndustriesEnergyUtilitiesPrefs first. If euSalesPrefMap.isPrefEnabled is already true, skip the euSales write. If euMultisiteFeaturePrefMap.showPrefToggle is false, the org lacks the EU Multisite feature entitlement — this is a license-level gate with no API fix; surface as a blocker rather than retrying. Otherwise write euMultisiteFeature=true, then verify via re-read.
17
+
18
+ ## Critical Constraints
19
+
20
+ **Preconditions:**
21
+
22
+ - `energy-utilities-preconfig` (this SOR's top-level `depends_on`) must have already run against the target org — same convention as the sibling TariffComparisonSetup SOR, which declares the identical dependency for the same reason: several steps here overlap in scope with what preconfig already provisions (the 4 multisite permission sets queried in query-multisite-permsets overlap by name with permsets preconfig assigns to the admin; query-decision-table-ids resolves 3 of the 7 canonical decision tables preconfig instantiates; the pricing-procedure steps in STEP 6 assume Salesforce Pricing + Revenue Cloud + Context Service are already enabled, which preconfig owns). This SOR does not inline preconfig's steps itself, but the agent driving this SOR should: on a bare "enable/configure multisite" request, run energy-utilities-preconfig first (see this SOR's top-level `agent_guidance`) rather than guessing at partial enablement or stopping to ask the user to go run it separately — preconfig is idempotent and safe to run unconditionally as a first step. (check: `energy-utilities-preconfig has already run`)
23
+ - Org must have the Energy & Utilities Cloud license provisioned (master license gate). Without it the setup tree leaf is not visible. (check: `Energy & Utilities Cloud license`)
24
+ - User must have Customize Application or System Administrator so the settings guard admits every controller call. (check: `Energy & Utilities settings access`)
25
+ - Required for euMultisiteFeature specifically. If euMultisiteFeaturePrefMap.showPrefToggle=false in the read response, the EU Multisite feature is not provisioned. No API can grant it — it's a license entitlement the admin must arrange. (check: `EU Multisite feature`)
26
+
27
+ ## Verification Checklist
28
+
29
+ After every write operation, confirm the effect by re-reading state:
30
+
31
+ - After `enable-eu-sales`, `enable-multisite-feature`: call `verify-multisite-features` (`GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs`)
32
+ - After `enable-external-pricing`: call `verify-external-pricing` (`GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs`)
33
+ - After `assign-multisite-permsets`: call `verify-multisite-permsets` (`GET /services/data/v67.0/query`)
34
+ - After `assign-standard-user-additional-permsets`: call `verify-standard-user-additional-permsets` (`GET /services/data/v67.0/query`)
35
+ - After `set-fls-node-status-quote-line-item`, `set-fls-node-status-order-item`: call `verify-node-status-fls` (`GET /services/data/v67.0/query`)
36
+ - After `activate-eu-sales-transaction-context`: call `verify-multisite-context-definition` (`GET /services/data/v67.0/connect/context-definitions/{contextDefinitionId}`)
37
+ - After `activate-product-discovery-context`: call `verify-product-discovery-context-active` (`GET /services/data/v67.0/query`)
38
+ - After `set-product-discovery-browse-context-def`: call `verify-product-discovery-browse-context-def` (`GET /headless/invoke/platform/product-discovery-settings`)
39
+ - After `add-opportunity-product-recipients-related-list`: call `verify-opportunity-product-recipients-related-list` (`GET /services/data/v67.0/tooling/query`)
40
+ - After `enable-configure-products-at-runtime`, `enable-configuration-rules-and-constraints`: call `verify-constraint-model-revenue-settings` (`GET /headless/invoke/platform/revenue-settings/get-initial-states`)
41
+ - After `assign-product-configurator-permset`: call `verify-product-configurator-permset` (`GET /services/data/v67.0/query`)
42
+
43
+ ## Operations Reference
44
+
45
+ Operations grouped by purpose. Use these as the building blocks for the workflows above.
46
+
47
+ ### Summary
48
+
49
+ | Operation | Purpose | Status | Call | Depends on |
50
+ |-----------|---------|--------|------|------------|
51
+ | `read-eu-prefs` | read | implemented | `GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs` | — |
52
+ | `enable-eu-sales` | write | implemented | `PATCH /headless/invoke/industries/industries-energy-utilities/set-industries-energy-utilities-pref` | `read-eu-prefs` |
53
+ | `enable-multisite-feature` | write | implemented | `PATCH /headless/invoke/industries/industries-energy-utilities/set-industries-energy-utilities-pref` | `read-eu-prefs`, `enable-eu-sales` |
54
+ | `verify-multisite-features` | verify | implemented | `GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs` | `enable-eu-sales`, `enable-multisite-feature` |
55
+ | `enable-external-pricing` | write | implemented | `PATCH /headless/invoke/industries/industries-energy-utilities/set-industries-energy-utilities-pref` | `read-eu-prefs` |
56
+ | `verify-external-pricing` | verify | implemented | `GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs` | `enable-external-pricing` |
57
+ | `query-multisite-permsets` | read | implemented | `GET /services/data/v67.0/query` | — |
58
+ | `query-admin-user` | read | implemented | `GET /services/data/v67.0/query` | `query-multisite-permsets` |
59
+ | `assign-multisite-permsets` | write | implemented | `POST /services/data/v67.0/sobjects/PermissionSetAssignment` | `query-admin-user` |
60
+ | `verify-multisite-permsets` | verify | implemented | `GET /services/data/v67.0/query` | `assign-multisite-permsets` |
61
+ | `check-existing-standard-user` | read | implemented | `GET /services/data/v67.0/query` | — |
62
+ | `query-standard-user-profile` | read | implemented | `GET /services/data/v67.0/query` | `check-existing-standard-user` |
63
+ | `create-standard-user` | write | implemented | `POST /services/data/v67.0/sobjects/User/` | `query-standard-user-profile`, `check-existing-standard-user` |
64
+ | `query-standard-user-additional-permsets` | read | implemented | `GET /services/data/v67.0/query` | — |
65
+ | `query-standard-user-existing-additional-permset-assignments` | read | implemented | `GET /services/data/v67.0/query` | `create-standard-user`, `check-existing-standard-user`, `query-standard-user-additional-permsets` |
66
+ | `assign-standard-user-additional-permsets` | write | implemented | `POST /services/data/v67.0/sobjects/PermissionSetAssignment/` | `create-standard-user`, `check-existing-standard-user`, `query-standard-user-additional-permsets`, `query-standard-user-existing-additional-permset-assignments` |
67
+ | `verify-standard-user-additional-permsets` | verify | implemented | `GET /services/data/v67.0/query` | `assign-standard-user-additional-permsets` |
68
+ | `create-quote-line-item-node-status-field` | write | implemented | `POST /services/data/v67.0/tooling/sobjects/CustomField` | — |
69
+ | `create-order-item-node-status-field` | write | implemented | `POST /services/data/v67.0/tooling/sobjects/CustomField` | `create-quote-line-item-node-status-field` |
70
+ | `set-fls-node-status-quote-line-item` | write | implemented | `POST /services/data/v67.0/sobjects/FieldPermissions` | `create-quote-line-item-node-status-field` |
71
+ | `set-fls-node-status-order-item` | write | implemented | `POST /services/data/v67.0/sobjects/FieldPermissions` | `create-order-item-node-status-field` |
72
+ | `verify-node-status-fls` | verify | implemented | `GET /services/data/v67.0/query` | `set-fls-node-status-quote-line-item`, `set-fls-node-status-order-item` |
73
+ | `extend-sales-transaction-context` | write | implemented | `POST /services/data/v67.0/connect/context-definitions` | — |
74
+ | `get-sales-transaction-item-node-id` | read | implemented | `GET /services/data/v67.0/connect/context-definitions/{contextDefinitionId}` | `extend-sales-transaction-context` |
75
+ | `add-multisite-context-attributes` | write | implemented | `POST /services/data/v67.0/connect/context-nodes/{contextNodeId}/context-attributes` | `get-sales-transaction-item-node-id` |
76
+ | `tag-multisite-context-attributes` | write | implemented | `POST /services/data/v67.0/connect/context-definitions/{contextDefinitionId}/context-tags` | `add-multisite-context-attributes` |
77
+ | `map-multisite-attributes-to-quote` | write | implemented | `POST /services/data/v67.0/connect/context-node-mappings/{contextNodeMappingId}/context-attribute-mappings` | `tag-multisite-context-attributes` |
78
+ | `map-multisite-attributes-to-order` | write | implemented | `POST /services/data/v67.0/connect/context-node-mappings/{contextNodeMappingId}/context-attribute-mappings` | `tag-multisite-context-attributes` |
79
+ | `mark-quote-entities-mapping-default` | read | implemented | `GET /services/data/v67.0/query` | `map-multisite-attributes-to-quote`, `map-multisite-attributes-to-order` |
80
+ | `set-quote-entities-mapping-default` | write | implemented | `PATCH /services/data/v67.0/sobjects/ContextMapping/{mappingId}` | `mark-quote-entities-mapping-default` |
81
+ | `activate-eu-sales-transaction-context` | write | implemented | `PATCH /services/data/v67.0/connect/context-definitions/{contextDefinitionId}` | `set-quote-entities-mapping-default` |
82
+ | `verify-multisite-context-definition` | verify | implemented | `GET /services/data/v67.0/connect/context-definitions/{contextDefinitionId}` | `activate-eu-sales-transaction-context` |
83
+ | `query-decision-table-ids` | read | implemented | `GET /services/data/v67.0/query` | `set-quote-entities-mapping-default` |
84
+ | `extend-product-discovery-context` | write | implemented | `POST /services/data/v67.0/sobjects/ContextDefinition/` | — |
85
+ | `find-product-discovery-mapping` | read | implemented | `GET /services/data/v67.0/query` | `extend-product-discovery-context` |
86
+ | `set-product-discovery-mapping-default` | write | implemented | `PATCH /services/data/v67.0/sobjects/ContextMapping/{mappingId}` | `find-product-discovery-mapping` |
87
+ | `activate-product-discovery-context` | write | implemented | `PATCH /services/data/v67.0/sobjects/ContextDefinitionVersion/{versionId}` | `set-product-discovery-mapping-default` |
88
+ | `verify-product-discovery-context-active` | verify | implemented | `GET /services/data/v67.0/query` | `activate-product-discovery-context` |
89
+ | `check-context-definitions-needing-sync` | read | implemented | `GET /services/data/v67.0/connect/context-definitions` | `verify-multisite-context-definition`, `verify-product-discovery-context-active` |
90
+ | `sync-highlighted-context-definitions` | write | implemented | `PATCH /services/data/v67.0/connect/context-definitions/upgrades` | `check-context-definitions-needing-sync` |
91
+ | `read-product-discovery-settings-baseline` | read | implemented | `GET /headless/invoke/platform/product-discovery-settings` | `sync-highlighted-context-definitions` |
92
+ | `set-product-discovery-browse-context-def` | write | implemented | `PATCH /headless/invoke/platform/product-discovery-settings/set-browse-context-def` | `read-product-discovery-settings-baseline` |
93
+ | `verify-product-discovery-browse-context-def` | verify | implemented | `GET /headless/invoke/platform/product-discovery-settings` | `set-product-discovery-browse-context-def` |
94
+ | `get-opportunity-layout` | read | implemented | `GET /services/data/v67.0/tooling/query` | `verify-product-discovery-browse-context-def` |
95
+ | `add-opportunity-product-recipients-related-list` | write | implemented | `PATCH /services/data/v67.0/tooling/sobjects/Layout/{layoutId}` | `get-opportunity-layout` |
96
+ | `verify-opportunity-product-recipients-related-list` | verify | implemented | `GET /services/data/v67.0/tooling/query` | `add-opportunity-product-recipients-related-list` |
97
+ | `read-revenue-settings-baseline` | read | implemented | `GET /headless/invoke/platform/revenue-settings` | — |
98
+ | `enable-order-events` | write | implemented | `PATCH /headless/invoke/platform/revenue-settings/set-transaction-processor-enabled` | `read-revenue-settings-baseline` |
99
+ | `get-revenue-settings-constraint-prefs` | read | implemented | `GET /headless/invoke/platform/revenue-settings/get-initial-states` | — |
100
+ | `enable-configure-products-at-runtime` | write | implemented | `PATCH /headless/invoke/platform/revenue-settings/set-product-configurator-pref-enabled` | `get-revenue-settings-constraint-prefs` |
101
+ | `enable-configuration-rules-and-constraints` | write | implemented | `PATCH /headless/invoke/platform/revenue-settings/set-pcm-config-rule-pref-enabled` | `get-revenue-settings-constraint-prefs` |
102
+ | `verify-constraint-model-revenue-settings` | verify | implemented | `GET /headless/invoke/platform/revenue-settings/get-initial-states` | `enable-configure-products-at-runtime`, `enable-configuration-rules-and-constraints` |
103
+ | `query-product-configurator-permset` | read | implemented | `GET /services/data/v67.0/query` | `enable-configure-products-at-runtime` |
104
+ | `assign-product-configurator-permset` | write | implemented | `POST /services/data/v67.0/sobjects/PermissionSetAssignment` | `query-product-configurator-permset` |
105
+ | `verify-product-configurator-permset` | verify | implemented | `GET /services/data/v67.0/query` | `assign-product-configurator-permset` |
106
+
107
+ ### Dependency graph
108
+
109
+ ```mermaid
110
+ graph TD
111
+ read_eu_prefs["read-eu-prefs (read)"]
112
+ enable_eu_sales["enable-eu-sales (write)"]
113
+ enable_multisite_feature["enable-multisite-feature (write)"]
114
+ verify_multisite_features["verify-multisite-features (verify)"]
115
+ enable_external_pricing["enable-external-pricing (write)"]
116
+ verify_external_pricing["verify-external-pricing (verify)"]
117
+ query_multisite_permsets["query-multisite-permsets (read)"]
118
+ query_admin_user["query-admin-user (read)"]
119
+ assign_multisite_permsets["assign-multisite-permsets (write)"]
120
+ verify_multisite_permsets["verify-multisite-permsets (verify)"]
121
+ check_existing_standard_user["check-existing-standard-user (read)"]
122
+ query_standard_user_profile["query-standard-user-profile (read)"]
123
+ create_standard_user["create-standard-user (write)"]
124
+ query_standard_user_additional_permsets["query-standard-user-additional-permsets (read)"]
125
+ query_standard_user_existing_additional_permset_assignments["query-standard-user-existing-additional-permset-assignments (read)"]
126
+ assign_standard_user_additional_permsets["assign-standard-user-additional-permsets (write)"]
127
+ verify_standard_user_additional_permsets["verify-standard-user-additional-permsets (verify)"]
128
+ create_quote_line_item_node_status_field["create-quote-line-item-node-status-field (write)"]
129
+ create_order_item_node_status_field["create-order-item-node-status-field (write)"]
130
+ set_fls_node_status_quote_line_item["set-fls-node-status-quote-line-item (write)"]
131
+ set_fls_node_status_order_item["set-fls-node-status-order-item (write)"]
132
+ verify_node_status_fls["verify-node-status-fls (verify)"]
133
+ extend_sales_transaction_context["extend-sales-transaction-context (write)"]
134
+ get_sales_transaction_item_node_id["get-sales-transaction-item-node-id (read)"]
135
+ add_multisite_context_attributes["add-multisite-context-attributes (write)"]
136
+ tag_multisite_context_attributes["tag-multisite-context-attributes (write)"]
137
+ map_multisite_attributes_to_quote["map-multisite-attributes-to-quote (write)"]
138
+ map_multisite_attributes_to_order["map-multisite-attributes-to-order (write)"]
139
+ mark_quote_entities_mapping_default["mark-quote-entities-mapping-default (read)"]
140
+ set_quote_entities_mapping_default["set-quote-entities-mapping-default (write)"]
141
+ activate_eu_sales_transaction_context["activate-eu-sales-transaction-context (write)"]
142
+ verify_multisite_context_definition["verify-multisite-context-definition (verify)"]
143
+ query_decision_table_ids["query-decision-table-ids (read)"]
144
+ extend_product_discovery_context["extend-product-discovery-context (write)"]
145
+ find_product_discovery_mapping["find-product-discovery-mapping (read)"]
146
+ set_product_discovery_mapping_default["set-product-discovery-mapping-default (write)"]
147
+ activate_product_discovery_context["activate-product-discovery-context (write)"]
148
+ verify_product_discovery_context_active["verify-product-discovery-context-active (verify)"]
149
+ check_context_definitions_needing_sync["check-context-definitions-needing-sync (read)"]
150
+ sync_highlighted_context_definitions["sync-highlighted-context-definitions (write)"]
151
+ read_product_discovery_settings_baseline["read-product-discovery-settings-baseline (read)"]
152
+ set_product_discovery_browse_context_def["set-product-discovery-browse-context-def (write)"]
153
+ verify_product_discovery_browse_context_def["verify-product-discovery-browse-context-def (verify)"]
154
+ get_opportunity_layout["get-opportunity-layout (read)"]
155
+ add_opportunity_product_recipients_related_list["add-opportunity-product-recipients-related-list (write)"]
156
+ verify_opportunity_product_recipients_related_list["verify-opportunity-product-recipients-related-list (verify)"]
157
+ read_revenue_settings_baseline["read-revenue-settings-baseline (read)"]
158
+ enable_order_events["enable-order-events (write)"]
159
+ get_revenue_settings_constraint_prefs["get-revenue-settings-constraint-prefs (read)"]
160
+ enable_configure_products_at_runtime["enable-configure-products-at-runtime (write)"]
161
+ enable_configuration_rules_and_constraints["enable-configuration-rules-and-constraints (write)"]
162
+ verify_constraint_model_revenue_settings["verify-constraint-model-revenue-settings (verify)"]
163
+ query_product_configurator_permset["query-product-configurator-permset (read)"]
164
+ assign_product_configurator_permset["assign-product-configurator-permset (write)"]
165
+ verify_product_configurator_permset["verify-product-configurator-permset (verify)"]
166
+ read_eu_prefs --> enable_eu_sales
167
+ read_eu_prefs --> enable_multisite_feature
168
+ enable_eu_sales --> enable_multisite_feature
169
+ enable_eu_sales --> verify_multisite_features
170
+ enable_multisite_feature --> verify_multisite_features
171
+ read_eu_prefs --> enable_external_pricing
172
+ enable_external_pricing --> verify_external_pricing
173
+ query_multisite_permsets --> query_admin_user
174
+ query_admin_user --> assign_multisite_permsets
175
+ assign_multisite_permsets --> verify_multisite_permsets
176
+ check_existing_standard_user --> query_standard_user_profile
177
+ query_standard_user_profile --> create_standard_user
178
+ check_existing_standard_user --> create_standard_user
179
+ create_standard_user --> query_standard_user_existing_additional_permset_assignments
180
+ check_existing_standard_user --> query_standard_user_existing_additional_permset_assignments
181
+ query_standard_user_additional_permsets --> query_standard_user_existing_additional_permset_assignments
182
+ create_standard_user --> assign_standard_user_additional_permsets
183
+ check_existing_standard_user --> assign_standard_user_additional_permsets
184
+ query_standard_user_additional_permsets --> assign_standard_user_additional_permsets
185
+ query_standard_user_existing_additional_permset_assignments --> assign_standard_user_additional_permsets
186
+ assign_standard_user_additional_permsets --> verify_standard_user_additional_permsets
187
+ create_quote_line_item_node_status_field --> create_order_item_node_status_field
188
+ create_quote_line_item_node_status_field --> set_fls_node_status_quote_line_item
189
+ create_order_item_node_status_field --> set_fls_node_status_order_item
190
+ set_fls_node_status_quote_line_item --> verify_node_status_fls
191
+ set_fls_node_status_order_item --> verify_node_status_fls
192
+ extend_sales_transaction_context --> get_sales_transaction_item_node_id
193
+ get_sales_transaction_item_node_id --> add_multisite_context_attributes
194
+ add_multisite_context_attributes --> tag_multisite_context_attributes
195
+ tag_multisite_context_attributes --> map_multisite_attributes_to_quote
196
+ tag_multisite_context_attributes --> map_multisite_attributes_to_order
197
+ map_multisite_attributes_to_quote --> mark_quote_entities_mapping_default
198
+ map_multisite_attributes_to_order --> mark_quote_entities_mapping_default
199
+ mark_quote_entities_mapping_default --> set_quote_entities_mapping_default
200
+ set_quote_entities_mapping_default --> activate_eu_sales_transaction_context
201
+ activate_eu_sales_transaction_context --> verify_multisite_context_definition
202
+ set_quote_entities_mapping_default --> query_decision_table_ids
203
+ extend_product_discovery_context --> find_product_discovery_mapping
204
+ find_product_discovery_mapping --> set_product_discovery_mapping_default
205
+ set_product_discovery_mapping_default --> activate_product_discovery_context
206
+ activate_product_discovery_context --> verify_product_discovery_context_active
207
+ verify_multisite_context_definition --> check_context_definitions_needing_sync
208
+ verify_product_discovery_context_active --> check_context_definitions_needing_sync
209
+ check_context_definitions_needing_sync --> sync_highlighted_context_definitions
210
+ sync_highlighted_context_definitions --> read_product_discovery_settings_baseline
211
+ read_product_discovery_settings_baseline --> set_product_discovery_browse_context_def
212
+ set_product_discovery_browse_context_def --> verify_product_discovery_browse_context_def
213
+ verify_product_discovery_browse_context_def --> get_opportunity_layout
214
+ get_opportunity_layout --> add_opportunity_product_recipients_related_list
215
+ add_opportunity_product_recipients_related_list --> verify_opportunity_product_recipients_related_list
216
+ read_revenue_settings_baseline --> enable_order_events
217
+ get_revenue_settings_constraint_prefs --> enable_configure_products_at_runtime
218
+ get_revenue_settings_constraint_prefs --> enable_configuration_rules_and_constraints
219
+ enable_configure_products_at_runtime --> verify_constraint_model_revenue_settings
220
+ enable_configuration_rules_and_constraints --> verify_constraint_model_revenue_settings
221
+ enable_configure_products_at_runtime --> query_product_configurator_permset
222
+ query_product_configurator_permset --> assign_product_configurator_permset
223
+ assign_product_configurator_permset --> verify_product_configurator_permset
224
+ ```
225
+
226
+ ### Read operations
227
+
228
+ #### `read-eu-prefs`
229
+
230
+ Read all EU org preferences via getIndustriesEnergyUtilitiesPrefs. Returns a map keyed by STATUS (SUCCESS|FAILURE) plus per-pref entries. Each pref entry contains: isPrefEnabled (current state), showPrefToggle (whether the OrgPermission gate is met), disabled (UI-disabled flag), prefLabel (enum name). Use this to determine whether euSales and euMultisiteFeature are already enabled, and whether euMultisiteFeature is even toggleable (showPrefToggle) on this org.
231
+
232
+ **Call:** `GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs` — status: `implemented`
233
+
234
+ **Output:** {status: "SUCCESS", euSalesPrefMap: {isPrefEnabled: bool, showPrefToggle: bool, disabled: bool, prefLabel: "euSales"}, euMultisiteFeaturePrefMap: {isPrefEnabled: bool, showPrefToggle: bool, disabled: bool, prefLabel: "euMultisiteFeature"},...other prefs...}
235
+
236
+ #### `query-multisite-permsets`
237
+
238
+ Query PermissionSet by Label for: "CME Sales Features", "Create Orders from Quotes", "Product Configuration Constraints Designer", "Basic CSV Data Import". Confirmed on the validation org — all 4 exist: CMESalesStandardPermissionSet, RevLifecycleManagementCreateOrderFromQuote, AdvancedConfiguratorDesigner, SimpleCsvDataImport (dev names). If any query returns totalSize=0 on a different org, treat as a precondition blocker (required package/feature not installed) — not an API gap.
239
+
240
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
241
+
242
+ **Inputs:**
243
+
244
+ - `q` *(`String`)*
245
+
246
+ **Output:** {totalSize: 4, records: [{Id, Name, Label},...]} on this org. Id values used by the next step.
247
+
248
+ #### `query-admin-user`
249
+
250
+ Query User by Username to get the target user's Id for the permission set assignments. On the validation org this is the validation <internal-user>@<org-domain>.
251
+
252
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
253
+
254
+ **Inputs:**
255
+
256
+ - `q` *(`String`)* — SELECT Id, Username, Name FROM User WHERE Username = '<org setup username>'
257
+
258
+ **Depends on:** `query-multisite-permsets`
259
+
260
+ **Output:** {totalSize: 1, records: [{Id, Username, Name}]}
261
+
262
+ #### `check-existing-standard-user`
263
+
264
+ "Set up the standard user and assign the following additional permission sets to the standard user." Query whether an active User already holds the Standard User profile FIRST, before ever asking the admin for standard_user_username/_email/_alias — those new-user details are only relevant if no reusable user exists (or the admin declines to reuse one), so don't collect them up front. If a match is found here, present it (Id/Name/Username) and ask reuse_existing_standard_user (sor_input) next; only if the admin answers false — or no match was found at all — does prompting move on to standard_user_username/_email/_alias for create-standard-user. Confirmed live on the validation org: totalSize 0 — no existing active Standard User found; creation required this run (reuse_existing_standard_user was moot, never asked).
265
+
266
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
267
+
268
+ **Inputs:**
269
+
270
+ - `q` *(`String`)*
271
+
272
+ **Output:** {totalSize, records: [{Id, Name, Username},...]}. If totalSize > 0, ask reuse_existing_standard_user next before anything else; existingUserId = records[0].Id when the admin chooses to reuse. If totalSize == 0, skip straight to query-standard-user-profile + create-standard-user with no reuse prompt.
273
+
274
+ #### `query-standard-user-profile`
275
+
276
+ Replaces Setup > Users > New User (Profile = Standard User). Query the Profile Id for 'Standard User' — needed as a POST input for create-standard-user. Only runs if create-standard-user is actually going ahead (check-existing-standard-user found no match, or found one and the admin answered reuse_existing_standard_user=false). Confirmed live on the validation org: Profile Id 00e… (UserLicense: Salesforce).
277
+
278
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
279
+
280
+ **Inputs:**
281
+
282
+ - `q` *(`String`)*
283
+
284
+ **Depends on:** `check-existing-standard-user`
285
+
286
+ **Output:** Profile Id for Standard User.
287
+
288
+ #### `query-standard-user-additional-permsets`
289
+
290
+ "CME Sales Features", "Create Orders from Quotes", "Basic CSV Data Import" — a distinct set from query-multisite-permsets' 4 (which covers the admin/foundation assignment in Step 2 above; 3 of those 4 labels overlap by name — CMESalesStandardPermissionSet, RevLifecycleManagementCreateOrderFromQuote, SimpleCsvDataImport; only AdvancedConfiguratorDesigner doesn't — but this step queries independently since the standard user's permset list is a separate walkthrough instruction). Confirmed live on the validation org: SimpleCsvDataImport (0PS…), CMESalesStandardPermissionSet (0PS…), RevLifecycleManagementCreateOrderFromQuote (0PS…) — all 3 resolved, totalSize 3.
291
+
292
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
293
+
294
+ **Inputs:**
295
+
296
+ - `q` *(`String`)*
297
+
298
+ **Output:** {totalSize: 3, records: [{Id, Name, Label},...]}
299
+
300
+ #### `query-standard-user-existing-additional-permset-assignments`
301
+
302
+ Query existing PermissionSetAssignments for the resolved standard user Id (create-standard-user's output on the new-user path, check-existing-standard-user's existingUserId on the reuse path) against the 3 Ids from query-standard-user-additional-permsets. Needed because on the reuse path the existing user may already hold some/all of these permsets — POSTing an assignment that already exists returns 400 DUPLICATE_VALUE, confirmed as a real (not theoretical) failure mode: live testing on the validation org
303
+ reused user 005… already had all 3 from
304
+ an earlier run. assign-standard-user-additional-permsets uses this step's output to only POST the missing ones.
305
+
306
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
307
+
308
+ **Inputs:**
309
+
310
+ - `q` *(`String`)* — SELECT Id, PermissionSetId FROM PermissionSetAssignment WHERE AssigneeId = '<resolved standard user Id>' AND PermissionSetId IN (<3 Ids from query-standard-user-additional-permsets>)
311
+ - **Source:** output of `query-standard-user-additional-permsets`
312
+
313
+ **Depends on:** `create-standard-user`, `check-existing-standard-user`, `query-standard-user-additional-permsets`
314
+
315
+ **Output:** {totalSize, records: [{Id, PermissionSetId},...]}. The set of PermissionSetIds NOT present here is what assign-standard-user-additional-permsets must still POST.
316
+
317
+ #### `get-sales-transaction-item-node-id`
318
+
319
+ The UI's "Custom Definitions > EUSalesTransactionContext > Edit > attributes section" step has no single API equivalent — it's a read needed to find the ids the next steps require. GET the full context definition and locate: (1) contextNodes[] is a tree, not a flat list — only top-level nodes (Asset, Contract, SalesTransaction) are at the top level; SalesTransactionItem is nested under SalesTransaction's childNodes[], so recurse into childNodes[] to find the entry named SalesTransactionItem → its contextNodeId (needed to POST new attributes onto that node); (2) contextMappings[] entry with name QuoteEntitiesMapping, then its contextNodeMappings[] entry with contextNodeName SalesTransactionItem → contextNodeMappingId (needed to map attributes to Quote fields); (3) same lookup under the OrderEntitiesMapping contextMappings[] entry → its SalesTransactionItem contextNodeMappingId (needed to map attributes to Order fields). Confirmed on the validation org: SalesTransactionItem contextNodeId 11o… (found by recursing into SalesTransaction's childNodes[]); QuoteEntitiesMapping's SalesTransactionItem contextNodeMappingId 11b… (sObjectName QuoteLineItem); OrderEntitiesMapping's SalesTransactionItem contextNodeMappingId 11b… (sObjectName OrderItem). These ids are stable for a given contextDefinitionId/activeVersionId — re-resolve only if the definition is re-extended.
320
+
321
+ **Call:** `GET /services/data/v67.0/connect/context-definitions/{contextDefinitionId}` — status: `implemented`
322
+
323
+ **Inputs:**
324
+
325
+ - `contextDefinitionId` *(`String`)* — contextDefinitionId from extend-sales-transaction-context.
326
+ - **Source:** output of `extend-sales-transaction-context`
327
+
328
+ **Depends on:** `extend-sales-transaction-context`
329
+
330
+ **Output:** Full context definition incl. contextDefinitionVersionList[0] .contextNodes[] (recurse into childNodes[] for nested nodes) and .contextMappings[]. Agent parses per the description above.
331
+
332
+ #### `mark-quote-entities-mapping-default`
333
+
334
+ Replaces Setup > Context Definitions > EUSalesTransactionContext > Map Data tab > Actions dropdown next to Quote Entities Mapping > Edit SObject Mapping > check "Mark as Default" > Map. The ContextMapping sObject is directly writable — no Connect API needed. Confirmed on the validation org: this was already done as a side effect of validating configure-eu-cloud-tariff-comparison against the same org/context definition — a fresh query shows QuoteEntitiesMapping (Id 11j…) already IsDefault=true among the 14 ContextMapping records under version 11p…. skip_if guards this so the step is a no-op (and reports success) on orgs where it's already been applied, while still fully idempotent-write on a fresh org. MUST run before activate-eu-sales-transaction-context — activation 400s with DATA_MAPPING_NOT_FOUND ("Cannot activate a definition without default mapping") if no ContextMapping.IsDefault=true exists yet for the active version. This step and set-quote-entities-mapping-default were previously authored as a separate "Step 5" that ran AFTER activation; moved here (into Step 4, ahead of activation) to fix that ordering bug.
335
+
336
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
337
+
338
+ **Inputs:**
339
+
340
+ - `q` *(`String`)* — Query ContextMapping under EUSalesTransactionContext's active version; find the record with Title=QuoteEntitiesMapping.
341
+
342
+ **Depends on:** `map-multisite-attributes-to-quote`, `map-multisite-attributes-to-order`
343
+
344
+ **Output:** List of ContextMapping records. If QuoteEntitiesMapping's IsDefault=true, skip the PATCH below. Otherwise capture its Id.
345
+
346
+ #### `query-decision-table-ids`
347
+
348
+ Query DecisionTable records to get org-specific IDs for the three decision tables referenced in the pricing procedure steps' LookUpId values: Price_Book_Entry_Decision_Table_v2, Attribute_Based_Adjustment_Decision_Table, Tiered_Adjustment_Tier_Decision_Table. Same query validated in configure-eu-cloud-tariff-comparison's query-decision-table-ids step.
349
+
350
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
351
+
352
+ **Inputs:**
353
+
354
+ - `q` *(`String`)*
355
+
356
+ **Depends on:** `set-quote-entities-mapping-default`
357
+
358
+ **Output:** Three records with org-specific IDs for each decision table. Used as LookUpId literal values in the pricing procedure steps.
359
+
360
+ #### `find-product-discovery-mapping`
361
+
362
+ Query ContextMapping under the new definition's active version to find the inherited ProductDiscoveryMapping (two are inherited: ProductDiscoveryMapping and ProductDiscoveryPromoMapping — identify by Title). Confirmed on the validation org: ProductDiscoveryMapping Id 11j… under version 11p…. Confirmed on the validation org: ProductDiscoveryMapping Id 11j… (IsDefault=false), ProductDiscoveryPromoMapping Id 11j…, under version 11p….
363
+
364
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
365
+
366
+ **Inputs:**
367
+
368
+ - `q` *(`String`)* — Query ContextMapping with Title for the new version.
369
+
370
+ **Depends on:** `extend-product-discovery-context`
371
+
372
+ **Output:** Two mappings. Target the one with Title=ProductDiscoveryMapping; capture its Id and IsDefault.
373
+
374
+ #### `check-context-definitions-needing-sync`
375
+
376
+ Replaces Setup > Context Definitions > Custom Definitions (the "highlighted" definitions banner). GET with includeUpgrade=true returns isUpgradeAvailable per context definition — true means the custom definition's base reference (e.g. ProductDiscoveryContext__stdctx) has model changes not yet folded into the custom extension. Confirmed live on the validation org: EUProductDiscoveryContext (11O…) showed isUpgradeAvailable=true; EUSalesTransactionContext (11O…) showed false.
377
+
378
+ **Call:** `GET /services/data/v67.0/connect/context-definitions` — status: `implemented`
379
+
380
+ **Inputs:**
381
+
382
+ - `includeUpgrade` *(`boolean`)*
383
+
384
+ **Depends on:** `verify-multisite-context-definition`, `verify-product-discovery-context-active`
385
+
386
+ **Output:** contextDefinitionList[] with isUpgradeAvailable per entry. Any custom (custom_nonexecutable) definition with isUpgradeAvailable=true needs sync-highlighted-context-definitions.
387
+
388
+ #### `read-product-discovery-settings-baseline`
389
+
390
+ Replaces Setup > Product Discovery Settings page load. Reads the nine org values backing the page (browse context def, pricing procedure, qualification procedure, discover-products flow, etc.) via getInitialOrgValues. Use this to check the current selectedBrowseContextDef before writing it below.
391
+
392
+ **Call:** `GET /headless/invoke/platform/product-discovery-settings` — status: `implemented`
393
+
394
+ **Depends on:** `sync-highlighted-context-definitions`
395
+
396
+ **Output:** {selectedBrowseContextDef, selectedPricingProcedure, selectedQualificationProcedure, pricingEnabled, qualificationEnabled, discoverProductsFlowName, defaultCatalog, contextMappingName, recipientObject}, all String-typed (booleans come back as "true"/"false" strings).
397
+
398
+ #### `get-opportunity-layout`
399
+
400
+ Replaces Setup > Object Manager > Opportunity > Page Layouts > select layout. Resolve the Opportunity Layout Id and retrieve its full Metadata via Tooling query, as the base to rebuild relatedLists from. Confirmed live on the validation org: Layout Id=00h…, Name="Opportunity Layout".
401
+
402
+ **Call:** `GET /services/data/v67.0/tooling/query` — status: `implemented`
403
+
404
+ **Inputs:**
405
+
406
+ - `q` *(`string`)*
407
+
408
+ **Depends on:** `verify-product-discovery-browse-context-def`
409
+
410
+ **Output:** Layout Id and full Metadata (layoutSections, relatedLists, quickActionList, etc.) for the Opportunity page layout.
411
+
412
+ #### `read-revenue-settings-baseline`
413
+
414
+ Replaces Setup > Revenue Settings page load. Read current toggle state before enabling Order Events (the "Negative Quantity" and "Zero Quantity" toggles referenced by the walkthrough are the OrderSettings.enableNegativeQuantity/enableZeroQuantity fields already handled by configure-eu-cloud-end-to-end's enable-order-settings step — this SOR does not repeat that write, only reports its state for confirmation). "Order Events" maps to the `TransactionProcessorEnabled` boolean in the revenue-settings initial-states response. Confirmed on the target org: TransactionProcessorEnabled=false (needs enabling).
415
+
416
+ **Call:** `GET /headless/invoke/platform/revenue-settings` — status: `implemented`
417
+
418
+ **Output:** Map<String, Boolean> of ~50 revenue settings flags. Check TransactionProcessorEnabled for current Order Events state.
419
+
420
+ #### `get-revenue-settings-constraint-prefs`
421
+
422
+ Read the revenue-settings initial states to check the two prefs this step cares about: ProductConfiguratorPrefEnabled (Configure Products at Runtime) and PCMConfigRuleEnabled (Set Up Configuration Rules and Constraints with Constraints Engine). Confirmed on the target org: ProductConfiguratorPrefEnabled already true (enabled by the foundation SOR's enable-product-configurator step); PCMConfigRuleEnabled false.
423
+
424
+ **Call:** `GET /headless/invoke/platform/revenue-settings/get-initial-states` — status: `implemented`
425
+
426
+ **Output:** Map<String,Boolean> incl. ProductConfiguratorPrefEnabled, PCMConfigRuleEnabled.
427
+
428
+ #### `query-product-configurator-permset`
429
+
430
+ "Assign the Product Configurator permission set to all users, including admins and standard users." This permset's queryability is gated by ProductConfiguratorPrefEnabled (Configure Products at Runtime) — with the pref disabled it returns 0 rows across 3 different query forms (Label IN(...), exact Name='IndustriesConfiguratorPlatformApi', Label LIKE '%Configurator%'), which looks like a missing-license gap but isn't; once enable-configure-products-at-runtime turns the pref on, the same query returns the permset (present-but-unassigned). Confirmed on two orgs: one queried before the pref was enabled (0 rows), one after (present). Because this step runs after enable-configure-products-at-runtime, totalSize=0 here means something else is missing (license/provisioning) — re-check ProductConfiguratorPrefEnabled is really true before treating it as a precondition blocker. Caution: a query-params error (e.g. malformed request, wrong field name) is NOT the same as a legitimate totalSize=0 — confirm the call actually returned a 200 with a valid query response body before concluding precondition blocker; retry with a corrected request first.
431
+
432
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
433
+
434
+ **Inputs:**
435
+
436
+ - `q` *(`String`)*
437
+
438
+ **Depends on:** `enable-configure-products-at-runtime`
439
+
440
+ **Output:** Filter records client-side for Label = 'Product Configurator' (Name IndustriesConfiguratorPlatformApi) — the same query also returns "Product Configuration Constraints Designer", already resolved separately by query-multisite-permsets. {totalSize: 0, records: []} on this org means precondition blocker; Id used by the next two steps otherwise.
441
+
442
+ ### Write operations
443
+
444
+ #### `enable-eu-sales`
445
+
446
+ Toggle the euSales org preference to true, only if read-eu-prefs showed euSalesPrefMap.isPrefEnabled=false. Prerequisite for multisite quoting. Already proven via foundation SOR step enable-eu-sales — same route, same prefName, reused here for orgs run standalone without the foundation SOR having executed first.
447
+
448
+ **Call:** `PATCH /headless/invoke/industries/industries-energy-utilities/set-industries-energy-utilities-pref` — status: `implemented`
449
+
450
+ **Inputs:**
451
+
452
+ - `enable` *(`boolean`)* — Target state for the euSales preference.
453
+ - `prefName` *(`String`)* — EUSettingsOrgPreferences enum member for EU Sales.
454
+
455
+ **Depends on:** `read-eu-prefs`
456
+
457
+ **Output:** {status: "SUCCESS", isPrefEnabled: true, prefLabel: "euSales"} on success. {status: "FAILURE", message: "<localized error>"} on missing license entitlement or exception.
458
+
459
+ #### `enable-multisite-feature`
460
+
461
+ Toggle the euMultisiteFeature org preference to true. Enables bulk site upload and multisite quoting. Gated by the EU Multisite feature entitlement — if read-eu-prefs showed euMultisiteFeaturePrefMap.showPrefToggle=false, the feature is not provisioned and the write will fail with {status: FAILURE}; this is a license-level blocker, not retriable via any API. Same route + params_schema as tariff SOR's euTariffComparisonFeature toggle (validated live) — only prefName differs.
462
+
463
+ **Call:** `PATCH /headless/invoke/industries/industries-energy-utilities/set-industries-energy-utilities-pref` — status: `implemented`
464
+
465
+ **Inputs:**
466
+
467
+ - `enable` *(`boolean`)* — Target state for the euMultisiteFeature preference.
468
+ - `prefName` *(`String`)* — EUSettingsOrgPreferences enum member for Multisite.
469
+
470
+ **Depends on:** `read-eu-prefs`, `enable-eu-sales`
471
+
472
+ **Output:** {status: "SUCCESS", isPrefEnabled: true, prefLabel: "euMultisiteFeature"} on success. {status: "FAILURE", message: "<localized error>"} if the EU Multisite feature is not provisioned, or on other exception.
473
+
474
+ #### `enable-external-pricing`
475
+
476
+ Replaces Setup > Energy and Utilities Settings > Turn On External Pricing. Toggle the euExternalPricingFeature org preference to true. Same route + params_schema as enable-multisite-feature — only prefName differs. Confirmed live on the validation org: read-eu-prefs showed euExternalPricingFeaturePrefMap {isPrefEnabled: false, showPrefToggle: true} — write returned {status: SUCCESS, isPrefEnabled: true, prefLabel: euExternalPricingFeature}.
477
+
478
+ **Call:** `PATCH /headless/invoke/industries/industries-energy-utilities/set-industries-energy-utilities-pref` — status: `implemented`
479
+
480
+ **Inputs:**
481
+
482
+ - `enable` *(`boolean`)* — Target state for the euExternalPricingFeature preference.
483
+ - `prefName` *(`String`)* — EUSettingsOrgPreferences enum member for External Pricing.
484
+
485
+ **Depends on:** `read-eu-prefs`
486
+
487
+ **Output:** {status: "SUCCESS", isPrefEnabled: true, prefLabel: "euExternalPricingFeature"} on success. {status: "FAILURE", message: "<localized error>"} on missing license entitlement or exception.
488
+
489
+ #### `assign-multisite-permsets`
490
+
491
+ For each of the 4 PermissionSet Ids from query-multisite-permsets, check for an existing PermissionSetAssignment first (idempotency), then POST PermissionSetAssignment {AssigneeId, PermissionSetId} for any not already assigned. Same sObject REST pattern as foundation SOR's assign-eu-cloud-features-permset step (validated on the validation org). Validated on the validation org: 0 pre-existing assignments found, all 4 POSTs returned {success: true} with new Ids.
492
+
493
+ **Call:** `POST /services/data/v67.0/sobjects/PermissionSetAssignment` — status: `implemented`
494
+
495
+ **Inputs:**
496
+
497
+ - `AssigneeId` *(`String`)* — Id of the user from query-admin-user.
498
+ - **Source:** output of `query-admin-user`
499
+ - `PermissionSetId` *(`String`)* — Id of one permission set from query-multisite-permsets.
500
+ - **Source:** output of `query-multisite-permsets`
501
+
502
+ **Depends on:** `query-admin-user`
503
+
504
+ **Output:** {id: "<PermissionSetAssignment Id>", success: true, errors: []} per call.
505
+
506
+ #### `create-standard-user`
507
+
508
+ POST a new User with ProfileId from query-standard-user-profile. Username/Email/Alias come from sor_inputs (standard_user_username, standard_user_email, standard_user_alias) — prompted from the admin only after check-existing-standard-user has run and either found no match, or found one that the admin declined to reuse (reuse_existing_standard_user=false); never guess/hardcode a username, since it must be globally unique across all Salesforce orgs and picking one on the agent's behalf risks a collision or a value the admin doesn't recognize/control. Before POSTing: (a) validate standard_user_alias is <=8 chars locally — Salesforce rejects longer values, and catching it client-side avoids a wasted round trip; if too long, ask the admin to shorten it rather than silently truncating (silently truncating could collide with another alias or not match what the admin expects); (b) confirm spare license capacity (SELECT UsedLicenses, TotalLicenses FROM UserLicense WHERE Name='Salesforce') and get consent before creating, since user creation on a live org is a real, not-easily-reversible action. If the POST itself returns 400 DUPLICATE_USERNAME (the username is taken globally, across Salesforce orgs, not just this one — confirmed as a real, not just theoretical, failure mode live), re-prompt the admin for a different standard_user_username rather than guessing/mutating it. Confirmed live on the validation org: run 1 used a placeholder username (before sor_inputs was wired in) — 9 spare licenses, 201, Id 005…. Run 2 exercised the full validation chain for real: a locally-generated alias (9 chars) caught pre-POST and shortened to 8 chars with admin consent; an initial username candidate hit DUPLICATE_USERNAME on POST, re-prompted, retried with a second candidate username — 8 spare licenses at that point, 201, Id 005….
509
+
510
+ **Call:** `POST /services/data/v67.0/sobjects/User/` — status: `implemented`
511
+
512
+ **Inputs:**
513
+
514
+ - `Username` *(`String`)* — Globally unique across all Salesforce orgs.
515
+ - `Email` *(`String`)*
516
+ - `FirstName` *(`String`)*
517
+ - `LastName` *(`String`)*
518
+ - `Alias` *(`String`)* — Max 8 chars — validate len(standard_user_alias) <= 8 before POSTing; if longer, ask the admin to shorten it (don't silently truncate).
519
+ - `ProfileId` *(`String`)* — Id from query-standard-user-profile.
520
+ - **Source:** output of `query-standard-user-profile`
521
+ - `LocaleSidKey` *(`String`)* — Copy from an existing user record (e.g. an admin) to match org defaults.
522
+ - `LanguageLocaleKey` *(`String`)*
523
+ - `TimeZoneSidKey` *(`String`)*
524
+ - `EmailEncodingKey` *(`String`)*
525
+
526
+ **Depends on:** `query-standard-user-profile`, `check-existing-standard-user`
527
+
528
+ **Output:** {id: "005…", success: true, errors: []}
529
+
530
+ #### `assign-standard-user-additional-permsets`
531
+
532
+ For each of the 3 PermissionSet Ids from query-standard-user-additional-permsets that is NOT already present in query-standard-user-existing-additional-permset-assignments's output, POST a PermissionSetAssignment {AssigneeId: <standard user Id>, PermissionSetId: <permset Id>} — same pattern as assign-multisite-permsets, for the standard user instead of the admin, but now idempotent on the reuse path (skips any permset that's already assigned instead of erroring). AssigneeId resolves to EITHER create-standard-user's output Id (normal path, new user created) OR check-existing-standard-user's existingUserId (fallback path, create-standard-user was skipped because the admin chose to reuse an existing user) — never assume create-standard-user ran. Confirmed live on the validation org: reuse-path run against 005… found all 3 already assigned (0 POSTs needed); new-user-path run against 005… had 0 pre-existing assignments — all 3 POSTs returned 201 (Ids 0Pa… [Basic CSV Data Import], 0Pa… [CME Sales Features], 0Pa… [Create Orders from Quotes]).
533
+
534
+ **Call:** `POST /services/data/v67.0/sobjects/PermissionSetAssignment/` — status: `implemented`
535
+
536
+ **Inputs:**
537
+
538
+ - `AssigneeId` *(`String`)* — create-standard-user's output Id if it ran; otherwise check-existing-standard-user's existingUserId (reuse path).
539
+ - `PermissionSetId` *(`String`)* — One of the 3 Ids from query-standard-user-additional-permsets, excluding any already present in query-standard-user-existing-additional-permset-assignments.
540
+ - **Source:** output of `query-standard-user-additional-permsets`
541
+
542
+ **Depends on:** `create-standard-user`, `check-existing-standard-user`, `query-standard-user-additional-permsets`, `query-standard-user-existing-additional-permset-assignments`
543
+
544
+ **Output:** {id: "<PermissionSetAssignment Id>", success: true, errors: []} per call actually made (0 calls if all 3 already assigned).
545
+
546
+ #### `create-quote-line-item-node-status-field`
547
+
548
+ Create a Long Text Area (5000) custom field on QuoteLineItem via the Tooling API instead of the object-manager UI's New Field wizard. Confirmed working on the validation org: POST with just {FullName, Metadata: {label, type: LongTextArea, length, visibleLines}} returns 201 with a new CustomField Id — no separate FLS/page-layout wizard steps needed at create time (handled by field-permissions steps below).
549
+
550
+ **Call:** `POST /services/data/v67.0/tooling/sobjects/CustomField` — status: `implemented`
551
+
552
+ **Inputs:**
553
+
554
+ - `FullName` *(`String`)*
555
+ - `Metadata` *(`complexvalue`)*
556
+
557
+ **Output:** {id: "<CustomField Id>", success: true, errors: []} on success (201).
558
+
559
+ #### `create-order-item-node-status-field`
560
+
561
+ Same pattern as create-quote-line-item-node-status-field, targeting OrderItem (the sObject backing "Order Product" in the UI). Confirmed working on the validation org.
562
+
563
+ **Call:** `POST /services/data/v67.0/tooling/sobjects/CustomField` — status: `implemented`
564
+
565
+ **Inputs:**
566
+
567
+ - `FullName` *(`String`)*
568
+ - `Metadata` *(`complexvalue`)*
569
+
570
+ **Depends on:** `create-quote-line-item-node-status-field`
571
+
572
+ **Output:** {id: "<CustomField Id>", success: true, errors: []} on success (201).
573
+
574
+ #### `set-fls-node-status-quote-line-item`
575
+
576
+ Replaces the UI's per-profile Visible/Read-Only checkboxes in the New Field wizard. Creates a FieldPermissions record per profile that needs CML access — System Administrator and Energy Utilities Sales User per the walkthrough (visible, not read-only). Confirmed working on the validation org for System Administrator (ParentId=PermissionSet.Id of that profile's profile-linked PermissionSet, not the Profile Id itself — sObject FieldPermissions always keys off a PermissionSet, and every Profile has one implicit 1:1 PermissionSet with ProfileId populated). "Energy Utilities Sales User" profile does NOT exist on the validation org — see gap_risks.
577
+
578
+ **Call:** `POST /services/data/v67.0/sobjects/FieldPermissions` — status: `implemented`
579
+
580
+ **Inputs:**
581
+
582
+ - `ParentId` *(`String`)* — Id of the profile's implicit PermissionSet (query PermissionSet WHERE ProfileId = '<profileId>' to resolve — NOT the Profile Id).
583
+ - `SobjectType` *(`String`)*
584
+ - `Field` *(`String`)*
585
+ - `PermissionsRead` *(`boolean`)*
586
+ - `PermissionsEdit` *(`boolean`)*
587
+
588
+ **Depends on:** `create-quote-line-item-node-status-field`
589
+
590
+ **Output:** {id: "<FieldPermissions Id>", success: true, errors: []} on success (201).
591
+
592
+ #### `set-fls-node-status-order-item`
593
+
594
+ Same pattern as set-fls-node-status-quote-line-item, for the OrderItem field. Confirmed working on the validation org.
595
+
596
+ **Call:** `POST /services/data/v67.0/sobjects/FieldPermissions` — status: `implemented`
597
+
598
+ **Inputs:**
599
+
600
+ - `ParentId` *(`String`)* — Id of the profile's implicit PermissionSet (same resolution as set-fls-node-status-quote-line-item).
601
+ - `SobjectType` *(`String`)*
602
+ - `Field` *(`String`)*
603
+ - `PermissionsRead` *(`boolean`)*
604
+ - `PermissionsEdit` *(`boolean`)*
605
+
606
+ **Depends on:** `create-order-item-node-status-field`
607
+
608
+ **Output:** {id: "<FieldPermissions Id>", success: true, errors: []} on success (201).
609
+
610
+ #### `extend-sales-transaction-context`
611
+
612
+ Replaces Setup > Context Definitions > SalesTransactionContext > Extend modal. Skip this step if EUSalesTransactionContext already exists (query connect/context-definitions first and match on developerName). Confirmed working on the validation org: POST with {name, developerName, baseReference} returns 201 with a new contextDefinitionId + activeVersionId. Already exists on the validation org as of (contextDefinitionId 11O…, activeVersionId 11p…) — this run reused that definition rather than re-creating it. name must be alphanumeric only (no spaces/numbers-only segments tolerated). SalesTransactionContext is a large standard context definition (14 inherited ContextMapping records, deep nested attribute trees) — POST/GET calls against it or its extended child are slow and can return a transient "sf api request timeout" or a 500 INTERNAL_ERROR even when the write succeeds server-side. Confirmed on the validation org: two consecutive timeouts on this step were followed by GET checks showing "not created," but a third POST attempt returned 400 DUPLICATE_VALUE — proving one of the earlier timed-out calls had actually succeeded. On a timeout or 500, don't assume failure and don't blindly retry: re-query via Tooling API (SELECT Id, DeveloperName FROM ContextDefinition WHERE DeveloperName='...') to recover the real state/Id first. The plain GET /connect/context-definitions list endpoint does not reliably filter by developerName in this org (returns the full unfiltered list) — use the Tooling API query instead.
613
+
614
+ **Call:** `POST /services/data/v67.0/connect/context-definitions` — status: `implemented`
615
+
616
+ **Inputs:**
617
+
618
+ - `name` *(`String`)*
619
+ - `developerName` *(`String`)*
620
+ - `baseReference` *(`String`)*
621
+
622
+ **Output:** {contextDefinitionId, activeVersionId, definition, developerName, isActive: false,...} on success (201). Capture contextDefinitionId and activeVersionId for all subsequent steps in this section.
623
+
624
+ #### `add-multisite-context-attributes`
625
+
626
+ Replaces the UI's "add attributes under SalesTransactionItem node" step. Custom attribute names on an extended (non-standard) context definition MUST end in __c or the API rejects with INVALID_API_INPUT ("must have an '__c' suffix in an extended context definition") — confirmed live. fieldType enum value is INPUTOUTPUT (no underscore, despite the UI showing "INPUT OUTPUT") — confirmed live (the underscored form throws UNKNOWN_EXCEPTION). Confirmed working on the validation org: single POST created all 3 attributes in one call, 201, returning contextAttributeId for each (used by the tag and mapping steps below).
627
+
628
+ **Call:** `POST /services/data/v67.0/connect/context-nodes/{contextNodeId}/context-attributes` — status: `implemented`
629
+
630
+ **Inputs:**
631
+
632
+ - `contextNodeId` *(`String`)* — SalesTransactionItem's contextNodeId from get-sales-transaction-item-node-id.
633
+ - **Source:** output of `get-sales-transaction-item-node-id`
634
+ - `contextAttributes` *(`array`)*
635
+
636
+ **Depends on:** `get-sales-transaction-item-node-id`
637
+
638
+ **Output:** {attributes: [{contextAttributeId, name,...}], isSuccess: true} on success (201). Capture each contextAttributeId for the tag and mapping steps below.
639
+
640
+ #### `tag-multisite-context-attributes`
641
+
642
+ Replaces the UI's "enter the tags for the new attributes" screen. Confirmed working on the validation org: single POST created all 3 context tags in one call, 201.
643
+
644
+ **Call:** `POST /services/data/v67.0/connect/context-definitions/{contextDefinitionId}/context-tags` — status: `implemented`
645
+
646
+ **Inputs:**
647
+
648
+ - `contextDefinitionId` *(`String`)*
649
+ - `contextTags` *(`array`)*
650
+
651
+ **Depends on:** `add-multisite-context-attributes`
652
+
653
+ **Output:** {contextTags: [{contextTagId, name,...}], isSuccess: true} on success (201).
654
+
655
+ #### `map-multisite-attributes-to-quote`
656
+
657
+ Replaces the UI's "Map Data > QuoteEntitiesMapping > Edit SObject Mapping" flow. THIS IS THE STEP THAT WAS PREVIOUSLY FILED AS A GAP (an internally tracked gap, "no headless path for adding attribute/mapping to a context definition version") — re-investigated and the gap does NOT hold: the OAS spec for industries-context-connect-api documents POST /connect/context-node-mappings/{id}/context-attribute-mappings, which an internally tracked gap's investigation missed (it only tried PATCH .../versions/{versionId}, which is genuinely 404). Confirmed working end-to-end on the validation org for all 3 attributes: ConstraintEngineNodeStatus__c maps directly (QuoteLineItem field, no hydration needed — same node/sObject). DistributionArea__c and EstimatedConsumption__c live on the related QuoteLineItemRecipient object (per the walkthrough: "next to QuoteLineItemRecipientId, click + and select the fields") and require a 2-level hydrationDetails.contextAttrHydrationDetails structure: outer entry {queryAttribute: <relationship field name on QuoteLineItem>, sObjectDomain: QuoteLineItem}, with a nested childDetails.contextAttrHydrationDetails entry {queryAttribute: <field name on the related object>, sObjectDomain: QuoteLineItemRecipient}. IMPORTANT: this hydration structure only persists when supplied on the initial POST (create) — supplying it via a later PATCH (update) on the same mapping is silently dropped by the platform (returns 200 success but the hydration never appears in a follow-up GET). If a mapping needs hydration and was already created without it, DELETE and re-POST rather than PATCH.
658
+
659
+ **Call:** `POST /services/data/v67.0/connect/context-node-mappings/{contextNodeMappingId}/context-attribute-mappings` — status: `implemented`
660
+
661
+ **Inputs:**
662
+
663
+ - `contextNodeMappingId` *(`String`)* — QuoteEntitiesMapping's SalesTransactionItem contextNodeMappingId from get-sales-transaction-item-node-id.
664
+ - **Source:** output of `get-sales-transaction-item-node-id`
665
+ - `contextAttributeMappings` *(`array`)*
666
+
667
+ **Depends on:** `tag-multisite-context-attributes`
668
+
669
+ **Output:** {contextAttributeMappings: [{contextAttributeMappingId,...}], isSuccess: true} on success (201). Note: send each mapping in the array as a SEPARATE call if any need distinct hydration shapes — confirmed both single-item and multi-item arrays work; batching is only a convenience.
670
+
671
+ #### `map-multisite-attributes-to-order`
672
+
673
+ Same as map-multisite-attributes-to-quote but for OrderEntitiesMapping. ConstraintEngineNodeStatus__c maps directly (OrderItem field, no hydration). DistributionArea__c and EstimatedConsumption__c live on the related OrderItemRecipient object (relationship field OrderItemRecipientId on OrderItem) and use the same 2-level hydrationDetails.contextAttrHydrationDetails structure, swapping in OrderItem/OrderItemRecipient. Confirmed working end-to-end on the validation org: 201, and a follow-up GET confirmed both hydration structures persisted.
674
+
675
+ **Call:** `POST /services/data/v67.0/connect/context-node-mappings/{contextNodeMappingId}/context-attribute-mappings` — status: `implemented`
676
+
677
+ **Inputs:**
678
+
679
+ - `contextNodeMappingId` *(`String`)* — OrderEntitiesMapping's SalesTransactionItem contextNodeMappingId from get-sales-transaction-item-node-id.
680
+ - **Source:** output of `get-sales-transaction-item-node-id`
681
+ - `contextAttributeMappings` *(`array`)*
682
+
683
+ **Depends on:** `tag-multisite-context-attributes`
684
+
685
+ **Output:** {contextAttributeMappings: [{contextAttributeMappingId,...}], isSuccess: true} on success (201).
686
+
687
+ #### `set-quote-entities-mapping-default`
688
+
689
+ PATCH the ContextMapping record found above to IsDefault=true. Same mechanism validated in configure-eu-cloud-tariff-comparison's set-quote-entities-mapping-default step (204 No Content on success). Only runs if mark-quote-entities-mapping-default found IsDefault=false.
690
+
691
+ **Call:** `PATCH /services/data/v67.0/sobjects/ContextMapping/{mappingId}` — status: `implemented`
692
+
693
+ **Inputs:**
694
+
695
+ - `mappingId` *(`String`)*
696
+ - `IsDefault` *(`boolean`)*
697
+
698
+ **Depends on:** `mark-quote-entities-mapping-default`
699
+
700
+ **Output:** HTTP 204 No Content (success).
701
+
702
+ #### `activate-eu-sales-transaction-context`
703
+
704
+ Replaces the UI's final "Activate the context definition" action. Confirmed working on the validation org: PATCH {isActive: true} returns 200 with isActive: true in the response. Requires set-quote-entities-mapping-default (or its skip_if no-op) to have already established a default ContextMapping — see the ordering note on mark-quote-entities-mapping-default.
705
+
706
+ **Call:** `PATCH /services/data/v67.0/connect/context-definitions/{contextDefinitionId}` — status: `implemented`
707
+
708
+ **Inputs:**
709
+
710
+ - `contextDefinitionId` *(`String`)*
711
+ - `isActive` *(`boolean`)*
712
+
713
+ **Depends on:** `set-quote-entities-mapping-default`
714
+
715
+ **Output:** {isActive: true, isSuccess: true,...} on success (200).
716
+
717
+ #### `extend-product-discovery-context`
718
+
719
+ Replaces Setup > Context Definitions > Extend dropdown next to ProductDiscovery Context Definition. Same mechanism validated in configure-eu-cloud-tariff-comparison's extend-product-discovery-context step: sObject insert on ContextDefinition with InheritedFrom=ProductDiscoveryContext__stdctx. Confirmed already exists on the validation org (created during the tariff-comparison SOR run against the same org): GET connect/context-definitions lists contextDefinitionId 11O…, developerName EUProductDiscoveryContext, baseReference ProductDiscoveryContext__stdctx, isActive true. skip_if guards re-creation. Confirmed live end-to-end on a fresh validation org: did not pre-exist on this org (0 rows), created fresh via this exact POST — id 11O….
720
+
721
+ **Call:** `POST /services/data/v67.0/sobjects/ContextDefinition/` — status: `implemented`
722
+
723
+ **Inputs:**
724
+
725
+ - `DeveloperName` *(`String`)*
726
+ - `MasterLabel` *(`String`)*
727
+ - `Title` *(`String`)*
728
+ - `InheritedFrom` *(`String`)*
729
+
730
+ **Output:** {id: '<contextDefId>', success: true} on success (201).
731
+
732
+ #### `set-product-discovery-mapping-default`
733
+
734
+ Replaces Setup > Custom Definitions > EUProductDiscoveryContext > Map Data tab > Actions dropdown next to ProductDiscoveryMapping > Edit SObject Mapping > check "Mark as Default" > Map. PATCH the ContextMapping record found above to IsDefault=true. Same mechanism validated in configure-eu-cloud-tariff-comparison's set-product-discovery-mapping-default step (204 No Content). Confirmed already applied on the validation org: re-query shows ProductDiscoveryMapping (Id 11j…) already IsDefault=true. skip_if guards the redundant write. Confirmed fresh live write on the validation org: PATCH {IsDefault: true} on 11j… returned 204; re-query confirmed IsDefault=true.
735
+
736
+ **Call:** `PATCH /services/data/v67.0/sobjects/ContextMapping/{mappingId}` — status: `implemented`
737
+
738
+ **Inputs:**
739
+
740
+ - `mappingId` *(`String`)*
741
+ - `IsDefault` *(`boolean`)*
742
+
743
+ **Depends on:** `find-product-discovery-mapping`
744
+
745
+ **Output:** HTTP 204 No Content (success).
746
+
747
+ #### `activate-product-discovery-context`
748
+
749
+ Replaces the UI's "Activate the new context definition" action. PATCH the ContextDefinitionVersion to IsActive=true. Confirmed already active on the validation org: version 11p… shows IsActive=true. skip_if guards re-activation. Confirmed fresh live activation on the validation org: PATCH {IsActive: true} on 11p… returned 204 on the first attempt (no DATA_MAPPING_NOT_FOUND, since set-product-discovery-mapping-default already set the default mapping first).
750
+
751
+ **Call:** `PATCH /services/data/v67.0/sobjects/ContextDefinitionVersion/{versionId}` — status: `implemented`
752
+
753
+ **Inputs:**
754
+
755
+ - `versionId` *(`String`)*
756
+ - `IsActive` *(`boolean`)*
757
+
758
+ **Depends on:** `set-product-discovery-mapping-default`
759
+
760
+ **Output:** HTTP 204 No Content (success).
761
+
762
+ #### `sync-highlighted-context-definitions`
763
+
764
+ Replaces Setup > Context Definitions > Custom Definitions > Sync now for any highlighted definition. PATCH one entry per contextDefinitionId flagged isUpgradeAvailable=true by check-context-definitions-needing-sync, upgradeMode=Sync (the other enum values are Override/Preview — Sync is the "Sync now" button's mode). skip_if guards against calling this when nothing is highlighted. Confirmed live on the validation org: PATCH {contextDefinitions: [{contextDefinitionId: 11O…, upgradeMode: Sync}]} returned 200 with isUpgradeAvailable=false on the synced entry; a follow-up GET includeUpgrade=true confirmed isUpgradeAvailable=false for both custom context definitions on this org.
765
+
766
+ **Call:** `PATCH /services/data/v67.0/connect/context-definitions/upgrades` — status: `implemented`
767
+
768
+ **Inputs:**
769
+
770
+ - `contextDefinitions` *(`Array<{contextDefinitionId: String, upgradeMode: String}>`)*
771
+
772
+ **Depends on:** `check-context-definitions-needing-sync`
773
+
774
+ **Output:** contextDefinitionList[] reflecting the post-sync state, isUpgradeAvailable=false confirmed for the synced entry.
775
+
776
+ #### `set-product-discovery-browse-context-def`
777
+
778
+ Replaces Setup > Product Discovery Settings > Select Context Definition > MultiRecipientProductDiscovery. Request key is valueDef (not value), per the controller's @Key annotation. Confirmed live: PATCH {valueDef: "MultiRecipientProductDiscovery__stdctx"} returned 200 body=true, and a follow-up getInitialOrgValues re-read confirmed selectedBrowseContextDef=MultiRecipientProductDiscovery__stdctx. Note the bare DeveloperName ("MultiRecipientProductDiscovery") is accepted (200 true) but silently does NOT persist — always use the full "__stdctx"-suffixed literal, not the bare developer name.
779
+
780
+ **Call:** `PATCH /headless/invoke/platform/product-discovery-settings/set-browse-context-def` — status: `implemented`
781
+
782
+ **Inputs:**
783
+
784
+ - `valueDef` *(`String`)* — Fixed literal for the standard MultiRecipientProductDiscovery stdctx — the "__stdctx"-suffixed form, not the bare DeveloperName.
785
+
786
+ **Depends on:** `read-product-discovery-settings-baseline`
787
+
788
+ **Output:** Boolean true on success.
789
+
790
+ #### `add-opportunity-product-recipients-related-list`
791
+
792
+ Replaces Setup > Object Manager > Opportunity > Page Layouts > drag "Opportunity Product Recipients" into the Related Lists section > Save. Add relatedList entry {relatedList: "OpportunityLineItemRecipients"} to Layout Metadata.relatedLists via Tooling API PATCH — preserve all existing relatedLists entries (strip quickActions key from each), omit quickActionList from the PATCH body, same relatedList-only-changes-work pattern as the sibling SOR's add-quotes-to-opportunity-layout. Confirmed live on the validation org: PATCH with relatedList "OpportunityLineItemRecipients" (NOT the "Related<Thing>List" naming convention every other standard relatedList on this object uses, and NOT the UI-API relatedListId "Opportunity_OPR") returned 204. Fields sent: ["Name", "ServiceType", "EstimatedAnnualConsumption", "CreatedDate"].
793
+
794
+ **Call:** `PATCH /services/data/v67.0/tooling/sobjects/Layout/{layoutId}` — status: `implemented`
795
+
796
+ **Inputs:**
797
+
798
+ - `layoutId` *(`String`)* — Layout Id from get-opportunity-layout.
799
+ - **Source:** output of `get-opportunity-layout`
800
+ - `Metadata` *(`Object`)* — Full Layout Metadata from get-opportunity-layout with relatedLists rebuilt: preserve all existing entries (strip quickActions key from each), add new entry {customButtons: [], excludeButtons: [], fields: ["Name", "ServiceType", "EstimatedAnnualConsumption", "CreatedDate"], relatedList: "OpportunityLineItemRecipients", sortField: null, sortOrder: null}. Omit quickActionList from the PATCH body.
801
+ - **Source:** output of `get-opportunity-layout`
802
+
803
+ **Depends on:** `get-opportunity-layout`
804
+
805
+ **Output:** 204 No Content on success. Verify via a follow-up read that OpportunityLineItemRecipients persisted in Metadata.relatedLists.
806
+
807
+ #### `enable-order-events`
808
+
809
+ Replaces Setup > Revenue Settings > "Order Events" toggle. Confirmed working on the target org: PATCH {value: true} returns success; follow-up re-read shows TransactionProcessorEnabled=true. Re-confirmed live: baseline read showed TransactionProcessorEnabled=false, PATCH {value: true} returned {status_code: 200, body: true}, follow-up re-read confirmed TransactionProcessorEnabled=true.
810
+
811
+ **Call:** `PATCH /headless/invoke/platform/revenue-settings/set-transaction-processor-enabled` — status: `implemented`
812
+
813
+ **Inputs:**
814
+
815
+ - `value` *(`boolean`)*
816
+
817
+ **Depends on:** `read-revenue-settings-baseline`
818
+
819
+ **Output:** {status: SUCCESS,...} on success. Write action requires params_schema in the invoke payload.
820
+
821
+ #### `enable-configure-products-at-runtime`
822
+
823
+ "Enable Configure Products at Runtime." Same setProductConfiguratorPrefEnabled toggle already turned on by the foundation SOR's enable-product-configurator step. Idempotent — skip_if ProductConfiguratorPrefEnabled already true (confirmed true on the validation org before this step runs).
824
+
825
+ **Call:** `PATCH /headless/invoke/platform/revenue-settings/set-product-configurator-pref-enabled` — status: `implemented`
826
+
827
+ **Inputs:**
828
+
829
+ - `value` *(`boolean`)* — Enable Configure Products at Runtime.
830
+
831
+ **Depends on:** `get-revenue-settings-constraint-prefs`
832
+
833
+ **Output:** {status_code: 200, body: true}
834
+
835
+ #### `enable-configuration-rules-and-constraints`
836
+
837
+ "Enable Set Up Configuration Rules and Constraints with Constraints Engine." VALIDATED live on the validation org: PATCH returned {status_code: 200, body: true}; verify confirmed PCMConfigRuleEnabled flipped false -> true.
838
+
839
+ **Call:** `PATCH /headless/invoke/platform/revenue-settings/set-pcm-config-rule-pref-enabled` — status: `implemented`
840
+
841
+ **Inputs:**
842
+
843
+ - `value` *(`boolean`)* — Enable configuration rules and constraints with the Constraints Engine.
844
+
845
+ **Depends on:** `get-revenue-settings-constraint-prefs`
846
+
847
+ **Output:** {status_code: 200, body: true}
848
+
849
+ #### `assign-product-configurator-permset`
850
+
851
+ For each target user (admin plus any additional non-admin/standard users), check for an existing PermissionSetAssignment first (idempotency — same pattern as assign-multisite-permsets), then POST PermissionSetAssignment {AssigneeId, PermissionSetId} for any not already assigned, using the Id from query-product-configurator-permset. Confirmed live on a fresh org where the permset was present but unassigned: 0 pre-existing assignments found for the admin user, POST returned {success: true} with a new PermissionSetAssignment Id.
852
+
853
+ **Call:** `POST /services/data/v67.0/sobjects/PermissionSetAssignment` — status: `implemented`
854
+
855
+ **Inputs:**
856
+
857
+ - `AssigneeId` *(`String`)* — Id of a user to assign (admin first, then repeat per additional user).
858
+ - `PermissionSetId` *(`String`)* — "Product Configurator" PermissionSet Id, resolved by query-product-configurator-permset.
859
+
860
+ **Depends on:** `query-product-configurator-permset`
861
+
862
+ **Output:** {id: "<PermissionSetAssignment Id>", success: true, errors: []} per call.
863
+
864
+ ### Verify operations
865
+
866
+ #### `verify-multisite-features`
867
+
868
+ Re-read all EU preferences and confirm euSalesPrefMap.isPrefEnabled=true and euMultisiteFeaturePrefMap.isPrefEnabled=true. If either is false after write, surface the failure to the user — for euMultisiteFeature this most likely means the EU Multisite feature is not provisioned.
869
+
870
+ **Call:** `GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs` — status: `implemented`
871
+
872
+ **Depends on:** `enable-eu-sales`, `enable-multisite-feature`
873
+
874
+ **Output:** Same as read-eu-prefs. Agent checks euSalesPrefMap.isPrefEnabled == true AND euMultisiteFeaturePrefMap.isPrefEnabled == true.
875
+
876
+ #### `verify-external-pricing`
877
+
878
+ Re-read all EU preferences and confirm euExternalPricingFeaturePrefMap.isPrefEnabled=true. Confirmed live on the validation org.
879
+
880
+ **Call:** `GET /headless/invoke/industries/industries-energy-utilities/get-industries-energy-utilities-prefs` — status: `implemented`
881
+
882
+ **Depends on:** `enable-external-pricing`
883
+
884
+ **Output:** Same as read-eu-prefs. Agent checks euExternalPricingFeaturePrefMap.isPrefEnabled == true.
885
+
886
+ #### `verify-multisite-permsets`
887
+
888
+ Query PermissionSetAssignment WHERE AssigneeId=<user> AND PermissionSetId IN (<the 4 Ids>). Confirm totalSize == 4.
889
+
890
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
891
+
892
+ **Inputs:**
893
+
894
+ - `q` *(`String`)* — SELECT Id, PermissionSet.Label FROM PermissionSetAssignment WHERE AssigneeId = '<userId>' AND PermissionSetId IN (<4 Ids>)
895
+
896
+ **Depends on:** `assign-multisite-permsets`
897
+
898
+ **Output:** {totalSize: 4, records: [{Id, PermissionSet: {Label}},...]}
899
+
900
+ #### `verify-standard-user-additional-permsets`
901
+
902
+ Query PermissionSetAssignment WHERE AssigneeId=<standard user Id, same either/or resolution as assign-standard-user-additional-permsets: create-standard-user's output Id, or check-existing-standard-user's existingUserId on the reuse path> AND PermissionSetId IN (<the 3 Ids>). Confirm totalSize == 3. Confirmed live on the validation org: totalSize 3, labels CME Sales Features / Create Orders from Quotes / Basic CSV Data Import all present (a 4th unrelated auto-assigned profile-linked permset also appears in an unfiltered query — expected, not part of this step's count).
903
+
904
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
905
+
906
+ **Inputs:**
907
+
908
+ - `q` *(`String`)* — SELECT Id, PermissionSet.Label FROM PermissionSetAssignment WHERE AssigneeId = '<standard user Id, either/or resolution as above>' AND PermissionSetId IN (<3 Ids>)
909
+
910
+ **Depends on:** `assign-standard-user-additional-permsets`
911
+
912
+ **Output:** {totalSize: 3, records: [{Id, PermissionSet: {Label}},...]}
913
+
914
+ #### `verify-node-status-fls`
915
+
916
+ Query FieldPermissions for both fields and confirm PermissionsRead=true, PermissionsEdit=true for each granted profile.
917
+
918
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
919
+
920
+ **Inputs:**
921
+
922
+ - `q` *(`String`)*
923
+
924
+ **Depends on:** `set-fls-node-status-quote-line-item`, `set-fls-node-status-order-item`
925
+
926
+ **Output:** records[] each with PermissionsRead=true, PermissionsEdit=true. Agent verifies both fields show at least the System Administrator grant.
927
+
928
+ #### `verify-multisite-context-definition`
929
+
930
+ Re-GET the full context definition and confirm: (1) isActive=true on the contextDefinitionVersionList[0] entry; (2) QuoteEntitiesMapping's and OrderEntitiesMapping's SalesTransactionItem node mappings each list all 3 attributes; (3) DistributionArea__c and EstimatedConsumption__c show a non-empty contextAttrHydrationDetailList on both mappings, with the expected 2-level queryAttribute/sObjectDomain/childDetails structure (empty list here means the hydration silently failed to persist — see the PATCH vs POST caveat in map-multisite-attributes-to-quote).
931
+
932
+ **Call:** `GET /services/data/v67.0/connect/context-definitions/{contextDefinitionId}` — status: `implemented`
933
+
934
+ **Inputs:**
935
+
936
+ - `contextDefinitionId` *(`String`)*
937
+
938
+ **Depends on:** `activate-eu-sales-transaction-context`
939
+
940
+ **Output:** Full context definition. Agent parses per the description above; all checks confirmed passing on the validation org.
941
+
942
+ #### `verify-product-discovery-context-active`
943
+
944
+ Confirm IsActive=true on the version and ProductDiscoveryMapping.IsDefault=true. Confirmed passing on the validation org: version 11p… IsActive=true, ContextMapping 11j… IsDefault=true.
945
+
946
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
947
+
948
+ **Inputs:**
949
+
950
+ - `q` *(`String`)*
951
+
952
+ **Depends on:** `activate-product-discovery-context`
953
+
954
+ **Output:** IsActive=true confirmed for EUProductDiscoveryContext's version.
955
+
956
+ #### `verify-product-discovery-browse-context-def`
957
+
958
+ Re-read Product Discovery Settings and confirm selectedBrowseContextDef=MultiRecipientProductDiscovery__stdctx. Confirmed live on the validation org.
959
+
960
+ **Call:** `GET /headless/invoke/platform/product-discovery-settings` — status: `implemented`
961
+
962
+ **Depends on:** `set-product-discovery-browse-context-def`
963
+
964
+ **Output:** Agent checks selectedBrowseContextDef == "MultiRecipientProductDiscovery__stdctx".
965
+
966
+ #### `verify-opportunity-product-recipients-related-list`
967
+
968
+ Re-read the Opportunity Layout Metadata and confirm relatedLists contains an entry with relatedList=="OpportunityLineItemRecipients". Confirmed live on the validation org.
969
+
970
+ **Call:** `GET /services/data/v67.0/tooling/query` — status: `implemented`
971
+
972
+ **Inputs:**
973
+
974
+ - `layoutId` *(`String`)* — Layout Id from get-opportunity-layout.
975
+ - **Source:** output of `get-opportunity-layout`
976
+ - `q` *(`string`)*
977
+
978
+ **Depends on:** `add-opportunity-product-recipients-related-list`
979
+
980
+ **Output:** Agent checks Metadata.relatedLists contains an entry with relatedList == "OpportunityLineItemRecipients".
981
+
982
+ #### `verify-constraint-model-revenue-settings`
983
+
984
+ Re-read getInitialStates and confirm ProductConfiguratorPrefEnabled == true AND PCMConfigRuleEnabled == true. VALIDATED on the validation org.
985
+
986
+ **Call:** `GET /headless/invoke/platform/revenue-settings/get-initial-states` — status: `implemented`
987
+
988
+ **Depends on:** `enable-configure-products-at-runtime`, `enable-configuration-rules-and-constraints`
989
+
990
+ **Output:** body.ProductConfiguratorPrefEnabled == true AND body.PCMConfigRuleEnabled == true.
991
+
992
+ #### `verify-product-configurator-permset`
993
+
994
+ Query PermissionSetAssignment WHERE AssigneeId=<user> AND PermissionSetId=<Id from query-product-configurator-permset>. Confirm totalSize == 1 per assignee. Confirmed live on a fresh org: re-query by the new PermissionSetAssignment Id showed Assignee.Username and PermissionSet.Label = 'Product Configurator' as expected.
995
+
996
+ **Call:** `GET /services/data/v67.0/query` — status: `implemented`
997
+
998
+ **Inputs:**
999
+
1000
+ - `q` *(`String`)* — SELECT Id, Assignee.Username, PermissionSet.Label FROM PermissionSetAssignment WHERE AssigneeId = '<userId>' AND PermissionSetId = '<Id>'
1001
+
1002
+ **Depends on:** `assign-product-configurator-permset`
1003
+
1004
+ **Output:** {totalSize: 1, records: [{Id, Assignee: {Username}, PermissionSet: {Label}}]}
1005
+
1006
+ ## Notes
1007
+
1008
+ - **gap_risks:** {'risk': 'EU Multisite feature may not be provisioned on target org', 'severity': 'precondition_blocker', 'status': 'RESOLVED — confirmed provisioned on the target org', 'mitigation': 'Check euMultisiteFeaturePrefMap.showPrefToggle in read-eu-prefs response before attempting the write. No API can grant this feature — requires the admin to arrange the license entitlement.'}, {'risk': '"Energy Utilities Sales User" profile does not exist on the validation org', 'severity': 'validation_gap', 'status': "PARTIALLY RESOLVED — set-fls-node-status-* steps' mechanism fully confirmed live for System Administrator; the second profile named in the walkthrough could not be granted on this org because the profile itself isn't provisioned here", 'mitigation': 'Queried Profile and PermissionSet (WHERE ProfileId != null) on the validation org — no profile named "Energy Utilities Sales User" or similar exists; only standard/default profiles are present (System Administrator, Standard User, etc.), consistent with this being a clean EU-license validation org rather than a fully provisioned E&U sales org. The FieldPermissions POST mechanism itself (ParentId = profile\'s implicit PermissionSet.Id, not the Profile Id) is Confirmed-Findings SOLVED — proven end-to-end for System Administrator on both QuoteLineItem and OrderItem fields (FieldPermissions Ids 01k…, 01k…). On a target org where the E&U Sales User profile is provisioned, resolve its PermissionSet.Id the same way and re-run set-fls-node-status-quote-line-item / -order-item with that ParentId — no new mechanism needed, just the second profile\'s Id.'}