kushi-agents 5.6.3 → 5.6.4

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 (96) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.mjs +1 -1
  3. package/package.json +1 -2
  4. package/plugin/agents/kushi.agent.md +1 -1
  5. package/plugin/instructions/ado-bootstrap-discovery.instructions.md +3 -3
  6. package/plugin/instructions/capture-learnings.instructions.md +1 -1
  7. package/plugin/instructions/crm-bootstrap-discovery.instructions.md +1 -1
  8. package/plugin/instructions/customer-hint-discovery.instructions.md +7 -7
  9. package/plugin/instructions/deferred-retry-on-workiq-fail.instructions.md +1 -1
  10. package/plugin/instructions/email-bootstrap-discovery.instructions.md +5 -5
  11. package/plugin/instructions/fallback-status-reporting.instructions.md +1 -1
  12. package/plugin/instructions/full-view-gate.instructions.md +2 -2
  13. package/plugin/instructions/identity-resolution.instructions.md +1 -1
  14. package/plugin/instructions/karpathy-state-layout.instructions.md +3 -3
  15. package/plugin/instructions/m365-id-registry.instructions.md +1 -1
  16. package/plugin/instructions/meetings-bootstrap-discovery.instructions.md +1 -1
  17. package/plugin/instructions/meetings-verbatim-required.instructions.md +3 -3
  18. package/plugin/instructions/multi-wiki-routing.instructions.md +1 -1
  19. package/plugin/instructions/onedrive-pin-policy.instructions.md +2 -2
  20. package/plugin/instructions/run-reports.instructions.md +5 -5
  21. package/plugin/instructions/schema-evolve.instructions.md +1 -1
  22. package/plugin/instructions/scope-boundaries.instructions.md +3 -3
  23. package/plugin/instructions/sharepoint-bootstrap-discovery.instructions.md +5 -5
  24. package/plugin/instructions/teams-bootstrap-discovery.instructions.md +2 -2
  25. package/plugin/instructions/tracking.instructions.md +6 -6
  26. package/plugin/instructions/weekly-csc.instructions.md +11 -11
  27. package/plugin/instructions/workiq-onenote-query-shape.instructions.md +3 -3
  28. package/plugin/instructions/workiq-only.instructions.md +1 -1
  29. package/plugin/learnings/ado.md +3 -3
  30. package/plugin/learnings/crm.md +6 -6
  31. package/plugin/learnings/cross-cutting.md +44 -4
  32. package/plugin/learnings/email.md +4 -4
  33. package/plugin/learnings/meetings.md +2 -2
  34. package/plugin/learnings/onenote.md +20 -20
  35. package/plugin/prompts/aggregate.prompt.md +1 -1
  36. package/plugin/prompts/apply-ado.prompt.md +1 -1
  37. package/plugin/prompts/ask.prompt.md +1 -1
  38. package/plugin/prompts/bootstrap.prompt.md +1 -1
  39. package/plugin/prompts/consolidate.prompt.md +1 -1
  40. package/plugin/prompts/dashboard.prompt.md +1 -1
  41. package/plugin/prompts/explain.prompt.md +2 -2
  42. package/plugin/prompts/fde-intake.prompt.md +1 -1
  43. package/plugin/prompts/fde-report.prompt.md +1 -1
  44. package/plugin/prompts/fde-triage.prompt.md +1 -1
  45. package/plugin/prompts/link-entities.prompt.md +1 -1
  46. package/plugin/prompts/lint.prompt.md +1 -1
  47. package/plugin/prompts/promote.prompt.md +2 -2
  48. package/plugin/prompts/propose-ado.prompt.md +1 -1
  49. package/plugin/prompts/refresh.prompt.md +1 -1
  50. package/plugin/prompts/schema-evolve.prompt.md +2 -2
  51. package/plugin/prompts/state.prompt.md +1 -1
  52. package/plugin/prompts/status.prompt.md +1 -1
  53. package/plugin/prompts/teach.prompt.md +2 -2
  54. package/plugin/prompts/tour.prompt.md +1 -1
  55. package/plugin/reference-packs/fde/report-doctrine.md +2 -2
  56. package/plugin/runners/package.json +11 -0
  57. package/plugin/runners/test/fixtures/email-abn-amro.json +1 -1
  58. package/plugin/runners/test/fixtures/refresh-dir/email.json +1 -1
  59. package/plugin/skills/ask-project/SKILL.md +12 -12
  60. package/plugin/skills/ask-project/evals/evals.json +1 -1
  61. package/plugin/skills/bootstrap-project/SKILL.md +21 -0
  62. package/plugin/skills/bootstrap-project/references/registry-persistence.md +1 -1
  63. package/plugin/skills/intro/SKILL.md +1 -1
  64. package/plugin/skills/link-entities/build-graph.ps1 +1 -1
  65. package/plugin/skills/pull-misc/runner.mjs +4 -4
  66. package/plugin/skills/pull-onenote/README.md +4 -4
  67. package/plugin/skills/pull-onenote/references/preflight.md +1 -1
  68. package/plugin/skills/pull-onenote/references/runtime-contract.md +6 -6
  69. package/plugin/skills/pull-onenote/runner.mjs +5 -5
  70. package/plugin/skills/pull-onenote/scripts/recapture-section-url.mjs +2 -2
  71. package/plugin/skills/schema-evolve/evals/evals.json +2 -2
  72. package/plugin/skills/self-check/SKILL.md +3 -2
  73. package/plugin/skills/self-check/run.ps1 +28 -1
  74. package/plugin/skills/setup/SKILL.md +1 -1
  75. package/plugin/skills/setup/references/onedrive-pin-sync.md +2 -2
  76. package/plugin/templates/init/m365-auth.template.json +1 -1
  77. package/plugin/templates/init/project-integrations.template.yml +1 -1
  78. package/plugin/templates/init/project-user-settings.template.yml +1 -1
  79. package/plugin/templates/state/00_overview.template.md +5 -5
  80. package/plugin/templates/state/01_decisions.template.md +5 -5
  81. package/plugin/templates/state/02_stakeholders.template.md +3 -3
  82. package/plugin/templates/state/03_architecture-and-solution.template.md +3 -3
  83. package/plugin/templates/state/04_workshops-and-key-meetings.template.md +6 -6
  84. package/plugin/templates/state/05_action-items.template.md +5 -5
  85. package/plugin/templates/state/06_risks-and-issues.template.md +4 -4
  86. package/plugin/templates/state/07_timeline-and-milestones.template.md +4 -4
  87. package/plugin/templates/state/08_artifacts-and-deliverables.template.md +4 -4
  88. package/plugin/templates/state/README.md +1 -1
  89. package/plugin/templates/weekly/meetings-csc.template.md +1 -1
  90. package/src/bootstrap-dryrun.integration.test.mjs +2 -2
  91. package/src/constants.mjs +1 -1
  92. package/src/install-runner-deps.mjs +57 -0
  93. package/src/main.mjs +7 -0
  94. package/src/multi-host.mjs +4 -0
  95. package/src/sanitize-workiq-input.test.mjs +1 -1
  96. package/src/schema-evolve.test.mjs +2 -2
package/README.md CHANGED
@@ -151,7 +151,7 @@ kushi explain hooks
151
151
  Teach kushi project-specific conventions that persist across runs.
152
152
 
153
153
  ```bash
154
- kushi remember "always use 'HCA' not 'Healthcare Accelerator' in summaries"
154
+ kushi remember "always use 'Northwind' not 'Healthcare Accelerator' in summaries"
155
155
  ```
156
156
 
157
157
  Rules stored in `Evidence/<alias>/State/CLAUDE.md`. Read by `build-state`, `ask-project`, `refresh-project` at run start.
package/bin/cli.mjs CHANGED
@@ -165,7 +165,7 @@ if (args.length > 0 && args[0] === 'explain') {
165
165
  if (args.length > 0 && args[0] === 'remember') {
166
166
  const rule = args.slice(1).join(' ');
167
167
  if (!rule) {
168
- console.error('\n Usage: kushi remember <rule>\n\n Example: kushi remember "always use HCA not Healthcare Accelerator"\n');
168
+ console.error('\n Usage: kushi remember <rule>\n\n Example: kushi remember "always use Northwind not Healthcare Accelerator"\n');
169
169
  process.exit(1);
170
170
  }
171
171
  await dispatchRemember(rule);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kushi-agents",
3
- "version": "5.6.3",
3
+ "version": "5.6.4",
4
4
  "description": "Install Kushi — multi-source project evidence agent with Comprehensive Structured Capture (CSC) into weekly-only files across Email, Teams, OneNote, Loop, SharePoint, Meetings, CRM, ADO. Meetings retain a sibling verbatim/ audit folder. WorkIQ-only for M365 sources (Graph / m365_* FORBIDDEN as fallbacks; user-paste is first-class). Host-agnostic.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -58,4 +58,3 @@
58
58
  "access": "public"
59
59
  }
60
60
  }
61
-
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: Kushi
3
3
  description: "Kushi — multi-source project evidence + Q&A agent. Snapshot + stream capture across Email, Teams, OneNote, Loop, SharePoint, Meetings, CRM, ADO; plus read-only natural-language Q&A over the captured evidence. WorkIQ-first for capture, citation-only for answers. Host-agnostic. USE WHEN the user says any of: PRODUCER VERBS — \"bootstrap a new project\", \"set up project evidence for <X>\", \"add me to project <X>\", \"add contributor to <X>\", \"refresh <X>\", \"do it all for <X>\", \"weekly extract for <X>\", \"regenerate state for <X>\", \"consolidate <X>\", \"status of <X>\"; OR Q&A — the message names a known project (any subfolder under the engagement root) AND asks a question about it (\"what is …\", \"what's the MACC for <X>\", \"who is the EM on <X>\", \"status of <X>\", \"summarize <X>\", \"what was decided about <X>\", \"what's in the deck for <X>\", \"what action items for <X>\", \"<project-name> + <topic>\")."
4
- argument-hint: "Name a project (e.g. 'bootstrap HCA', 'refresh AGCO last 14 days', 'ask HCA what's the MACC?'). Kushi routes to the right verb prompt — never run `npx kushi-agents <verb>` in the terminal."
4
+ argument-hint: "Name a project (e.g. 'bootstrap Northwind', 'refresh Fabrikam last 14 days', 'ask Northwind what's the MACC?'). Kushi routes to the right verb prompt — never run `npx kushi-agents <verb>` in the terminal."
5
5
  tools:
6
6
  [vscode/vscodeAPI, execute/getTerminalOutput, execute/runInTerminal, read/readFile, read/terminalSelection, read/terminalLastCommand, agent, edit, search, web, browser, 'workiq/*', 'github/*']
7
7
  ---
@@ -40,7 +40,7 @@ boundaries:
40
40
  | Correct disposition | Resolve via 4-step REST sequence | Run discovery, record `no-match`, KEEP RETRYING on every refresh |
41
41
  | `disabled: true` legitimate? | Only after exhaustive 5-step sequence + user-ask | Only after user explicit opt-out |
42
42
 
43
- For John Deere on 2026-05-18: the CRM record (FE-2026-001791) exists and was missed (defect). The ADO engagement work item does NOT exist yet (expected; intake just happened 2026-05-13). Both currently land as `disabled: true` because bootstrap treats them the same — that's the defect this rule fixes.
43
+ For Acme on 2026-05-18: the CRM record (FE-2026-001791) exists and was missed (defect). The ADO engagement work item does NOT exist yet (expected; intake just happened 2026-05-13). Both currently land as `disabled: true` because bootstrap treats them the same — that's the defect this rule fixes.
44
44
 
45
45
  ## Required execution at bootstrap time
46
46
 
@@ -56,7 +56,7 @@ After ADO config presence + auth probe succeed:
56
56
  AND [System.State] <> 'Removed'
57
57
  ORDER BY [System.ChangedDate] DESC
58
58
  ```
59
- Tokens = each word/phrase from the project name (e.g. for "John Deere": tokens `John Deere`, `Deere`, `JDDO`, `JDIS`).
59
+ Tokens = each word/phrase from the project name (e.g. for "Acme": tokens `Acme`, `Deere`, `JDDO`, `JDIS`).
60
60
 
61
61
  2. **WIQL probe 2 — Any WI type by title (catches Activity-only patterns or wrong-typed engagements)**:
62
62
  ```sql
@@ -72,7 +72,7 @@ After ADO config presence + auth probe succeed:
72
72
  ```sql
73
73
  WHERE [System.Tags] CONTAINS '<slug>'
74
74
  ```
75
- Slug = lowercased token, hyphenated (`john-deere`, `deere`, `jddo`).
75
+ Slug = lowercased token, hyphenated (`acme`, `deere`, `jddo`).
76
76
 
77
77
  4. **WIQL probe 4 — CRM cross-link (if CRM record_id was resolved)**:
78
78
  ```sql
@@ -43,7 +43,7 @@ Don't capture: one-off transient errors (network blip, expired token), or things
43
43
 
44
44
  **Doctrine impact**: which SKILL.md, instructions file, or template was updated in the same commit. Link by relative path. If "none yet — register only", say so explicitly and open a TODO.
45
45
 
46
- **Discovered during**: project name + skill that hit it (e.g. `HCA / pull-crm`).
46
+ **Discovered during**: project name + skill that hit it (e.g. `Northwind / pull-crm`).
47
47
  ```
48
48
 
49
49
  Newest entry on top. Never delete — only mark superseded with a one-liner.
@@ -6,7 +6,7 @@ applyTo: "**/skills/bootstrap-project/**, **/skills/pull-crm/**, **/skills/refre
6
6
 
7
7
  ## The defect this rule exists to prevent
8
8
 
9
- Bootstrap runs that wrote `boundaries.crm.disabled: true` after a single shallow probe (e.g. WorkIQ-only, or no live Dataverse REST call at all) — when in fact a live `contains(new_title, '<token>')` query would have resolved the record instantly. The result: pull-crm is then never dispatched on subsequent refreshes, the project Evidence/crm/ folder stays empty, and the CRM record drifts unsynced. Discovered 2026-05-18 on the John Deere bootstrap — FE-2026-001791 was missed because the title-first REST probe was never issued.
9
+ Bootstrap runs that wrote `boundaries.crm.disabled: true` after a single shallow probe (e.g. WorkIQ-only, or no live Dataverse REST call at all) — when in fact a live `contains(new_title, '<token>')` query would have resolved the record instantly. The result: pull-crm is then never dispatched on subsequent refreshes, the project Evidence/crm/ folder stays empty, and the CRM record drifts unsynced. Discovered 2026-05-18 on the Acme bootstrap — FE-2026-001791 was missed because the title-first REST probe was never issued.
10
10
 
11
11
  ## The rule
12
12
 
@@ -7,7 +7,7 @@ description: "Customer-hint discovery sweep — bootstrap MUST attempt WorkIQ-dr
7
7
 
8
8
  ## The defect this rule exists to prevent
9
9
 
10
- Bootstrap runs that scaffold an empty `<project>/integrations.yml#boundaries.*` and immediately declare every source `blocked-config` — without ever asking WorkIQ "who/what mentions this customer?". The result: a fresh project bootstrap finishes with 0 evidence pulled, the user is told to hand-populate mailboxes / chat IDs / channel IDs / meeting join URLs / SharePoint sites, and the entire value proposition of "bootstrap a project from a customer hint" collapses to a config form. Discovered 2026-05-26 on the HCA bootstrap — every source row read `blocked-config` despite extensive HCA email / Teams / meeting history in the tenant.
10
+ Bootstrap runs that scaffold an empty `<project>/integrations.yml#boundaries.*` and immediately declare every source `blocked-config` — without ever asking WorkIQ "who/what mentions this customer?". The result: a fresh project bootstrap finishes with 0 evidence pulled, the user is told to hand-populate mailboxes / chat IDs / channel IDs / meeting join URLs / SharePoint sites, and the entire value proposition of "bootstrap a project from a customer hint" collapses to a config form. Discovered 2026-05-26 on the Northwind bootstrap — every source row read `blocked-config` despite extensive Northwind email / Teams / meeting history in the tenant.
11
11
 
12
12
  ## The rule
13
13
 
@@ -33,7 +33,7 @@ Any other path that writes `blocked-config` without attempting the sweep is a **
33
33
 
34
34
  ## Required inputs
35
35
 
36
- - `<customer-hint>` — verbatim string the user provided at bootstrap invocation (e.g. `HCA`). Captured by `bootstrap-project` Step 0/1 and persisted to `<project>/bootstrap-status.md` under `Customer Hint:`. Used VERBATIM in v4.8.0 — no fuzzy expansion (deferred to v4.9.0).
36
+ - `<customer-hint>` — verbatim string the user provided at bootstrap invocation (e.g. `Northwind`). Captured by `bootstrap-project` Step 0/1 and persisted to `<project>/bootstrap-status.md` under `Customer Hint:`. Used VERBATIM in v4.8.0 — no fuzzy expansion (deferred to v4.9.0).
37
37
  - `<lookback-days>` — defaults to **90** for discovery (longer than the 30-day pull window so historical chats / series still surface). Configurable via `<workspace>/.kushi/config/user/m365-mutable.json#bootstrap.discoveryLookbackDays`.
38
38
  - `<project>` — engagement name (already resolved).
39
39
  - `<alias>` — current contributor.
@@ -74,10 +74,10 @@ For each source whose sweep runs:
74
74
 
75
75
  | Source | Hint | Query attempted | Candidates found | Persisted | Deferred | Discovered by |
76
76
  |---|---|---|---|---|---|---|
77
- | email | HCA | "In my Inbox..." | 7 | 7 | 0 | ushak |
78
- | teams | HCA | "In my Teams chats..." | 14 | 10 | 4 | ushak |
79
- | meetings | HCA | "In my calendar..." | 3 | 3 | 0 | ushak |
80
- | sharepoint | HCA | "In my SharePoint sites..." | 0 | 0 | 0 | ushak |
77
+ | email | Northwind | "In my Inbox..." | 7 | 7 | 0 | ushak |
78
+ | teams | Northwind | "In my Teams chats..." | 14 | 10 | 4 | ushak |
79
+ | meetings | Northwind | "In my calendar..." | 3 | 3 | 0 | ushak |
80
+ | sharepoint | Northwind | "In my SharePoint sites..." | 0 | 0 | 0 | ushak |
81
81
  ```
82
82
 
83
83
  ## Behavior matrix (per source)
@@ -114,7 +114,7 @@ When the user re-runs bootstrap on a project that already has populated boundari
114
114
  ## Forbidden behaviors
115
115
 
116
116
  1. **Declaring `blocked-config` without running the sweep first** for email/teams/meetings/sharepoint — see "The defect" above. CRM/ADO have their own mandates in `crm-bootstrap-discovery` / `ado-bootstrap-discovery`.
117
- 2. **Auto-narrowing the customer hint** ("HCA" → "HCA Healthcare Inc"). Use the hint verbatim. Smart-expansion is v4.9.0.
117
+ 2. **Auto-narrowing the customer hint** ("Northwind" → "Northwind Healthcare Inc"). Use the hint verbatim. Smart-expansion is v4.9.0.
118
118
  3. **Discovering across all sources in one mega-query.** Each source has its own narrow WorkIQ prompt (see per-source doctrines). Mega-queries punt to Graph and return empty.
119
119
  4. **Inferring local OneDrive sync paths from the hint** for SharePoint `local_folders[]`. Discovery populates `site_urls[]` only.
120
120
  5. **Calling Graph / `m365_*` directly for discovery.** Per `workiq-only.instructions.md` the four sources covered here use WorkIQ exclusively. The only allowed `m365_*` exceptions remain `m365_list_chat_messages` (parallel structured dump per pull-teams) and the per-source carve-outs already named in their pull-* SKILLs.
@@ -44,7 +44,7 @@ The next `refresh-project` run drains the queue first (Step 2a). On success, the
44
44
  # Drained by refresh-project Step 2a. Deleted on retry success.
45
45
  schema_version: 1
46
46
  source: meetings # one of: email, teams, meetings, onenote, sharepoint, crm, ado, misc, identity
47
- project: HCA
47
+ project: Northwind
48
48
  alias: ushak
49
49
  created_at: 2026-05-20T12:30:00Z
50
50
  attempts: 1
@@ -11,7 +11,7 @@ Governed by `customer-hint-discovery.instructions.md` — read that file first f
11
11
 
12
12
  | Boundary key | Element shape | Example |
13
13
  |---|---|---|
14
- | `boundaries.email.mailboxes[]` | string — mail folder path relative to mailbox root | `"Inbox"`, `"Inbox/HCA"`, `"FDE/HCA Intake"` |
14
+ | `boundaries.email.mailboxes[]` | string — mail folder path relative to mailbox root | `"Inbox"`, `"Inbox/Northwind"`, `"FDE/Northwind Intake"` |
15
15
 
16
16
  Optional narrowing fields (`sender_domains[]`, `subject_keywords[]`) are NOT populated by the sweep — they are user-supplied narrowing.
17
17
 
@@ -25,7 +25,7 @@ workiq ask -q "In my Outlook mail folders, find the top mail folders that contai
25
25
 
26
26
  Substitution rules:
27
27
 
28
- - `<HINT>` = the verbatim customer hint from `bootstrap-status.md#Customer Hint` (e.g. `HCA`).
28
+ - `<HINT>` = the verbatim customer hint from `bootstrap-status.md#Customer Hint` (e.g. `Northwind`).
29
29
  - `<N>` = `m365-mutable.json#bootstrap.discoveryLookbackDays` (default 90).
30
30
 
31
31
  The phrasing is **natural-language by folder content** — empirically the only shape that returns folder paths. WorkIQ punts on any other shape (see Forbidden phrasings).
@@ -49,7 +49,7 @@ WorkIQ returns a markdown table. Parse rows where `folder path` is non-empty and
49
49
  3. Cap at top 10 by `message count`.
50
50
  4. The remainder (if any) goes to `<project>/OPEN-QUESTIONS-DRAFT.md` per the orchestration doctrine.
51
51
  5. Confidence ranking:
52
- - `high` — folder path explicitly contains the hint (case-insensitive substring), e.g. `Inbox/HCA Intake` for hint `HCA`.
52
+ - `high` — folder path explicitly contains the hint (case-insensitive substring), e.g. `Inbox/Northwind Intake` for hint `Northwind`.
53
53
  - `medium` — message count ≥ 10 AND folder is a known well-known root (`Inbox`, `Sent Items`, `Archive`).
54
54
  - `low` — everything else.
55
55
 
@@ -70,8 +70,8 @@ total_candidates_found: 7
70
70
  candidates_persisted: 7
71
71
  candidates_deferred: 0
72
72
  results:
73
- - value: 'Inbox/HCA Intake'
74
- label: 'Inbox/HCA Intake (245 messages, last 2026-05-25)'
73
+ - value: 'Inbox/Northwind Intake'
74
+ label: 'Inbox/Northwind Intake (245 messages, last 2026-05-25)'
75
75
  confidence: high
76
76
  needs_review: true
77
77
  - value: 'Inbox'
@@ -60,7 +60,7 @@ This rule is the **summary-time companion** to:
60
60
  1. **Overall task `failed` when evidence was written.** If `pull-crm` resolved the record via account-lookup (resolution step 2) and wrote the snapshot file, `sources.crm.last_status` is `ok`, not `failed`. The direct-title-match attempt status goes into `errors[]` with `action_taken: fell-back-to-account-lookup`.
61
61
  2. **Hiding the direct-path failure when fallback succeeded.** Do not omit the original failure from `errors[]` just because the fallback worked. The audit trail matters; future runs and learnings depend on it.
62
62
  3. **Conflating `completed-via-fallback` with `partial`.** They are different: `partial` = task delivered less than requested scope; `completed-via-fallback` = task delivered the requested scope but via the alternate path. Use `completed-via-fallback (partial)` when both apply.
63
- 4. **Writing `blocked: missing X` when X was satisfied via an override.** The HCA bootstrap (2026-05-20) mis-reported CRM/ADO/Teams as `blocked: missing shared connection values` even though per-project `integrations.yml` had `environment_url_override`, `engagement_id`, and `chat_ids` fully pinned. The correct status was `completed via per-project effective-config`. Always check the effective-config result, not just the global-config layer.
63
+ 4. **Writing `blocked: missing X` when X was satisfied via an override.** The Northwind bootstrap (2026-05-20) mis-reported CRM/ADO/Teams as `blocked: missing shared connection values` even though per-project `integrations.yml` had `environment_url_override`, `engagement_id`, and `chat_ids` fully pinned. The correct status was `completed via per-project effective-config`. Always check the effective-config result, not just the global-config layer.
64
64
 
65
65
  ## Render examples
66
66
 
@@ -11,11 +11,11 @@ When a prompt asks Kushi to characterize a project's current state — analysis,
11
11
 
12
12
  This gate applies whenever the question is about a project / customer / engagement under the engagement root, including prompts that don't explicitly say "refresh" or "report":
13
13
 
14
- - "what's the status of HCA"
14
+ - "what's the status of Northwind"
15
15
  - "summarize ABN AMRO"
16
16
  - "what are the risks on Hovnanian"
17
17
  - "what's been decided about funding for Lilly"
18
- - "next steps for AGCO"
18
+ - "next steps for Fabrikam"
19
19
  - "what did the customer say in the last meeting about X"
20
20
  - any `/kushi ask-project <project> <question>` invocation
21
21
 
@@ -114,7 +114,7 @@ The `setup` skill does the deeper recovery (3-retry loop with `ask_user` choices
114
114
  Question text (only asked once, only by `setup`, only when `emailContext.folders` is empty or `["__FILL_ME_IN__"]`):
115
115
 
116
116
  > Which mailbox folders should kushi search for email evidence?
117
- > • Enter a comma-separated list (e.g. `Inbox, Archive, Projects/HCA`)
117
+ > • Enter a comma-separated list (e.g. `Inbox, Archive, Projects/Northwind`)
118
118
  > • Type `all` to search the FULL mailbox (slower — every refresh scans everything)
119
119
  > • Press Enter to leave blank (equivalent to `all`)
120
120
 
@@ -53,7 +53,7 @@ Folder names are lowercase, no spaces. `build-state` creates them on demand.
53
53
  kushi_state_page: true
54
54
  category: opportunity # one of: people | opportunity | ado-work-item | decision | risk | customer-ask | meeting | artifact
55
55
  entity_ids: ["crm://entity=opportunity/id=<guid>"]
56
- related: ["[[alice-smith]]", "[[hca-weekly-sync]]"]
56
+ related: ["[[ushak-smith]]", "[[northwind-weekly-sync]]"]
57
57
  last_synthesized_iso: "2026-05-26T20:00:00Z"
58
58
  synthesized_by_alias: "ushak"
59
59
  ---
@@ -70,7 +70,7 @@ synthesized_by_alias: "ushak"
70
70
  - `[[slug]]` resolves to `State/<category>/<slug>.md`. The category folder
71
71
  is inferred from the target page's `category` front-matter.
72
72
  - Slugs are **lowercase-kebab-case** derived from the page title (e.g.
73
- "HCA FY26 Renewal" → `hca-fy26-renewal`). Producers MUST emit slugs
73
+ "Northwind FY26 Renewal" → `northwind-fy26-renewal`). Producers MUST emit slugs
74
74
  deterministically so two runs converge on the same filename.
75
75
  - `[[slug|display text]]` is allowed and rendered the way every wiki tool
76
76
  renders it.
@@ -89,7 +89,7 @@ addressable via the graph and `weekly/` directly.
89
89
 
90
90
  One file per cross-source entity. If two nodes legitimately share a slug
91
91
  (name collision), append a short stable suffix derived from the source +
92
- last 6 chars of the id (e.g. `alice-smith-ado-9f3c2a`).
92
+ last 6 chars of the id (e.g. `ushak-smith-ado-9f3c2a`).
93
93
 
94
94
  ## Backward compatibility
95
95
 
@@ -106,7 +106,7 @@ Every refresh MUST:
106
106
 
107
107
  1. **Read** `m365-mutable.json#knownSections.<projectKey>` first. If the entry is missing or the per-source key is empty → DO NOT probe. Re-dispatch through `bootstrap-project` for that source's discovery only, then resume.
108
108
  2. **Pass the canonical IDs to each pull-* skill in the form that skill's WorkIQ queries actually use.** Different sources need different forms:
109
- - **OneNote (corrected v3.8.0):** PRIMARY path is browser-scrape via Playwright with persisted profile (returns reliable verbatim bodies — 16/16 captured for HCA on 2026-05-14 vs WorkIQ's 1/18). FALLBACK path is WorkIQ natural-language by display name (used only when Playwright profile is auth-expired). Per-page identifiers are stored in BOTH forms: `webPageId` (used by browser-scrape navigation) AND `wdpartid` (used by WorkIQ correlation and stream events). See `pull-onenote/SKILL.md` v2.6.0 § "Empirical contract" and `learnings/onenote.md` 2026-05-14 for proof. The v3.7.8 wdsectionfileid-filter doctrine and the v3.7.9 WorkIQ-primary doctrine are both retracted.
109
+ - **OneNote (corrected v3.8.0):** PRIMARY path is browser-scrape via Playwright with persisted profile (returns reliable verbatim bodies — 16/16 captured for Northwind on 2026-05-14 vs WorkIQ's 1/18). FALLBACK path is WorkIQ natural-language by display name (used only when Playwright profile is auth-expired). Per-page identifiers are stored in BOTH forms: `webPageId` (used by browser-scrape navigation) AND `wdpartid` (used by WorkIQ correlation and stream events). See `pull-onenote/SKILL.md` v2.6.0 § "Empirical contract" and `learnings/onenote.md` 2026-05-14 for proof. The v3.7.8 wdsectionfileid-filter doctrine and the v3.7.9 WorkIQ-primary doctrine are both retracted.
110
110
  - **Email / Teams / SharePoint / CRM / ADO:** the registry IDs are passed as documented in each pull-* skill — typically as Graph IDs in API calls, not WorkIQ prose.
111
111
  - **Misc (pull-misc v0.1.0+):** the link list is the user-curated `<project>/external-links.txt` file. Refresh re-parses the file every run, matches existing `misc_links[]` entries by `(type, url)` tuple, marks deleted entries as `removed` (preserves snapshot), creates new entries as `not-yet-attempted`, and routes per-type to runner branches (browser for loop, http for web/learn/docs/pdf/github, file for local, delegated for onenote/sharepoint/ado). See `pull-misc/SKILL.md` § "Step A — enumerate".
112
112
  3. **Never re-discover.** A refresh that probes WorkIQ with seeds (folder name, channel name) instead of canonical IDs is a defect. The only exception is the cleanup-on-resolution path documented in `cleanup-on-resolution.instructions.md`, which UPSERTS newly-resolved IDs into the registry mid-run.
@@ -67,7 +67,7 @@ Additional field for meetings sidecar:
67
67
  ```yaml
68
68
  results:
69
69
  - value: 'https://teams.microsoft.com/l/meetup-join/19%3a...'
70
- label: 'HCA Weekly Sync (Weekly Tue 10:00 ET; organizer: jdoe@hcahealthcare.com)'
70
+ label: 'Northwind Weekly Sync (Weekly Tue 10:00 ET; organizer: jdoe@hcahealthcare.com)'
71
71
  recurrence: weekly
72
72
  organizer_email: 'jdoe@hcahealthcare.com'
73
73
  most_recent_occurrence: '2026-05-21'
@@ -14,7 +14,7 @@ Meetings differ from every other evidence class in one critical way: **the sourc
14
14
  - Copilot recap cards persist only as long as the meeting object does.
15
15
  - Attendee memory degrades to zero within weeks.
16
16
 
17
- Email bodies, OneNote pages, SharePoint files, CRM records, and ADO work items all persist in their source systems indefinitely (or for years). Meetings do not. If the curated 7-section meeting summary is the only artifact kushi captures, and the recording later expires, **the evidence is unrecoverable**. This has happened in production (see `learnings/meetings.md` — FDE Intake John Deere, 2026-05-18).
17
+ Email bodies, OneNote pages, SharePoint files, CRM records, and ADO work items all persist in their source systems indefinitely (or for years). Meetings do not. If the curated 7-section meeting summary is the only artifact kushi captures, and the recording later expires, **the evidence is unrecoverable**. This has happened in production (see `learnings/meetings.md` — FDE Intake Acme, 2026-05-18).
18
18
 
19
19
  ## The rule
20
20
 
@@ -134,7 +134,7 @@ If steps 2(a-d) all return empty AND chat in step 3 is also empty: meeting is `u
134
134
 
135
135
  ## Naming
136
136
 
137
- - Folder: `<YYYY-MM-DD>-<HHMM>_<slug>` — e.g. `2026-05-13-1530_fde-intake-john-deere`
137
+ - Folder: `<YYYY-MM-DD>-<HHMM>_<slug>` — e.g. `2026-05-13-1530_fde-intake-acme`
138
138
  - Slug rules: lowercase, ASCII, spaces and punctuation → single hyphen, collapse repeats, trim trailing hyphens, max 60 chars.
139
139
  - Time: meeting start time in the user's local timezone (per `m365_get_mailbox_settings`), 24h, no separator.
140
140
  - If two meetings share start time + slug: append `-2`, `-3`, etc.
@@ -144,7 +144,7 @@ If steps 2(a-d) all return empty AND chat in step 3 is also empty: meeting is `u
144
144
  Inside the curated snapshot/stream files, cite verbatim files with the kushi standard format:
145
145
 
146
146
  ```
147
- [source: Evidence/<alias>/meetings/verbatim/2026-05-13-1530_fde-intake-john-deere/chat-messages.md · 2026-05-13]
147
+ [source: Evidence/<alias>/meetings/verbatim/2026-05-13-1530_fde-intake-acme/chat-messages.md · 2026-05-13]
148
148
  ```
149
149
 
150
150
  The curated snapshot is the assertion; the verbatim file is the evidence. The two must always travel together.
@@ -53,7 +53,7 @@ Source provenance MUST be visible per citation: `[project: <alias>]` vs `[global
53
53
  ### 4. teach — global-first for cross-cutting topics
54
54
 
55
55
  - For **cross-cutting topics** (kushi concepts, doctrines, releases — e.g. "explain confidence ladder", "how does CSC work"): `teach` consults the global wiki FIRST (if a matching page exists in `~/.kushi-global/State/answers/`), then falls back to in-repo doctrine, then to genealogy.
56
- - For **project-specific topics** ("how did we structure intake for AGCO?"): `teach` declines and suggests `kushi ask <project> <q>` instead — that's an `ask-project` job.
56
+ - For **project-specific topics** ("how did we structure intake for Fabrikam?"): `teach` declines and suggests `kushi ask <project> <q>` instead — that's an `ask-project` job.
57
57
  - Citations distinguish `[global: <page>]` vs `[doctrine: <file>]` vs `[genealogy: <version>]`.
58
58
 
59
59
  ### 5. Promotion path — explicit only
@@ -93,9 +93,9 @@ Output:
93
93
 
94
94
  ```
95
95
  🔧 Optimizing OneDrive cache for your engagement…
96
- ✅ Pinned (kept on device): HCA/Evidence/ushak/, HCA/State/, HCA/_Consolidated/,
96
+ ✅ Pinned (kept on device): Northwind/Evidence/ushak/, Northwind/State/, Northwind/_Consolidated/,
97
97
  + project-level run-log.yml + integrations.yml
98
- ➖ Left cloud-only (downloaded on demand): HCA/Evidence/bob/, HCA/Evidence/maria/
98
+ ➖ Left cloud-only (downloaded on demand): Northwind/Evidence/bob/, Northwind/Evidence/maria/
99
99
  Disk impact: ~180 MB local · ~6.2 GB available cloud-only.
100
100
  Change later: right-click any folder → 'Always keep on device' / 'Free up space',
101
101
  or run @Kushi setup --reconfigure.
@@ -58,7 +58,7 @@ Newest at the bottom of `Get-ChildItem` listings (sortable by name = sortable by
58
58
  ## Resolutions this run
59
59
 
60
60
  For each ID/folder/section newly resolved during this run, one bullet:
61
- - `ado.engagement_id` resolved to `96944` (HCA - Engagement) — pinned to integrations.yml + m365-mutable.json.
61
+ - `ado.engagement_id` resolved to `96944` (Northwind - Engagement) — pinned to integrations.yml + m365-mutable.json.
62
62
  - `crm.record_id` resolved to `e561b31e-...` — pinned + env override applied (iscrm.crm.dynamics.com).
63
63
 
64
64
  ## Cleanups this run
@@ -70,8 +70,8 @@ Per `cleanup-on-resolution.instructions.md`. List entries pruned when a resoluti
70
70
  ## Learnings appended
71
71
 
72
72
  Per `capture-learnings.instructions.md`. List new entries written to `<KUSHI_ROOT>/plugin/learnings/<file>.md`:
73
- - `learnings/crm.md` — "Custom entities don't expose Annotations as a navigation property" (HCA / pull-crm).
74
- - `learnings/ado.md` — "$top=500 exceeds permissible range on workItems updates endpoint" (HCA / pull-ado).
73
+ - `learnings/crm.md` — "Custom entities don't expose Annotations as a navigation property" (Northwind / pull-crm).
74
+ - `learnings/ado.md` — "$top=500 exceeds permissible range on workItems updates endpoint" (Northwind / pull-ado).
75
75
 
76
76
  ## Skips & gaps
77
77
 
@@ -93,8 +93,8 @@ What was deliberately skipped or couldn't be retrieved, with reason:
93
93
 
94
94
  Plain-language list. What the contributor should do next, e.g.:
95
95
  - Review `Evidence/<alias>/email/stream/2026-05-04_email-stream.md` — 3 emails from James Gibbings have substantive customer needs that should land in `State/00_overview.md`.
96
- - Pin a SharePoint folder for HCA in `integrations.yml#boundaries.sharepoint.folder_paths` so next refresh covers it.
97
- - Re-run with `force-refresh HCA` if today's run looks partial.
96
+ - Pin a SharePoint folder for Northwind in `integrations.yml#boundaries.sharepoint.folder_paths` so next refresh covers it.
97
+ - Re-run with `force-refresh Northwind` if today's run looks partial.
98
98
 
99
99
  ---
100
100
 
@@ -60,7 +60,7 @@ Auto-detection: when the user says "from now on...", "always...", "never...", "f
60
60
  ## Examples
61
61
 
62
62
  ```
63
- > kushi remember "always use 'HCA' not 'Healthcare Accelerator' in summaries"
63
+ > kushi remember "always use 'Northwind' not 'Healthcare Accelerator' in summaries"
64
64
  > kushi remember "treat John Smith as the primary EM for this project"
65
65
  > kushi remember "CRM entity 'opportunity' maps to our internal term 'deal'"
66
66
  ```
@@ -85,7 +85,7 @@ boundaries:
85
85
  - "microsoft.com"
86
86
  - "hcahealthcare.com"
87
87
  subject_keywords: # optional — additional narrowing
88
- - "HCA"
88
+ - "Northwind"
89
89
  - "FE-2026-001458"
90
90
 
91
91
  teams:
@@ -105,7 +105,7 @@ boundaries:
105
105
 
106
106
  sharepoint:
107
107
  local_folders: # required if sharepoint enabled
108
- - "C:\\…\\HCA"
108
+ - "C:\\…\\Northwind"
109
109
  site_urls: [] # optional — for online-only docs
110
110
  drive_ids: [] # optional — Graph-direct access
111
111
 
@@ -119,7 +119,7 @@ boundaries:
119
119
 
120
120
  ado:
121
121
  area_paths: # required if ado enabled
122
- - "ISE-Engagements\\HCA"
122
+ - "ISE-Engagements\\Northwind"
123
123
  iteration_paths: [] # optional — for sprint-scoped queries
124
124
  initiative_query: "" # optional — saved WIQL query ID
125
125
  work_item_ids: [] # optional — pin specific work items
@@ -9,7 +9,7 @@ Governed by `customer-hint-discovery.instructions.md` — read that file first f
9
9
 
10
10
  ## Empirical finding (kushi v4.8.1) — WorkIQ has no SharePoint site-inventory surface
11
11
 
12
- Validated against the live WorkIQ surface on 2026-05-26 with hint `HCA`: WorkIQ returns a hard punt — *"the sources do not contain site inventory or SharePoint site properties; I cannot construct the requested table without fabricating data (which I will not do per policy)."* This is consistent — tenant-wide SharePoint site enumeration requires Graph admin endpoints that WorkIQ does not expose.
12
+ Validated against the live WorkIQ surface on 2026-05-26 with hint `Northwind`: WorkIQ returns a hard punt — *"the sources do not contain site inventory or SharePoint site properties; I cannot construct the requested table without fabricating data (which I will not do per policy)."* This is consistent — tenant-wide SharePoint site enumeration requires Graph admin endpoints that WorkIQ does not expose.
13
13
 
14
14
  **Therefore:**
15
15
 
@@ -62,7 +62,7 @@ WorkIQ commonly punts on this query (see Empirical finding above). Apply this cl
62
62
  5. Cap at top 10 by `most recent activity date` (descending). If activity date is missing, fall back to alphabetical site title.
63
63
  6. Confidence ranking:
64
64
  - `high` — site title contains the hint (case-insensitive substring).
65
- - `medium` — site URL slug contains the hint (e.g. `/sites/HCA-Engagement` for hint `HCA`).
65
+ - `medium` — site URL slug contains the hint (e.g. `/sites/Northwind-Engagement` for hint `Northwind`).
66
66
  - `low` — match was on site description only.
67
67
 
68
68
  ## Sidecar file shape
@@ -71,9 +71,9 @@ Written to `<engagement-root>/<project>/Evidence/<alias>/_discovery/<YYYY-MM-DD>
71
71
 
72
72
  ```yaml
73
73
  results:
74
- - value: 'https://contoso.sharepoint.com/sites/HCA-Engagement'
75
- label: 'HCA Engagement (last activity 2026-05-24; default library: Documents)'
76
- site_title: 'HCA Engagement'
74
+ - value: 'https://contoso.sharepoint.com/sites/Northwind-Engagement'
75
+ label: 'Northwind Engagement (last activity 2026-05-24; default library: Documents)'
76
+ site_title: 'Northwind Engagement'
77
77
  default_library: 'Documents'
78
78
  most_recent_activity: '2026-05-24'
79
79
  confidence: high
@@ -16,7 +16,7 @@ Governed by `customer-hint-discovery.instructions.md` — read that file first f
16
16
 
17
17
  ## Empirical findings (kushi v4.8.1 — what WorkIQ actually returns)
18
18
 
19
- Validated against the live WorkIQ surface on 2026-05-26 with hint `HCA`:
19
+ Validated against the live WorkIQ surface on 2026-05-26 with hint `Northwind`:
20
20
 
21
21
  - **Query 1 (chats) — works**, but WorkIQ returns `chat ID = N/A` (the column is present but empty). The chat ID MUST be extracted from the per-row message permalink URL — see "Parsing the response" below.
22
22
  - **Query 2 (channels) — DOES NOT WORK.** WorkIQ has no Teams channel-enumeration surface. Every empirical attempt either returned empty or reclassified channel hits as chats with `N/A` IDs. The query is retained below as a `best-effort` opt-in only — bootstrap MUST NOT block on it and MUST NOT write `last_status: blocked-config` when it returns 0. Manual user-supplied `channel_ids[]` is the only reliable path.
@@ -72,7 +72,7 @@ WorkIQ returns the `chat ID` column populated as `N/A` (empirical, v4.8.1). The
72
72
  5. Cap at top 10 by `most recent message date` (descending).
73
73
  6. Confidence ranking:
74
74
  - `high` — `chat topic` explicitly contains the hint (case-insensitive substring).
75
- - `medium` — any member's email domain matches a known customer domain (heuristic: hint appears as substring in domain), e.g. hint `HCA` + member `@hcahealthcare.com`.
75
+ - `medium` — any member's email domain matches a known customer domain (heuristic: hint appears as substring in domain), e.g. hint `Northwind` + member `@hcahealthcare.com`.
76
76
  - `low` — match was on a member's display name only.
77
77
 
78
78
  **If no message permalink URL is found in a row**, that row CANNOT be persisted to `boundaries.teams.chat_ids[]` — log it to OPEN-QUESTIONS-DRAFT.md under `## Teams chats discovered without IDs` with the topic + members so the user can supply the chat id manually.
@@ -59,7 +59,7 @@ Every tracking file is Markdown with frontmatter + a small set of named sections
59
59
  ```markdown
60
60
  ---
61
61
  prompt: bootstrap # /bootstrap, /refresh, /ask, /fde-intake, ...
62
- project: hca # slugified engagement folder name
62
+ project: northwind # slugified engagement folder name
63
63
  window: last 30 days # bootstrap/refresh only; otherwise omit
64
64
  started: 2026-05-19T14:02:00-04:00
65
65
  finished: 2026-05-19T14:38:12-04:00 # omit if still in progress
@@ -75,7 +75,7 @@ kushi_version: 4.1.0
75
75
  ## Inputs resolved
76
76
 
77
77
  - Engagement root: `C:/.../Engagement Assets`
78
- - Project folder: `HCA Healthcare`
78
+ - Project folder: `Northwind Healthcare`
79
79
  - Alias: `ushak`
80
80
  - Config: `<workspace>/.kushi/config/user/project-evidence.yml`
81
81
 
@@ -93,13 +93,13 @@ kushi_version: 4.1.0
93
93
 
94
94
  ## Outputs
95
95
 
96
- - `HCA Healthcare/Evidence/ushak/email/snapshot/2026-05-19.md`
97
- - `HCA Healthcare/Evidence/ushak/teams/snapshot/2026-05-19.md`
98
- - `HCA Healthcare/State/00_overview.md` (updated)
96
+ - `Northwind Healthcare/Evidence/ushak/email/snapshot/2026-05-19.md`
97
+ - `Northwind Healthcare/Evidence/ushak/teams/snapshot/2026-05-19.md`
98
+ - `Northwind Healthcare/State/00_overview.md` (updated)
99
99
 
100
100
  ## Open questions / next steps
101
101
 
102
- - ADO field `Custom.FDEStatusSummary` is empty — recommend running `/fde-report hca` next.
102
+ - ADO field `Custom.FDEStatusSummary` is empty — recommend running `/fde-report northwind` next.
103
103
  - 3 OneNote pages returned `page-body-unavailable`; see notes in `Evidence/ushak/onenote/run-notes.md`.
104
104
 
105
105
  ## Errors / fallbacks
@@ -15,7 +15,7 @@ In practice this caused two problems:
15
15
  1. **Empty snapshot folders.** Sources without retrievable bodies (OneNote payload-too-large,
16
16
  m365_get_email failures, no SharePoint site discovery) ended up with no `snapshot/`
17
17
  content. Users perceived empty folders as "kushi didn't pull anything".
18
- 2. **Awkward queries.** Answering "what happened on HCA last week?" required reading
18
+ 2. **Awkward queries.** Answering "what happened on Northwind last week?" required reading
19
19
  `stream/<week>.md` per source AND walking `snapshot/` to know current state of entities
20
20
  touched that week. Six sources × two folder reads per query.
21
21
 
@@ -135,8 +135,8 @@ kushi_version: 4.9.0
135
135
  entities:
136
136
  # Stable entity-id chosen per source (see "Entity identity" below).
137
137
  - id: 'onenote://page/wdpartid=abc123'
138
- display_name: 'HCA Architecture Overview'
139
- entity_anchor: 'hca-architecture-overview'
138
+ display_name: 'Northwind Architecture Overview'
139
+ entity_anchor: 'northwind-architecture-overview'
140
140
  latest_csc_file: 'weekly/2026-05-25_onenote-csc.md'
141
141
  latest_csc_block_offset: 412 # line number of the entity heading
142
142
  last_touched: 2026-05-23T14:30:00Z
@@ -147,8 +147,8 @@ entities:
147
147
  - 2026-05-04
148
148
  status: captured # captured | body-not-exposed | unavailable | deferred
149
149
  - id: 'meetings://joinurl=https%3A%2F%2Fteams.microsoft.com%2F...'
150
- display_name: 'HCA Weekly Sync'
151
- entity_anchor: 'hca-weekly-sync-2026-05-21-1400'
150
+ display_name: 'Northwind Weekly Sync'
151
+ entity_anchor: 'northwind-weekly-sync-2026-05-21-1400'
152
152
  latest_csc_file: 'weekly/2026-05-25_meetings-csc.md'
153
153
  latest_csc_block_offset: 95
154
154
  last_touched: 2026-05-21T14:00:00Z
@@ -234,7 +234,7 @@ conflicts possible at the writer level.
234
234
  ```markdown
235
235
  # Email CSC — Week of 2026-05-25 (Mon–Sun)
236
236
 
237
- - Project: HCA
237
+ - Project: Northwind
238
238
  - Alias: ushak
239
239
  - Source: email
240
240
  - Week: 2026-05-25 → 2026-05-31
@@ -245,19 +245,19 @@ conflicts possible at the writer level.
245
245
  ## Source Basis
246
246
 
247
247
  - WorkIQ enumeration call request-id abc123 returned 6 in-scope threads in folder
248
- "Customers/HCA" between 2026-05-25 and 2026-05-31.
248
+ "Customers/Northwind" between 2026-05-25 and 2026-05-31.
249
249
  - 6 thread-level WorkIQ CSC calls returned full bulleted capture; no deferrals.
250
250
 
251
251
  ## Entities
252
252
 
253
- ## HCA Compute Architecture Discussion {#hca-compute-arch-thread}
253
+ ## Northwind Compute Architecture Discussion {#northwind-compute-arch-thread}
254
254
 
255
255
  - Source basis: WorkIQ request-id def456, fidelity csc-full
256
256
  - Coverage window: 2026-05-25 → 2026-05-30
257
257
  - Last touched: 2026-05-30T09:12:00Z
258
258
 
259
259
  ### Participants / Present
260
- - John Doe <john@hca.com> — sender (initiated thread)
260
+ - John Doe <john@northwind.com> — sender (initiated thread)
261
261
  - Sample Name <you@example.com> — recipient + responder
262
262
  - ...
263
263
 
@@ -296,8 +296,8 @@ generated_at: 2026-05-26T18:45:00Z
296
296
  kushi_version: 4.9.0
297
297
  entities:
298
298
  - id: 'email://conversation_id=AAQkAGI...'
299
- display_name: 'HCA Compute Architecture Discussion'
300
- entity_anchor: 'hca-compute-arch-thread'
299
+ display_name: 'Northwind Compute Architecture Discussion'
300
+ entity_anchor: 'northwind-compute-arch-thread'
301
301
  latest_csc_file: 'weekly/2026-05-25_email-csc.md'
302
302
  latest_csc_block_offset: 28
303
303
  last_touched: 2026-05-30T09:12:00Z
@@ -15,7 +15,7 @@ This file is the single source of truth for **which WorkIQ phrasings actually re
15
15
 
16
16
  ## The three rules
17
17
 
18
- 1. **Always name by display name.** Use the user-visible section name (e.g. `HCA`, `Architecture decisions`) and the user-visible notebook name (e.g. `IT Workspace`). Never reference internal identifiers (`wdsectionfileid`, `notebookId`, `oneNoteWebUrl`) in the **query body** — those are what you're trying to *extract*, not filter by.
18
+ 1. **Always name by display name.** Use the user-visible section name (e.g. `Northwind`, `Architecture decisions`) and the user-visible notebook name (e.g. `IT Workspace`). Never reference internal identifiers (`wdsectionfileid`, `notebookId`, `oneNoteWebUrl`) in the **query body** — those are what you're trying to *extract*, not filter by.
19
19
  2. **Keep scope narrow and singular.** One section per query. One notebook per query. No enumeration verbs (`list`, `enumerate`, `all`, `every`, `show me`).
20
20
  3. **Never ask for IDs as a top-level question.** WorkIQ has no enumeration endpoint for notebook/section inventories — it routes such queries to Graph Explorer instructions (proven 2026-05-26). Always ask for *content* and let the GUIDs fall out of the URL fragments in the response.
21
21
 
@@ -73,7 +73,7 @@ If any of those are false → continue to use WorkIQ + the retry registry. Do no
73
73
  ## Empirical record
74
74
 
75
75
  - **2026-05-26** (user-observed) — `workiq ask -q "List my OneNote notebooks..."` punted to Graph Explorer instructions. Notebook ID enumeration is not a WorkIQ surface. Bug filed against our own setup/SKILL.md line 142 + bootstrap-project/SKILL.md line 162. v4.7.3 removes those queries.
76
- - **2026-05-14** (HCA) — natural-language section query by display name returned a populated page table; `wdsectionfileid` + `wdpartid` GUIDs were extracted from URL fragments and persisted. Same approach worked across multiple sections.
77
- - **2026-05-13/14** (HCA, AGCO) — `wdsectionfileid = <id>` filter syntax routed WorkIQ to summary mode every time. Refusal text: "OneNote internal properties not exposed as searchable fields."
76
+ - **2026-05-14** (Northwind) — natural-language section query by display name returned a populated page table; `wdsectionfileid` + `wdpartid` GUIDs were extracted from URL fragments and persisted. Same approach worked across multiple sections.
77
+ - **2026-05-13/14** (Northwind, Fabrikam) — `wdsectionfileid = <id>` filter syntax routed WorkIQ to summary mode every time. Refusal text: "OneNote internal properties not exposed as searchable fields."
78
78
 
79
79
  Append new entries here every time a phrasing is empirically validated or invalidated. This is the doctrinal source — `plugin/learnings/onenote.md` is the narrative version.
@@ -232,7 +232,7 @@ WorkIQ returns OneNote content in three distinct tiers. Each tier is a different
232
232
  |---|---|---|---|
233
233
  | **A. Enumeration** | titles + `wdpartid` + `wdsectionfileid` + last-modified + author + deep-link per page | YES — all pages, one call | bootstrap discovery; mutable hints |
234
234
  | **B. Search snippet** | ~500-char Graph-search snippet per page (verbatim from search index) | YES — all pages, one call | quick coverage scan; NOT verbatim body substitute |
235
- | **C. Full verbatim body** | full page text, every paragraph, every table | **NO — ONE page per call**; bulk request is refused with `combined content size … exceeds the maximum response payload that Copilot can safely render in-chat` (HCA evidence 2026-05-13 request-id `fdbf3290-649d-4066-84ea-ceab678697ed`) | snapshot/ verbatim per `pull-onenote` |
235
+ | **C. Full verbatim body** | full page text, every paragraph, every table | **NO — ONE page per call**; bulk request is refused with `combined content size … exceeds the maximum response payload that Copilot can safely render in-chat` (Northwind evidence 2026-05-13 request-id `fdbf3290-649d-4066-84ea-ceab678697ed`) | snapshot/ verbatim per `pull-onenote` |
236
236
 
237
237
  **DO NOT** ask WorkIQ for "all pages' full bodies in one call." That's the defect signature — it silently degrades to tier A+B and the skill thinks verbatim is unavailable.
238
238