@salesforce/afv-skills 1.66.0 → 1.67.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 (53) hide show
  1. package/package.json +2 -4
  2. package/skills/agentforce-offline-experimentation-run/SKILL.md +13 -28
  3. package/skills/commerce-react-storefront-create/SKILL.md +350 -0
  4. package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +2 -2
  5. package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +28 -16
  6. package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +18 -1
  7. package/skills/education-cloud-domain-configure/SKILL.md +21 -23
  8. package/skills/education-cloud-domain-configure/references/dependent-features.md +9 -0
  9. package/skills/education-cloud-domain-configure/references/domain-features.md +15 -0
  10. package/skills/education-cloud-domain-configure/references/gotchas-extended.md +8 -0
  11. package/skills/education-cloud-domain-configure/references/setup-widgets.md +123 -0
  12. package/skills/experience-search-coordinate/SKILL.md +2 -2
  13. package/skills/experience-search-coordinate/references/media-route.md +30 -4
  14. package/skills/experience-ui-bundle-features-generate/SKILL.md +1 -1
  15. package/skills/experience-ui-bundle-mfa-configure/SKILL.md +1 -1
  16. package/skills/platform-metadata-deploy/README.md +1 -1
  17. package/skills/platform-metadata-deploy/SKILL.md +114 -15
  18. package/skills/platform-metadata-deploy/references/agent-deployment-guide.md +3 -4
  19. package/skills/platform-metadata-deploy/references/orchestration.md +2 -3
  20. package/skills/platform-value-set-generate/SKILL.md +19 -19
  21. package/skills/platform-widget-generate/SKILL.md +25 -51
  22. package/skills/platform-widget-generate/examples/formulas.json +19 -2
  23. package/skills/platform-widget-generate/examples/localized-labels.json +57 -0
  24. package/skills/platform-widget-generate/references/widget-actions.md +29 -0
  25. package/skills/platform-widget-generate/references/widget-bundle-validation.md +1 -0
  26. package/skills/platform-widget-generate/references/widget-formulas.md +24 -7
  27. package/skills/platform-widget-generate/references/widget-gotchas.md +10 -0
  28. package/skills/platform-widget-generate/references/widget-labels.md +78 -0
  29. package/skills/platform-widget-generate/references/widget-styling.md +12 -0
  30. package/skills/sales-call-scoring-configure/SKILL.md +17 -10
  31. package/skills/sales-call-scoring-configure/scripts/enable-call-scoring.sh +55 -33
  32. package/skills/service-digital-engagement-channel-configure/SKILL.md +4 -2
  33. package/skills/service-digital-engagement-channel-configure/references/channel_settings.md +13 -2
  34. package/skills/service-digital-engagement-deployment-configure/SKILL.md +37 -100
  35. package/skills/service-digital-engagement-deployment-configure/assets/esd_web_update_template.xml +83 -8
  36. package/skills/service-digital-engagement-deployment-configure/examples/esd_web_prechat_fields.xml +74 -0
  37. package/skills/service-digital-engagement-deployment-configure/references/connect_api_creation.md +13 -3
  38. package/skills/service-digital-engagement-deployment-configure/references/deployment_settings.md +13 -78
  39. package/skills/service-digital-engagement-deployment-configure/references/onboarding_contract.md +5 -6
  40. package/skills/service-digital-engagement-deployment-configure/references/prechat_forms.md +245 -0
  41. package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +164 -120
  42. package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +61 -37
  43. package/skills/service-itsm-agentic-setup-incident-management/references/audit-tracking.md +42 -0
  44. package/skills/service-itsm-agentic-setup-incident-management/references/broadcast-communications.md +23 -0
  45. package/skills/service-itsm-agentic-setup-incident-management/references/email-to-incident.md +23 -0
  46. package/skills/service-itsm-agentic-setup-incident-management/references/incident-dashboards.md +25 -0
  47. package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +30 -146
  48. package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +32 -136
  49. package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +32 -155
  50. package/skills/service-itsm-agentic-setup-incident-management/references/manage-incidents-with-ai.md +45 -0
  51. package/skills/service-itsm-agentic-setup-incident-management/references/priority-matrix.md +32 -0
  52. package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +30 -140
  53. package/skills/service-itsm-agentic-setup-incident-management/references/sla-milestones.md +110 -0
@@ -0,0 +1,23 @@
1
+ # Feature: Broadcast Communications (delegated to the `service-itsm-broadcast-communications-setup` SOR)
2
+
3
+ How the orchestrator runs the **Broadcast Communications** feature over the
4
+ `service-itsm-broadcast-communications-setup` SOR — never the Service-Foundation `IncidentManagement`
5
+ look-alike's broadcast toggles. The SOR's own steps and guidance decide *how*; the orchestrator runs them
6
+ itself under its **SOR hand-off protocol** and owns every user-facing gate. This file adds what is specific
7
+ to Broadcast Communications.
8
+
9
+ 1. `discover` the SOR by intent (e.g. "set up ITSM broadcast communications") and `describe` the id
10
+ `discover` returns. Its own prerequisite checks fall under protocol step 2.
11
+ 2. **Phase 1 — turn it on, before asking about anything else.** Read the feature (`get-feature-status`).
12
+ Already on → Phase 2 with no question. Non-empty `enableBlockedReasons` or `dependencyStatuses` → name
13
+ the unmet prerequisite in plain language and stop. Otherwise say it's off and that turning it on **can't
14
+ be undone** (Salesforce Go has no way to turn it off), get an explicit yes, run `enable-feature`, and
15
+ require `verify-enabled` to read it on. Never turn the feature off, even when asked — offer to turn off a
16
+ channel or object, or to revoke sender access, instead.
17
+ 3. **Phase 2 — configure only what the user picks** (`AskUserQuestion`, multi-select; never everything by
18
+ default): **sender access** for the users they name (resolve each name, username, or email to exactly
19
+ one user, or ask; the license goes on before the *Broadcast Communication Sender* permission set, a
20
+ duplicate is success, and only that permission set is ever assigned), **channels** (Email, In-app,
21
+ Slack, Microsoft Teams — Slack delivers only with a connected Slack org), and **objects** (Incident,
22
+ Change Request). For each: read, skip it if already set, confirm, write, and read back.
23
+ 4. This is setup only — it sends no broadcast.
@@ -0,0 +1,23 @@
1
+ # Feature: Email-to-Incident (delegated to the `EmailToIncident` SOR)
2
+
3
+ How the orchestrator runs the **Email-to-Incident** feature, which turns incoming email into Incidents. The
4
+ `EmailToIncident` SOR's own steps and guidance decide *how*; the orchestrator runs them itself under its
5
+ **SOR hand-off protocol** and owns every user-facing gate. This file adds what is specific to
6
+ Email-to-Incident.
7
+
8
+ 1. `discover` the SOR by intent (e.g. "email to incident settings routing address") and `describe` the id
9
+ `discover` returns (`EmailToIncident`).
10
+ 2. **Settings.** Read them (`get-email-to-incident-setting`) and ask which to change. Turning on
11
+ Email-to-Incident itself (`enableEmailToIncident`) **can't be undone** — say so before asking. The save
12
+ (`save-email-to-incident-setting`) replaces the whole settings map: send back every field the read
13
+ returned (the set differs by release), changing only what the user chose, and on releases that have
14
+ them, the draft-email, sender-error-notification, and signature settings each need Email-to-Incident on.
15
+ Validate any choice-list value against the SOR's value-set reads. Confirm the full before → after
16
+ change, save, and read back with `verify-save-setting`.
17
+ 3. **Routing addresses — only if the user wants them.** List the existing addresses
18
+ (`get-all-routing-addresses`) and the assignable queues (`get-incident-queue-ids`, the only source for
19
+ the assignee), then create or update one with the user's routing name, email address, and default
20
+ Urgency and Impact (the org's picklist values). An update replaces the whole row, so send every field.
21
+ Read each change back with its `verify-*-routing-address` step. A delete is **irreversible** — confirm
22
+ it explicitly. Re-sending an address's verification email sends a real email: do it only on an explicit
23
+ request.
@@ -0,0 +1,25 @@
1
+ # Feature: Incident Dashboards (delegated to two SORs, one per persona)
2
+
3
+ How the orchestrator runs the **Incident Dashboards** feature over `itsm-incident-dashboard-enablement`
4
+ (Incident Manager) and `itsm-incident-fulfiller-dashboard-enablement` (Incident Fulfiller). Each SOR's own
5
+ steps and guidance decide *how*; the orchestrator runs them itself under its **SOR hand-off protocol** and
6
+ owns every user-facing gate. This file adds what is specific to the dashboards.
7
+
8
+ 1. Unless the user already said, ask which (`AskUserQuestion`): the **Incident Manager** dashboards (the
9
+ Incident Manager dashboards and the Home page dashboards — `itsm-incident-dashboard-enablement`), the
10
+ **Incident Fulfiller** dashboards (the fulfiller work view and the fulfiller Home page —
11
+ `itsm-incident-fulfiller-dashboard-enablement`), or both. `discover` and `describe` each chosen SOR
12
+ (e.g. "turn on incident manager dashboards", "turn on incident fulfiller dashboards").
13
+ 2. Each SOR turns on two org preferences, one at a time. `check-dashboard-preference` first confirms that
14
+ Dynamic Dashboards for IT Service (`service-cloud-itsm-dashboard`) reads exactly `ENABLED`; it turns on
15
+ with IT Service Enablement, so never enable it or ask about it, and any other result stops the feature.
16
+ Then read each preference, skip any already on, ask the SOR's question before each write that turns one
17
+ on (`update-dashboard-preference`), and read each back (`verify-dashboard-preference`). Turn on only the
18
+ persona the user chose.
19
+ 3. After both preferences of a SOR are handled, run its `verify-dashboards-materialized` query. The
20
+ dashboards deploy asynchronously, so report the titles it finds; if they are still missing after its
21
+ retries, say the preference is set but the dashboards are not confirmed to exist, give the user the same
22
+ query, and point them to All Dashboards (App Launcher → Dashboards). A user sees the dashboards only
23
+ with the ITSM console-view permission (a separate grant). If the write returns a dynamic-dashboard limit
24
+ error, report it: freeing a slot (converting a dynamic dashboard to static, or deleting an unused one) is
25
+ a manual admin step — never retry or remediate it here.
@@ -1,118 +1,31 @@
1
- # Feature: Incident Persona PSG Assignment (inline execution)
2
-
3
- How the orchestrator executes the **Persona** feature — granting a **specific user** an ITSM Incident
4
- Management **persona** by assigning the persona's **permission set group (PSG)** (the **Incident Fulfiller**
5
- or **Incident Manager** bundle) together with the **backing permission-set licenses** its member permission
6
- sets require. This runs **inline** through the Salesforce-hosted **`headless-360`** MCP server (server key
7
- `headless-360`) via its four meta-tools (`discover`, `describe`, `dispatch_readonly`, `dispatch`). The org
8
- comes from the OAuth JWT on the MCP session — never handle an org id, alias, or credentials. Minimum API
9
- version **67.0**.
10
-
11
- ## Delegate to the Setup Operation Recipes
12
-
13
- Every operation is delegated to a Setup Operation Recipe (SOR) and its exact shape is fetched at runtime —
14
- `discover` by intent, `describe` the SOR step for its **current** route, method, and argument schema, then
15
- `dispatch_readonly` (reads) / `dispatch` (writes). **Hardcode no routes, SOQL, or request bodies; use what
16
- `describe` returns, and if it disagrees with anything here, `describe` wins.** Discover by intent, not by
17
- id; a `discover` miss is not proof an operation is unavailable.
18
-
19
- | SOR | Owns | Status |
20
- |-----|------|--------|
21
- | **`PermSetGroups`** (approved) | Assigning a PSG to a user; listing a user's PSG assignments | Served today |
22
- | **ITSM incident-persona assignment SOR** | Resolving the incident persona PSGs; resolving the target user; resolving a PSG's member permission sets + their backing licenses; assigning the backing permission-set licenses; the license-seat check; read-back verification | Being onboarded separately. Until served, resolve these via the standard Salesforce Data API **by intent** — the objects and invariants are named below; never via a route written here |
23
-
24
- Discover each by intent — e.g. `discover("assign a permission set group to a user")` for the assignment,
25
- `discover("assign the backing permission-set licenses of an incident persona PSG")` for the license recipe.
26
-
27
- > **Load-bearing trap the SOR does not encode.** Assigning the PSG *alone* sticks the assignment, but any
28
- > permission in a member set whose backing **permission-set license (PSL)** the user lacks **never
29
- > activates** — the persona is silently half-provisioned, and Salesforce does not auto-assign a PSG's
30
- > member PSLs. **Assign the union of the member sets' backing PSLs first, then the PSG.** The PSL set
31
- > differs per PSG and the Ids differ per org, so resolve it at runtime — never hardcode it.
32
-
33
- ## The two Incident Management persona PSGs
34
-
35
- Both are Core-shipped in namespace `force` — query by `DeveloperName` with **no** `NamespacePrefix` filter
36
- (which would exclude them). Resolve each PSG's Id, its member permission sets, and their backing license Ids
37
- at **runtime**.
38
-
39
- | Persona | PSG (`DeveloperName`) | Grants |
40
- |---------|-----------------------|--------|
41
- | Incident Fulfiller | `IncidentFulfillerPSG` | Work incidents as a fulfiller (incident + problem/change/release associators, major-incident proposer) |
42
- | Incident Manager | `IncidentManagerPSG` | Manage the incident-management process and its records |
43
-
44
- The **Major Incident Manager** PSG (`MajorIncidentManagerPSG`) is **out of scope** here (its approver
45
- licensing is part of the orchestrator's **Major Incident Management** feature).
46
-
47
- ## Scope
48
-
49
- - **In scope**: resolving which incident persona PSG(s) exist on the org; resolving the target user;
50
- resolving each chosen PSG's member permission sets and their backing licenses at runtime; checking
51
- existing assignments (idempotency); assigning the missing backing PSL(s) and then the PSG; verifying by
52
- read-back.
53
- - **Out of scope**: the **Major Incident Manager** PSG; creating / editing / recalculating a PSG or its
54
- membership; enabling ITSM / incident-management features (the `IncidentMgmt` SOR's master-feature steps); the
55
- `IncidentFulfiller` permission **set** for the Fulfiller **agent's** access
56
- (`service-itsm-agentic-setup-itsm-agentforce-permset-assign`); CMDB access
57
- (`service-itsm-agentic-setup-cmdb-access-assign`); generic, non-incident permission-set / PSG assignment
58
- (`dx-org-permission-set-assign`).
59
-
60
- ## Preconditions
61
-
62
- - **ITSM Incident Management must be provisioned** — the incident persona PSGs must exist on the org. If
63
- neither is found, **stop and report that the personas are not provisioned**; the master-feature
64
- prerequisite is handled by the orchestrator, but enabling it does not prove the PSGs exist.
65
- - **The acting user must be able to assign permission sets** (the SOR gates writes on it). A write that
66
- fails with an access error that is not a duplicate → surface it plainly and stop; an admin must do it.
67
- - **Each backing license consumes a seat.** A seat-exhausted license blocks that persona; report it.
68
-
69
- ## Operations (shapes come from `describe`)
70
-
71
- 1. **Resolve which incident persona PSGs exist (read).** Look up the two PSGs by `DeveloperName`
72
- (`IncidentFulfillerPSG`, `IncidentManagerPSG`) with **no `NamespacePrefix` filter**. None found →
73
- stop and report that the personas are not provisioned. Capture each PSG's Id and status.
74
- 2. **Resolve the target user (read).** To exactly one active user. For "me" / "the current user", read the
75
- API root's identity (the running user's `005…` Id) — **not** the `USER_ID()` SOQL function (Apex-only)
76
- and **not** the Chatter current-user endpoint (fails when Chatter is off). Zero / multiple → disambiguate.
77
- 3. **Resolve the chosen PSG's member licenses (read).** From the PSG's member permission sets, collect the
78
- **distinct, non-null backing permission-set-license Ids** — the link is each member permission set's
79
- `LicenseId`. Do **not** traverse the license's `Name`/`DeveloperName` from the member (that relationship
80
- rejects); resolve the license label separately by Id. No members → the bundle is empty; surface and stop.
81
- 4. **Check existing assignments (read — idempotency).** Whether the PSG is already assigned, and which
82
- backing licenses the user already holds. Write only what is missing.
83
- 5. **Assign the missing backing licenses, then the PSG (write — confirm first).** Assign each **missing
84
- backing license first**, then the PSG (keyed on `PermissionSetGroupId`). A duplicate = already-assigned
85
- (idempotent success). A seat/limit error on a license = exhausted; stop and report — do not retry.
86
- 6. **Verify (read).** Re-read the PSG assignment and every backing license for the user, and re-read the
87
- PSG's status. Provisioned only when all read back. If `Status` is still `Updating`, tell the user
88
- effective permissions are settling and will be active shortly.
89
-
90
- If the user picks **both** personas, run steps 3–6 once **per PSG** (the bundles have different member
91
- licenses) and report each.
92
-
93
- ## Invariants — the contract (these do NOT come from `describe`)
94
-
95
- - **Assign the backing licenses before the PSG — correctness ordering, not a platform gate.** The PSG
96
- sticks on its own, but any member-set permission whose backing license the user lacks **never activates**.
97
- Salesforce neither rejects the PSG assignment for a missing license nor auto-assigns the licenses.
98
- - **A PSG assignment keys on the permission-set-*group* Id, never a permission-set Id.**
99
- - **Query the persona PSGs by `DeveloperName` with no `NamespacePrefix` filter** (namespace `force`).
100
- - **Idempotent** — read before every write; a duplicate is already-assigned success, not a failure.
101
- - **The PSG recalculates asynchronously** after an assignment; effective permissions can be stale until its
102
- status settles.
103
- - **Verify by read-back** — the write response alone is not proof (half-provisioning / recalculation).
104
- - **Resolve the backing-license set at runtime** — it differs per PSG and Ids differ per org; never hardcode.
105
-
106
- ## Clarifying questions
107
-
108
- - **Which user?** A username / name / email resolving to exactly one active user; for "me", the running user.
109
- - **Which persona(s)?** For a generic request, do **not** auto-select — present an `AskUserQuestion` menu of
110
- the incident PSGs that **exist on the org** (Fulfiller = work incidents; Manager = manage the process),
111
- multi-select (one or both). Never offer the Major Incident Manager PSG.
112
- - **Which org?** Confirm it and state plainly the org will be **modified** (a PSG + licenses are writes;
113
- each license consumes a seat). For production, get explicit confirmation.
114
-
115
- ## Output expectations
1
+ # Feature: Incident Persona PSG (delegated to the `service-itsm-incident-persona-assign` SOR)
2
+
3
+ How the orchestrator runs the **Incident Persona PSG** feature: giving one user the **Incident Fulfiller**
4
+ or **Incident Manager** persona — its permission set group (PSG) plus the permission-set licenses its
5
+ member sets need. The `service-itsm-incident-persona-assign` SOR's own steps and guidance decide *how* —
6
+ the PSG lookup, the user and license resolution, licenses before the PSG, and the read-back; the
7
+ orchestrator runs them itself under its **SOR hand-off protocol** and owns every user-facing gate. This file
8
+ adds what is specific to the personas.
9
+
10
+ 1. `discover` the SOR by intent (e.g. "assign the Incident Fulfiller or Incident Manager persona to a
11
+ user") and `describe` the id `discover` returns (`service-itsm-incident-persona-assign`).
12
+ 2. Find the personas (`resolve-incident-persona-psgs`). If neither PSG exists, stop and report that the
13
+ incident personas aren't provisioned on this org. Don't follow the hand-off that step names for this
14
+ case: Behavior step 2 already confirmed Incident Management is on, and turning it on doesn't prove the
15
+ PSGs exist.
16
+ 3. Unless the user named one, ask which persona (`AskUserQuestion`, multi-select), offering only the PSGs
17
+ that exist — Fulfiller works incidents, Manager runs the process. Never auto-select, and never offer the
18
+ Major Incident Manager PSG (that approver license is part of **Major Incident Management**). Resolve the
19
+ user to exactly one active user (`resolve-target-user`, or `resolve-current-user` for "me"); on zero or
20
+ several matches, ask.
21
+ 4. For each chosen PSG, separately: resolve its backing licenses, check what the user already has, and check
22
+ seats only on the licenses still missing — a license the user already holds needs no free seat. If the
23
+ PSG has no member sets, say so and stop that persona. Confirm the exact grants and that this org is
24
+ modified (each license uses a seat; explicit confirmation for production), then run
25
+ `assign-backing-psl`, `assign-persona-psg`, and `verify-persona-assignment`.
26
+ 5. Report with the block below — one `Persona:` block per PSG — only what read-back confirmed. If the PSG's
27
+ status still reads `Updating`, the grant is in place and its permissions are settling: say so rather than
28
+ failing it. An access error that isn't a duplicate means an admin must make the assignment.
116
29
 
117
30
  ```text
118
31
  Incident Management Persona Assignment
@@ -124,34 +37,5 @@ Persona: <Incident Fulfiller | Incident Manager>
124
37
  Effective permissions ............. Active | Recalculating (settles shortly)
125
38
  ```
126
39
 
127
- Repeat the `Persona:` block per PSG if both were chosen. Report only what read-back confirmed. If the
128
- personas are not on the org, say so without claiming master enablement will provision them.
129
-
130
- ## Common failures (surface in plain language)
131
-
132
- | Symptom | Likely cause | What to tell the user |
133
- |---------|--------------|-----------------------|
134
- | No incident PSG on the org | Incident persona PSGs not provisioned | The incident personas aren't set up yet — stop and report the missing PSGs |
135
- | Duplicate on assign | User already has that grant | Not an error — report as already assigned |
136
- | Seat / limit error on a license | An incident license has no free seats | A seat must free up (or more licenses added); the persona is incomplete without it |
137
- | PSG assigned but some actions missing | A backing license wasn't assigned, or the PSG is still recalculating | Confirm every backing license is assigned; if it's settling, retry in a moment |
138
- | Access error on the PSG write (not a duplicate) | Acting user can't assign permission sets | An admin must grant that or perform the assignment |
139
- | `dispatch*` auth error | headless-360 session not authenticated / expired | Re-authenticate the connection and confirm it points at the intended org |
140
-
141
- ## Reading `dispatch` results
142
-
143
- Responses come back wrapped as `{ status_code, body }`; read what you need from `body`. A write success is a
144
- created record. A `400` carrying a duplicate code = already-assigned (treat as success). A seat/limit error
145
- on a license = no free seats (report used-vs-total; do not retry). An access error that is **not** a
146
- duplicate on the PSG write = the acting user can't assign permission sets (an admin must). A `404` = the
147
- operation isn't available on this org.
148
-
149
- ## Dead ends — do NOT do these
150
-
151
- - Assign the PSG with a permission-set Id — a PSG assignment keys on the group Id.
152
- - Assign the PSG without its members' backing licenses — it silently half-provisions the persona.
153
- - Hardcode the backing-license list, or add a `NamespacePrefix` filter to the PSG lookup.
154
- - Create, edit, or recalculate the PSG or its membership — this feature only **assigns** the standard
155
- incident PSGs.
156
- - Retry a write that failed with a seat/limit error — the shortage is real; surface it.
157
- - Write a route, SOQL string, or request body here — delegate to the SOR and let `describe` carry the shape.
40
+ This feature only assigns the two standard persona PSGs — it never creates, edits, or recalculates a PSG,
41
+ and it assigns no other permission set.
@@ -1,107 +1,35 @@
1
- # Feature: Incident Management Preferences (inline execution)
2
-
3
- How the orchestrator executes the **Preferences** feature — reading and setting the **six per-feature
4
- Incident Management preferences** (the feature toggles on the Incident Management setup page). This runs
5
- **inline** through the Salesforce-hosted **`headless-360`** MCP server (server key `headless-360`) via its
6
- four meta-tools (`discover`, `describe`, `dispatch_readonly`, `dispatch`). The org comes from the OAuth JWT
7
- on the MCP session — never handle an org id, alias, or credentials. Minimum API version **67.0**.
8
-
9
- This is **not** the master Incident Management on/off switch (the master-feature steps of the `IncidentMgmt` SOR) nor
10
- the Incident Priority Matrix (`service-itsm-incident-priority-configure`).
11
-
12
- ## Delegate to the Setup Operation Recipe
13
-
14
- Every operation is delegated to a Setup Operation Recipe (SOR) and its exact shape is fetched at runtime:
15
- `discover` the operation by intent, `describe` the SOR for its **current** steps, routes, argument schema,
16
- the preference list, the on-screen labels, and its `agent_guidance`, then `dispatch_readonly` (reads) /
17
- `dispatch` (writes). **Hardcode no routes, preference names, labels, or request bodies — use what
18
- `describe` returns, and if it disagrees with anything here, `describe` wins.** Discover by intent, not by
19
- id; a `discover` miss is not proof an operation is unavailable.
20
-
21
- | SOR | Owns | Status |
22
- |-----|------|--------|
23
- | **`IncidentMgmt`** | Read a preference; toggle a preference; verify a preference read-back | Served |
24
-
25
- Discover by intent — e.g. `discover("configure ITSM incident management preferences: automatically triage
26
- incidents, assign incidents with Einstein, enable rich text for incident descriptions")`.
27
-
28
- > **Resolve the right node — load-bearing.** Two setup nodes share the "Incident" name. Target the
29
- > **ITSM Incident Management org-preferences** node whose toggles are the six below — **not** the
30
- > Service-Foundation "Incident Management" node, whose toggles are broadcast/notification channels
31
- > (Email/Sites/Alerts/Slack). The `IncidentMgmt` SOR also owns the master on/off switch; a `discover`
32
- > result about broadcast channels is the wrong node.
33
-
34
- ## Operations (shapes come from `describe`)
35
-
36
- 1. **Read a preference (read).** Given a preference name, return its Boolean state. Unknown names are **not
37
- validated on read** — they return `false` rather than raising — so only ever read a preference the SOR
38
- lists; a `false` read is not proof a name is valid.
39
- 2. **Toggle a preference (write — confirm first).** Set a named preference enabled/disabled. An unknown
40
- name raises. The two one-way preferences cannot be set to disabled.
41
- 3. **Verify (read).** Read the changed preference back and expect it to equal the value just set.
42
-
43
- ## The six preferences (name → label; `describe`/`agent_guidance` is authoritative)
44
-
45
- | Preference name | Setup label | One-way |
46
- |-----------------|-------------|---------|
47
- | `IncidentValidationsEnabled` | Default Field Validations for Incidents | No |
48
- | `AutoClosureChildIncidents` | Automatically Close Child Incidents | No |
49
- | `IncidentTriageAgentEnabled` | Automatically Triage Incidents | No |
50
- | `IncAssignWithAgentEnabled` | Assign Incidents with Einstein | No |
51
- | `AssignedGroupValidationEnabled` | Restrict Assigned Group to Regular Groups | **Yes** |
52
- | `RtaIncidentDescEnabled` | Enable Rich Text for Incident Descriptions | **Yes** |
53
-
54
- Read the live list and labels from `describe` at runtime — this table is the authoring snapshot for trigger
55
- phrasing and the known-name enumeration.
56
-
57
- ## Invariants — the contract
58
-
59
- - **Two preferences are one-way / enable-only:** `RtaIncidentDescEnabled` and
60
- `AssignedGroupValidationEnabled`. Once enabled they cannot be disabled. Never offer to disable them;
61
- require an explicit "I understand this can't be undone" confirmation before enabling; never enable one
62
- merely to test.
63
- - **`AssignedGroupValidationEnabled` also freezes once the org has any Incident record** — it is settable
64
- only while the org has no incidents. An enable can therefore **fail outright** when incidents already
65
- exist; surface pre-existing incidents as the likely cause and do **not** retry.
66
- - **Read does not validate the preference name** (unknown → `false`, no error); only the write is
67
- allowlisted (unknown → raises). Enumerate only the six the SOR lists.
68
- - **Access gate:** the caller needs `IncidentMgmt.userHasITSMSetupAccess` (sysadmin OR Customize
69
- Application + Modify All Data + View Setup). Without it every read and write is blocked by the controller.
70
- - **Idempotent** — read before every write; skip a write when the preference is already in the requested
71
- state.
72
- - **Verify by read-back** — the write response alone is not proof the change persisted.
73
-
74
- ## Preconditions
75
-
76
- - **Setup access**: the caller needs ITSM setup access. Without it every read and write is blocked —
77
- surface the raw access error and stop.
78
- - **Incident Management provisioned**: these preferences are writable only when Incident Management is
79
- enabled at the feature/license level. If reads or writes fail with an availability error, say the feature
80
- must be enabled first (the `IncidentMgmt` SOR's master-feature steps) and stop.
81
-
82
- ## Workflow
83
-
84
- The SOR's `agent_guidance` (returned by `describe`) carries the detailed flow and current labels; follow
85
- it. In outline — **read before you write, confirm before every write, verify every write by read-back**,
86
- and act only on the preferences the user chose:
87
-
88
- 1. **Read current state** — read each of the six preferences and report which are on and which are off,
89
- flagging the two one-way ones.
90
- 2. **Ask which to change** — never infer; for a one-way enable, take the explicit can't-be-undone
91
- confirmation here. On any non-yes, stop without writing.
92
- 3. **Apply only the chosen preferences** — skip any already in the requested state (idempotent no-op).
93
- 4. **Verify** — read each changed preference back; report success only when it read back as set.
94
-
95
- ## Clarifying questions
96
-
97
- - **Which preference(s)?** If unstated, present the six (by label, flagging the two one-way) and let the
98
- user pick.
99
- - **Enable or disable?** Required for a change; never infer direction from current state. Disable is not
100
- offered for the two one-way preferences.
101
- - **Which org?** Confirm it and state plainly the org will be **modified**. For production, get explicit
102
- confirmation. Enabling a one-way preference is permanent.
103
-
104
- ## Output expectations
1
+ # Feature: Incident Preferences (delegated to the `IncidentMgmt` SOR)
2
+
3
+ How the orchestrator runs the **Incident Preferences** feature: the six per-feature toggles on the ITSM
4
+ Incident Management setup page. The `IncidentMgmt` SOR's own steps and guidance decide *how* — the six
5
+ preference names and labels, the two one-way ones, and the read-back; the orchestrator runs them itself
6
+ under its **SOR hand-off protocol** and owns every user-facing gate. This file adds what is specific to the
7
+ preferences.
8
+
9
+ 1. `discover` the SOR by intent (e.g. "configure ITSM incident management preferences: automatically triage
10
+ incidents, assign incidents with Einstein") and `describe` the id `discover` returns (`IncidentMgmt`) —
11
+ never the Service-Foundation `IncidentManagement` look-alike, whose toggles are broadcast channels.
12
+ 2. Behavior step 2 already ran this SOR's IT Service Enablement and Incident Management steps, so start at
13
+ its preference flow: read (`getOrgPref_1`), change (`updateOrgPref_2`), read back
14
+ (`verify-update-org-pref`). Never run its `disable-itsm-incident-feature` /
15
+ `verify-itsm-incident-feature-disabled` steps (the master switch is not part of this feature) or
16
+ `delegate-email-to-incident` (that is the **Email-to-Incident** feature).
17
+ 3. Read all six and show them with the block below, flagging the two one-way ones. Ask which to change and
18
+ in which direction (`AskUserQuestion`) — never infer the direction from the current state, and never
19
+ offer to turn a one-way preference off. Skip any already in the requested state.
20
+ 4. Confirm the exact change and that this org is modified (explicit confirmation for production). For
21
+ *Restrict Assigned Group to Regular Groups* or *Enable Rich Text for Incident Descriptions*, the
22
+ confirmation must say it can't be undone. Write each chosen preference and read each back; mark the
23
+ feature `Done` only when every read-back matches.
24
+ 5. In plain language: a failed enable of *Restrict Assigned Group…* means the org already has incidents, so
25
+ it can't be turned on now — don't retry. If *Automatically Triage Incidents* or *Assign Incidents with
26
+ Einstein* can't be read or turned on, the org lacks that switch's license (*IT Services: Agentforce
27
+ Features for Employees* for triage, *IT Services: Einstein Features* for Einstein assignment): say so,
28
+ skip it, and carry on with the others.
29
+ 6. *Automatically Triage Incidents* and *Assign Incidents with Einstein* are also two of the three switches
30
+ of the **Manage Incidents with AI** feature — the same org preferences — so one set in either feature
31
+ reads as already set in the other. That feature's third switch, *Report Incidents from Chat or Voice
32
+ Using AI*, is not one of the six.
105
33
 
106
34
  ```text
107
35
  Default Field Validations for Incidents ...... On | Off
@@ -113,35 +41,3 @@ and act only on the preferences the user chose:
113
41
 
114
42
  Changed: <label> Off → On (SUCCEEDED | ALREADY-ON | FAILED)
115
43
  ```
116
-
117
- Report only what read-back confirmed. On a failure, stop and say — in plain language — what did not succeed
118
- and what it means (e.g. "that setting can't be turned on once incidents exist").
119
-
120
- ## Common failures (surface in plain language)
121
-
122
- | Symptom | Likely cause | What to tell the user |
123
- |---------|--------------|-----------------------|
124
- | Enable of "Restrict Assigned Group…" fails | The org already has Incident records (server freezes it) | That setting can only be turned on before any incidents exist; it can't be enabled now |
125
- | Read/write blocked with an access error | Caller lacks ITSM setup access | An admin with setup access must make this change |
126
- | Read/write unavailable on the org | Incident Management not enabled | Enable Incident Management first through the `IncidentMgmt` SOR's master-feature steps |
127
- | Change didn't persist on read-back | Write did not take | Report it as failed and show the current state; do not claim success |
128
- | `dispatch*` auth error | headless-360 session not authenticated / expired | Re-authenticate the connection and confirm it points at the intended org |
129
-
130
- ## Reading `dispatch` results
131
-
132
- Responses come back wrapped as `{ status_code, body }`; read what you need from `body`. A preference read
133
- returns a Boolean in `body`. A write success persists (no meaningful body). A service error on a write =
134
- either a preference name outside the six, **or** a one-way freeze (e.g. `AssignedGroupValidationEnabled`
135
- with incidents already present) — surface the specific cause, do not retry blindly. A `401` / `403` =
136
- missing setup access or an unauthenticated session. A `404` = the operation is not available on this org
137
- (feature not enabled).
138
-
139
- ## Dead ends — do NOT do these
140
-
141
- - Write an HTTP route or a request body here — delegate to the SOR and let `describe` carry the shape.
142
- - Offer to disable a one-way preference, or enable one just to "test" it.
143
- - Read or write against the Service-Foundation `IncidentManagement` node (broadcast channels) — wrong node.
144
- - Read or write any preference name the SOR does not list — an unknown name reads as `false` and is
145
- rejected on write.
146
- - Toggle the **master** Incident Management switch as part of this preferences feature (use the orchestrator's prerequisite over the `IncidentMgmt` SOR) or the
147
- **Incident Priority Matrix** (`service-itsm-incident-priority-configure`).