@salesforce/afv-skills 1.65.0 → 1.65.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skills/field-service-data-capture-form-deployer-configure/SKILL.md +2 -23
- package/skills/field-service-data-capture-form-designer-configure/SKILL.md +3 -13
- package/skills/field-service-mobile-branding-configure/SKILL.md +3 -17
- package/skills/field-service-objective-designer-configure/SKILL.md +379 -72
- package/skills/field-service-prework-brief-deployer-configure/SKILL.md +537 -10
- package/skills/field-service-scheduling-policy-designer-query/SKILL.md +1093 -65
- package/skills/field-service-sobject-create-configure/SKILL.md +213 -13
- package/skills/field-service-voice-to-form-configure/SKILL.md +11 -40
- package/skills/field-service-work-rule-designer-configure/SKILL.md +95 -121
- package/skills/agentforce-gpt-email-generation-configure/SKILL.md +0 -312
- package/skills/agentforce-wizard-ui-forecasting-analytics-components-configure/SKILL.md +0 -64
- package/skills/agentforce-wizard-ui-sales-einstein-components-configure/SKILL.md +0 -46
- package/skills/automation-company-profile-info-query/SKILL.md +0 -51
- package/skills/automation-digital-wallet-configure/SKILL.md +0 -689
- package/skills/automation-flow-coordinate/SKILL.md +0 -95
- package/skills/automation-flow-coordinate/references/elements/action-call/action-call.md +0 -1569
- package/skills/automation-flow-coordinate/references/elements/action-call/conversation-messaging.md +0 -96
- package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-sms-message.json +0 -23
- package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-to-journey-no-fields.json +0 -31
- package/skills/automation-flow-coordinate/references/elements/action-call/send-to-journey.md +0 -179
- package/skills/automation-flow-coordinate/references/elements/exit-rule/examples/event-email-link-click.json +0 -13
- package/skills/automation-flow-coordinate/references/elements/exit-rule/exit-rule.md +0 -83
- package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/examples/forward-to-bot-or-agent.json +0 -69
- package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/forward-to-bot-or-agent.md +0 -274
- package/skills/automation-flow-coordinate/references/elements/start/audience-common.md +0 -192
- package/skills/automation-flow-coordinate/references/elements/start/automation-event-triggered.md +0 -130
- package/skills/automation-flow-coordinate/references/elements/start/data-cloud-data-change-triggered.md +0 -92
- package/skills/automation-flow-coordinate/references/elements/start/form-submission-triggered.md +0 -88
- package/skills/automation-flow-coordinate/references/elements/start/segment-triggered.md +0 -152
- package/skills/automation-flow-coordinate/references/elements/start/start.md +0 -539
- package/skills/automation-flow-coordinate/references/elements/subflow/subflow.md +0 -152
- package/skills/automation-flow-coordinate/references/elements/wait/wait.md +0 -497
- package/skills/automation-flow-coordinate/references/recipes/author/author.md +0 -868
- package/skills/automation-flow-coordinate/references/recipes/summarize/element-generic.md +0 -300
- package/skills/automation-flow-coordinate/references/recipes/summarize/reference-resolution.md +0 -292
- package/skills/automation-flow-coordinate/references/recipes/summarize/summarize.md +0 -323
- package/skills/automation-flow-coordinate/references/recipes/testing/examples/debug-output-template.md +0 -109
- package/skills/automation-flow-coordinate/references/recipes/testing/shape.md +0 -219
- package/skills/automation-flow-coordinate/references/recipes/testing/shared-stages/intent-analyzer.md +0 -180
- package/skills/automation-flow-coordinate/references/recipes/testing/workflows/debug.md +0 -175
- package/skills/automation-flow-coordinate/references/recipes/testing/workflows/promote.md +0 -255
- package/skills/automation-flow-coordinate/references/recipes/testing/workflows/save-debug.md +0 -212
- package/skills/automation-flow-coordinate/references/resources/variable/variable.md +0 -171
- package/skills/automation-flow-coordinate/references/shared/anti-patterns.md +0 -786
- package/skills/automation-flow-coordinate/references/shared/end/end.md +0 -267
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/README.md +0 -69
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/predictions.jsonl +0 -80
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/prompts.jsonl +0 -116
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/flow-type-resolver.md +0 -321
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/taxonomy.json +0 -320
- package/skills/automation-flow-coordinate/references/shared/server-functions.md +0 -597
- package/skills/automotive-cloud-appraisal-management-settings-configure/SKILL.md +0 -69
- package/skills/automotive-cloud-dealer-essentials-configure/SKILL.md +0 -78
- package/skills/automotive-cloud-ground-agent-data-pipelines-configure/SKILL.md +0 -373
- package/skills/automotive-cloud-ground-mfg-agent-data-pipelines-configure/SKILL.md +0 -273
- package/skills/automotive-cloud-mfg-agent-data-pipelines-configure/SKILL.md +0 -259
- package/skills/automotive-cloud-mfg-sales-concierge-agent-create/SKILL.md +0 -369
- package/skills/automotive-cloud-mfg-sales-concierge-foundation-configure/SKILL.md +0 -542
- package/skills/automotive-cloud-mfg-sales-concierge-foundation-coordinate/SKILL.md +0 -159
- package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-agent-create/SKILL.md +0 -349
- package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-configure/SKILL.md +0 -505
- package/skills/automotive-cloud-sales-concierge-agent-create/SKILL.md +0 -380
- package/skills/automotive-cloud-sales-concierge-foundation-configure/SKILL.md +0 -567
- package/skills/automotive-cloud-sales-concierge-foundation-coordinate/SKILL.md +0 -159
- package/skills/automotive-cloud-sales-concierge-orchestrator-agent-create/SKILL.md +0 -360
- package/skills/automotive-cloud-sales-concierge-orchestrator-configure/SKILL.md +0 -539
- package/skills/automotive-cloud-sales-concierge-search-grounding-configure/SKILL.md +0 -358
- package/skills/commerce-b2b-merchant-quote-configure/SKILL.md +0 -602
- package/skills/commerce-b2b-store-configure/SKILL.md +0 -251
- package/skills/commerce-credit-memo-create/SKILL.md +0 -139
- package/skills/commerce-delivery-business-hours-configure/SKILL.md +0 -277
- package/skills/commerce-delivery-estimation-apply/SKILL.md +0 -155
- package/skills/commerce-delivery-estimation-configure/SKILL.md +0 -377
- package/skills/commerce-delivery-routing-specs-integrate/SKILL.md +0 -174
- package/skills/commerce-estimate-bopis-query/SKILL.md +0 -279
- package/skills/commerce-estimate-delivery-date-query/SKILL.md +0 -349
- package/skills/commerce-fees-apply/SKILL.md +0 -227
- package/skills/commerce-fulfillment-routing-analyze/SKILL.md +0 -200
- package/skills/commerce-guest-buyer-create/SKILL.md +0 -173
- package/skills/commerce-location-bopis-configure/SKILL.md +0 -378
- package/skills/commerce-location-business-hours-configure/SKILL.md +0 -235
- package/skills/commerce-location-delivery-processing-time-configure/SKILL.md +0 -309
- package/skills/commerce-location-graph-integrate/SKILL.md +0 -131
- package/skills/commerce-location-shipping-carrier-method-configure/SKILL.md +0 -755
- package/skills/commerce-location-temporary-operating-hours-configure/SKILL.md +0 -331
- package/skills/commerce-merchant-buyer-groups-configure/SKILL.md +0 -579
- package/skills/commerce-merchant-buyer-user-onboarding-create/SKILL.md +0 -626
- package/skills/commerce-merchant-catalog-configure/SKILL.md +0 -614
- package/skills/commerce-merchant-extension-provider-configure/SKILL.md +0 -368
- package/skills/commerce-merchant-insights-account-health-churn-analyze/SKILL.md +0 -118
- package/skills/commerce-merchant-insights-inventory-returns-analyze/SKILL.md +0 -65
- package/skills/commerce-merchant-insights-order-shopper-get/SKILL.md +0 -90
- package/skills/commerce-merchant-insights-product-performance-analyze/SKILL.md +0 -72
- package/skills/commerce-merchant-insights-query/SKILL.md +0 -279
- package/skills/commerce-merchant-storefront-guest-access-configure/SKILL.md +0 -656
- package/skills/commerce-order-summary-change-apply/SKILL.md +0 -375
- package/skills/commerce-product-details-get/SKILL.md +0 -363
- package/skills/commerce-product-search/SKILL.md +0 -563
- package/skills/commerce-react-storefront-create/SKILL.md +0 -350
- package/skills/commerce-return-order-summary-create/SKILL.md +0 -513
- package/skills/commerce-search-relevance-analyze/SKILL.md +0 -757
- package/skills/commerce-temporary-processing-time-override-create/SKILL.md +0 -274
- package/skills/communications-initial-setup-configure/SKILL.md +0 -630
- package/skills/communications-multisite-configure/SKILL.md +0 -571
- package/skills/communications-revenue-cloud-settings-configure/SKILL.md +0 -74
- package/skills/communications-smb-fiber-catalog-create/SKILL.md +0 -413
- package/skills/communications-tmf-integrate/SKILL.md +0 -1368
- package/skills/consumer-goods-visit-activity-act4-questions-assign/SKILL.md +0 -448
- package/skills/consumer-goods-visit-activity-act5-standard-create/SKILL.md +0 -269
- package/skills/consumer-goods-visit-activity-act6-assortment-configure/SKILL.md +0 -271
- package/skills/consumer-goods-visit-activity-act7-account-scoping-create/SKILL.md +0 -382
- package/skills/consumer-goods-visit-activity-act8-plan-attach-create/SKILL.md +0 -373
- package/skills/consumer-goods-visit-activity-act9-proof-validate/SKILL.md +0 -389
- package/skills/consumer-goods-visit-and-activity-act1-specification-create/SKILL.md +0 -338
- package/skills/consumer-goods-visit-and-activity-act2-template-create/SKILL.md +0 -547
- package/skills/consumer-goods-visit-and-activity-act3-definition-create/SKILL.md +0 -346
- package/skills/consumer-goods-visit-and-activity-configure/SKILL.md +0 -1110
- package/skills/crm-analytics-adoption-insights-configure/SKILL.md +0 -224
- package/skills/crm-analytics-custom-report-type-lightning-configure/SKILL.md +0 -418
- package/skills/crm-analytics-dashboards-configure/SKILL.md +0 -731
- package/skills/crm-analytics-operational-analytics-metadata-bridge-migrate/SKILL.md +0 -233
- package/skills/crm-analytics-report-notifications-ui-configure/SKILL.md +0 -184
- package/skills/crm-analytics-sharing-inheritance-coverage-analyze/SKILL.md +0 -167
- package/skills/crm-analytics-sonic-getting-started-configure/SKILL.md +0 -55
- package/skills/crm-analytics-tableau-next-app-deploy/SKILL.md +0 -1350
- package/skills/crm-analytics-tableau-next-c360-basemodel-validate/SKILL.md +0 -1862
- package/skills/crm-analytics-tableau-next-datacloud-validate/SKILL.md +0 -83
- package/skills/crm-analytics-tableau-next-provisioning-validate/SKILL.md +0 -81
- package/skills/data360-activation-create/SKILL.md +0 -104
- package/skills/data360-activation-external-platform-get/SKILL.md +0 -49
- package/skills/data360-activation-target-create/SKILL.md +0 -93
- package/skills/data360-activation-v2-create/SKILL.md +0 -456
- package/skills/data360-audience-dmo-get/SKILL.md +0 -38
- package/skills/data360-calculated-affinity-create/SKILL.md +0 -82
- package/skills/data360-calculated-insight-create/SKILL.md +0 -148
- package/skills/data360-catalog-metadata-create/SKILL.md +0 -183
- package/skills/data360-code-extension-create/SKILL.md +0 -115
- package/skills/data360-communication-capping-create/SKILL.md +0 -227
- package/skills/data360-connection-create/SKILL.md +0 -491
- package/skills/data360-content-lens-create/SKILL.md +0 -181
- package/skills/data360-data-action-create/SKILL.md +0 -126
- package/skills/data360-data-action-target-create/SKILL.md +0 -181
- package/skills/data360-data-clean-room-create/SKILL.md +0 -238
- package/skills/data360-data-governance-create/SKILL.md +0 -746
- package/skills/data360-data-graph-create/SKILL.md +0 -82
- package/skills/data360-data-harmonized-model-object-reference-create/SKILL.md +0 -38
- package/skills/data360-data-lake-object-create/SKILL.md +0 -207
- package/skills/data360-data-model-object-catalog-get/SKILL.md +0 -49
- package/skills/data360-data-model-object-create/SKILL.md +0 -128
- package/skills/data360-data-model-object-mapping-create/SKILL.md +0 -106
- package/skills/data360-data-space-create/SKILL.md +0 -161
- package/skills/data360-data-streams-create/SKILL.md +0 -324
- package/skills/data360-engagement-signal-get/SKILL.md +0 -38
- package/skills/data360-experiment-create/SKILL.md +0 -82
- package/skills/data360-goal-based-campaign-create/SKILL.md +0 -192
- package/skills/data360-harmonization-process-history-get/SKILL.md +0 -38
- package/skills/data360-harmonized-unstructured-dmo-create/SKILL.md +0 -84
- package/skills/data360-identity-resolution-create/SKILL.md +0 -115
- package/skills/data360-intelligent-document-processing-create/SKILL.md +0 -148
- package/skills/data360-knowledge-graph-construction-create/SKILL.md +0 -93
- package/skills/data360-knowledge-graph-create/SKILL.md +0 -216
- package/skills/data360-knowledge-space-mcp-configure/SKILL.md +0 -475
- package/skills/data360-machine-learning-mcp-configure/SKILL.md +0 -697
- package/skills/data360-multi-org-mcp-configure/SKILL.md +0 -117
- package/skills/data360-secondary-index-mcp-configure/SKILL.md +0 -126
- package/skills/data360-segment-mcp-configure/SKILL.md +0 -159
- package/skills/data360-semantic-calculated-dimension-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-calculated-measurement-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-data-object-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-dimension-mcp-configure/SKILL.md +0 -38
- package/skills/data360-semantic-engine-mcp-configure/SKILL.md +0 -62
- package/skills/data360-semantic-measurement-mcp-configure/SKILL.md +0 -38
- package/skills/data360-semantic-metric-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-model-mcp-configure/SKILL.md +0 -115
- package/skills/data360-standard-mapping-mcp-configure/SKILL.md +0 -38
- package/skills/data360-tenant-lifecycle-mcp-configure/SKILL.md +0 -73
- package/skills/experience-afv-query/SKILL.md +0 -234
- package/skills/experience-agentforce-vibes-in-react-configure/SKILL.md +0 -63
- package/skills/experience-apex-components-configure/SKILL.md +0 -69
- package/skills/experience-apex-pages-configure/SKILL.md +0 -107
- package/skills/experience-app-home-configure/SKILL.md +0 -76
- package/skills/experience-aura-lightning-out-access-configure/SKILL.md +0 -58
- package/skills/experience-briefcase-configure/SKILL.md +0 -287
- package/skills/experience-community-flexi-page-list-create/SKILL.md +0 -74
- package/skills/experience-community-template-definition-list-query/SKILL.md +0 -48
- package/skills/experience-community-theme-definition-list-query/SKILL.md +0 -38
- package/skills/experience-content-assets-configure/SKILL.md +0 -86
- package/skills/experience-custom-domain-create/SKILL.md +0 -727
- package/skills/experience-defer-rendering-workspace-page-setup-configure/SKILL.md +0 -41
- package/skills/experience-field-service-app-builder-configure/SKILL.md +0 -187
- package/skills/experience-flow-category-configure/SKILL.md +0 -117
- package/skills/experience-formula-configure/SKILL.md +0 -358
- package/skills/experience-global-actions-configure/SKILL.md +0 -69
- package/skills/experience-global-publisher-layouts-configure/SKILL.md +0 -79
- package/skills/experience-instrumentation-configure/SKILL.md +0 -64
- package/skills/experience-lex-engagement-configure/SKILL.md +0 -50
- package/skills/experience-lightning-bolt-open/SKILL.md +0 -12
- package/skills/experience-lightning-out-configure/SKILL.md +0 -129
- package/skills/experience-lightning-preview-configure/SKILL.md +0 -67
- package/skills/experience-lightning-types-query/SKILL.md +0 -98
- package/skills/experience-malware-scan-configure/SKILL.md +0 -71
- package/skills/experience-my-salesforce-configure/SKILL.md +0 -126
- package/skills/experience-navigation-menus-configure/SKILL.md +0 -235
- package/skills/experience-notification-types-configure/SKILL.md +0 -206
- package/skills/experience-notifications-configure/SKILL.md +0 -75
- package/skills/experience-record-discovery-query/SKILL.md +0 -227
- package/skills/experience-regenerate-previews-open/SKILL.md +0 -94
- package/skills/experience-sales-cloud-mab-configure/SKILL.md +0 -254
- package/skills/experience-schema-builder-open/SKILL.md +0 -38
- package/skills/experience-simple-record-home-configure/SKILL.md +0 -110
- package/skills/experience-static-resources-configure/SKILL.md +0 -74
- package/skills/field-service-setup-coordinate/SKILL.md +0 -62
- package/skills/field-service-work-plan-configure/SKILL.md +0 -253
- package/skills/fsc-actionable-segmentation-settings-configure/SKILL.md +0 -180
- package/skills/fsc-digital-origination-bre-decision-matrix-foundation-create/SKILL.md +0 -196
- package/skills/fsc-digital-origination-bre-disclosures-consent-configure/SKILL.md +0 -106
- package/skills/fsc-digital-origination-bre-document-upload-configure/SKILL.md +0 -96
- package/skills/fsc-digital-origination-bre-permissions-assign/SKILL.md +0 -111
- package/skills/fsc-digital-origination-bre-setup-coordinate/SKILL.md +0 -250
- package/skills/fsc-digital-origination-bre-stp-eligibility-configure/SKILL.md +0 -122
- package/skills/fsc-digital-origination-coordinate/SKILL.md +0 -653
- package/skills/fsc-digital-origination-demo-run/SKILL.md +0 -225
- package/skills/fsc-digital-origination-execution-guardrails-validate/SKILL.md +0 -112
- package/skills/fsc-digital-origination-initial-setup-configure/SKILL.md +0 -396
- package/skills/fsc-digital-origination-pricing-setup-coordinate/SKILL.md +0 -336
- package/skills/fsc-digital-origination-pricing-setup-data-foundation-create/SKILL.md +0 -208
- package/skills/fsc-digital-origination-pricing-setup-procedure-create/SKILL.md +0 -375
- package/skills/fsc-digital-origination-product-setup-act1-permissions-assign/SKILL.md +0 -83
- package/skills/fsc-digital-origination-product-setup-coordinate/SKILL.md +0 -248
- package/skills/fsc-digital-origination-sample-data-create/SKILL.md +0 -206
- package/skills/fsc-document-checklist-settings-configure/SKILL.md +0 -57
- package/skills/fsc-flexible-hierarchy-configure/SKILL.md +0 -148
- package/skills/fsc-flexible-hierarchy-foundation-configure/SKILL.md +0 -1430
- package/skills/fsc-flexible-hierarchy-graph-config-create/SKILL.md +0 -471
- package/skills/fsc-flexible-hierarchy-rule-based-graph-deploy/SKILL.md +0 -429
- package/skills/fsc-pricing-product-configurator-configure/SKILL.md +0 -150
- package/skills/fsc-pricing-salesforce-omnistudio-switch/SKILL.md +0 -123
- package/skills/fsc-product-act2-catalog-categories-create/SKILL.md +0 -82
- package/skills/fsc-product-act3-attributes-create/SKILL.md +0 -249
- package/skills/fsc-product-act4-classification-assignment-create/SKILL.md +0 -196
- package/skills/fsc-product-act5-considerations-get/SKILL.md +0 -44
- package/skills/fsc-stage-management-apex-flow-deploy/SKILL.md +0 -384
- package/skills/fsc-stage-management-compliant-data-sharing-configure/SKILL.md +0 -144
- package/skills/fsc-stage-management-decision-matrices-create/SKILL.md +0 -107
- package/skills/fsc-stage-management-definition-assignments-create/SKILL.md +0 -189
- package/skills/fsc-stage-management-definition-create/SKILL.md +0 -108
- package/skills/fsc-stage-management-permissions-assign/SKILL.md +0 -143
- package/skills/fsc-stage-management-transitions-configure/SKILL.md +0 -139
- package/skills/health-cloud-appt-booking-config-configure/SKILL.md +0 -135
- package/skills/health-cloud-appt-booking-url-config-configure/SKILL.md +0 -134
- package/skills/health-cloud-care-provider-affl-role-config-configure/SKILL.md +0 -136
- package/skills/health-cloud-care-provider-search-config-configure/SKILL.md +0 -134
- package/skills/health-cloud-care-requests-create/SKILL.md +0 -178
- package/skills/health-cloud-initial-configure/SKILL.md +0 -511
- package/skills/health-cloud-patient-appointment-scheduling-configure/SKILL.md +0 -1374
- package/skills/health-cloud-provider-search-settings-configure/SKILL.md +0 -924
- package/skills/health-cloud-referral-management-coordinate/SKILL.md +0 -513
- package/skills/health-cloud-timeline-configure/SKILL.md +0 -622
- package/skills/health-cloud-virtual-visit-config-configure/SKILL.md +0 -135
- package/skills/industries-account-score-settings-query/SKILL.md +0 -78
- package/skills/industries-actionable-list-data-sources-dmo-configure/SKILL.md +0 -177
- package/skills/industries-ad-product-availability-search/SKILL.md +0 -399
- package/skills/industries-advanced-account-forecast-settings-configure/SKILL.md +0 -628
- package/skills/industries-advanced-therapy-management-settings-configure/SKILL.md +0 -73
- package/skills/industries-atm-settings-starter-configure/SKILL.md +0 -76
- package/skills/industries-batch-document-ai-configure/SKILL.md +0 -196
- package/skills/industries-behavioral-health-app-settings-configure/SKILL.md +0 -71
- package/skills/industries-branch-management-settings-configure/SKILL.md +0 -89
- package/skills/industries-bre-decision-table-access-configure/SKILL.md +0 -367
- package/skills/industries-brokerage-settings-configure/SKILL.md +0 -41
- package/skills/industries-calendar-sync-settings-configure/SKILL.md +0 -89
- package/skills/industries-care-request-settings-configure/SKILL.md +0 -218
- package/skills/industries-case-management-intelligence-settings-configure/SKILL.md +0 -54
- package/skills/industries-catalog-process-attributes-products-configure/SKILL.md +0 -380
- package/skills/industries-catalog-process-fulfillment-configure/SKILL.md +0 -216
- package/skills/industries-catalog-process-intake-configure/SKILL.md +0 -219
- package/skills/industries-catalog-process-knowledge-configure/SKILL.md +0 -153
- package/skills/industries-catalog-process-preprocessor-configure/SKILL.md +0 -168
- package/skills/industries-cds-general-settings-configure/SKILL.md +0 -69
- package/skills/industries-claim-financial-settings-configure/SKILL.md +0 -169
- package/skills/industries-clinical-data-model-settings-configure/SKILL.md +0 -136
- package/skills/industries-clinical-data-model-settings-starter-configure/SKILL.md +0 -105
- package/skills/industries-collection-plan-settings-configure/SKILL.md +0 -132
- package/skills/industries-comms-service-console-settings-configure/SKILL.md +0 -159
- package/skills/industries-compliance-configure/SKILL.md +0 -102
- package/skills/industries-compliance-document-extraction-setup-configure/SKILL.md +0 -76
- package/skills/industries-contact-center-app-layout-configure/SKILL.md +0 -88
- package/skills/industries-contact-center-components-configure/SKILL.md +0 -96
- package/skills/industries-contact-center-path-knowledge-configure/SKILL.md +0 -95
- package/skills/industries-contact-center-user-access-assign/SKILL.md +0 -96
- package/skills/industries-course-waitlist-config-configure/SKILL.md +0 -162
- package/skills/industries-crisis-center-settings-configure/SKILL.md +0 -84
- package/skills/industries-custom-object-settings-configure/SKILL.md +0 -94
- package/skills/industries-data-cloud-integration-configure/SKILL.md +0 -88
- package/skills/industries-data-space-feature-mappings-configure/SKILL.md +0 -245
- package/skills/industries-decision-matrix-builder-configure/SKILL.md +0 -78
- package/skills/industries-decision-table-hbase-configure/SKILL.md +0 -87
- package/skills/industries-decision-table-version-configure/SKILL.md +0 -74
- package/skills/industries-decision-tables-builder-configure/SKILL.md +0 -253
- package/skills/industries-decision-tables-configure/SKILL.md +0 -439
- package/skills/industries-energy-utilities-configure/SKILL.md +0 -251
- package/skills/industries-eu-cloud-multisite-configure/SKILL.md +0 -1008
- package/skills/industries-eu-new-connections-configure/SKILL.md +0 -30
- package/skills/industries-explainability-msg-template-configure/SKILL.md +0 -135
- package/skills/industries-expression-set-message-token-configure/SKILL.md +0 -135
- package/skills/industries-field-service-settings-configure/SKILL.md +0 -82
- package/skills/industries-form-framework-settings-configure/SKILL.md +0 -30
- package/skills/industries-fsc-ai-settings-configure/SKILL.md +0 -57
- package/skills/industries-fsc-association-engine-settings-configure/SKILL.md +0 -172
- package/skills/industries-fsc-b2b-settings-configure/SKILL.md +0 -61
- package/skills/industries-fsc-insurance-settings-configure/SKILL.md +0 -58
- package/skills/industries-fsc-visa-fulfillment-setup-configure/SKILL.md +0 -103
- package/skills/industries-fsc-wealth-agent-settings-configure/SKILL.md +0 -117
- package/skills/industries-fsc-wealth-settings-configure/SKILL.md +0 -99
- package/skills/industries-fundraising-gift-entry-settings-configure/SKILL.md +0 -120
- package/skills/industries-fundraising-rfm-configure/SKILL.md +0 -128
- package/skills/industries-fundraising-settings-configure/SKILL.md +0 -145
- package/skills/industries-fundraising-source-code-gen-configure/SKILL.md +0 -299
- package/skills/industries-google-maps-api-key-settings-configure/SKILL.md +0 -87
- package/skills/industries-grantmaking-intelligence-settings-open/SKILL.md +0 -58
- package/skills/industries-hc-score-category-settings-configure/SKILL.md +0 -167
- package/skills/industries-health-engagement-settings-configure/SKILL.md +0 -218
- package/skills/industries-home-health-agentforce-setup-configure/SKILL.md +0 -131
- package/skills/industries-home-health-bundling-policy-create/SKILL.md +0 -50
- package/skills/industries-home-health-entity-labels-configure/SKILL.md +0 -29
- package/skills/industries-home-health-fsl-package-deploy/SKILL.md +0 -71
- package/skills/industries-home-health-fsl-settings-validate/SKILL.md +0 -27
- package/skills/industries-home-health-guided-setup-care-and-skill-get/SKILL.md +0 -80
- package/skills/industries-home-health-guided-setup-configure/SKILL.md +0 -836
- package/skills/industries-home-health-guided-setup-enable-org-fsl-get/SKILL.md +0 -55
- package/skills/industries-home-health-guided-setup-get-org-ready-get/SKILL.md +0 -61
- package/skills/industries-home-health-licenses-assign/SKILL.md +0 -27
- package/skills/industries-home-health-operating-hours-create/SKILL.md +0 -40
- package/skills/industries-home-health-scheduling-policy-create/SKILL.md +0 -41
- package/skills/industries-home-health-service-objective-create/SKILL.md +0 -22
- package/skills/industries-home-health-skills-create/SKILL.md +0 -31
- package/skills/industries-home-health-users-create/SKILL.md +0 -29
- package/skills/industries-icm-act3-toggles-configure/SKILL.md +0 -198
- package/skills/industries-icm-act5-genai-suggested-assessments-configure/SKILL.md +0 -361
- package/skills/industries-icm-act6-mcg-integration-configure/SKILL.md +0 -550
- package/skills/industries-integrated-care-management-configure/SKILL.md +0 -168
- package/skills/industries-object-enablement-configure/SKILL.md +0 -86
- package/skills/industries-tpm-system-processing-service-configure/SKILL.md +0 -64
- package/skills/integration-apex-settings-configure/SKILL.md +0 -61
- package/skills/marketing-e360-email-archiving-configure/SKILL.md +0 -73
- package/skills/platform-custom-permissions-configure/SKILL.md +0 -687
- package/skills/platform-label-workbench-import-create/SKILL.md +0 -67
- package/skills/platform-privacy-agent-settings-configure/SKILL.md +0 -752
|
@@ -1,868 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: flow-recipe-author
|
|
3
|
-
license: LICENSE.txt has complete terms
|
|
4
|
-
description: "Load when building a NEW Salesforce Flow from scratch OR editing/patching/extending/repairing an EXISTING one via the flow MCP. A Mode Detection gate (Phase 0) decides GENERATE vs EVOLVE from the user's intent and whether flow JSON was supplied by the client. Pipeline: Detect -> [Load, evolve only] -> Plan -> Save, with a hard approval gate before any save. TRIGGER when: user asks to create a flow, automate a process, build/generate flow metadata, OR update/add-to/change/extend/fix an existing flow, OR the client passed existing flow JSON for modification. DO NOT TRIGGER when running tests (use flow-recipe-testing), summarizing a flow (use flow-recipe-summarize), or building an Orchestrator / ApprovalWorkflow flow (Phase 2 hands those to flow-recipe-orchestrate)."
|
|
5
|
-
metadata:
|
|
6
|
-
version: "3.2"
|
|
7
|
-
related-skills: flow-type-resolver, flow-anti-patterns, flow-element-start, flow-flow-properties, flow-metadata-schema, flow-value-rules, flow-formula-expression, flow-preview-renderer, flow-recipe-orchestrate
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Flow Author — Create or Evolve
|
|
11
|
-
|
|
12
|
-
Builds a complete, deployable Salesforce Flow, whether it is **net-new** or an
|
|
13
|
-
**edit to an existing flow**. One pipeline, two modes, selected by a Mode
|
|
14
|
-
Detection gate up front:
|
|
15
|
-
|
|
16
|
-
- **GENERATE** — net-new build from the user's request. Skips the Load phase.
|
|
17
|
-
- **EVOLVE** — edits an existing flow supplied as JSON by the client. Runs the
|
|
18
|
-
Load phase first, edits **surgically**, and never skips the approval gate.
|
|
19
|
-
|
|
20
|
-
Output format is **JSON** (Tooling API wire format) for
|
|
21
|
-
`POST /services/data/vXX.0/flowbuilder/flow/actions/save`. Not XML. (If a client persists the flow by
|
|
22
|
-
writing a `.flow-meta.xml` and deploying it as metadata instead of calling the
|
|
23
|
-
save endpoint, the same topology rules still apply — a metadata deploy stores the
|
|
24
|
-
flow verbatim, so every `AUTO_LAYOUT_CANVAS` v68 terminating branch must still
|
|
25
|
-
carry an explicit `ends[]` End. See `../../shared/end/end.md`. In the XML, write
|
|
26
|
-
each element and field under the name the JSON uses: one repeated element per
|
|
27
|
-
array entry (`<ends>`, `<waitEvents>`, `<actionCalls>`), and nothing the JSON
|
|
28
|
-
shape doesn't have on that element. An unknown or misplaced element fails the
|
|
29
|
-
deploy with `Error parsing file: Element … invalid at this location`.)
|
|
30
|
-
|
|
31
|
-
Phase 2 asks targeted clarifying questions inline when the request is
|
|
32
|
-
materially ambiguous (see Plan step 1) before moving into design.
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Phase 0 — Mode Detection (read this first)
|
|
37
|
-
|
|
38
|
-
Decide the mode before doing anything else. This is the intent guardrail that
|
|
39
|
-
keeps a net-new build from mutating a live flow, and an edit from silently
|
|
40
|
-
becoming a brand-new flow.
|
|
41
|
-
|
|
42
|
-
```text
|
|
43
|
-
Mode = EVOLVE if ANY of:
|
|
44
|
-
- the client supplied existing flow JSON (input payload, prior save response,
|
|
45
|
-
a local file, or a Flow Builder source export), OR
|
|
46
|
-
- the user named an existing flow to change ("update Lead_Routing",
|
|
47
|
-
"add a step to my onboarding flow"), OR
|
|
48
|
-
- the request references an existing element, version, or a save-time
|
|
49
|
-
validation error to repair.
|
|
50
|
-
Mode = GENERATE otherwise (the request describes a new flow and no existing
|
|
51
|
-
flow is in play).
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**JSON availability is the deciding signal.** Non-empty flow JSON means an
|
|
55
|
-
existing flow is in play → **EVOLVE**, even when the wording says
|
|
56
|
-
"create"/"build"/"make" (a single request has no second flow to create). Intent
|
|
57
|
-
only breaks the tie when **no** or **empty** JSON is supplied:
|
|
58
|
-
|
|
59
|
-
| User intent | Flow JSON supplied? | Resolution |
|
|
60
|
-
|---|---|---|
|
|
61
|
-
| New flow | none | **GENERATE** |
|
|
62
|
-
| New flow wording | present (non-empty) | **EVOLVE** — non-empty JSON is an existing flow in play; "create" wording does not spawn a second flow. |
|
|
63
|
-
| Edit existing | present (non-empty) | **EVOLVE** |
|
|
64
|
-
| Edit existing | **empty or missing** | **EVOLVE intent stands — do NOT downgrade to GENERATE.** The flow body is a required input the client must provide. Ask for the current flow JSON and stop; do not fabricate a net-new flow to "fill the gap". |
|
|
65
|
-
|
|
66
|
-
**Re-detect every turn — a "yes" follow-up does not flip the mode.** Mode is decided on the flow JSON attached to the **current** request, on every turn. While the client keeps attaching a non-empty flow JSON, every turn stays **EVOLVE** — including an affirmative follow-up ("yes", "create it", "go ahead", "yes create a flow") that lands after you declined a process-type change. That reply is the same blocked request reworded, not a new GENERATE: the attached flow has not changed, so its `processType` still cannot change — decline again and stop. GENERATE begins **only** when the client stops attaching an existing flow (the user opens a new or blank flow, so no non-empty JSON arrives). You cannot spawn a net-new flow while one is attached, no matter how many "yes"es precede it.
|
|
67
|
-
|
|
68
|
-
**One edit session = one flow. No "separate new flow" escape.** In EVOLVE the
|
|
69
|
-
supplied JSON is the single flow this control point saves back to — there is no
|
|
70
|
-
second slot. If the request describes something the loaded flow cannot become
|
|
71
|
-
without a different `processType` than the loaded flow's — in either direction, for
|
|
72
|
-
**any** flow type — that is a **process-type change → decline with a reason** per the
|
|
73
|
-
change-type table in Phase 2. (Fixed-platform incompatibility only: the element or
|
|
74
|
-
behavior cannot exist under the loaded flow's `processType`. Not the org-availability
|
|
75
|
-
(`.elements`) or FLS gate, which keep their build-without / halt branch at Phase 2 §
|
|
76
|
-
Probe schema.)
|
|
77
|
-
Do **not** offer a new / separate flow, offer to design / build / "help with" one,
|
|
78
|
-
ask whether to proceed ("would you like me to…?"), or propose any other workaround.
|
|
79
|
-
Decline and **stop** — state once that they can make a new flow themselves, then end
|
|
80
|
-
the turn. A net-new save on this control point overwrites the flow in context. "The
|
|
81
|
-
loaded flow isn't what the user asked for" is **never** a license to switch to
|
|
82
|
-
GENERATE or create a second flow — it is the decline trigger. Any affirmative
|
|
83
|
-
follow-up ("yes", "create it", "go ahead", "yes create a flow") is that same blocked
|
|
84
|
-
request reworded, not permission to build; while the flow JSON is still attached it
|
|
85
|
-
stays EVOLVE and is declined again (see "Re-detect every turn" above).
|
|
86
|
-
|
|
87
|
-
**Ambiguous intent?** Ask exactly one question and stop until answered:
|
|
88
|
-
|
|
89
|
-
> "Are you starting a new flow, or editing one that already exists?"
|
|
90
|
-
|
|
91
|
-
Hard rules that follow from the mode:
|
|
92
|
-
|
|
93
|
-
- Enter **Phase 1 (Load) only in EVOLVE**. Never run it in GENERATE.
|
|
94
|
-
- The override phrase (`"skip the"` / `"don't ask"`) may skip the Plan-phase
|
|
95
|
-
intent capture **only in GENERATE**. In EVOLVE the gate is never skipped —
|
|
96
|
-
every save touches a flow that may already be active or referenced by other
|
|
97
|
-
automation.
|
|
98
|
-
|
|
99
|
-
### EVOLVE hard limitations (surface these before starting an edit)
|
|
100
|
-
|
|
101
|
-
1. **The editable flow body is a client-supplied input.**
|
|
102
|
-
`GET /services/data/vXX.0/flowbuilder/flow/{id}` can return the raw graph for read-only
|
|
103
|
-
summarization, and `GET /services/data/vXX.0/flowbuilder/flow/{id}/validation-results` can return the graph with
|
|
104
|
-
validation results. EVOLVE still requires the exact client-supplied working
|
|
105
|
-
body (from Flow Builder, Vibes, or an agentic orchestrator managing its own
|
|
106
|
-
copy — Claude Code, Cursor, Copilot, etc.) rather than silently replacing it
|
|
107
|
-
with an org read. If it is absent, request it; editing "by description
|
|
108
|
-
alone" without the user's source is lossy — tell the user this upfront.
|
|
109
|
-
2. **No flow deletion.** Use Setup → Process Automation → Flows to delete.
|
|
110
|
-
Throwaway flows should be suffixed `_TEMP_<YYYYMMDD>`.
|
|
111
|
-
|
|
112
|
-
### EVOLVE surgical / minimal-surface rule (applies to the whole EVOLVE path)
|
|
113
|
-
|
|
114
|
-
**Touch only what the requested change requires.** The edit modifies the target
|
|
115
|
-
element(s) and the connectors that must be rewired to keep the graph valid —
|
|
116
|
-
and nothing else.
|
|
117
|
-
|
|
118
|
-
- Everything else in the client-supplied JSON is preserved **byte-for-byte**:
|
|
119
|
-
unrelated elements, element ordering, resources, `locationX`/`locationY`,
|
|
120
|
-
existing `processMetadataValues`, labels, and descriptions.
|
|
121
|
-
- No opportunistic "improvements", reformatting, renaming, or re-topology of
|
|
122
|
-
untouched parts. If the user did not ask for it, do not change it.
|
|
123
|
-
- Advisory Auditor/security findings on **untouched** elements are reported to
|
|
124
|
-
the user, never auto-fixed inside an evolve. Surface, do not silently repair.
|
|
125
|
-
|
|
126
|
-
**Bounded exception — server read-back forms that cannot be saved verbatim.**
|
|
127
|
-
A retrieve hands back some fields in a *read-back* shape the server itself
|
|
128
|
-
rejects on save — specifically, the times `schedule.startTime` /
|
|
129
|
-
`schedule.endTime` / `resumeTime` as `{ "timeInMillis": N }` objects and the
|
|
130
|
-
dates `schedule.startDate` / `schedule.endDate` / `resumeDate` as epoch-millis
|
|
131
|
-
integers, instead of the wire-string form `POST /services/data/vXX.0/flowbuilder/flow/actions/save`
|
|
132
|
-
requires. These
|
|
133
|
-
fields are normalized to their wire-string form on **every** element that
|
|
134
|
-
carries them, touched or not — this is a mechanical serialization fix, not a
|
|
135
|
-
design change. It is exempt from byte-for-byte preservation and **overrides**
|
|
136
|
-
the "report-don't-fix untouched elements" rule above for these fields
|
|
137
|
-
specifically: the agent repairs them, it does not just report them. See
|
|
138
|
-
`../../shared/anti-patterns.md` item 39 for the full field list and conversions.
|
|
139
|
-
|
|
140
|
-
Rationale: unbounded edits compound flow complexity across sessions and are not
|
|
141
|
-
deterministic across LLM runs. Surgical edits keep evolve reviewable and
|
|
142
|
-
reproducible.
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## Approval gate
|
|
147
|
-
|
|
148
|
-
One hard gate separates Plan and Save:
|
|
149
|
-
|
|
150
|
-
**End of Phase 2 (Plan):** the agent presents the plan summary and asks
|
|
151
|
-
"Approve this plan?" The user MUST explicitly accept (e.g., "yes", "looks
|
|
152
|
-
good", "approved", "ship it") before Phase 3 (Save) begins. Skipping the gate
|
|
153
|
-
is a contract violation.
|
|
154
|
-
|
|
155
|
-
**The plan gate is NEVER skipped.** Even on full autopilot, the user sees and
|
|
156
|
-
approves the plan summary before any save call. In EVOLVE this is
|
|
157
|
-
absolute — every save touches an existing flow that may be active or referenced
|
|
158
|
-
by other automation.
|
|
159
|
-
|
|
160
|
-
**Silence is NOT acceptance.** If the user replies with a refinement, a
|
|
161
|
-
question, or anything that isn't an unambiguous accept, treat it as "still
|
|
162
|
-
refining" and re-present the plan summary with the refinement applied.
|
|
163
|
-
|
|
164
|
-
**Override phrases (GENERATE only).** If a GENERATE request begins with
|
|
165
|
-
`"skip the"` or `"don't ask"` (e.g., "don't ask, just build it"), the agent
|
|
166
|
-
infers the design silently and presents the plan with minimal back-and-forth —
|
|
167
|
-
but the Phase 2 plan gate still stands. The user always approves the
|
|
168
|
-
plan summary before any save. This override has no effect in EVOLVE.
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## Phase 1 — Load (EVOLVE ONLY — skipped entirely in GENERATE)
|
|
173
|
-
|
|
174
|
-
Establish the baseline before touching anything.
|
|
175
|
-
|
|
176
|
-
1. **Ingest the client-supplied flow JSON.** The current flow body is provided
|
|
177
|
-
by the client as input (see EVOLVE hard limitation 1). If it has not been
|
|
178
|
-
provided, ask for it and stop — do not reconstruct it from the org and do
|
|
179
|
-
not fall back to a net-new build.
|
|
180
|
-
2. **Call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow/<definition ID>/versions")`** to confirm the
|
|
181
|
-
target version number and active/draft status. (Volatile — always re-fetch,
|
|
182
|
-
never reuse from history.)
|
|
183
|
-
3. **Call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow/<id>/validation-results")`** for the version-level
|
|
184
|
-
metadata (label, processType, apiVersion, runInMode). Do not reuse a cached
|
|
185
|
-
call — this is Tier 4.
|
|
186
|
-
4. Parse the supplied JSON and build an **internal element index**:
|
|
187
|
-
name → type → connectors. This is the working graph for the session.
|
|
188
|
-
5. **Note pre-existing `processMetadataValues`** (especially `BuilderType` and
|
|
189
|
-
`CanvasMode`). In EVOLVE these are preserved **verbatim** — never inject,
|
|
190
|
-
overwrite, or flip a canvas mode the source didn't ask for (silently
|
|
191
|
-
re-laying-out an existing flow can corrupt it). See `../../shared/anti-patterns.md`
|
|
192
|
-
item 37.
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
## Phase 2 — Plan (shared by both modes)
|
|
197
|
-
|
|
198
|
-
Translate the request into a concrete flow design (GENERATE) or apply the
|
|
199
|
-
requested change to the working graph (EVOLVE), run audits, and present the
|
|
200
|
-
plan summary for approval. This is internal work that produces **one
|
|
201
|
-
user-visible artifact**: the plan summary.
|
|
202
|
-
|
|
203
|
-
### Plan steps (do all in order, no tool calls visible to the user except as needed for schema)
|
|
204
|
-
|
|
205
|
-
1. **Clarify underspecified business intent, if needed.** Check whether the
|
|
206
|
-
request gives enough business detail to design confidently: the
|
|
207
|
-
trigger/starting condition, the core action(s), any branching or decision
|
|
208
|
-
logic, and the expected outcome. If a material gap exists (e.g., the
|
|
209
|
-
request implies branching but names no conditions, the outcome is
|
|
210
|
-
ambiguous, or a consequential edge case is unaddressed), ask the user 1-2
|
|
211
|
-
targeted questions in plain business language before drafting. Do not ask
|
|
212
|
-
about objects, fields, trigger types, or other implementation details —
|
|
213
|
-
those are resolved by schema probing in step 4. Skip this step entirely if
|
|
214
|
-
the request is already unambiguous; this is a gap check, not a mandatory
|
|
215
|
-
Q&A round. *(Override phrase: if the request began with `"skip the"` /
|
|
216
|
-
`"don't ask"`, infer reasonable defaults instead of asking — GENERATE only,
|
|
217
|
-
per the Approval gate override.)*
|
|
218
|
-
**One exception on trigger types:** if the flow-type resolver in step 2
|
|
219
|
-
returns `mustAsk: true` (for example a "CRM Triggered Flow" request that
|
|
220
|
-
does not say "marketing"), ask its `decidingClarification` in plain words
|
|
221
|
-
before drafting, and build the type the user picks. Don't choose for them.
|
|
222
|
-
With the override phrase, use the resolver's leaning `tuple` and say in one
|
|
223
|
-
line which type you built.
|
|
224
|
-
2. **Pick `processType` and `triggerType`.** **Load and apply the flow-type-resolver
|
|
225
|
-
reference (`../../shared/flow-type-resolver/flow-type-resolver.md`)** to map the
|
|
226
|
-
request's characteristics and described trigger ("when an order is placed", "on a
|
|
227
|
-
button click", etc.) to the correct tuple. It is the single source of flow-type
|
|
228
|
-
classification — do **not** re-derive the tuple inline from this recipe or any other
|
|
229
|
-
reference file.
|
|
230
|
-
- **[Orchestration hand-off — run it the moment the resolver returns a tuple.]**
|
|
231
|
-
If the resolved `processType` is `Orchestrator` or `ApprovalWorkflow`, stop
|
|
232
|
-
this recipe and hand control, with the resolution, to
|
|
233
|
-
`../orchestrate/orchestrate.md`. It owns the shape gate, the per-stage loop,
|
|
234
|
-
and the per-stage saves. Do not plan stages here. Step flows and evaluation
|
|
235
|
-
flows that the orchestration co-generates come back here as ordinary
|
|
236
|
-
GENERATE requests. (EVOLVE of a loaded orchestration hands off the same
|
|
237
|
-
way, after the processType lock below.)
|
|
238
|
-
- **Build the Start for the resolved tuple (GENERATE).** For a new flow, write the resolved `triggerType`
|
|
239
|
-
into `start.triggerType` (omit it for `None`), and read that trigger type's section of
|
|
240
|
-
`../../elements/start/start.md` before writing the Start. A Start without the
|
|
241
|
-
resolved `triggerType` makes a different flow type. For example, an
|
|
242
|
-
`AutoLaunchedFlow` with no `start.triggerType` is a plain autolaunched flow, not
|
|
243
|
-
an On-Demand Flow: for `OnDemandNoTrigger`, follow § On-Demand
|
|
244
|
-
(`start.triggerType` `OnDemandNoTrigger` and a top-level `dataSpace`). In EVOLVE,
|
|
245
|
-
keep the loaded `start.triggerType` unless the user asks to change the trigger.
|
|
246
|
-
|
|
247
|
-
Call
|
|
248
|
-
`dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/schema/flow-capabilities", queryParams: { processType, triggerType })` **once** and read both
|
|
249
|
-
`.elements` and `.flowFeatures` from that single cached result — confirm
|
|
250
|
-
every element type the design will use is available in this org and any
|
|
251
|
-
opt-in features are gated.
|
|
252
|
-
- **[EVOLVE — processType lock; mechanical, run it the moment the resolver returns a tuple.]** The resolver is prompt-only and never saw the loaded flow, so this compare is **yours, not the resolver's**: take the resolver's resolved `processType` and compare it against the **loaded flow's `processType`** (the `metadata.processType` of the client-supplied JSON, captured in Phase 1). **If resolved `processType` ≠ loaded `processType` → STOP:** it is a process-type change. Decline per the change-type table below and do **not** emit the tuple, draft, save, or offer a new / separate flow — a later "yes, make it separate" is the same blocked request reworded (see Phase 0). This holds for **any** flow type, in either direction; a confident, high-confidence resolver result does not override it. A differing `triggerType` *within the same* `processType` is a legal edit — reuse the loaded `processType` and re-read flow-capabilities when the trigger changes or when adding net-new nodes. This lock is the `processType` compare only; the org-availability (`.elements`) and FLS gates keep their own build-without / halt branch at § Probe schema.
|
|
253
|
-
- **"Supported in metadata" ≠ "authorable in the canvas."** Emit only
|
|
254
|
-
palette-authorable entries (those carrying a `configComponent`); never emit
|
|
255
|
-
a bare entry with `"isElementSubtype": false`, `"attributes": null`, and no
|
|
256
|
-
`configComponent`. See `../../shared/anti-patterns.md` item 29 (the base `Wait`
|
|
257
|
-
is the known trap — use a Wait subtype; `../../elements/wait/wait.md`).
|
|
258
|
-
3. **Pick API version.** Call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow/version-info")` with optional
|
|
259
|
-
`builderType` only; the tool does not accept `processType`. Select the entry
|
|
260
|
-
in `processTypes[]` whose `processType` equals the chosen flow process type,
|
|
261
|
-
and set `apiVersion = max(apiVersionsList)` (the latest supported version,
|
|
262
|
-
currently 68) unless the user explicitly specified a different version. Do
|
|
263
|
-
NOT use `defaultApiVersion` — that is the server's fallback for flows that
|
|
264
|
-
omit `apiVersion` entirely; it resolves to an obsolete version (49) and
|
|
265
|
-
disables recent features (Data Space v65+, scheduled-flow `maxBatchSize`
|
|
266
|
-
v63+, and others). *(EVOLVE: preserve the existing flow's `apiVersion`
|
|
267
|
-
unless the user asked to change it.)*
|
|
268
|
-
**The resolved version is fixed by `GET /services/data/vXX.0/flowbuilder/flow/version-info` — never lower it, and
|
|
269
|
-
never assert a version cap, to work around a save error.** A save failure such
|
|
270
|
-
as `<EndName> not found` is a referential-integrity bug (a connector targets an
|
|
271
|
-
End with no matching `ends[]` entry — see `../../shared/anti-patterns.md`
|
|
272
|
-
item 14), **not** a signal that the org lacks v68 or that ends are unsupported.
|
|
273
|
-
Diagnose the actual error and fix it (add the missing `ends[]` entry); do NOT
|
|
274
|
-
downgrade `apiVersion`, drop `ends[]`, or claim the flow must open in Free-Form.
|
|
275
|
-
Whether ends are storable is decided **only** by the verified
|
|
276
|
-
`max(apiVersionsList)` above, never inferred from a save error.
|
|
277
|
-
4. **Probe schema.** For every object the design references, call
|
|
278
|
-
`dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/platform/entity/<Object>/fields")`. For every action call, call
|
|
279
|
-
`dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/action/invocable-action-details", queryParams: { actionType, actionName })`. For
|
|
280
|
-
every Screen LWC, call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/screen-component")` +
|
|
281
|
-
`GET /services/data/vXX.0/flowbuilder/screen-component/{apiName}`. **Cache aggressively** — never
|
|
282
|
-
re-call a tool with the same args if the result is already in conversation
|
|
283
|
-
history (Tier 1-3).
|
|
284
|
-
|
|
285
|
-
**`GET /services/data/vXX.0/flowbuilder/platform/entity/{apiName}/fields` is authoritative and FLS-filtered.** The response
|
|
286
|
-
is the complete field inventory the skill may reference for that sObject —
|
|
287
|
-
fields not in the response are inaccessible, and MUST NOT appear in any
|
|
288
|
-
metadata the skill emits, even well-known standard fields (`DoNotCall`,
|
|
289
|
-
`HasOptedOutOfFax`, `HasOptedOutOfEmail`, etc.). If the user's requested
|
|
290
|
-
behavior names a field not in the response, or uses a business term
|
|
291
|
-
(for example "engaged" or "high-value") that no returned field clearly
|
|
292
|
-
matches, do NOT proceed to Phase 3.
|
|
293
|
-
Instead, stop here and present the two branch options to the user:
|
|
294
|
-
|
|
295
|
-
- *Build without the field* — describe what is (and isn't) possible with
|
|
296
|
-
the accessible fields, and ask the user to confirm the reduced scope.
|
|
297
|
-
List substitutes closest real data first. Check related objects, data
|
|
298
|
-
graph DMOs, and records the flow already reads (for example a related
|
|
299
|
-
Contact and its Account). Put any test-looking field last and label it,
|
|
300
|
-
even when you only name it as an example.
|
|
301
|
-
- *Halt* — instruct the user to have their Salesforce admin grant FLS on
|
|
302
|
-
the field, or re-authenticate the MCP session as a user with access.
|
|
303
|
-
|
|
304
|
-
Wait for the user's decision before moving on. See
|
|
305
|
-
`../../shared/anti-patterns.md` item 40.
|
|
306
|
-
|
|
307
|
-
**Send to Journey probe sequence.** When the design contains
|
|
308
|
-
`sendToJourney`, load `../../elements/action-call/send-to-journey.md` and the
|
|
309
|
-
Start guide its trigger table names (for a Segment flow,
|
|
310
|
-
`../../elements/start/segment-triggered.md` plus its shared contract in
|
|
311
|
-
`../../elements/start/audience-common.md`). Complete both before drafting
|
|
312
|
-
the action. Stop for trigger variants outside the documented MVP without
|
|
313
|
-
describing those variants as unsupported by the platform.
|
|
314
|
-
|
|
315
|
-
**Marketing message probe sequence.** When the design sends a marketing
|
|
316
|
-
email, SMS or RCS message (`sendEmailMessage`, `sendSmsMessage`,
|
|
317
|
-
`sendRcsMessage`), read that action's section of
|
|
318
|
-
`../../elements/action-call/action-call.md` (Send Email Message, Send SMS
|
|
319
|
-
Message or Send RCS Message) and its § `contentId` Rule before drafting the
|
|
320
|
-
action, not only the top of the file. They turn the content, sender and
|
|
321
|
-
subscription the user names into the values the action binds: `contentId` is
|
|
322
|
-
the `contentFqn` from `GET /services/data/vXX.0/flowbuilder/messaging/content-fqn`, never a
|
|
323
|
-
`ManagedContent` or `EmailContent` Id, and a subscription's `id` and
|
|
324
|
-
`channelTypeId` are bound together.
|
|
325
|
-
5. **Draft the element list, connector topology, and resource list.** Decompose
|
|
326
|
-
the request into logical units of business work, then map each unit to one or
|
|
327
|
-
more concrete FDL elements. Load per-element skills from the registry below
|
|
328
|
-
as each element type is named. If any element or resource uses a **formula
|
|
329
|
-
expression** (a Formula resource, or a condition/filter in Formula mode),
|
|
330
|
-
read `../../shared/formula-expression.md` first — it carries the operator,
|
|
331
|
-
function-availability, picklist (`ISPICKVAL`), and type-coercion rules that
|
|
332
|
-
apply to every formula.
|
|
333
|
-
|
|
334
|
-
**[EVOLVE addendum] Identify the change type and apply it surgically to the
|
|
335
|
-
working graph.** Per the minimal-surface rule, touch only the affected nodes
|
|
336
|
-
and connectors.
|
|
337
|
-
|
|
338
|
-
| Change type | Description | Key risk |
|
|
339
|
-
|---|---|---|
|
|
340
|
-
| **Add element** | Insert a new node into the graph | Connector wiring — must update upstream element's `connector` to point to the new node, and new node's `connector` to point to the former target |
|
|
341
|
-
| **Remove element** | Delete a node | Dangling connectors — upstream elements still reference the removed node |
|
|
342
|
-
| **Modify element** | Change config on an existing node | Schema re-resolution — re-probe `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/platform/entity/{apiName}/fields")` or `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/action/invocable-action-details")` if the object/action changes |
|
|
343
|
-
| **Add path** | New Decision outcome or scheduled path | `defaultConnector` must still exist; audit all outcomes |
|
|
344
|
-
| **Fix validation error** | Repair a save-time rejection | Map error to anti-pattern, apply targeted fix, do not over-correct |
|
|
345
|
-
| **Rename flow** | Change label or API name | `fullName` change requires `saveType: "saveAsNewDefinition"` — confirm with user |
|
|
346
|
-
| **Change process type** | Switch `processType` on an existing flow (e.g. Screen Flow ↔ record/schedule/autolaunched) | **Not supported — decline with a reason.** Tell the user changing the process type of an existing flow isn't supported. Do **not** offer to create a new flow, or any other workaround — decline and stop; this is one edit session on one control point, so a net-new build would save over the flow in context. Do not name any skill, router, mode, or internal reason. |
|
|
347
|
-
| **Change trigger type** | Switch `triggerType` within the same `processType` | **Load and apply the flow-type-resolver reference (`../../shared/flow-type-resolver/flow-type-resolver.md`)** to re-pick the tuple (do not classify inline); re-read flow-capabilities; many element types may become unsupported |
|
|
348
|
-
|
|
349
|
-
**[EVOLVE] Graph mutation semantics:**
|
|
350
|
-
|
|
351
|
-
Adding an element between two existing nodes:
|
|
352
|
-
```text
|
|
353
|
-
Before: A --connector--> B
|
|
354
|
-
After: A --connector--> NEW --connector--> B
|
|
355
|
-
```
|
|
356
|
-
- Build the new element JSON using the appropriate element skill from the registry.
|
|
357
|
-
- Set `NEW.connector.targetReference = B.name`.
|
|
358
|
-
- Set `A.connector.targetReference = NEW.name`.
|
|
359
|
-
- Add `NEW` to the appropriate element-type array.
|
|
360
|
-
|
|
361
|
-
Removing an element:
|
|
362
|
-
```text
|
|
363
|
-
Before: A --connector--> REMOVE --connector--> B
|
|
364
|
-
After: A --connector--> B
|
|
365
|
-
```
|
|
366
|
-
- Find every connector in the flow that references `REMOVE.name`
|
|
367
|
-
(`connector`, `faultConnector`, `defaultConnector`, `nextValueConnector`,
|
|
368
|
-
`noMoreValuesConnector`).
|
|
369
|
-
- Re-point each to `REMOVE`'s outgoing connector target (`B.name`).
|
|
370
|
-
- Remove `REMOVE` from its element-type array.
|
|
371
|
-
|
|
372
|
-
Adding a terminating branch or fault path (auto-layout sources):
|
|
373
|
-
- When the retrieved source has explicit End element(s) — Flow-Builder- and
|
|
374
|
-
MES-generated flows do — preserve the source's `ends[]`. Give each NEW
|
|
375
|
-
terminating branch an explicit End: either converge it on an existing End
|
|
376
|
-
(a shared End is valid) or add its own dedicated End. Both are valid
|
|
377
|
-
Flow-Builder-native auto-layout shapes.
|
|
378
|
-
- Route new faults to a dedicated error handler (`Log_Error` or a
|
|
379
|
-
persisted/notified Assignment handler; one shared handler across faults is
|
|
380
|
-
fine — item 32) that reaches its own End — a fault pointed directly at an
|
|
381
|
-
End (or left empty) is silently dropped on reload (the error path vanishes),
|
|
382
|
-
so a handler keeps it. This is an observability preference, not a round-trip
|
|
383
|
-
requirement.
|
|
384
|
-
- In a marketing flow, add a fault path only when the user asks for error
|
|
385
|
-
handling; see `../../shared/fault-paths/fault-paths.md` § Marketing Flows —
|
|
386
|
-
Fault Paths Only When Asked.
|
|
387
|
-
- See `../../shared/anti-patterns.md` item 38 and the `../../shared/connector/connector.md`
|
|
388
|
-
§ Terminal Elements EVOLVE worked example.
|
|
389
|
-
|
|
390
|
-
Fixing a validation error:
|
|
391
|
-
- Quote the verbatim `errors[]` or `warnings[]` entry.
|
|
392
|
-
- Map to the matching anti-pattern in `../../shared/anti-patterns.md`.
|
|
393
|
-
- Apply the targeted fix described there.
|
|
394
|
-
- Do not change any other elements — surgical fixes only.
|
|
395
|
-
|
|
396
|
-
**`targetReference` must always be a dev-name, never a GUID.** See
|
|
397
|
-
`../../shared/anti-patterns.md` item 14.
|
|
398
|
-
|
|
399
|
-
**[EVOLVE] Re-probe schema only when the change targets a NEW schema-bound
|
|
400
|
-
resource:**
|
|
401
|
-
|
|
402
|
-
| Change | Re-probe needed |
|
|
403
|
-
|---|---|
|
|
404
|
-
| Object field changed on a record element | `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/platform/entity/<NewObject>/fields")` |
|
|
405
|
-
| Action changed on an action element | `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/action/invocable-action-details", queryParams: { actionType: <type>, actionName: <new name> })` |
|
|
406
|
-
| Subflow target changed | `GET /services/data/vXX.0/flowbuilder/flow/subflows` |
|
|
407
|
-
| Screen LWC component changed | `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/screen-component/<qualifiedApiName>", queryParams: { processType })` (qualified name, e.g. `flowruntime:datatable` — re-`GET /services/data/vXX.0/flowbuilder/screen-component` if only the informal name is known) |
|
|
408
|
-
| Trigger type changed | `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/schema/flow-capabilities", queryParams: { processType, triggerType })` once (read both `.elements` and `.flowFeatures` from the one result) |
|
|
409
|
-
|
|
410
|
-
Do NOT re-probe if only the value/assignment on an already-resolved field
|
|
411
|
-
changes — the schema hasn't changed, so reuse from conversation history.
|
|
412
|
-
|
|
413
|
-
6. **Run Auditor checks** before presenting the plan summary:
|
|
414
|
-
- CRUD inside a loop? See `../../shared/anti-patterns.md` item 1.
|
|
415
|
-
- Missing `faultConnector` on fault-capable elements (`actionCalls`, `apexPluginCalls`, `recordLookups`, `recordCreates`, `recordUpdates`, `recordDeletes`, `waits`)? See `../../shared/anti-patterns.md` item 2. Apply each action-specific persisted shape before this generic check. **Skip this check in a marketing flow** (its `start.triggerType` is on the list in `../../shared/fault-paths/fault-paths.md` § Marketing Flows — Fault Paths Only When Asked) unless the user asked for error handling: there, no fault paths is the correct default, so do not flag, add, or recommend them.
|
|
416
|
-
- Any non-empty `customErrors[]` (reached via `faultConnector`, a regular `connector`, or left unconnected) when `triggerType` is absent or not `RecordBeforeSave`/`RecordAfterSave`? Invalid — save fails with `TRIGGER_TYPE_ELEMENT_NOT_SUPPORTED` regardless of how the element is reached. Retarget fault paths to a `Log_Error` actionCall or a `$Flow.FaultMessage` Assignment. See `../../shared/anti-patterns.md` item 2. *(For observability, prefer a persisted/notified handler — see the advisory check below.)*
|
|
417
|
-
- **[Observability — advisory; headless flows]** In a headless flow (any flow with no screen-rendering capability — Autolaunched, Scheduled, PlatformEvent, Segment, and other event-triggered types; screen-bearing types like Screen Flow, `UnifiedSchedulingFlow`, and `AgxScreenFlow` are **not** headless — route their faults to an error Screen instead), does any `faultConnector` terminate at an Assignment whose `assignmentItems` write `$Flow.FaultMessage` **only to a non-output flow variable** — not to an `isOutput` variable a caller consumes — with **no** downstream element that persists or notifies (a `recordCreate` to a log object, an admin email/notification, or a platform event)? If so, the error is captured in memory only and vanishes when the interview ends — flag it as a silent-failure risk in the plan summary and recommend adding a persistence/notification step (if the element is inside a Loop, accumulate and log once after the loop — item 1). Do **not** block the save (it is valid metadata), and on EVOLVE do not auto-fix untouched elements. Screen flows are exempt (the error Screen surfaces it), as is an Assignment to an `isOutput` variable a parent/Apex caller handles. See `../../shared/anti-patterns.md` item 2 (Observability note) and `../../shared/fault-paths/fault-paths.md` § Observable vs. In-Memory-Only Fault Handling.
|
|
418
|
-
- Missing `defaultConnector` on any Decision? See `../../shared/anti-patterns.md` item 7.
|
|
419
|
-
- Redundant Get Records + filter-based Update Records re-applying the same filter? See `../../shared/anti-patterns.md` item 30 — reuse the fetched collection (Mode 2 update) instead of re-filtering.
|
|
420
|
-
- Any `screens[]` element with both `allowBack: false` and `allowFinish: false`? See `../../shared/anti-patterns.md` item 31.
|
|
421
|
-
- Any non-fault connector targeting a terminal, error-message-only screen that's reached via a `faultConnector` (e.g. a success screen falling through into it)? See `../../shared/anti-patterns.md` item 36.
|
|
422
|
-
- **[GENERATE; `AUTO_LAYOUT_CANVAS`; resolved `apiVersion` ≥ 68.0] Explicit ends stored:** every terminating branch reaches an explicit `ends[]` entry (`END_ELEMENT_n`) — its connector and the entry co-emitted — including the easy-to-miss loop `noMoreValues`/`nextValue` and decision `default`/outcome termini. Branches may each get their own End or converge on a shared End; both valid. v68.0 made End nodes storable metadata, so a net-new auto-layout flow stores them rather than relying on the implicit omit-the-connector form. Below 68.0, and on any Free-Form flow, emit **no** `ends[]` (omit the connector) — **never emit `ends[]` on a Free-Form flow**. See `../../shared/end/end.md`. *(EVOLVE: preserve the source's `ends[]`; add an explicit End for each NEW terminating branch on an auto-layout source — its own or a shared one.)*
|
|
423
|
-
- **[`AUTO_LAYOUT_CANVAS`; applies to GENERATE and EVOLVE] Every terminating branch reaches an explicit End?** Confirm no v68 terminating branch (loop exit, loop body, decision default/outcome, plain element) is left without an `ends[]` target. A shared End (2+ non-fault connectors into one entry) is **valid** — do NOT flag or split it. A `faultConnector` pointed directly at an End is **not** a defect either — it is silently dropped on reload; only advise routing faults to a handler so the error path is not lost silently. See `../../shared/anti-patterns.md` item 38. *(Mid-graph convergence on a continuing element or a shared error screen is also fine; Free-Form sources are exempt.)*
|
|
424
|
-
- **[GENERATE] Canvas mode:** a net-new flow must carry the `CanvasMode` PMV — absence is not neutral; the flow silently opens in Free-Form (non-canvas process types like `CustomerLifecycle` are excepted — they take no `CanvasMode`). See `../../shared/anti-patterns.md` item 37. *(EVOLVE: never inject or flip — preserve the source's `processMetadataValues` verbatim.)*
|
|
425
|
-
- Every field name in `decisions[].rules[].conditions[].leftValueReference`, `recordLookups[].filters[].field`, `recordLookups[].queriedFields[]`, `recordCreates`/`recordUpdates`/`recordDeletes` filter/input fields, `assignments[].assignmentItems[].assignToReference`, and any `$Record.<Field>` or `<sObjectVar>.<Field>` in a `formulas[]` expression or `filterFormula` — is each one present in the most recent `GET /services/data/vXX.0/flowbuilder/platform/entity/{apiName}/fields` result for its sObject? If not, do NOT save; branch to *build without the field* or *halt and refer to the admin* per Phase 2 § Probe schema. See `../../shared/anti-patterns.md` item 40.
|
|
426
|
-
- Hard-coded IDs? See `../../shared/anti-patterns.md` item 3.
|
|
427
|
-
- Element names unique and ≤ 80 chars? See `../../shared/anti-patterns.md` items 16, 17.
|
|
428
|
-
- Value field consistency: every value key paired with its `*DataType`, no two value keys, no GUIDs in `elementReference`. See `../../shared/value-rules.md`.
|
|
429
|
-
- **Security posture** (advisory): run the checks in `../../shared/security/security.md`. See `../../shared/anti-patterns.md` item 28. *(EVOLVE: pay attention to changes that newly introduce a risk — switching to system mode, adding a whole-record write, adding a guest-facing screen input.)*
|
|
430
|
-
|
|
431
|
-
Fix all failures **introduced by this build/change** before presenting the
|
|
432
|
-
plan summary. Security and headless-flow observability findings are **advisory** — do not fix silently or block;
|
|
433
|
-
carry them into the plan summary (Security note / a silent-failure-risk note). *(EVOLVE:
|
|
434
|
-
findings on untouched elements are reported, never auto-fixed — see the
|
|
435
|
-
surgical rule.)*
|
|
436
|
-
|
|
437
|
-
### Plan summary artifact
|
|
438
|
-
|
|
439
|
-
The plan summary is the deliverable of the Plan phase: a concise
|
|
440
|
-
**business-language description** of what the flow will do — a short
|
|
441
|
-
ordered list of steps in plain English, no diagram. It is an approval aid, not a
|
|
442
|
-
faithful reconstruction of the flow: the exact element graph lives in the FDL
|
|
443
|
-
itself (and, after save, in the real flow via the "Open in Salesforce" link).
|
|
444
|
-
|
|
445
|
-
Build the summary from these step types:
|
|
446
|
-
|
|
447
|
-
| Step type | Description |
|
|
448
|
-
|---|---|
|
|
449
|
-
| Start condition | What triggers the flow |
|
|
450
|
-
| Process | A unit of business work + its expected result |
|
|
451
|
-
| Decision branch | A conditional fork based on business logic |
|
|
452
|
-
| Loop | A repeating process over a set of items |
|
|
453
|
-
| End state | Final outcome or termination point |
|
|
454
|
-
|
|
455
|
-
Keep each step to one line of plain business meaning, and **describe branches and
|
|
456
|
-
loops narratively** in that line rather than drawing them out as a nested tree or
|
|
457
|
-
labeling every arm:
|
|
458
|
-
- Decision: "routes high-value cases to a specialist, everything else to the standard queue."
|
|
459
|
-
- Loop: "for each overdue invoice, sends a reminder."
|
|
460
|
-
|
|
461
|
-
**Decisions only branch — they never retrieve.** If a decision needs
|
|
462
|
-
information, there is a Process step before it ("find the account" → "if active,
|
|
463
|
-
do X"). Decisions are not limited to yes/no — they can fan out to several labeled
|
|
464
|
-
outcomes.
|
|
465
|
-
|
|
466
|
-
**No redundant steps.** If one step logically implies another, collapse them.
|
|
467
|
-
"Ask user for input" already means "capture input" — don't add a separate step.
|
|
468
|
-
This applies below the step level too: a Process step that Get-Records-then-
|
|
469
|
-
filters, followed by a Decision that only guards "did we find anything," followed
|
|
470
|
-
by another Process step whose Update Records re-applies that same filter, is one
|
|
471
|
-
unit of work, not three — the fetched collection already implies the update
|
|
472
|
-
target. See `../../shared/anti-patterns.md` item 30.
|
|
473
|
-
|
|
474
|
-
Each step maps to the concrete FDL elements that implement it.
|
|
475
|
-
|
|
476
|
-
**Marketing flows: leave error handling out of the plan.** In a marketing flow
|
|
477
|
-
(its `start.triggerType` is on the list in `../../shared/fault-paths/fault-paths.md`
|
|
478
|
-
§ Marketing Flows — Fault Paths Only When Asked) where the user didn't ask for
|
|
479
|
-
error handling, the plan has no fault paths. Don't ask whether to add them, don't
|
|
480
|
-
offer to add them, and don't list their absence as a note or a risk.
|
|
481
|
-
|
|
482
|
-
**[EVOLVE] Highlight the change in the summary.** Mark affected steps with a
|
|
483
|
-
text prefix:
|
|
484
|
-
- Added steps: prefix with `+ ` (e.g., `+ Send Email`)
|
|
485
|
-
- Modified steps: prefix with `~ `
|
|
486
|
-
- Removed steps: omit (the summary is the post-change state)
|
|
487
|
-
|
|
488
|
-
If the user supplied the current design in a readable form and the change is
|
|
489
|
-
small, a short "before / after" step list is acceptable.
|
|
490
|
-
|
|
491
|
-
### Security note (present with the plan summary)
|
|
492
|
-
|
|
493
|
-
Alongside the plan summary, present a short **Security** block so the user
|
|
494
|
-
approves the security posture alongside the design — inline just below the plan
|
|
495
|
-
summary unless the active surface specifies a different presentation channel.
|
|
496
|
-
Include:
|
|
497
|
-
|
|
498
|
-
- **Run mode** — user context (default) vs. system mode; if
|
|
499
|
-
`SystemModeWithoutSharing`, state that sharing/CRUD/FLS are bypassed and why
|
|
500
|
-
it's needed.
|
|
501
|
-
- **Guest exposure** — whether the flow is reachable by Experience Cloud /
|
|
502
|
-
guest users.
|
|
503
|
-
- **Data scope** — any "store all fields" lookups or whole-record DML.
|
|
504
|
-
- Any advisory warnings from the `../../shared/security/security.md` checks, each
|
|
505
|
-
with the recommended safer default.
|
|
506
|
-
|
|
507
|
-
*(EVOLVE: focus on what the edit changes — run mode, guest exposure, new "store
|
|
508
|
-
all fields" lookups or whole-record DML, untrusted input. If the change
|
|
509
|
-
introduces no new security concern, say so in one line.)*
|
|
510
|
-
|
|
511
|
-
If none apply, render one line:
|
|
512
|
-
`Security: user context, no guest exposure, fields scoped — no concerns.`
|
|
513
|
-
These are advisory — never block the plan on them; the user decides whether to
|
|
514
|
-
accept.
|
|
515
|
-
|
|
516
|
-
### Phase 2 closing
|
|
517
|
-
|
|
518
|
-
Present the plan summary (business-language step list) followed by the Security
|
|
519
|
-
note and ask for approval:
|
|
520
|
-
|
|
521
|
-
> Approve this plan?
|
|
522
|
-
>
|
|
523
|
-
> Reply "approve" / "yes" to save, or describe what to change.
|
|
524
|
-
|
|
525
|
-
Valid responses:
|
|
526
|
-
- **Accept** → proceed to Phase 3 (Save).
|
|
527
|
-
- **Refine** → adjust the design, re-present the plan summary, re-ask.
|
|
528
|
-
- **Reject** (EVOLVE) → ask the user what to revisit; iterate until accept or abandon.
|
|
529
|
-
|
|
530
|
-
Do not call `POST /services/data/vXX.0/flowbuilder/flow/actions/save` without an explicit accept of the
|
|
531
|
-
plan summary.
|
|
532
|
-
|
|
533
|
-
---
|
|
534
|
-
|
|
535
|
-
## Phase 3 — Save
|
|
536
|
-
|
|
537
|
-
**Save policy.** If the surface config declared save DISABLED, skip persistence: run
|
|
538
|
-
the steps below through step 5's validate, then hand the final FDL to the client
|
|
539
|
-
once. Never hand it off before validate. Otherwise proceed with the save steps below.
|
|
540
|
-
|
|
541
|
-
### Save steps
|
|
542
|
-
|
|
543
|
-
1. **Materialize the FDL.** Fill in element shapes from the per-element skills.
|
|
544
|
-
Apply mutual-exclusivity and mode rules documented in each element's skill
|
|
545
|
-
file. *(EVOLVE: emit the full working graph — the loaded flow plus the
|
|
546
|
-
surgical change, with all untouched parts preserved verbatim — **except**
|
|
547
|
-
the read-back-form normalization described in the surgical rule above,
|
|
548
|
-
which applies even to untouched elements. See `../../shared/anti-patterns.md`
|
|
549
|
-
item 38.)*
|
|
550
|
-
|
|
551
|
-
2. **Handle `processMetadataValues` — mode-branched:**
|
|
552
|
-
- **GENERATE except `CustomerLifecycle`:** always emit in the top-level `metadata` object:
|
|
553
|
-
```json
|
|
554
|
-
"processMetadataValues": [
|
|
555
|
-
{ "name": "BuilderType", "value": { "stringValue": "LightningFlowBuilder" } },
|
|
556
|
-
{ "name": "CanvasMode", "value": { "stringValue": "AUTO_LAYOUT_CANVAS" } }
|
|
557
|
-
]
|
|
558
|
-
```
|
|
559
|
-
`AUTO_LAYOUT_CANVAS` is the required default for net-new flows, emitted
|
|
560
|
-
**independently of** `BuilderType` — the two are separate PMVs; never gate
|
|
561
|
-
emitting one on the presence of the other. Absence is not neutral: the
|
|
562
|
-
builder opens a canvas-mode-less flow in **Free-Form**. Emitting the
|
|
563
|
-
`CanvasMode` entry is a hard gate on a net-new save — do not rely on the
|
|
564
|
-
server-side backfill, which covers only the persisted `POST /services/data/vXX.0/flowbuilder/flow/actions/save` net-new
|
|
565
|
-
path, not the no-persist hand-off or other save types (see
|
|
566
|
-
`../../shared/anti-patterns.md` item 37).
|
|
567
|
-
- **GENERATE `CustomerLifecycle`:** omit `BuilderType`, `CanvasMode`, and
|
|
568
|
-
`OriginBuilderType`. Emit only `{ "name": "ObjectType", "value": {
|
|
569
|
-
"stringValue": "<metadata.start.object>" } }` — a `CanvasMode` PMV is rejected.
|
|
570
|
-
- **EVOLVE:** preserve the source flow's `processMetadataValues` **verbatim**
|
|
571
|
-
— never inject, overwrite, or flip `BuilderType`/`CanvasMode`/`OriginBuilderType`.
|
|
572
|
-
If the source carries no `CanvasMode`, leave it absent: the flow is already
|
|
573
|
-
Free-Form in the builder, and stamping `AUTO_LAYOUT_CANVAS` would silently
|
|
574
|
-
re-layout (and can corrupt) an existing flow. Never synthesize
|
|
575
|
-
`OriginBuilderType`. Canvas mode is the user's to change, never the agent's.
|
|
576
|
-
For `CustomerLifecycle`, preserve or set only `ObjectType` to match
|
|
577
|
-
`metadata.start.object`; do not inject canvas entries.
|
|
578
|
-
|
|
579
|
-
3. **Determine `saveType` — mode-branched:**
|
|
580
|
-
|
|
581
|
-
- **GENERATE:** new definition (net-new save). Use `saveType: "createNewFlow"`.
|
|
582
|
-
**Name-collision guard:** before saving, if the chosen flow label /
|
|
583
|
-
`fullName` would collide with an existing flow definition in the org,
|
|
584
|
-
surface it to the user and confirm before proceeding (rename, or
|
|
585
|
-
intentionally version the existing one). Do not silently create a
|
|
586
|
-
duplicate or clobber an existing definition.
|
|
587
|
-
- **EVOLVE:**
|
|
588
|
-
|
|
589
|
-
| Situation | saveType |
|
|
590
|
-
|---|---|
|
|
591
|
-
| Editing the current draft version in place | `saveDraft` with `currentFlowId` |
|
|
592
|
-
| Saving as a new version (keep old active) | `saveAsNewVersion` |
|
|
593
|
-
| Renaming / new API name | `saveAsNewDefinition` — confirm with user first |
|
|
594
|
-
|
|
595
|
-
The standalone MCP `POST /services/data/vXX.0/flowbuilder/flow/actions/save` contract does not expose the legacy
|
|
596
|
-
`updateFlow` value. Use `saveDraft` for in-place draft updates.
|
|
597
|
-
|
|
598
|
-
4. **Pre-save Auditor pass** — repeat the Phase 2 Auditor checks plus:
|
|
599
|
-
- **Schema check:** the flow matches `../../shared/flow-metadata-schema.md`, and every element used matches its own reference: only documented keys, at the documented level, with values that element accepts.
|
|
600
|
-
- `no_conditions` internal placeholder omitted (replaced by `[]` and absent logic field). See `../../shared/anti-patterns.md` item 12.
|
|
601
|
-
- `sortOrder: "NotSorted"` omitted (both `sortOrder` and `sortField` absent). See `../../shared/anti-patterns.md` item 9.
|
|
602
|
-
- `storeOutputAutomatically: true` paired with empty or absent output assignments. See `../../shared/anti-patterns.md` item 15.
|
|
603
|
-
- **[GENERATE] Process metadata present:** `processMetadataValues` is **non-empty**; for every process type except `CustomerLifecycle`, require `CanvasMode: AUTO_LAYOUT_CANVAS` + `BuilderType: LightningFlowBuilder` (each emitted independently — a missing or empty `[]` array opens the flow in Free-Form). For `CustomerLifecycle`, require only `ObjectType` matching `metadata.start.object` and reject canvas entries. Do not synthesize `OriginBuilderType`; preserve it only when evolving a supported source that already has it. See `../../shared/flow-properties/flow-properties.md` § "Canvas Mode and `processMetadataValues`" and `../../shared/anti-patterns.md` item 37. *(EVOLVE: preserve the source's `processMetadataValues` verbatim — never inject or flip.)*
|
|
604
|
-
- **[`AUTO_LAYOUT_CANVAS`] End/fault topology (re-verify):** at materialization/connector-wiring time, confirm every terminating branch reaches an explicit End. A shared End (2+ non-fault connectors into one entry) is valid — do not flag or split it. A `faultConnector` targeting an End is not a defect (it drops silently on reload); advise a handler only for observability. See `../../shared/anti-patterns.md` item 38.
|
|
605
|
-
- **[GENERATE; `AUTO_LAYOUT_CANVAS`; `apiVersion` ≥ 68.0] Explicit ends present:** the materialized payload carries an `ends[]` array, and every terminating branch's connector targets an entry in it (`END_ELEMENT_n`) — dedicated or shared. Below 68.0 and on Free-Form, confirm `ends[]` is **absent** (branches omit their connector) — a Free-Form flow must never carry `ends[]`. See `../../shared/end/end.md`. *(EVOLVE: `ends[]` matches the source plus any Ends added for new auto-layout branches.)*
|
|
606
|
-
- **[`AUTO_LAYOUT_CANVAS`] End referential integrity:** every connector whose `targetReference` is an End name has a matching `ends[]` entry with that exact `name`, and every `ends[]` entry is targeted by at least one connector. A connector to an undefined End fails the save with **"`<EndName>` not found"** — **fix by ADDING the `ends[]` entry, never by removing the connector** (removing it deletes the terminating branch). See `../../shared/anti-patterns.md` item 14 and `../../shared/end/end.md` § Referential integrity.
|
|
607
|
-
- **Coordinate bounds:** require every `locationX` and `locationY` to be
|
|
608
|
-
between `0` and `500000`, inclusive. Negative coordinates fail
|
|
609
|
-
`POST /services/data/vXX.0/flowbuilder/flow/actions/save` with `ELEMENT_COORDINATES_INVALID` even under
|
|
610
|
-
`AUTO_LAYOUT_CANVAS`. See `../../shared/node/node.md`.
|
|
611
|
-
- **Coordinates present on every node:** the `start` element, every `ends[]`
|
|
612
|
-
entry and every other canvas element carry `locationX` and `locationY`
|
|
613
|
-
(`0` and `0` for `start` and the Ends; in Flow XML, `<locationX>` and
|
|
614
|
-
`<locationY>` inside `<start>` and inside each `<ends>`), whatever the
|
|
615
|
-
trigger. One missing pair and the org rejects the flow:
|
|
616
|
-
`Required field is missing: locationX`.
|
|
617
|
-
- **Security posture** (advisory): re-run the `../../shared/security/security.md` checks against the materialized FDL. Warn only; never block the save. See `../../shared/anti-patterns.md` item 28.
|
|
618
|
-
- **Read-back-form scheduling fields.** Scan the materialized payload for `schedule.startTime`/`schedule.endTime`/`schedule.startDate`/`schedule.endDate` (Start element, Scheduled trigger) and `resumeTime`/`resumeDate` (Wait element) that are still in server read-back shape — a `{ "timeInMillis": N }` object for a time field, or an epoch-millis integer for a date field. Convert every one to its wire-string form (`"HH:mm:ss.SSS"` / `"YYYY-MM-DD"`) before calling `POST /services/data/vXX.0/flowbuilder/flow/actions/save`, on touched AND untouched elements alike. See `../../shared/anti-patterns.md` item 39.
|
|
619
|
-
- Any non-empty `customErrors[]` when `triggerType` is absent or not `RecordBeforeSave`/`RecordAfterSave`? Invalid — save fails with `TRIGGER_TYPE_ELEMENT_NOT_SUPPORTED`. Retarget fault paths to a `Log_Error` actionCall or a `$Flow.FaultMessage` Assignment. See `../../shared/anti-patterns.md` item 2. *(Observability is advisory — prefer a persisted/notified handler; see `../../shared/fault-paths/fault-paths.md` § Observable vs. In-Memory-Only Fault Handling.)* *(Redundant with the Phase 2 check above — Phase 2 should have caught this, but it is re-verified here because materialization in Step 5 can introduce or reconnect a `customErrors` element after the Phase 2 pass.)*
|
|
620
|
-
- **Transform depth and scoping rule**: for any `transforms[]` element, verify the depth difference between the deepest source `elementReference` (number of `[$EachItem]` iterators) and the output depth is ≤ 1. A depth-2 source cannot produce a depth-1 **primitive** output — that is an invalid use case for Map (use Loop + Assignment instead). For SObject/Apex output at depth-N, verify that the same `transformValueActions` array contains at least one scoping action at each intermediate depth level 1 through N-1 (an action whose `elementReference` has exactly that many `[$EachItem]` iterators). Same rule applies to Sum/Count on nested collections — scoping lines must establish the collection hierarchy. See `../../elements/transform/types/map.md` § Nested collection scoping line missing.
|
|
621
|
-
- **Send to Journey live gate**: rerun the pre-save checklist in
|
|
622
|
-
`../../elements/action-call/send-to-journey.md`. Stop when any live selector,
|
|
623
|
-
Segment binding, schema URI, requiredness flag, or required mapping differs
|
|
624
|
-
from the materialized FDL.
|
|
625
|
-
|
|
626
|
-
5. **Persist per the active surface config's save policy.** If the active surface config
|
|
627
|
-
disables persistence, do not save. Instead call
|
|
628
|
-
`dispatch(method: "POST", url: "/services/data/vXX.0/flowbuilder/flow/actions/validate", body: {"flow": {"fullName": "<flow API name>", "metadata": <materialized FDL>}})`.
|
|
629
|
-
Fix its `errors[]` and `warnings[]` (even when `isSuccess: true`) on what
|
|
630
|
-
this change touched — on EVOLVE, leave the rest unchanged (minimal-surface
|
|
631
|
-
rule) and report it only where the surface's response policy permits — and,
|
|
632
|
-
if anything changed, re-validate (**cap at 3 silent retries**). A 400 that
|
|
633
|
-
rejects the flow definition (e.g. `ILLEGAL_QUERY_PARAMETER_VALUE`, "not a
|
|
634
|
-
valid flow definition") may mean the step 4 schema check missed something.
|
|
635
|
-
Redo it on what this change touched; if that finds a defect, fix it and
|
|
636
|
-
re-validate under the same cap. Otherwise treat the call as having no
|
|
637
|
-
result. Any other non-2xx, a 400 once the cap is reached, or a response
|
|
638
|
-
without `isSuccess` is a call with no result. If the first validate has no
|
|
639
|
-
result, return the FDL unchanged. If a re-validate has no result or adds an
|
|
640
|
-
issue, return the FDL from before that round's fixes. Otherwise return the
|
|
641
|
-
latest FDL.
|
|
642
|
-
Report per the surface's response policy.
|
|
643
|
-
|
|
644
|
-
If persistence is enabled, construct the complete save request before
|
|
645
|
-
dispatching. The request root contains `flow` and `saveType`; `fullName` and
|
|
646
|
-
`metadata` belong **inside** `flow`. For a new flow, use this envelope:
|
|
647
|
-
|
|
648
|
-
```json
|
|
649
|
-
{
|
|
650
|
-
"flow": {
|
|
651
|
-
"fullName": "My_Flow",
|
|
652
|
-
"metadata": {}
|
|
653
|
-
},
|
|
654
|
-
"saveType": "createNewFlow"
|
|
655
|
-
}
|
|
656
|
-
```
|
|
657
|
-
|
|
658
|
-
Replace the empty example `metadata` with the complete materialized FDL.
|
|
659
|
-
For an existing flow, keep the same envelope and use the Step 3 `saveType`
|
|
660
|
-
and any required `currentFlowId` at the request root. Before dispatch,
|
|
661
|
-
verify that root `flow` is an object, root `saveType` is present, and root
|
|
662
|
-
`fullName`, `metadata`, and `versionNumber` are absent. A bare tooling Flow
|
|
663
|
-
body causes HTTP 400 `JSON_PARSER_ERROR` (`Unrecognized field "fullName"`).
|
|
664
|
-
Call `dispatch(method: "POST", url: "/services/data/vXX.0/flowbuilder/flow/actions/save", body: <checked envelope>)`.
|
|
665
|
-
On failure, parse
|
|
666
|
-
`errors[]` and `warnings[]`, map each to an anti-pattern or shape rule, apply a
|
|
667
|
-
targeted fix, and retry. **Cap at one silent retry.** If still failing after
|
|
668
|
-
one retry, surface the verbatim `errors[]` and `warnings[]` to the user.
|
|
669
|
-
*(Exception: a step flow that `../orchestrate/orchestrate.md` co-generates
|
|
670
|
-
uses that recipe's step-flow save loop instead: up to 3 attempts, until the
|
|
671
|
-
save's `status` is `Draft`.)*
|
|
672
|
-
|
|
673
|
-
6. **Return the deep link.** If the active surface config's save policy disables
|
|
674
|
-
persistence, skip this step — no saved definition exists to link to, and you
|
|
675
|
-
already returned the FDL to the client in step 5. Otherwise append the
|
|
676
|
-
"Open in Salesforce" link per `../../shared/preview-renderer.md` § "Deep-link template".
|
|
677
|
-
Stop after this hand-off. Do not call `POST /services/data/vXX.0/flowbuilder/flow/{flowId}/actions/activate` (activateFlow — DO NOT DISPATCH, quarantined), `POST /services/data/vXX.0/flowbuilder/flow/{flowId}/actions/deactivate`, or
|
|
678
|
-
`POST /services/data/vXX.0/flowbuilder/flow/{flowId}/actions/submit-for-activation` after a successful save. Direct activation is
|
|
679
|
-
disabled, deactivation is the inverse operation, and activation-approval
|
|
680
|
-
submission is not a fallback activation route.
|
|
681
|
-
|
|
682
|
-
*(EVOLVE: after a successful save, treat `GET /services/data/vXX.0/flowbuilder/flow/{flowDefinitionId}/versions` and
|
|
683
|
-
`GET /services/data/vXX.0/flowbuilder/flow/{id}/validation-results` as stale — re-fetch on next use.)*
|
|
684
|
-
|
|
685
|
-
---
|
|
686
|
-
|
|
687
|
-
## Connector Wiring
|
|
688
|
-
|
|
689
|
-
- Regular outgoing edge: `connector` field.
|
|
690
|
-
- Default (no-match) branch on Decision: `defaultConnector`.
|
|
691
|
-
- Loop per-iteration path: `nextValueConnector`. Loop exit: `noMoreValuesConnector`.
|
|
692
|
-
- Fault path: `faultConnector`.
|
|
693
|
-
- `targetReference` on every connector must be the dev-name of the target element, never a GUID.
|
|
694
|
-
- Last element in a branch (flow end): on GENERATE with `AUTO_LAYOUT_CANVAS` at resolved `apiVersion` ≥ 68.0, point its `connector` at a dedicated `ends[]` entry (`END_ELEMENT_n`, one per branch — the v68+ default); below 68.0 and on any Free-Form flow, omit the `connector` field entirely and emit no `ends[]` (**never emit `ends[]` on Free-Form**). See `../../shared/end/end.md`.
|
|
695
|
-
- A terminal error-only screen (reached via `faultConnector`) takes no non-fault inbound edge; keep the last success screen terminal instead of pointing it at the error screen. See `../../shared/anti-patterns.md` item 36.
|
|
696
|
-
|
|
697
|
-
---
|
|
698
|
-
|
|
699
|
-
## Element Skill Registry
|
|
700
|
-
|
|
701
|
-
Load the relevant skill **before** generating any element. Do not preload all
|
|
702
|
-
skills at session start — load lazily as the design (GENERATE) or the change
|
|
703
|
-
(EVOLVE) names each type.
|
|
704
|
-
|
|
705
|
-
### Elements
|
|
706
|
-
|
|
707
|
-
| Element | Skill Path | Load When |
|
|
708
|
-
|---|---|---|
|
|
709
|
-
| Assignment | `../../elements/assignment/assignment.md` | Set/change a variable value |
|
|
710
|
-
| Decision | `../../elements/decision/decision.md` | Branching / conditional logic |
|
|
711
|
-
| Experiment | `../../elements/experiment/experiment.md` | A/B test split in journey flows |
|
|
712
|
-
| Loop | `../../elements/loop/loop.md` | Iterate over a list/collection |
|
|
713
|
-
| Custom Error | `../../elements/custom-error/custom-error.md` | Throw a custom error message |
|
|
714
|
-
| Screen | `../../elements/screen/screen.md` | User input or display |
|
|
715
|
-
| Screen Fields | `../../elements/screen/SCREEN-FIELDS.md` | Configuring specific screen fields |
|
|
716
|
-
| Get Records | `../../elements/record-lookup/record-lookup.md` | Query Salesforce records |
|
|
717
|
-
| Create Records | `../../elements/record-create/record-create.md` | Insert new Salesforce records |
|
|
718
|
-
| Update Records | `../../elements/record-update/record-update.md` | Modify existing Salesforce records |
|
|
719
|
-
| Delete Records | `../../elements/record-delete/record-delete.md` | Remove Salesforce records |
|
|
720
|
-
| Action / Apex | `../../elements/action-call/action-call.md` | Call Apex, external service, or invocable action; **show a toast / success / error / notification message, or navigate / open a page / URL** (LWC local actions) |
|
|
721
|
-
| Exit from a Flow | `../../elements/action-call/action-call.md` | Remove an Individual from one named running marketing flow or all applicable running marketing flows; this is an invocable action, not a Subflow |
|
|
722
|
-
| Send Email / SMS / RCS Message | `../../elements/action-call/action-call.md` | Send a marketing email, text or RCS message (`sendEmailMessage`, `sendSmsMessage`, `sendRcsMessage`); read the action's section (Phase 2 step 4, Marketing message probe sequence) |
|
|
723
|
-
| Apex Plugin | `../../elements/action-call/action-call.md` | Legacy Apex Plugin element (section in action-call skill) |
|
|
724
|
-
| AI Agent Response | `../../elements/action-call/action-call.md` | Generate AI agent response (section in action-call skill) |
|
|
725
|
-
| Subflow | `../../elements/subflow/subflow.md` | Call another flow |
|
|
726
|
-
| Wait / Pause | `../../elements/wait/wait.md` | Pause until a time, event, or condition |
|
|
727
|
-
| Start Element | `../../elements/start/start.md` | Configure flow trigger and entry criteria |
|
|
728
|
-
| Audience Flow — shared contract | `../../elements/start/audience-common.md` | Shared build contract for ALL audience triggers (Segment / List / CampaignMember / RecordQuery) — run schedule, top-level `timeZoneSidKey`, top-level `dataSpace`, optional `dataGraph`, re-entry, save-and-activate gates, builder round-trip defaults. **Load FIRST for any audience trigger**, then the matching per-trigger file below |
|
|
729
|
-
| Segment-Triggered Flow | `../../elements/start/segment-triggered.md` | Segment (Audience) marketing flow build guide — REQUIRED (after `audience-common.md`) before configuring a Segment flow (segment binding chain, eligibility gate, `publishSegment`, outreach actions, `$Record` member context) |
|
|
730
|
-
| List / CampaignMember Flow | `../../elements/start/list-campaignmember.md` | Actionable List (`triggerType: List`) + Campaign Member (`triggerType: CampaignMember`) build guide — REQUIRED (after `audience-common.md`) before configuring either (the `start.listAction` binding, audience-selection gate, `$Input` member handles, validate-vs-save gotcha, examples) |
|
|
731
|
-
| Record Query Flow | `../../elements/start/recordquery.md` | Record Query (`triggerType: RecordQuery`, all records of one SObject matching a filter) build guide — REQUIRED (after `audience-common.md`) before configuring it (the `start.object` + optional `start.filters` binding, `CRM_OBJECT_SELECTION_REQUIRED` gate, direct `$Input.<field>` record context, example) |
|
|
732
|
-
| Collection Processor | `../../elements/collection-processor/collection-processor.md` | Filter, sort, or map a collection into **another collection** (many → many). For narrowing a collection to a **single** record, use Collection Filter Criteria (Resources, below) instead. |
|
|
733
|
-
| Transform | `../../elements/transform/transform.md` | Extract or map fields uniformly from a collection (prefer over Loop + Assignment when no per-item branching is needed); transform data between collections |
|
|
734
|
-
| Rollback | `../../elements/rollback/rollback.md` | Rollback database changes in a transaction |
|
|
735
|
-
| Exit Rule | `../../elements/exit-rule/exit-rule.md` | End a Segment/On-Demand/Journey/Digital Form flow interview early for an individual on a condition or an engagement event |
|
|
736
|
-
| Group (canvas layout) | `../../shared/group/group.md` | Node grouping requested (`groups`/`nodeGroups`/FlowNodeGroup, "add elements to a group") — **NOT authorable from AI surfaces**; load to decline & redirect to Flow Builder |
|
|
737
|
-
|
|
738
|
-
### Resources
|
|
739
|
-
|
|
740
|
-
| Resource | Skill Path | Load When |
|
|
741
|
-
|---|---|---|
|
|
742
|
-
| Variable | `../../resources/variable/variable.md` | Storing / passing data values |
|
|
743
|
-
| Constant | `../../resources/constant/constant.md` | Fixed values used throughout the flow |
|
|
744
|
-
| Formula | `../../resources/formula/formula.md` | Calculated expressions |
|
|
745
|
-
| Text Template | `../../resources/text-template/text-template.md` | Dynamic text with merge fields |
|
|
746
|
-
| Choice / Choice Sets | `../../resources/choice/choice.md` | Choices for screen picklists/radio buttons |
|
|
747
|
-
| Collection Filter Criteria | `../../resources/collection-filter-criteria/collection-filter-criteria.md` | Filter + sort an existing collection down to a **single** record (top/first match, e.g. highest-value opp, most recent case); read-only. **Not** for producing a new collection — that's Collection Processor. |
|
|
748
|
-
|
|
749
|
-
### Shared Features
|
|
750
|
-
|
|
751
|
-
| Feature | Skill Path | Load When |
|
|
752
|
-
|---|---|---|
|
|
753
|
-
| Conditions & Logic | `../../shared/conditions/conditions.md` | AND/OR/custom filter logic |
|
|
754
|
-
| Record Filters | `../../shared/record-filter/record-filter.md` | Building `filters[]` on recordDeletes, recordUpdates, recordLookups, recordCreates (upsert), or start |
|
|
755
|
-
| Output Assignments | `../../shared/output-assignments/output-assignments.md` | Mapping element outputs to variables |
|
|
756
|
-
| Fault Paths | `../../shared/fault-paths/fault-paths.md` | Error handling for DML/Action elements |
|
|
757
|
-
| Ends | `../../shared/end/end.md` | Terminating a branch — when to store an explicit `ends[]` End (GENERATE, `AUTO_LAYOUT_CANVAS`, `apiVersion` ≥ 68.0) vs. omit the connector; never on Free-Form |
|
|
758
|
-
| Validation Rules | `../../shared/validation-rules/validation-rules.md` | Validating screen field input |
|
|
759
|
-
| Flow Properties | `../../shared/flow-properties/flow-properties.md` | Flow label, API name, run mode, API version |
|
|
760
|
-
| Security | `../../shared/security/security.md` | Auditing run mode, data scope, and untrusted input — advisory security checks run before every save |
|
|
761
|
-
|
|
762
|
-
### Reference Files (always available)
|
|
763
|
-
|
|
764
|
-
| Topic | File | Load When |
|
|
765
|
-
|---|---|---|
|
|
766
|
-
| Anti-patterns | `../../shared/anti-patterns.md` | Before every save — mandatory Auditor pass |
|
|
767
|
-
| Value field rules | `../../shared/value-rules.md` | Setting field values, conditions, assignments, action parameters |
|
|
768
|
-
| Formula expression language | `../../shared/formula-expression.md` | Writing any formula expression — operators, functions, picklist/ISPICKVAL, limits, type coercion |
|
|
769
|
-
| Flow JSON schema | `../../shared/flow-metadata-schema.md` | Building a complete flow payload or debugging a JSON shape error |
|
|
770
|
-
| Process/trigger decision | `../../shared/flow-type-resolver/flow-type-resolver.md` | Picking processType + triggerType in Phase 2 |
|
|
771
|
-
| Tool catalog / limits | `../../shared/server-functions.md` | Checking tool costs, governor limits, unregistered tool names |
|
|
772
|
-
| Preview rendering | `../../shared/preview-renderer.md` | "Open in Salesforce" deep link appended after a successful save |
|
|
773
|
-
|
|
774
|
-
---
|
|
775
|
-
|
|
776
|
-
## Mandatory Probes by Element Type
|
|
777
|
-
|
|
778
|
-
Run these in Phase 2 step 4 (Probe schema), once per unique argument set:
|
|
779
|
-
|
|
780
|
-
| Element type | Tool to call |
|
|
781
|
-
|---|---|
|
|
782
|
-
| `actionCalls` | `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/action/invocable-action-details", queryParams: { actionType, actionName })` |
|
|
783
|
-
| `recordCreates`, `recordUpdates`, `recordLookups`, `recordDeletes` | `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/platform/entity/{apiName}/fields")` |
|
|
784
|
-
| `decisions`, `recordLookups` (filters) | `GET /services/data/vXX.0/flowbuilder/schema/flow-capabilities` (read `.operators`) |
|
|
785
|
-
| `subflows` | `GET /services/data/vXX.0/flowbuilder/flow/subflows` |
|
|
786
|
-
| Screen `ComponentInstance` fields | `GET /services/data/vXX.0/flowbuilder/screen-component` + `GET /services/data/vXX.0/flowbuilder/screen-component/{apiName}` |
|
|
787
|
-
|
|
788
|
-
---
|
|
789
|
-
|
|
790
|
-
## Build Order (Phase 3 metadata dependency order)
|
|
791
|
-
|
|
792
|
-
```text
|
|
793
|
-
1. Flow Properties (label, processType, apiVersion, runInMode, interviewLabel,
|
|
794
|
-
processMetadataValues with BuilderType + CanvasMode; preserve source OriginBuilderType only)
|
|
795
|
-
2. Resources (variables, constants, formulas, text templates, choices)
|
|
796
|
-
3. Start element (trigger configuration)
|
|
797
|
-
4. Flow elements (in execution order)
|
|
798
|
-
5. Connectors (linking elements; on GENERATE + AUTO_LAYOUT_CANVAS + apiVersion >= 68.0,
|
|
799
|
-
each terminating branch's connector targets a dedicated ends[] entry)
|
|
800
|
-
6. Ends (ends[] entries — GENERATE + AUTO_LAYOUT_CANVAS + apiVersion >= 68.0 only;
|
|
801
|
-
none below 68.0 or on Free-Form. See shared/end/end.md)
|
|
802
|
-
```
|
|
803
|
-
|
|
804
|
-
*(EVOLVE preserves the existing order and only inserts/removes/modifies the
|
|
805
|
-
elements the change requires — see the surgical rule.)*
|
|
806
|
-
|
|
807
|
-
---
|
|
808
|
-
|
|
809
|
-
## Common Failures
|
|
810
|
-
|
|
811
|
-
**Calling save_and_validate before the plan gate.** Hard contract violation.
|
|
812
|
-
The user has not approved the plan summary yet; saving without their
|
|
813
|
-
accept is a forbidden write. The plan gate is never skipped, even with an
|
|
814
|
-
override phrase.
|
|
815
|
-
|
|
816
|
-
**Downgrading an evolve to a net-new build because JSON was missing.** If the
|
|
817
|
-
intent is to edit an existing flow, an empty/absent flow body is a STOP-and-ask
|
|
818
|
-
condition, not a license to generate a fresh flow. See Phase 0.
|
|
819
|
-
|
|
820
|
-
**Over-editing in EVOLVE.** Rewriting, reformatting, or "improving" elements the
|
|
821
|
-
user did not ask about violates the surgical rule and makes the edit
|
|
822
|
-
non-reviewable. Touch only what the change requires.
|
|
823
|
-
|
|
824
|
-
**Re-calling probe tools across phases.** Each `GET /services/data/vXX.0/flowbuilder/platform/entity/{apiName}/fields`
|
|
825
|
-
or `GET /services/data/vXX.0/flowbuilder/action/invocable-action-details` call counts against Salesforce API rate
|
|
826
|
-
limits. If Phase 2 step 4 already called a tool with the same arguments,
|
|
827
|
-
reuse the result throughout the rest of the phase. See `../../shared/anti-patterns.md` item 23.
|
|
828
|
-
|
|
829
|
-
**Skipping the Auditor checks.** The platform validator returns one error at a
|
|
830
|
-
time. Run Auditor checks locally before every save call.
|
|
831
|
-
|
|
832
|
-
**Handing off activation without version identification.** Report the flow full
|
|
833
|
-
name, version number, last-modified-by, last-modified-date, and target org before
|
|
834
|
-
directing the user to activate in Flow Builder UI. Never call `POST /services/data/vXX.0/flowbuilder/flow/{flowId}/actions/activate` (activateFlow — DO NOT DISPATCH, quarantined).
|
|
835
|
-
See `../../shared/anti-patterns.md` item 21.
|
|
836
|
-
|
|
837
|
-
**Emitting XML.** The save-and-validate API accepts JSON only. Never emit XML
|
|
838
|
-
angle brackets, namespace declarations, or CDATA sections. See
|
|
839
|
-
`../../shared/flow-metadata-schema.md`.
|
|
840
|
-
|
|
841
|
-
**Forgetting `processMetadataValues` (GENERATE).** An absent `CanvasMode` opens
|
|
842
|
-
the flow in **Free-Form** in the builder. Always emit the
|
|
843
|
-
`CanvasMode=AUTO_LAYOUT_CANVAS` entry (independently of `BuilderType`) for a
|
|
844
|
-
net-new canvas-based flow — don't rely on the server backfill, which covers only
|
|
845
|
-
the persisted `POST /services/data/vXX.0/flowbuilder/flow/actions/save` net-new path. For `CustomerLifecycle`, emit only
|
|
846
|
-
`ObjectType` matching `metadata.start.object` (no canvas entries). In EVOLVE,
|
|
847
|
-
preserve the source's values **verbatim** — never inject or flip. See
|
|
848
|
-
`../../shared/anti-patterns.md` item 37.
|
|
849
|
-
|
|
850
|
-
---
|
|
851
|
-
|
|
852
|
-
## Stop Conditions
|
|
853
|
-
|
|
854
|
-
Stop and ask the user when:
|
|
855
|
-
|
|
856
|
-
- **[EVOLVE]** No source flow JSON is available and the user wants element-level edits.
|
|
857
|
-
- Object or field names are not specified after Phase 2 schema probing reveals the ambiguity.
|
|
858
|
-
- Conflicting trigger requirements emerge during Phase 2.
|
|
859
|
-
- The intent is ambiguous between a new flow and an edit (ask the Phase 0 tie-breaker).
|
|
860
|
-
- The plan summary is rejected twice without convergence.
|
|
861
|
-
- One failed `POST /services/data/vXX.0/flowbuilder/flow/actions/save` retry in Phase 3.
|
|
862
|
-
- Probe budget exceeded (> 10 probe calls for one Phase 2).
|
|
863
|
-
- A Send to Journey business unit is missing, unmapped, or mapped to a Data Space other than `metadata.dataSpace`.
|
|
864
|
-
- A Send to Journey lookup has no compatible Journey, or has multiple matches without a user selection.
|
|
865
|
-
- The `sendToJourney` descriptor, Journey schema, or a required Journey-field mapping cannot be resolved.
|
|
866
|
-
- **[EVOLVE]** The requested change conflicts with a platform constraint (e.g., adding a DML element inside a before-save flow).
|
|
867
|
-
- **[EVOLVE]** The edit requires renaming the flow's API name (`saveAsNewDefinition`) — confirm before proceeding.
|
|
868
|
-
- **[EVOLVE]** Architecture Pushback: the requested change introduces an anti-pattern (CRUD in loop, missing fault path outside a marketing flow, hard-coded ID) — surface it, do not silently fix.
|