@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,180 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: flow.recipes.testing.shared-stages.intent-analyzer
|
|
3
|
-
description: "Phase 1 of author-test and debug workflows — classify the user request, run the eligibility probe, detect silo mode, and extract the flow shape."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Intent analyzer (shared stage)
|
|
7
|
-
|
|
8
|
-
<!-- Consumers: workflows/author-test.md (Phase 1), workflows/debug.md (Phase 1), workflows/save-debug.md (Phase 1) -->
|
|
9
|
-
|
|
10
|
-
The first phase in the author-test and debug workflows. Reads the user
|
|
11
|
-
request and the parent flow, classifies what the user is asking for,
|
|
12
|
-
confirms the flow is eligible, and emits a structured assessment that
|
|
13
|
-
later phases consume.
|
|
14
|
-
|
|
15
|
-
This stage is **read-only**: no `POST /services/data/vXX.0/flowbuilder/flow-test`/`PATCH /services/data/vXX.0/flowbuilder/flow-test/{id}`,
|
|
16
|
-
a `run_*` call, or any other write call happens here. Output is a
|
|
17
|
-
plain assessment object handed to the next phase.
|
|
18
|
-
|
|
19
|
-
## Step 1 — Input classification
|
|
20
|
-
|
|
21
|
-
The Route-by-intent table in [[flow.recipes.testing]] is the **single
|
|
22
|
-
source of truth for the trigger phrases** — this stage does not re-list
|
|
23
|
-
them. The router already picked a workflow from that table; this stage's
|
|
24
|
-
job is to **confirm that routing was right** for the flow at hand and
|
|
25
|
-
emit the matching intent (one of `author-test`, `debug`, `promote`,
|
|
26
|
-
`save-debug`, `run-saved`, `coverage`) in the Step 5 assessment.
|
|
27
|
-
|
|
28
|
-
Confirm against the router's table rather than re-deriving from scratch:
|
|
29
|
-
the consuming workflow tells you which intent it expects (author-test
|
|
30
|
-
expects `author-test`, debug expects `debug`, and so on). **If the flow
|
|
31
|
-
or request doesn't match that expected intent, hand control back to the
|
|
32
|
-
router** — do not silently proceed down the wrong workflow.
|
|
33
|
-
|
|
34
|
-
If the intent is `run-saved` or `coverage`, hand control back to the
|
|
35
|
-
router — those paths skip this stage and go directly to the run-tool
|
|
36
|
-
decision table or the coverage interpretation-only path. No coverage
|
|
37
|
-
operation is onboarded to MCP.
|
|
38
|
-
|
|
39
|
-
## Step 2 — Eligibility check (mandatory, no shortcuts)
|
|
40
|
-
|
|
41
|
-
Call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow/{id}")` for the target flow. Read:
|
|
42
|
-
|
|
43
|
-
- `processType` (top-level)
|
|
44
|
-
- `metadata.start.triggerType` (treat absent as `"None"`)
|
|
45
|
-
|
|
46
|
-
Check against the confirmed-supported combos:
|
|
47
|
-
|
|
48
|
-
| `processType` | `triggerType` | Status |
|
|
49
|
-
|---|---|---|
|
|
50
|
-
| `AutoLaunchedFlow` | `RecordBeforeSave` | Supported |
|
|
51
|
-
| `AutoLaunchedFlow` | `RecordAfterSave` | Supported |
|
|
52
|
-
| `AutoLaunchedFlow` | `None` (or absent) | Supported |
|
|
53
|
-
| `AutoLaunchedFlow` | `Scheduled` | **Not supported** |
|
|
54
|
-
| `Flow` | `None` (screen flow) | **Not supported** |
|
|
55
|
-
| anything else | anything else | **Probe** |
|
|
56
|
-
|
|
57
|
-
If the combo is unknown, call
|
|
58
|
-
`GET /services/data/vXX.0/flowbuilder/schema/flow-capabilities` (read `.flowFeatures`) with that exact
|
|
59
|
-
`(processType, triggerType)` pair. Look for the literal string
|
|
60
|
-
`"FlowTesting"` in the returned `Array<string>`. **Do not key off
|
|
61
|
-
`"TestModeExperience"`** — that flag is also present on screen flows
|
|
62
|
-
and is misleading.
|
|
63
|
-
|
|
64
|
-
Full table and decision flow: [[flow.recipes.testing.eligibility]].
|
|
65
|
-
|
|
66
|
-
## Step 3 — Silo detection
|
|
67
|
-
|
|
68
|
-
Scan the user message for any of these signals:
|
|
69
|
-
|
|
70
|
-
- Literal `@testSetup`
|
|
71
|
-
- The words "silo", "isolated", "fixture", "test data", "seeded data"
|
|
72
|
-
- A specific Apex class name the user named as the seed source
|
|
73
|
-
|
|
74
|
-
If any signal is present, set `siloMode: true`. When silo mode is on,
|
|
75
|
-
the eligibility check also requires `"FlowTestingWithDataSilo"` in the
|
|
76
|
-
features array — surface that as a second probe before proceeding.
|
|
77
|
-
|
|
78
|
-
### Silo sub-type selection
|
|
79
|
-
|
|
80
|
-
When silo mode is active, choose the `dataSourceType`:
|
|
81
|
-
|
|
82
|
-
- **`AiGenerated` (default)** — when the user has NOT named a specific
|
|
83
|
-
Apex class or said `@testSetup`. The AI becomes the fixture generator.
|
|
84
|
-
- **`ApexClass` (opt-in)** — when the user explicitly names an Apex
|
|
85
|
-
class or says `@testSetup`.
|
|
86
|
-
|
|
87
|
-
The default flip is behavioral: "silo" no longer implies "Apex" —
|
|
88
|
-
AiGenerated is the new default, and Apex is an opt-in.
|
|
89
|
-
|
|
90
|
-
## Step 4 — Flow shape extraction
|
|
91
|
-
|
|
92
|
-
From the `GET /services/data/vXX.0/flowbuilder/flow/{id}` response, extract:
|
|
93
|
-
|
|
94
|
-
- `elementCount` — total number of canvas elements
|
|
95
|
-
- `triggerType` — record-triggered (`RecordBeforeSave` /
|
|
96
|
-
`RecordAfterSave`), non-triggered (`None`), or other
|
|
97
|
-
- `inputVariables[]` — only relevant for non-triggered flows; each
|
|
98
|
-
entry is `{ name, dataType, isInput, isOutput }`. Pulled from the
|
|
99
|
-
flow's `variables[]` filtered by `isInput: true`.
|
|
100
|
-
- `startConfig` — `{ object, recordTriggerType, scheduledPaths }` —
|
|
101
|
-
needed by the payload-builder to pick `InputTriggeringRecordInitial`
|
|
102
|
-
vs. `InputVariable` parameter types.
|
|
103
|
-
- `hasWaits` — `true` when `metadata.waits[]` is non-empty. Detection
|
|
104
|
-
only: a Wait never makes a flow ineligible, and each workflow decides
|
|
105
|
-
what to do with it.
|
|
106
|
-
|
|
107
|
-
This is the structural difference that drives payload shape: a
|
|
108
|
-
record-triggered flow takes `sobjectValue`-bound `$Record`; a
|
|
109
|
-
non-triggered flow takes one `InputVariable` parameter per declared
|
|
110
|
-
input variable.
|
|
111
|
-
|
|
112
|
-
### SObject-reference scan (for AiGenerated silo)
|
|
113
|
-
|
|
114
|
-
When `siloMode: true` and the silo sub-type is `AiGenerated`, identify
|
|
115
|
-
the target SObject that the generator should fabricate a fixture record
|
|
116
|
-
for:
|
|
117
|
-
|
|
118
|
-
- **Record-triggered flows** (`RecordBeforeSave` / `RecordAfterSave`)
|
|
119
|
-
— the trigger object is `start.object`.
|
|
120
|
-
- **Autolaunched flows** (`triggerType: None`) — scan the flow elements
|
|
121
|
-
for the first `recordLookup`, `recordCreate`, `recordUpdate`, or
|
|
122
|
-
`recordDelete` element and extract its `object` field. Alternatively,
|
|
123
|
-
scan `variables[]` for an SObject-typed variable.
|
|
124
|
-
|
|
125
|
-
This story supports **single-object scope only**: if the flow touches
|
|
126
|
-
multiple SObject types, pick the one the user's scenario names and note
|
|
127
|
-
the others as out-of-scope. This scan supports AC-5 (detect and offer).
|
|
128
|
-
|
|
129
|
-
## Step 5 — Output contract
|
|
130
|
-
|
|
131
|
-
Emit a single assessment object:
|
|
132
|
-
|
|
133
|
-
```jsonc
|
|
134
|
-
{
|
|
135
|
-
"intent": "author-test" | "debug" | "promote" | "save-debug" | "run-saved" | "coverage",
|
|
136
|
-
"eligible": true,
|
|
137
|
-
"flowShape": {
|
|
138
|
-
"flowApiName": "<api name>",
|
|
139
|
-
"processType": "AutoLaunchedFlow",
|
|
140
|
-
"triggerType": "RecordAfterSave",
|
|
141
|
-
"elementCount": 7,
|
|
142
|
-
"inputVariables": [],
|
|
143
|
-
"startConfig": { "object": "Account", "recordTriggerType": "Update" },
|
|
144
|
-
"hasWaits": false
|
|
145
|
-
},
|
|
146
|
-
"siloMode": false,
|
|
147
|
-
"targetSObject": null,
|
|
148
|
-
"features": ["FlowTesting", "FlowTestCoverage", "FlowTestingWithDataSilo"]
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
`targetSObject` is the single object type the AiGenerated generator will
|
|
153
|
-
fabricate a fixture for — set from the SObject-reference scan above.
|
|
154
|
-
For record-triggered flows it equals `startConfig.object`; for
|
|
155
|
-
autolaunched flows it is the object resolved from the first
|
|
156
|
-
`recordLookup` / `recordCreate` / `recordUpdate` / `recordDelete`
|
|
157
|
-
element (or an SObject-typed variable). Leave `null` when
|
|
158
|
-
`siloMode: false` or the sub-type is `ApexClass` (the Apex path sources
|
|
159
|
-
its own records). The payload-builder Step 6 and
|
|
160
|
-
[[flow.recipes.testing.workflows.author-test]] Phase 3 both read this
|
|
161
|
-
field to drive the generator.
|
|
162
|
-
|
|
163
|
-
## Step 6 — Error path
|
|
164
|
-
|
|
165
|
-
If `eligible: false`:
|
|
166
|
-
|
|
167
|
-
1. Tell the user FlowTest is not supported for this `(processType,
|
|
168
|
-
triggerType)` combo, naming both values.
|
|
169
|
-
2. Offer the debug workflow as the ad-hoc-validation alternative — point
|
|
170
|
-
them at [[flow.recipes.testing.workflows.debug]], which probes the
|
|
171
|
-
flow's supported features and picks the right run endpoint.
|
|
172
|
-
3. Stop. Do not attempt `POST /services/data/vXX.0/flowbuilder/flow-test`/`PATCH /services/data/vXX.0/flowbuilder/flow-test/{id}` against an
|
|
173
|
-
ineligible flow — the wrapper will forward the payload, Aura will
|
|
174
|
-
reject with `state: "ERROR"`, and the wrapper re-throws. There is
|
|
175
|
-
no implicit fallback.
|
|
176
|
-
|
|
177
|
-
If `eligible: true` but `siloMode: true` and
|
|
178
|
-
`"FlowTestingWithDataSilo"` is absent: tell the user silo mode isn't
|
|
179
|
-
supported here, ask whether to proceed without silo (live-org binding
|
|
180
|
-
via `sobjectValue`) or stop.
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: flow.recipes.testing.workflows.debug
|
|
3
|
-
description: "Pure debug workflow — interactive run-trace-refine loop on an existing flow with no test artifact produced. Three phases: Setup → Iterate → Decide. Endpoint chosen by probing `TestModeExperience` support; offers promotion to a saved FlowTest at end."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
<!-- Consumers: testing router -->
|
|
7
|
-
|
|
8
|
-
# Debug a flow (no test artifact produced)
|
|
9
|
-
|
|
10
|
-
Use when the user is investigating "did my flow do X?" or "why did the flow do Y?" with no upfront intent to save a test. The workflow is driven by the two debug-run endpoints covered in `## Tool routing`, plus a small set of supporting tools as the run demands: `POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview-resume` (continue a run paused at a Wait element), `GET /services/data/vXX.0/flowbuilder/flow-test/record-run-data` (drill into one record of a multi-record run), `GET /services/data/vXX.0/flowbuilder/flow-test/interview-history` (inspect prior runs of this flow version), and `GET /services/data/vXX.0/flowbuilder/flow-test/debug-run-as-validation` (pre-flight guard for debug-as-another-user). At the end of the iterate loop the user is offered a promotion path to `[[flow.recipes.testing.workflows.promote]]` — that is the **only** way to produce a persistent FlowTest from this workflow.
|
|
11
|
-
|
|
12
|
-
This skill is only intended to be used with Supported Flow Process Types listed below, even though debugging is available for a broader list of process types via the Flow Builder.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Supported flow process types
|
|
17
|
-
|
|
18
|
-
Match `(processType, metadata.start.triggerType)` from `GET /services/data/vXX.0/flowbuilder/flow/{id}` against this allow-list before any run work. Treat an absent `triggerType` as `None`.
|
|
19
|
-
|
|
20
|
-
| `processType` | `triggerType` | Shorthand | Debug workflow |
|
|
21
|
-
|---|---|---|---|
|
|
22
|
-
| `AutoLaunchedFlow` | `RecordBeforeSave` | Record-triggered (RT) | Supported |
|
|
23
|
-
| `AutoLaunchedFlow` | `RecordAfterSave` | Record-triggered (RT) | Supported |
|
|
24
|
-
| `AutoLaunchedFlow` | `None` (or absent) | Autolaunched (ALF) | Supported |
|
|
25
|
-
| `AutoLaunchedFlow` | `Scheduled` | Scheduled | Supported |
|
|
26
|
-
| `AutoLaunchedFlow` | `Segment` | Segment-triggered | Supported |
|
|
27
|
-
| `AutoLaunchedFlow` | `AutomationEvent` | Automation-event-triggered | Supported |
|
|
28
|
-
| `AutoLaunchedFlow` | `IndivRelatedRecord` | Individual-related-record-triggered | Supported |
|
|
29
|
-
| `AutoLaunchedFlow` | `List` | List-triggered | Supported |
|
|
30
|
-
| `AutoLaunchedFlow` | `FormSubmissionEvent` | Form-submission-event-triggered | Supported |
|
|
31
|
-
| `AutoLaunchedFlow` | `CampaignMember` | Campaign-member-triggered | Supported |
|
|
32
|
-
| `Flow` | `None` | Screen flow | **Not supported** — hand back to the testing router |
|
|
33
|
-
| `AutoLaunchedFlow` | `PlatformEvent` | Platform-event-triggered | **Not supported** — hand back to the testing router |
|
|
34
|
-
| Any other combo | | — | **Not supported** — hand back to the testing router |
|
|
35
|
-
|
|
36
|
-
If unsupported, STOP before the routing probe and surface: "This workflow currently supports the above listed process types. `<processType>` × `<triggerType>` is out of scope." Do not proceed to the routing probe or Phase 2.
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Tool routing
|
|
41
|
-
|
|
42
|
-
Two endpoints exist for running debug iterations. Neither is a default — the workflow probes the flow's `(processType, triggerType)` combo and picks based on whether the org / flow-type supports test mode:
|
|
43
|
-
|
|
44
|
-
- **`POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview-test-mode`** — payload-driven behavior. Takes the FlowTest as `flowTestJson` (a JSON-**encoded string** of the same definition `POST /services/data/vXX.0/flowbuilder/flow-test`/`PATCH /services/data/vXX.0/flowbuilder/flow-test/{id}` consumes, unsaved). Rolls back unless the test's `doesCommitChanges` is `true`.
|
|
45
|
-
- **`POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview`** — argument-driven DML behavior. Required `flowVersionId`; optional `flowDevName`, `arguments` (input vars as a JSON string). Commits when `enableRollbackMode` is `false` (default).
|
|
46
|
-
|
|
47
|
-
### Routing probe
|
|
48
|
-
|
|
49
|
-
**Mandatory before the first debug run.** The probe is the ONLY sanctioned way to pick between the two endpoints — do NOT infer the choice from the user's prompt phrasing (mentions of "test mode", "rollback", etc.), the tool-list order, or prior conversation.
|
|
50
|
-
|
|
51
|
-
Call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/schema/flow-capabilities")` (read `.flowFeatures`) for the flow's `(processType, triggerType)` and inspect the returned feature-name list for **`TestModeExperience`**:
|
|
52
|
-
|
|
53
|
-
- **`TestModeExperience` present** → use `POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview-test-mode`
|
|
54
|
-
- **`TestModeExperience` absent** → use `POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview`.
|
|
55
|
-
|
|
56
|
-
Cache the probe result for the session — the feature list does not change within one Aura session. For both endpoints, default to rollback debug option (no DML commits) unless explicitly approved by user.
|
|
57
|
-
|
|
58
|
-
### Resume endpoint
|
|
59
|
-
|
|
60
|
-
A run that stops at a Wait element is continued with a third call, whichever run endpoint started it:
|
|
61
|
-
|
|
62
|
-
- **`POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview-resume`** — required `flowVersionId` plus four values fed back **verbatim** from the paused result: `serializedInterview`, `resolvedContext`, `serializedCumulativeDebugInfo`, `waitEvent`. `waitEvent` is the **`name`** of one entry in the result's `waitEvents[]`, never its `value`; a blank `waitEvent` makes the resume fail. Returns a single `{runInterviewResult, canvasDecorator}`, not a `results[]` array.
|
|
63
|
-
|
|
64
|
-
The server does **not** check that a resume's settings match the original run, so the workflow does (see `### Paused runs` in Phase 2).
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Phase 1 — Setup
|
|
69
|
-
|
|
70
|
-
Load `[[flow.recipes.testing.shared-stages.intent-analyzer]]`.
|
|
71
|
-
|
|
72
|
-
The Intent Analyzer in this workflow is responsible for:
|
|
73
|
-
|
|
74
|
-
1. **Confirming debug intent.** This is run-trace-refine, not test authoring and not promotion. If the user wants to author a test from scratch, hand back to the testing router; it should route to `[[flow.recipes.testing.workflows.author-test]]`.
|
|
75
|
-
2. **Identifying the flow.** Read the parent flow via `GET /services/data/vXX.0/flowbuilder/flow/{id}`. Capture `processType`, `metadata.start.triggerType`, the flow's input variables (for non-triggered flows), and the active version ID.
|
|
76
|
-
3. **Eligibility check.** Match `(processType, triggerType)` against the allow-list in `## Supported flow process types`. If the combo isn't on the allow-list, STOP: surface the ineligibility per that section and hand back to the testing router. **Do not** check for `"FlowTesting"` here — debug runs work for shapes (like scheduled) that cannot be saved as tests.
|
|
77
|
-
4. **Route the run endpoint.** Call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/schema/flow-capabilities")` (read `.flowFeatures`) for the flow's `(processType, triggerType)` and inspect for `TestModeExperience` per `## Tool routing`. Cache the result on the session. If test mode is absent, surface the constraint to the user now (before any input work) and gate on host-quoted confirmation; do not proceed to input-gathering until confirmed.
|
|
78
|
-
5. **Assemble the run inputs for the routed endpoint.** The test-mode endpoint takes a full `FlowTest` definition (same shape as `POST /services/data/vXX.0/flowbuilder/flow-test`/`PATCH /services/data/vXX.0/flowbuilder/flow-test/{id}`, unsaved), JSON-encoded into its `flowTestJson` **string** field — hand off to `[[flow.recipes.testing.shared-stages.payload-builder]]` to build it in memory, then serialize it. The non-test-mode endpoint takes flat ad-hoc arguments (required `flowVersionId`; optional `flowDevName`, JSON-encoded `arguments`).
|
|
79
|
-
|
|
80
|
-
6. **Offer pausing at Wait elements.** If the Intent Analyzer's `flowShape.hasWaits` is `true`, tell the user the flow has Wait elements and propose debugging with pausing enabled, so the run stops at a Wait instead of running past it. Enable it per the routed endpoint:
|
|
81
|
-
- **`debug-interview`** — set `debugWaits: true` on the request.
|
|
82
|
-
- **`debug-interview-test-mode`** — set `doesTestWaitElement: true` inside the `flowTestJson` definition. Core only allows this for autolaunched flows with no trigger, and a Wait that the test mocks never pauses. If pausing isn't available for this flow shape, say so plainly rather than offering it.
|
|
83
|
-
|
|
84
|
-
Pausing is opt-in: if the user declines, leave it off and run as before.
|
|
85
|
-
|
|
86
|
-
Phase 1 emits: `{flow, processType, triggerType, runEndpoint, runInputs, activeVersion, debugWaits}`. No write-side tool calls other than the read-only routing probe.
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## Phase 2 — Iterate
|
|
91
|
-
|
|
92
|
-
The run → trace → refine loop. The user stays in this phase as long as they want.
|
|
93
|
-
|
|
94
|
-
### Loop body
|
|
95
|
-
|
|
96
|
-
1. **Run.** Call the endpoint selected by the Phase 1 routing probe (per `## Tool routing`). If the probe hasn't run yet in this session, STOP and run it now — do NOT guess between the two endpoints from prompt phrasing, tool-list order, or prior conversation. Both run endpoints return a `results[]` array — **one entry per debugged record** (`{runInterviewResult, canvasDecorator}`), so a high-scale record-triggered flow can produce several. Iterate `results[]`; for a single-record flow it has one entry. **Capture each entry's run identifier** — this same value is the `interviewGUID` for `GET /services/data/vXX.0/flowbuilder/flow-test/interview-history`, the `flowRunId` for `GET /services/data/vXX.0/flowbuilder/flow-test/record-run-data`, and the `interviewId` handed to `[[flow.recipes.testing.workflows.promote]]` (for a multi-record run, pick the record you want to promote). To drill into one record's run after a multi-record debug, call `GET /services/data/vXX.0/flowbuilder/flow-test/record-run-data` with that record's `flowRunId` + `flowVersionId`. If a result's `interviewStatus` is `WAITING` or `ASYNC_WAITING`, the run is paused at a Wait element — follow `### Paused runs` below instead of treating it as finished.
|
|
97
|
-
2. **Render the trace in two layers.** Emit the **Headline** layer using the verbatim skeleton and worked example in `examples/debug-output-template.md` — same headers, same order, every section present even if a section is `None`. Do not paraphrase headers, merge sections, or reorder. The **Details** layer is on-demand only (do not emit unless the user asks).
|
|
98
|
-
|
|
99
|
-
- **Details (raw, on demand).** Only when the user asks ("show raw trace", "deep dive", "why did element X…"), surface the `executionLog`, element-level inputs/outputs, and any fault paths taken. Scope to what they asked about — do not dump the full raw trace by default.
|
|
100
|
-
3. **Ask the user what's next:**
|
|
101
|
-
> Deep dive into execution details? Refine inputs? Try a different scenario? Or save this run as a test?
|
|
102
|
-
4. **Three valid responses:**
|
|
103
|
-
- **Refine** → mutate the payload (new record ID on the `$Record` test-point, different `parameters[]` values, switch scheduled path), loop back to step 1. **Discard any paused-run state** (see `### Paused runs`) — a paused interview belongs to the inputs that produced it and must never be resumed on top of changed ones.
|
|
104
|
-
- **New scenario** → discard the current payload, re-gather from the user, rebuild via the payload-builder, loop back to step 1. Treat as a fresh iteration; old `interviewId` and any paused-run state are not reused.
|
|
105
|
-
- **Save / promote** → exit Phase 2, go to Phase 3.
|
|
106
|
-
|
|
107
|
-
### Paused runs
|
|
108
|
-
|
|
109
|
-
A run is **paused** when a result's `interviewStatus` is `WAITING` (stopped at a Wait element) or `ASYNC_WAITING`. Do not test for `PAUSED` — that is a different engine status, even though the endpoint's schema example mentions it.
|
|
110
|
-
|
|
111
|
-
1. **Say it's paused.** Render the headline with the `### Paused` block from `examples/debug-output-template.md` (see that file for the exact shape), not a "finished" summary.
|
|
112
|
-
2. **Enumerate the resumable events.** `waitEvents[]` is a list of `{name, value}`: `name` is the wait event's API name, `value` is its resume time (empty for a platform-event wait). Show both and ask which event to resume. If there is only one, still confirm before resuming.
|
|
113
|
-
3. **Resume** with `POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview-resume`, passing the chosen event's **`name`** as `waitEvent` and the paused result's `serializedInterview`, `resolvedContext` and `serializedCumulativeDebugInfo` verbatim.
|
|
114
|
-
4. **Keep the debug settings identical.** Send the same `enableRollbackMode`, `debugAsUserId`, `enableTrace` and `showGovernorLimit` as the original run, and do not change `arguments`. The server does not compare them, so a mismatch silently changes rollback or run-as behavior partway through one run. `useLatestSubflow` is ignored on resume; do not rely on it.
|
|
115
|
-
5. **Append, don't restart.** Add the resumed leg's results to the existing trace and render one cumulative headline (Summary covers the run so far). A resumed run can pause again: repeat from step 1 until the status is no longer waiting.
|
|
116
|
-
6. **Warn about rollback once.** Each leg is committed or rolled back on its own, so with rollback on, DML from earlier legs is already undone when the resume runs. Values carried over from an earlier leg (for example a new record's Id) may point at records that no longer exist. Say this before the first resume.
|
|
117
|
-
7. **Record that the run paused.** If any leg paused, the final scenario is `paused` for Phase 3 and `[[flow.recipes.testing.workflows.promote]]`.
|
|
118
|
-
|
|
119
|
-
Paused-run state is `{serializedInterview, resolvedContext, serializedCumulativeDebugInfo, waitEvents}`. Hold it only until the next run; **refine** and **new scenario** discard it (see the loop's step 4).
|
|
120
|
-
|
|
121
|
-
**When the user requests a past-run trace** ("what did this flow do recently?"), call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow-test/interview-history")` with the run's `interviewGUID` + `flowVersionId` (both **required**; the query param is `interviewGUID`, NOT `interviewId`). History is returned only when its captured version matches the supplied `flowVersionId` — **per-flow-version**. Historic forensic queries across unrelated flow versions are out of scope.
|
|
122
|
-
|
|
123
|
-
### Stop conditions inside the loop
|
|
124
|
-
|
|
125
|
-
- User signals satisfaction with the run ("looks good", "that's it") → offer promotion in Phase 3.
|
|
126
|
-
- User abandons ("never mind", "stop") → exit gracefully, no Phase 3.
|
|
127
|
-
- 3 consecutive iterations with the same input pattern producing the same failure → STOP and surface the failure to the user. Don't spiral; ask for direction.
|
|
128
|
-
- Aura session error (`aura:invalidSession` / `Aura HTTP 401`) → STOP, run `agentic-flow-poc-setup`, do not retry the failing call automatically.
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Phase 3 — Decide
|
|
133
|
-
|
|
134
|
-
The promotion offer. Brief and explicit.
|
|
135
|
-
|
|
136
|
-
> Would you like to save this debug run as a persistent test?
|
|
137
|
-
>
|
|
138
|
-
> Reply **"yes"** to convert this scenario into a FlowTest record (320xxx) for regression. Reply **"no"** or **"end"** to wrap up.
|
|
139
|
-
|
|
140
|
-
Three valid responses:
|
|
141
|
-
|
|
142
|
-
- **Yes / save** → hand off to `[[flow.recipes.testing.workflows.promote]]` with the debug context: `{interviewId, serializedInterview?, inputs, trace, flowVersionId, paused}`. Capture the `serializedInterview` blob if it's available (Route B needs it, not the id); if it isn't, promote falls back to Route A. Set `paused: true` if the run paused at any point. Promote will check the narrower save-as-test eligibility, build the payload, validate, save, and verify.
|
|
143
|
-
- **Paused or resumed runs can only be saved as a `WithoutAssertion` test.** Say so before the hand-off: "This run paused at a Wait, so it can be saved only as a test without assertions." Do not offer to derive assertions from a paused or resumed trace.
|
|
144
|
-
- **No / end** → wrap up. Show one-line summary of what was iterated. Do not save anything.
|
|
145
|
-
- **Not sure / what does that do?** → explain in one paragraph what a saved FlowTest gives them (regression coverage, re-runnable, tied to a flow version, contributes to coverage decorators), then re-ask.
|
|
146
|
-
|
|
147
|
-
If the flow is debug-eligible but not save-eligible (scheduled `AutoLaunchedFlow`), pre-empt the promotion offer: tell the user the run was useful but cannot be saved as a `FlowTest` for this flow shape. Skip Phase 3's question.
|
|
148
|
-
|
|
149
|
-
---
|
|
150
|
-
|
|
151
|
-
## Error recovery
|
|
152
|
-
|
|
153
|
-
**Session expired mid-iterate.** STOP, run `agentic-flow-poc-setup`. The `interviewId` from previous iterations is bound to the old session and may not be retrievable in interview-history. The user can re-run the same inputs after re-auth.
|
|
154
|
-
|
|
155
|
-
**Record not found.** The user supplied a record ID that doesn't exist in the target org. Surface the failure verbatim, ask for a different ID. Don't auto-retry with a guessed ID.
|
|
156
|
-
|
|
157
|
-
**Flow version mismatch.** The active version changed mid-session (someone activated a new version). The next run will execute the new active version. Surface this once: "Flow version changed — runs will now execute v<N>." Subsequent runs continue normally.
|
|
158
|
-
|
|
159
|
-
**User asked for real DML without quoting the org host.** Don't proceed. Re-ask per `## Tool routing`: "Real DML against `<orgHost>`? Quote the host explicitly to confirm."
|
|
160
|
-
|
|
161
|
-
**Resume fails.** Most often `waitEvent` was blank or was the event's `value` instead of its `name`, or the run was not actually paused. Surface the error verbatim, re-list `waitEvents[]` from the paused result, and ask again. Do not guess an event or retry the same call.
|
|
162
|
-
|
|
163
|
-
**Session expired while paused.** The paused state is bound to the old session and cannot be recovered. Tell the user the paused run is lost and offer to re-run from the start with the same inputs.
|
|
164
|
-
|
|
165
|
-
**Run returns a fault.** A flow element hit an error and took a `faultConnector` (or unhandled, in which case the flow halts). Show the fault in the headline ("the flow failed at element `<X>` because `<reason>`") and offer the raw stack in the details. Then ask whether to refine inputs to avoid the fault or treat the fault as the scenario to lock in (which routes to Phase 3 for promotion).
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Notes for callers
|
|
170
|
-
|
|
171
|
-
- Tool routing is discussed in `## Tool routing` — the default and the two ways to opt into committing DML are covered there.
|
|
172
|
-
- The final iteration's context is the handoff to `[[flow.recipes.testing.workflows.promote]]`. Route A (clean re-state) needs the `inputs`; Route B (shortcut via `POST /services/data/vXX.0/flowbuilder/flow-test/actions/generate-from-debug-run`) needs the `serializedInterview` blob from the run — **not** the `interviewId`. Capture the serialized interview if Route B is a possibility; if only the id is available, Route B is off and promote uses Route A.
|
|
173
|
-
- Tool budget: 1 `GET /services/data/vXX.0/flowbuilder/flow/{id}` + 1 `GET /services/data/vXX.0/flowbuilder/schema/flow-capabilities` (read `.flowFeatures`) at start, then N iterations of the routed run endpoint. Optional, as the run demands: 1×`POST /services/data/vXX.0/flowbuilder/flow-test/debug-interview-resume` per pause, 1×`GET /services/data/vXX.0/flowbuilder/flow-test/record-run-data` per record drill-in, 1×`GET /services/data/vXX.0/flowbuilder/flow-test/interview-history` per history lookup, and a one-time `GET /services/data/vXX.0/flowbuilder/flow-test/debug-run-as-validation` pre-flight when debugging as another user. Each call is one Aura call. Cap run iterations at 10 before pausing to summarize and ask for direction.
|
|
174
|
-
- **Debug as another user.** To run the interview as a different user (`debugAsUserId` on `dispatch(method: "POST", url: "/services/data/vXX.0/flowbuilder/flow-test/debug-interview")`), call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow-test/debug-run-as-validation")` FIRST as a pre-flight guard — pass `flowVersionId` or `flowDevName`; it returns `{showIsDebugAsUserAllowed, showIsDebugAsUserAllowedInNonPrd}` (NOT `{canDebug}`), validating the debug-**as-another-user** permission (prod + non-prod). Only pass `debugAsUserId` when allowed.
|
|
175
|
-
- This workflow is **per-session**: state (`interviewId`, last inputs, last trace) does not persist across Aura sessions. If the user wants persistence, that's exactly what the promotion offer in Phase 3 is for.
|
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: flow.recipes.testing.workflows.promote
|
|
3
|
-
description: "Debug-to-test promotion bridge — converts a satisfactory debug run into a persistent FlowTest record. Skips Phases 1–2 of author-test (intent and plan are already established by debug iteration); enters at Phase 3 (Build) with debug context."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
<!-- Consumers: debug.md (Phase 3 hand-off), testing router (direct entry when user says "promote my last debug run") -->
|
|
7
|
-
|
|
8
|
-
# Promote a debug run to a saved FlowTest
|
|
9
|
-
|
|
10
|
-
A transition workflow, not a workflow in the same sense as author-test or debug. The user has already done the iteration in `[[flow.recipes.testing.workflows.debug]]` and decided the run is worth keeping. Promote does the narrow save-as-test eligibility check, builds the payload (two routes available), validates, saves, and verifies.
|
|
11
|
-
|
|
12
|
-
## Why promotion skips Phases 1–2 of author-test
|
|
13
|
-
|
|
14
|
-
The author-test pipeline's first two phases are about **establishing intent and a test plan**. Promotion arrives with both already established:
|
|
15
|
-
|
|
16
|
-
- **Intent** — the user iterated until the run was right. The trace observed in debug *is* the intent.
|
|
17
|
-
- **Plan** — the inputs used in the final debug iteration *are* the plan. The user already approved them implicitly by saying "save this".
|
|
18
|
-
|
|
19
|
-
Re-running Phases 1 and 2 here would be redundant ceremony. Promotion lands directly at the **Build** equivalent (Phase 3 of author-test) with the debug context as the seed payload. The Reviewer (Phase 4) and Save & Run (Phase 5) phases of author-test still execute, because the payload still has to pass the server's save-time validation and the run still has to confirm the assertions — regardless of how the payload was constructed.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Inputs from caller
|
|
24
|
-
|
|
25
|
-
From `[[flow.recipes.testing.workflows.debug]]` Phase 3 hand-off, OR direct from the testing router:
|
|
26
|
-
|
|
27
|
-
- `interviewId` — the debug run to promote (most recent if router-direct).
|
|
28
|
-
- `serializedInterview` (Route B only) — the serialized debug-run interview blob captured from the run. `POST /services/data/vXX.0/flowbuilder/flow-test/actions/generate-from-debug-run` requires this blob, **not** the `interviewId`. If it wasn't captured, Route B is unavailable — use Route A.
|
|
29
|
-
- `inputs` — the input set used in the final debug iteration (record ID, input variables, scheduled path, etc.).
|
|
30
|
-
- `trace` (optional) — what was observed; used to suggest assertions.
|
|
31
|
-
- `flowVersionId` — pin the test to the version that produced the satisfactory run.
|
|
32
|
-
- `paused` — `true` when the debug run paused at a Wait element at any point (including runs that were later resumed). Defaults to `false`.
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Step 1 — Eligibility check (narrow)
|
|
37
|
-
|
|
38
|
-
Promotion eligibility is **narrower** than debug eligibility. Debug works for many flow shapes that cannot host a saved `FlowTest` record. Re-run the eligibility probe from `[[flow.recipes.testing.workflows.author-test]]` Phase 1:
|
|
39
|
-
|
|
40
|
-
- Confirm `processType` is `AutoLaunchedFlow`.
|
|
41
|
-
- Confirm `triggerType` is in `{RecordBeforeSave, RecordAfterSave, None}` (or absent for non-triggered).
|
|
42
|
-
- If not in the confirmed-supported set, call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/schema/flow-capabilities", queryParams: { processType, triggerType })` (read `.flowFeatures`) and check for the literal `"FlowTesting"` capability.
|
|
43
|
-
|
|
44
|
-
If the flow is **not** save-eligible (e.g., screen flow, scheduled autolaunched), STOP. Surface to the user: "This flow can be debugged interactively but cannot be saved as a `FlowTest` in this org. The debug run scenario is not lost — you can re-iterate via debug, but there's no persistent test artifact available for `<processType>` × `<triggerType>` flows." Hand back to the testing router.
|
|
45
|
-
|
|
46
|
-
If the user is in silo mode (rare for promotion — most debug runs use real records), additionally probe `"FlowTestingWithDataSilo"`.
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Step 2 — Choose the build route
|
|
51
|
-
|
|
52
|
-
Two routes produce the same `FlowTest` record. Route choice affects how the payload is built, not what it contains.
|
|
53
|
-
|
|
54
|
-
**If `paused` is `true`, use Route A and skip the choice below.** The server's conversion (Route B) returns nothing for a paused interview and only ever builds a test with assertions, and assertions derived from a run that crossed a Wait aren't reliable. Build the payload with `assertions: []` and `testType: "WithoutAssertion"`. Set `doesTestWaitElement: true` so the saved test pauses at the Wait when replayed, as the debug run did. Then tell the user in one sentence: "This run paused at a Wait, so it can only be saved as a test without assertions." Do not offer to add assertions from the trace.
|
|
55
|
-
|
|
56
|
-
### Route A — Clean (default, recommended)
|
|
57
|
-
|
|
58
|
-
Re-state the inputs through the payload-builder — same construction as authoring from scratch, just seeded with debug inputs instead of user-stated intent.
|
|
59
|
-
|
|
60
|
-
Use Route A when:
|
|
61
|
-
- Debug inputs are simple (single record ID, a few scalar input variables, no scheduled path picks).
|
|
62
|
-
- The user wants to add or refine assertions beyond what the run produced.
|
|
63
|
-
- You want full control over `fullName`, `label`, and `doesCommitChanges`.
|
|
64
|
-
|
|
65
|
-
### Route B — Shortcut
|
|
66
|
-
|
|
67
|
-
`POST /services/data/vXX.0/flowbuilder/flow-test/actions/generate-from-debug-run` with the `serializedInterview` (the serialized debug-run interview). Continue only when the response has `isSuccess === true` and a string `flowTestJson`; parse that JSON-encoded string before reviewing or editing the generated definition.
|
|
68
|
-
|
|
69
|
-
Use Route B when:
|
|
70
|
-
- Debug inputs are **complex enough that retyping is error-prone** — large or relational `sobjectValue` payloads, multiple scheduled-path attempts, autolaunched flows with many input variables.
|
|
71
|
-
- You want the returned draft as a starting point; inspect the parsed payload and retain assertions only when they are actually present and match the user's intent.
|
|
72
|
-
|
|
73
|
-
Treat the shortcut's return as a draft, not a finished payload. Always pass it through Reviewer (Step 4) before save.
|
|
74
|
-
|
|
75
|
-
Ask the user once if route is ambiguous. Default to Route A when input complexity is low.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## Step 3 — Build the payload
|
|
80
|
-
|
|
81
|
-
Load `[[flow.recipes.testing.shared-stages.payload-builder]]`.
|
|
82
|
-
|
|
83
|
-
### Route A construction
|
|
84
|
-
|
|
85
|
-
Same as `[[flow.recipes.testing.workflows.author-test]]` Phase 3:
|
|
86
|
-
|
|
87
|
-
1. Top-level metadata. Pin a **real** record ID (not the throwaway `sobjectValue: "{}"` that interactive debug allows). For non-triggered flows, copy the input variables verbatim from the debug iteration.
|
|
88
|
-
2. `testPoints[]` with the Start element parameters mapped from debug inputs:
|
|
89
|
-
|
|
90
|
-
| Debug input | `testPoints[]` parameter |
|
|
91
|
-
|---|---|
|
|
92
|
-
| Trigger record's "before" snapshot | `{ leftValueReference: "$Record", type: "InputTriggeringRecordInitial", value: { sobjectValue: "<JSON>" } }` |
|
|
93
|
-
| Trigger record's "after" snapshot (update flows) | `{ leftValueReference: "$Record", type: "InputTriggeringRecordUpdated", value: { sobjectValue: "<JSON>" } }` |
|
|
94
|
-
| Scheduled path used | `{ leftValueReference: "ScheduledPathApiName", type: "ScheduledPath", value: { stringValue: "<path API name or ''>" } }` |
|
|
95
|
-
| Input variable used (non-triggered flows) | `{ leftValueReference: "<varName>", type: "InputVariable", value: { ... } }` |
|
|
96
|
-
|
|
97
|
-
3. Assertions — derive from observed trace if the user wants regression coverage. If the user only wants to lock in "this scenario passes", `assertions: []` is acceptable (`WithoutAssertion` semantics).
|
|
98
|
-
|
|
99
|
-
Lazy-load flowtest-element files as needed: `[[flow.recipes.testing.flowtest-elements.parameters]]`, `[[flow.recipes.testing.flowtest-elements.assertions]]`, `[[flow.recipes.testing.flowtest-elements.silo-config]]`.
|
|
100
|
-
|
|
101
|
-
### Route B construction
|
|
102
|
-
|
|
103
|
-
1. Call `dispatch(method: "POST", url: "/services/data/vXX.0/flowbuilder/flow-test/actions/generate-from-debug-run")` with `serializedInterview`.
|
|
104
|
-
2. Require `isSuccess === true` and a string `flowTestJson`, then parse it. If either field is missing/malformed or JSON parsing fails, surface the raw response and use Route A instead.
|
|
105
|
-
Inspect its test points, parameters, and any pre-populated assertions.
|
|
106
|
-
3. Review any generated assertions against the user's requirements. Show the user the assertion list and ask which to keep.
|
|
107
|
-
4. Set `fullName`, `label`, `doesCommitChanges` (the shortcut may return defaults; override per naming conventions below).
|
|
108
|
-
5. Serialize the edited complete definition again: `flowTestJson = JSON.stringify(flowTest)`.
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Step 4 — Validate
|
|
113
|
-
|
|
114
|
-
Load `[[flow.recipes.testing.shared-stages.reviewer]]`.
|
|
115
|
-
|
|
116
|
-
Reviewer applies the same two jobs as in author-test Phase 4 — cheap local auto-fixes, and the intent check the server can't make. Two intent-class concerns are specific to promotion (both are cases where the payload would *save and resolve* but isn't the durable test the user meant — exactly what the server can't catch):
|
|
117
|
-
|
|
118
|
-
- **Throwaway record IDs.** If the debug run used `sobjectValue: "{}"` and the user didn't pin a real record in Step 3, `BLOCK` and ask for a real ID. A `{}` binding is a debug-only placeholder, not a persistent test scenario.
|
|
119
|
-
- **Silo `Id`s in the payload.** If silo mode and the debug run captured silo record `Id`s into `sobjectValue`, `BLOCK` — silo IDs resolve at save but aren't stable across silo rebuilds. Re-bind via the `jsonValue` envelope with the external-key fields per `[[flow.recipes.testing.flowtest-elements.silo-config]]`.
|
|
120
|
-
|
|
121
|
-
Anything structurally malformed in a Route B payload (bad `type` enums, stale references after a version change) is caught by the server on save — don't pre-check it here; the Step 5 save-and-react loop owns it.
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## Step 5 — Save
|
|
126
|
-
|
|
127
|
-
`POST /services/data/vXX.0/flowbuilder/flow-test` with body `flowTestJson`, which must be the JSON-encoded
|
|
128
|
-
string produced after the final edits. Continue only when
|
|
129
|
-
`isSuccess === true` and `flowTestId` is a non-empty string; capture that
|
|
130
|
-
`320xxx` ID.
|
|
131
|
-
|
|
132
|
-
On `isSuccess === false`, surface each available error's `message` and
|
|
133
|
-
`statusCode`; target a field only if the message identifies one. If status
|
|
134
|
-
or a usable ID is missing, surface the raw response and stop because the
|
|
135
|
-
create outcome is unproven. A confirmed success means the payload resolved,
|
|
136
|
-
but the runtime probe in Step 6 is what proves the assertions hold.
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## Step 6 — Verify (round-trip)
|
|
141
|
-
|
|
142
|
-
**Invariant — no broken test lingers in the org without the user's
|
|
143
|
-
say-so.** Same rule as author-test Phase 5: every terminal failure of
|
|
144
|
-
this step pauses for a user decision, and keeping a broken `320xxx`
|
|
145
|
-
is only acceptable when the user explicitly asks for it. Terminal
|
|
146
|
-
failure covers both **execution failed** (persistent missing/empty `results` or a server error after
|
|
147
|
-
retry — the promoted payload can't be made to run) and any returned
|
|
148
|
-
descriptor whose `testStatus` is missing or is not exactly `Pass`; both
|
|
149
|
-
route through the **Terminal
|
|
150
|
-
failure — user chooses cleanup** section at the end of this step.
|
|
151
|
-
Because promotion always starts with a `POST /services/data/vXX.0/flowbuilder/flow-test` (first-time save) and has no
|
|
152
|
-
prior passing state, the cleanup choice is **delete-or-keep** —
|
|
153
|
-
rollback doesn't apply here. The debug `interviewId` is preserved
|
|
154
|
-
either way for a follow-up promotion (usually Route A after a Route
|
|
155
|
-
B failure).
|
|
156
|
-
|
|
157
|
-
The single carve-out is when the user framed the failing scenario as
|
|
158
|
-
the artifact they want — a regression pin locking in a known fault,
|
|
159
|
-
not a bug in the promoted test. Confirm intent once before honoring
|
|
160
|
-
the carve-out ("you want to keep this failing promoted test as-is as
|
|
161
|
-
a regression pin, right?"); on confirmation, skip the cleanup prompt.
|
|
162
|
-
|
|
163
|
-
1. **Run immediately, then self-correct (cap at ONE silent retry).** `POST /services/data/vXX.0/flowbuilder/flow-test/actions/run` with `flowVersionId` (the pinned version — **required**), `testIds: ["320..."]`, and `showTrace: true`. Read per `[[flow.recipes.testing.run-results]]`. Same loop as author-test Phase 5:
|
|
164
|
-
- Missing/empty `results` or a server error → surface the raw response. Round-trip via `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow-test/{id}")`, parse `flowTestJson`, and compare it with what was sent. Apply one fix only if the comparison proves a discrepancy, then call `dispatch(method: "PATCH", url: "/services/data/vXX.0/flowbuilder/flow-test/{id}")` with `{id, flowTestJson: JSON.stringify(completeDefinition)}`. Re-run only when the update returns `isSuccess === true`; otherwise surface its errors or raw response and hand off to terminal failure. **If the second run still fails**, hand off to the Terminal failure section below.
|
|
165
|
-
- `testStatus: "Pass"` → success for the documented run-result contract.
|
|
166
|
-
- Any descriptor whose `testStatus` is missing or is not exactly `Pass` → report `lastRunFailedAssertions`, `lastRunError`, and `interviewErrors` when present. Do not auto-retry; hand off to Terminal failure.
|
|
167
|
-
2. **Round-trip.** Call `dispatch_readonly(method: "GET", url: "/services/data/vXX.0/flowbuilder/flow-test/{id}")` and parse its `flowTestJson` string to see the server-canonical definition — important when Route B was used and you want to compare what the server stored with the shortcut output.
|
|
168
|
-
3. **Audit registration (best effort).** Scope `GET /services/data/vXX.0/flowbuilder/flow-test` with `flowVersionId`, an explicit `limit`, and `offset: 0`. Continue only when `flowTests` is an array. If the ID is absent and the page length equals `limit`, advance `offset` by the number of returned rows until the ID appears or a short/empty page ends the list. An absent or malformed `flowTests` makes the listing outcome unproven. Do not infer a per-test version field from the summary, and do not let a listing miss override a confirmed successful create.
|
|
169
|
-
4. **Coverage limitation.** No coverage operation is onboarded to MCP.
|
|
170
|
-
Do not attempt a coverage call; state the limitation if the user asks.
|
|
171
|
-
|
|
172
|
-
### Terminal failure — user chooses cleanup
|
|
173
|
-
|
|
174
|
-
Reached from Step 1's failing branches once the one-shot self-correct
|
|
175
|
-
budget is exhausted (persistent missing/empty `results` or a server error — the test can't be made
|
|
176
|
-
to run), or immediately for any descriptor whose `testStatus` is missing
|
|
177
|
-
or is not exactly `Pass`. Skipped only after the user confirms the
|
|
178
|
-
fault-path carve-out from the top of this step.
|
|
179
|
-
|
|
180
|
-
1. **Surface the failure.** Report to the user:
|
|
181
|
-
- (a) the verbatim run signal — `testStatus`, `lastRunFailedAssertions`,
|
|
182
|
-
`lastRunError`, `interviewErrors`, the retrieved-vs-sent diff, or the
|
|
183
|
-
raw absent/empty `results` response;
|
|
184
|
-
- (b) the specific field(s) implicated only when the response identifies
|
|
185
|
-
them;
|
|
186
|
-
- (c) the current org state — the `320xxx` id.
|
|
187
|
-
|
|
188
|
-
2. **Ask the user how to handle the artifact:**
|
|
189
|
-
|
|
190
|
-
> This promoted test is broken as saved. How do you want to handle it?
|
|
191
|
-
> - **delete** — remove the `320xxx` from the org.
|
|
192
|
-
> - **keep** — leave it in place for hand-editing; I'll report the
|
|
193
|
-
> `320xxx` and the failure trace.
|
|
194
|
-
|
|
195
|
-
Silence is not consent — wait for a reply. For Route B failures,
|
|
196
|
-
also mention that Route A (clean re-state from the same debug
|
|
197
|
-
`interviewId`) is a robust redo path once cleanup is done — but do
|
|
198
|
-
not conflate that recommendation with the delete/keep choice.
|
|
199
|
-
|
|
200
|
-
3. **Execute the choice:**
|
|
201
|
-
- **delete** → `DELETE /services/data/vXX.0/flowbuilder/flow-test/{id}` with the CURRENT
|
|
202
|
-
promotion's `320xxx` as the path `id` (single id per call —
|
|
203
|
-
there is no bulk delete). Promotion is one-shot per `interviewId`
|
|
204
|
-
(see Notes for callers), so there is never more than one id in
|
|
205
|
-
scope here. Report deletion only when `isSuccess === true`. On
|
|
206
|
-
`false`, surface `errorMessage` when present; when status is missing,
|
|
207
|
-
report the delete outcome as unproven. The parent flow is untouched.
|
|
208
|
-
- **keep** → leave the artifact in place; report the `320xxx`, the
|
|
209
|
-
failure trace, and the pointer to `DELETE /services/data/vXX.0/flowbuilder/flow-test/{id}`
|
|
210
|
-
for later cleanup if the user changes their mind.
|
|
211
|
-
|
|
212
|
-
4. **Offer a redesign.** After cleanup, ask whether to retry the
|
|
213
|
-
promotion with adjusted inputs, switch build route (A ↔ B), or
|
|
214
|
-
stop. Registration is skipped under the delete branch. Coverage
|
|
215
|
-
retrieval is unavailable through MCP in every branch.
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
|
-
## Naming conventions for promoted tests
|
|
220
|
-
|
|
221
|
-
- **`fullName`.** Server-validated. Convention: `<FlowApiName>_<scenario_slug>`. For promoted runs, suffix with `_from_debug` or the date if the user wants provenance: `Update_Account_Name_To_BAC_TEMP_20260521_save_as_test_try1` — note the `_TEMP_` from the parent flow flows through automatically via `flowApiName`.
|
|
222
|
-
- **`label`.** Human-facing, shown in the Test runner UI. Short imperative phrases beat reused dev-name slugs. The debug iteration's intent is good source material — "Account name updates to BAC for active customers" beats "save as test try1".
|
|
223
|
-
- **`doesCommitChanges`.** Default `false` (rollback) on this endpoint. Promote inherits the debug session's DML mode preference: if the user iterated with rollback pinned explicitly (`enableRollbackMode:true` on the argument-driven endpoint, or `doesCommitChanges:false` on the payload-driven endpoint), the promoted test should also roll back. Only `true` when downstream effects can't be observed without persisted state — confirm explicitly with user.
|
|
224
|
-
- **`flowApiName`.** Inherited from the parent flow. The `_TEMP_<YYYYMMDD>` suffix flows through automatically; no manual handling needed.
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
## Error recovery
|
|
229
|
-
|
|
230
|
-
**Ineligible flow (debug works, save doesn't).** Surface in plain language. Do not call `POST /services/data/vXX.0/flowbuilder/flow-test` / `PATCH /services/data/vXX.0/flowbuilder/flow-test/{id}` — it will fail server-side with a `FlowTesting` capability error and consume Aura quota. Hand back to the testing router; user keeps the debug context but no test is produced.
|
|
231
|
-
|
|
232
|
-
**Shortcut returns malformed payload.** Generation or save can surface it through `isSuccess: false` and optional error messages. Target a field only when a returned message identifies one. Two options:
|
|
233
|
-
- Switch to Route A (clean re-state) using the same debug inputs — robust fallback.
|
|
234
|
-
- When the response identifies a field, hand-edit it and re-save; otherwise surface the raw response instead of guessing.
|
|
235
|
-
|
|
236
|
-
**Save succeeds, but the run has missing/empty `results` or a server error.** The OAS does not define the cause. Surface the raw response, round-trip via `GET /services/data/vXX.0/flowbuilder/flow-test/{id}`, parse `flowTestJson`, and compare it with what was sent. Re-save via `PATCH /services/data/vXX.0/flowbuilder/flow-test/{id}` only when that comparison proves a concrete fix. Exhausting the one-shot retry hands off to Step 6's **Terminal failure — user chooses cleanup** section; the user picks delete or keep, and the workflow waits for their answer.
|
|
237
|
-
|
|
238
|
-
**Save succeeds, run returns `testStatus: "Fail"` with populated `lastRunFailedAssertions`.** No auto-retry. Hand off immediately to Step 6's Terminal failure section: surface the returned summary, offer delete-or-keep, then act on the user's answer. When you present the choice, note that Route A is an available clean re-state path on the next attempt.
|
|
239
|
-
|
|
240
|
-
**`fullName` collision.** A test with this name already exists. Ask the user whether to:
|
|
241
|
-
- Update the existing test (`PATCH /services/data/vXX.0/flowbuilder/flow-test/{id}`) — destructive if the existing test was someone else's.
|
|
242
|
-
- Pick a different `fullName`.
|
|
243
|
-
|
|
244
|
-
**`flowVersionId` doesn't match the active version.** The flow was activated on a new version between debug and promote. Tests are version-pinned. Either save against the version the debug ran on (good for snapshotting historical behavior), or warn the user and re-run debug on the new active version (good for forward regression). Default: pin to the version the debug ran on, surface the version drift to the user.
|
|
245
|
-
|
|
246
|
-
**Aura session expired.** STOP, run `agentic-flow-poc-setup`. The debug `interviewId` may not be retrievable across the session boundary, which kills Route B. Route A still works because it only needs the inputs (which the caller passed in).
|
|
247
|
-
|
|
248
|
-
---
|
|
249
|
-
|
|
250
|
-
## Notes for callers
|
|
251
|
-
|
|
252
|
-
- Promotion is one-shot per call. If the user wants to promote multiple debug runs, call this workflow once per `interviewId`.
|
|
253
|
-
- `DELETE /services/data/vXX.0/flowbuilder/flow-test/{id}` removes a promoted test (pass the 320-prefixed id as the path `id` — one id per call), but it never removes the parent flow — that still requires Setup → Process Automation → Flows. Warn the user if the flow is throwaway (`_TEMP_<YYYYMMDD>` suffix) — the flow cleanup is manual.
|
|
254
|
-
- Route B (`POST /services/data/vXX.0/flowbuilder/flow-test/actions/generate-from-debug-run`) is **server-side conversion** and counts as one Aura call. Route A is zero MCP calls until Step 5 (save) — usually cheaper and easier to debug.
|
|
255
|
-
- Worked example with literal payloads (the `Update_Account_Name_To_BAC` case): see `examples/debugPromote.json` and notes referenced in `[[flow.recipes.testing]]`.
|