@salesforce/afv-skills 1.63.0 → 1.64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-offline-experimentation-run/SKILL.md +253 -0
  3. package/skills/agentforce-offline-experimentation-run/scripts/build_report.py +796 -0
  4. package/skills/agentforce-offline-experimentation-run/scripts/resolve-token.sh +111 -0
  5. package/skills/agentforce-offline-experimentation-run/scripts/sfap_replay.py +1053 -0
  6. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +21 -11
  7. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +10 -0
  8. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
  9. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +44 -1
  10. package/skills/automation-sandbox-post-copy-configure/SKILL.md +132 -124
  11. package/skills/automation-sandbox-post-copy-configure/references/flow_activation_path.md +151 -0
  12. package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +55 -9
  13. package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +54 -107
  14. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/copy.json +1 -1
  15. package/skills/consumer-goods-promotion-bo-api-deploy/references/conventions-and-payload-rules.md +82 -5
  16. package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +35 -2
  17. package/skills/consumer-goods-promotion-bo-api-deploy/references/preflight-and-seed-queries.md +149 -0
  18. package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +17 -1
  19. package/skills/dx-devops-conflict-resolve/SKILL.md +1 -5
  20. package/skills/dx-devops-pipeline-manage/SKILL.md +1 -5
  21. package/skills/dx-devops-project-manage/SKILL.md +1 -5
  22. package/skills/dx-devops-promote/SKILL.md +1 -5
  23. package/skills/dx-devops-request-status/SKILL.md +1 -5
  24. package/skills/dx-lifecycle-center/SKILL.md +120 -0
  25. package/skills/dx-lifecycle-center/examples/workflows.md +175 -0
  26. package/skills/dx-lifecycle-center/references/connect-api.md +123 -0
  27. package/skills/dx-lifecycle-center/references/connect-org.md +184 -0
  28. package/skills/dx-lifecycle-center/references/deploy.md +153 -0
  29. package/skills/dx-lifecycle-center/references/error-handling.md +21 -0
  30. package/skills/dx-lifecycle-center/references/hub-org.md +37 -0
  31. package/skills/dx-lifecycle-center/references/list-orgs.md +99 -0
  32. package/skills/dx-lifecycle-center/references/request-body.md +75 -0
  33. package/skills/dx-lifecycle-center/references/troubleshooting.md +31 -0
  34. package/skills/dx-lifecycle-center/scripts/poll-deploy-status.sh +200 -0
  35. package/skills/dx-lifecycle-center/scripts/resolve-environment.sh +120 -0
  36. package/skills/dx-org-devhub-configure/SKILL.md +1 -3
  37. package/skills/dx-org-shape-manage/SKILL.md +1 -5
  38. package/skills/dx-org-snapshot-manage/SKILL.md +1 -3
  39. package/skills/education-cloud-academic-calendar-generate/SKILL.md +1 -3
  40. package/skills/education-cloud-course-catalog-migrate/SKILL.md +1 -3
  41. package/skills/education-cloud-domain-configure/SKILL.md +1 -3
  42. package/skills/education-cloud-multi-campus-configure/SKILL.md +1 -3
  43. package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +1 -5
  44. package/skills/experience-ui-bundle-2gp-deploy/SKILL.md +1 -3
  45. package/skills/experience-ui-bundle-features-generate/SKILL.md +1 -5
  46. package/skills/experience-ui-bundle-mfa-configure/SKILL.md +1 -3
  47. package/skills/field-service-data-capture-migrate/SKILL.md +1 -3
  48. package/skills/insurance-brokerage-agency-billing-configure/SKILL.md +1 -3
  49. package/skills/marketing-message-test/SKILL.md +1 -3
  50. package/skills/nonprofit-fundraising-configure/SKILL.md +240 -0
  51. package/skills/nonprofit-fundraising-configure/references/gotchas.md +26 -0
  52. package/skills/nonprofit-fundraising-configure/references/mcp-invocation.md +678 -0
  53. package/skills/nonprofit-fundraising-configure/references/permission-targeting.md +35 -0
  54. package/skills/nonprofit-volunteer-management-model-get/SKILL.md +166 -0
  55. package/skills/nonprofit-volunteer-management-model-get/references/entities.md +315 -0
  56. package/skills/nonprofit-volunteer-management-model-get/references/relationships.md +175 -0
  57. package/skills/nonprofit-volunteer-management-model-get/references/themes.md +143 -0
  58. package/skills/nonprofit-volunteer-management-records-create/SKILL.md +121 -0
  59. package/skills/nonprofit-volunteer-management-records-create/references/field-guide.md +284 -0
  60. package/skills/nonprofit-volunteer-management-records-create/references/mcp-invocation.md +248 -0
  61. package/skills/nonprofit-volunteer-management-records-create/references/review-format.md +140 -0
  62. package/skills/nonprofit-volunteer-management-records-create/scripts/expand-series.py +632 -0
  63. package/skills/nonprofit-volunteer-management-records-create/scripts/render-review-table.py +419 -0
  64. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_expand_series.py +690 -0
  65. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_render_review_table.py +421 -0
  66. package/skills/nonprofit-volunteer-management-structure-generate/SKILL.md +119 -0
  67. package/skills/nonprofit-volunteer-management-structure-generate/references/configuration-decisions.md +159 -0
  68. package/skills/nonprofit-volunteer-management-structure-generate/references/discovery-interview.md +137 -0
  69. package/skills/nonprofit-volunteer-management-structure-generate/references/edge-cases.md +48 -0
  70. package/skills/nonprofit-volunteer-management-structure-generate/references/mcp-invocation.md +75 -0
  71. package/skills/nonprofit-volunteer-management-structure-generate/references/plan-output.md +141 -0
  72. package/skills/platform-custom-field-generate/SKILL.md +1 -0
  73. package/skills/platform-custom-field-generate/references/advanced-picklists.md +5 -5
  74. package/skills/platform-custom-metadata-type-generate/SKILL.md +3 -0
  75. package/skills/platform-custom-object-generate/SKILL.md +4 -0
  76. package/skills/platform-custom-setting-generate/SKILL.md +3 -0
  77. package/skills/platform-datamask-run/SKILL.md +1 -5
  78. package/skills/platform-permission-set-generate/SKILL.md +3 -0
  79. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +1 -3
  80. package/skills/platform-sandbox-configure/SKILL.md +1 -3
  81. package/skills/platform-value-set-generate/SKILL.md +3 -0
  82. package/skills/sales-call-scoring-configure/SKILL.md +1 -5
  83. package/skills/service-agentforce-channel-configure/SKILL.md +1 -3
  84. package/skills/service-agentforce-human-escalation-configure/SKILL.md +1 -3
  85. package/skills/service-catalog-template-coordinate/SKILL.md +1 -3
  86. package/skills/service-concierge-portal-generate/SKILL.md +1 -3
  87. package/skills/service-email-to-case-configure/SKILL.md +1 -5
  88. package/skills/service-itsm-agentic-setup-agent-runtime-access-assign/SKILL.md +1 -3
  89. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +1 -3
  90. package/skills/service-itsm-agentic-setup-agentforce-studio-configure/SKILL.md +1 -3
  91. package/skills/service-itsm-agentic-setup-agentforce-studio-validate/SKILL.md +1 -3
  92. package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +1 -3
  93. package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -5
  94. package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +1 -3
  95. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +1 -3
  96. package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +1 -3
  97. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +1 -3
  98. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +1 -3
  99. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +1 -0
  100. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/SKILL.md +1 -3
  101. package/skills/service-itsm-agentic-setup-uel-user-create/SKILL.md +1 -9
  102. package/skills/service-itsm-incident-mgmt-configure/SKILL.md +1 -5
  103. package/skills/service-itsm-incident-priority-configure/SKILL.md +1 -3
  104. package/skills/service-itsm-slack-itservice-configure/SKILL.md +1 -3
  105. package/skills/service-itsm-swarming-configure/SKILL.md +1 -3
  106. package/skills/service-itsm-teams-configure/SKILL.md +1 -3
  107. package/skills/service-itsm-teams-debug/SKILL.md +1 -3
  108. package/skills/service-itsm-teams-employee-agent-configure/SKILL.md +1 -3
  109. package/skills/service-itsm-teams-itdesk-configure/SKILL.md +1 -3
  110. package/skills/service-itsm-teams-itservice-configure/SKILL.md +1 -3
  111. package/skills/service-native-voice-recording-transcription-configure/SKILL.md +1 -3
  112. package/skills/service-omni-agent-users-create/SKILL.md +1 -3
  113. package/skills/service-omni-agent-work-sharing-configure/SKILL.md +1 -3
  114. package/skills/service-omni-attribute-routing-configure/SKILL.md +1 -3
  115. package/skills/service-omni-base-settings-configure/SKILL.md +1 -3
  116. package/skills/service-omni-channel-inventory-analyze/SKILL.md +1 -3
  117. package/skills/service-omni-channel-limits-analyze/SKILL.md +1 -3
  118. package/skills/service-omni-channel-setup-coordinate/SKILL.md +1 -3
  119. package/skills/service-omni-command-center-analyze/SKILL.md +1 -3
  120. package/skills/service-omni-command-center-configure/SKILL.md +1 -3
  121. package/skills/service-omni-permission-set-assign/SKILL.md +1 -3
  122. package/skills/service-omni-presence-status-deploy/SKILL.md +1 -3
  123. package/skills/service-omni-presence-user-config-deploy/SKILL.md +1 -3
  124. package/skills/service-omni-queue-deploy/SKILL.md +1 -3
  125. package/skills/service-omni-queue-members-assign/SKILL.md +1 -3
  126. package/skills/service-omni-queue-routing-config-deploy/SKILL.md +1 -3
  127. package/skills/service-omni-routing-flow-deploy/SKILL.md +1 -3
  128. package/skills/service-omni-service-channel-configure/SKILL.md +1 -3
  129. package/skills/service-omni-sidebar-configure/SKILL.md +1 -3
  130. package/skills/service-omni-skills-based-routing-configure/SKILL.md +1 -3
  131. package/skills/service-omni-supervisor-config-deploy/SKILL.md +1 -3
  132. package/skills/service-omni-supervisor-permset-assign/SKILL.md +1 -3
  133. package/skills/service-omni-supervisor-surface-deploy/SKILL.md +1 -3
  134. package/skills/service-omni-supervisor-users-create/SKILL.md +1 -3
  135. package/skills/service-omni-work-skill-routing-configure/SKILL.md +1 -3
  136. package/skills/field-service-setup-orchestrator-get/SKILL.md +0 -47
  137. package/skills/tableau-next-asset-create/README.md +0 -65
@@ -6,9 +6,7 @@ metadata:
6
6
  domains:
7
7
  - "Education"
8
8
  minApiVersion: "68.0"
9
- accessCheck:
10
- - type: "orgPref"
11
- value: "EducationCloudEnabled"
9
+ accessCheck: "OrgPreferences.EducationCloudEnabled"
12
10
  cliTools:
13
11
  - tool: ["python3"]
14
12
  semver: ">=3.8"
@@ -5,9 +5,7 @@ metadata:
5
5
  version: "1.0"
6
6
  domains:
7
7
  - "Education"
8
- accessCheck:
9
- - type: "accessCheck"
10
- value: "IndustriesEducation.userHasEducationCloudAccess"
8
+ accessCheck: "IndustriesEducation.userHasEducationCloudAccess"
11
9
  cliTools:
12
10
  - tool: ["python3"]
13
11
  semver: ">=3.9.0"
@@ -17,9 +17,7 @@ metadata:
17
17
  - "platform-metadata-deploy"
18
18
  - "platform-permission-set-generate"
19
19
  - "platform-validation-rule-generate"
20
- accessCheck:
21
- - type: "license"
22
- value: "Education Cloud"
20
+ accessCheck: "License.EducationCloud"
23
21
  ---
24
22
 
25
23
  # Configuring Education Cloud Domains
@@ -8,9 +8,7 @@ metadata:
8
8
  - "Education"
9
9
  relatedSkills:
10
10
  - "education-cloud-domain-configure"
11
- accessCheck:
12
- - type: "license"
13
- value: "Education Cloud"
11
+ accessCheck: "License.EducationCloud"
14
12
  mcpTools:
15
13
  headless-360:
16
14
  tools: ["describe", "discover", "dispatch", "dispatch_readonly"]
@@ -18,11 +18,7 @@ metadata:
18
18
  cliTools:
19
19
  - tool: ["sf"]
20
20
  semver: ">=2.0.0"
21
- accessCheck:
22
- - type: "license"
23
- value: "Agentforce"
24
- - type: "orgPerm"
25
- value: "EinsteinForEducationCloud"
21
+ accessCheck: "(OrgPermissions.EinsteinForEducationCloud) && (License.Agentforce)"
26
22
  ---
27
23
 
28
24
  # Configuring the Education Cloud Student Recruitment Agent
@@ -8,9 +8,7 @@ metadata:
8
8
  relatedSkills:
9
9
  - "experience-ui-bundle-deploy"
10
10
  - "experience-ui-bundle-project-generate"
11
- accessCheck:
12
- - type: "orgPref"
13
- value: "Package2Enabled"
11
+ accessCheck: "OrgPreferences.Package2Enabled"
14
12
  cliTools:
15
13
  - tool: ["jq"]
16
14
  semver: ">=1.6"
@@ -10,11 +10,7 @@ metadata:
10
10
  semver: ">=7.0.0"
11
11
  - tool: ["npm"]
12
12
  semver: ">=7.0.0"
13
- accessCheck:
14
- - type: "license"
15
- value: "Experience Cloud (Customer Community / Customer Community Plus)"
16
- - type: "orgPref"
17
- value: "Sites"
13
+ accessCheck: "(OrgPreferences.Sites) && (License.ExperienceCloudCustomerCommunityCustomerCommunityPlus)"
18
14
  ---
19
15
 
20
16
  # UI Bundle Features
@@ -10,9 +10,7 @@ metadata:
10
10
  semver: ">=1.6"
11
11
  - tool: ["sf"]
12
12
  semver: ">=2.0.0"
13
- accessCheck:
14
- - type: "license"
15
- value: "Experience Cloud (Customer Community / Customer Community Login)"
13
+ accessCheck: "License.ExperienceCloudCustomerCommunityCustomerCommunityLogin"
16
14
  relatedSkills:
17
15
  - "dx-org-permission-set-assign"
18
16
  - "experience-ui-bundle-deploy"
@@ -18,9 +18,7 @@ metadata:
18
18
  slack:
19
19
  tools: ["slack_create_canvas", "slack_send_message"]
20
20
  semver: ">=1.0.0"
21
- accessCheck:
22
- - type: "license"
23
- value: "Field Service"
21
+ accessCheck: "License.FieldService"
24
22
  ---
25
23
 
26
24
  # Migrate Field Service Mobile Flows to Data Capture
@@ -4,9 +4,7 @@ description: "Configure end-to-end Agency Billing on a Salesforce FSC Insurance
4
4
  metadata:
5
5
  version: "2.0"
6
6
  minApiVersion: "66.0"
7
- accessCheck:
8
- - type: "license"
9
- value: "InsuranceBrokerageFoundationPsl"
7
+ accessCheck: "License.InsuranceBrokerageFoundationPsl"
10
8
  ---
11
9
 
12
10
  # Insurance Brokerage Agency Billing Configuration
@@ -4,9 +4,7 @@ description: "Salesforce Marketing Cloud / Engagement 360 message preview and te
4
4
  metadata:
5
5
  version: "1.0"
6
6
  minApiVersion: "62.0"
7
- accessCheck:
8
- - type: "orgPerm"
9
- value: "MarketingEngagement"
7
+ accessCheck: "OrgPermissions.MarketingEngagement"
10
8
  cliTools:
11
9
  - tool:
12
10
  - "sf"
@@ -0,0 +1,240 @@
1
+ ---
2
+ name: nonprofit-fundraising-configure
3
+ description: "Configure Nonprofit Cloud Fundraising on an org headlessly — assign permission sets/groups org-wide, enable Fundraising, create a default Gift Designation, configure gift/recurring-donation-failure settings and feature toggles, and offer optional enhanced features (Interest Tags, Interaction Summaries, Record Alerts, Life Events, Timeline). Use when the user asks to set up or enable Nonprofit Cloud Fundraising, configure gift/donation settings, provision an org for fundraising, assign Fundraising permission sets/groups, or create a default gift designation. Also: turn on Fundraising, set up recurring donations, prep an org for testing. Toggle writes use headless-360 operations, never the `IndustriesSettings` Metadata API; the Person Account profile-visibility fix is the one Profile metadata write. DO NOT TRIGGER when: enabling Person Accounts on its own (this skill's Layer 0 gate only), creating gift/donation records post-configuration, or configuring NPSP/Nonprofit Success Pack."
4
+ metadata:
5
+ version: "1.0"
6
+ minApiVersion: "68.0"
7
+ domains: ["Nonprofit"]
8
+ mcpTools:
9
+ headless-360:
10
+ tools: ["describe", "discover", "dispatch", "dispatch_readonly"]
11
+ semver: ">=1.0.0"
12
+ cliTools:
13
+ - tool: ["sf"]
14
+ semver: ">=2.0.0"
15
+ relatedSkills:
16
+ - "service-itsm-agentic-setup-uel-user-create"
17
+ - "service-itsm-incident-mgmt-configure"
18
+ accessCheck: "((UserPermissions.AssignPermissionSets) && (UserPermissions.CustomizeApplication)) && (OrgPermissions.FundraisingAccess)"
19
+ delegates_to: [npc-pulsars/FundraisingSettings, npc-pulsars/FundraisingGiftEntrySettings, npc-titan/FundraisingSourceCodeGen, health-cloud-r2-d2/Timeline, fsc-obi-wan/InterestTaggingSettings]
20
+ allowed-tools: |
21
+ Read AskUserQuestion
22
+ mcp__headless-360__discover
23
+ mcp__headless-360__describe
24
+ mcp__headless-360__dispatch_readonly
25
+ mcp__headless-360__dispatch
26
+ ---
27
+
28
+ # Configure Nonprofit Cloud Fundraising
29
+
30
+ Turn on Nonprofit Cloud Fundraising for an org: resolve and assign the right permission sets and
31
+ groups **org-wide, by role**, confirm the plan, enable Fundraising, create a default Gift
32
+ Designation record, configure basic gift/recurring-donation-failure settings and Fundraising
33
+ feature toggles, and offer optional enhanced features. Every read/write runs through the **Salesforce-hosted
34
+ headless-360 MCP server** via its four meta-tools. Toggle writes use named or org-preference operations, never the
35
+ `IndustriesSettings` Metadata API (not available on every org). The org comes from the
36
+ session's OAuth JWT; this skill never handles an org id, alias, or credentials.
37
+
38
+ ## Scope
39
+
40
+ - **In scope**: Person Accounts precondition check and confirmation-gated enablement (excludes
41
+ HR-Service side effects), Fundraising license check, permission
42
+ set/group resolution and **org-wide** assignment by profile, enabling Fundraising, creating a
43
+ default Gift Designation record, configuring basic gift/recurring-donation-failure settings,
44
+ Fundraising feature toggles, and optional enhanced features (Interest Tags, Interaction
45
+ Summaries, Record Alerts, Life Events, Timeline).
46
+ - **Out of scope**: additional (non-default) gift/donation records; NPSP/Nonprofit Success Pack;
47
+ the Marketing User checkbox.
48
+
49
+ ---
50
+
51
+ ## Layer 0 — License check, then Person Accounts check (read-only, always run first)
52
+
53
+ Run the Fundraising license check (Phase 1 step 2) first, so an
54
+ unlicensed org stops with zero writes. Then check whether Person Accounts is live via `mcp__headless-360__dispatch_readonly`
55
+ — a Tooling query, `SELECT QualifiedApiName FROM FieldDefinition WHERE
56
+ EntityDefinition.QualifiedApiName='Account' AND QualifiedApiName='IsPersonAccount'` (`totalSize > 0`
57
+ = live), the same check `hr-service-person-account-setup` uses. **Do not** filter `RecordType` on
58
+ `IsPersonType` — that column only exists once Person Accounts is already enabled, so it 400s with
59
+ `INVALID_FIELD` on exactly the orgs this gate needs to detect. `FieldDefinition` is always valid
60
+ regardless of org state.
61
+
62
+ Layer 0 writes nothing. Any Person Accounts change is confirmed in the step 5 plan and
63
+ written in step 6a. See `references/mcp-invocation.md`'s "Person Accounts
64
+ enablement (Layer 0)" and "Person Accounts record-type profile visibility".
65
+
66
+ > On any `401`/`403`/`404` from a `discover`/`describe`/`dispatch*` call, halt and surface the
67
+ > raw error rather than guessing — see the Error Taxonomy in `references/mcp-invocation.md`.
68
+
69
+ ---
70
+
71
+ ## Workflow
72
+
73
+ **Idempotency and resumability**: every phase check re-reads live org state — never a persisted
74
+ checkpoint. `state.json` is output-only, never read to resume. Every write step (6, 8, 9, 11)
75
+ queries for an existing match/state before creating or toggling, so re-running this skill — after
76
+ a pause, or days later — recognizes completed work instead of erroring on `DUPLICATE_VALUE` or
77
+ re-toggling something already on.
78
+
79
+ **Front-load verification instead of walking steps one at a time**: steps 6–11 each need a live
80
+ read before deciding whether to write anything — resolve all six checks as early as Phase 1
81
+ allows, before starting Phase 3's writes, rather than one at a time in step order. This is still
82
+ five to seven separate live queries, not one or two collapsed calls — collapsing it is
83
+ under-verification, not the fast path. It applies even when a request says "core setup is already
84
+ done, skip it": the live batch is still the minimum bar, and every fact it confirms still gets
85
+ recorded in `state.json`'s per-step booleans. See `references/mcp-invocation.md → "Front-loading
86
+ Phase 1's live checks"` for the full per-step breakdown and why "already done" never skips a read.
87
+
88
+ **User-facing output**: clean but not silent. Before Phase 2 and Phase 3, give a one-line preview
89
+ of what that phase will touch. After each phase's writes, re-check via a read-only query and give a
90
+ one-line confirmation — never from the write response alone. Everything else stays internal; step
91
+ 14's full re-verification still runs at the end.
92
+
93
+ ### Phase 0 — Reuse what the session already knows
94
+
95
+ Before repeating a `discover`/`describe`/`dispatch_readonly` call below, check whether this
96
+ session already returned the same fact for the *current* org via a successful tool response —
97
+ reuse it instead of re-reading. A user's verbal claim is never cache-eligible, only a live
98
+ response is. See `references/mcp-invocation.md → "Phase 0 caching rules"` for what qualifies and
99
+ when it's invalidated — Layer 0's pause-gate re-check and step 13 always re-read live regardless.
100
+
101
+ ### Phase 1 — Discover and verify prerequisites
102
+
103
+ 1. **Discover the Fundraising-related operations** — `mcp__headless-360__discover(query="Nonprofit Cloud Fundraising settings permission set gift designation")`, then `describe` the concrete targets: `GiftDesignation`, `FundraisingConfig` (incl. `DonorExternalIdField`), and `IndustriesSettings.orgPreferenceEnabled` and its toggles. See `references/mcp-invocation.md` for field lists/fallbacks and `references/permission-targeting.md` for the org-wide permission model.
104
+ 2. **Check Fundraising licensing** (runs first, before Layer 0) — query `PermissionSetLicense` for `DeveloperName = 'FundraisingAccessPsl'` (the base license, distinct from add-ons like `AgentforceForFundraisingPsl`). If not present, **stop**: "Fundraising is not licensed on this org. Contact your Salesforce account team to provision it." Make zero writes.
105
+ 3. **Resolve the required permission sets and groups** — query `PermissionSet` for both name variants (`force__FundraisingAccess`/`FundraisingAccess`) and `PermissionSetGroup` for `Fundraising_Admin`/`Fundraising_User`, confirming `Status = 'Updated'` (see Gotchas on `'Updating'`/`'Outdated'`). Stop and report exactly which is missing if any aren't found. NPC is on-core/unprefixed — never fall back to a managed-package namespace like `npe03__`/`npe01__`.
106
+ 4. **Check whether Fundraising is already enabled** — `describe` the `FundraisingSettings` skill and use its `get-settings-view-model` read for `orgPreferenceEnabled`. Do this in Phase 1 — flipping it dispatches the named `set-fundraising-org-preference` operation, needing its own dedicated confirmation, since it's irreversible and org-wide (`references/mcp-invocation.md → "Enabling Fundraising (set-fundraising-org-preference)"`). If `false`, Phase 2 step 5 handles the gate.
107
+
108
+ ### Phase 2 — Confirm before any write
109
+
110
+ 5. **Present the plan, and gate on Fundraising enablement if needed** — summarize the full scope: Person Accounts enablement (if missing), permission set/group assignment, basic settings, feature toggles, and the step 12 optional-features offer. If step 4 found `orgPreferenceEnabled = false`, warn explicitly (irreversible and org-wide; dispatches the named `set-fundraising-org-preference` operation) and get a dedicated confirmation for this step, on top of the plan-wide one below. Confirmed → step 7 writes it, 6/8/9/10/11/12 all reachable. Declined → stop with zero writes: no later step runs, including permission set/group assignment (`STOPPED_ENABLEMENT_NOT_CONFIRMED`). If Layer 0 found Person Accounts missing, give it the same dedicated irreversibility confirmation (one combined ask is fine); declining stops with zero writes (`STOPPED_PERSON_ACCOUNTS_MISSING`). Confirm the rest of the plan via `AskUserQuestion` before any other write — the ordinary checkpoint, covering every remaining write including toggles; never a separate per-toggle confirmation.
111
+ 6. **Assign `FundraisingAccess` org-wide, and classify each human user by role** — query all active, human `User` rows, classify each by `Profile.Name` (Admin/Standard/unclassified), and assign `FundraisingAccess` to every resolved human user, idempotently. See `references/permission-targeting.md` for the full targeting model and the custom-profile limitation.
112
+
113
+ ### Phase 3 — Enable and configure
114
+
115
+ 6a. **Apply the confirmed Person Accounts change** — only after step 5. Missing → create the Business Account record type, then run the enablement chain (its own operations only, not HR-Service's). A failed re-check stops with `STOPPED_OTHER`. Once it shows an active type (even if enabled), make both types visible to Standard User/System Administrator, Person Account default; on failure report manual and continue.
116
+
117
+ 7. **Enable Fundraising.** Step 5 already resolved whether this runs; a decline there already stopped the run. Otherwise follow the `FundraisingSettings` skill's `set-fundraising-org-preference` step — see `references/mcp-invocation.md → "Enabling Fundraising (set-fundraising-org-preference)"`. If `describe` shows no dispatchable route for it on this org, treat that as a blocking capability gap and stop — do **not** fall back to a Metadata API write for this field. Re-verify via `dispatch_readonly` of `get-settings-view-model` before treating it as done — never trust the write response alone.
118
+ 8. **Assign permission set groups by role** — `Fundraising_Admin` to every Admin-classified user, `Fundraising_User` to every Standard-classified user from step 6 — never both, never unclassified. Same idempotency rule as step 6.
119
+ 9. **Create the default Gift Designation record** — `GiftDesignation` (`Name`, `IsActive = true`, `IsDefault = true`), confirmed via `describe`. Query for an existing `IsDefault = true` record first. Blocked whenever step 7 was blocked (`INVALID_TYPE` until the org preference is on); never run ahead of step 6 — the assigned user needs `FundraisingAccess` to see it.
120
+ 10. **Configure basic settings** — `FundraisingConfig` fields for gift/recurring-donation-failure handling, confirmed via `describe` (see `references/mcp-invocation.md → "FundraisingConfig field defaults"`). Resolve `DonorExternalIdField` deterministically via an object describe on the donor object, looking for a field with `externalId: true` (see `references/mcp-invocation.md → "FundraisingConfig field defaults"` — do **not** query `FieldDefinition`/`EntityParticle` for an `IsExternalId` column, neither exposes one), else fall back to donor name — no prompt. This resolution is mandatory, never skippable: do not save `FundraisingConfig` with `DonorExternalIdField` unset, and run the describe even if every other setting is already configured. Blocked whenever step 7 was blocked.
121
+ 11. **Configure the Fundraising-adjacent feature toggles** — the six toggles in `references/mcp-invocation.md → "Fundraising feature toggles"`: 2 route through named headless-360 operations, and the other 4 route through the generic Setup org-preference operation. (NextGen Commitment Processing is not a toggle here — step 7's `set-fundraising-org-preference` already force-enables it as a side effect.) Verify every write with a best-effort read-only Tooling query; if `IndustriesSettings` isn't available on the org, report the toggle as written-but-unverified and ask the admin to confirm it in Setup, never fall back to a metadata write. Blocked whenever step 7 was blocked.
122
+ 12. **Offer optional enhanced features** — once core setup (6–11) is confirmed complete, step-by-step or via the front-loaded batch, ask once, combined, via `AskUserQuestion`: Interest Tags, Interaction Summaries, Record Alerts, Life Events, Timeline — all, some, or none, never one at a time. If Record Alerts is selected, follow up with one `AskUserQuestion` for the category's label and description (free text) and severity (a choice of `Error`, `Warning` or `Info`) — never create a category without an admin-supplied name. Timeline is irreversible and needs its own explicit warning/confirmation beyond the combined ask. See `references/mcp-invocation.md → "Optional enhanced features"` for the per-feature mechanism.
123
+
124
+ ### Phase 4 — Report
125
+
126
+ 13. **Verify** — re-query what was written (assignments, enablement flag, Gift Designation, settings, toggles) rather than trusting the write response either way — a `dispatch` can `500` and still have applied, or `200` and still have been silently rejected. Only a read-back is authoritative.
127
+ 14. **Summarize for the user** — a compact table (Item | Status), not prose: permission sets/groups, enablement, Gift Designation, every toggle/feature (flag any fallback or skip), final `outcome`/`stopReason`. Same format for the step 12 pre-ask recap — see `references/mcp-invocation.md → "Status-recap table format"`.
128
+ 15. **Write `state.json`** — see Output Expectations below. This is the final action regardless of outcome, including hard-stops.
129
+
130
+ ---
131
+
132
+ ## Rules / Constraints
133
+
134
+ | Constraint | Rationale |
135
+ |-----------|-----------|
136
+ | Check licensing, then Person Accounts, read-only first; enable Person Accounts (step 6a) only after the admin confirms the plan | Irreversible — confirmed as part of the plan |
137
+ | Check Fundraising licensing before the Person Accounts check and permission sets | Stops an unlicensed org before any irreversible write |
138
+ | Always `describe` before a `dispatch` write | Confirms the exact input schema for each operation |
139
+ | Confirm the plan via `AskUserQuestion` before enabling Fundraising or assigning anything | Prevents unintended, hard-to-reverse org changes |
140
+ | Assign permission sets/groups to human users only | Integration/service users on Fundraising sets cause confusing access grants |
141
+ | Re-verify via read-only queries instead of trusting write responses | `dispatch` can `200` on a rejected create or `500` on a write that actually succeeded — neither response alone is proof |
142
+ | Check `orgPreferenceEnabled` (Phase 1) before assuming Fundraising is already on | One-way, irreversible, org-wide toggle — gated behind its own dedicated confirmation |
143
+ | Never treat a human's "done" answer at a pause gate as verified — re-run the read-only check before resuming | Only the org's own state is authoritative, not a report of it |
144
+ | Never persist or read a local checkpoint file to decide where to resume | `state.json` is output-only; live org state is the only checkpoint |
145
+ | Write `state.json` as the final action on every path, including hard-stops | Downstream eval scoring and admins need a machine-readable outcome regardless of where the flow stopped |
146
+ | Permission set/group assignment is org-wide by role | See `references/permission-targeting.md` |
147
+ | Attempt every write through headless-360 named operations or the generic Setup org-preference operation; never write `IndustriesSettings` (or any toggle) through the Metadata API or the `sf` CLI | The Metadata API isn't available on every org, so a Metadata-API-dependent flow breaks there |
148
+ | Never create a Record Alert category without an admin-supplied name — no example or default name | The category is admin-owned content; a made-up one is clutter they didn't ask for |
149
+ | Ask about optional enhanced features (step 12) once, combined — never one `AskUserQuestion` per feature | Avoids prompt fatigue for a set of independent, non-blocking add-ons |
150
+ | Never automate page-layout or Lightning-page component placement (e.g. the Business Milestones related list) — always manual, guided instructions | Placement/styling isn't well-driven through chat, and automation risks overwriting existing customizations |
151
+ | Gift Designation queries/creates (step 9) must never run ahead of permission set assignment (step 6) | Designations aren't visible or usable to the assigned user until `FundraisingAccess` is granted |
152
+
153
+ ---
154
+
155
+ ## Gotchas
156
+
157
+ Known failure modes and misreadings, with resolutions, are catalogued in full in
158
+ `references/gotchas.md` — read it before executing any step that involves `discover`,
159
+ permission set/group readiness, or Record Alerts. Additional
160
+ edge cases (write-response trust, resume/idempotency, pause-gate re-verification, the "who am I"
161
+ fallback, custom-profile/integration-user limits, donor External-Id) are in
162
+ `references/mcp-invocation.md`'s Error Taxonomy/gate sections and `references/permission-targeting.md`'s
163
+ known-limitations notes.
164
+
165
+ ---
166
+
167
+ ## Output Expectations
168
+
169
+ > **Known gap**: this schema doesn't yet track org-wide permission targeting or feature toggles.
170
+ > Extending it further is a tracked follow-up.
171
+
172
+ Write `state.json` to the working directory as the final action, matching this schema:
173
+
174
+ ```json
175
+ {
176
+ "prereqs": { "personAccountsEnabled": true, "fundraisingLicensed": true },
177
+ "permSets": { "resolved": true, "assignedToHumanUsersOnly": true },
178
+ "confirmedBeforeEnable": true,
179
+ "fundraisingEnabled": true,
180
+ "permissionSetGroupsAssigned": true,
181
+ "defaultGiftDesignationCreated": true,
182
+ "settingsConfigured": true,
183
+ "outcome": "CONFIGURED",
184
+ "stopReason": "",
185
+ "optionalFeatures": {
186
+ "offeredCombined": true,
187
+ "recordAlerts": { "categoryCreated": true, "categoryAlreadyExisted": false, "orgPrefsOutcome": "manual_guidance_given" },
188
+ "lifeEvents": { "licenseAssigned": true, "pageLayoutDeployAttempted": false },
189
+ "timeline": { "enabled": true, "dedicatedConfirmationGiven": true }
190
+ }
191
+ }
192
+ ```
193
+
194
+ `outcome` is one of `CONFIGURED`, `STOPPED_PERSON_ACCOUNTS_MISSING`, `STOPPED_NOT_LICENSED`,
195
+ `STOPPED_NOT_CONFIRMED`, `STOPPED_ENABLEMENT_NOT_CONFIRMED`, `STOPPED_OTHER` — never any other
196
+ string, including something meaning "skipped" or "already done." There is no such value; inventing
197
+ one fails validation.
198
+
199
+ **`optionalFeatures` is a required top-level object whenever step 12 is reached** — reached means
200
+ attempting or resolving at least one of Record Alerts, Life Events, or Timeline, not finishing all
201
+ three. `orgPrefsOutcome` is one of `configured`, `manual_guidance_given`, `license_gap`,
202
+ `not_reached`. The Record Alerts org preferences are manual guidance only, so use `manual_guidance_given` once the admin opts in (category creation is reported separately in `categoryCreated`).
203
+ Populate every sub-field touched with what was actually observed; leave sub-fields for a feature
204
+ never touched at their not-yet-resolved value (`not_reached`/`false`) rather than dropping them.
205
+ Omit the whole `optionalFeatures` object only when step 12 was never reached at all — never omit it
206
+ just because the work is partial.
207
+
208
+ **All eight core fields above must be present in the written JSON with a literal `true`/`false` —
209
+ never omit a key, even for a step the request told you to skip.** A step the front-loaded batch
210
+ confirmed is *verified*, not skipped — give it the batch's real observed value (usually `true`),
211
+ not `false`. Reserve `false` for a field genuinely never checked by any means; even then the key
212
+ itself must stay in the object — a missing key and a `false` value are not the same output, and
213
+ only the latter passes validation. Populate every field from values actually observed via
214
+ `dispatch*`/the read-back — never fabricate. Set `stopReason` whenever `outcome` starts with
215
+ `STOPPED_`. Core setup pre-verified via the front-loaded batch, plus this session's
216
+ optional-enhanced-features work, still reports `outcome: CONFIGURED` — that enum has no separate
217
+ "already done" variant.
218
+
219
+ Use `STOPPED_ENABLEMENT_NOT_CONFIRMED` — not `STOPPED_OTHER` — when Phase 2 step 5's enablement
220
+ confirmation ends in "stop": an explicit admin decline. No writes were made, so leave the write-dependent
221
+ fields `false`.
222
+
223
+ ---
224
+
225
+ ## Cross-Skill Integration
226
+
227
+ | Need | Delegate to |
228
+ |------|-------------|
229
+ | Provisioning a Unified Employee (UEL) user, not a Fundraising setup | `service-itsm-agentic-setup-uel-user-create` |
230
+ | General headless-360 invocation conventions (tool shape, ECA setup) | See `references/mcp-invocation.md` in this skill, or the sibling reference in `service-itsm-incident-mgmt-configure` |
231
+
232
+ ---
233
+
234
+ ## Reference File Index
235
+
236
+ | File | When to read |
237
+ |------|--------------|
238
+ | `references/mcp-invocation.md` | Every phase — call shape, ECA setup, error taxonomy, and optional-features mechanisms |
239
+ | `references/permission-targeting.md` | Steps 6, 8 — the org-wide role-based permission model |
240
+ | `references/gotchas.md` | Before any step touching `discover`, toggle verification, permission set/group readiness, or Record Alerts — known failure modes and resolutions |
@@ -0,0 +1,26 @@
1
+ # Gotchas
2
+
3
+ Known failure modes and misreadings encountered while implementing/validating this skill, with
4
+ the correct resolution for each.
5
+
6
+ | Issue | Resolution |
7
+ |-------|------------|
8
+ | `discover` returns no match for a Fundraising settings operation | Not proof the route is absent — probe the documented `/sobjects/…` or `/query` path directly via `dispatch_readonly` (see `mcp-invocation.md`) |
9
+ | `discover` errors with `local_rate_limited` | Not a no-match — see the Error Taxonomy in `mcp-invocation.md` |
10
+ | Person Accounts enabled but no active record type | Still a hard-stop — the feature flag alone doesn't guarantee an active `RecordType` row |
11
+ | Permission set assignment silently applied to a non-human user | Query `User.UserType` before assigning; skip and report if it resolves to a service/integration user |
12
+ | Fundraising enablement treated as a plain `IndustriesSettings` metadata field | It is owned by the `FundraisingSettings` skill (`set-fundraising-org-preference`), gated on an explicit irreversibility confirmation; never write it through `/headless/metadata` |
13
+ | `FundraisingConfig`/`GiftDesignation` writes or queries fail even after `orgPreferenceEnabled = true` was confirmed, or return `400 INVALID_TYPE` instead of `404` | Both still depend on that same flag — not a permission or path issue |
14
+ | Fundraising permission set name inconsistent across orgs (`force__FundraisingAccess` vs `FundraisingAccess`) | Query `PermissionSet` for both candidate names, don't assume one |
15
+ | Permission set group shows `Status = 'Updating'` or `'Outdated'` | Both are non-ready states. Re-query until `'Updated'`; stop and report if it doesn't clear after a couple of retries |
16
+ | `IndustriesSettings` feature toggles assumed to be writable through Metadata CRUD or an `sf` deploy | They aren't — the Metadata API isn't available on every org. Two toggles use named headless operations; the other four use the generic Setup org-preference operation. `set-fundraising-org-preference` is also a named operation. Never write any of them through `/headless/metadata` or the CLI |
17
+ | Treating Prospect Research (`enablePhilResearchAgent`, Gen AI) as needing its own confirmation gate | It doesn't — same toggle batch, covered by step 5's checkpoint |
18
+ | Creating a `RecordAlertCategory` fails with `XML_PARSER_ERROR` | The `Metadata` key is `masterLabel`, not `label` — see `mcp-invocation.md → "Optional enhanced features" → Record Alerts` |
19
+ | Tooling `RecordAlertCategory` route returns `404` at the org's current API version | Some orgs don't serve this route at the newest versions — retry one or two versions lower before treating it as a capability gap |
20
+ | Assuming Record Alerts is fully configured once the category exists | Only the category is automated; the org preferences are manual guidance on the Record Alert Setup page |
21
+ | A toggle's Tooling read-back fails because `IndustriesSettings` isn't available on the org | Report the toggle as "written, unverified" and ask the admin to confirm it in Setup — never fall back to a metadata write or deploy |
22
+
23
+ More edge cases (write-response trust, resume/idempotency, pause-gate re-verification, the "who am
24
+ I" fallback, custom-profile/integration-user limits, donor External-Id) are in
25
+ `mcp-invocation.md`'s Error Taxonomy/gate sections and `permission-targeting.md`'s
26
+ known-limitations notes.