@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,278 @@
1
+ # Component Mapping Reference
2
+
3
+ Mapping from legacy Field Service Mobile (`FieldServiceMobile` process type) flow
4
+ components to Data Capture Flow (`DataCaptureFlow` process type) equivalents.
5
+
6
+ > **Source of truth.** The authoritative supported/unsupported decisions live in
7
+ > [`fsm-dc-capability-catalog.md`](./fsm-dc-capability-catalog.md) and its
8
+ > executable twin `scripts/fsm_dc_catalog.py`. This file is a human-readable
9
+ > companion; where the two ever disagree, the catalog wins.
10
+
11
+ ## Keyed on the real FSM vocabulary — not Lightning names
12
+
13
+ FSM Flow screen fields use the standard Flow `FlowScreenFieldType` enum:
14
+ `InputField`, `DropdownBox`, `RadioButtons`, `MultiSelectCheckboxes`,
15
+ `DisplayText`, `LargeTextArea`, `PasswordField`, `ComponentInstance`, …
16
+
17
+ A `lightning:*` / `forceContent:*` / `c:*` name is **not** a field type — it only
18
+ ever appears as the `<extensionName>` *inside* a `ComponentInstance` field. So
19
+ classification is always **`fieldType` first, `extensionName` second**. An earlier
20
+ version of this skill keyed its decisions off `lightning:input` /
21
+ `lightning:fileUpload` names; that was wrong and produced the two errors corrected
22
+ in the catalog (signature, file-upload). See W-23364461.
23
+
24
+ ## Class 1 — Direct mappings (clean FSM → DC path)
25
+
26
+ Keyed by the FSM `<fieldType>`; `InputField` is further resolved by its
27
+ `<dataType>`, and `ComponentInstance` by its `<extensionName>`.
28
+
29
+ | FSM `<fieldType>` | Discriminator | Data Capture | DC extension |
30
+ |---|---|---|---|
31
+ | `InputField` | dataType `String` | ShortText | `dcTextInput` |
32
+ | `InputField` | dataType `TextArea`/`LongTextArea` | LongText | `dcLongText` |
33
+ | `InputField` | dataType `Email` | Email | `dcEmail` |
34
+ | `InputField` | dataType `Phone` | Phone | `dcPhone` |
35
+ | `InputField` | dataType `Number`/`Double`/`Currency` | Numeric | `dcNumeric` |
36
+ | `InputField` | dataType `Date` | Date | `dcDate` |
37
+ | `InputField` | dataType `DateTime` | DateTime | `dcDateTime` |
38
+ | `InputField` | dataType `Boolean` | Checkbox | `dcCheckbox` — *(see discrepancy in catalog)* |
39
+ | `InputField` | dataType `Picklist` | Picklist | `dcPicklist` |
40
+ | `InputField` | dataType `MultiselectPicklist` | CheckboxGroup | `dcCbGroup` |
41
+ | `LargeTextArea` | — | LongText | `dcLongText` |
42
+ | `DropdownBox` | — | Picklist | `dcPicklist` |
43
+ | `RadioButtons` | — | Radio | `dcRbGroup` |
44
+ | `RadioButtonGroup` | — | Radio | `dcRbGroup` |
45
+ | `MultiSelectCheckboxes` | — | CheckboxGroup | `dcCbGroup` |
46
+ | `MultiSelectPicklist` | — | CheckboxGroup | `dcCbGroup` *(or `dcPicklist` multi-mode)* |
47
+ | `DisplayText` | — | DisplayText | *(pass-through; review formulas)* |
48
+ | `ComponentInstance` | ext `forceContent:fileUpload` | UploadFile | `dcUpFile` |
49
+ | `ComponentInstance` | ext `forceContent:imageUpload` | UploadImage | `dcUpImage` |
50
+ | `ComponentInstance` | ext already `runtime_service_fieldservice:dc*` | *(pass-through, cleaned)* | — |
51
+
52
+ `DisplayText` is the only field type valid in **both** flow types.
53
+ `forceContent:fileUpload` is the **only** screen extension core allows inside an
54
+ FSM flow (per `FieldServiceMobileFlowValidator`).
55
+
56
+ ## Class 2 — No DC equivalent (flag, never silently drop)
57
+
58
+ These FSM field types have nothing on the DC side and cannot auto-migrate. The
59
+ analyzer flags each in its Data Capture Gap Report.
60
+
61
+ | FSM `<fieldType>` | Reason | Recommended approach |
62
+ |---|---|---|
63
+ | `PasswordField` | No DC password component | Capture as `dcTextInput` only if non-secret, else drop |
64
+ | `DisplayRichText` | No DC rich-text display | Downgrade to `DisplayText`; rich formatting lost |
65
+ | `PlainButtons` | **Capability gap** — DC has no action buttons | Remove or redesign; no migration path |
66
+ | `ComponentInstance` w/ any custom ext (`c:*`, or `lightning:*` other than the whitelisted `forceContent:fileUpload`) | DC has no custom-component extension point | Rebuild with a native `dc*` component or flag as unmigratable |
67
+
68
+ Multi-select choice types (`MultiSelectPicklist`, `MultiSelectCheckboxes`) and
69
+ `RadioButtonGroup` are **not** gaps — they map to DC via `ComponentMultiChoice` /
70
+ `ComponentChoice` (see Class 1). DC has no *single* component covering both single-
71
+ and multi-select, but `dcPicklist` covers both modes and `dcCbGroup` covers multi.
72
+
73
+ ## Class 3 — DC-only components (no FSM source produces them)
74
+
75
+ These exist only in Data Capture; **nothing in a source FSM flow migrates into
76
+ them**, so the converter never emits them from a migration.
77
+
78
+ | DC component | Notes |
79
+ |---|---|
80
+ | `dcSignature` | Signature capture — **FSM has no signature component** (see correction below) |
81
+ | `dcEmail` / `dcPhone` / `dcName` | Dedicated inputs (FSM approximates via `InputField`) |
82
+ | `dcAddress` | Address input (optional GPS) |
83
+ | `dcLookup` | Record lookup |
84
+ | `dcMatrix` | Matrix / grid input |
85
+ | `dcCounter` | Numeric stepper |
86
+ | `dcCheckbox` | Single checkbox — distinct from Boolean/Toggle (see discrepancy in catalog) |
87
+ | `dcFileView` | Read-only file/image viewer (requires `fileName`) |
88
+ | `dcUpImage` | Image upload (dedicated component) |
89
+ | `Region` / `RegionContainer` / `Repeater` / `ObjectProvided` | Layout/structural — FSM disallows |
90
+
91
+ > **`dcImages` does not exist.** Image upload is `dcUpImage`; the read-only
92
+ > file/image viewer is `dcFileView`.
93
+
94
+ ### Correction: Signature is DC-only (WI-3 reversal)
95
+
96
+ An earlier decision (WI-3 / W-23364096) recorded that file-upload **and
97
+ signature** were supported FSM → DC migration targets. Core disproves the
98
+ signature half: `FieldServiceMobileFlowValidator` whitelists exactly one screen
99
+ extension — `forceContent:fileUpload` — and there is **no** native FSM signature
100
+ component anywhere in the FSM path. `dcSignature` is DataCaptureFlow-only. There
101
+ is no FSM signature source to migrate *from*, so the skill emits no `dcSignature`
102
+ and the downstream signature-emission task (WI-7 / W-23364093) is reverted. The
103
+ file-upload half of WI-3 stands, but keyed on `forceContent:fileUpload → dcUpFile`,
104
+ never `lightning:fileUpload`.
105
+
106
+ ## Automation element mapping
107
+
108
+ | Legacy element | Data Capture | Notes |
109
+ |---|---|---|
110
+ | Record Lookup | `<recordLookups>` | Direct map; verify offline behavior |
111
+ | Record Create | `<recordCreates>` | Must follow the last screen (CUD-at-end) |
112
+ | Record Update | `<recordUpdates>` | Must follow the last screen (CUD-at-end) |
113
+ | Record Delete | `<recordDeletes>` | Must follow the last screen (CUD-at-end) |
114
+ | Decision | `<decisions>` | Direct map; review cross-screen routing |
115
+ | Loop | `<loops>` | Direct map |
116
+ | Assignment | `<assignments>` | Direct map |
117
+ | Action Call (Apex) | **BLOCKER** | DC forbids `<actionCalls>`/Apex; only `AGX_FLOW` actions. Convert to record lookups |
118
+ | Subflow Call | **BLOCKER** | DC can only call other DC flows and subflows cannot contain CUD; inline or convert |
119
+ | Formula | `<assignments>` or Decision | Limited DisplayText formula support at DC runtime; pre-calculate |
120
+ | Fault path | **Not supported** | Fault connectors stripped; `$Flow.FaultMessage` blocked |
121
+
122
+ These are the capability-level gaps returned by
123
+ `fsm_dc_catalog.capability_gaps()` and surfaced per-flow by `analyze_flow.py`.
124
+
125
+ ## Visibility rules
126
+
127
+ | Legacy pattern | Data Capture | Migration notes |
128
+ |---|---|---|
129
+ | Simple field visibility | `<visibilityRule>` | Direct map; same XML structure |
130
+ | Complex formula visibility | `<visibilityRule>` | Review formula; DC runtime support is limited |
131
+ | Cross-screen visibility | Not directly supported | Redesign with decision-based routing |
132
+
133
+ ## Choice set patterns
134
+
135
+ ### Legacy: picklist with static choices
136
+
137
+ ```xml
138
+ <choices>
139
+ <name>choice_Yes</name>
140
+ <choiceText>Yes</choiceText>
141
+ <dataType>String</dataType>
142
+ <value><stringValue>Yes</stringValue></value>
143
+ </choices>
144
+ ```
145
+
146
+ ### Data Capture equivalent
147
+
148
+ In spec JSON:
149
+ ```json
150
+ {
151
+ "fieldType": "Picklist",
152
+ "choices": ["Yes", "No", "Maybe"]
153
+ }
154
+ ```
155
+
156
+ Converter auto-generates `<choices>` blocks with deduplication.
157
+
158
+ ### Legacy: dynamic choice set (record-backed)
159
+
160
+ ```xml
161
+ <dynamicChoiceSets>
162
+ <name>AssetChoices</name>
163
+ <object>Asset</object>
164
+ <displayField>Name</displayField>
165
+ <valueField>Id</valueField>
166
+ </dynamicChoiceSets>
167
+ ```
168
+
169
+ Data Capture supports `dynamicChoiceSets` with the same structure. Converter
170
+ preserves these but flags for offline-priming verification.
171
+
172
+ ## Input parameter mapping
173
+
174
+ | Legacy parameter | DC parameter | Notes |
175
+ |---|---|---|
176
+ | `label` | `label` | Direct map for ComponentInstance fields |
177
+ | `required` | Field-level `<isRequired>` | Moved from parameter to field attribute |
178
+ | `placeholder` | *(not supported)* | Bake into label text |
179
+ | `disabled` / `readOnly` | `isDisabled` / `isReadonly` | Available on some DC components |
180
+ | `helpText` | *(not supported)* | Bake into label or use DisplayText |
181
+ | `min` / `max` (Counter) | `min` / `max` | Direct map for `dcCounter` |
182
+ | `minDate` / `maxDate` | `minDate` / `maxDate` | Direct map for `dcDate` / `dcDateTime` |
183
+
184
+ ## Common migration pitfalls
185
+
186
+ ### 1. Apex dependency
187
+
188
+ **Legacy:** Flow calls Apex to compute pricing, validate inventory, etc.
189
+ **Migration:** DC flows are offline-first and cannot call Apex at runtime.
190
+ **Fix:** Convert Apex logic to record lookups, or gate the flow behind an online detector and degrade gracefully.
191
+
192
+ ### 2. AutoLaunched subflows
193
+
194
+ **Legacy:** Flow calls an AutoLaunched subflow for reusable logic.
195
+ **Migration:** DC can only call other DC flows (`processType=DataCaptureFlow`), and subflows cannot contain CUD.
196
+ **Fix:** Inline the subflow logic or convert the subflow to DC format.
197
+
198
+ ### 3. Cross-screen formula references
199
+
200
+ **Legacy:** Screen 3's DisplayText references fields from Screen 1 via formula.
201
+ **Migration:** DC has limited formula support in DisplayText.
202
+ **Fix:** Use `<assignments>` between screens to pre-calculate values into variables.
203
+
204
+ ### 4. Custom components (`ComponentInstance`)
205
+
206
+ **Legacy:** Custom LWC (`c:*`) or non-whitelisted `lightning:*` component embedded in a `ComponentInstance` field.
207
+ **Migration:** No custom component extension points in DC.
208
+ **Fix:** Rebuild with native DC components or flag as incompatible.
209
+
210
+ ### 5. Action buttons (`PlainButtons`)
211
+
212
+ **Legacy:** `PlainButtons` field drives in-screen navigation or actions.
213
+ **Migration:** DC has no user-facing action buttons (only `AGX_FLOW`).
214
+ **Fix:** Redesign the interaction; there is no direct migration path.
215
+
216
+ ## Validation checklist
217
+
218
+ After migration, verify:
219
+
220
+ - [ ] All screens render
221
+ - [ ] All field types display correctly
222
+ - [ ] Required validation fires
223
+ - [ ] Conditional visibility works
224
+ - [ ] Choices populate (picklists, radios, checkboxes)
225
+ - [ ] Lookups search the correct object
226
+ - [ ] File-upload components accept input
227
+ - [ ] Record creates/updates succeed
228
+ - [ ] Loops iterate correctly
229
+ - [ ] Decisions route to correct next steps
230
+ - [ ] Offline behavior: drafts queue when airplane mode on
231
+ - [ ] Form appears in FSL Mobile "Forms" tab
232
+
233
+ ## Conversion confidence levels
234
+
235
+ ### GREEN (high confidence, automated)
236
+
237
+ - Simple data-entry forms
238
+ - Standard `InputField` types (text, number, date, boolean)
239
+ - Static picklists (`DropdownBox`) and radio groups (`RadioButtons`)
240
+ - File upload via `forceContent:fileUpload`
241
+ - Single record create at end
242
+ - No Apex, no custom components
243
+
244
+ ### YELLOW (medium confidence, requires review)
245
+
246
+ - Visibility rules with formulas
247
+ - Decision-based routing
248
+ - Dynamic choice sets (requires offline-priming verification)
249
+ - Record updates with conditional logic
250
+ - `MultiSelectPicklist` / `RadioButtonGroup` rebuilt as `dcCbGroup` / `dcRbGroup`
251
+
252
+ ### RED (low confidence, manual redesign)
253
+
254
+ - Custom `ComponentInstance` components (`c:*`, non-whitelisted `lightning:*`)
255
+ - `PlainButtons` action buttons
256
+ - Apex callouts
257
+ - AutoLaunched subflows
258
+ - Complex nested decisions
259
+ - Cross-screen formula dependencies in DisplayText
260
+ - `DisplayRichText`
261
+
262
+ ## Testing strategy
263
+
264
+ 1. **Desktop first:** Open migrated flow via `<instanceUrl>/flow/<FlowApiName>_v2`, complete the form end-to-end
265
+ 2. **Offline priming:** Verify Briefcase includes all objects/fields the flow touches
266
+ 3. **Mobile render:** Attach to a test record, open on FSL Mobile device
267
+ 4. **Offline mode:** Airplane mode + complete form + verify draft queues
268
+ 5. **Data integrity:** Compare output records from legacy vs. migrated flow
269
+ 6. **Edge cases:** Test all branches, visibility conditions, validation rules
270
+
271
+ ## Rollback procedure
272
+
273
+ If migrated flow has issues:
274
+
275
+ 1. Keep legacy flow active (don't deactivate)
276
+ 2. Remove `DynamicDataCapture` attachment for migrated flow
277
+ 3. Iterate on spec, rebuild, redeploy as `_v3`, `_v4`, etc.
278
+ 4. Once validated, deactivate legacy flow and clean up test versions
@@ -0,0 +1,183 @@
1
+ # Converter → Builder integration contract
2
+
3
+ This is the authoritative contract between the two scripts that form the
4
+ migration pipeline:
5
+
6
+ ```text
7
+ legacy Digital Forms XML
8
+ └─▶ scripts/convert_to_dc_spec.py (producer)
9
+ └─▶ spec JSON
10
+ └─▶ scripts/vendor/build_flow.py (consumer)
11
+ └─▶ .flow-meta.xml (DataCaptureFlow)
12
+ ```
13
+
14
+ Before `collapse_gating_decisions`, the converter runs `normalize_inverted_gates`,
15
+ which rewrites inverted-shape gates (default branch shows the gated field) into
16
+ equivalent positive gates by negating the rule condition and swapping connectors.
17
+ Collapse then handles them unchanged (field or section). Inverted gates whose
18
+ condition uses a non-invertible operator or custom logic are left flagged (see the
19
+ capability catalog).
20
+
21
+ `build_flow.py` (`parse_spec`) is the source of truth for the JSON shape.
22
+ `convert_to_dc_spec.py` MUST emit exactly this shape.
23
+
24
+ > **History:** an earlier converter emitted `screens` as a *list* of
25
+ > `{title, fields:[{name, label, fieldType, required, choices}]}`, while the
26
+ > builder consumes `screens` as a *dict* of `{ScreenName: [{fieldName,
27
+ > fieldLabel, isRequired, options, visibility}]}`. Piping one into the other
28
+ > raised `ValueError: spec must have a non-empty 'screens' object` and produced
29
+ > no output. This doc + the smoke test exist to prevent that regression.
30
+
31
+ ## Top-level spec object
32
+
33
+ | Key | Type | Required | Notes |
34
+ |-----|------|----------|-------|
35
+ | `formTitle` | string | yes | Flow label / interview label. |
36
+ | `formType` | string | no | Free text; converter sets `"DataCaptureFlow"`. |
37
+ | `screens` | **object (dict)** | yes | Keyed by screen name → list of field objects. Must be non-empty. |
38
+ | `decisions` | list | no | Pre-CUD screen-routing decisions. Each: `{name, label, defaultConnector, defaultLabel, rules:[{name, label, conditionLogic, conditions:[{leftValueReference, operator, rightValue}], connectsTo}]}`. Emitted by the converter (WI-6a) **only when the decision passes the deployability gate** — every target resolves to an element 6a actually builds (another surviving decision) AND the decision is reachable from a screen connector. Decisions that fail either bar are routed to `_decisionFlags`, never emitted, so no `<decisions>` element ever carries a dangling `<targetReference>`. |
39
+ | `_screenConnectors` | object | no | `{screen_key: target_api_name}` — a source screen's outgoing connector, **filtered to targets that are emitted decisions**. Connectors whose target is not an emitted decision are dropped so the screen falls through sequentially rather than dangling. Full connector-graph wiring to renamed `Screen_` api-names and to assignments/lookups is deferred to WI-6b/6c. |
40
+ | `_decisionFlags` | list | no | `{name, reason}` for **decisions** the routing gate did not emit. Two reason families: (1) **Decision→CUD** — routes directly to a CUD element (forbidden by the CUD-at-end rule); (2) **target not yet wired** — routes to screens/assignments/lookups 6a does not build, or is unreachable — deferred to WI-6b/6c. Decision-routing only; structural ceilings live in `_ceilingFlags`. Migration annotation only. |
41
+ | `_ceilingFlags` | list | no | `{name, reason}` for **structural** DC deploy-time ceilings the converter cannot translate (WI-7), in document order: (1) any element reachable only after a CUD node (CUD-at-end rule); (2) any element carrying a `<faultConnector>`; (3) any `<loops>`. Kept SEPARATE from `_decisionFlags` because the same element name can legitimately appear in both surfaces (a decision that is both unwired and post-CUD), so a single name-keyed list would collide. Migration annotation only. |
42
+ | `_cudAnalysis` | object | no | WI-8 ordinal CUD-placement analysis. `{consolidated:[{node,op,from,to}], manualRestructure:[{node,op,position,reason,blockers}], hasMidFlowCud:bool}`. Present only when the flow has ≥1 CUD element. `consolidated` lists safe record-creates the converter moved to `postScreen`; `manualRestructure` lists CUD needing hand-restructuring (unsafe, or safe update/delete with no `postScreen` emission path). Migration annotation only. |
43
+ | `_collapsedDecisions` | list | no | `{decision, field?, section?, fields?, clearedRequired?}` for gates the converter collapsed into visibility. Field-level collapses (WI-6b) populate `field`; section-level collapses (WI-6c) populate `section` and `fields` (the list of field api-names the section contained) and `clearedRequired` (field names whose required flag was unset because they became conditionally visible). Migration annotation only. |
44
+ | `_incompleteMigration` | list | no | Unsupported elements from the source flow that have no Data Capture equivalent. Each: `{type, name, reason}` where `type ∈ {apex, subflow, faultPath, customComponent, unknownField}`. Present **only when** the source flow has ≥1 unsupported element; the key is omitted entirely (not emitted as an empty list) for clean flows. Ordering: flow-level (`apex`, `subflow`, `faultPath`) in document order, then field-level (`customComponent`, `unknownField`) in screen/field document order — deterministic. See "Incomplete Migration Marker" section below. |
45
+ | `postScreen` | object | no | End-of-flow automation (decisions/lookups/loop/creates). As of WI-8, `_automationNote` fires only when mid-flow CUD is detected and its body is ordering-based (points at `_cudAnalysis`); the former count-based note is removed. Safe record-creates are emitted into `postScreen.recordCreates`. |
46
+ | `_migrationSummary` | list of strings | no | Human-readable rollup, one line per migration action: section/field collapses, cleared-required fields (WI-6c), and WI-7 ceiling flags (post-CUD / fault / loop). The human-facing mirror of the machine keys `_collapsedDecisions` and `_ceilingFlags`. Only present when at least one action occurred. Migration annotation only. |
47
+
48
+ Any key beginning with `_` (e.g. `_automationNote`, `_migrationNote`, `_incompleteMigration`, `_screenConnectors`, `_decisionFlags`) is a
49
+ migration annotation. As of WI-8, `_automationNote` fires only when mid-flow CUD is detected and its body is ordering-based (points at `_cudAnalysis`); the former count-based note is removed. Safe record-creates are emitted into `postScreen.recordCreates`. The builder ignores unknown keys, so annotations pass
50
+ through harmlessly.
51
+
52
+ ## `screens` — dict, not list
53
+
54
+ - **Key**: the screen name/label as a string (e.g. `"Asset Details"`). It does
55
+ not need to be pre-sanitized — the builder derives the display label via
56
+ `humanize_screen_key` and produces the screen api-name by running the key
57
+ through `coerce_api_name` with a `Screen_` prefix (so `"Asset Details"` →
58
+ api-name `Screen_Asset_Details`, label "Asset Details"). Keys must be unique
59
+ within the `screens` dict.
60
+ - **Value**: a **non-empty** list of field objects or **section-sentinel dicts**. The builder raises if any
61
+ screen maps to an empty list, so the converter drops screens that yield no
62
+ convertible fields rather than emit an empty one. Section-sentinels (WI-6c) are expressed as `{"section": label, "visibility"?: {...}, "fields": [...]}` for self-contained / nestable sections, or `{"section": label}` (no `fields` key) for legacy inline openers.
63
+
64
+ ## Field object
65
+
66
+ | Key | Type | Required | Emitted by converter | Notes |
67
+ |-----|------|----------|----------------------|-------|
68
+ | `fieldName` | string | yes | yes | Source field api-name. Builder re-sanitizes and uniquifies it. |
69
+ | `fieldLabel` | string | yes | yes | Display label. |
70
+ | `fieldType` | string | yes | yes | One of the builder's `TYPE_MAP` keys (see below). Unknown types fall back to `ShortText` with a `[Unknown type: X]` label prefix. |
71
+ | `isRequired` | bool | yes | yes | Coerced with `bool()` by the builder. |
72
+ | `options` | list[string] | for choice types | when choices present | Choice display values for `Picklist` / `Radio` / `CheckboxGroup` / `Matrix`. |
73
+ | `visibility` | object | no | yes (6b/6c) | `{ field, operator, value }`; `field` must reference a choice field, `value` one of its options. Field-level visibility collapse delivered in WI-6b. A `visibility` key on a **section sentinel** (WI-6c) gates the entire section (builder emits a `<visibilityRule>` on the `RegionContainer` field). Note: legacy FSM has no component-level visibility — all conditionality arrives via the top-level `decisions` list (decision routing delivered in WI-6a). |
74
+ | `defaultValue` | string/number/bool | no | not yet | Pre-fill / DisplayText body. |
75
+ | `_migrationNote` | string | no | yes (when needed) | Migration annotation; ignored by builder. |
76
+
77
+ Repeater/Matrix/Counter/Lookup/FileView carry extra keys (`repeaterFields`,
78
+ `matrixRows`, `min`/`max`/`value`, `lookupObject`, `fileName`) — see
79
+ `build-data-capture-form/reference/field-types.md`. The converter does not emit
80
+ these yet.
81
+
82
+ ### Sections & nesting
83
+
84
+ Sections (WI-6c) are expressed as **section-sentinel dicts** within a screen's field list. Two forms exist:
85
+
86
+ - **Self-contained / nestable**: `{"section": label, "visibility"?: {...}, "fields": [...]}` — the `fields` array contains the section's child fields (and may itself contain nested section sentinels, up to `MAX_SECTION_DEPTH = 5`). The builder emits a `RegionContainer` field wrapping the children. If `visibility` is present, the builder emits a `<visibilityRule>` on the `RegionContainer`.
87
+ - **Legacy inline opener**: `{"section": label}` (no `fields` key) — the legacy converter emitted this form; it opens a section that extends to the next section sentinel or end-of-screen. Not nested. The current converter (WI-6c) emits only the self-contained form.
88
+
89
+ **Cascade rule**: each section carries only its own `visibility` conditions. The Data Capture runtime auto-hides children when a parent section is hidden, so the converter does not need to propagate parent conditions downward into child field visibility rules.
90
+
91
+ ## Decision conditions
92
+
93
+ Each decision in the top-level `decisions` list contains `rules`, and each rule contains `conditions`. Condition structure:
94
+
95
+ | Key | Type | Notes |
96
+ |-----|------|-------|
97
+ | `leftValueReference` | string | Field api-name or merge-field reference. |
98
+ | `operator` | string | Flow operator (e.g. `EqualTo`, `NotEqualTo`, `IsNull`, `GreaterThan`). Defaults to `EqualTo` if omitted. |
99
+ | `rightValue` | object | Typed single-key dict: one of `{booleanValue: bool}`, `{numberValue: float}`, `{stringValue: string}`, or `{elementReference: string}`. May be omitted for null-check operators. |
100
+
101
+ The `conditionLogic` field (string) is copied verbatim from the source Flow decision, including custom logic strings like `3 and (1 OR 2) and 4`. Defaults to `"and"` if omitted.
102
+
103
+ ## Field-type vocabulary
104
+
105
+ `fieldType` values MUST be keys in `build_flow.py`'s `TYPE_MAP`. As of this
106
+ writing:
107
+
108
+ ```text
109
+ ShortText, LongText, Name, Email, Phone, Numeric, Counter, Date, DateTime,
110
+ Checkbox, Toggle, Picklist, Radio, CheckboxGroup, DisplayText, Repeater,
111
+ Signature, UploadFile, UploadImage, Address, Matrix, Images, Lookup, FileView
112
+ ```
113
+
114
+ The converter maps legacy `extensionName`s to a subset of these (see
115
+ `reference/component-mapping.md`). Any legacy component with no mapping is
116
+ emitted as `ShortText` with a `_migrationNote`.
117
+
118
+ ## Renamed keys (legacy converter → current contract)
119
+
120
+ If you are updating older code or docs, these are the renames that closed the
121
+ contract gap:
122
+
123
+ | Old converter key | Current contract key |
124
+ |-------------------|----------------------|
125
+ | `screens` (list) | `screens` (dict, keyed by screen name) |
126
+ | screen `title` | (dropped — label derived from the dict key) |
127
+ | screen `fields` | (dropped — the dict value *is* the field list) |
128
+ | `name` | `fieldName` |
129
+ | `label` | `fieldLabel` |
130
+ | `required` | `isRequired` |
131
+ | `choices` | `options` |
132
+
133
+ ## Incomplete Migration Marker
134
+
135
+ When the converter encounters source flow elements that have no Data Capture equivalent, it emits `_incompleteMigration`: a top-level list of `{type, name, reason}` dictionaries. This key is present **only when** the source flow has ≥1 unsupported element; it is omitted entirely (not emitted as an empty list) for clean flows.
136
+
137
+ ### Type vocabulary
138
+
139
+ `type` is a closed set with exactly five values:
140
+
141
+ | Type | Meaning | Example |
142
+ |------|---------|---------|
143
+ | `apex` | Apex action call or invocable action | EmailAlert, Apex class invocation |
144
+ | `subflow` | Subflow invocation | DataCaptureFlow can call other DC subflows, but this flags manual review |
145
+ | `faultPath` | Fault connector (error path) | DC has no fault paths; error handling is stripped |
146
+ | `customComponent` | Custom Lightning component in a field slot | Non-runtime_service_fieldservice component |
147
+ | `unknownField` | Field with no recognized type mapping | Unrecognized extensionName or fieldType |
148
+
149
+ ### Ordering
150
+
151
+ The list is deterministic:
152
+ 1. **Flow-level** (`apex`, `subflow`, `faultPath`) in source-document order (from `detect_unsupported_elements`)
153
+ 2. **Field-level** (`customComponent`, `unknownField`) in screen/field document order (collected during the screen loop)
154
+
155
+ ### Builder behavior
156
+
157
+ `build_flow.py` reads `_incompleteMigration` via `parse_spec` into `FormSpec.incomplete_migration` (a list). When present and non-empty, `build_xml` renders ONE `<!-- INCOMPLETE MIGRATION ... -->` comment block between the `<?xml version="1.0"?>` declaration and the `<Flow>` opening tag. Each entry is formatted as:
158
+
159
+ ```text
160
+ - [type] name: reason
161
+ ```
162
+
163
+ If the key is absent, no comment is emitted. (In practice the converter omits the key rather than emitting an empty list, but the builder tolerates an empty list too.)
164
+
165
+ ### Coexistence with other annotations
166
+
167
+ `_incompleteMigration` coexists with `_subflowNote`, `_automationNote`, and per-field `_migrationNote`. These annotations were **not consolidated** — each serves a distinct purpose:
168
+ - `_incompleteMigration`: top-level spec key listing all unsupported elements → XML comment block
169
+ - `_subflowNote` / `_automationNote`: converter stdout warnings about CUD/subflow review needs
170
+ - `_migrationNote`: per-field note embedded in the spec field dict (not promoted to `_incompleteMigration` unless the field is also unsupported)
171
+
172
+ A subflow is intentionally surfaced by **both** mechanisms: it is flagged in `_incompleteMigration` (type `subflow`) **and** may still trigger a `_subflowNote` stdout warning. The two are independent and were deliberately left un-deduplicated (consolidation is out of scope for WI-7).
173
+
174
+ ### Unsupported field placeholder behavior
175
+
176
+ Unsupported field slots (those with `meta['unsupported'] = True`) are emitted as **read-only `DisplayText` placeholders** with the `fieldLabel` set to `[UNSUPPORTED: <fieldName> — <reason>]` (em-dash U+2014 separator). They are NOT emitted as silent `ShortText` inputs (the WI-7 silent-downgrade behavior was removed). The placeholder ensures the unsupported field is visible in the built XML and flagged for manual attention.
177
+
178
+ ## Verifying the contract
179
+
180
+ Run `scripts/convert_to_dc_spec.py` against `assets/sample-legacy-flow.flow-meta.xml`, then
181
+ `scripts/vendor/build_flow.py` against the resulting spec, and confirm the output XML has a
182
+ non-empty `screens` section. If it fails, the converter output and builder input have drifted —
183
+ reconcile against `build_flow.parse_spec`, which remains the source of truth.
@@ -0,0 +1,130 @@
1
+ # DC platform rules reference
2
+
3
+ These rules govern any valid DataCaptureFlow. The transformer enforces them automatically. This section is the authoritative reference for debugging deploy errors or validating migrated flows manually.
4
+
5
+ ## Required flow headers
6
+
7
+ ```xml
8
+ <processType>DataCaptureFlow</processType>
9
+ <areMetricsLoggedToDataCloud>false</areMetricsLoggedToDataCloud>
10
+ <environments>Offline</environments>
11
+ <!-- NO <apiVersion> tag — causes: "You can't specify the field API Version" -->
12
+ ```
13
+
14
+ ## Required input variables (platform launch contract)
15
+
16
+ SFS Mobile passes these on launch — every DataCaptureFlow must declare them:
17
+ ```xml
18
+ <variables><name>recordId</name><dataType>String</dataType><isInput>true</isInput>...</variables>
19
+ <variables><name>parentRecordId</name><dataType>String</dataType><isInput>true</isInput>...</variables>
20
+ <variables><name>parentObjectType</name><dataType>String</dataType><isInput>true</isInput>...</variables>
21
+ ```
22
+
23
+ ## Flow structure rules
24
+
25
+ | Rule | Detail |
26
+ |---|---|
27
+ | First element after `<start>` | **Must be a `<screens>` element** — connecting `<start>` directly to recordLookups or decisions causes mobile offline rendering failure |
28
+ | DML placement | Create, Update, Delete MUST be at the END of the flow |
29
+ | Screens after DML | NOT allowed |
30
+ | Decision between sequential CUD nodes | A Decision CAN route to which CUD chain starts; once a CUD chain begins, no Decision may appear between sequential CUD nodes |
31
+ | Subflows (CUD) | Subflows CANNOT contain Create, Update, or Delete operations |
32
+ | Subflows (type) | Can only call another DataCaptureFlow — calling an AutoLaunched subflow is blocked |
33
+ | `<actionCalls>` | Not allowed in DataCaptureFlow |
34
+ | Fault connectors | Not supported — must be stripped |
35
+ | XML element grouping | All elements of the same type must appear in a contiguous block — mixing them causes "Element X is duplicated" deploy error |
36
+
37
+ ## Visibility rule accessor suffixes
38
+
39
+ ```xml
40
+ <leftValueReference>componentName.SUFFIX</leftValueReference>
41
+ ```
42
+
43
+ | Component type | Suffix |
44
+ |---|---|
45
+ | Input components (`dcTextInput`, `dcNumeric`, `dcCheckbox`, `dcDate`, etc.) | `.value` |
46
+ | Choice components (`dcPicklist`, `dcRbGroup`, `dcCbGroup`) | `.selectedChoiceValues` |
47
+ | Toggle (`dcToggle`) | `.isActive` |
48
+ | Name component (`dcName`) | `.firstName` / `.lastName` |
49
+ | Lookup single select (`dcLookup`) | `.recordId` |
50
+ | Lookup multi-select (`dcLookup` with `isMultiSelection=true`) | `.recordIds` |
51
+
52
+ ## Decision IsNull canonical pattern
53
+
54
+ `IsNull` uses a `booleanValue` on the right — NOT a null literal:
55
+ ```xml
56
+ <conditions>
57
+ <leftValueReference>v_ParentId</leftValueReference>
58
+ <operator>IsNull</operator>
59
+ <rightValue><booleanValue>false</booleanValue></rightValue>
60
+ <!-- false = "is not null"; true = "is null" -->
61
+ </conditions>
62
+ ```
63
+
64
+ ## Calculation timing (critical)
65
+
66
+ Calculated values **cannot display on the same screen that collects the inputs** — calculations run only after the user taps Next.
67
+
68
+ Required pattern:
69
+ ```text
70
+ Screen N (collect inputs) → Assignment / recordLookups / decisions → Screen N+1 (display results)
71
+ ```
72
+
73
+ Screen N's connector must point to the calculation element, NOT directly to Screen N+1.
74
+
75
+ ## DisplayText formula limitations
76
+
77
+ `DisplayText` has severely limited formula support at mobile runtime. Complex formulas deploy and preview in Flow Builder but **fail at runtime** with `Error while resolving default value reference`.
78
+
79
+ | Pattern | Works in DC DisplayText? |
80
+ |---|---|
81
+ | Simple variable reference: `{!var_RiskScore}` | Yes |
82
+ | Component ref: `{!MyPicklist.selectedChoiceValues}` | Yes |
83
+ | Global vars: `{!$Flow.CurrentDate}`, `{!$User.FirstName}` | Yes |
84
+ | `IF(Toggle.isActive, "YES", "NO")` | No — fails at mobile runtime |
85
+ | `TEXT(CASE(...))`, `ADDMONTHS(...)`, nested date math | No — fails at mobile runtime |
86
+ | Mixing multiple component refs + formulas in one `fieldText` | No — fails at mobile runtime |
87
+
88
+ **Pattern**: pre-calculate in an `<assignments>` element → store in a variable → reference that variable in DisplayText.
89
+
90
+ ## `isRequired=true` behind a `visibilityRule`
91
+
92
+ **Never** mark a field `isRequired=true` if it is behind a `visibilityRule`. The required check fires even while the field is hidden — the mobile worker cannot proceed.
93
+
94
+ Set `isRequired=false` and add a `validationRule` instead:
95
+ ```text
96
+ IF(TriggerField.isActive, AND(NOT(ISBLANK(value)), value >= 0), TRUE)
97
+ ```
98
+
99
+ ## Lookup component specifics
100
+
101
+ | Property | Behaviour |
102
+ |---|---|
103
+ | Display label in results | Driven by the object's **Primary Compact Layout** — first field in that layout. To change: Setup → Compact Layouts → reorder → assign as Primary. No `displayField` inputParameter exists. |
104
+ | Multi-select | Set `isMultiSelection=true`; output is `{!Lookup.recordIds}` (collection) |
105
+ | Scoping filter | Use `recordIdCollection` (not `recordIds`) — only effective when `isMultiSelection=true`; silently ignored in single-select |
106
+ | Attribute names | `isDisabled` and `isReadonly` (lowercase `o`) — `disabled`/`readOnly` cause deploy errors |
107
+
108
+ ## Repeater specifics
109
+
110
+ - Output collection: **`.AllItems` only** (confirmed API v66) — `AddedItems`, `PrepopulatedItems`, `RemovedItems` all cause deploy errors
111
+ - Loop body references: use `Loop_Name.fieldName.value` (the loop variable's name), NOT `Repeater_Name.fieldName.value`
112
+ - Prepopulate: bind an existing SObject collection via the `collection` inputParameter
113
+ - Inside nested fields: reference source rows via `SourceCollection[$EachItem].FieldApiName` — `$EachItem` only resolves inside Repeater-nested fields; downstream loops still iterate `Repeater_Name.AllItems` normally
114
+ - The Repeater itself must NOT have `storeOutputAutomatically` — causes deploy error; only nested fields inside the Repeater get it
115
+
116
+ ## Global variable allowlist
117
+
118
+ Only these global variables are supported in DataCaptureFlow (all others blocked):
119
+
120
+ - `$Api`, `$Label`, `$Organization`, `$Profile`, `$System`, `$User`, `$UserRole`
121
+ - `$Flow.CurrentDate`, `$Flow.CurrentDateTime`, `$Flow.InterviewStartTime`, `$Flow.InterviewGuid`
122
+
123
+ Input default binding behavior:
124
+
125
+ | Default binding | Component | Works? |
126
+ |---|---|---|
127
+ | `$User.Username` | `dcTextInput` | Yes |
128
+ | `$User.Name` | `dcTextInput` | No — type mismatch, use `$User.Username` |
129
+ | `$Flow.InterviewStartTime` | `dcDateTime` | Yes |
130
+ | `$Flow.CurrentDate` | `dcDate` | Yes |