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
@@ -14,7 +14,7 @@ Newest on top. Format defined in [`README.md`](./README.md).
14
14
 
15
15
  **Doctrine impact**: `plugin/skills/pull-ado/SKILL.md` — added explicit `$top=200` to the per-WI pull pseudocode (v3.7.6).
16
16
 
17
- **Discovered during**: `HCA / pull-ado` — engagement-96944 + child 96571 both got 0 updates on first pull.
17
+ **Discovered during**: `Northwind / pull-ado` — engagement-96944 + child 96571 both got 0 updates on first pull.
18
18
 
19
19
  ---
20
20
 
@@ -28,7 +28,7 @@ Newest on top. Format defined in [`README.md`](./README.md).
28
28
 
29
29
  **Doctrine impact**: `plugin/skills/pull-ado/SKILL.md` — removed the custom-field clause from the resolution-order template (v3.7.6).
30
30
 
31
- **Discovered during**: `HCA / pull-ado`.
31
+ **Discovered during**: `Northwind / pull-ado`.
32
32
 
33
33
  ---
34
34
 
@@ -42,4 +42,4 @@ Newest on top. Format defined in [`README.md`](./README.md).
42
42
 
43
43
  **Doctrine impact**: register-only — TODO promote to a `powershell-quirks.instructions.md` if it bites a second time.
44
44
 
45
- **Discovered during**: `HCA / pull-ado` per-WI pull script.
45
+ **Discovered during**: `Northwind / pull-ado` per-WI pull script.
@@ -7,9 +7,9 @@ Newest on top. Format defined in [`README.md`](./README.md).
7
7
  ## 2026-05-18 — Bootstrap declared `crm.disabled: true` from a shallow probe; live REST resolved instantly
8
8
 
9
9
  ### What happened
10
- John Deere bootstrap (kushi v3.10.x, 2026-05-18 morning) wrote `boundaries.crm.disabled: true, reason: 'no-crm-record-discovered-during-bootstrap-2026-05-18'` to `John Deere/integrations.yml`. As a result, `pull-crm` was never dispatched on bootstrap or on later refreshes, the JD `Evidence/ushak/crm/` folder stayed empty, and the user asked "why is there nothing in CRM?" the same day.
10
+ Acme bootstrap (kushi v3.10.x, 2026-05-18 morning) wrote `boundaries.crm.disabled: true, reason: 'no-crm-record-discovered-during-bootstrap-2026-05-18'` to `Acme/integrations.yml`. As a result, `pull-crm` was never dispatched on bootstrap or on later refreshes, the JD `Evidence/ushak/crm/` folder stayed empty, and the user asked "why is there nothing in CRM?" the same day.
11
11
 
12
- A live Dataverse REST probe afternoon of 2026-05-18 — `GET /new_frontierengineeringtriages?$filter=contains(new_title,'Deere')` — returned **1 exact match in <1s**: `FE-2026-001791 — John Deere Dealer Operations (JDDO) Platform Integration Improvement`, status `4 - Technical Assessment`, customer `DEERE COMPANY`. The accounts-fallback (Step 2) also resolved cleanly (3 Deere-named accounts; `DEERE COMPANY` linked to the same FE record).
12
+ A live Dataverse REST probe afternoon of 2026-05-18 — `GET /new_frontierengineeringtriages?$filter=contains(new_title,'Deere')` — returned **1 exact match in <1s**: `FE-2026-001791 — Acme Dealer Operations (JDDO) Platform Integration Improvement`, status `4 - Technical Assessment`, customer `DEERE COMPANY`. The accounts-fallback (Step 2) also resolved cleanly (3 Deere-named accounts; `DEERE COMPANY` linked to the same FE record).
13
13
 
14
14
  ### Why this was a defect
15
15
  The pull-crm SKILL `Resolution order` section already documented the 4-step sequence (title → account → recent-slice → ask) — but bootstrap was not actually executing it. It appears bootstrap relied on a WorkIQ-only / metadata-only probe that didn't reach Dataverse, then silently wrote `disabled: true`. That is the worst possible disposition: it pretends there is no CRM record, hides the failure from future refreshes, and the project loses CRM evidence entirely.
@@ -45,13 +45,13 @@ Both with the formatted-value Prefer header. Merge in code.
45
45
 
46
46
  **Doctrine impact**: `plugin/skills/pull-crm/SKILL.md` — replaced the single `$expand=Annotations` template with the two-request pattern (v3.7.6). Marked the expand pattern OK only for `incident`/`account`/`contact`/`opportunity` and other OOB entities.
47
47
 
48
- **Discovered during**: `HCA / pull-crm` — record `e561b31e-...` returned 0 annotations on the expand call; the separate-filter call returned 24.
48
+ **Discovered during**: `Northwind / pull-crm` — record `e561b31e-...` returned 0 annotations on the expand call; the separate-filter call returned 24.
49
49
 
50
50
  ---
51
51
 
52
52
  ### 2026-05-13 — FDE intake records live in `iscrm.crm.dynamics.com`, not the global default `microsoftit.crm.dynamics.com`
53
53
 
54
- **Symptom**: HCA record search via the global `.project-evidence/crm/config.yml` (`environment_url: microsoftit.crm.dynamics.com`, `entity_set: msdyn_engagements`) returned 0 hits. The record exists.
54
+ **Symptom**: Northwind record search via the global `.project-evidence/crm/config.yml` (`environment_url: microsoftit.crm.dynamics.com`, `entity_set: msdyn_engagements`) returned 0 hits. The record exists.
55
55
 
56
56
  **Root cause**: Two distinct CRM environments are in play for IS:
57
57
  - `microsoftit.crm.dynamics.com` / `msdyn_engagements` — generic IS engagement entity.
@@ -75,7 +75,7 @@ Resolution order: project override > global default. Detect FDE-intake by reques
75
75
  - `plugin/skills/bootstrap-project/SKILL.md` — when seeding `integrations.yml`, ask the user about FDE intake and pre-fill the override block.
76
76
  - `plugin/templates/init/integrations.template.yml` — added commented-out override block.
77
77
 
78
- **Discovered during**: `HCA / pull-crm`.
78
+ **Discovered during**: `Northwind / pull-crm`.
79
79
 
80
80
  ---
81
81
 
@@ -93,4 +93,4 @@ Then read formatted values from `<field>@OData.Community.Display.V1.FormattedVal
93
93
 
94
94
  **Doctrine impact**: Already in `plugin/skills/pull-crm/SKILL.md` since v3.7.4. Reaffirmed in v3.7.6 with a worked example.
95
95
 
96
- **Discovered during**: `HCA / pull-crm` — initial run forgot the header and lookups came back as raw GUIDs.
96
+ **Discovered during**: `Northwind / pull-crm` — initial run forgot the header and lookups came back as raw GUIDs.
@@ -4,9 +4,49 @@ Newest on top. Format defined in [`README.md`](./README.md). Use this file when
4
4
 
5
5
  ---
6
6
 
7
+ ### 2026-05-29 — `@kushi bootstrap` silently no-ops when `.kushi/` is missing in the repo
8
+
9
+ **Symptom**: User runs `npx kushi-agents@latest --all-hosts --profile full` (host install only — installs the agent skill into `~/.copilot/m-skills/` and `~/.vscode/chat/skills/`). Then opens a target repo (e.g. `kushi-wp/`), types `@kushi bootstrap <project>` in chat. The agent acknowledges and reports success, but **nothing is created in the project folder**. No error surfaced to the user.
10
+
11
+ **Root cause**: `--all-hosts` (and `--clawpilot` / `--vscode`) are **host installs** — they only place the skill into the user-global skill directory. They do NOT create `.kushi/` in the current working directory. The `bootstrap-project` skill assumes `.kushi/` already exists (it reads user config, alias, engagement-root path from `.kushi/config/user/project-evidence.yml`). With no `.kushi/`, the skill runs but has no alias to write under, so `bootstrap.mjs --project <P> --alias <A>` is never called with a valid alias and the LLM happily reports "done" with an empty `created[]` list. Two install modes are not adequately distinguished in onboarding — users (and the agent) conflate "the skill is installed" with "the repo is wired up".
12
+
13
+ **Fix / workaround** (immediate, doctrinal — no code change required):
14
+
15
+ 1. **`bootstrap-project` MUST preflight `.kushi/` presence** before any other work. If absent, the skill MUST refuse to proceed and emit this exact remediation:
16
+
17
+ ```
18
+ ⚠️ No `.kushi/` directory found in <cwd>.
19
+
20
+ Kushi needs a workspace install in this repo before `bootstrap` can run.
21
+
22
+ Run this in a terminal at the repo root:
23
+
24
+ npx kushi-agents@latest --profile full
25
+
26
+ Then re-issue `bootstrap <project>`.
27
+
28
+ Why: `--all-hosts` / `--clawpilot` / `--vscode` install the agent SKILL into your
29
+ user profile (global). They do NOT touch the current repo. The workspace install
30
+ (default, no host flag) creates `.kushi/` here so the agent has a place to write
31
+ per-project config, hooks, and the per-user alias used by Evidence/<alias>/.
32
+ ```
33
+
34
+ 2. **Install docs MUST lead with the two-mode distinction** (host vs workspace) before any flag table. Cover the exact "ran `--all-hosts` and nothing appeared" symptom in a Symptom→Fix callout. Already in place at `docs/getting-started/install.md` § "Pick the install mode first" (2026-05-29).
35
+
36
+ 3. **The agent skill (`@kushi` / `agents/kushi.agent.md`) MUST also preflight** — even if the user issues `bootstrap` without first invoking the `bootstrap-project` skill explicitly, the agent should refuse and surface the same remediation, not happily orchestrate downstream skills against a non-existent `.kushi/`.
37
+
38
+ **Doctrine impact**:
39
+ - New required preflight in `bootstrap-project/SKILL.md` → "Preflight: .kushi/ presence".
40
+ - Future enhancement candidate (next minor): `npx kushi-agents@latest --workspace-init` shortcut that explicitly only does the `.kushi/` scaffold, plus `bootstrap.mjs` should accept `--scaffold-kushi-dir` so the agent can self-heal with user consent.
41
+ - Self-check probe candidate (D-tier): when run inside a project repo, warn if `.kushi/` is missing AND `.copilot/m-skills/kushi/` or `.vscode/chat/skills/kushi/` is present (asymmetric install).
42
+
43
+ **Discovered during**: User session — Acme bootstrap in `kushi-wp/` (2026-05-29).
44
+
45
+ ---
46
+
7
47
  ### 2026-05-13 — Two CRM environments coexist for IS (microsoftit vs iscrm)
8
48
 
9
- **Symptom**: Skills assumed a single global CRM env. FDE-intake projects (HCA) live in a different env from generic IS engagements.
49
+ **Symptom**: Skills assumed a single global CRM env. FDE-intake projects (Northwind) live in a different env from generic IS engagements.
10
50
 
11
51
  **Root cause**: Org-level split — see [`crm.md`](./crm.md) for the full entry.
12
52
 
@@ -14,13 +54,13 @@ Newest on top. Format defined in [`README.md`](./README.md). Use this file when
14
54
 
15
55
  **Doctrine impact**: tracked in `crm.md` and `pull-crm/SKILL.md`.
16
56
 
17
- **Discovered during**: `HCA / pull-crm`.
57
+ **Discovered during**: `Northwind / pull-crm`.
18
58
 
19
59
  ---
20
60
 
21
61
  ### 2026-05-13 — Mutable hint cache vs project integrations.yml: write to BOTH
22
62
 
23
- **Symptom**: Manual HCA refresh pinned resolved IDs only into `<project>/integrations.yml`. The cross-skill mutable cache `<engagement-root>/.project-evidence/m365/m365-mutable.json` was not touched. Next-run fast-path won't fire for sibling skills that read the mutable cache.
63
+ **Symptom**: Manual Northwind refresh pinned resolved IDs only into `<project>/integrations.yml`. The cross-skill mutable cache `<engagement-root>/.project-evidence/m365/m365-mutable.json` was not touched. Next-run fast-path won't fire for sibling skills that read the mutable cache.
24
64
 
25
65
  **Root cause**: `side-by-side-config.instructions.md` says to upsert mutable hints during the run, but the rule wasn't enforced — and skill SKILL.md files mention it inconsistently.
26
66
 
@@ -33,4 +73,4 @@ Newest on top. Format defined in [`README.md`](./README.md). Use this file when
33
73
  - All `pull-*` SKILL.md files — each pull skill's "Mutable hints to upsert" section now explicitly lists both files (v3.7.6).
34
74
  - `plugin/skills/self-check/run.ps1` — new D8 rule: warn if `<project>/integrations.yml` has resolved `ado.engagement_id` or `crm.record_id` but `m365-mutable.json` lacks the matching `knownSections.<project>` entry.
35
75
 
36
- **Discovered during**: `HCA / pull-crm + pull-ado` — user asked "did you make sure you updated the config files for all these to be able to do better next time".
76
+ **Discovered during**: `Northwind / pull-crm + pull-ado` — user asked "did you make sure you updated the config files for all these to be able to do better next time".
@@ -4,12 +4,12 @@ Newest on top. Format defined in [`README.md`](./README.md).
4
4
 
5
5
  ## 2026-05-18 — `pull-email` rewritten to WorkIQ-ONLY (kushi v3.11.1); `m365_get_email` / `m365_search_emails` / Graph REST FORBIDDEN
6
6
 
7
- **What happened.** During John Deere bootstrap (2026-05-18), email evidence was missing entirely. Root cause: prior pull-email SKILL v2.2.0 listed `m365_get_email` + `m365_search_emails` as the **preferred** body-fetch path with WorkIQ as fallback. In this workspace those host tools have a near-100% failure rate (Tool execution failed / 401 / empty payloads), so pull-email runs gave up before reaching WorkIQ.
7
+ **What happened.** During Acme bootstrap (2026-05-18), email evidence was missing entirely. Root cause: prior pull-email SKILL v2.2.0 listed `m365_get_email` + `m365_search_emails` as the **preferred** body-fetch path with WorkIQ as fallback. In this workspace those host tools have a near-100% failure rate (Tool execution failed / 401 / empty payloads), so pull-email runs gave up before reaching WorkIQ.
8
8
 
9
9
  **Fix.**
10
- 1. Ran the WorkIQ root-scope keyword query for JD (aliases: John Deere, Deere, JDDO, JDIS, deere.com, johndeere.com; window 2026-04-01 → 2026-05-18). 3 emails returned first try (FDE Intake thread, folder `109. John Deere`), request-ids `941b2dda-3db2-4735-8e4f-1974f6436b3e` and `e26a14ed-e592-4323-8de7-7f197a047318`.
11
- 2. Wrote durable JD artifacts under `John Deere/email-context/`: `index.md`, `2026-05-18-1100-email-summary.md`, `current-state.md`.
12
- 3. Upserted `m365Mutable.knownSections."John Deere".emailContext.folder = "109. John Deere"` with `confidence: high` so next run uses the folder-scoped fast path.
10
+ 1. Ran the WorkIQ root-scope keyword query for JD (aliases: Acme, Deere, JDDO, JDIS, deere.com, johndeere.com; window 2026-04-01 → 2026-05-18). 3 emails returned first try (FDE Intake thread, folder `109. Acme`), request-ids `941b2dda-3db2-4735-8e4f-1974f6436b3e` and `e26a14ed-e592-4323-8de7-7f197a047318`.
11
+ 2. Wrote durable JD artifacts under `Acme/email-context/`: `index.md`, `2026-05-18-1100-email-summary.md`, `current-state.md`.
12
+ 3. Upserted `m365Mutable.knownSections."Acme".emailContext.folder = "109. Acme"` with `confidence: high` so next run uses the folder-scoped fast path.
13
13
  4. Bumped `pull-email` SKILL v2.2.0 → v2.3.0 with HARD `workiq-only` contract:
14
14
  - Front blockquote cites `workiq-only.instructions.md` (v3.11.0).
15
15
  - Step B "Per-message body fetch" rewritten — only WorkIQ allowed.
@@ -5,7 +5,7 @@ Newest on top. Format defined in [`README.md`](./README.md).
5
5
  ## 2026-05-18 — Meetings need a verbatim/ folder because meetings EXPIRE
6
6
 
7
7
  ### What happened
8
- During John Deere bootstrap on 2026-05-18, `pull-meetings` produced the FDE Intake (2026-05-13) curated 7-section block in `Evidence/ushak/meetings/snapshot/FDE-Intake-John-Deere-2026-05-13.md`. Source was reconstructed from chat (22 messages) because `m365_get_transcript` returned "Tool execution failed" and `m365_get_facilitator_notes` was unavailable. A sibling tool (running independently) successfully pulled a much richer WorkIQ-derived summary AND captured the raw recording URL, AND noted in its output that the recording is at `https://microsoft-my.sharepoint-df.com/.../Recordings/FDE%20Intake%20-%20John%20Deere-20260513_123238-Meeting%20Recording.mp4` — a URL that will be purged when tenant retention kicks in (default ~60 days).
8
+ During Acme bootstrap on 2026-05-18, `pull-meetings` produced the FDE Intake (2026-05-13) curated 7-section block in `Evidence/ushak/meetings/snapshot/FDE-Intake-John-Deere-2026-05-13.md`. Source was reconstructed from chat (22 messages) because `m365_get_transcript` returned "Tool execution failed" and `m365_get_facilitator_notes` was unavailable. A sibling tool (running independently) successfully pulled a much richer WorkIQ-derived summary AND captured the raw recording URL, AND noted in its output that the recording is at `https://microsoft-my.sharepoint-df.com/.../Recordings/FDE%20Intake%20-%20John%20Deere-20260513_123238-Meeting%20Recording.mp4` — a URL that will be purged when tenant retention kicks in (default ~60 days).
9
9
 
10
10
  ### Why this was a defect
11
11
  The curated snapshot, however rich, is a SUMMARY. The 22 raw chat messages, the recording URL, the WorkIQ-returned Copilot summary text, and any shared chat attachments are the **source-of-truth verbatim**. Kushi was not persisting any of them as immutable raw artifacts; the snapshot file is curated text that cannot be re-derived once the recording disappears. Every other evidence class (email, OneNote, SharePoint, CRM, ADO) persists in its source system for years — meetings are the ONE class where the source expires.
@@ -22,7 +22,7 @@ If the user had asked "what exactly did Sachin say in the chat?" two months from
22
22
  - `self-check/run.ps1` adds deep-mode rule D13 (a/b/c): walks stream/*.md, warns if (a) verbatim/<dir> missing, (b) verbatim/<dir> empty, (c) verbatim/<dir> has chat but NO transcript-class file.
23
23
 
24
24
  ### Verification
25
- After this fix lands, John Deere FDE Intake was backfilled: `Evidence/ushak/meetings/verbatim/2026-05-13-1530_fde-intake-john-deere/` contains chat-messages.json (22 msgs), chat-messages.md (rendered), transcript-source.md (WorkIQ summary), recording-url.txt, coverage.md, captured-at.txt. Recording URL is now captured locally even though the file itself will eventually expire.
25
+ After this fix lands, Acme FDE Intake was backfilled: `Evidence/ushak/meetings/verbatim/2026-05-13-1530_fde-intake-acme/` contains chat-messages.json (22 msgs), chat-messages.md (rendered), transcript-source.md (WorkIQ summary), recording-url.txt, coverage.md, captured-at.txt. Recording URL is now captured locally even though the file itself will eventually expire.
26
26
 
27
27
  ### Source
28
28
  - User feedback 2026-05-18 ~09:30 EDT: "why is there no meetings transcripts for john deere" followed by paste of sibling tool's rich output and "for meetings alone, create a verbatim folder and put verbatims in it. Since meetings expire, this is required for meetings alone" and "make this true skill and so. not just one off".
@@ -11,7 +11,7 @@ Newest on top. Format defined in [`README.md`](./README.md).
11
11
  - `bootstrap-project/SKILL.md` line 162 was still emitting an enumeration query asking WorkIQ to return structured fields (`wdsectionfileid`, `wdsectiongroupid`, `wdsectiononenoteguid`, `parentReferenceId`) for any section "matching the name". That phrasing routes WorkIQ to summary mode (per 2026-05-13 finding) and triggers "OneNote internal properties not exposed as searchable fields" refusal.
12
12
  - `setup/SKILL.md` line 142 was emitting `"What is the OneNote notebook ID for the notebook named '<NAME>'..."` — WorkIQ has no notebook-inventory surface, so it punts to Graph (proven 2026-05-26 by user).
13
13
  - `m365-id-registry.instructions.md` line 124 anti-pattern already forbade exactly these query shapes — but the SKILLs that violate it predated the anti-pattern and never got cleaned up.
14
- - `pull-onenote/SKILL.md` v2.6.0 had Playwright as PRIMARY (from the v3.8.0 HCA pivot). User pointed out this is the wrong default: Playwright requires Edge + Conditional Access compliance + per-machine bootstrap + ~3-5 day cookie expiry — that's a lot of friction for a path that's only needed when WorkIQ's body-retrieval rate stays poor across multiple refreshes. Per-page retry registries already absorb WorkIQ non-determinism over time.
14
+ - `pull-onenote/SKILL.md` v2.6.0 had Playwright as PRIMARY (from the v3.8.0 Northwind pivot). User pointed out this is the wrong default: Playwright requires Edge + Conditional Access compliance + per-machine bootstrap + ~3-5 day cookie expiry — that's a lot of friction for a path that's only needed when WorkIQ's body-retrieval rate stays poor across multiple refreshes. Per-page retry registries already absorb WorkIQ non-determinism over time.
15
15
 
16
16
  **Fix (v4.7.3):**
17
17
 
@@ -33,7 +33,7 @@ Newest on top. Format defined in [`README.md`](./README.md).
33
33
 
34
34
  ## 2026-05-14 — Pre-flight gate: distinguish notebook-unavailable from auth-required
35
35
 
36
- **Trigger:** AGCO refresh, immediately after v3.10.2 (URL synthesis killed). Even with a freshly user-pasted `one_sectionWebUrl` and a valid Edge profile, the runner returned `auth-required`. Manual sanity-check: the user opened `https://onenote.cloud.microsoft/` directly in their browser and got the **"Sorry, we ran into a problem"** dialog at the notebook-list level — before they could even click into the AGCO section. So the runner couldn't possibly succeed; the failure was OneNote-for-Web side, not auth.
36
+ **Trigger:** Fabrikam refresh, immediately after v3.10.2 (URL synthesis killed). Even with a freshly user-pasted `one_sectionWebUrl` and a valid Edge profile, the runner returned `auth-required`. Manual sanity-check: the user opened `https://onenote.cloud.microsoft/` directly in their browser and got the **"Sorry, we ran into a problem"** dialog at the notebook-list level — before they could even click into the Fabrikam section. So the runner couldn't possibly succeed; the failure was OneNote-for-Web side, not auth.
37
37
 
38
38
  **Root cause classification was overloaded.** The runner only knew two end-states: "canvas frame attached → success" and "didn't attach → auth-required". But OneNote-for-Web has at least three failure surfaces:
39
39
  1. **Login redirect** (`login.microsoftonline.com`) — genuine auth-required.
@@ -50,16 +50,16 @@ Conflating #2 with #1 sends the operator down the wrong recovery path: re-bootst
50
50
 
51
51
  **Doctrinal lesson codified into `pull-onenote/SKILL.md` Pre-flight A.4:** the three-way classification IS the contract; the runner MUST distinguish all three end-states; auto-retry is allowed for `auth-required` (next refresh) but FORBIDDEN for `notebook-unavailable` — that one needs human/notebook-side recovery first.
52
52
 
53
- **Validation marker:** when AGCO's notebook becomes available again in OneNote-for-Web, re-run kushi pull and confirm the new runStatus values round-trip through to refresh-reports. (Pending — notebook still showing the dialog as of write time.)
53
+ **Validation marker:** when Fabrikam's notebook becomes available again in OneNote-for-Web, re-run kushi pull and confirm the new runStatus values round-trip through to refresh-reports. (Pending — notebook still showing the dialog as of write time.)
54
54
 
55
55
 
56
56
  ## 2026-05-14 — Conditional Access requires Edge; cookie domains don't transfer; URL must be canonical
57
57
 
58
- **Trigger:** Pulling AGCO OneNote evidence for the first time in this session. Bootstrap appeared to succeed (no errors), but every subsequent headless run returned `auth-required`. Re-bootstrapping multiple times did not help.
58
+ **Trigger:** Pulling Fabrikam OneNote evidence for the first time in this session. Bootstrap appeared to succeed (no errors), but every subsequent headless run returned `auth-required`. Re-bootstrapping multiple times did not help.
59
59
 
60
60
  **Three independent root causes had stacked, each masking the next:**
61
61
 
62
- 1. **Wrong URL formula (fixed in v3.10.0).** AGCO's pre-doctrine registry entry had a synthesized URL using `wd=target(/<name>/)` (no fileId, no pipe). The canonical formula is `wd=target(<sectionName>|<sectionFileId>/)`. Wrong formula → OneNote-for-Web silently shows "Sorry, we ran into a problem" — indistinguishable from auth failure to a headless runner. Fixed by `recapture-section-url.mjs` auto-heal from sibling registry entries (HCA shares the same notebook, so its `notebookSourceDoc` + `spoBaseUrl` were inherited).
62
+ 1. **Wrong URL formula (fixed in v3.10.0).** Fabrikam's pre-doctrine registry entry had a synthesized URL using `wd=target(/<name>/)` (no fileId, no pipe). The canonical formula is `wd=target(<sectionName>|<sectionFileId>/)`. Wrong formula → OneNote-for-Web silently shows "Sorry, we ran into a problem" — indistinguishable from auth failure to a headless runner. Fixed by `recapture-section-url.mjs` auto-heal from sibling registry entries (Northwind shares the same notebook, so its `notebookSourceDoc` + `spoBaseUrl` were inherited).
63
63
 
64
64
  2. **Cookie-domain isolation (fixed in v3.10.1).** Bootstrap was navigating only to `https://onenote.cloud.microsoft/`. But the canonical Doc.aspx URLs live on `https://microsoft-my.sharepoint-df.com/personal/<upn>/...`. These are SEPARATE cookie domains — signing into one does NOT authenticate the other. After `--bootstrap` succeeded, headless runs against the SPO URL still hit `login.microsoftonline.com` because SPO had no cookies. Fixed by making `--bootstrap` walk: `onenote.cloud.microsoft` → `microsoft-my.sharepoint.com` → `microsoft-my.sharepoint-df.com` in the same session, so cookies plant on all three.
65
65
 
@@ -73,7 +73,7 @@ Conflating #2 with #1 sends the operator down the wrong recovery path: re-bootst
73
73
 
74
74
  **The "auth-required" signal is overloaded.** It can mean: (a) genuine cookie expiry, (b) wrong URL formula returning OneNote's "Sorry" dialog, (c) cookies present for one domain but not the navigation target's domain, (d) Conditional Access blocking the browser channel. The runner cannot distinguish these — bootstrap-then-retest is the only protocol. v3.10.1 closes (b)/(c)/(d) as systemic failure modes; only (a) should remain after this release.
75
75
 
76
- **Validation:** AGCO bootstrap completed cleanly with Edge + dual-surface walk on 2026-05-14. Profile size shrank from 27MB (Chromium) to ~8MB (Edge, just cookies after fresh start). Sign-in walked through MFA on `onenote.cloud.microsoft` and silently SSO'd on the SPO hosts.
76
+ **Validation:** Fabrikam bootstrap completed cleanly with Edge + dual-surface walk on 2026-05-14. Profile size shrank from 27MB (Chromium) to ~8MB (Edge, just cookies after fresh start). Sign-in walked through MFA on `onenote.cloud.microsoft` and silently SSO'd on the SPO hosts.
77
77
 
78
78
 
79
79
  ## 2026-05-13 — WorkIQ has TWO answer modes; index field names are the contract
@@ -100,7 +100,7 @@ The first eight `pull-onenote` versions used prose phrasing (`"sectionFileId <id
100
100
 
101
101
  ## 2026-05-13 — WorkIQ summarization masquerades as captured bodies; never fabricate narrative
102
102
 
103
- **Trigger:** User said "onenote is still sparse, did you rerun or tighten" after the HCA refresh shipped 5 OneNote page snapshots that were each ~1.5K bytes. Inspection showed every page file had: header + `❌ Partial via WorkIQ — body not extractable` marker + a 3-paragraph **AI Narrative Summary inferred from adjacent emails and chat traffic** ("plausibly the engagement-level rollup page", "if Usha's backfill includes verbatim chat-summary…"). The narrative was speculation, not capture.
103
+ **Trigger:** User said "onenote is still sparse, did you rerun or tighten" after the Northwind refresh shipped 5 OneNote page snapshots that were each ~1.5K bytes. Inspection showed every page file had: header + `❌ Partial via WorkIQ — body not extractable` marker + a 3-paragraph **AI Narrative Summary inferred from adjacent emails and chat traffic** ("plausibly the engagement-level rollup page", "if Usha's backfill includes verbatim chat-summary…"). The narrative was speculation, not capture.
104
104
 
105
105
  **Root cause (skill-level):**
106
106
  - `pull-onenote/SKILL.md` v2.2.0 allowed snapshot files with a `page-body-unavailable` marker AND an AI Narrative Summary in the same file. The depth-bar said "AI Narrative Summary REQUIRED FIRST" without an exception for the unavailable case, so the producer satisfied the contract by inferring narrative from adjacent evidence.
@@ -113,18 +113,18 @@ The first eight `pull-onenote` versions used prose phrasing (`"sectionFileId <id
113
113
  4. `items_verbatim` added to run-log alongside `items_pulled` and `items_enumerated`. Run is classified `partial-bodies` when the verbatim ratio is < 0.5 — stops "5 page files written" from masquerading as "5 pages captured" in the per-user refresh report.
114
114
  5. `verbatim-by-default.instructions.md` adds anti-pattern #8: "Inferred narrative as substitute for body".
115
115
 
116
- **Recovery action for HCA (this turn):** the 5 existing HCA OneNote page files at `HCA\Evidence\ushak\onenote\snapshot\pages\` will be rewritten to the v2.3.0 shape (header + unavailable marker + paste-ask, no inferred narrative) and the user will be asked once at the end of the next refresh to paste the page bodies.
116
+ **Recovery action for Northwind (this turn):** the 5 existing Northwind OneNote page files at `Northwind\Evidence\ushak\onenote\snapshot\pages\` will be rewritten to the v2.3.0 shape (header + unavailable marker + paste-ask, no inferred narrative) and the user will be asked once at the end of the next refresh to paste the page bodies.
117
117
 
118
118
 
119
119
  ## 2026-05-14 — v3.7.8 retraction + v3.7.9 corrected doctrine
120
120
 
121
121
  **What v3.7.8 claimed (WRONG):** WorkIQ has a "search-index extractor" mode triggered by literal field names (`wdsectionfileid`, `wdpartid`) in the query body. Using these field names would return verbatim indexed bodies; using natural language would route to summary mode.
122
122
 
123
- **What was empirically proven against HCA on 2026-05-13/14:**
123
+ **What was empirically proven against Northwind on 2026-05-13/14:**
124
124
 
125
125
  1. WorkIQ does NOT honor `wdsectionfileid = <id>` as filter syntax — it routes to summary mode AND returns "OneNote internal properties not exposed as searchable fields" refusal text.
126
126
  2. The wdpartid GUIDs we observed in earlier runs were **URL fragments inside SharePoint Doc.aspx hyperlinks** that WorkIQ rendered as response footnotes — not search-index extractor outputs.
127
- 3. The natural-language WorkIQ pattern (query naming the section + notebook by display name and the page by quoted title) is the actual working pattern. It returned a real verbatim body for the HCA `4/3 - HCA with Jay and Martin` page.
127
+ 3. The natural-language WorkIQ pattern (query naming the section + notebook by display name and the page by quoted title) is the actual working pattern. It returned a real verbatim body for the Northwind `4/3 - Northwind with Jay and Martin` page.
128
128
  4. **Body retrieval is non-deterministic** — the same 4/3 page returned a verbatim body at 19:42 PDT and `BODY-NOT-EXPOSED` at 19:48 PDT, same query, no edits. The M365 search index's exposure of OneNote bodies oscillates over time.
129
129
  5. **The blocker for months was the WorkIQ EULA.** Without `workiq accept-eula`, every OneNote query silently returns nothing useful. This is a one-time setup step, not a per-call gate.
130
130
 
@@ -136,7 +136,7 @@ The first eight `pull-onenote` versions used prose phrasing (`"sectionFileId <id
136
136
  - Per-page retry registry: every page lives in `m365-mutable.json#knownSections.<projectKey>.one_pages` with `last_status` and `attempts`. Pages stuck at `BODY-NOT-EXPOSED` are retried on every refresh until they succeed or the user pastes.
137
137
  - Snapshot files carry yaml front-matter with the same fields, so refresh runs can read state from disk if the registry is unavailable.
138
138
 
139
- **HCA result (2026-05-14):** 18 pages enumerated. 1 captured verbatim (4/3). 15 pending retry (BODY-NOT-EXPOSED). 2 enumeration-only (will be probed in Step B on next refresh).
139
+ **Northwind result (2026-05-14):** 18 pages enumerated. 1 captured verbatim (4/3). 15 pending retry (BODY-NOT-EXPOSED). 2 enumeration-only (will be probed in Step B on next refresh).
140
140
 
141
141
  **Key lesson:** when a doctrine is grounded in pattern-matching against tool responses (e.g. "field names route to extractor"), validate it empirically against the live tool BEFORE shipping. The v3.7.8 doctrine was internally consistent and self-citing but never actually tested end-to-end — the 4/3 success that motivated v3.7.9 happened only after honestly retracting v3.7.8 and replicating the natural-language WorkIQ workflow step-by-step.
142
142
 
@@ -145,7 +145,7 @@ The first eight `pull-onenote` versions used prose phrasing (`"sectionFileId <id
145
145
 
146
146
  **What v3.7.9 (yesterday) shipped:** WorkIQ natural-language by display name + per-page retry registry. Validated 1-page capture and codified as primary path.
147
147
 
148
- **What we proved against HCA on 2026-05-14:** the v3.7.9 capture-rate is structurally too low for a Mon-9am scheduled refresh. WorkIQ body retrieval is non-deterministic (same page flips exposed/not exposed across queries minutes apart), and across 18 enumerated HCA pages WorkIQ returned exactly 1 verbatim body. A Monday-9am run that captures 1 page out of 16-18 is not a refresh, it's a coincidence.
148
+ **What we proved against Northwind on 2026-05-14:** the v3.7.9 capture-rate is structurally too low for a Mon-9am scheduled refresh. WorkIQ body retrieval is non-deterministic (same page flips exposed/not exposed across queries minutes apart), and across 18 enumerated Northwind pages WorkIQ returned exactly 1 verbatim body. A Monday-9am run that captures 1 page out of 16-18 is not a refresh, it's a coincidence.
149
149
 
150
150
  **The pivot — browser-scrape via OneNote-for-Web with persisted Playwright profile:**
151
151
 
@@ -155,7 +155,7 @@ The first eight `pull-onenote` versions used prose phrasing (`"sectionFileId <id
155
155
  - Enumerated pages from the accessibility tree: every page has `aria-label="<title>, page X of N, Page. Select to open page contents."` — gives ordered, complete, authoritative page list.
156
156
  - Clicked each page in the rail, waited 2.5s for canvas to settle, read `document.querySelector('#PageContentWrapper').innerText` — got full verbatim body.
157
157
 
158
- **Result:** 16/16 HCA pages captured (~120KB total) in ~50 seconds. Compare to WorkIQ's 1/18 in 30+ minutes of probing. Includes pages WorkIQ flagged BODY-NOT-EXPOSED on previous attempts, proving the bodies were always retrievable — WorkIQ just couldn't reach them.
158
+ **Result:** 16/16 Northwind pages captured (~120KB total) in ~50 seconds. Compare to WorkIQ's 1/18 in 30+ minutes of probing. Includes pages WorkIQ flagged BODY-NOT-EXPOSED on previous attempts, proving the bodies were always retrievable — WorkIQ just couldn't reach them.
159
159
 
160
160
  **Architectural decision:**
161
161
 
@@ -176,7 +176,7 @@ The first eight `pull-onenote` versions used prose phrasing (`"sectionFileId <id
176
176
 
177
177
  ## 2026-05-18 — Bare runner JSON + hand-rolled file writes = layout violation + UTF-8 corruption (v3.11.5)
178
178
 
179
- **Trigger (John Deere):** After fixing the bootstrap sign-in and single-page regex bugs, the JD scrape succeeded — but the agent wrote a single `section.md` at `Evidence/ushak/onenote/snapshot/section.md` instead of the doctrine-mandated `snapshot/pages/<safe-title>.md`. The PowerShell-piped UTF-8 also corrupted every NBSP to `┬á` (1825 occurrences in a 13 KB body). Neither defect was caught at the runner level — both were the driver's responsibility, and the driver was the agent improvising.
179
+ **Trigger (Acme):** After fixing the bootstrap sign-in and single-page regex bugs, the JD scrape succeeded — but the agent wrote a single `section.md` at `Evidence/ushak/onenote/snapshot/section.md` instead of the doctrine-mandated `snapshot/pages/<safe-title>.md`. The PowerShell-piped UTF-8 also corrupted every NBSP to `┬á` (1825 occurrences in a 13 KB body). Neither defect was caught at the runner level — both were the driver's responsibility, and the driver was the agent improvising.
180
180
 
181
181
  **Root cause: the runner JSON contract has no automated writer.** `runner.mjs` is silent about the canonical snapshot layout from `snapshot-vs-stream.instructions.md` (`snapshot/pages/<safe-title>.md`, one file per page, with the full front-matter schema). Any driver — PowerShell, Clawpilot, future automation — has to re-derive: which directory, what filename, what front-matter keys, what registry shape, what run-report format. That's where things go wrong, every time.
182
182
 
@@ -201,7 +201,7 @@ Additionally, PowerShell's default `Out-File -Encoding utf8` writes UTF-8-BOM an
201
201
 
202
202
  ## 2026-05-18 — Bootstrap sign-in skipped + single-page section regex (v3.11.2 / v3.11.3)
203
203
 
204
- **Triggers (John Deere refresh):**
204
+ **Triggers (Acme refresh):**
205
205
 
206
206
  1. Re-bootstrap appeared to succeed but every subsequent scrape returned `auth-required`.
207
207
  2. After fixing #1, scrape preflight passed and the canvas frame attached, but page enumeration timed out — even with a 3-minute window — for a section with only one page.
@@ -209,7 +209,7 @@ Additionally, PowerShell's default `Out-File -Encoding utf8` writes UTF-8-BOM an
209
209
  **Root causes:**
210
210
 
211
211
  1. `--bootstrap` used `page.waitForURL(/onenote\.cloud\.microsoft|m365\.cloud\.microsoft/)` which **matches instantly** because we just navigated to `https://onenote.cloud.microsoft/`. The 5-min wait collapsed to ~0 and we seeded SharePoint cookies before the user could even type their email. Logs showed `Step 1/2: Sign in…` immediately followed by `Step 2/2: Seeding SharePoint cookies` with no real wait between them. Subsequent preflight failed because OneNote-for-Web cookies (different from the SPO cookies) were never minted.
212
- 2. The page-rail enumerator regex only accepted multi-page aria labels (`, page N of M, Page.`). **Single-page sections** (e.g. John Deere's section with just `3/13 - account team`) render as `<title>, Page. Selected.` — the regex never matched and `waitForFunction` hung until timeout, producing `pages: []` with error `frame.waitForFunction: Timeout`.
212
+ 2. The page-rail enumerator regex only accepted multi-page aria labels (`, page N of M, Page.`). **Single-page sections** (e.g. Acme's section with just `3/13 - account team`) render as `<title>, Page. Selected.` — the regex never matched and `waitForFunction` hung until timeout, producing `pages: []` with error `frame.waitForFunction: Timeout`.
213
213
 
214
214
  **Fixes:**
215
215
 
@@ -219,21 +219,21 @@ Additionally, PowerShell's default `Out-File -Encoding utf8` writes UTF-8-BOM an
219
219
  - single-page: `<title>, Page. Selected.` → emitted as `{ pos: 1, total: 1 }`
220
220
  - dedup via `seen` set so a page matched by both rules isn't double-counted.
221
221
 
222
- **Validation:** JD `John Deere.one` captured end-to-end on 2026-05-18 — 1/1 pages, 13 KB verbatim body for `3/13 - account team` (Black Box → Dual Write FDE intake meeting). Snapshot at `John Deere/Evidence/ushak/onenote/snapshot/section.md`.
222
+ **Validation:** JD `Acme.one` captured end-to-end on 2026-05-18 — 1/1 pages, 13 KB verbatim body for `3/13 - account team` (Black Box → Dual Write FDE intake meeting). Snapshot at `Acme/Evidence/ushak/onenote/snapshot/section.md`.
223
223
 
224
224
  **Doctrinal lesson:** any `waitForURL` against a URL we just navigated to is a no-op — must wait for a **post-auth UI signal** (chrome that only renders after token exchange). Same anti-pattern would apply to any future bootstrap (SharePoint, Loop, M365 admin, etc.). And: any aria-label-driven enumerator must handle the **N=1 special-case format** for that UI surface, not assume the multi-element format applies universally.
225
225
 
226
226
 
227
227
  ## 2026-05-18 — WorkIQ OneNote three-tier output codified (kushi v3.11.1)
228
228
 
229
- **What happened.** User pointed out that `hca-snip.txt` and `hca-onenote-raw.txt` (Scratchpad, 2026-05-13) exist as WorkIQ-derived OneNote evidence, contradicting the agent's earlier claim that "OneNote was unavailable" during JD bootstrap. Root cause: I had asked WorkIQ for "all 21 pages' full verbatim bodies in one call" — WorkIQ silently degraded to tier A (page enumeration) and tier B (search snippets) and returned an explicit note `combined content size … exceeds the maximum response payload that Copilot can safely render in-chat`. I read that as "OneNote unavailable" instead of "Tier C must be per-page."
229
+ **What happened.** User pointed out that `northwind-snip.txt` and `northwind-onenote-raw.txt` (Scratchpad, 2026-05-13) exist as WorkIQ-derived OneNote evidence, contradicting the agent's earlier claim that "OneNote was unavailable" during JD bootstrap. Root cause: I had asked WorkIQ for "all 21 pages' full verbatim bodies in one call" — WorkIQ silently degraded to tier A (page enumeration) and tier B (search snippets) and returned an explicit note `combined content size … exceeds the maximum response payload that Copilot can safely render in-chat`. I read that as "OneNote unavailable" instead of "Tier C must be per-page."
230
230
 
231
231
  **Empirical contract (now codified in `workiq-only.instructions.md`):**
232
232
 
233
233
  WorkIQ returns OneNote in THREE tiers:
234
234
 
235
- - **Tier A — Enumeration**: titles + wdpartid + wdsectionfileid + last-modified + author + deep-link. Bulk OK. (HCA evidence: request-ids `bc780473-66d7-4809-89dc-e910e4b8ced8`, `fdbf3290-649d-4066-84ea-ceab678697ed`.)
236
- - **Tier B — Search snippets**: ~500-char Graph search snippet per page, verbatim from search index. Bulk OK. (HCA evidence: request-ids `f3744946-5b22-4c09-96ac-714c8508d5f6`, `d93deb47-147b-4d19-8cd7-c0a0e2f76f30`.)
235
+ - **Tier A — Enumeration**: titles + wdpartid + wdsectionfileid + last-modified + author + deep-link. Bulk OK. (Northwind evidence: request-ids `bc780473-66d7-4809-89dc-e910e4b8ced8`, `fdbf3290-649d-4066-84ea-ceab678697ed`.)
236
+ - **Tier B — Search snippets**: ~500-char Graph search snippet per page, verbatim from search index. Bulk OK. (Northwind evidence: request-ids `f3744946-5b22-4c09-96ac-714c8508d5f6`, `d93deb47-147b-4d19-8cd7-c0a0e2f76f30`.)
237
237
  - **Tier C — Full verbatim body**: ONE page per call. Bulk refused.
238
238
 
239
239
  **Defect signature:** "give me full bodies of all pages in section X" prompt → response includes the phrase `combined content size … exceeds the maximum response payload` plus a tier-A inventory table. Misreading that as "OneNote unavailable" is the defect. Correct response: re-issue the per-page tier-C prompt (one wdpartid at a time).
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent, execute/runInTerminal, execute/getTe
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ${input:window:Optional window — last N days, since YYYY-MM-DD, or YYYY-MM-DD..YYYY-MM-DD (default 7 days)}
14
14
  ```
15
15
 
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent, execute/runInTerminal, 'github/*']
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /apply-ado
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ${input:question:Your question, e.g. ''what is the MACC?''}
14
14
  ```
15
15
 
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent, execute/runInTerminal, execute/getTe
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ${input:window:Optional initial pull window — last N days, since YYYY-MM-DD, or YYYY-MM-DD..YYYY-MM-DD (default 30 days)}
14
14
  ```
15
15
 
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent, execute/runInTerminal, execute/getTe
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ${input:window:Optional window — last N days, since YYYY-MM-DD, or YYYY-MM-DD..YYYY-MM-DD (default 7 days)}
14
14
  ```
15
15
 
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /dashboard
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: explain
3
3
  description: "Retrieve a previously taught fact / preference / pattern from .kushi/learnings/."
4
- argument-hint: "Topic. Example: 'explain HCA naming-convention'."
4
+ argument-hint: "Topic. Example: 'explain Northwind naming-convention'."
5
5
  agent: kushi
6
6
  tools: [search, read/readFile, agent]
7
7
  ---
@@ -9,7 +9,7 @@ tools: [search, read/readFile, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:topic:Topic, e.g. 'HCA naming-convention'}
12
+ ${input:topic:Topic, e.g. 'Northwind naming-convention'}
13
13
  ```
14
14
 
15
15
  # /explain
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /fde-intake
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ${input:shape:Optional report shape — weekly (default), short, long, fitness, or stage-readiness}
14
14
  ```
15
15
 
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /fde-triage
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /link-entities
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /lint
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: promote
3
3
  description: "Copy a project State page into the global wiki with identifier redaction + back-link + dual log."
4
- argument-hint: "Project + page. Example: 'promote HCA decisions/macc-terms'."
4
+ argument-hint: "Project + page. Example: 'promote Northwind decisions/macc-terms'."
5
5
  agent: kushi
6
6
  tools: [search, read/readFile, edit, agent]
7
7
  ---
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project_and_page:Project + relative State page, e.g. 'HCA decisions/macc-terms'}
12
+ ${input:project_and_page:Project + relative State page, e.g. 'Northwind decisions/macc-terms'}
13
13
  ```
14
14
 
15
15
  # /promote
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent, execute/runInTerminal, 'github/*']
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /propose-ado
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent, execute/runInTerminal, execute/getTe
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
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
14
  ```
15
15
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: schema-evolve
3
3
  description: "Migrate kushi.yaml + Evidence/ across schema versions. Idempotent + dry-run by default."
4
- argument-hint: "Project. Flags: --apply (real run), --to <version>. Example: 'schema-evolve HCA --apply'."
4
+ argument-hint: "Project. Flags: --apply (real run), --to <version>. Example: 'schema-evolve Northwind --apply'."
5
5
  agent: kushi
6
6
  tools: [search, read/readFile, edit, agent]
7
7
  ---
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project_and_flags:Project + flags, e.g. 'HCA' (dry-run), 'HCA --apply', 'HCA --to 5.2.0 --apply'}
12
+ ${input:project_and_flags:Project + flags, e.g. 'Northwind' (dry-run), 'Northwind --apply', 'Northwind --to 5.2.0 --apply'}
13
13
  ```
14
14
 
15
15
  # /schema-evolve
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /state
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /status
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: teach
3
3
  description: "Persist a reusable fact / preference / pattern under .kushi/learnings/."
4
- argument-hint: "Topic + body. Example: 'teach HCA naming-convention: services are kebab-case'."
4
+ argument-hint: "Topic + body. Example: 'teach Northwind naming-convention: services are kebab-case'."
5
5
  agent: kushi
6
6
  tools: [search, read/readFile, edit, agent]
7
7
  ---
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:topic_and_body:Topic + body, e.g. 'HCA naming-convention: services are kebab-case'}
12
+ ${input:topic_and_body:Topic + body, e.g. 'Northwind naming-convention: services are kebab-case'}
13
13
  ```
14
14
 
15
15
  # /teach
@@ -9,7 +9,7 @@ tools: [search, read/readFile, edit, agent]
9
9
  ## User Input
10
10
 
11
11
  ```text
12
- ${input:project:Project name, e.g. HCA}
12
+ ${input:project:Project name, e.g. Northwind}
13
13
  ```
14
14
 
15
15
  # /tour
@@ -46,7 +46,7 @@ Recency order (most authoritative → least):
46
46
  Format:
47
47
 
48
48
  ```markdown
49
- The stage is **3 — Triage Approved** [source: ushak/crm/snapshot/AGCO-eng.md · 2026-05-08].
49
+ The stage is **3 — Triage Approved** [source: ushak/crm/snapshot/Fabrikam-eng.md · 2026-05-08].
50
50
 
51
51
  > Older signal superseded: CRM note from 2026-04-12 said "Stage 2 — In Triage" — superseded by [source: ushak/meetings/stream/2026-05-04_meetings-stream.md · 2026-05-06 triage call decision].
52
52
  ```
@@ -75,7 +75,7 @@ Format:
75
75
 
76
76
  ```markdown
77
77
  MACC status: **Pending** (CRM field value — not yet customer-confirmed)
78
- [source: ushak/crm/snapshot/AGCO-eng.md field=macc_status · 2026-05-08]
78
+ [source: ushak/crm/snapshot/Fabrikam-eng.md field=macc_status · 2026-05-08]
79
79
 
80
80
  > ⚠️ VALIDATION WARNING — Rule 3: CRM field "macc_status" is "Pending" but the latest sponsor email [source: ushak/email/stream/2026-05-11_email-stream.md] says "MACC is locked at $4.2M, signed last Friday". Cross-check needed; the report cannot finalize MACC until the discrepancy is reconciled.
81
81
  ```