kushi-agents 4.3.0 → 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 (29) hide show
  1. package/package.json +2 -4
  2. package/plugin/agents/kushi.agent.md +2 -2
  3. package/plugin/instructions/azure-auth-patterns.instructions.md +2 -2
  4. package/plugin/instructions/bootstrap-status-format.instructions.md +24 -0
  5. package/plugin/instructions/engagement-root-resolution.instructions.md +3 -3
  6. package/plugin/instructions/identity-resolution.instructions.md +4 -4
  7. package/plugin/instructions/multi-user-shared-files.instructions.md +87 -0
  8. package/plugin/instructions/run-reports.instructions.md +1 -1
  9. package/plugin/instructions/side-by-side-config.instructions.md +23 -17
  10. package/plugin/instructions/tracking.instructions.md +1 -1
  11. package/plugin/instructions/workiq-only.instructions.md +2 -2
  12. package/plugin/lib/Get-KushiConfig.ps1 +109 -0
  13. package/plugin/prompts/bootstrap.prompt.md +15 -1
  14. package/plugin/reference-packs/README.md +1 -1
  15. package/plugin/skills/ask-project/SKILL.md +1 -1
  16. package/plugin/skills/bootstrap-project/SKILL.md +8 -6
  17. package/plugin/skills/intro/SKILL.md +2 -2
  18. package/plugin/skills/propose-ado-update/SKILL.md +1 -1
  19. package/plugin/templates/init/azuredevops.template.json +159 -0
  20. package/plugin/templates/init/dynamics365.template.json +412 -0
  21. package/{.github/config/m365-mutable.json.example → plugin/templates/init/m365-mutable.example.json} +1 -1
  22. package/plugin/templates/init/rsi-program-catalog.template.json +107 -0
  23. package/src/config-loader.mjs +69 -0
  24. package/src/constants.mjs +54 -18
  25. package/src/copy-assets.mjs +0 -76
  26. package/src/main.mjs +30 -26
  27. package/src/seed-config.mjs +88 -23
  28. package/src/seed-config.test.mjs +150 -0
  29. /package/{.github/config/m365-auth.json.example → plugin/templates/init/m365-auth.example.json} +0 -0
@@ -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
+ }
@@ -0,0 +1,412 @@
1
+ {
2
+ "dynamics365": {
3
+ "baseUrl": "https://iscrm.crm.dynamics.com",
4
+ "entityType": "new_frontierengineeringtriage",
5
+ "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
6
+ "apiVersion": "v9.2",
7
+ "primaryIdAttribute": "new_frontierengineeringtriageid",
8
+ "primaryNameAttribute": "new_title",
9
+ "requestIdAttribute": "new_requestid",
10
+ "customerLookupAttribute": "_new_customer_value",
11
+ "defaultListUrl": "https://iscrm.crm.dynamics.com/main.aspx?appid=833534b8-5db0-4036-a029-4e4e4d7d4315&pagetype=entitylist&etn=new_frontierengineeringtriage&viewid=8d479be6-6561-4f88-8124-64d01647fa12&viewType=1039",
12
+ "allRecordsListUrl": "https://iscrm.crm.dynamics.com/main.aspx?appid=833534b8-5db0-4036-a029-4e4e4d7d4315&pagetype=entitylist&etn=new_frontierengineeringtriage&viewid=f437384f-0622-f111-88b1-00224803a273&viewType=4230",
13
+ "note_defaultListHasFilters": "defaultListUrl may show only active records. Always use Dataverse API with no statecode filter for record resolution to include inactive/withdrawn/closed records.",
14
+ "profileFieldMap": {
15
+ "title": "new_title",
16
+ "businessScenarioTechnicalBlocker": "new_businessscenariotechnicalblocker",
17
+ "technicalLandscape": "new_technicallandscape",
18
+ "workCompletedSoFar": "new_workcompletedsofar",
19
+ "successCriteria": "new_successcriteria",
20
+ "engagedWith": "new_engagedwith",
21
+ "currentSolutionsNotSuitable": "new_currentsolutionsnotsuitableforneeds",
22
+ "requestId": "new_requestid",
23
+ "submittedOn": "new_submittedon",
24
+ "createdOn": "createdon",
25
+ "modifiedOn": "modifiedon",
26
+ "industry": "new_industryalignment",
27
+ "offerSelected": "new_selectedoffer",
28
+ "ecifStatus": "new_ecifstatus",
29
+ "primaryTeamLeadLookup": "_new_fdelead_value",
30
+ "secondaryTeamLeadLookup": "_new_secondaryteamlead_value",
31
+ "serviceDeliveryLeadLookup": "_new_servicedeliverylead_value",
32
+ "preferredContactLookup": "_new_preferredcontact_value",
33
+ "submitterLookup": "_new_submitternew_value",
34
+ "customerLookup": "_new_customer_value",
35
+ "stateCode": "statecode",
36
+ "statusCode": "statuscode"
37
+ },
38
+ "crmSchema": {
39
+ "entity": {
40
+ "name": "new_frontierengineeringtriage",
41
+ "displayName": "Frontier Engineering Triage",
42
+ "description": "Customer engagement records tracking frontier technology initiatives"
43
+ },
44
+ "primaryFields": [
45
+ {
46
+ "crmField": "new_requestid",
47
+ "displayName": "Record Name/ID",
48
+ "type": "text",
49
+ "searchable": true,
50
+ "description": "Unique request identifier for the engagement record"
51
+ },
52
+ {
53
+ "crmField": "_new_customer_value",
54
+ "displayName": "Customer/Company",
55
+ "type": "lookup",
56
+ "targetEntity": "account",
57
+ "searchable": true,
58
+ "keywords": ["customer", "company", "account", "organization"],
59
+ "description": "Customer account lookup; use the formatted value for the display name when available"
60
+ },
61
+ {
62
+ "crmField": "_new_fdelead_value",
63
+ "displayName": "Primary Team Lead",
64
+ "type": "lookup",
65
+ "targetEntity": "systemuser",
66
+ "searchable": true,
67
+ "keywords": ["primary lead", "primary", "lead", "is primary", "primary for"],
68
+ "description": "Primary Microsoft account executive leading the engagement"
69
+ },
70
+ {
71
+ "crmField": "_new_secondaryteamlead_value",
72
+ "displayName": "Secondary Team Lead",
73
+ "type": "lookup",
74
+ "targetEntity": "systemuser",
75
+ "searchable": true,
76
+ "keywords": ["secondary lead", "secondary", "is secondary", "secondary for"],
77
+ "description": "Secondary lead supporting the primary"
78
+ },
79
+ {
80
+ "crmField": "_new_servicedeliverylead_value",
81
+ "displayName": "Service Delivery Lead",
82
+ "type": "lookup",
83
+ "targetEntity": "systemuser",
84
+ "searchable": true,
85
+ "keywords": ["service delivery lead", "service delivery", "delivery lead"],
86
+ "description": "Lead responsible for service delivery execution"
87
+ },
88
+ {
89
+ "crmField": "new_assignedteam",
90
+ "displayName": "Assigned Team",
91
+ "type": "text",
92
+ "searchable": true,
93
+ "description": "Team assigned to the engagement"
94
+ },
95
+ {
96
+ "crmField": "statuscode",
97
+ "displayName": "Status",
98
+ "type": "optionset",
99
+ "values": ["Active", "On Hold", "Completed", "Lost", "Discovered", "Pending Approval"],
100
+ "searchable": true,
101
+ "keywords": ["status", "statuses", "stage", "stages", "phase", "phases", "new", "intake review", "triage", "tech assessment", "is", "are"],
102
+ "description": "Current engagement status"
103
+ },
104
+ {
105
+ "crmField": "statecode",
106
+ "displayName": "State",
107
+ "type": "optionset",
108
+ "values": ["Active", "Inactive"],
109
+ "searchable": false,
110
+ "description": "Active/Inactive state (0=Active, 1=Inactive)"
111
+ },
112
+ {
113
+ "crmField": "new_selectedoffer",
114
+ "displayName": "Selected Service/Offer",
115
+ "type": "text",
116
+ "searchable": true,
117
+ "keywords": ["offer", "offering", "service", "service offering"],
118
+ "description": "Selected Microsoft service offering (e.g., CopilotPro, Copilot for Microsoft 365)"
119
+ },
120
+ {
121
+ "crmField": "new_deliverytype",
122
+ "displayName": "Delivery Type",
123
+ "type": "text",
124
+ "searchable": true,
125
+ "keywords": ["delivery type", "delivery"],
126
+ "description": "Type of delivery engagement"
127
+ },
128
+ {
129
+ "crmField": "new_industryalignment",
130
+ "displayName": "Industry Alignment",
131
+ "type": "text",
132
+ "searchable": true,
133
+ "keywords": ["industry", "vertical"],
134
+ "description": "Industry vertical alignment"
135
+ },
136
+ {
137
+ "crmField": "new_regionalignment",
138
+ "displayName": "Region Alignment",
139
+ "type": "text",
140
+ "searchable": true,
141
+ "keywords": ["region", "geography", "geographical"],
142
+ "description": "Geographic region for the engagement"
143
+ }
144
+ ],
145
+ "detailFields": [
146
+ {
147
+ "crmField": "new_customerexecutivesponsor",
148
+ "displayName": "Customer Executive Sponsor",
149
+ "type": "text",
150
+ "description": "Customer-side executive sponsor"
151
+ },
152
+ {
153
+ "crmField": "new_customerexecutivesponsortitle",
154
+ "displayName": "Customer Executive Sponsor Title",
155
+ "type": "text",
156
+ "description": "Title of the customer executive sponsor"
157
+ },
158
+ {
159
+ "crmField": "_new_preferredcontact_value",
160
+ "displayName": "Preferred Contact",
161
+ "type": "lookup",
162
+ "targetEntity": "contact",
163
+ "description": "Preferred customer contact person"
164
+ },
165
+ {
166
+ "crmField": "new_engagedwith",
167
+ "displayName": "Engaged With",
168
+ "type": "text",
169
+ "description": "Internal teams/people engaged on this opportunity"
170
+ },
171
+ {
172
+ "crmField": "new_businessscenariotechnicalblocker",
173
+ "displayName": "Business Scenario/Technical Blocker",
174
+ "type": "text",
175
+ "description": "Description of business scenario or technical challenges"
176
+ },
177
+ {
178
+ "crmField": "new_currentsolutionsnotsuitableforneeds",
179
+ "displayName": "Current Solutions Not Suitable",
180
+ "type": "text",
181
+ "description": "Why current solutions don't meet customer needs"
182
+ },
183
+ {
184
+ "crmField": "new_technicallandscape",
185
+ "displayName": "Technical Landscape",
186
+ "type": "text",
187
+ "description": "Summary of customer's current technical environment"
188
+ },
189
+ {
190
+ "crmField": "new_workcompletedsofar",
191
+ "displayName": "Work Completed So Far",
192
+ "type": "text",
193
+ "description": "Progress/work completed in this engagement"
194
+ },
195
+ {
196
+ "crmField": "new_successcriteria",
197
+ "displayName": "Success Criteria",
198
+ "type": "text",
199
+ "description": "Customer-defined success criteria for the engagement"
200
+ },
201
+ {
202
+ "crmField": "new_customergotoproductionplan",
203
+ "displayName": "Customer Go-To-Production Plan",
204
+ "type": "text",
205
+ "description": "Plan for moving to production"
206
+ },
207
+ {
208
+ "crmField": "new_customerdevelopmentteamready",
209
+ "displayName": "Customer Development Team Ready",
210
+ "type": "optionset",
211
+ "values": ["Yes", "No", "Partially Ready"],
212
+ "description": "Is customer's development team ready"
213
+ },
214
+ {
215
+ "crmField": "new_isfdeinvolvementneeded",
216
+ "displayName": "FDE Involvement Needed",
217
+ "type": "optionset",
218
+ "values": ["Yes", "No", "TBD"],
219
+ "description": "Whether Frontier Data Engineering involvement is needed"
220
+ },
221
+ {
222
+ "crmField": "new_followupscopingcall",
223
+ "displayName": "Follow-up Scoping Call",
224
+ "type": "optionset",
225
+ "values": ["Yes", "No", "Scheduled"],
226
+ "description": "Whether a follow-up scoping call is needed"
227
+ }
228
+ ],
229
+ "systemFields": [
230
+ {
231
+ "crmField": "createdby",
232
+ "displayName": "Created By",
233
+ "type": "lookup",
234
+ "targetEntity": "systemuser",
235
+ "description": "User who created the record"
236
+ },
237
+ {
238
+ "crmField": "createdon",
239
+ "displayName": "Created On",
240
+ "type": "datetime",
241
+ "description": "Date and time record was created"
242
+ },
243
+ {
244
+ "crmField": "modifiedby",
245
+ "displayName": "Modified By",
246
+ "type": "lookup",
247
+ "targetEntity": "systemuser",
248
+ "description": "User who last modified the record"
249
+ },
250
+ {
251
+ "crmField": "modifiedon",
252
+ "displayName": "Modified On",
253
+ "type": "datetime",
254
+ "description": "Date and time record was last modified"
255
+ },
256
+ {
257
+ "crmField": "new_submittedon",
258
+ "displayName": "Submitted On",
259
+ "type": "datetime",
260
+ "description": "When the engagement was initially submitted"
261
+ },
262
+ {
263
+ "crmField": "new_laststatuschangedate",
264
+ "displayName": "Last Status Change Date",
265
+ "type": "datetime",
266
+ "description": "When the status was last changed"
267
+ }
268
+ ],
269
+ "fieldMappings": {
270
+ "statuscode": {
271
+ "prop": "status",
272
+ "label": "Status",
273
+ "keywords": ["status", "statuses", "stage", "stages", "phase", "phases", "intake review", "triage", "tech assessment"]
274
+ },
275
+ "new_industryalignment": {
276
+ "prop": "industryAlignment",
277
+ "label": "Industry Alignment",
278
+ "keywords": ["industry", "vertical"]
279
+ },
280
+ "new_regionalignment": {
281
+ "prop": "regionAlignment",
282
+ "label": "Region Alignment",
283
+ "keywords": ["region", "geography", "geographical"]
284
+ },
285
+ "new_selectedoffer": {
286
+ "prop": "selectedOffer",
287
+ "label": "Selected Offer",
288
+ "keywords": ["offer", "offering", "service offer"]
289
+ },
290
+ "new_deliverytype": {
291
+ "prop": "deliveryType",
292
+ "label": "Delivery Type",
293
+ "keywords": ["delivery", "delivery type"]
294
+ },
295
+ "new_assignedteam": {
296
+ "prop": "assignedTeam",
297
+ "label": "Assigned Team",
298
+ "keywords": ["assigned team", "team"]
299
+ },
300
+ "_new_fdelead_value": {
301
+ "prop": "primaryTeamLead",
302
+ "label": "Primary Team Lead",
303
+ "keywords": ["primary lead", "primary team lead"]
304
+ },
305
+ "_new_secondaryteamlead_value": {
306
+ "prop": "secondaryTeamLead",
307
+ "label": "Secondary Team Lead",
308
+ "keywords": ["secondary lead", "secondary team lead"]
309
+ },
310
+ "_new_servicedeliverylead_value": {
311
+ "prop": "serviceDeliveryLead",
312
+ "label": "Service Delivery Lead",
313
+ "keywords": ["service delivery lead", "service lead"]
314
+ },
315
+ "isPrioritized": {
316
+ "prop": "isPrioritized",
317
+ "label": "FY26 Prioritized",
318
+ "keywords": ["prioritized", "priority", "fy26", "prioritization", "prioritised", "high priority", "strategic"]
319
+ },
320
+ "priorityIndustry": {
321
+ "prop": "priorityIndustry",
322
+ "label": "Priority Industry",
323
+ "keywords": []
324
+ },
325
+ "priorityRegion": {
326
+ "prop": "priorityRegion",
327
+ "label": "Priority Region",
328
+ "keywords": []
329
+ }
330
+ },
331
+ "intentPatterns": {
332
+ "count_records": {
333
+ "runtimeIntent": "ai",
334
+ "keywords": ["how many", "count", "total", "number of"],
335
+ "description": "User wants a count of records matching criteria"
336
+ },
337
+ "status_by_person": {
338
+ "runtimeIntent": "status_by_person",
339
+ "keywords": ["working on", "managing", "leading", "assigned to", "responsible for"],
340
+ "personField": "_new_fdelead_value|_new_secondaryteamlead_value|_new_servicedeliverylead_value",
341
+ "description": "User wants to know what a person is working on or their engagement count"
342
+ },
343
+ "engagement_details": {
344
+ "runtimeIntent": "ai",
345
+ "keywords": ["tell me about", "details on", "information about", "what is the", "describe"],
346
+ "description": "User wants detailed information about specific engagement(s)"
347
+ },
348
+ "engagement_by_lead": {
349
+ "runtimeIntent": "engagement_by_lead",
350
+ "keywords": ["who is", "who's", "who leads", "who is leading", "which lead"],
351
+ "description": "User wants to know who is leading an engagement"
352
+ },
353
+ "notes_today": {
354
+ "runtimeIntent": "notes_today",
355
+ "keywords": ["notes today", "added today", "update today", "notes added"],
356
+ "description": "User wants to see recent notes added today"
357
+ },
358
+ "customer_summary": {
359
+ "runtimeIntent": "customer_summary",
360
+ "keywords": ["customer", "company", "use case", "account"],
361
+ "description": "User wants summary of customer engagement information"
362
+ },
363
+ "ai_fallback": {
364
+ "runtimeIntent": "ai",
365
+ "description": "Question requires AI reasoning beyond structured queries"
366
+ },
367
+ "count_by_field": {
368
+ "runtimeIntent": "count_by_field",
369
+ "keywords": ["by industry", "by region", "by offer", "by delivery", "by status", "by stage", "in each", "per industry", "per region", "how many in", "how many by", "stage 1", "stage 2", "stage 3", "stage 4", "stages 1,2,3,4", "new", "intake review", "triage", "tech assessment"],
370
+ "description": "User wants a count grouped by a specific field (industry, region, offer, delivery type) or filtered to a specific field value such as 'how many in healthcare' or 'count by industry'"
371
+ }
372
+ },
373
+ "deterministicRouting": {
374
+ "rules": [
375
+ {
376
+ "priority": 10,
377
+ "intent": "record_count_with_top_primary_lead",
378
+ "allKeywords": ["primary lead|primary team lead"],
379
+ "anyKeywords": ["in total", "total", "how many records", "record count"],
380
+ "anyAlsoRequired": ["most", "top"],
381
+ "groupByField": "_new_fdelead_value",
382
+ "aggregate": "count"
383
+ },
384
+ {
385
+ "priority": 20,
386
+ "intent": "top_primary_leads",
387
+ "allKeywords": ["primary lead|primary team lead"],
388
+ "anyKeywords": ["top", "most", "each", "working on", "engagements", "how many", "number", "count"],
389
+ "groupByField": "_new_fdelead_value",
390
+ "aggregate": "count"
391
+ },
392
+ {
393
+ "priority": 5,
394
+ "intent": "count_by_field",
395
+ "anyKeywords": ["prioritized", "priority", "fy26", "prioritisation", "prioritised"],
396
+ "groupByField": "isPrioritized"
397
+ },
398
+ {
399
+ "priority": 30,
400
+ "intent": "status_table_by_person",
401
+ "allKeywords": ["status"],
402
+ "anyKeywords": ["table", "breakdown", "matrix", "group by", "by"],
403
+ "anyAlsoRequired": ["count", "number", "how many"],
404
+ "groupByField": "_new_fdelead_value",
405
+ "secondaryGroupByField": "statuscode",
406
+ "aggregate": "count"
407
+ }
408
+ ]
409
+ }
410
+ }
411
+ }
412
+ }
@@ -2,7 +2,7 @@
2
2
  "m365Mutable": {
3
3
  "metadata": {
4
4
  "description": "Mutable M365 operational mappings used to speed and stabilize context retrieval. Copy this file to m365-mutable.json for local use.",
5
- "defaultNotebookRef": ".github/config/m365-auth.json -> m365Auth.oneNote.defaultNotebookId",
5
+ "defaultNotebookRef": ".kushi/config/user/m365-auth.json -> m365Auth.oneNote.defaultNotebookId",
6
6
  "matching": "case-insensitive by project key (exact/prefix/contains)",
7
7
  "source": "Derived from project external-links.txt entries, mailbox discovery, and Teams thread discovery during bootstrap/refresh/retry runs."
8
8
  },