@salesforce/afv-skills 1.61.0 → 1.63.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 (44) hide show
  1. package/package.json +3 -3
  2. package/skills/agentforce-architecture-analyze/README.md +2 -1
  3. package/skills/agentforce-d360-analyze/README.md +1 -1
  4. package/skills/agentforce-generate/README.md +1 -0
  5. package/skills/crm-analytics-wave-generate/SKILL.md +212 -0
  6. package/skills/crm-analytics-wave-generate/assets/dashboard-template.json +66 -0
  7. package/skills/crm-analytics-wave-generate/assets/wapp-meta-template.xml +10 -0
  8. package/skills/crm-analytics-wave-generate/assets/wdash-meta-template.xml +6 -0
  9. package/skills/crm-analytics-wave-generate/assets/wdpr-meta-template.xml +11 -0
  10. package/skills/crm-analytics-wave-generate/examples/industry-binding-dashboard.wdash +67 -0
  11. package/skills/crm-analytics-wave-generate/examples/opportunity-revenue-recipe.wdpr +132 -0
  12. package/skills/crm-analytics-wave-generate/examples/pipeline-by-industry-quarter.wdpr +236 -0
  13. package/skills/crm-analytics-wave-generate/examples/wdpr-skeleton.wdpr +62 -0
  14. package/skills/crm-analytics-wave-generate/references/dashboard-authoring.md +157 -0
  15. package/skills/crm-analytics-wave-generate/references/dataset-hygiene.md +27 -0
  16. package/skills/crm-analytics-wave-generate/references/external-data-upload.md +61 -0
  17. package/skills/crm-analytics-wave-generate/references/method-decision-tree.md +12 -0
  18. package/skills/crm-analytics-wave-generate/references/r3-node-schema.md +194 -0
  19. package/skills/crm-analytics-wave-generate/references/scripts-reference.md +17 -0
  20. package/skills/crm-analytics-wave-generate/references/ui-section-template.md +68 -0
  21. package/skills/crm-analytics-wave-generate/scripts/check_connector_error.sh +53 -0
  22. package/skills/crm-analytics-wave-generate/scripts/create_app.js +59 -0
  23. package/skills/crm-analytics-wave-generate/scripts/deploy_and_run_recipe.js +122 -0
  24. package/skills/crm-analytics-wave-generate/scripts/fetch_dataset_xmd.js +59 -0
  25. package/skills/crm-analytics-wave-generate/scripts/find_unused_dataset_fields.js +96 -0
  26. package/skills/crm-analytics-wave-generate/scripts/gen_synthetic_dataset.js +137 -0
  27. package/skills/crm-analytics-wave-generate/scripts/patch_t_oppo_view.js +99 -0
  28. package/skills/crm-analytics-wave-generate/scripts/probe_recipe.js +47 -0
  29. package/skills/crm-analytics-wave-generate/scripts/upload_dataset.js +119 -0
  30. package/skills/crm-analytics-wave-generate/scripts/verify_dashboard_steps.js +99 -0
  31. package/skills/crm-analytics-wave-generate/scripts/verify_synthetic_dataset.js +86 -0
  32. package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +60 -20
  33. package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +5 -1
  34. package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +2 -2
  35. package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +2 -2
  36. package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +5 -5
  37. package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +5 -5
  38. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +67 -100
  39. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone-action.json +2 -2
  40. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +2 -2
  41. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +23 -22
  42. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +3 -3
  43. package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +182 -58
  44. package/skills/service-itsm-agentic-setup-incident-sla-configure/references/workflow.md +157 -88
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ // Post-upload SAQL sanity checks: row count, sum/min/max on numeric fields, group-by-dimension breakdowns.
3
+ // Usage: node scripts/verify_synthetic_dataset.js <alias> <datasetId> <versionId>
4
+
5
+ const { execSync, execFileSync } = require("child_process");
6
+
7
+ function getOrgCredentials(alias) {
8
+ const result = execFileSync('sf', ['org', 'display', '-o', alias, '--json'], { encoding: "utf8" });
9
+ const json = JSON.parse(result);
10
+ return { accessToken: json.result.accessToken, instanceUrl: json.result.instanceUrl };
11
+ }
12
+
13
+ function apiFetch(instanceUrl, accessToken, apiPath, method = "GET", body = null) {
14
+ const url = `${instanceUrl}${apiPath}`;
15
+ const args = [
16
+ "-s",
17
+ "-H", `Authorization: Bearer ${accessToken}`,
18
+ "-H", "Content-Type: application/json",
19
+ "-X", method,
20
+ "-w", "\\nHTTP_STATUS:%{http_code}",
21
+ ];
22
+ if (body !== null) args.push("-d", JSON.stringify(body));
23
+ args.push(url);
24
+ const raw = execSync(`curl ${args.map(a => `'${String(a).replace(/'/g, "'\\''")}'`).join(" ")}`, {
25
+ encoding: "utf8", maxBuffer: 10 * 1024 * 1024,
26
+ });
27
+ const parts = raw.split("\nHTTP_STATUS:");
28
+ const httpStatus = parseInt(parts[1] || "0", 10);
29
+ if (httpStatus < 200 || httpStatus >= 300) {
30
+ throw new Error(`HTTP ${httpStatus} on ${method} ${apiPath}: ${parts[0]}`);
31
+ }
32
+ return JSON.parse(parts[0]);
33
+ }
34
+
35
+ function runSaql(instanceUrl, accessToken, datasetId, versionId, saql) {
36
+ const body = {
37
+ query: saql,
38
+ queryLanguage: "SAQL",
39
+ overrideHeadProcessing: true,
40
+ };
41
+ // Substitute dataset id/version for /wave/query
42
+ const boundQuery = saql.replace(/"__DATASET__"/, `"${datasetId}/${versionId}"`);
43
+ body.query = boundQuery;
44
+ return apiFetch(instanceUrl, accessToken, "/services/data/v59.0/wave/query", "POST", body);
45
+ }
46
+
47
+ const [,, alias, datasetId, versionId] = process.argv;
48
+ if (!alias || !datasetId || !versionId) {
49
+ console.error("Usage: node verify_synthetic_dataset.js <alias> <datasetId> <versionId>");
50
+ process.exit(1);
51
+ }
52
+
53
+ const { accessToken, instanceUrl } = getOrgCredentials(alias);
54
+
55
+ // Fetch XMD to know field names
56
+ const xmdResult = apiFetch(instanceUrl, accessToken,
57
+ `/services/data/v59.0/wave/datasets/${datasetId}/versions/${versionId}/xmd`
58
+ );
59
+ const xmd = xmdResult.xmd || xmdResult;
60
+ const measures = (xmd.measures || []).slice(0, 3);
61
+ const dimensions = (xmd.dimensions || []).slice(0, 2);
62
+
63
+ const results = {};
64
+
65
+ // Row count
66
+ const countSaql = `q = load "__DATASET__"; q = group q by all; q = foreach q generate count() as count;`;
67
+ const countResult = runSaql(instanceUrl, accessToken, datasetId, versionId, countSaql);
68
+ results.rowCount = countResult.results?.records?.[0]?.count ?? null;
69
+
70
+ // Sum/min/max for first measure
71
+ if (measures.length > 0) {
72
+ const m = measures[0].fieldName || measures[0].name;
73
+ const statSaql = `q = load "__DATASET__"; q = group q by all; q = foreach q generate sum('${m}') as total, min('${m}') as minVal, max('${m}') as maxVal;`;
74
+ const statResult = runSaql(instanceUrl, accessToken, datasetId, versionId, statSaql);
75
+ results.measureStats = statResult.results?.records?.[0] || null;
76
+ }
77
+
78
+ // Group-by for first dimension
79
+ if (dimensions.length > 0) {
80
+ const d = dimensions[0].fieldName || dimensions[0].name;
81
+ const groupSaql = `q = load "__DATASET__"; q = group q by '${d}'; q = foreach q generate '${d}' as dim, count() as count; q = limit q 10;`;
82
+ const groupResult = runSaql(instanceUrl, accessToken, datasetId, versionId, groupSaql);
83
+ results.dimensionBreakdown = groupResult.results?.records || null;
84
+ }
85
+
86
+ console.log(JSON.stringify(results, null, 2));
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: service-itsm-agentic-setup-incident-management
3
- description: "Orchestrator for Incident Management setup in Salesforce Service Cloud ITSM: presents the available features, tracks progress, and configures each — SLA & Milestones, Priority Matrix, Incident preferences, Major Incident Management, Incident persona PSG assignment, and Service Management Privilege. Use for: set up or configure incident management, incident management walkthrough, what incident features can I configure; the incident preference toggles (default field validations, auto-close child incidents, auto-triage, assign with Einstein, restrict assigned group, rich text descriptions); Major Incident Management (approval group + MIM preferences); assigning the Incident Fulfiller or Incident Manager persona PSG to a user; Service Management Privilege / privilege escalation setup. DO NOT TRIGGER for: the master on/off switch (service-itsm-incident-mgmt-configure), the Priority Matrix or SLA alone, the Major Incident Manager PSG, creating/editing PSGs, or Problem/Change/Case Management."
3
+ description: "Orchestrator for Incident Management setup in Service Cloud ITSM: presents the features, tracks progress, and configures each — SLA & Milestones, Priority Matrix, Incident preferences, Major Incident Management, Incident persona PSG assignment, Service Management Privilege, and Incident audit tracking. Use for: set up or configure incident management, incident management walkthrough, what incident features can I configure; the incident preference toggles (default field validations, auto-close child incidents, auto-triage, assign with Einstein, restrict assigned group, rich text descriptions); Major Incident Management (approval group + MIM preferences); assigning the Incident Fulfiller or Incident Manager persona PSG; Service Management Privilege / privilege escalation setup. DO NOT TRIGGER for: the master on/off switch (service-itsm-incident-mgmt-configure), the Priority Matrix, SLA, or field history tracking alone, the Major Incident Manager PSG, creating/editing PSGs, or Problem/Change/Case Management."
4
4
  metadata:
5
- version: "2.0"
5
+ version: "2.1"
6
6
  domains: ["Service"]
7
7
  minApiVersion: "67.0"
8
8
  relatedSkills:
@@ -16,11 +16,7 @@ metadata:
16
16
  headless-360:
17
17
  tools: ["describe", "discover", "dispatch", "dispatch_readonly"]
18
18
  semver: ">=1.0.0"
19
- accessCheck:
20
- - type: "userPerm"
21
- value: "CustomizeApplication"
22
- - type: "orgPerm"
23
- value: "IncidentMgmt.orgHasITSMOrgPermission"
19
+ accessCheck: "(UserPermissions.CustomizeApplication) && (IncidentMgmt.orgHasITSMOrgPermission)"
24
20
  allowed-tools: |
25
21
  Read AskUserQuestion
26
22
  mcp__headless-360__discover
@@ -32,8 +28,9 @@ allowed-tools: |
32
28
  # Incident Management Setup Orchestrator
33
29
 
34
30
  Guide the user through setting up Incident Management features in Salesforce Service Cloud ITSM by
35
- presenting the available capabilities, tracking progress, and — per feature — either **delegating** to a
36
- specialized child skill or **executing the feature inline over its system of record (SOR)**.
31
+ presenting the available capabilities, tracking progress, and — per feature — either **delegating** it (to
32
+ a specialized child skill, or to a Setup Operation Recipe (SOR) whose own steps this skill follows), or
33
+ **executing it inline** from this skill's reference file over its SOR.
37
34
 
38
35
  ## Goal
39
36
 
@@ -51,12 +48,43 @@ until the user is done.
51
48
  | 4 | Major Incident Management | **Inline over SOR** → `references/major-incident-management.md` |
52
49
  | 5 | Incident Persona PSG | **Inline over SOR** → `references/incident-persona-psg.md` |
53
50
  | 6 | Service Management Privilege | **Inline over SOR** → `references/service-mgmt-privilege.md` |
54
-
55
- **Delegated** features invoke their child skill (this skill only coordinates). **Inline** features are run
56
- by this skill directly through the `headless-360` MCP server — **read the matching reference file before
57
- executing that feature** and follow it. Every inline operation is fetched at runtime: `discover` by intent,
58
- `describe` for the current route/schema/labels, then `dispatch_readonly` (reads) / `dispatch` (writes).
59
- **Hardcode nothing — `describe` wins.**
51
+ | 7 | Audit Tracking | **Delegate** → `FieldHistoryTracking` (the Field History Tracking SOR) |
52
+
53
+ **Delegated** features hand off to their child skill or SOR. A child skill runs its own confirmations and
54
+ read-backs, so this skill only coordinates. A SOR is a recipe, not an agent: for a SOR hand-off this skill
55
+ runs the SOR's steps itself and owns the confirmation and read-back (see Audit Tracking below).
56
+ **Inline** features are run by this skill directly through the `headless-360` MCP server — **read the
57
+ matching reference file before executing that feature** and follow it. Every inline operation is fetched at
58
+ runtime: `discover` by intent, `describe` for the current route/schema/labels, then `dispatch_readonly`
59
+ (reads) / `dispatch` (writes). **Hardcode nothing — `describe` wins.**
60
+
61
+ **Audit Tracking is delegated to the Field History Tracking SOR.** This skill has no reference file for it
62
+ and re-derives none of its steps — the SOR's own steps and guidance decide *how*. This skill runs them and
63
+ owns the user-facing gates:
64
+
65
+ 1. `discover` the SOR by intent (e.g. "field history tracking") and `describe` the id `discover` returns
66
+ (`FieldHistoryTracking`). Judge availability by what the calls return, not by a step's `status` label —
67
+ a step labelled `proposed` may still be served. A `discover` miss or a `401`/`403`/`404` means the
68
+ surface isn't available to this user or org: surface it and stop.
69
+ 2. Use the Incident fields the user already named, or ask which fields to track if the choice is missing
70
+ or ambiguous, plus anything else `describe` says it needs. If the user chooses no fields, leave the
71
+ feature `Not done` and stop; do not treat an empty choice as already configured.
72
+ 3. Through the SOR, check Setup access, read Incident with `get-single-entity-data-with-metadata`, and get
73
+ its per-object tracked-field limit. Use the returned tracking flag, field labels, `canBeTracked` values,
74
+ current tracked set, and `fieldEnumOrId` keys to resolve the user's choices; do not guess field keys.
75
+ 4. The save replaces the object's whole tracked-field set, so send the **union** of what's already tracked
76
+ and the chosen fields using their returned keys, with Incident's object-level tracking flag on — never
77
+ drop an already-tracked field unless the user asks. If a chosen field can't be tracked, or the union
78
+ would exceed the limit, say so plainly; never untrack another field to make room. Report it as done
79
+ with no write only if the nonempty chosen set is already tracked **and** Incident's object-level tracking
80
+ is on. If the fields are selected but that flag is off, the change still needs a save.
81
+ 5. Show the exact final tracked-field list by field label (disambiguate matching labels) in either case.
82
+ Before any save, also show that object-level tracking will be enabled and get an explicit yes
83
+ (`AskUserQuestion`) for that plan; when the user already named the fields, this confirms the selection.
84
+ 6. After any save, read Incident's tracked fields back through the SOR. Mark the feature `Done` only when
85
+ the live read (for the no-write case) or post-save read-back shows Incident's object-level tracking on,
86
+ the chosen fields tracked, and no field dropped that the user didn't ask to drop — a save response alone
87
+ is not proof.
60
88
 
61
89
  ## Behavior
62
90
 
@@ -92,9 +120,11 @@ several enqueue for sequential handling in step 4.
92
120
  ### 4. Handle each selected feature in order
93
121
 
94
122
  Handle selected features sequentially in dependency order (or the order given). For each: if it is a
95
- **delegated** feature, invoke its child skill; if it is an **inline** feature, **read its reference file**
96
- and execute it there — always **read live state before writing, confirm before every write, and verify
97
- every write by read-back**. Honor the per-feature invariants below.
123
+ **delegated** feature, hand off to its child skill — or, for Audit Tracking, run the Field History Tracking
124
+ SOR through the six steps above; if it is an **inline** feature, **read its reference file** and execute it
125
+ there. Whenever this skill itself writes (inline, or a SOR hand-off), always **read live state before
126
+ writing, confirm before every write, and verify every write by read-back**. Honor the per-feature
127
+ invariants below.
98
128
 
99
129
  ### 5. After each feature completes
100
130
 
@@ -110,7 +140,8 @@ template in `examples/output-templates.md`.
110
140
 
111
141
  ## Critical inline-execution invariants (load-bearing — full detail in each reference)
112
142
 
113
- Apply these whenever an inline feature runs. They are irreversible or silently-wrong if missed.
143
+ Apply these whenever an inline feature runs; the **Everywhere** rules also apply to the Audit Tracking SOR
144
+ hand-off. They are irreversible or silently-wrong if missed.
114
145
 
115
146
  - **Resolve the right node (Preferences).** Target the ITSM Incident Management org-preferences node
116
147
  (controller `IPCManagementSetupController`), **not** the Service-Foundation look-alike
@@ -150,6 +181,7 @@ Apply these whenever an inline feature runs. They are irreversible or silently-w
150
181
  4. Major Incident Management (approval group + two MIM preferences) [inline]
151
182
  5. Incident Persona PSG (Fulfiller / Manager persona for a user) [inline]
152
183
  6. Service Management Privilege (escalation level + privilege assignments) [inline]
184
+ 7. Audit Tracking (field history on chosen Incident fields) [delegated]
153
185
  ```
154
186
 
155
187
  ---
@@ -166,6 +198,10 @@ Apply these whenever an inline feature runs. They are irreversible or silently-w
166
198
  response — the table is the visual view; the tool call is the selection channel
167
199
  - For an **inline** feature, ALWAYS read its reference file first and follow the SOR at runtime — never
168
200
  hardcode a route, body, or preference name
201
+ - For **Audit Tracking**, ALWAYS keep every already-tracked Incident field in the save unless the user asked
202
+ to stop tracking it, confirm the exact final field list before the save, and verify by read-back before
203
+ marking it `Done` (or verify the already-configured state by live read with no write) — the SOR asks the
204
+ user nothing itself
169
205
  - NEVER set up a feature the user did not select; for "set up everything", walk each feature sequentially
170
206
  in recommended order, confirming between each step
171
207
  - Track progress across the conversation — do not re-present completed features as "Not done"
@@ -187,7 +223,11 @@ Before emitting any menu or summary, confirm each; adjust the output before send
187
223
  sequentially with confirmation under an "all" / "everything" request)
188
224
  - [ ] For an inline feature: its reference file was read; live state was read before any write; each write
189
225
  was confirmed and verified by read-back; one-way / license-ordering invariants were honored
190
- - [ ] For a delegated feature: the child skill was invoked, not configured inline
226
+ - [ ] For a delegated feature: the child skill (or, for Audit Tracking, the Field History Tracking SOR) was
227
+ used, not configured inline
228
+ - [ ] For Audit Tracking: a live metadata read resolved the fields and complete labeled set; any save kept
229
+ every already-tracked field the user didn't ask to drop, was confirmed before it ran, and was verified
230
+ by read-back; a no-write `Done` also had Incident's object-level tracking confirmed on
191
231
  - [ ] No Salesforce record IDs appear in the output — human-readable names only
192
232
 
193
233
  ---
@@ -26,6 +26,8 @@ Here are the features available for Incident Management. Select one or more to c
26
26
  │ │ │ persona to a user (bundle + backing licenses) │ │
27
27
  │ 6 │ Service Management Privilege │ Escalation level, privilege records + employee │ Not done │
28
28
  │ │ │ assignments, behind Enable Privilege Assignment │ │
29
+ │ 7 │ Audit Tracking │ Turn on field history tracking for the Incident │ Not done │
30
+ │ │ │ fields you choose (who changed what, and when) │ │
29
31
  └───┴───────────────────────────────┴──────────────────────────────────────────────────┴──────────┘
30
32
 
31
33
  Reply with the numbers of the features you want to set up (one or more, e.g. `1,3`).
@@ -48,6 +50,7 @@ Incident Preferences — configured successfully
48
50
  │ 4 │ Major Incident Management │ Not done │
49
51
  │ 5 │ Incident Persona PSG │ Not done │
50
52
  │ 6 │ Service Management Privilege │ Not done │
53
+ │ 7 │ Audit Tracking │ Not done │
51
54
  └───┴───────────────────────────────┴──────────┘
52
55
 
53
56
  Say a number to configure the next feature, or `done` to finish.
@@ -66,7 +69,7 @@ finished — even if some features are still `Not done`. When rendering:
66
69
  - All `Done` → `Your Incident Management features are configured.`
67
70
  - Otherwise → `You have finished the features you selected. The remaining features can be resumed later by re-invoking this orchestrator.`
68
71
 
69
- Example — user finished with three features configured, three left:
72
+ Example — user finished with three features configured, four left:
70
73
 
71
74
  ```text
72
75
  Incident Management Setup — Finished
@@ -81,6 +84,7 @@ Incident Management Setup — Finished
81
84
  │ Major Incident Management │ Done │
82
85
  │ Incident Persona PSG │ Not done │
83
86
  │ Service Management Privilege │ Not done │
87
+ │ Audit Tracking │ Not done │
84
88
  └───────────────────────────────┴──────────┘
85
89
 
86
90
  You have finished the features you selected. The remaining features can be resumed later by re-invoking this orchestrator.
@@ -8,9 +8,9 @@ sets require. This runs **inline** through the Salesforce-hosted **`headless-360
8
8
  comes from the OAuth JWT on the MCP session — never handle an org id, alias, or credentials. Minimum API
9
9
  version **67.0**.
10
10
 
11
- ## Delegate to the systems of record
11
+ ## Delegate to the Setup Operation Recipes
12
12
 
13
- Every operation is delegated to a system of record (SOR) and its exact shape is fetched at runtime —
13
+ Every operation is delegated to a Setup Operation Recipe (SOR) and its exact shape is fetched at runtime —
14
14
  `discover` by intent, `describe` the SOR step for its **current** route, method, and argument schema, then
15
15
  `dispatch_readonly` (reads) / `dispatch` (writes). **Hardcode no routes, SOQL, or request bodies; use what
16
16
  `describe` returns, and if it disagrees with anything here, `describe` wins.** Discover by intent, not by
@@ -9,9 +9,9 @@ on the MCP session — never handle an org id, alias, or credentials. Minimum AP
9
9
  This is **not** the master Incident Management on/off switch (`service-itsm-incident-mgmt-configure`) nor
10
10
  the Incident Priority Matrix (`service-itsm-incident-priority-configure`).
11
11
 
12
- ## Delegate to the system of record
12
+ ## Delegate to the Setup Operation Recipe
13
13
 
14
- Every operation is delegated to a system of record (SOR) and its exact shape is fetched at runtime:
14
+ Every operation is delegated to a Setup Operation Recipe (SOR) and its exact shape is fetched at runtime:
15
15
  `discover` the operation by intent, `describe` the SOR for its **current** steps, routes, argument schema,
16
16
  the preference list, the on-screen labels, and its `agent_guidance`, then `dispatch_readonly` (reads) /
17
17
  `dispatch` (writes). **Hardcode no routes, preference names, labels, or request bodies — use what
@@ -7,12 +7,12 @@ preferences**. This runs **inline** through the Salesforce-hosted
7
7
  `dispatch_readonly`, `dispatch`). The org comes from the OAuth JWT on the MCP session — never handle an org
8
8
  id, alias, or credentials. Minimum API version **67.0**.
9
9
 
10
- ## Delegate every operation to the MIM system of record
10
+ ## Delegate every operation to the MIM Setup Operation Recipe
11
11
 
12
- The **Major Incident Management SOR** is the single source of truth for **how** each step is done — the
13
- route, method, request/response shape, field names, per-step `status`, and `depends_on` ordering. It is
14
- **actively evolving**, so **never hardcode a route or request body**. Carry only the **goal, scope,
15
- ordering, and invariants**, and at runtime:
12
+ The **Major Incident Management Setup Operation Recipe (SOR)** is the single source of truth for **how**
13
+ each step is done — the route, method, request/response shape, field names, per-step `status`, and
14
+ `depends_on` ordering. It is **actively evolving**, so **never hardcode a route or request body**. Carry
15
+ only the **goal, scope, ordering, and invariants**, and at runtime:
16
16
 
17
17
  1. `discover` the operation by intent (e.g. `"set major incident approval group"`, `"validate major
18
18
  incident approval group users"`, `"toggle major incident org preference"`).
@@ -8,12 +8,12 @@ behind the **Enable Privilege Assignment** master toggle. This runs **inline** t
8
8
  `dispatch_readonly`, `dispatch`). The org comes from the OAuth JWT on the MCP session — never handle an org
9
9
  id, alias, or credentials. Minimum API version **67.0**.
10
10
 
11
- ## Delegate every operation to the system of record
11
+ ## Delegate every operation to the Setup Operation Recipe
12
12
 
13
- The **Service Management Privilege setup SOR** is the single source of truth for **how** each step is done —
14
- the route, method, request/response shape, field names, per-step `status`, and `depends_on`. It is **draft
15
- and actively evolving**, so **never hardcode a route or request body**. Carry only the **goal, scope,
16
- ordering, and invariants**, and at runtime:
13
+ The **Service Management Privilege Setup Operation Recipe (SOR)** is the single source of truth for **how**
14
+ each step is done — the route, method, request/response shape, field names, per-step `status`, and
15
+ `depends_on`. It is **draft and actively evolving**, so **never hardcode a route or request body**. Carry
16
+ only the **goal, scope, ordering, and invariants**, and at runtime:
17
17
 
18
18
  1. `discover` the operation by intent (e.g. `"enable privilege assignment toggle"`, `"set ITSM escalation
19
19
  level"`, `"create a service management privilege"`, `"assign employees to a service privilege"`).