kushi-agents 4.2.3 → 4.4.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 (41) hide show
  1. package/.github/copilot-instructions.kushi.md +4 -2
  2. package/package.json +2 -4
  3. package/plugin/agents/kushi.agent.md +7 -4
  4. package/plugin/instructions/azure-auth-patterns.instructions.md +2 -2
  5. package/plugin/instructions/bootstrap-status-format.instructions.md +24 -0
  6. package/plugin/instructions/engagement-root-resolution.instructions.md +3 -3
  7. package/plugin/instructions/identity-resolution.instructions.md +4 -4
  8. package/plugin/instructions/multi-user-shared-files.instructions.md +87 -0
  9. package/plugin/instructions/run-reports.instructions.md +1 -1
  10. package/plugin/instructions/side-by-side-config.instructions.md +23 -17
  11. package/plugin/instructions/tracking.instructions.md +1 -1
  12. package/plugin/instructions/workiq-only.instructions.md +2 -2
  13. package/plugin/lib/Get-KushiConfig.ps1 +109 -0
  14. package/plugin/prompts/aggregate.prompt.md +15 -4
  15. package/plugin/prompts/apply-ado.prompt.md +14 -5
  16. package/plugin/prompts/ask.prompt.md +12 -2
  17. package/plugin/prompts/bootstrap.prompt.md +27 -3
  18. package/plugin/prompts/consolidate.prompt.md +12 -2
  19. package/plugin/prompts/fde-intake.prompt.md +14 -5
  20. package/plugin/prompts/fde-report.prompt.md +15 -5
  21. package/plugin/prompts/fde-triage.prompt.md +14 -5
  22. package/plugin/prompts/propose-ado.prompt.md +14 -5
  23. package/plugin/prompts/refresh.prompt.md +12 -2
  24. package/plugin/prompts/state.prompt.md +11 -2
  25. package/plugin/prompts/status.prompt.md +11 -2
  26. package/plugin/reference-packs/README.md +1 -1
  27. package/plugin/skills/ask-project/SKILL.md +1 -1
  28. package/plugin/skills/bootstrap-project/SKILL.md +8 -6
  29. package/plugin/skills/intro/SKILL.md +2 -2
  30. package/plugin/skills/propose-ado-update/SKILL.md +1 -1
  31. package/plugin/templates/init/azuredevops.template.json +159 -0
  32. package/plugin/templates/init/dynamics365.template.json +412 -0
  33. package/{.github/config/m365-mutable.json.example → plugin/templates/init/m365-mutable.example.json} +1 -1
  34. package/plugin/templates/init/rsi-program-catalog.template.json +107 -0
  35. package/src/config-loader.mjs +69 -0
  36. package/src/constants.mjs +54 -18
  37. package/src/copy-assets.mjs +0 -76
  38. package/src/main.mjs +30 -26
  39. package/src/seed-config.mjs +88 -23
  40. package/src/seed-config.test.mjs +150 -0
  41. /package/{.github/config/m365-auth.json.example → plugin/templates/init/m365-auth.example.json} +0 -0
@@ -1,8 +1,17 @@
1
- ---
2
- name: fde-intake
3
- description: Author or update the FDE Intake document — first artifact in an FDE engagement. Answers the 6 canonical FDE Intake questions, grounded in project Evidence + the FDE reference pack.
4
- ---
5
-
1
+ ---
2
+ name: fde-intake
3
+ description: "Author or update the FDE Intake document — first artifact in an FDE engagement. Answers the 6 canonical FDE Intake questions, grounded in project Evidence + the FDE reference pack."
4
+ argument-hint: "Project name; authors or updates FDE Intake at Reports/00-FDE-Intake-<project>.md"
5
+ agent: kushi
6
+ tools: [search, read/readFile, edit, agent]
7
+ ---
8
+
9
+ ## User Input
10
+
11
+ ```text
12
+ ${input:project:Project name, e.g. HCA}
13
+ ```
14
+
6
15
  # /fde-intake
7
16
 
8
17
  Route to `@Kushi fde-intake <project>`.
@@ -1,8 +1,18 @@
1
- ---
2
- name: fde-report
3
- description: Generate an FDE-shaped engagement report in one of five shapes (weekly default / short / long / fitness / stage-readiness), grounded in project Evidence + the FDE reference pack. Read-only; no outbound.
4
- ---
5
-
1
+ ---
2
+ name: fde-report
3
+ description: "Generate an FDE-shaped engagement report in one of five shapes (weekly default / short / long / fitness / stage-readiness), grounded in project Evidence + the FDE reference pack. Read-only; no outbound."
4
+ argument-hint: "Project name; optional shape (weekly|short|long|fitness|stage-readiness, default weekly)"
5
+ agent: kushi
6
+ tools: [search, read/readFile, edit, agent]
7
+ ---
8
+
9
+ ## User Input
10
+
11
+ ```text
12
+ ${input:project:Project name, e.g. HCA}
13
+ ${input:shape:Optional report shape — weekly (default), short, long, fitness, or stage-readiness}
14
+ ```
15
+
6
16
  # /fde-report
7
17
 
8
18
  Route to `@Kushi fde-report <project> [shape]`.
@@ -1,8 +1,17 @@
1
- ---
2
- name: fde-triage
3
- description: Produce the full FDE Triage bundle — 7 companion files (analysis, fitness, risk, 6Q, mobilization readiness, executive readout, global reuse, validation warnings) at <project>/Reports/triage/<YYYY-MM-DD>/.
4
- ---
5
-
1
+ ---
2
+ name: fde-triage
3
+ description: "Produce the full FDE Triage bundle — 7 companion files (analysis, fitness, risk, 6Q, mobilization readiness, executive readout, global reuse, validation warnings) at <project>/Reports/triage/<YYYY-MM-DD>/."
4
+ argument-hint: "Project name; produces 7-file triage bundle at Reports/triage/<YYYY-MM-DD>/"
5
+ agent: kushi
6
+ tools: [search, read/readFile, edit, agent]
7
+ ---
8
+
9
+ ## User Input
10
+
11
+ ```text
12
+ ${input:project:Project name, e.g. HCA}
13
+ ```
14
+
6
15
  # /fde-triage
7
16
 
8
17
  Route to `@Kushi fde-triage <project>`.
@@ -1,8 +1,17 @@
1
- ---
2
- name: propose-ado
3
- description: Read-only ADO update proposal — generate proposed.md from the latest consolidated evidence. NO writes to ADO.
4
- ---
5
-
1
+ ---
2
+ name: propose-ado
3
+ description: "Read-only ADO update proposal — generate proposed.md from the latest consolidated evidence. NO writes to ADO."
4
+ argument-hint: "Project name; read-only ADO proposal preview"
5
+ agent: kushi
6
+ tools: [search, read/readFile, edit, agent, execute/runInTerminal, 'github/*']
7
+ ---
8
+
9
+ ## User Input
10
+
11
+ ```text
12
+ ${input:project:Project name, e.g. HCA}
13
+ ```
14
+
6
15
  # /propose-ado
7
16
 
8
17
  Route to `@Kushi propose ado <project>`.
@@ -1,10 +1,20 @@
1
1
  ---
2
2
  name: refresh
3
- description: Incremental refresh — pull only what changed since the last run, then rebuild State.
3
+ description: "Incremental refresh — pull only what changed since the last run, then rebuild State."
4
+ argument-hint: "Project name; optional window (defaults to watermark since last run, else last 7 days)"
5
+ agent: kushi
6
+ tools: [search, read/readFile, edit, agent, execute/runInTerminal, execute/getTerminalOutput, 'workiq/*']
4
7
  ---
5
8
 
6
- # /refresh
9
+ ## User Input
10
+
11
+ ```text
12
+ ${input:project:Project name, e.g. HCA}
13
+ ${input:window:Optional window — last N days, since YYYY-MM-DD, or YYYY-MM-DD..YYYY-MM-DD (default: from last-run watermark)}
14
+ ```
7
15
 
16
+ # /refresh
17
+
8
18
  Route to `@Kushi refresh <project>`.
9
19
 
10
20
  Window resolution (per `refresh-project` skill):
@@ -1,10 +1,19 @@
1
1
  ---
2
2
  name: state
3
- description: Re-render State/ from existing Evidence — does NO source pulls.
3
+ description: "Re-render State/ from existing Evidence — does NO source pulls."
4
+ argument-hint: "Project name; rebuilds State/ from existing Evidence, no source pulls"
5
+ agent: kushi
6
+ tools: [search, read/readFile, edit, agent]
4
7
  ---
5
8
 
6
- # /state
9
+ ## User Input
10
+
11
+ ```text
12
+ ${input:project:Project name, e.g. HCA}
13
+ ```
7
14
 
15
+ # /state
16
+
8
17
  Route to `@Kushi state <project>`.
9
18
 
10
19
  Pure renderer. Reads:
@@ -1,10 +1,19 @@
1
1
  ---
2
2
  name: status
3
- description: Show run-log — what's been pulled, when, watermarks, recent errors.
3
+ description: "Show run-log — what's been pulled, when, watermarks, recent errors."
4
+ argument-hint: "Project name; shows run-log: last_pulled, watermarks, item counts, recent errors"
5
+ agent: kushi
6
+ tools: [search, read/readFile, edit, agent]
4
7
  ---
5
8
 
6
- # /status
9
+ ## User Input
10
+
11
+ ```text
12
+ ${input:project:Project name, e.g. HCA}
13
+ ```
7
14
 
15
+ # /status
16
+
8
17
  Route to `@Kushi status <project>`.
9
18
 
10
19
  Reads `<engagement-root>/<project>/Evidence/run-log.yml` and renders:
@@ -33,7 +33,7 @@ Skills must always:
33
33
  What does **not** go in a pack:
34
34
 
35
35
  - Per-engagement data (lives under `<project>/Evidence/`)
36
- - Per-user identity / configs (lives in `<workspace>/.kushi/config/project-evidence.yml`)
36
+ - Per-user identity / configs (lives in `<workspace>/.kushi/config/user/project-evidence.yml`)
37
37
  - Skill behavior (lives in `plugin/skills/<skill>/SKILL.md`)
38
38
  - Cross-cutting agent doctrine (lives in `plugin/instructions/*.instructions.md`)
39
39
 
@@ -40,7 +40,7 @@ In order, stop on first hit:
40
40
  1. Exact `<engagement-root>/<project>/Evidence/` folder.
41
41
  2. Fuzzy match against `discovery.project_aliases` in any `<engagement-root>/<project>/Evidence/<alias>/.settings.yml`.
42
42
  3. `<engagement-root>/<project>/external-context/` (lighter-weight projects without full bootstrap).
43
- 4. `<workspace>/.kushi/config/project-evidence.yml` `active_projects` list.
43
+ 4. `<workspace>/.kushi/config/user/project-evidence.yml` `active_projects` list.
44
44
 
45
45
  If zero matches → ask user. If multiple → list candidates and ask user to pick. **Echo the resolved root path before answering** so the user can confirm.
46
46
 
@@ -31,6 +31,8 @@ The active profile is read from `kushi-install.json#profile` next to this agent
31
31
 
32
32
  After every run (success or coverage-gaps), write `<project>/bootstrap-status.md` per the format contract in `instructions/bootstrap-status-format.instructions.md`. This is the project's fast-orientation artifact — required tables, normalized status vocabulary (`resolved`, `populated`, `unsynced`, `degraded-list-only`, `throttled-tooManyRequests`, `ado-not-complete`, `completed-with-coverage-gaps`), one-line final status. Do NOT inline run history here; that goes in `update-status.md`.
33
33
 
34
+ > **Multi-contributor safety (kushi v4.4.0+)**: this file is shared via OneDrive. Per `multi-user-shared-files.instructions.md`, every write MUST: (a) absorb sibling conflict copies, (b) preserve other aliases' rows in `## Contributors who have bootstrapped this project`, (c) cite the discovering alias in per-source rows. Same rules apply to `<project>/integrations.yml`, `<project>/OPEN-QUESTIONS-DRAFT.md`, `<project>/Evidence/run-log.yml`, `<project>/Evidence/contributors.yml`.
35
+
34
36
  ## Inputs
35
37
 
36
38
  - `<project>` — engagement name (fuzzy-matched per `engagement-root-resolution.instructions.md`).
@@ -41,7 +43,7 @@ After every run (success or coverage-gaps), write `<project>/bootstrap-status.md
41
43
 
42
44
  ### Step 0 — Identity resolution (REQUIRED, never asks the user)
43
45
 
44
- Per `identity-resolution.instructions.md`. Read `<workspace>/.kushi/config/project-evidence.yml`:
46
+ Per `identity-resolution.instructions.md`. Read `<workspace>/.kushi/config/user/project-evidence.yml`:
45
47
 
46
48
  * If `alias`, `email`, or `display_name` is missing / `<auto>` / matches a placeholder → call WorkIQ once:
47
49
  ```
@@ -49,7 +51,7 @@ Per `identity-resolution.instructions.md`. Read `<workspace>/.kushi/config/proje
49
51
  ```
50
52
  Map `upn → email`, `displayName → display_name`, `mailNickname → alias` (fallback `email.split('@')[0]`).
51
53
  * Persist resolved values back to the YAML (preserve comments).
52
- * Echo one line: `✓ Identity: <displayName> <<UPN>> (alias=<alias>). Edit .kushi/config/project-evidence.yml to override.`
54
+ * Echo one line: `✓ Identity: <displayName> <<UPN>> (alias=<alias>). Edit .kushi/config/user/project-evidence.yml to override.`
53
55
  * If all three are already explicit non-placeholder values → skip silently.
54
56
 
55
57
  Hard stop if WorkIQ returns auth error or empty — print the WorkIQ sign-in hint and exit. Never fall back to asking the user.
@@ -59,13 +61,13 @@ Hard stop if WorkIQ returns auth error or empty — print the WorkIQ sign-in hin
59
61
  Verify in order. Stop on hard failures.
60
62
 
61
63
  1. **OS + host runtime** — display OS + Node/PowerShell version. Informational.
62
- 2. **WorkIQ install (REQUIRED, hard stop)** — read `<workspace>/.kushi/config/project-evidence.yml workiq.cli_path`. If missing, probe known paths:
64
+ 2. **WorkIQ install (REQUIRED, hard stop)** — read `<workspace>/.kushi/config/user/project-evidence.yml workiq.cli_path`. If missing, probe known paths:
63
65
  - `$HOME\.kushi\bin\workiq.cmd`
64
66
  - `$env:LOCALAPPDATA\Programs\WorkIQ\workiq.cmd`
65
67
  - `$env:ProgramFiles\WorkIQ\workiq.cmd`
66
68
  If found, persist path. If not found, ask user for path (or to install). Test with `<workiq.cli_path> --help`. Without WorkIQ, M365 sources will all fail — STOP.
67
69
  3. **Conditional az login** — only if `<engagement-root>/.project-evidence/crm/config.yml` OR `<engagement-root>/.project-evidence/ado/config.yml` exists. Per `az-auth-conditional.instructions.md`. Soft warning on failure, never blocking.
68
- 4. **Engagement-root resolution** — per `engagement-root-resolution.instructions.md`. Persist to `<workspace>/.kushi/config/project-evidence.yml engagement_root` if newly resolved.
70
+ 4. **Engagement-root resolution** — per `engagement-root-resolution.instructions.md`. Persist to `<workspace>/.kushi/config/user/project-evidence.yml engagement_root` if newly resolved.
69
71
 
70
72
  Display SETUP summary table with ✅ / ⚙️ / ❌ / ⚠️ / ➖ markers.
71
73
 
@@ -77,8 +79,8 @@ Required live files:
77
79
 
78
80
  | Live file | Template source |
79
81
  |---|---|
80
- | `<workspace>/.kushi/config/project-evidence.yml` | `templates/init/project-evidence.template.yml` (seeded by installer) |
81
- | `<workspace>/.kushi/config/integrations.yml` | `templates/init/integrations.template.yml` (seeded by installer) |
82
+ | `<workspace>/.kushi/config/user/project-evidence.yml` | `templates/init/project-evidence.template.yml` (seeded by installer) |
83
+ | `<workspace>/.kushi/config/shared/integrations.yml` | `templates/init/integrations.template.yml` (seeded by installer) |
82
84
  | `<engagement-root>/.project-evidence/m365/m365-auth.json` | `templates/init/m365-auth.template.json` |
83
85
  | `<engagement-root>/.project-evidence/m365/m365-mutable.json` | `templates/init/m365-mutable.template.json` |
84
86
  | `<engagement-root>/<project>/integrations.yml` | `templates/init/project-integrations.template.yml` |
@@ -138,7 +138,7 @@ Present this verbatim:
138
138
 
139
139
  Before opening, check whether any project is already bootstrapped:
140
140
 
141
- 1. Read `<workspace>/.kushi/config/project-evidence.yml` (personal config). If `active_projects` has entries, pick the most recent as the demo target — substitute that name into `{{active_project}}` placeholders below.
141
+ 1. Read `<workspace>/.kushi/config/user/project-evidence.yml` (personal config). If `active_projects` has entries, pick the most recent as the demo target — substitute that name into `{{active_project}}` placeholders below.
142
142
  2. If none, propose a fictional project named **Contoso Discovery** and tell the user that Try-it prompts will use that name; they can substitute their own at any time.
143
143
 
144
144
  ### Navigation Keywords
@@ -444,6 +444,6 @@ Reply `next` to see the closing cheat sheet, or `done` to exit.
444
444
  - Rule 1.2: Mode selection must always present BOTH options — never auto-route to one mode.
445
445
  - Rule 1.3: In walkthrough mode, each moment must wait for `next` / `skip` / `done` / `try` before advancing — never auto-advance.
446
446
  - Rule 1.4: `done` must work at every moment — never trap the user.
447
- - Rule 1.5: Try-it prompts must use the active project name from `<workspace>/.kushi/config/project-evidence.yml`, OR the placeholder `Contoso Discovery` if no projects are configured. Never invent a real-sounding project name.
447
+ - Rule 1.5: Try-it prompts must use the active project name from `<workspace>/.kushi/config/user/project-evidence.yml`, OR the placeholder `Contoso Discovery` if no projects are configured. Never invent a real-sounding project name.
448
448
  - Rule 1.6: Skill descriptions in this file must match `kushi.agent.md` and the live `SKILL.md` files — `self-check` D-checks catch drift.
449
449
  - Rule 1.7: Demo moments must reflect the actual verb count in `kushi.agent.md`. If a verb is added or removed, this file must be updated in the same commit (`self-check` warns on drift).
@@ -27,7 +27,7 @@ This skill does **NOT** create a new top-level config file. It reads from the co
27
27
 
28
28
  **Resolution is fully deterministic** — never ask the user for paths the bootstrap layer already resolved:
29
29
 
30
- 1. `<engagement-root>` ← `<workspace>/.kushi/config/project-evidence.yml engagement_root` (per `engagement-root-resolution.instructions.md`).
30
+ 1. `<engagement-root>` ← `<workspace>/.kushi/config/user/project-evidence.yml engagement_root` (per `engagement-root-resolution.instructions.md`).
31
31
  2. `<project>` folder ← fuzzy-match per `engagement-root-resolution.instructions.md` (knownSections → active_projects → subfolders).
32
32
  3. `<project>/integrations.yml ado.engagement_id` — REQUIRED. If `0` or missing → see "Prerequisites" below; never invent an ID.
33
33
  4. `<project>/integrations.yml ado.writes` — if missing, append the block from `<KUSHI_ROOT>/plugin/templates/ado-update/integrations-ado-writes.example.yml` and stop for user confirmation of `fieldRefName`.
@@ -0,0 +1,159 @@
1
+ {
2
+ "azureDevOps": {
3
+ "organizationUrl": "https://dev.azure.com/IndustrySolutions",
4
+ "project": "IS Engagements",
5
+ "apiVersion": "7.1",
6
+ "resource": "499b84ac-1321-427f-aa17-267ca6975798",
7
+ "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
8
+ "allowedTenantIds": [
9
+ "72f988bf-86f1-41af-91ab-2d7cd011db47"
10
+ ],
11
+ "workItemTypes": {
12
+ "engagement": "Engagement",
13
+ "activity": "Activity"
14
+ },
15
+ "queryTemplates": {
16
+ "engagementByExactTitle": "SELECT [System.Id], [System.Title], [System.State], [System.ChangedDate] FROM WorkItems WHERE [System.TeamProject] = '@project' AND [System.WorkItemType] = '@engagementType' AND [System.Title] = '@title' ORDER BY [System.ChangedDate] DESC",
17
+ "engagementByPartialTitle": "SELECT [System.Id], [System.Title], [System.State], [System.ChangedDate] FROM WorkItems WHERE [System.TeamProject] = '@project' AND [System.WorkItemType] = '@engagementType' AND [System.Title] CONTAINS '@titlePart' ORDER BY [System.ChangedDate] DESC",
18
+ "activityByParentEngagementId": "SELECT [System.Id], [System.Title], [System.State], [System.ChangedDate] FROM WorkItems WHERE [System.TeamProject] = '@project' AND [System.WorkItemType] = '@activityType' AND [System.Parent] = @engagementId ORDER BY [System.ChangedDate] DESC"
19
+ },
20
+ "fieldMappings": {
21
+ "common": {
22
+ "id": "System.Id",
23
+ "title": "System.Title",
24
+ "state": "System.State",
25
+ "assignedTo": "System.AssignedTo",
26
+ "tags": "System.Tags",
27
+ "changedDate": "System.ChangedDate",
28
+ "parent": "System.Parent",
29
+ "historyWrite": "System.History"
30
+ },
31
+ "activity": {
32
+ "activityType": "Custom.activity_type",
33
+ "goal": "Custom.activity_goal",
34
+ "successCriteria": "Custom.activity_successcriteria",
35
+ "startDate": "Custom.activity_startdate",
36
+ "endDate": "Custom.activity_enddate",
37
+ "rrStatus": "Custom.activity_rr_status",
38
+ "rr1Type": "Custom.activity_rr1_type",
39
+ "assignedResource1": "Custom.AssignedResource1",
40
+ "rrStartDate1": "Custom.RRStartDate1",
41
+ "rrEndDate1": "Custom.RREndDate1",
42
+ "rr2Type": "Custom.activity_rr2_type",
43
+ "assignedResource2": "Custom.AssignedResource2",
44
+ "rrStartDate2": "Custom.RRStartDate2",
45
+ "rrEndDate2": "Custom.RREndDate2",
46
+ "country": "Custom.Country"
47
+ },
48
+ "engagement": {
49
+ "_comment_status": "Confirm exact engagement status field reference name",
50
+ "status": "System.State",
51
+ "_comment_customer": "Confirm exact customer/account field reference name",
52
+ "customer": "",
53
+ "_comment_primaryLead": "Confirm exact engagement owner/lead field reference name",
54
+ "primaryLead": "System.AssignedTo",
55
+ "_comment_joinKeyIsCrmOpportunityGuid": "Confirm this field exists in this process template",
56
+ "isCrmId": "Custom.ISCRMID",
57
+ "_comment_msxOpportunityId": "Optional if available in your process template",
58
+ "msxOpportunityId": "Custom.MSXOpportunityID"
59
+ },
60
+ "discussion": {
61
+ "_comment_historyRead": "History is available as revisions; confirm whether dedicated comments API should be the primary read path",
62
+ "historyWrite": "System.History",
63
+ "useCommentsApiRead": true,
64
+ "useCommentsApiWrite": false
65
+ }
66
+ },
67
+ "joinMapping": {
68
+ "crmToAdo": {
69
+ "primary": "Custom.ISCRMID",
70
+ "secondary": "System.Title"
71
+ }
72
+ },
73
+ "activity": {
74
+ "activityTypeField": "Custom.activity_type",
75
+ "advisoryValue": "Advisory",
76
+ "defaultState": "02 Active",
77
+ "defaultTags": "#FDE; #recon"
78
+ },
79
+ "queries": {
80
+ "maxSearchResults": 10,
81
+ "partialMatchEnabled": true,
82
+ "partialMatchMinScore": 0.6,
83
+ "searchFields": [
84
+ "System.Title",
85
+ "System.Tags"
86
+ ],
87
+ "defaultOrderBy": "[System.ChangedDate] DESC"
88
+ },
89
+ "linking": {
90
+ "preferredModel": "System.Parent",
91
+ "fallbackAllowed": false,
92
+ "allowPartialMatchSelection": true,
93
+ "candidateLimit": 5
94
+ },
95
+ "discussion": {
96
+ "mode": "history",
97
+ "sourceOfTruthForTranscriptUpdates": true,
98
+ "writeTarget": "pending-decision",
99
+ "contextReadSources": [
100
+ "engagement",
101
+ "activity",
102
+ "allChildren"
103
+ ],
104
+ "includeTranscriptSource": true,
105
+ "maxEntryChars": 8000,
106
+ "dedupe": {
107
+ "enabled": true,
108
+ "keyPattern": "meetingDate|transcriptId",
109
+ "includeWorkItemId": true
110
+ },
111
+ "template": {
112
+ "header": "Meeting Update",
113
+ "sections": [
114
+ "MeetingDate",
115
+ "Participants",
116
+ "Summary",
117
+ "Decisions",
118
+ "Actions",
119
+ "Risks",
120
+ "TranscriptSource"
121
+ ]
122
+ }
123
+ },
124
+ "contextRead": {
125
+ "dualSource": true,
126
+ "preferAdoDiscussion": true,
127
+ "includeCrmDuringMigration": true,
128
+ "childWorkItemDiscovery": {
129
+ "enabled": true,
130
+ "includeAllChildren": true,
131
+ "includeChildDiscussions": true,
132
+ "preferredChildTypeForExecution": "Activity",
133
+ "preferredActivityTypeValue": "Advisory"
134
+ },
135
+ "precedence": [
136
+ "ado.engagement.discussion",
137
+ "ado.children.discussion",
138
+ "ado.activity.discussion",
139
+ "ado.engagement",
140
+ "ado.children",
141
+ "ado.activities",
142
+ "crm.profile",
143
+ "crm.notes",
144
+ "transcript.unposted",
145
+ "external.docs"
146
+ ]
147
+ },
148
+ "validation": {
149
+ "requireExplicitSelectionOnAmbiguousMatch": true,
150
+ "requiredFieldsOnCreate": [
151
+ "System.Title",
152
+ "Custom.activity_type"
153
+ ],
154
+ "requiredFieldsOnLink": [
155
+ "System.Parent"
156
+ ]
157
+ }
158
+ }
159
+ }