kushi-agents 5.6.3 → 5.6.5
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.
- package/README.md +1 -1
- package/bin/cli.mjs +1 -1
- package/package.json +1 -2
- package/plugin/agents/kushi.agent.md +1 -1
- package/plugin/instructions/ado-bootstrap-discovery.instructions.md +3 -3
- package/plugin/instructions/capture-learnings.instructions.md +1 -1
- package/plugin/instructions/crm-bootstrap-discovery.instructions.md +1 -1
- package/plugin/instructions/customer-hint-discovery.instructions.md +7 -7
- package/plugin/instructions/deferred-retry-on-workiq-fail.instructions.md +1 -1
- package/plugin/instructions/email-bootstrap-discovery.instructions.md +5 -5
- package/plugin/instructions/fallback-status-reporting.instructions.md +1 -1
- package/plugin/instructions/full-view-gate.instructions.md +2 -2
- package/plugin/instructions/identity-resolution.instructions.md +1 -1
- package/plugin/instructions/karpathy-state-layout.instructions.md +3 -3
- package/plugin/instructions/m365-id-registry.instructions.md +1 -1
- package/plugin/instructions/meetings-bootstrap-discovery.instructions.md +1 -1
- package/plugin/instructions/meetings-verbatim-required.instructions.md +3 -3
- package/plugin/instructions/multi-wiki-routing.instructions.md +1 -1
- package/plugin/instructions/no-hallucinated-success.instructions.md +45 -0
- package/plugin/instructions/onedrive-pin-policy.instructions.md +2 -2
- package/plugin/instructions/run-reports.instructions.md +5 -5
- package/plugin/instructions/schema-evolve.instructions.md +1 -1
- package/plugin/instructions/scope-boundaries.instructions.md +3 -3
- package/plugin/instructions/sharepoint-bootstrap-discovery.instructions.md +5 -5
- package/plugin/instructions/teams-bootstrap-discovery.instructions.md +2 -2
- package/plugin/instructions/tracking.instructions.md +6 -6
- package/plugin/instructions/weekly-csc.instructions.md +11 -11
- package/plugin/instructions/workiq-onenote-query-shape.instructions.md +3 -3
- package/plugin/instructions/workiq-only.instructions.md +1 -1
- package/plugin/learnings/ado.md +3 -3
- package/plugin/learnings/crm.md +6 -6
- package/plugin/learnings/cross-cutting.md +78 -4
- package/plugin/learnings/email.md +4 -4
- package/plugin/learnings/meetings.md +2 -2
- package/plugin/learnings/onenote.md +20 -20
- package/plugin/prompts/aggregate.prompt.md +1 -1
- package/plugin/prompts/apply-ado.prompt.md +1 -1
- package/plugin/prompts/ask.prompt.md +1 -1
- package/plugin/prompts/bootstrap.prompt.md +1 -1
- package/plugin/prompts/consolidate.prompt.md +1 -1
- package/plugin/prompts/dashboard.prompt.md +1 -1
- package/plugin/prompts/explain.prompt.md +2 -2
- package/plugin/prompts/fde-intake.prompt.md +1 -1
- package/plugin/prompts/fde-report.prompt.md +1 -1
- package/plugin/prompts/fde-triage.prompt.md +1 -1
- package/plugin/prompts/link-entities.prompt.md +1 -1
- package/plugin/prompts/lint.prompt.md +1 -1
- package/plugin/prompts/promote.prompt.md +2 -2
- package/plugin/prompts/propose-ado.prompt.md +1 -1
- package/plugin/prompts/refresh.prompt.md +1 -1
- package/plugin/prompts/schema-evolve.prompt.md +2 -2
- package/plugin/prompts/state.prompt.md +1 -1
- package/plugin/prompts/status.prompt.md +1 -1
- package/plugin/prompts/teach.prompt.md +2 -2
- package/plugin/prompts/tour.prompt.md +1 -1
- package/plugin/reference-packs/fde/report-doctrine.md +2 -2
- package/plugin/runners/package.json +11 -0
- package/plugin/runners/test/fixtures/email-abn-amro.json +1 -1
- package/plugin/runners/test/fixtures/refresh-dir/email.json +1 -1
- package/plugin/skills/ask-project/SKILL.md +12 -12
- package/plugin/skills/ask-project/evals/evals.json +1 -1
- package/plugin/skills/bootstrap-project/SKILL.md +22 -0
- package/plugin/skills/bootstrap-project/references/registry-persistence.md +1 -1
- package/plugin/skills/intro/SKILL.md +1 -1
- package/plugin/skills/link-entities/build-graph.ps1 +1 -1
- package/plugin/skills/pull-misc/runner.mjs +4 -4
- package/plugin/skills/pull-onenote/README.md +4 -4
- package/plugin/skills/pull-onenote/references/preflight.md +1 -1
- package/plugin/skills/pull-onenote/references/runtime-contract.md +6 -6
- package/plugin/skills/pull-onenote/runner.mjs +5 -5
- package/plugin/skills/pull-onenote/scripts/recapture-section-url.mjs +2 -2
- package/plugin/skills/refresh-project/SKILL.md +1 -0
- package/plugin/skills/schema-evolve/evals/evals.json +2 -2
- package/plugin/skills/self-check/SKILL.md +3 -2
- package/plugin/skills/self-check/run.ps1 +28 -1
- package/plugin/skills/setup/SKILL.md +1 -1
- package/plugin/skills/setup/references/onedrive-pin-sync.md +2 -2
- package/plugin/templates/init/m365-auth.template.json +1 -1
- package/plugin/templates/init/project-integrations.template.yml +1 -1
- package/plugin/templates/init/project-user-settings.template.yml +1 -1
- package/plugin/templates/state/00_overview.template.md +5 -5
- package/plugin/templates/state/01_decisions.template.md +5 -5
- package/plugin/templates/state/02_stakeholders.template.md +3 -3
- package/plugin/templates/state/03_architecture-and-solution.template.md +3 -3
- package/plugin/templates/state/04_workshops-and-key-meetings.template.md +6 -6
- package/plugin/templates/state/05_action-items.template.md +5 -5
- package/plugin/templates/state/06_risks-and-issues.template.md +4 -4
- package/plugin/templates/state/07_timeline-and-milestones.template.md +4 -4
- package/plugin/templates/state/08_artifacts-and-deliverables.template.md +4 -4
- package/plugin/templates/state/README.md +1 -1
- package/plugin/templates/weekly/meetings-csc.template.md +1 -1
- package/src/bootstrap-dryrun.integration.test.mjs +2 -2
- package/src/constants.mjs +1 -1
- package/src/install-runner-deps.mjs +57 -0
- package/src/main.mjs +7 -0
- package/src/multi-host.mjs +4 -0
- package/src/sanitize-workiq-input.test.mjs +1 -1
- 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 '
|
|
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
|
|
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
|
+
"version": "5.6.5",
|
|
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
|
|
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
|
|
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 "
|
|
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 (`
|
|
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. `
|
|
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
|
|
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
|
|
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. `
|
|
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 |
|
|
78
|
-
| teams |
|
|
79
|
-
| meetings |
|
|
80
|
-
| sharepoint |
|
|
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** ("
|
|
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:
|
|
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/
|
|
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. `
|
|
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/
|
|
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/
|
|
74
|
-
label: 'Inbox/
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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: ["[[
|
|
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
|
-
"
|
|
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. `
|
|
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
|
|
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: '
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "no-hallucinated-success"
|
|
3
|
+
version: "5.6.5"
|
|
4
|
+
applyTo: "**/plugin/skills/**/SKILL.md"
|
|
5
|
+
description: "Forbids the LLM from synthesizing 'success' messages when a runner / shell tool did not actually execute. Any verb that delegates to a runner MUST report the runner's literal stdout, or the literal error / exit code, or refuse with a remediation. No paraphrasing of expected outcomes. Filed after the 2026-05-29 GH Copilot Chat incident where @kushi bootstrap Northwind returned a confident success report without ever running plugin/runners/bootstrap.mjs."
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# No hallucinated success
|
|
9
|
+
|
|
10
|
+
## Why
|
|
11
|
+
|
|
12
|
+
On 2026-05-29 a user issued `@kushi bootstrap Northwind` in GH Copilot Chat. The agent responded with a well-formatted, paragraph-styled success report listing every file the runner *would* create. **No runner ever ran. No files were created.** The LLM fabricated the report by paraphrasing `bootstrap-project/SKILL.md`'s documented success shape.
|
|
13
|
+
|
|
14
|
+
This pattern is catastrophic for trust. The user has no immediate way to tell "ran successfully" from "lied confidently". Same risk exists for every `pull-*` / `refresh-project` / `aggregate-project` / `consolidate-evidence` skill that delegates to a runner.
|
|
15
|
+
|
|
16
|
+
## Hard rules
|
|
17
|
+
|
|
18
|
+
For every skill whose SKILL.md says it delegates to a `plugin/runners/<x>.mjs` (or any other shell tool):
|
|
19
|
+
|
|
20
|
+
1. **THE LLM MUST INVOKE THE RUNNER.** The skill is a thin pointer at deterministic code. Skipping the shell call and synthesizing the answer is **forbidden** under any circumstance — including when the LLM "is sure" what the output would be.
|
|
21
|
+
|
|
22
|
+
2. **THE LLM MUST PRESENT THE RUNNER'S LITERAL STDOUT.** When the runner emits JSON (`{ status, project, alias, created[], existed[], ... }`), the user-facing reply MUST quote that JSON verbatim (in a fenced block) before any paraphrase. The paraphrase, if any, MUST be derived from the JSON the runner actually emitted — not from the SKILL.md template.
|
|
23
|
+
|
|
24
|
+
3. **TOOL FAILURES MUST FAIL LOUDLY.** If the runner cannot be invoked (file not found, ENOENT, permission denied, missing dep, non-zero exit, timeout):
|
|
25
|
+
- Report the actual error: command, cwd, exit code, stderr (or first 20 lines of it).
|
|
26
|
+
- DO NOT pretend it succeeded. DO NOT skip to "Next steps".
|
|
27
|
+
- Offer concrete remediation (e.g. "runners/ missing → run `npx kushi-agents@latest --profile full --force` in this repo").
|
|
28
|
+
|
|
29
|
+
4. **NO TEMPLATE-DRIVEN SUCCESS COPY.** Phrases like "Bootstrap completed for X", "Created key project files: …", "Created key evidence folders: …" are forbidden UNLESS they are a direct paraphrase of a real runner stdout from the current turn. If the LLM finds itself reaching for the SKILL.md "what gets scaffolded" section to compose its reply, it has already failed this rule.
|
|
30
|
+
|
|
31
|
+
5. **WHEN IN DOUBT, RE-RUN.** Runners are idempotent (`existed[]` reports already-present paths and writes nothing). Re-invocation costs nothing. If the LLM is uncertain whether a previous tool call actually succeeded, the correct action is another invocation, not a confident-sounding summary.
|
|
32
|
+
|
|
33
|
+
## Required SKILL.md acknowledgment
|
|
34
|
+
|
|
35
|
+
Every SKILL.md that delegates to a runner MUST include this line in its "LLM responsibilities" section:
|
|
36
|
+
|
|
37
|
+
> **No hallucinated success.** Echo the runner's literal stdout JSON before any paraphrase. If the runner can't be invoked, surface the real error — never synthesize a success message from this SKILL.md's template. See `plugin/instructions/no-hallucinated-success.instructions.md`.
|
|
38
|
+
|
|
39
|
+
## Probe (self-check)
|
|
40
|
+
|
|
41
|
+
A self-check probe SHOULD scan every SKILL.md that mentions `plugin/runners/` and verify the acknowledgment line is present. Missing acknowledgment = self-check failure.
|
|
42
|
+
|
|
43
|
+
## Discovered
|
|
44
|
+
|
|
45
|
+
`@kushi bootstrap Northwind` in VS Code Chat / GH Copilot Chat, 2026-05-29. See `plugin/learnings/cross-cutting.md` § 2026-05-29 for the full incident.
|
|
@@ -93,9 +93,9 @@ Output:
|
|
|
93
93
|
|
|
94
94
|
```
|
|
95
95
|
🔧 Optimizing OneDrive cache for your engagement…
|
|
96
|
-
✅ Pinned (kept on device):
|
|
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):
|
|
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` (
|
|
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" (
|
|
74
|
-
- `learnings/ado.md` — "$top=500 exceeds permissible range on workItems updates endpoint" (
|
|
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
|
|
97
|
-
- Re-run with `force-refresh
|
|
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 '
|
|
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
|
-
- "
|
|
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:\\…\\
|
|
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\\
|
|
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 `
|
|
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/
|
|
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/
|
|
75
|
-
label: '
|
|
76
|
-
site_title: '
|
|
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 `
|
|
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 `
|
|
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:
|
|
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: `
|
|
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
|
-
- `
|
|
97
|
-
- `
|
|
98
|
-
- `
|
|
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
|
|
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
|
|
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: '
|
|
139
|
-
entity_anchor: '
|
|
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: '
|
|
151
|
-
entity_anchor: '
|
|
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:
|
|
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/
|
|
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
|
-
##
|
|
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@
|
|
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: '
|
|
300
|
-
entity_anchor: '
|
|
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
|