@salesforce/afv-skills 1.46.0 → 1.48.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 (317) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-observe/SKILL.md +32 -4
  3. package/skills/agentforce-observe/references/ahm-alerts.md +719 -0
  4. package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +275 -0
  5. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/README.md +32 -0
  6. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/SetCommentValue.cls +75 -0
  7. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/SetCommentValue.cls-meta.xml +5 -0
  8. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/interview-answers.json +13 -0
  9. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/copy.json +10 -0
  10. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/create.json +20 -0
  11. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/update.json +16 -0
  12. package/skills/consumer-goods-promotion-bo-api-deploy/references/conventions-and-payload-rules.md +273 -0
  13. package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +236 -0
  14. package/skills/consumer-goods-promotion-bo-api-deploy/references/reference-example-set-comment-value.md +132 -0
  15. package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +211 -0
  16. package/skills/dx-devops-project-manage/SKILL.md +197 -0
  17. package/skills/dx-devops-project-manage/examples/common-workflows.md +197 -0
  18. package/skills/dx-devops-project-manage/references/cli-commands.md +295 -0
  19. package/skills/dx-devops-project-manage/scripts/create-project.sh +48 -0
  20. package/skills/dx-devops-project-manage/scripts/list-projects.sh +51 -0
  21. package/skills/dx-devops-project-manage/scripts/update-project.sh +96 -0
  22. package/skills/education-cloud-academic-calendar-generate/SKILL.md +225 -0
  23. package/skills/education-cloud-academic-calendar-generate/examples/quarter-calendar.json +47 -0
  24. package/skills/education-cloud-academic-calendar-generate/examples/sample-output.md +57 -0
  25. package/skills/education-cloud-academic-calendar-generate/examples/semester-calendar.json +54 -0
  26. package/skills/education-cloud-academic-calendar-generate/references/calendar-systems.md +127 -0
  27. package/skills/education-cloud-academic-calendar-generate/references/date-validation.md +222 -0
  28. package/skills/education-cloud-academic-calendar-generate/references/foundation_prerequisites.md +40 -0
  29. package/skills/education-cloud-academic-calendar-generate/scripts/validate_calendar_dates.py +143 -0
  30. package/skills/education-cloud-course-catalog-migrate/SKILL.md +321 -0
  31. package/skills/education-cloud-course-catalog-migrate/references/gotchas-detail.md +16 -0
  32. package/skills/education-cloud-course-catalog-migrate/references/gotchas.md +16 -0
  33. package/skills/education-cloud-course-catalog-migrate/references/large-catalog-handling.md +42 -0
  34. package/skills/education-cloud-course-catalog-migrate/scripts/batch_courses.py +36 -0
  35. package/skills/education-cloud-course-catalog-migrate/scripts/detect_linked_courses.py +51 -0
  36. package/skills/education-cloud-course-catalog-migrate/scripts/detect_modality_variants.py +48 -0
  37. package/skills/education-cloud-course-catalog-migrate/scripts/resolve_api_version.py +43 -0
  38. package/skills/education-cloud-course-catalog-migrate/scripts/split_course_code.py +39 -0
  39. package/skills/education-cloud-course-catalog-migrate/scripts/validate_completeness.py +54 -0
  40. package/skills/education-cloud-domain-configure/SKILL.md +234 -0
  41. package/skills/education-cloud-domain-configure/references/dependent-features.md +198 -0
  42. package/skills/education-cloud-domain-configure/references/domain-features/academic-operations.md +386 -0
  43. package/skills/education-cloud-domain-configure/references/domain-features/alumni-relations.md +155 -0
  44. package/skills/education-cloud-domain-configure/references/domain-features/cross-domain-dependencies.md +18 -0
  45. package/skills/education-cloud-domain-configure/references/domain-features/industriessettings-toggle-reference.md +43 -0
  46. package/skills/education-cloud-domain-configure/references/domain-features/mentoring.md +198 -0
  47. package/skills/education-cloud-domain-configure/references/domain-features/recruitment-admissions.md +315 -0
  48. package/skills/education-cloud-domain-configure/references/domain-features/student-management.md +155 -0
  49. package/skills/education-cloud-domain-configure/references/domain-features/student-success.md +249 -0
  50. package/skills/education-cloud-domain-configure/references/domain-features.md +27 -0
  51. package/skills/education-cloud-domain-configure/references/gotchas-extended.md +23 -0
  52. package/skills/education-cloud-domain-configure/references/toggle-write-path.md +67 -0
  53. package/skills/education-cloud-domain-configure/scripts/check_license_provisioned.py +62 -0
  54. package/skills/education-cloud-domain-configure/scripts/check_org_edition.py +44 -0
  55. package/skills/education-cloud-domain-configure/scripts/check_permission_assigned.py +39 -0
  56. package/skills/education-cloud-multi-campus-configure/SKILL.md +7 -0
  57. package/skills/education-cloud-multi-campus-configure/references/foundation_prerequisites.md +1 -2
  58. package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +177 -0
  59. package/skills/education-cloud-student-recruitment-agent-configure/references/agent-and-subagents.md +151 -0
  60. package/skills/education-cloud-student-recruitment-agent-configure/references/customer-narration.md +34 -0
  61. package/skills/education-cloud-student-recruitment-agent-configure/references/execution-model.md +54 -0
  62. package/skills/education-cloud-student-recruitment-agent-configure/references/flows.md +82 -0
  63. package/skills/education-cloud-student-recruitment-agent-configure/references/grounding.md +199 -0
  64. package/skills/education-cloud-student-recruitment-agent-configure/references/permissions.md +183 -0
  65. package/skills/education-cloud-student-recruitment-agent-configure/references/platform-enablement.md +82 -0
  66. package/skills/education-cloud-student-recruitment-agent-configure/references/prerequisites.md +158 -0
  67. package/skills/education-cloud-student-recruitment-agent-configure/references/routing.md +141 -0
  68. package/skills/experience-cms-brand-apply/SKILL.md +5 -5
  69. package/skills/experience-cms-brand-create/SKILL.md +2 -2
  70. package/skills/experience-cms-content-generate/SKILL.md +1 -0
  71. package/skills/experience-cms-content-render/SKILL.md +173 -0
  72. package/skills/experience-cms-content-render/assets/angular/DetailPage.component.ts +25 -0
  73. package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +133 -0
  74. package/skills/experience-cms-content-render/assets/angular/TypeList.component.ts +38 -0
  75. package/skills/experience-cms-content-render/assets/angular/TypeRenderer.component.ts +90 -0
  76. package/skills/experience-cms-content-render/assets/angular/cms-content.component.ts +248 -0
  77. package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +100 -0
  78. package/skills/experience-cms-content-render/assets/react/DetailPage.tsx +20 -0
  79. package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +129 -0
  80. package/skills/experience-cms-content-render/assets/react/TypeList.tsx +40 -0
  81. package/skills/experience-cms-content-render/assets/react/TypeRenderer.tsx +64 -0
  82. package/skills/experience-cms-content-render/assets/react/heuristicRenderer.tsx +310 -0
  83. package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +129 -0
  84. package/skills/experience-cms-content-render/assets/shared/cmsContentType.ts +49 -0
  85. package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +96 -0
  86. package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +55 -0
  87. package/skills/experience-cms-content-render/references/bulk-loading.md +60 -0
  88. package/skills/experience-cms-content-render/references/codegen-guardrails.md +111 -0
  89. package/skills/experience-cms-content-render/references/detail-pages.md +87 -0
  90. package/skills/experience-cms-content-render/references/embed-recipes.md +127 -0
  91. package/skills/experience-cms-content-render/references/failure-modes.md +96 -0
  92. package/skills/experience-cms-content-render/references/heuristic-render-rules.md +131 -0
  93. package/skills/experience-cms-content-render/references/init-scaffold.md +122 -0
  94. package/skills/experience-cms-content-render/references/interaction-model.md +173 -0
  95. package/skills/experience-cms-content-render/references/package-api.md +106 -0
  96. package/skills/experience-cms-content-render/references/schema-sync.md +114 -0
  97. package/skills/experience-cms-content-render/references/styling-scopes.md +65 -0
  98. package/skills/experience-cms-content-render/references/verify.md +49 -0
  99. package/skills/experience-cms-content-type-generate/SKILL.md +2 -2
  100. package/skills/experience-content-media-stock-image-search/SKILL.md +5 -4
  101. package/skills/experience-search-coordinate/SKILL.md +198 -0
  102. package/skills/experience-search-coordinate/assets/search-payload-template.json +25 -0
  103. package/skills/experience-search-coordinate/references/content-route.md +313 -0
  104. package/skills/experience-search-coordinate/references/content-type-discovery.md +57 -0
  105. package/skills/experience-search-coordinate/references/media-route.md +172 -0
  106. package/skills/experience-search-coordinate/references/scope-resolution.md +14 -0
  107. package/skills/experience-ui-bundle-localize/SKILL.md +1 -1
  108. package/skills/experience-ui-bundle-localize/references/i18n-setup.md +5 -3
  109. package/skills/experience-ui-bundle-project-generate/SKILL.md +18 -14
  110. package/skills/experience-ui-bundle-project-generate/references/angular-project-generate.md +22 -0
  111. package/skills/experience-ui-bundle-project-generate/references/react-project-generate.md +20 -0
  112. package/skills/experience-ui-bundle-salesforce-data-access/SKILL.md +58 -54
  113. package/skills/experience-ui-bundle-salesforce-data-access/references/caching.md +6 -0
  114. package/skills/experience-ui-bundle-salesforce-data-access/references/graphiti-cli.md +2 -2
  115. package/skills/experience-ui-bundle-salesforce-data-access/references/migration.md +6 -0
  116. package/skills/experience-ui-bundle-salesforce-data-access/references/rest-and-integration.md +2 -1
  117. package/skills/experience-ui-bundle-salesforce-data-access/references/sdk-api.md +6 -0
  118. package/skills/experience-ui-bundle-site-generate/SKILL.md +59 -8
  119. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-digital-experience.md +8 -3
  120. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-language-settings.md +120 -0
  121. package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +336 -0
  122. package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +143 -0
  123. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-application-flexipage-mapping.md +127 -0
  124. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-deploy-commands.md +116 -0
  125. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-lifesci-metadata-deploy.md +111 -0
  126. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-overview.md +312 -0
  127. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-profile-layout-assignments.md +171 -0
  128. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-state-tracking.md +64 -0
  129. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-trigger-handlers.md +122 -0
  130. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-4-user-provisioning-overview.md +335 -0
  131. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-4-user-provisioning-user-provisioning-details.md +140 -0
  132. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-execution-state-and-recovery.md +196 -0
  133. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-metadata-cache-generation.md +155 -0
  134. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-overview.md +307 -0
  135. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-visit-creation-data.md +211 -0
  136. package/skills/life-sciences-fieldsalesrep-coordinate/references/state-machine-and-changes.md +108 -0
  137. package/skills/life-sciences-kam-coordinate/SKILL.md +241 -0
  138. package/skills/life-sciences-kam-coordinate/references/orchestration-flow.md +152 -0
  139. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-application-flexipage-mapping.md +79 -0
  140. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-deploy-commands.md +131 -0
  141. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-kam-config-records.md +85 -0
  142. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-lifesci-metadata-deploy.md +112 -0
  143. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-overview.md +202 -0
  144. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-profile-layout-assignments.md +67 -0
  145. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-state-tracking.md +65 -0
  146. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-trigger-handlers.md +123 -0
  147. package/skills/life-sciences-kam-coordinate/references/stage-4-participant-role-and-sprint.md +89 -0
  148. package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +337 -0
  149. package/skills/life-sciences-kam-coordinate/references/stage-5-data-creation-data.md +248 -0
  150. package/skills/life-sciences-kam-coordinate/references/stage-6-ipad-validation-script.md +35 -0
  151. package/skills/life-sciences-kam-coordinate/references/stage-6-metadata-cache-generation.md +155 -0
  152. package/skills/life-sciences-kam-coordinate/references/stage-6-user-provisioning-details.md +146 -0
  153. package/skills/life-sciences-kam-coordinate/references/stage-6-user-provisioning-overview.md +89 -0
  154. package/skills/life-sciences-kam-coordinate/references/state-machine-and-changes.md +114 -0
  155. package/skills/life-sciences-prerequisites-validate/SKILL.md +138 -0
  156. package/skills/life-sciences-prerequisites-validate/references/checks-org-settings.md +190 -0
  157. package/skills/life-sciences-prerequisites-validate/references/checks-user-and-package.md +211 -0
  158. package/skills/life-sciences-territory-configure/SKILL.md +217 -0
  159. package/skills/life-sciences-territory-configure/references/territory-metadata.md +262 -0
  160. package/skills/platform-dsar-policy-manage/SKILL.md +272 -0
  161. package/skills/platform-dsar-policy-manage/references/configure.md +106 -0
  162. package/skills/platform-dsar-policy-manage/references/export-and-history.md +123 -0
  163. package/skills/platform-dsar-policy-manage/references/gap-analysis-guide.md +150 -0
  164. package/skills/platform-dsar-policy-manage/references/gap-scan.md +129 -0
  165. package/skills/platform-dsar-policy-manage/references/headless-sor.md +59 -0
  166. package/skills/platform-dsar-policy-manage/references/report-format.md +59 -0
  167. package/skills/platform-dsar-policy-manage/scripts/tests/__init__.py +0 -0
  168. package/skills/platform-dsar-policy-manage/scripts/tests/test_validate_policy_tree.py +76 -0
  169. package/skills/platform-dsar-policy-manage/scripts/validate-policy-tree.py +130 -0
  170. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +359 -0
  171. package/skills/platform-salesforce-connect-adapter-generate/references/official-examples.md +69 -0
  172. package/skills/platform-salesforce-connect-adapter-generate/references/scenarios.md +187 -0
  173. package/skills/service-agentforce-channel-configure/SKILL.md +33 -28
  174. package/skills/service-agentforce-human-escalation-configure/SKILL.md +205 -0
  175. package/skills/service-agentforce-human-escalation-configure/assets/escalation-thresholds.instructions.md +37 -0
  176. package/skills/service-agentforce-human-escalation-configure/assets/force-app/main/default/flows/Human_Escalation_Outbound_Flow.flow-meta.xml +173 -0
  177. package/skills/service-agentforce-human-escalation-configure/assets/package.xml +8 -0
  178. package/skills/service-agentforce-human-escalation-configure/assets/sfdx-project.json +5 -0
  179. package/skills/service-agentforce-human-escalation-configure/references/classifier-contracts.md +103 -0
  180. package/skills/service-agentforce-human-escalation-configure/references/escalation-mechanism.md +63 -0
  181. package/skills/service-agentforce-human-escalation-configure/references/failure-policy.md +44 -0
  182. package/skills/service-agentforce-human-escalation-configure/references/nga-escalation.md +57 -0
  183. package/skills/service-agentforce-human-escalation-configure/references/runtime-verification.md +72 -0
  184. package/skills/service-agentforce-human-escalation-configure/scripts/classify-agent-active.mjs +49 -0
  185. package/skills/service-agentforce-human-escalation-configure/scripts/classify-nga-escalation.mjs +166 -0
  186. package/skills/service-agentforce-human-escalation-configure/scripts/extract-outbound-route.mjs +67 -0
  187. package/skills/service-agentforce-human-escalation-configure/scripts/patch-escalation-surfaces.mjs +131 -0
  188. package/skills/service-agentforce-human-escalation-configure/scripts/tests/__init__.py +0 -0
  189. package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +249 -0
  190. package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +899 -0
  191. package/skills/service-agentforce-human-escalation-configure/scripts/verify-and-configure.sh +705 -0
  192. package/skills/service-agentforce-human-escalation-configure/scripts/verify-escalation-config.mjs +89 -0
  193. package/skills/service-de-channel-routing-configure/SKILL.md +13 -5
  194. package/skills/service-de-channel-routing-configure/scripts/tests/test_skill_contract.py +25 -0
  195. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +23 -10
  196. package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +63 -48
  197. package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +6 -2
  198. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +20 -27
  199. package/skills/service-native-voice-recording-transcription-configure/SKILL.md +47 -27
  200. package/skills/service-native-voice-recording-transcription-configure/references/thunderbird-voice-settings.md +13 -9
  201. package/skills/service-native-voice-recording-transcription-configure/scripts/enable-recording-transcription.sh +104 -45
  202. package/skills/service-omni-agent-users-create/SKILL.md +96 -0
  203. package/skills/service-omni-agent-users-create/assets/create-users.apex.template +80 -0
  204. package/skills/service-omni-agent-users-create/references/apex-patterns.md +135 -0
  205. package/skills/service-omni-agent-users-create/references/apex-template-notes.md +40 -0
  206. package/skills/service-omni-agent-users-create/scripts/detect-and-create.sh +206 -0
  207. package/skills/service-omni-agent-users-create/scripts/detect-existing.sh +122 -0
  208. package/skills/service-omni-agent-users-create/scripts/run-create.sh +298 -0
  209. package/skills/service-omni-agent-users-create/scripts/tests/test_user_create_security.py +171 -0
  210. package/skills/service-omni-agent-work-sharing-configure/SKILL.md +78 -0
  211. package/skills/service-omni-agent-work-sharing-configure/references/api-notes.md +31 -0
  212. package/skills/service-omni-agent-work-sharing-configure/scripts/configure-and-report.sh +186 -0
  213. package/skills/service-omni-agent-work-sharing-configure/scripts/tests/_bootstrap.py +120 -0
  214. package/skills/service-omni-agent-work-sharing-configure/scripts/tests/test_agent_work_sharing_contracts.py +93 -0
  215. package/skills/service-omni-base-settings-configure/SKILL.md +77 -0
  216. package/skills/service-omni-base-settings-configure/assets/force-app/main/default/settings/OmniChannel.settings-meta.xml +8 -0
  217. package/skills/service-omni-base-settings-configure/assets/package.xml +8 -0
  218. package/skills/service-omni-base-settings-configure/assets/sfdx-project.json +12 -0
  219. package/skills/service-omni-base-settings-configure/references/api-notes.md +121 -0
  220. package/skills/service-omni-base-settings-configure/scripts/configure-and-report.sh +164 -0
  221. package/skills/service-omni-base-settings-configure/scripts/detect-existing.sh +69 -0
  222. package/skills/service-omni-channel-setup-coordinate/SKILL.md +168 -0
  223. package/skills/service-omni-channel-setup-coordinate/examples/output-templates.md +161 -0
  224. package/skills/service-omni-channel-setup-coordinate/references/gap-catalog.md +99 -0
  225. package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +1542 -0
  226. package/skills/service-omni-channel-setup-coordinate/scripts/tests/__init__.py +0 -0
  227. package/skills/service-omni-channel-setup-coordinate/scripts/tests/_bootstrap.py +223 -0
  228. package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +804 -0
  229. package/skills/service-omni-command-center-analyze/SKILL.md +84 -0
  230. package/skills/service-omni-command-center-analyze/references/api-notes.md +54 -0
  231. package/skills/service-omni-command-center-analyze/scripts/analyze.sh +198 -0
  232. package/skills/service-omni-command-center-analyze/scripts/tests/_bootstrap.py +115 -0
  233. package/skills/service-omni-command-center-analyze/scripts/tests/test_command_center_analyze_contracts.py +165 -0
  234. package/skills/service-omni-permission-set-assign/SKILL.md +88 -0
  235. package/skills/service-omni-permission-set-assign/assets/package.xml +8 -0
  236. package/skills/service-omni-permission-set-assign/references/api-notes.md +143 -0
  237. package/skills/service-omni-permission-set-assign/scripts/verify-and-assign.sh +397 -0
  238. package/skills/service-omni-presence-status-deploy/SKILL.md +87 -0
  239. package/skills/service-omni-presence-status-deploy/assets/package.xml +12 -0
  240. package/skills/service-omni-presence-status-deploy/references/api-notes.md +115 -0
  241. package/skills/service-omni-presence-status-deploy/scripts/deploy-and-report.sh +422 -0
  242. package/skills/service-omni-presence-user-config-deploy/SKILL.md +80 -0
  243. package/skills/service-omni-presence-user-config-deploy/references/api-notes.md +60 -0
  244. package/skills/service-omni-presence-user-config-deploy/scripts/deploy-and-report.sh +261 -0
  245. package/skills/service-omni-presence-user-config-deploy/scripts/tests/_bootstrap.py +106 -0
  246. package/skills/service-omni-presence-user-config-deploy/scripts/tests/test_presence_user_config_contracts.py +142 -0
  247. package/skills/service-omni-queue-deploy/SKILL.md +91 -0
  248. package/skills/service-omni-queue-deploy/references/api-notes.md +140 -0
  249. package/skills/service-omni-queue-deploy/scripts/verify-and-align.sh +470 -0
  250. package/skills/service-omni-queue-members-assign/SKILL.md +93 -0
  251. package/skills/service-omni-queue-members-assign/references/api-notes.md +144 -0
  252. package/skills/service-omni-queue-members-assign/scripts/tests/_bootstrap.py +67 -0
  253. package/skills/service-omni-queue-members-assign/scripts/tests/test_queue_members_contracts.py +73 -0
  254. package/skills/service-omni-queue-members-assign/scripts/verify-and-bind.sh +362 -0
  255. package/skills/service-omni-queue-routing-config-deploy/SKILL.md +101 -0
  256. package/skills/service-omni-queue-routing-config-deploy/references/api-notes.md +127 -0
  257. package/skills/service-omni-queue-routing-config-deploy/scripts/tests/_bootstrap.py +90 -0
  258. package/skills/service-omni-queue-routing-config-deploy/scripts/tests/test_queue_routing_config_contracts.py +70 -0
  259. package/skills/service-omni-queue-routing-config-deploy/scripts/upsert-and-report.sh +538 -0
  260. package/skills/service-omni-routing-flow-deploy/SKILL.md +111 -0
  261. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Case_Trigger.SkillsBased.flow-meta.xml +94 -0
  262. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Case_Trigger.flow-meta.xml +88 -0
  263. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Cases.flow-meta.xml +144 -0
  264. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCall_Trigger.SkillsBased.flow-meta.xml +94 -0
  265. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCall_Trigger.flow-meta.xml +88 -0
  266. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCalls.flow-meta.xml +144 -0
  267. package/skills/service-omni-routing-flow-deploy/assets/package.xml +11 -0
  268. package/skills/service-omni-routing-flow-deploy/assets/sfdx-project.json +11 -0
  269. package/skills/service-omni-routing-flow-deploy/references/api-notes.md +265 -0
  270. package/skills/service-omni-routing-flow-deploy/scripts/deploy-and-report.sh +684 -0
  271. package/skills/service-omni-service-channel-configure/SKILL.md +83 -0
  272. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/Cases.serviceChannel-meta.xml +9 -0
  273. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/Incidents.serviceChannel-meta.xml +9 -0
  274. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/MessagingSessions.serviceChannel-meta.xml +9 -0
  275. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/VoiceCalls.serviceChannel-meta.xml +9 -0
  276. package/skills/service-omni-service-channel-configure/assets/package.xml +11 -0
  277. package/skills/service-omni-service-channel-configure/assets/sfdx-project.json +12 -0
  278. package/skills/service-omni-service-channel-configure/references/api-notes.md +84 -0
  279. package/skills/service-omni-service-channel-configure/scripts/deploy-and-report.sh +383 -0
  280. package/skills/service-omni-sidebar-configure/SKILL.md +77 -0
  281. package/skills/service-omni-sidebar-configure/references/api-notes.md +51 -0
  282. package/skills/service-omni-sidebar-configure/scripts/enable-and-report.sh +315 -0
  283. package/skills/service-omni-sidebar-configure/scripts/tests/_bootstrap.py +142 -0
  284. package/skills/service-omni-sidebar-configure/scripts/tests/test_sidebar_contracts.py +139 -0
  285. package/skills/service-omni-skills-based-routing-configure/SKILL.md +81 -0
  286. package/skills/service-omni-skills-based-routing-configure/references/api-notes.md +50 -0
  287. package/skills/service-omni-skills-based-routing-configure/scripts/configure-and-report.sh +270 -0
  288. package/skills/service-omni-skills-based-routing-configure/scripts/tests/_bootstrap.py +120 -0
  289. package/skills/service-omni-skills-based-routing-configure/scripts/tests/test_sbr_contracts.py +129 -0
  290. package/skills/service-omni-supervisor-config-deploy/SKILL.md +97 -0
  291. package/skills/service-omni-supervisor-config-deploy/assets/force-app/main/default/omniSupervisorConfigs/Omni_Supervisor.omniSupervisorConfig-meta.xml +9 -0
  292. package/skills/service-omni-supervisor-config-deploy/assets/package.xml +8 -0
  293. package/skills/service-omni-supervisor-config-deploy/assets/sfdx-project.json +12 -0
  294. package/skills/service-omni-supervisor-config-deploy/references/api-notes.md +205 -0
  295. package/skills/service-omni-supervisor-config-deploy/scripts/deploy-and-report.sh +586 -0
  296. package/skills/service-omni-supervisor-config-deploy/scripts/tests/_bootstrap.py +153 -0
  297. package/skills/service-omni-supervisor-config-deploy/scripts/tests/test_supervisor_config_contracts.py +116 -0
  298. package/skills/service-omni-supervisor-permset-assign/SKILL.md +88 -0
  299. package/skills/service-omni-supervisor-permset-assign/references/api-notes.md +48 -0
  300. package/skills/service-omni-supervisor-permset-assign/scripts/verify-and-assign.sh +316 -0
  301. package/skills/service-omni-supervisor-surface-deploy/SKILL.md +85 -0
  302. package/skills/service-omni-supervisor-surface-deploy/references/api-notes.md +47 -0
  303. package/skills/service-omni-supervisor-surface-deploy/scripts/deploy-and-report.sh +216 -0
  304. package/skills/service-omni-supervisor-surface-deploy/scripts/tests/_bootstrap.py +95 -0
  305. package/skills/service-omni-supervisor-surface-deploy/scripts/tests/test_supervisor_surface_contracts.py +154 -0
  306. package/skills/service-omni-supervisor-users-create/SKILL.md +92 -0
  307. package/skills/service-omni-supervisor-users-create/assets/create-supervisors.apex.template +72 -0
  308. package/skills/service-omni-supervisor-users-create/references/apex-patterns.md +73 -0
  309. package/skills/service-omni-supervisor-users-create/references/apex-template-notes.md +41 -0
  310. package/skills/service-omni-supervisor-users-create/scripts/detect-and-create.sh +197 -0
  311. package/skills/service-omni-supervisor-users-create/scripts/detect-existing.sh +112 -0
  312. package/skills/service-omni-supervisor-users-create/scripts/run-create.sh +296 -0
  313. package/skills/service-omni-work-skill-routing-configure/SKILL.md +80 -0
  314. package/skills/service-omni-work-skill-routing-configure/references/api-notes.md +67 -0
  315. package/skills/service-omni-work-skill-routing-configure/scripts/configure-and-report.sh +262 -0
  316. package/skills/service-omni-work-skill-routing-configure/scripts/tests/_bootstrap.py +121 -0
  317. package/skills/service-omni-work-skill-routing-configure/scripts/tests/test_work_skill_routing_contracts.py +161 -0
@@ -0,0 +1,196 @@
1
+ # Visit Creation — Execution State & Recovery
2
+
3
+ Operational reference for Stage 5 (Visit Creation): the creation-state model to track throughout the run, the smoke-test-failure recovery protocol, the auto-diagnosis error table, and the gotchas table. Read this alongside the workflow in `SKILL.md`.
4
+
5
+ ---
6
+
7
+ ## State Tracking
8
+
9
+ Maintain a creation state throughout the workflow for smoke-test-failure recovery:
10
+
11
+ ```text
12
+ State = {
13
+ targetOrg: string,
14
+ repUsername: string,
15
+ repOrgAlias: string,
16
+ steps: [
17
+ { order: 1, name: "LoginAsSalesRep", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
18
+ { order: 2, name: "Account", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
19
+ { order: 3, name: "HealthcareProvider", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
20
+ { order: 4, name: "ContactPointAddress", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
21
+ { order: 5, name: "ObjectTerritory2Association", ownedBy: "admin", status: "pending|done|failed", recordId?: string },
22
+ { order: 6, name: "ProviderAcctTerritoryInfo", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
23
+ { order: 7, name: "Product2", ownedBy: "admin", status: "pending|done|failed", recordId?: string },
24
+ { order: 8, name: "LifeSciMarketableProduct", ownedBy: "admin", status: "pending|done|failed", recordId?: string },
25
+ { order: 9, name: "ProductTerritoryAvailability", ownedBy: "admin", status: "pending|done|failed", recordId?: string },
26
+ { order: 10, name: "Visit", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
27
+ { order: 11, name: "ProviderVisit", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
28
+ { order: 12, name: "ProviderVisitProdDetailing", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
29
+ { order: 13, name: "ProviderVisitProdDiscussion", ownedBy: "rep", status: "pending|done|failed", recordId?: string },
30
+ { order: 14, name: "MetadataRecordsSetup", ownedBy: "admin", status: "pending|done|failed", parentId?: string, childId?: string },
31
+ { order: 15, name: "GenerateMetadataCache", ownedBy: "admin", status: "pending|done|failed", enqueued?: boolean },
32
+ { order: 16, name: "MobileAppVisitValidation", ownedBy: "rep (manual, iPad)", status: "pending|confirmed|issue" }
33
+ ]
34
+ }
35
+ ```
36
+
37
+ ---
38
+
39
+ ## Smoke-Test-Failure Recovery
40
+
41
+ If any step fails, immediately perform auto-diagnosis and display:
42
+
43
+ ```text
44
+ Step <N>/16 FAILED: <StepName>
45
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
46
+
47
+ What happened:
48
+ <Exact error message from the CLI response>
49
+
50
+ Why:
51
+ <Interpretation — e.g. "The record type does not exist in the target org",
52
+ "The field name is invalid for this API version", "Insufficient access">
53
+
54
+ Possible causes:
55
+ 1. <Cause 1 — e.g. "Health_Care_Provider RecordType not deployed">
56
+ 2. <Cause 2 — e.g. "Sales rep user lacks object-level Create permission">
57
+ 3. <Cause 3 — e.g. "Required field missing or null">
58
+
59
+ What I can do:
60
+ A. Retry this step (if transient error)
61
+ B. Skip this step and continue (if non-blocking)
62
+ C. Attempt auto-fix: <describe specific fix if possible>
63
+ D. Stop and report partial status
64
+
65
+ Partial-success status:
66
+ Completed: <N-1>/<16> steps
67
+ Failed at: Step <N> (<StepName>)
68
+ Records created so far:
69
+ [done] <list of successfully created records with IDs>
70
+ [failed] <failed step>
71
+ [pending] <remaining pending steps>
72
+ ```
73
+
74
+ **Wait for user choice before continuing.** Do NOT silently skip failed steps.
75
+
76
+ ### Auto-diagnosis logic
77
+
78
+ | Error pattern | Diagnosis | Auto-fix |
79
+ |---|---|---|
80
+ | `INVALID_TYPE` or `sObject type not supported` | Object not available in org | None — tell user to verify LSC packages are installed |
81
+ | `INVALID_FIELD` | Field does not exist on this object | Check API version; try without the offending field |
82
+ | `REQUIRED_FIELD_MISSING` | A required field was not provided | Add the missing field with a sensible default and retry |
83
+ | `INSUFFICIENT_ACCESS_OR_READONLY` | User lacks permission | Check if using correct target-org (rep vs admin) |
84
+ | `DUPLICATE_VALUE` | Record already exists | Query existing record and reuse its ID; continue |
85
+ | `FIELD_INTEGRITY_EXCEPTION` | FK reference invalid (ID doesn't exist) | Re-query the parent record; if not found, report dependency failure |
86
+ | `UNABLE_TO_LOCK_ROW` | Concurrent lock conflict | Wait 5 seconds and retry (up to 3 times) |
87
+ | `NOT_FOUND` or `Session expired` | Auth issue | Re-authenticate and retry |
88
+ | `STRING_TOO_LONG` | Field value exceeds max length | Truncate and retry |
89
+ | `...parentMetadataRecordId parameter isn't ValidationCompleted` (Step 15) | Parent record Status not set | Set the **parent** record's Status to `ValidationCompleted` (the API requires the parent, not just the child), then retry |
90
+ | `JSON_PARSER_ERROR: Unrecognized field "generateStandardTranslations"` (Step 15) | Body has an unsupported field | Remove it — body accepts only `parentMetadataRecordId`, `apiVersion`, and `prefix` |
91
+ | `INVALID_AUTH_HEADER` (401) from Connect API (Step 15) | Used raw `curl` | Use `sf api request rest` — it builds the auth header correctly |
92
+ | HTTP 400/404 from Connect API (Step 15) | Invalid parentMetadataRecordId or endpoint unavailable | Re-query parent status; verify API version v65.0+ and LSC packages |
93
+
94
+ ---
95
+
96
+ ## Gotchas
97
+
98
+ | Issue | Resolution |
99
+ |-------|------------|
100
+ | `sf org login web` opens browser but user can't access | Provide the instance URL from the admin org display; user may need to paste password manually |
101
+ | Account RecordType `Health_Care_Provider` not found | Query all Account RecordTypes and try `HealthCareProvider` (without underscore) or `Health_Care_Provider` |
102
+ | HealthcareProvider object not available | LSC packages not installed — direct user to `life-sciences-prerequisites-validate` |
103
+ | Territory query returns no results | Territory model may not be Active — direct user to `life-sciences-territory-configure` |
104
+ | `FIELD_INTEGRITY_EXCEPTION` on PlaceId in Visit | ContactPointAddress must be linked to the same Account; verify ParentId matches |
105
+ | `INSUFFICIENT_ACCESS` creating ObjectTerritory2Association | This object may require admin access — if rep fails, create this specific record as admin and document the exception |
106
+ | Account active flag | Use the standard `IsActive` (boolean), NOT `IsActive__c`. If the rep lacks FLS to it, omit and set as admin |
107
+ | `Unable to create/update fields: NationalProviderIdentifier` on HealthcareProvider | FLS — rep lacks access. Omit NPI and IsSpeaker (not needed for visit); admin can set later |
108
+ | `entity type cannot be inserted: Object Territory Association` (Step 5) | Rep lacks "Manage Territories"; create as admin (or skip — nothing downstream needs it) |
109
+ | `No such column 'ProductCode' on Product2` (Steps 7–8) | Rep has no create permission on product master data. Create Steps 7–9 as admin |
110
+ | Date format rejected | Use ISO 8601: `YYYY-MM-DDTHH:MM:SS.000+0000` for datetime, `YYYY-MM-DD` for date |
111
+ | `LifeSciMobileMetadataRecord` not found (Step 14) | LSC packages not installed or API version < 65.0 |
112
+ | `Profile 'LSC Custom Profile' not found` (Step 14) | Run Stage 2 (Starter Config Deploy) first — the child record needs the profile Id |
113
+ | Connect API errors (Step 15: `...isn't ValidationCompleted`, `INVALID_AUTH_HEADER`, `JSON_PARSER_ERROR`, HTTP 400/404) | See the auto-diagnosis table above for causes and fixes |
114
+ | `parse err: Expecting value` / `Unexpected token` when piping `--json` into `jq`/`python` | The command redirected stderr into stdout (`2>&1`) before the parser, so a CLI warning/deprecation notice contaminated the JSON. **Never pipe `sf ... --json 2>&1` into a parser.** Let stderr go to the terminal (drop `2>&1`), or discard it with `2>/dev/null`, so only clean JSON reaches the parser. This is a harness artifact, not an org error — the query itself succeeded; just re-run without merging stderr. |
115
+ | `INVALID_FIELD` querying `Visit` (e.g. `Subject`) | Don't guess field names. `Visit`'s label field is `Name` (auto-number, e.g. `00000001`), not `Subject`. To confirm the Visit, query `SELECT Id, Name FROM Visit WHERE Id='<visitId>'`. If unsure which fields exist, run `sf sobject describe --sobject Visit --target-org <org>` rather than guessing. |
116
+ | Records never leave their status (LastModifiedDate unchanged) | Async job didn't run — wait 30s and re-query; check Setup → Apex Jobs if still stuck |
117
+ | Records go to `Inactive` instead of `Active` (Step 15) | Generation ran but produced no cache — this is a failure. Check `IntegrationErrorMessage` and Setup → Apex Jobs for the cause |
118
+
119
+ ---
120
+
121
+ ## Phase 7 — Summary output template
122
+
123
+ After all records are created, display this block (substituting the actual IDs and values from the run):
124
+
125
+ ```text
126
+ ============================================================
127
+ Life Sciences Visit Creation — Complete
128
+ ============================================================
129
+
130
+ ACCOUNT DETAILS
131
+ ───────────────────────────────────────────────────────────
132
+ Account Name: Dr. Aaron Morita
133
+ Record Type: Health_Care_Provider
134
+ Account ID: <accountId>
135
+ Provider Name: Aaron Morita HP
136
+ Provider Type: Medical Doctor
137
+ Address: 415 Mission St, San Francisco, CA 94105
138
+ Territory: <territoryName>
139
+
140
+ VISIT DETAILS
141
+ ───────────────────────────────────────────────────────────
142
+ Visit ID: <visitId>
143
+ Status: Planned
144
+ Start Time: <PlannedVisitStartTime>
145
+ Account: Dr. Aaron Morita
146
+ Place: 415 Mission St
147
+ Territory: <territoryName>
148
+ Provider Visit: <providerVisitId>
149
+ Product Detailed: Immunexis 5mg
150
+ Discussion Note: Discussed Oncology treatments and patient care approaches
151
+
152
+ RECORD CREATION SUMMARY
153
+ ───────────────────────────────────────────────────────────
154
+ [done] Step 1/16: Login as Sales Rep (rep) — done
155
+ [done] Step 2/16: Account (rep) — <accountId>
156
+ [done] Step 3/16: HealthcareProvider (rep) — <hcpId>
157
+ [done] Step 4/16: ContactPointAddress (rep) — <cpaId>
158
+ [done] Step 5/16: ObjectTerritory2Association (admin) — <otaId>
159
+ [done] Step 6/16: ProviderAcctTerritoryInfo (rep) — <patiId>
160
+ [done] Step 7/16: Product2 (admin) — <productId>
161
+ [done] Step 8/16: LifeSciMarketableProduct (admin) — <lmpId>
162
+ [done] Step 9/16: ProductTerritoryAvailability (admin) — <ptaId>
163
+ [done] Step 10/16: Visit (rep) — <visitId>
164
+ [done] Step 11/16: ProviderVisit (rep) — <pvId>
165
+ [done] Step 12/16: ProviderVisitProdDetailing (rep) — <pvpdId>
166
+ [done] Step 13/16: ProviderVisitProdDiscussion (rep) — <pvpDiscId>
167
+ [done] Step 14/16: MetadataRecordsSetup (admin) — parent: <parentId> (ValidationCompleted), child: <childId> (ValidationCompleted)
168
+ [done] Step 15/16: GenerateMetadataCache (admin) — enqueued
169
+ [done] Step 16/16: MobileAppVisitValidation (rep) — confirmed on iPad ('00000001' / Dr. Aaron Morita)
170
+
171
+ Created as user: <repUsername>
172
+ Visit confirmed on the iPad app — LSC setup in this org is complete.
173
+ ============================================================
174
+ ```
175
+
176
+ > **Keep the summary to the block above.** Do NOT append notes that describe the underlying data, its shape (row/record counts, hierarchy levels), specific product/record names or IDs, or commentary comparing the source data to the skill's examples. End at the summary; no "worth noting for future runs" addendum.
177
+
178
+ ---
179
+
180
+ ## Rules / Constraints
181
+
182
+ | Constraint | Rationale |
183
+ |-----------|-----------|
184
+ | **Require `.lsc-starter-config/LSStarterConfig/` to already be present in the CWD; do NOT download or delete it** | The shared folder's download/cleanup is owned by the coordinator (`life-sciences-fieldsalesrep-coordinate`) — one download at start, one delete at end |
185
+ | **Read the `.lsc-starter-config/LSStarterConfig/Data/` CSV for each object and use ONLY its values** — read at execution time, one record per row; never hardcode field values from this stage or reuse values from a prior run | The CSVs are the single source of truth and may change between runs; illustrative values in the steps can be stale |
186
+ | Create the **visit records** (Account, HealthcareProvider, ContactPointAddress, ProviderAcctTerritoryInfo, Visit, ProviderVisit, detailing, discussion) as the Sales Rep | Visit ownership must be the field rep for realistic field sales workflows |
187
+ | Create **territory associations (Step 5), product master data (Steps 7–9), and metadata cache (Steps 14–15) as the admin** | The LSC Custom Profile has no create permission on ObjectTerritory2Association, Product2, or LifeSciMarketableProduct; metadata cache records are admin-managed |
188
+ | Ask for rep credentials — never assume | Security; credentials vary per org |
189
+ | Use `--target-org lsc-rep` for the rep-owned steps (2, 3, 4, 6, 10–13); use `--target-org <admin>` for the admin-owned steps (5, 7, 8, 9, 14–15) | Ensures correct ownership and the right access level for each object |
190
+ | PlannedVisitStartTime must be NOW (current time) | Requirement: visit should reflect current scheduling |
191
+ | Create records in exact order 2→15, then run the manual iPad validation (Step 16) last | Later records reference earlier IDs (Account→Visit→ProviderVisit); the metadata cache (14–15) must exist before the app can sync the Visit |
192
+ | Step 16 (iPad validation) is **manual** — show the rep credentials (ask for the password if unknown; never use admin creds), give the instructions, and never claim it is done without the user's explicit "yes" | It requires a human with a physical iPad or simulator, logged in as the rep; the skill cannot verify app visibility programmatically |
193
+ | Treat a "yes" on the Step 16 prompt as the end of the LSC setup; on a reported issue, run the troubleshooting checks (territory assignment, ProviderAcctTerritoryInfo, metadata cache freshness) before re-asking | Confirms the end-to-end setup actually works on the device the rep uses |
194
+ | Product2 must NOT have a RecordType | Explicit requirement — no record type for Product2 |
195
+ | Show diagnosis on every failure | User needs to understand what went wrong without investigating CLI output |
196
+ | Wait for user decision on failure — no silent skips | User controls recovery path |
@@ -0,0 +1,155 @@
1
+ # Metadata Cache Generation Reference
2
+
3
+ Detailed commands for Steps 14–15 of the visit creation workflow.
4
+
5
+ > **No permission set required.** The generate Connect API bypasses metadata
6
+ > validation itself, so the previously-documented `SkipMetadataValidation`
7
+ > permission set (`PermissionsSkipVldBefMetadataGeneration` /
8
+ > `PermissionsGenerateLifeSciencesMetadata`) is NOT needed. Verified empirically:
9
+ > generation enqueues and the async job runs with no such permission set assigned.
10
+
11
+ > **Parent-link field:** the parent-link field on `LifeSciMobileMetadataRecord` is
12
+ > `ParentMobileMetadataRecId` (used below). If you need to confirm the schema on your
13
+ > org, describe the object:
14
+ >
15
+ > ```bash
16
+ > sf sobject describe --sobject LifeSciMobileMetadataRecord --target-org <admin> --json \
17
+ > | grep -o '"name":"[^"]*"'
18
+ > ```
19
+
20
+ ## Step 14: Create LifeSciMobileMetadataRecord Prerequisite
21
+
22
+ Create a **parent** record and a **child** record linked to the LSC Custom Profile.
23
+ Set **both** records to `ValidationCompleted` — the generate API in Step 15 rejects the
24
+ call unless the **parent** record's `Status` is `ValidationCompleted` (not just the
25
+ child's). The generate API is called with the **parent** record ID.
26
+
27
+ Run as admin (`--target-org <admin>`):
28
+
29
+ ```bash
30
+ sf apex run --target-org <admin> --json <<'EOF'
31
+ // Create parent record.
32
+ LifeSciMobileMetadataRecord parent = new LifeSciMobileMetadataRecord(
33
+ IntegrationStatus = 'New',
34
+ Status = 'New'
35
+ );
36
+ insert parent;
37
+
38
+ // Create child record for the LSC Custom Profile.
39
+ Profile pf = [SELECT Id FROM Profile WHERE Name = 'LSC Custom Profile'];
40
+ LifeSciMobileMetadataRecord child = new LifeSciMobileMetadataRecord(
41
+ ParentMobileMetadataRecId = parent.Id,
42
+ ProfileId = pf.Id,
43
+ IntegrationStatus = 'New',
44
+ Status = 'New'
45
+ );
46
+ insert child;
47
+
48
+ // Set BOTH parent and child to ValidationCompleted (the API requires the parent).
49
+ child.Status = 'ValidationCompleted';
50
+ update child;
51
+ parent.Status = 'ValidationCompleted';
52
+ update parent;
53
+
54
+ System.debug('Parent Id: ' + parent.Id);
55
+ System.debug('Child Id: ' + child.Id);
56
+ EOF
57
+ ```
58
+
59
+ Extract the **parent record ID** from the debug log output — it is required as the `parentMetadataRecordId` in Step 15.
60
+
61
+ ---
62
+
63
+ ## Step 15: Call the Metadata Generate Connect API
64
+
65
+ Use the CLI's own authenticated REST client (`sf api request rest`) — it builds the
66
+ `Authorization` header correctly. A hand-rolled `curl` with the token from
67
+ `sf org display` fails with `INVALID_AUTH_HEADER` (401), even though the same token
68
+ works for CLI data queries — do NOT use raw curl for this endpoint.
69
+
70
+ ### Build the request body
71
+
72
+ The body accepts `parentMetadataRecordId`, `apiVersion`, and `prefix`. Use `apiVersion`
73
+ `65.0` (verified working). Do NOT include `generateStandardTranslations` — the endpoint
74
+ rejects it with `JSON_PARSER_ERROR: Unrecognized field "generateStandardTranslations"`.
75
+
76
+ Write the body to a **project-local** relative file (never `/tmp` or any path outside the project); remove it after the call below:
77
+
78
+ ```bash
79
+ cat > .lsc-mdgen-body.json <<'EOF'
80
+ {
81
+ "parentMetadataRecordId": "<parentRecordId>",
82
+ "apiVersion": "65.0",
83
+ "prefix": "lsc4ce"
84
+ }
85
+ EOF
86
+ ```
87
+
88
+ ### Call the endpoint
89
+
90
+ Match the endpoint's `vXX.0` to the `apiVersion` in the body. Pass the body file with a
91
+ leading `@` (a bare path is sent as a literal string and triggers `JSON_PARSER_ERROR`):
92
+
93
+ ```bash
94
+ sf api request rest \
95
+ "/services/data/v65.0/connect/life-sciences/commercial/metadata/actions/generate" \
96
+ --method POST \
97
+ --body @.lsc-mdgen-body.json \
98
+ --target-org <admin>
99
+ rm -f .lsc-mdgen-body.json
100
+ ```
101
+
102
+ ### Expected response
103
+
104
+ Success is a JSON message (HTTP 200), not 202:
105
+
106
+ ```json
107
+ { "message": "Task enqueued for metadata cache generation." }
108
+ ```
109
+
110
+ Generation then runs asynchronously.
111
+
112
+ ### Verify completion
113
+
114
+ Query both the parent and its child records (use your org's parent-link field name):
115
+
116
+ ```bash
117
+ sf data query --query "SELECT Id, Status, IntegrationStatus, IntegrationErrorMessage, MetadataDocumentId, LastModifiedDate FROM LifeSciMobileMetadataRecord WHERE Id='<parentRecordId>' OR ParentMobileMetadataRecId='<parentRecordId>'" --target-org <admin> --json
118
+ ```
119
+
120
+ The records move through intermediate states (`New → InProgress → Loading → Processing`)
121
+ and then transition to `Status='Active'`. **`Active` is the success state** — it means the
122
+ cache was generated; the child record's `MetadataDocumentId` is populated with the generated
123
+ document Id. The enqueue message only confirms the task was accepted; keep polling the query
124
+ above until `Status='Active'` before treating generation as complete.
125
+
126
+ > **How to report progress while polling.** The async job can take several minutes; that is
127
+ > normal. As long as the records are advancing through the intermediate states, simply tell
128
+ > the user the generation **is progressing and you are polling for it to become `Active`** —
129
+ > then poll again. Do NOT frame it as a timeout, a missed deadline, or "it didn't complete
130
+ > within the N-minute window" — there is no fixed window, and that phrasing wrongly implies
131
+ > something is wrong when the job is running normally. Only surface a problem if the records
132
+ > go to `Inactive` or stop advancing entirely (see below).
133
+
134
+ A transition to `Inactive` (or a record that stays unchanged with an unchanged
135
+ `LastModifiedDate`) is **not** success — the async job ran but produced no cache, or
136
+ never ran. Check Setup → Apex Jobs for the failed generation job and its error, and
137
+ inspect the record's `IntegrationStatus` / `IntegrationErrorMessage` fields for detail.
138
+
139
+ ---
140
+
141
+ ## Error handling
142
+
143
+ | Error | Resolution |
144
+ |-------|------------|
145
+ | `LifeSciMobileMetadataRecord` sObject not found | LSC packages not installed or API < v65.0 |
146
+ | `Field does not exist: ParentMobileMetadataRecId` (or similar) on compile | Describe the object to confirm the parent-link field name on your org and use the reported name |
147
+ | `INVALID_AUTH_HEADER` (401) from Connect API | You used raw `curl` — switch to `sf api request rest`, which builds the auth header correctly |
148
+ | `JSON_PARSER_ERROR: Unrecognized field "generateStandardTranslations"` | Remove that field from the body — only `parentMetadataRecordId`, `apiVersion`, and `prefix` are accepted |
149
+ | `JSON_PARSER_ERROR: Unexpected character ('/')` | `--body` got a literal path — prefix the file with `@` (`--body @.lsc-mdgen-body.json`) |
150
+ | `Profile 'LSC Custom Profile' not found` | Run Stage 2 (Starter Config Deploy) first — the child record needs the profile Id |
151
+ | `...isn't ValidationCompleted` from Connect API | Set the **parent** record's `Status` to `ValidationCompleted` (the API requires the parent, not just the child), then retry |
152
+ | HTTP 400 from Connect API | Check: parentMetadataRecordId valid, parent Status='ValidationCompleted', prefix='lsc4ce' |
153
+ | HTTP 404 from Connect API | Endpoint not available — verify API version v65.0+ and LSC packages |
154
+ | Records never leave their status (LastModifiedDate unchanged) | Async job didn't run — wait 30s; check Setup → Apex Jobs for failures |
155
+ | Records go to `Inactive` instead of `Active` | Generation ran but produced no cache — this is a failure, not success. Check Setup → Apex Jobs and the record's `IntegrationErrorMessage` for the cause |