@salesforce/afv-skills 1.55.0 → 1.57.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 (274) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-generate/SKILL.md +8 -0
  3. package/skills/agentforce-generate/references/actions-reference.md +2 -2
  4. package/skills/agentforce-generate/references/voice-modality-reference.md +51 -15
  5. package/skills/agentforce-generate/references/voice-telephony-cli.md +193 -0
  6. package/skills/agentforce-observe/SKILL.md +13 -9
  7. package/skills/agentforce-observe/references/ahm-alerts.md +193 -14
  8. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +24 -15
  9. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +11 -0
  10. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
  11. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +32 -1
  12. package/skills/automation-sandbox-post-copy-configure/SKILL.md +75 -71
  13. package/skills/automation-sandbox-post-copy-configure/assets/scheduled_apex_template.apex +13 -0
  14. package/skills/automation-sandbox-post-copy-configure/examples/sample_scheduled_apex_config.json +13 -0
  15. package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +155 -0
  16. package/skills/automation-sandbox-post-copy-configure/scripts/build-scheduled-apex.mjs +62 -0
  17. package/skills/automation-sandbox-post-copy-configure/scripts/soql-escape-job-name.mjs +28 -0
  18. package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +1 -1
  19. package/skills/commerce-b2b-open-code-components-replace/SKILL.md +16 -16
  20. package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +383 -0
  21. package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +324 -0
  22. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +63 -0
  23. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +100 -0
  24. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -0
  25. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +46 -0
  26. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/04-deploy-engine.js +198 -0
  27. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/05-deploy-tpm-accruals.js +231 -0
  28. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +82 -0
  29. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +517 -0
  30. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +416 -0
  31. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -0
  32. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +514 -0
  33. package/skills/consumer-goods-sync-management-configure/SKILL.md +137 -0
  34. package/skills/consumer-goods-sync-management-configure/examples/scenarios.md +294 -0
  35. package/skills/consumer-goods-sync-management-configure/references/act1-setup-sync.md +333 -0
  36. package/skills/consumer-goods-sync-management-configure/references/act2-assign-users.md +324 -0
  37. package/skills/consumer-goods-sync-management-configure/references/act3-plan-verify.md +113 -0
  38. package/skills/consumer-goods-sync-management-configure/references/readiness-and-enablement.md +164 -0
  39. package/skills/consumer-goods-sync-management-configure/references/sync-management-app-install-backbone.md +159 -0
  40. package/skills/consumer-goods-sync-management-configure/references/transports-and-namespace.md +220 -0
  41. package/skills/consumer-goods-sync-management-configure/references/verify-and-smoke.md +175 -0
  42. package/skills/dx-devops-project-manage/SKILL.md +1 -1
  43. package/skills/dx-org-analyze/SKILL.md +0 -1
  44. package/skills/dx-org-analyze/scripts/collect_org_data.py +2 -2
  45. package/skills/dx-org-analyze/scripts/compute_diff.py +2 -4
  46. package/skills/dx-org-analyze/scripts/introspect_org.py +4 -40
  47. package/skills/dx-org-manage/SKILL.md +6 -50
  48. package/skills/dx-org-manage/examples/README.md +10 -16
  49. package/skills/dx-org-manage/references/scratch-org-create.md +1 -1
  50. package/skills/dx-org-manage/references/scratch-org-operations.md +1 -1
  51. package/skills/dx-org-shape-manage/SKILL.md +4 -3
  52. package/skills/education-cloud-domain-configure/references/gotchas-extended.md +1 -0
  53. package/skills/experience-accessibility-validate/SKILL.md +8 -5
  54. package/skills/experience-accessibility-validate/references/reviewers/sc-1-1-1-non-text-content.md +1 -4
  55. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-i-lists.md +0 -4
  56. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-ii-tables.md +20 -85
  57. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iii-form-labels.md +4 -4
  58. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iv-regions.md +0 -4
  59. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-v-groups.md +2 -4
  60. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-5-identify-input.md +0 -4
  61. package/skills/experience-accessibility-validate/references/reviewers/sc-1-4-3-contrast.md +4 -14
  62. package/skills/experience-accessibility-validate/references/reviewers/sc-2-1-1-keyboard.md +9 -5
  63. package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-4-link-purpose.md +1 -4
  64. package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-6-headings-labels.md +0 -4
  65. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -4
  66. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -4
  67. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-3-label-in-name.md +0 -4
  68. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-7-dragging-movement.md +0 -4
  69. package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-1-on-focus.md +0 -4
  70. package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-2-on-input.md +1 -4
  71. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-1-error-identification.md +1 -4
  72. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-2-labels-instructions.md +1 -4
  73. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-3-error-suggestion.md +1 -4
  74. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-i-name.md +4 -5
  75. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-ii-role.md +1 -4
  76. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-iii-value.md +0 -4
  77. package/skills/experience-cms-content-generate/SKILL.md +1 -1
  78. package/skills/experience-cms-content-render/SKILL.md +3 -3
  79. package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +35 -7
  80. package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +13 -4
  81. package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +30 -8
  82. package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +14 -4
  83. package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +11 -1
  84. package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +1 -1
  85. package/skills/experience-cms-content-render/assets/shared/mediaLabels.ts +62 -0
  86. package/skills/experience-cms-content-render/references/init-scaffold.md +13 -6
  87. package/skills/experience-content-media-stock-image-search/SKILL.md +0 -1
  88. package/skills/experience-lwc-accessibility-jest-run/SKILL.md +104 -25
  89. package/skills/experience-lwc-accessibility-jest-run/assets/jest.config.js +4 -0
  90. package/skills/experience-lwc-accessibility-jest-run/assets/sa11y-jest-setup.js +5 -0
  91. package/skills/experience-lwc-design-generate/SKILL.md +1 -1
  92. package/skills/experience-lwc-legacy-migrate/SKILL.md +212 -0
  93. package/skills/experience-lwc-legacy-migrate/assets/lo20-host-page-template.html +192 -0
  94. package/skills/experience-lwc-legacy-migrate/references/aura-to-lwc-completeness-checklist.md +188 -0
  95. package/skills/experience-lwc-legacy-migrate/references/lightning-out-2-system-reference.md +495 -0
  96. package/skills/experience-lwc-legacy-migrate/references/lightning-out-beta-to-2-migration.md +824 -0
  97. package/skills/experience-lwc-legacy-migrate/scripts/convert-lo-names.py +94 -0
  98. package/skills/experience-lwc-legacy-migrate/scripts/validate-lo20-page.py +133 -0
  99. package/skills/experience-ui-bundle-app-coordinate/SKILL.md +5 -5
  100. package/skills/experience-ui-bundle-features-generate/SKILL.md +65 -36
  101. package/skills/experience-ui-bundle-features-generate/references/angular/features.md +74 -0
  102. package/skills/experience-ui-bundle-features-generate/references/react/features.md +59 -0
  103. package/skills/experience-ui-bundle-features-generate/scripts/detect-framework.sh +73 -0
  104. package/skills/experience-ui-bundle-frontend-generate/SKILL.md +2 -2
  105. package/skills/experience-ui-bundle-metadata-generate/SKILL.md +26 -14
  106. package/skills/experience-ui-bundle-metadata-generate/references/angular-metadata-generate.md +37 -0
  107. package/skills/experience-ui-bundle-metadata-generate/references/react-metadata-generate.md +32 -0
  108. package/skills/experience-ui-bundle-metadata-generate/scripts/detect-framework.sh +73 -0
  109. package/skills/experience-ui-bundle-metadata-generate/scripts/verify-bundle-location.sh +30 -8
  110. package/skills/experience-ui-bundle-project-generate/SKILL.md +1 -1
  111. package/skills/field-service-data-capture-migrate/SKILL.md +391 -0
  112. package/skills/field-service-data-capture-migrate/assets/sample-legacy-flow.flow-meta.xml +163 -0
  113. package/skills/field-service-data-capture-migrate/references/architecture-notes.md +40 -0
  114. package/skills/field-service-data-capture-migrate/references/component-mapping.md +278 -0
  115. package/skills/field-service-data-capture-migrate/references/converter-builder-contract.md +183 -0
  116. package/skills/field-service-data-capture-migrate/references/dc-platform-rules.md +130 -0
  117. package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +215 -0
  118. package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +36 -0
  119. package/skills/field-service-data-capture-migrate/references/migration-checklist.md +121 -0
  120. package/skills/field-service-data-capture-migrate/references/transformer-rules.md +132 -0
  121. package/skills/field-service-data-capture-migrate/scripts/analyze_flow.py +277 -0
  122. package/skills/field-service-data-capture-migrate/scripts/convert_to_dc_spec.py +1311 -0
  123. package/skills/field-service-data-capture-migrate/scripts/cud_analysis.py +402 -0
  124. package/skills/field-service-data-capture-migrate/scripts/deploy_flow.sh +230 -0
  125. package/skills/field-service-data-capture-migrate/scripts/discover_subflow_tree.py +230 -0
  126. package/skills/field-service-data-capture-migrate/scripts/flow_input.py +186 -0
  127. package/skills/field-service-data-capture-migrate/scripts/flow_xml_utils.py +39 -0
  128. package/skills/field-service-data-capture-migrate/scripts/fsm_dc_catalog.py +413 -0
  129. package/skills/field-service-data-capture-migrate/scripts/generate_summary.py +199 -0
  130. package/skills/field-service-data-capture-migrate/scripts/json_to_flow_xml.py +146 -0
  131. package/skills/field-service-data-capture-migrate/scripts/manual_review_flags.py +42 -0
  132. package/skills/field-service-data-capture-migrate/scripts/retrieve_flow_rest.sh +155 -0
  133. package/skills/field-service-data-capture-migrate/scripts/subflow_names.py +49 -0
  134. package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +1661 -0
  135. package/skills/field-service-data-capture-migrate/scripts/validate_flow.sh +147 -0
  136. package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +1258 -0
  137. package/skills/integration-connectivity-connected-app-configure/SKILL.md +5 -5
  138. package/skills/integration-connectivity-generate/SKILL.md +10 -10
  139. package/skills/integration-connectivity-generate/scripts/configure-named-credential.sh +2 -2
  140. package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +1 -1
  141. package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +1 -1
  142. package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +14 -1
  143. package/skills/mobile-apps-create/SKILL.md +1 -1
  144. package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/SKILL.md +7 -7
  145. package/skills/platform-apex-test-generate/SKILL.md +1 -1
  146. package/skills/platform-apex-test-run/SKILL.md +1 -1
  147. package/skills/platform-custom-field-generate/SKILL.md +1 -1
  148. package/skills/platform-custom-lightning-type-generate/SKILL.md +1 -1
  149. package/skills/platform-custom-metadata-type-generate/SKILL.md +1 -1
  150. package/skills/platform-custom-object-generate/SKILL.md +1 -1
  151. package/skills/platform-custom-report-type-generate/SKILL.md +1 -1
  152. package/skills/platform-custom-setting-generate/SKILL.md +1 -1
  153. package/skills/platform-data-and-tooling-api-context-get/SKILL.md +1 -1
  154. package/skills/platform-data-manage/SKILL.md +10 -10
  155. package/skills/platform-flexipage-generate/SKILL.md +1 -1
  156. package/skills/platform-lightning-app-coordinate/SKILL.md +1 -1
  157. package/skills/platform-metadata-api-context-get/SKILL.md +1 -1
  158. package/skills/platform-metadata-retrieve/SKILL.md +1 -1
  159. package/skills/platform-permission-set-generate/SKILL.md +1 -1
  160. package/skills/platform-report-generate/SKILL.md +1 -1
  161. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +4 -4
  162. package/skills/platform-sandbox-configure/SKILL.md +108 -133
  163. package/skills/platform-sandbox-configure/references/api-response-shapes.md +39 -0
  164. package/skills/platform-sandbox-configure/references/definition-file-approach.md +73 -0
  165. package/skills/platform-sharing-owd-configure/SKILL.md +1 -1
  166. package/skills/platform-sharing-rules-generate/SKILL.md +1 -1
  167. package/skills/platform-soql-query/SKILL.md +1 -1
  168. package/skills/platform-value-set-generate/SKILL.md +1 -1
  169. package/skills/platform-widget-generate/SKILL.md +26 -18
  170. package/skills/platform-widget-generate/examples/formulas.json +191 -0
  171. package/skills/platform-widget-generate/references/widget-formulas.md +123 -0
  172. package/skills/platform-widget-generate/references/widget-meta-directives.md +4 -4
  173. package/skills/sales-call-scoring-configure/SKILL.md +318 -0
  174. package/skills/sales-call-scoring-configure/assets/best-practice-competencies.json +67 -0
  175. package/skills/sales-call-scoring-configure/assets/ootb-competencies.json +58 -0
  176. package/skills/sales-call-scoring-configure/references/admin-communication.md +79 -0
  177. package/skills/sales-call-scoring-configure/references/competency-crud.md +130 -0
  178. package/skills/sales-call-scoring-configure/scripts/create-competency.sh +166 -0
  179. package/skills/sales-call-scoring-configure/scripts/create-custom-competency.sh +166 -0
  180. package/skills/sales-call-scoring-configure/scripts/edit-competency.sh +185 -0
  181. package/skills/sales-call-scoring-configure/scripts/edit-custom-competency.sh +190 -0
  182. package/skills/sales-call-scoring-configure/scripts/enable-call-scoring.sh +436 -0
  183. package/skills/sales-call-scoring-configure/scripts/get-competency.sh +72 -0
  184. package/skills/sales-call-scoring-configure/scripts/get-custom-competency.sh +78 -0
  185. package/skills/sales-call-scoring-configure/scripts/install-best-practice-competencies.sh +223 -0
  186. package/skills/sales-call-scoring-configure/scripts/install-ootb-competencies.sh +237 -0
  187. package/skills/sales-call-scoring-configure/scripts/list-competencies.sh +99 -0
  188. package/skills/sales-call-scoring-configure/scripts/shared/auth.sh +116 -0
  189. package/skills/sales-call-scoring-configure/scripts/shared/cap.sh +86 -0
  190. package/skills/sales-call-scoring-configure/scripts/shared/soap.sh +267 -0
  191. package/skills/sales-call-scoring-configure/scripts/shared/soql.sh +25 -0
  192. package/skills/sales-call-scoring-configure/scripts/toggle-competency.sh +112 -0
  193. package/skills/sales-call-scoring-configure/scripts/toggle-custom-competency.sh +125 -0
  194. package/skills/sales-call-scoring-configure/scripts/verify-ootb-competencies.sh +116 -0
  195. package/skills/service-agentforce-human-escalation-configure/SKILL.md +4 -0
  196. package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +26 -6
  197. package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +5 -4
  198. package/skills/service-concierge-portal-generate/references/portal-deploy-runbook.md +1 -0
  199. package/skills/service-de-channel-activate/SKILL.md +6 -5
  200. package/skills/service-de-channel-create/SKILL.md +3 -3
  201. package/skills/service-de-channel-routing-configure/SKILL.md +3 -3
  202. package/skills/service-de-channel-settings-configure/SKILL.md +195 -0
  203. package/skills/service-de-channel-settings-configure/references/channel-settings-facets.md +152 -0
  204. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/gotchas.md +3 -3
  205. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/language-keywords.md +4 -4
  206. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/worked-examples.md +14 -14
  207. package/skills/service-de-headless-channel-configure/SKILL.md +6 -6
  208. package/skills/service-de-headless-channel-configure/references/worked-examples.md +1 -1
  209. package/skills/service-de-waba-integrate/SKILL.md +2 -1
  210. package/skills/service-digital-engagement-deployment-configure/SKILL.md +2 -0
  211. package/skills/service-digital-engagement-deployment-configure/scripts/check-api-version.sh +29 -0
  212. package/skills/service-email-to-case-configure/SKILL.md +1 -1
  213. package/skills/service-helpagent-coordinate/SKILL.md +3 -2
  214. package/skills/service-helpagent-coordinate/references/channel-voice.md +15 -4
  215. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +49 -31
  216. package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +71 -6
  217. package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +26 -4
  218. package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +35 -10
  219. package/skills/service-itsm-agentic-setup-cmdb-access-assign/references/mcp-invocation.md +25 -5
  220. package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -1
  221. package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +5 -5
  222. package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +1 -1
  223. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +2 -2
  224. package/skills/service-itsm-agentic-setup-cmdb-coordinate/examples/output-templates.md +1 -1
  225. package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +25 -15
  226. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +8 -5
  227. package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +4 -2
  228. package/skills/service-itsm-agentic-setup-employee-agent-configure/references/workflow-detail.md +1 -1
  229. package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +29 -16
  230. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +8 -5
  231. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +4 -2
  232. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/workflow-detail.md +1 -1
  233. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +29 -16
  234. package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +138 -68
  235. package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +31 -15
  236. package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +156 -0
  237. package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +148 -0
  238. package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +162 -0
  239. package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +149 -0
  240. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +103 -89
  241. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +2 -2
  242. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/predefined-incident-policy.json +21 -39
  243. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +3 -3
  244. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +18 -1
  245. package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +63 -37
  246. package/skills/service-omni-attribute-routing-configure/SKILL.md +53 -0
  247. package/skills/service-omni-attribute-routing-configure/references/api-notes.md +7 -0
  248. package/skills/service-omni-attribute-routing-configure/scripts/configure-and-report.sh +224 -0
  249. package/skills/service-omni-attribute-routing-configure/scripts/tests/test_attribute_routing_contracts.py +137 -0
  250. package/skills/service-omni-channel-inventory-analyze/SKILL.md +96 -0
  251. package/skills/service-omni-channel-inventory-analyze/references/api-notes.md +52 -0
  252. package/skills/service-omni-channel-inventory-analyze/scripts/analyze.sh +185 -0
  253. package/skills/service-omni-channel-inventory-analyze/scripts/tests/_bootstrap.py +84 -0
  254. package/skills/service-omni-channel-inventory-analyze/scripts/tests/test_inventory_analyze_contracts.py +141 -0
  255. package/skills/service-omni-channel-limits-analyze/SKILL.md +70 -0
  256. package/skills/service-omni-channel-limits-analyze/references/api-notes.md +22 -0
  257. package/skills/service-omni-channel-limits-analyze/scripts/analyze.sh +159 -0
  258. package/skills/service-omni-channel-limits-analyze/scripts/tests/_bootstrap.py +87 -0
  259. package/skills/service-omni-channel-limits-analyze/scripts/tests/test_limits_analyze_contracts.py +99 -0
  260. package/skills/service-omni-channel-setup-coordinate/SKILL.md +12 -20
  261. package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +55 -5
  262. package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +38 -0
  263. package/skills/service-omni-command-center-analyze/SKILL.md +2 -2
  264. package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
  265. package/skills/dx-org-manage/examples/snapshots/error_output.json +0 -9
  266. package/skills/dx-org-manage/examples/snapshots/success_output.json +0 -15
  267. package/skills/dx-org-manage/references/cli_flags.md +0 -67
  268. package/skills/dx-org-manage/references/creating-snapshot.md +0 -103
  269. package/skills/dx-org-manage/references/snapshot_usage.md +0 -74
  270. package/skills/experience-accessibility-validate/scripts/contrast-ratio.py +0 -153
  271. package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +0 -205
  272. package/skills/experience-ui-bundle-features-generate/scripts/verify-react-bundle.sh +0 -14
  273. /package/skills/experience-ui-bundle-features-generate/references/{conflict-resolution-schema.json → common/conflict-resolution-schema.json} +0 -0
  274. /package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/references/api-response-schema.md +0 -0
@@ -0,0 +1,215 @@
1
+ # FSM Flow ↔ Data Capture Capability-Parity Catalog
2
+
3
+ **Authoritative** capability-parity / functionality-gap catalog between Field
4
+ Service Mobile (FSM) Flow and Data Capture (DC) Flow. This document and its
5
+ executable twin — `scripts/fsm_dc_catalog.py` — are the single source of truth
6
+ for the migration skill's supported / unsupported decisions.
7
+
8
+ It is keyed on the **real FSM Flow component vocabulary** — the standard Flow
9
+ `FlowScreenFieldType` enum (`InputField`, `DropdownBox`, `RadioButtons`,
10
+ `MultiSelectCheckboxes`, `DisplayText`, …) — **not** Lightning component names.
11
+ A `lightning:*` / `forceContent:*` / `c:*` name only ever appears as the
12
+ `<extensionName>` inside a `ComponentInstance` field.
13
+
14
+ > **Why this rewrite exists (W-23364461):** the skill's earlier
15
+ > supported/unsupported decisions were made against Lightning component names
16
+ > (`lightning:input`, `lightning:fileUpload`, …) rather than the FSM Flow
17
+ > vocabulary the platform actually uses. That produced two concrete errors,
18
+ > corrected below.
19
+
20
+ ---
21
+
22
+ ## Source of truth & verification
23
+
24
+ Two inputs were reconciled:
25
+
26
+ 1. The **assessment spreadsheet** — *FSM Flow vs Data Capture Flow component
27
+ assessment*
28
+ ([sheet](https://docs.google.com/spreadsheets/d/1KeZPHw4AN8XxqxoTh4X9ciLavp9JNcOeYDbSzmCATGg/edit)).
29
+ 2. **Salesforce core code** (core-2206, 264 release line), which is
30
+ authoritative where the two disagree.
31
+
32
+ Core evidence:
33
+
34
+ | Fact | Core location |
35
+ |---|---|
36
+ | FSM/DC screen-field vocabulary (`FlowScreenFieldType` enum) | `interaction/.../mdapi/FlowScreenField.java` |
37
+ | FSM's single allowed `ComponentInstance` extension = `forceContent:fileUpload` | `interaction/.../mdapi/validation/FieldServiceMobileFlowValidator.java` (`supportedLightningComponents`) |
38
+ | FSM field types are a **denylist** (blocks only `Component*`/`Region`/`RegionContainer`/`Repeater`/`ObjectProvided`; all native types allowed) | `FieldServiceMobileProcessTypeHandler.hook_isFlowScreenFieldTypeAllowed` |
39
+ | DC field types are an **allowlist** (`DisplayText`, `ComponentInstance`, `ComponentChoice`, `ComponentMultiChoice`, `RegionContainer`, `Region`, `Repeater`, `ObjectProvided`); `AGX_FLOW`-only actions; Offline-only | `interaction/.../mdapi/processtype/DataCaptureFlowProcessTypeHandler.java` |
40
+
41
+ > **Two different gates — don't conflate them.** FSM screen *field types* are
42
+ > governed by a denylist, so the full native vocabulary (`InputField`,
43
+ > `DropdownBox`, `RadioButtons`, `MultiSelectPicklist`, …) is a valid migration
44
+ > **source**. Separately, an FSM `ComponentInstance` field may embed exactly one
45
+ > whitelisted extension — `forceContent:fileUpload`. DC is the mirror image: it
46
+ > *allows only* the `Component*` field types and blocks the native ones. That
47
+ > asymmetry is why migration is a type **conversion** (`DropdownBox` →
48
+ > `ComponentChoice`+`dcPicklist`), not a pass-through.
49
+ | DC deploy-time ceilings (CUD-at-end, blocked globals, fault stub) | `reference/dc-conditional-logic-sources.md` (spike W-23363833) |
50
+
51
+ ---
52
+
53
+ ## Corrections vs. the assessment spreadsheet
54
+
55
+ The spreadsheet is correct on almost everything, but core code contradicts it on
56
+ two points that matter for migration decisions:
57
+
58
+ ### 1. Signature is DC-only — FSM has **no** signature component (spreadsheet correct, earlier skill decision wrong)
59
+
60
+ Core exposes **no native FSM signature component**. `FieldServiceMobileFlowValidator`
61
+ hardcodes the only allowed screen extension as `forceContent:fileUpload` — there
62
+ is no signature entry anywhere in the FSM path. `dcSignature` is DataCaptureFlow-only.
63
+
64
+ **Consequence:** the earlier decision recorded in **WI-3 (W-23364096)** —
65
+ "file-upload **and signature** ARE supported Phase-1 migration targets" — is
66
+ **wrong on the signature half** and is reversed here. There is no FSM signature
67
+ source to migrate *from*, so there is nothing to emit as `dcSignature`. Any
68
+ downstream task to "implement signature emission" (WI-7 / W-23364093) should be
69
+ **reverted**.
70
+
71
+ ### 2. File-upload is **NOT** DC-only — the spreadsheet is wrong here, and the earlier skill was wrong too
72
+
73
+ The spreadsheet lists File Upload as "DC only – file attachment" (no FSM
74
+ equivalent). Core disproves this: `FieldServiceMobileFlowValidator` explicitly
75
+ **allows** `forceContent:fileUpload` inside an FSM flow. So:
76
+
77
+ - FSM Flow **can** contain file upload — via the extension `forceContent:fileUpload`.
78
+ - That maps cleanly to DC's `dcUpFile`.
79
+ - The earlier skill was *also* wrong, for a different reason: it keyed this off
80
+ `lightning:fileUpload`, which is not the extension FSM actually allows.
81
+
82
+ **Consequence:** file-upload **is** a supported migration target — the WI-3
83
+ "file-upload supported" conclusion stands — but the mapping must key off
84
+ `forceContent:fileUpload → dcUpFile`, never `lightning:fileUpload`.
85
+
86
+ ---
87
+
88
+ ## Class 1 — FSM components with a clean FSM → DC mapping
89
+
90
+ Keyed by the FSM `<fieldType>` (and, for `InputField`, the field's `<dataType>`;
91
+ for `ComponentInstance`, the `<extensionName>`).
92
+
93
+ | FSM fieldType | Discriminator | → DC fieldType | → extensionName |
94
+ |---|---|---|---|
95
+ | `InputField` | dataType `Boolean` | `ComponentInstance` | `dcCheckbox` — *(see discrepancy)* |
96
+ | `InputField` | dataType `String` | `ComponentInstance` | `dcTextInput` |
97
+ | `InputField` | dataType `Number`/`Double`/`Currency` | `ComponentInstance` | `dcNumeric` |
98
+ | `InputField` | dataType `Date` | `ComponentInstance` | `dcDate` |
99
+ | `InputField` | dataType `DateTime` | `ComponentInstance` | `dcDateTime` |
100
+ | `InputField` | dataType `Email` | `ComponentInstance` | `dcEmail` |
101
+ | `InputField` | dataType `Phone` | `ComponentInstance` | `dcPhone` |
102
+ | `InputField` | dataType `TextArea`/`LongTextArea` | `ComponentInstance` | `dcLongText` |
103
+ | `InputField` | dataType `Picklist` | `ComponentChoice` | `dcPicklist` |
104
+ | `InputField` | dataType `MultiselectPicklist` | `ComponentMultiChoice` | `dcCbGroup` |
105
+ | `DropdownBox` | — | `ComponentChoice` | `dcPicklist` |
106
+ | `RadioButtons` | — | `ComponentChoice` | `dcRbGroup` |
107
+ | `RadioButtonGroup` | — | `ComponentChoice` | `dcRbGroup` |
108
+ | `MultiSelectCheckboxes` | — | `ComponentMultiChoice` | `dcCbGroup` |
109
+ | `MultiSelectPicklist` | — | `ComponentMultiChoice` | `dcCbGroup` *(or `dcPicklist` multi-mode)* |
110
+ | `LargeTextArea` | — | `ComponentInstance` | `dcLongText` |
111
+ | `DisplayText` | — | `DisplayText` | *(pass-through)* |
112
+ | `ComponentInstance` | ext `forceContent:fileUpload` | `ComponentInstance` | `dcUpFile` |
113
+ | `ComponentInstance` | ext `forceContent:imageUpload` | `ComponentInstance` | `dcUpImage` |
114
+ | `ComponentInstance` | ext already `runtime_service_fieldservice:dc*` | *(pass-through, cleaned)* | — |
115
+
116
+ `DisplayText` is the only field type valid in **both** flow types.
117
+
118
+ ## Class 2 — FSM components with **NO DC equivalent** (cannot auto-migrate)
119
+
120
+ The migration must **flag, never silently drop or downgrade** these.
121
+
122
+ | FSM fieldType | Why no DC path | Manual option |
123
+ |---|---|---|
124
+ | `PasswordField` | No DC password component | Capture as `dcTextInput` only if non-secret, else drop |
125
+ | `DisplayRichText` | No DC rich-text display | Downgrade to `DisplayText`; rich formatting lost |
126
+ | `PlainButtons` | **DC has no action buttons** (capability gap) | Remove or redesign — no migration path |
127
+ | `ComponentInstance` ext `runtime_industries_csv_dataimport:advCsv` ("**Advanced CSV Import**"), or `:impBeg` (beginner variant) | Industries CSV Data Import / DPE-backed bulk import; DC has no CSV/bulk-import screen component and uses a per-record form model | Rebuild the data-loading step outside the flow (Data Processing Engine) or drop it |
128
+ | `ComponentInstance` w/ any custom ext (`c:*`, `lightning:*` other than the whitelisted `forceContent:fileUpload`) | DC has no custom-component extension point | Rebuild with a native `dc*` component or flag as unmigratable |
129
+
130
+ > **"Advanced CSV Import" is real — and a gap.** It is a standard-shipped
131
+ > Lightning flow screen component (`runtime_industries_csv_dataimport:advCsv`,
132
+ > `<target>lightning__FlowScreen</target>`) that appears in the FSM flow builder
133
+ > palette when Industries CSV Data Import is enabled, so it can legitimately show
134
+ > up in an FSM source flow. It has no DC equivalent. The catalog names it
135
+ > explicitly (`KNOWN_UNSUPPORTED_EXTENSIONS` in `fsm_dc_catalog.py`) so the gap
136
+ > report says *what* it is rather than a generic "unknown component" (W-23364461).
137
+
138
+ > **Choice types are NOT gaps.** `MultiSelectPicklist`, `RadioButtonGroup`,
139
+ > `RadioButtons`, `DropdownBox`, and `MultiSelectCheckboxes` all have genuine DC
140
+ > equivalents (Class 1). DC expresses multi-select through the
141
+ > `ComponentMultiChoice` field type — `dcCbGroup`, or `dcPicklist` in multi mode
142
+ > (its meta declares both `allowSingleChoice` and `allowMultipleChoices`). An
143
+ > earlier version of this catalog wrongly listed `MultiSelectPicklist` and
144
+ > `RadioButtonGroup` as no-DC-equivalent; that was a false gap and is corrected
145
+ > here (W-23364461).
146
+
147
+ ## Class 3 — DC-only components (no FSM source maps to them)
148
+
149
+ These exist only in Data Capture; nothing in a source FSM flow produces them.
150
+ Listed for completeness so the skill can explain what a migration *cannot*
151
+ generate.
152
+
153
+ | DC component | Notes |
154
+ |---|---|
155
+ | `dcSignature` | Signature capture — **FSM has no signature component** |
156
+ | `dcEmail` / `dcPhone` / `dcName` | Dedicated inputs (FSM approximates via `InputField`) |
157
+ | `dcAddress` | Address input (optional GPS) |
158
+ | `dcLookup` | Record lookup |
159
+ | `dcMatrix` | Matrix / grid input |
160
+ | `dcCounter` | Numeric stepper |
161
+ | `dcCheckbox` | Single checkbox — distinct from Boolean/Toggle (see discrepancy) |
162
+ | `dcFileView` | Read-only file/image viewer |
163
+ | `dcUpImage` | Image upload (dedicated component) |
164
+ | `Region` / `RegionContainer` | Layout regions — FSM disallows |
165
+ | `Repeater` | Native repeating section — FSM used Loop + screens |
166
+ | `ObjectProvided` | Object-provided fields — FSM disallows |
167
+
168
+ > **`dcImages` does not exist.** Image upload is `dcUpImage`; the read-only
169
+ > file/image viewer is `dcFileView`. (Correction to an earlier assumption.)
170
+
171
+ ---
172
+
173
+ ## Capability-level gaps (beyond individual components)
174
+
175
+ These are differences no per-component mapping can preserve. They are returned
176
+ by `fsm_dc_catalog.capability_gaps()` and surfaced per-flow by `analyze_flow.py`.
177
+
178
+ | Capability gap | Detail | Core evidence |
179
+ |---|---|---|
180
+ | **No actions / buttons** | DC has no user-facing action buttons. FSM's `PlainButtons` has no DC equivalent; the only invocable action DC permits is `AGX_FLOW`. | `DataCaptureFlowProcessTypeHandler`: `allowedScreenFieldTypes` omits `PlainButtons`; `allowedActionTypes = {AGX_FLOW}` |
181
+ | **Offline-only** | DC runs only in the Offline environment. Online-only behaviour cannot be preserved. | `hook_isEnvironmentAllowed` → Offline only |
182
+ | **No Apex / action calls** | DC forbids `<actionCalls>` and Apex data types. | action allowlist = `AGX_FLOW` only |
183
+ | **CUD only at end of flow** | All create/update/delete must follow the last screen. FSM allowed CUD mid-flow. | `DataCaptureFlowValidator` CUD-at-end BFS |
184
+ | **No fault paths** | Fault connectors unsupported; FSM fault handling is stripped. | empty `navigateToFault()` stub; blocked `$Flow.FaultMessage` |
185
+ | **Subflows: DC-type only, no CUD** | A DC flow can only call another DC flow, and subflows cannot contain CUD. | subflow-type check |
186
+ | **Inverted gate w/ non-invertible condition** | An inverted-shape gate (default branch shows the field, rule branch skips it) collapses by *negating* the rule condition. When the rule uses a non-invertible operator (`Contains`, `StartsWith`, `EndsWith` — no negated Flow operator) or a custom `conditionLogic` formula, it cannot collapse and stays a flagged decision. Expressing it would need formula-typed visibility. | Flow operator enum has no `DoesNotContain`/`NotStartsWith`/`NotEndsWith`; DC visibility is show-when-only with no per-condition `NOT`. |
187
+
188
+ ---
189
+
190
+ ## Known discrepancy — Boolean `InputField` target (`dcCheckbox` vs `dcToggle`)
191
+
192
+ The shipping transformer (`transform_flow.py`) maps `InputField`/`Boolean` →
193
+ `dcCheckbox`, and this catalog matches it so **catalog and code stay in sync**
194
+ (AC#5). The assessment spreadsheet instead recommends `dcToggle` for a Boolean
195
+ ("Boolean/Toggle is `dcToggle`, **NOT** `dcCheckbox`; single Checkbox is a
196
+ distinct DC-only component").
197
+
198
+ Both `dcCheckbox` and `dcToggle` bind to a Boolean and deploy successfully — the
199
+ difference is UX (checkbox vs. toggle switch), not correctness. This is an
200
+ **unresolved product decision**, not a bug. If the mapping should change to
201
+ `dcToggle`, update `INPUTFIELD_BY_DATATYPE` in `fsm_dc_catalog.py` **and**
202
+ `FIELD_TYPE_MAP` in `transform_flow.py` together.
203
+
204
+ ---
205
+
206
+ ## How the catalog is consumed
207
+
208
+ - **`scripts/fsm_dc_catalog.py`** — `classify(field_type, data_type, extension_name)`
209
+ returns `{status, dc_extension, dc_field_type, note}`; `capability_gaps()`
210
+ returns the table above; `is_gap(status)` is the gap predicate.
211
+ - **`scripts/analyze_flow.py`** — classifies every screen field via the catalog
212
+ and emits a **Data Capture Gap Report** per flow (feeds WI-7 / WI-10).
213
+ - **`scripts/transform_flow.py`** — the shipping transformer; its `FIELD_TYPE_MAP`
214
+ is the same vocabulary and must stay in sync with this catalog.
215
+ - **`reference/component-mapping.md`** — points here as the source of truth.
@@ -0,0 +1,36 @@
1
+ # Known deploy errors and fixes
2
+
3
+ These were encountered in real migration runs. All are handled automatically by `transform_flow.py` unless noted.
4
+
5
+ | Deploy error | Root cause | Fix |
6
+ |---|---|---|
7
+ | `You can't specify the field API Version` | `<apiVersion>` tag present | Removed by transformer |
8
+ | `Element variables is duplicated at this location` | Legacy flow has `ParentRecordId` (capital P); transformer adds `parentRecordId` (lowercase) | Case-insensitive dedup — updates existing var to `isInput=true` instead of adding |
9
+ | `Element inputParameters is duplicated at this location` | Two separate `<inputParameters>` blocks on same field with other elements between them | Reorder field children so all `<inputParameters>` are contiguous — done by transformer |
10
+ | `Flows of type "Data Capture Flow" can't include "RadioButtons"` | `RadioButtons` fieldType not valid in DC | Converted to `ComponentChoice` + `dcRbGroup` by transformer |
11
+ | `Flows of type "Data Capture Flow" can't include "MultiSelectCheckboxes"` | Same | Converted to `ComponentMultiChoice` + `dcCbGroup` |
12
+ | `Outputs aren't supported for fieldType "ComponentChoice"` | `<dataType>` or `<defaultValue>` present on a ComponentChoice field | Removed by transformer |
13
+ | `extensionName is required when fieldType is ComponentChoice` | `extensionName` was removed trying to fix above | Transformer keeps `extensionName` = `dcPicklist`/`dcRbGroup`/`dcCbGroup` on ComponentChoice |
14
+ | `extensionName isn't supported` on Repeater | `extensionName` set on the Repeater element itself | Removed by transformer; only valid on nested fields inside the Repeater |
15
+ | `Data Capture Flows can't use API entities that don't show up in the UI` | `recordCreates` targeting a platform event object | Removed by transformer; predecessors redirected to successor |
16
+ | `The field "X" isn't compatible with the LightningComponentOutput element "Y"` | `<defaultValue>` on a ComponentInstance field | Removed by transformer; use `value` inputParameter instead |
17
+ | `In a Decision Outcome, a condition doesn't support "X" Equals` | Decision condition references a screen component name bare (without `.value`) | Transformer appends `.value` |
18
+ | `Append multiple Create, Update, or Delete operations only at the end of the flow` | CUD node has a non-CUD successor | Graph restructurer hoists the non-CUD successor before first screen |
19
+ | `A loop that contains CUD elements can't include other elements except Assignments` | Screen inside a loop body | Cannot be auto-fixed — requires Repeater redesign |
20
+ | `invalid cross reference id` | Connector target references a removed node | Dangling connectors removed by transformer |
21
+ | `The flow X doesn't exist` (subflow reference) | Subflow name updated to `_DC` suffix but that flow isn't deployed yet | Resolved by dependency ordering: run `discover_subflow_tree.py` (Step 3b) to get the leaves-first order, transform in that order, and bundle-validate (`validate_flow.sh --bundle`) so intra-tree refs resolve |
22
+ | `A required input parameter is missing: 'label'` | `ComponentInstance` field is missing the `label` inputParameter | Transformer moves label from `<fieldText>` to `label` inputParameter |
23
+ | `We can't find this input attribute: "placeholder"` | `placeholder` not supported in DC | Stripped by transformer — bake text into label |
24
+ | `We can't find this input attribute: "helpText"` | `helpText` not supported in DC | Stripped by transformer — bake text into label |
25
+ | `We can't find this input attribute: "min"` / `"max"` on dcNumeric | `min`/`max` only valid on `dcCounter`, not `dcNumeric` | Stripped by transformer; switch to `dcCounter` if numeric constraints are needed |
26
+ | `We can't find this input attribute: "minimumDate"` / `"maximumDate"` | Correct attributes are `minDate` / `maxDate` | Replaced by transformer |
27
+ | `We can't find this input attribute: "multiSelection"` | Correct attribute is `isMultiSelection` | Replaced by transformer |
28
+ | `We can't find this input attribute: "disabled"` / `"readOnly"` on Lookup | Correct: `isDisabled` / `isReadonly` (lowercase `o`) | Replaced by transformer |
29
+ | `We can't find this input attribute: "recordIds"` on Lookup | Correct: `recordIdCollection` | Replaced by transformer |
30
+ | `'Range' is not a valid value for the enum 'FlowScreenFieldType'` | Slider (`Range`) not valid in DataCaptureFlow | Flagged by transformer as SKIPPED — replace manually with `dcNumeric` or `dcCounter` |
31
+ | `This flow can't reference [X] because the referenced flow type is Autolaunched Flow` | Calling an AutoLaunched subflow from DataCaptureFlow | Not auto-fixable; inline the logic or convert subflow to DataCaptureFlow |
32
+ | `storeOutputAutomatically field isn't supported` on Repeater | `storeOutputAutomatically` must not be on the Repeater itself | Transformer omits it on the Repeater; only nested fields inside the Repeater get it |
33
+ | `Element X is duplicated at this location` (non-inputParameters) | XML elements of same type are not in a contiguous block | Reorder the XML so all same-type elements are grouped |
34
+ | `Error while resolving default value reference` *(runtime — not deploy)* | Complex formula in `DisplayText` (`IF`, `CASE`, date math) | Transformer warns; pre-calculate in Assignment → reference simple variable in DisplayText |
35
+ | `isRequired=true` blocks hidden field *(runtime — not deploy)* | Required check fires even when field is hidden behind `visibilityRule` | Transformer warns; manually clear `isRequired` and add `validationRule` |
36
+ | `outputAssignments` in `dynamicChoiceSets` populates blank *(runtime — not deploy)* | `outputAssignments` inside choice sets deploys but does NOT populate variables at mobile runtime | Replace with post-selection `recordLookups` using `outputAssignments` |
@@ -0,0 +1,121 @@
1
+ # Data Capture Migration Checklist
2
+
3
+ Step-by-step manual validation checklist for migrated flows.
4
+
5
+ ## Pre-Migration
6
+
7
+ - [ ] **Identify candidate flows** — `SELECT Id, ApiName, Label, ProcessType FROM FlowDefinition WHERE ProcessType = 'FieldServiceMobile'` (Tooling API)
8
+ - [ ] **Retrieve legacy flow XML** — `sf project retrieve start --metadata Flow:<FlowApiName> --target-org <alias>`
9
+ - [ ] **Run analysis script** — `python3 "$SCR/analyze_flow.py" /tmp/<FlowApiName>.flow-meta.xml /tmp/<FlowApiName>_analysis.json`
10
+ - [ ] **Review risk score and manual steps** (from analysis output)
11
+ - [ ] **Decision: GREEN → automate, YELLOW → review spec, RED → manual redesign**
12
+
13
+ ## Migration Phase
14
+
15
+ - [ ] **Run converter** — `python3 "$SCR/convert_to_dc_spec.py" /tmp/<FlowApiName>.flow-meta.xml /tmp/<FlowApiName>_dc_spec.json`
16
+ - [ ] **Review generated spec**
17
+ - Field types are correct; choice mappings for picklists/radios are valid
18
+ - No `_migrationNote` fields requiring manual config; check `_automationNote` for postScreen automation
19
+ - [ ] **Adjust spec as needed** — add `lookupObject` for Lookup fields, `fileName` for FileView fields, simplify flagged visibility rules, convert Apex-dependent logic to record lookups
20
+ - [ ] **Build Data Capture flow** — `python3 "$SCR/vendor/build_flow.py" /tmp/<FlowApiName>_dc_spec.json <FlowApiName>_v2 /tmp/<FlowApiName>_v2.flow-meta.xml`
21
+ - [ ] **Deploy to org** — `"$SCR/deploy_flow.sh" <alias> /tmp/<FlowApiName>_v2.flow-meta.xml`
22
+ - [ ] **Verify deploy success** — `SELECT ApiName, ProcessType FROM FlowDefinition WHERE ApiName = '<FlowApiName>_v2'` (Tooling API)
23
+
24
+ ## Post-Deploy Validation
25
+
26
+ ### Desktop Testing
27
+
28
+ - [ ] **Open Flow Builder** for the deployed flow — verify screens render, field properties (type, label, required, visibility) are correct, and automation elements (decisions, loops, record operations) behave as expected
29
+ - [ ] **Direct flow launch test** at `<instanceUrl>/flow/<FlowApiName>_v2` — complete the form end-to-end, verify all screens display, required validation and conditional visibility work, and submit succeeds
30
+ - [ ] **Verify record creation/update** — query the target object for records created `WHERE CreatedDate = TODAY`, confirm structure matches expectations
31
+
32
+ ### Briefcase & Offline Priming
33
+
34
+ - [ ] **Add objects/fields to Briefcase** — Setup → Briefcase Builder; add every object/field the flow reads or writes, assign to the test user
35
+ - [ ] **Verify priming** — run as the test user in the User simulator; confirm the primed record count is reasonable
36
+
37
+ ### Mobile Testing
38
+
39
+ - [ ] **Attach to test parent record** — this skill does not script this step (it would be a data-record write, out of the deploy-metadata-only scope). Attach the migrated form to a test parent record (ServiceAppointment/WorkOrder/etc.) manually via Setup's Data Capture assignment UI before continuing.
40
+ - [ ] **Verify Forms tab prerequisites** — all three must pass before the form appears on FSL Mobile:
41
+ - `DynamicDataCapture` and `WorkPlan` internal sharing model (`EntityDefinition.InternalSharingModel`) must be `ReadWrite`, not `Private`
42
+ - `FieldServiceSettings.DoesShareSaWithAr__c` and `DoesShareSaParentWoWithAr__c` must both be `true`
43
+ - If any setting changed, re-save affected `AssignedResource` records so the new sharing rules apply
44
+ - [ ] **Device: sign out + back in** (required after any OWD/sharing change above)
45
+ - [ ] **Device: open parent record → Forms tab** — verify the migrated form appears and opens with all screens rendering
46
+ - [ ] **Device: complete form online** — fill all fields, exercise required validation and visibility rules, submit, verify the success message
47
+ - [ ] **Device: verify data persisted** — query the target object for today's records
48
+ - [ ] **Device: enable airplane mode → complete form offline** — fill and submit; verify it queues as a draft with a "queued" indicator
49
+ - [ ] **Device: disable airplane mode, wait ~30s for sync, then verify the queued record synced** — query the target object again
50
+
51
+ ### Comparison Testing
52
+
53
+ - [ ] **Create a test parent record** (e.g. Work Order)
54
+ - [ ] **Complete the LEGACY flow on record A** — note fields populated and records created
55
+ - [ ] **Complete the MIGRATED flow on record B** — note fields populated and records created
56
+ - [ ] **Diff the two outcomes** — field values, record counts, and relationships must match; no data loss
57
+
58
+ ### Edge Cases & Stress Tests
59
+
60
+ - [ ] **All decision branches** — walk each conditional path, verify correct screen routing
61
+ - [ ] **Visibility rules** — toggle controlling fields, verify dependents show/hide correctly
62
+ - [ ] **Repeater (if present)** — add, edit, and delete rows; verify the `.AllItems` loop creates the correct records
63
+ - [ ] **Lookup (if present)** — search, select, verify downstream references resolve
64
+ - [ ] **File/signature/image components (if present)** — capture/upload, verify `ContentDocument` and its `ContentDocumentLink` to the parent are created
65
+ - [ ] **Validation rules** — submit with missing required fields and with invalid data; confirm both are blocked with the correct error message
66
+
67
+ ## Production Cutover
68
+
69
+ - [ ] **Final smoke test** on the migrated flow
70
+ - [ ] **Communicate to users** — notify technicians, provide a side-by-side comparison if useful, set a cutover date
71
+ - [ ] **Monitor for issues** — failed drafts in the sync queue, support tickets, data quality
72
+ - [ ] **Deactivate the legacy flow** (after the soak period)
73
+ - [ ] **Remove the `_v2` suffix** (optional) — clone with the production name, repoint DDC attachments, delete the `_v2` version
74
+ - [ ] **Clean up test records**
75
+
76
+ ## Rollback Plan
77
+
78
+ If critical issues are found:
79
+
80
+ - [ ] **Deactivate the migrated flow** (Flow Builder)
81
+ - [ ] **Reactivate the legacy flow**
82
+ - [ ] **Repoint DDC attachments** back to the legacy flow — update `DynamicDataCapture.ActionDefinition` to `<LegacyFlowApiName>`
83
+ - [ ] **Notify users of the rollback**
84
+ - [ ] **Root cause analysis** — review failed drafts, check error logs, identify missing config (Briefcase, FLS, OWD, etc.)
85
+ - [ ] **Fix and retry** — adjust the spec, rebuild as `_v3`, repeat this checklist
86
+
87
+ ## Documentation
88
+
89
+ - [ ] **Update org documentation** — migration date, differences from the legacy version, training materials
90
+ - [ ] **Archive the legacy flow** — export XML to source control with a README explaining the migration
91
+ - [ ] **Tag the migrated flow** — note in Flow Builder that it's a migrated version, referencing the original flow name
92
+
93
+ ## Success Criteria
94
+
95
+ Migration is successful when:
96
+
97
+ 1. All screens render correctly on mobile
98
+ 2. All fields accept input and validate correctly
99
+ 3. Conditional logic works (visibility, routing)
100
+ 4. Record operations succeed (creates/updates)
101
+ 5. Offline mode works (drafts queue and sync)
102
+ 6. Data integrity matches legacy flow output
103
+ 7. No user-reported critical issues for 1 week
104
+ 8. Form appears reliably in FSL Mobile "Forms" tab
105
+ 9. Performance is acceptable (form loads < 2 sec)
106
+ 10. Technicians can complete the form without errors
107
+
108
+ ## Common Issues & Fixes
109
+
110
+ | Issue | Likely Cause | Fix |
111
+ |-------|--------------|-----|
112
+ | Form doesn't appear in Forms tab | DDC/WorkPlan OWD is Private | Set to ReadWrite, re-save AssignedResources, sign out/in on device |
113
+ | Field missing on mobile | Not in Briefcase | Add object/field to Briefcase Builder |
114
+ | Lookup returns no results | `lookupObject` not configured | Add to spec and redeploy |
115
+ | File upload fails | `parentRecordId` not wired | Converter should auto-wire; verify XML |
116
+ | Visibility rule doesn't work | Formula too complex for DC | Simplify or move to Assignment + simple condition |
117
+ | Draft never syncs | Validation rule blocks insert | Fix validation rule or adjust form data |
118
+ | Form renders blank | Custom component not converted | Replace with native DC component |
119
+ | Create fails with "field required" | `isRequired` not set on field | Add to spec or in Flow Builder |
120
+ | Multiple rows not created | Repeater `.AllItems` loop incorrect | Verify loop references `RepeaterName.AllItems`, not `RepeaterName` |
121
+ | Cross-screen reference broken | Formula in DisplayText not supported | Move to Assignment between screens |
@@ -0,0 +1,132 @@
1
+ # What the transformer does automatically
2
+
3
+ `transform_flow.py` is a direct XML-to-XML transformer — no spec generation, no intermediate files. It makes one pass through the flow and applies all transformations below.
4
+
5
+ ## Field type conversion (complete mapping)
6
+
7
+ | Legacy fieldType | Legacy dataType / extensionName | → DC fieldType | → extensionName |
8
+ |---|---|---|---|
9
+ | `InputField` | `Boolean` | `ComponentInstance` | `dcCheckbox` |
10
+ | `InputField` | `String` | `ComponentInstance` | `dcTextInput` |
11
+ | `InputField` | `Number` / `Double` / `Currency` | `ComponentInstance` | `dcNumeric` |
12
+ | `InputField` | `Date` | `ComponentInstance` | `dcDate` |
13
+ | `InputField` | `DateTime` | `ComponentInstance` | `dcDateTime` |
14
+ | `InputField` | `Email` | `ComponentInstance` | `dcEmail` |
15
+ | `InputField` | `Phone` | `ComponentInstance` | `dcPhone` |
16
+ | `InputField` | `TextArea` / `LongTextArea` | `ComponentInstance` | `dcLongText` |
17
+ | `InputField` | `Picklist` | `ComponentChoice` | `dcPicklist` (supports single OR multiple selection via configuration) |
18
+ | `InputField` | `MultiselectPicklist` | `ComponentMultiChoice` | `dcCbGroup` |
19
+ | `InputField` | `Name` | `ComponentInstance` | `dcName` |
20
+ | `InputField` | `Toggle` | `ComponentInstance` | `dcToggle` |
21
+ | `InputField` | `Address` | `ComponentInstance` | `dcAddress` |
22
+ | `InputField` | `Lookup` | `ComponentInstance` | `dcLookup` |
23
+ | `InputField` | `Counter` | `ComponentInstance` | `dcCounter` |
24
+ | `InputField` | `Matrix` | `ComponentMultiChoice` | `dcMatrix` |
25
+ | `DropdownBox` | — | `ComponentChoice` | `dcPicklist` |
26
+ | `RadioButtons` | — | `ComponentChoice` | `dcRbGroup` |
27
+ | `RadioButtonGroup` | — | `ComponentChoice` | `dcRbGroup` |
28
+ | `MultiSelectCheckboxes` | — | `ComponentMultiChoice` | `dcCbGroup` |
29
+ | `MultiSelectPicklist` | — | `ComponentMultiChoice` | `dcCbGroup` |
30
+ | `LargeTextArea` | — | `ComponentInstance` | `dcLongText` |
31
+ | `forceContent:fileView` | — | `ComponentInstance` | `dcFileView` |
32
+ | `forceContent:fileUpload` | — | `ComponentInstance` | `dcUpFile` |
33
+ | `forceContent:imageUpload` | — | `ComponentInstance` | `dcUpImage` |
34
+ | `Range` (slider) | — | **SKIPPED — not valid in DC** | Flag for manual replacement with `dcNumeric` or `dcCounter` |
35
+ | `DisplayText` | — | `DisplayText` | *(pass-through)* |
36
+ | `Repeater` | — | `Repeater` | *(pass-through)* |
37
+ | Already `runtime_service_fieldservice:dc*` | — | *(pass-through, cleaned)* | — |
38
+
39
+ ## Required XML injected on every converted ComponentInstance field
40
+
41
+ Every `dc*` `ComponentInstance` field gets these elements injected by the transformer:
42
+
43
+ ```xml
44
+ <inputsOnNextNavToAssocScrn>UseStoredValues</inputsOnNextNavToAssocScrn>
45
+ <storeOutputAutomatically>true</storeOutputAutomatically>
46
+ <styleProperties>
47
+ <verticalAlignment><stringValue>top</stringValue></verticalAlignment>
48
+ <width><stringValue>12</stringValue></width>
49
+ </styleProperties>
50
+ ```
51
+
52
+ **Exception:** `<fieldType>Repeater</fieldType>` must NOT get `storeOutputAutomatically` — the Repeater always outputs via `.AllItems` and the element causes a deploy error if present on the Repeater itself (nested fields inside the Repeater still get it).
53
+
54
+ ## Label placement rules by fieldType
55
+
56
+ | fieldType | Label location | Note |
57
+ |---|---|---|
58
+ | `ComponentInstance` (`dc*`) | `<inputParameters><name>label</name>...` | `<fieldText>` is stripped if present; missing `label` inputParameter causes deploy error |
59
+ | `ComponentChoice` / `ComponentMultiChoice` | `<fieldText>` | Direct content |
60
+ | `DisplayText` | `<fieldText>` | HTML content |
61
+ | `RegionContainer` / `Region` (section) | `<fieldText>` | Section header |
62
+
63
+ ## CUD-at-end graph restructuring
64
+
65
+ DataCaptureFlow requires all record creates/updates/deletes after the last screen. The transformer detects violations by walking the execution graph and fixes them with 4 patterns (up to 50 convergence iterations):
66
+
67
+ **Analysis/converter path (WI-8):** `convert_to_dc_spec.py` and `analyze_flow.py` perform
68
+ ordinal CUD-placement analysis (`scripts/cud_analysis.py`): each create/update/delete is
69
+ classified by execution position as `compliant`, `safe_consolidate`, or `unsafe_manual`.
70
+ Safe record-creates are auto-consolidated into `postScreen.recordCreates` (rendered after
71
+ the last screen); unsafe CUD and safe updates/deletes (no auto-move path) get precise
72
+ manual-restructure guidance in `_cudAnalysis` / `_migrationSummary`. This is distinct from
73
+ the `transform_flow.py` restructurer, which rewrites the flow XML connectors in place.
74
+
75
+ - **Pattern A — CUD → Screen**: Moves the screen to before the CUD chain (converts "confirmation after save" to "confirm before save")
76
+ - **Pattern B — CUD → Lookup**: Hoists the lookup to before the first screen (pre-loads data before user sees the form)
77
+ - **Pattern C — CUD → Assignment**: Same as Pattern B
78
+ - **Pattern D — CUD → Decision**: Hoists the decision to before the first screen
79
+
80
+ **Functional impact of CUD restructuring:** In most flows, lookups that were originally after a screen are pre-screen in the original design anyway (they load context). Hoisting them doesn't change their results. **Check the warnings output** — if a warning says a hoisted lookup filters on a screen field value, that lookup will run with an empty value before the user fills in the screen. That flow needs manual redesign.
81
+
82
+ ## Other automatic fixes
83
+
84
+ - `processType` → `DataCaptureFlow`
85
+ - `status` → `Draft` (always — the source's status, often `Active`, never leaks through; `deploy_flow.sh` also force-rewrites `<status>` to `Draft` at the deploy boundary, so this holds even for a hand-edited file. Activation is a manual admin action in the org UI after a clean dry-run and device testing — SKILL.md Step 8 — never scripted)
86
+ - `environments` → `Offline` (replaces `Default` or adds if missing)
87
+ - Sets `areMetricsLoggedToDataCloud` to `false` (required DC header; adds if missing, updates if present)
88
+ - Removes `<apiVersion>` (not valid in DC — causes deploy error if present)
89
+ - Removes `<constants>` (not allowed in DC)
90
+ - Removes `<actionCalls>` elements (not allowed in DC — use DisplayText for notifications)
91
+ - Strips fault connectors from all elements (not supported in DataCaptureFlow)
92
+ - Removes platform event `<recordCreates>` nodes (DC can't create non-UI entities like `AsgnResourceLocUpdateEvent`) — **side effect: those events will no longer fire**
93
+ - Removes `<outputAssignments>` from screen fields → replaced with `storeOutputAutomatically=true` + an injected `<assignments>` node to preserve variable bindings
94
+ - Strips invalid `<inputParameters>`: `required`, `disabled`, `multiple`, `accept`, `helpText`, `placeholder` (none supported in DC; bake content into label text instead)
95
+ - Replaces `minimumDate`/`maximumDate` with `minDate`/`maxDate` on date fields
96
+ - Replaces `multiSelection` with `isMultiSelection` on Lookup fields
97
+ - Replaces `disabled`/`readOnly` with `isDisabled`/`isReadonly` (note lowercase `o`) on Lookup fields
98
+ - Replaces `recordIds` inputParameter with `recordIdCollection` on Lookup fields
99
+ - Removes `extensionName` from Repeater elements (only valid on nested fields inside a Repeater)
100
+ - Removes `min`/`max` inputParameters from `dcNumeric` fields (only valid on `dcCounter`)
101
+ - Fixes screen field references in downstream automation to use `{fieldName}.value` (DC accessor pattern)
102
+ - Removes `<defaultValue>` from `ComponentInstance` fields (DC uses `value` inputParameter instead)
103
+ - Removes `<dataType>` from `ComponentChoice` fields
104
+ - Removes dangling empty connectors left by restructuring
105
+ - Case-insensitive deduplication of `<variables>` — updates `isInput=true` on existing vars rather than adding duplicates
106
+ - Ensures required DC input variables: `recordId`, `parentRecordId`, `parentObjectType` (all String, `isInput=true`)
107
+ - Ensures required screen attributes: `allowFinish`, `showFooter`, `nextOrFinishButtonLabel`
108
+ - Reorders field child elements so all `<inputParameters>` are contiguous (fixes "Element inputParameters is duplicated" deploy error)
109
+ - Updates subflow `<flowName>` references to DC versions (appends `_DC` suffix; explicit overrides for known name mismatches)
110
+ - **Detects and warns** (does NOT auto-fix): Screen inside a loop — DC doesn't support screens in loops; requires Repeater redesign
111
+ - **Detects and warns** (does NOT auto-fix): `Range` slider fields — not valid in DataCaptureFlow; replace manually with `dcNumeric` or `dcCounter`
112
+ - **Detects and warns** (does NOT auto-fix): `isRequired=true` on fields behind a `visibilityRule` — required check fires even when field is hidden; mobile worker cannot proceed
113
+ - **Detects and warns** (does NOT auto-fix): complex formulas in `DisplayText` fields (`IF`, `CASE`, date math) — deploys fine but fails at mobile runtime
114
+
115
+ ---
116
+
117
+ # Functional equivalence after migration
118
+
119
+ **What is preserved exactly:**
120
+ - All record lookups, creates, updates, deletes (just reordered to comply with DC constraint)
121
+ - All decisions, loops, assignments
122
+ - All screen fields and their labels
123
+ - All choice sets (picklists, radio groups, checkboxes)
124
+ - All visibility rules
125
+ - All variable definitions (deduplicated)
126
+ - All subflow calls (references updated to DC names)
127
+
128
+ **What changes behaviorally:**
129
+ - **Lookup execution order**: Lookups hoisted before the first screen now run before the user sees the form. Most lookups load context data (Work Order details, parent records) and are unaffected. Lookups that filter on screen input values will run with empty inputs — transformer flags these in warnings.
130
+ - **Platform events removed**: Any `recordCreates` targeting event objects (e.g. `AsgnResourceLocUpdateEvent`) are removed. Real-time dispatcher/Gantt events that were fired mid-flow will no longer fire. If this matters, replace with an Apex trigger or a separate AutoLaunched flow triggered by the record update.
131
+ - **Confirmation screens**: If the original flow showed a confirmation screen *after* saving a record (Pattern A), the DC version shows it *before*. The data is still saved — the order of user experience changes.
132
+ - **Constants replaced**: Flow constants are removed (DC doesn't support them). Downstream references to constants may need to be replaced with hardcoded values or variables.