kushi-agents 3.4.1

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 (111) hide show
  1. package/.github/config/m365-auth.json.example +56 -0
  2. package/.github/config/m365-mutable.json.example +11 -0
  3. package/LICENSE +201 -0
  4. package/README.md +159 -0
  5. package/bin/cli.mjs +75 -0
  6. package/package.json +35 -0
  7. package/plugin/agents/kushi.agent.md +147 -0
  8. package/plugin/instructions/answer-from-evidence.instructions.md +73 -0
  9. package/plugin/instructions/auth-and-retry.instructions.md +116 -0
  10. package/plugin/instructions/az-auth-conditional.instructions.md +39 -0
  11. package/plugin/instructions/azure-auth-patterns.instructions.md +226 -0
  12. package/plugin/instructions/citation-ledger.instructions.md +52 -0
  13. package/plugin/instructions/engagement-root-resolution.instructions.md +82 -0
  14. package/plugin/instructions/evidence-thoroughness.instructions.md +62 -0
  15. package/plugin/instructions/side-by-side-config.instructions.md +56 -0
  16. package/plugin/instructions/snapshot-vs-stream.instructions.md +87 -0
  17. package/plugin/instructions/thoroughness-detector.instructions.md +105 -0
  18. package/plugin/instructions/workiq-first.instructions.md +47 -0
  19. package/plugin/plugin.json +96 -0
  20. package/plugin/prompts/aggregate.prompt.md +24 -0
  21. package/plugin/prompts/ask.prompt.md +16 -0
  22. package/plugin/prompts/bootstrap.prompt.md +23 -0
  23. package/plugin/prompts/consolidate.prompt.md +21 -0
  24. package/plugin/prompts/fde-intake.prompt.md +41 -0
  25. package/plugin/prompts/fde-report.prompt.md +46 -0
  26. package/plugin/prompts/fde-triage.prompt.md +46 -0
  27. package/plugin/prompts/refresh.prompt.md +17 -0
  28. package/plugin/prompts/state.prompt.md +17 -0
  29. package/plugin/prompts/status.prompt.md +17 -0
  30. package/plugin/reference-packs/README.md +74 -0
  31. package/plugin/reference-packs/fde/README.md +62 -0
  32. package/plugin/reference-packs/fde/core-fde-reference.md +427 -0
  33. package/plugin/reference-packs/fde/intake-questions.md +168 -0
  34. package/plugin/reference-packs/fde/report-doctrine.md +189 -0
  35. package/plugin/skills/aggregate-project/SKILL.md +72 -0
  36. package/plugin/skills/ask-project/SKILL.md +162 -0
  37. package/plugin/skills/bootstrap-project/SKILL.md +129 -0
  38. package/plugin/skills/build-state/SKILL.md +69 -0
  39. package/plugin/skills/consolidate-evidence/SKILL.md +47 -0
  40. package/plugin/skills/fde-intake/SKILL.md +147 -0
  41. package/plugin/skills/fde-report/SKILL.md +159 -0
  42. package/plugin/skills/fde-triage/SKILL.md +114 -0
  43. package/plugin/skills/intro/SKILL.md +449 -0
  44. package/plugin/skills/project-status/SKILL.md +61 -0
  45. package/plugin/skills/pull-ado/SKILL.md +77 -0
  46. package/plugin/skills/pull-crm/SKILL.md +75 -0
  47. package/plugin/skills/pull-email/SKILL.md +75 -0
  48. package/plugin/skills/pull-meetings/SKILL.md +77 -0
  49. package/plugin/skills/pull-onenote/SKILL.md +82 -0
  50. package/plugin/skills/pull-sharepoint/SKILL.md +85 -0
  51. package/plugin/skills/pull-teams/SKILL.md +75 -0
  52. package/plugin/skills/refresh-project/SKILL.md +89 -0
  53. package/plugin/skills/self-check/SKILL.md +166 -0
  54. package/plugin/skills/self-check/run.ps1 +517 -0
  55. package/plugin/skills/self-check/run.sh +33 -0
  56. package/plugin/templates/fde/intake.md +114 -0
  57. package/plugin/templates/fde/report-fitness.md +151 -0
  58. package/plugin/templates/fde/report-long.md +109 -0
  59. package/plugin/templates/fde/report-short.md +45 -0
  60. package/plugin/templates/fde/report-stage-readiness.md +70 -0
  61. package/plugin/templates/fde/report-weekly.md +73 -0
  62. package/plugin/templates/fde/triage-00-fde-analysis.md +78 -0
  63. package/plugin/templates/fde/triage-02-risk-analysis.md +76 -0
  64. package/plugin/templates/fde/triage-03-6Q.md +40 -0
  65. package/plugin/templates/fde/triage-04-readiness-checklist.md +82 -0
  66. package/plugin/templates/fde/triage-05-executive-consolidated.md +78 -0
  67. package/plugin/templates/fde/triage-06-global-opportunity.md +70 -0
  68. package/plugin/templates/fde/triage-07-validation-warnings.md +60 -0
  69. package/plugin/templates/init/ado-config.template.yml +21 -0
  70. package/plugin/templates/init/crm-config.template.yml +16 -0
  71. package/plugin/templates/init/kushi-projects.template.json +14 -0
  72. package/plugin/templates/init/m365-auth.template.json +67 -0
  73. package/plugin/templates/init/m365-mutable.template.json +19 -0
  74. package/plugin/templates/init/project-contributors.template.yml +27 -0
  75. package/plugin/templates/init/project-evidence.template.yml +32 -0
  76. package/plugin/templates/init/project-integrations.template.yml +34 -0
  77. package/plugin/templates/init/project-user-settings.template.yml +71 -0
  78. package/plugin/templates/paste-prompt.md +35 -0
  79. package/plugin/templates/snapshot/ado-item.template.md +45 -0
  80. package/plugin/templates/snapshot/crm-record.template.md +34 -0
  81. package/plugin/templates/snapshot/meetings-series-index.template.md +32 -0
  82. package/plugin/templates/snapshot/onenote-page.template.md +28 -0
  83. package/plugin/templates/snapshot/sharepoint-file.template.md +31 -0
  84. package/plugin/templates/snapshot/sharepoint-tree.template.md +39 -0
  85. package/plugin/templates/snapshot/teams-roster.template.md +27 -0
  86. package/plugin/templates/state/00_overview.template.md +44 -0
  87. package/plugin/templates/state/01_decisions.template.md +41 -0
  88. package/plugin/templates/state/02_stakeholders.template.md +48 -0
  89. package/plugin/templates/state/03_architecture-and-solution.template.md +56 -0
  90. package/plugin/templates/state/04_workshops-and-key-meetings.template.md +43 -0
  91. package/plugin/templates/state/05_action-items.template.md +29 -0
  92. package/plugin/templates/state/06_risks-and-issues.template.md +43 -0
  93. package/plugin/templates/state/07_timeline-and-milestones.template.md +45 -0
  94. package/plugin/templates/state/08_artifacts-and-deliverables.template.md +55 -0
  95. package/plugin/templates/state/09_open-questions.template.md +62 -0
  96. package/plugin/templates/state/README.md +41 -0
  97. package/plugin/templates/weekly/ado-stream.template.md +71 -0
  98. package/plugin/templates/weekly/consolidated.template.md +98 -0
  99. package/plugin/templates/weekly/crm-stream.template.md +74 -0
  100. package/plugin/templates/weekly/email-stream.template.md +103 -0
  101. package/plugin/templates/weekly/meetings-stream.template.md +182 -0
  102. package/plugin/templates/weekly/onenote-stream.template.md +106 -0
  103. package/plugin/templates/weekly/run-log.template.md +88 -0
  104. package/plugin/templates/weekly/sharepoint-stream.template.md +121 -0
  105. package/plugin/templates/weekly/teams-stream.template.md +121 -0
  106. package/src/constants.mjs +49 -0
  107. package/src/copy-assets.mjs +183 -0
  108. package/src/main.mjs +262 -0
  109. package/src/profile-resolver.mjs +168 -0
  110. package/src/prompt.mjs +42 -0
  111. package/src/settings.mjs +77 -0
@@ -0,0 +1,189 @@
1
+ # FDE Report Doctrine
2
+
3
+ > The hard rules every Kushi FDE report (`fde-intake`, `fde-report`, `fde-triage`) must obey when grounding claims against project Evidence.
4
+
5
+ Cite as: `[source: reference-packs/fde/report-doctrine.md · packaged]`.
6
+
7
+ ---
8
+
9
+ ## Rule 1 — Source Resolution Gate
10
+
11
+ Before drafting ANY FDE report, the skill MUST attempt the applicable retrieval paths and record what was retrieved vs what was attempted-and-empty vs what was attempted-and-failed. Reports that skip the gate cannot claim a complete view.
12
+
13
+ Applicable retrieval paths, in order:
14
+
15
+ 1. **`State/` files** (if `full` profile and State/ exists) — `00_overview.md` → `09_open-questions.md`.
16
+ 2. **`Evidence/_Consolidated/` latest week** — if it exists.
17
+ 3. **`Evidence/<alias>/crm/snapshot/<record>.md`** — for CRM stage/status, MACC, ECIF, ownership.
18
+ 4. **`Evidence/<alias>/ado/snapshot/items/`** — for engagement record + work items.
19
+ 5. **`Evidence/<alias>/meetings/stream/<latest-week>.md`** — for the freshest customer-facing decisions.
20
+ 6. **`Evidence/<alias>/teams/stream/<latest-week>.md`** — for asynchronous decisions / asks.
21
+ 7. **`Evidence/<alias>/onenote/snapshot/pages/*.md`** — for durable artifacts (architecture, plans).
22
+ 8. **`Evidence/<alias>/sharepoint/snapshot/files/*.md`** — for proposals, SOWs, business cases.
23
+ 9. **`Evidence/<alias>/email/stream/<latest-week>.md`** — for sponsor / ATU correspondence.
24
+
25
+ Per-alias paths repeat for every contributor in `Evidence/contributors.yml`. The skill SHOULD prefer `_Consolidated/` over per-alias once it exists.
26
+
27
+ **Record per-source coverage** in the report's footer (a "Source Coverage" section). Use one of: `retrieved` / `attempted-empty` / `attempted-failed` / `not-applicable` / `not-attempted`. A report missing this section is a defect.
28
+
29
+ ---
30
+
31
+ ## Rule 2 — Recency Precedence
32
+
33
+ When two sources disagree, **newer wins** — but never silently. The older signal MUST be marked **superseded** with a citation to both.
34
+
35
+ Recency order (most authoritative → least):
36
+
37
+ 1. **Customer-facing transcript** (meetings/stream) — what was actually said.
38
+ 2. **Async customer-visible decision** (teams/stream or email/stream) — what was confirmed in writing.
39
+ 3. **CRM Confirmed Facts** — fields the FDE / EM / ATU has explicitly written-back AFTER the customer agreed.
40
+ 4. **Local durable artifacts** — OneNote pages, SharePoint proposals (signed/approved).
41
+ 5. **External links** — public references, partner sites.
42
+ 6. **Historical CRM notes** older than the freshest customer-facing source.
43
+
44
+ **Do not average old and new** — pick the newest credible source, mark older as superseded.
45
+
46
+ Format:
47
+
48
+ ```markdown
49
+ The stage is **3 — Triage Approved** [source: ushak/crm/snapshot/AGCO-eng.md · 2026-05-08].
50
+
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
+ ```
53
+
54
+ ---
55
+
56
+ ## Rule 3 — CRM Field Values vs Confirmed Facts
57
+
58
+ CRM field updates are **internal decisions**, not confirmed facts. The FDE intake plan / status / stage fields can be edited by anyone with CRM write access **without the customer ever being asked**.
59
+
60
+ Therefore: **never report a CRM field value as a confirmed fact** unless cross-referenced against the freshest customer-facing source (transcript, email, signed artifact).
61
+
62
+ States like:
63
+
64
+ - `Not Yet Requested`
65
+ - `Pending`
66
+ - `TBD`
67
+ - `In Review`
68
+ - `Draft`
69
+
70
+ …MUST NOT be reported as finalized. Surface them with the qualifier "CRM field value — not yet customer-confirmed".
71
+
72
+ When CRM disagrees with the latest customer-facing source, the report MUST call out the mismatch in `## Open Questions` AND embed a Rule 3 validation warning at the inline assertion (see Rule 4).
73
+
74
+ Format:
75
+
76
+ ```markdown
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]
79
+
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
+ ```
82
+
83
+ ---
84
+
85
+ ## Rule 4 — Validation Warnings Protocol
86
+
87
+ For every unresolved evidence gap, missing role, missing owner, missing funding detail, blocked source, unresolved decision, or CRM-vs-customer mismatch that **materially affects interpretation** — embed a warning inline AND proceed. Do not block. Do not omit the warning.
88
+
89
+ Inline format (blockquote, MUST be machine-parsable):
90
+
91
+ ```markdown
92
+ > ⚠️ VALIDATION WARNING — Rule X.Y: <one-line description>
93
+ ```
94
+
95
+ The `Rule X.Y` reference MUST match one of:
96
+
97
+ - `Rule 1.1` — Source resolution gate skipped for a required path.
98
+ - `Rule 1.2` — Source attempted-failed for a path material to a claim.
99
+ - `Rule 2.1` — Recency precedence violated (newer source ignored, older quoted).
100
+ - `Rule 3.1` — CRM field value reported as confirmed fact without customer cross-check.
101
+ - `Rule 3.2` — CRM disagrees with latest customer-facing source.
102
+ - `Rule 4.1` — Required role (ATU rep, Industry rep) missing from stakeholder map.
103
+ - `Rule 4.2` — Required commercial fact (MACC, ECIF, funding model) missing.
104
+ - `Rule 4.3` — Required outcome metric (KPI, baseline, target) missing.
105
+ - `Rule 5.1` — Stage claim not supported by stage gate / exit criteria in `core-fde-reference.md`.
106
+ - `Rule 5.2` — FDE fit claim not grounded against the 10-row fitness checklist.
107
+ - `Rule 6.1` — Customer engagement legal posture (CWAA / EMA / contract status) absent.
108
+ - `Rule 9.1` — Other unresolved gap (free-text description required).
109
+
110
+ When the report is part of a triage bundle, every inline warning MUST also be mirrored to `07-validation-warnings-checklist.md` with status `open` / `resolved` / `not-applicable`.
111
+
112
+ ---
113
+
114
+ ## Rule 5 — Stage Claims Must Be Grounded
115
+
116
+ Do not declare a project's FDE stage unless the Evidence supports the **exit criteria for the prior stage** as defined in `core-fde-reference.md § FDE Intake Stages, Gates, and Checklists`.
117
+
118
+ If CRM says Stage 4 but Evidence only supports Stage 3 exit criteria, the report MUST:
119
+
120
+ - State the CRM field value.
121
+ - State the Evidence-supported stage.
122
+ - Embed a `Rule 5.1` warning.
123
+ - Surface the mismatch in `## Open Questions`.
124
+
125
+ ---
126
+
127
+ ## Rule 6 — Engagement Legal Posture
128
+
129
+ When customer delivery requires a legal working agreement (e.g. CWAA — Customer Workspace Access Agreement; EMA — Enterprise Master Agreement; or a specific SOW/MSA), the report MUST explicitly assess whether the agreement is already in place AND documented in current Evidence.
130
+
131
+ If absent or unclear → embed `Rule 6.1` warning AND surface in:
132
+
133
+ - `fde-fitness` report → "Commercial/legal gating" row.
134
+ - `risk-analysis` report → high-severity risk.
135
+ - `readiness-checklist` report → blocker.
136
+ - `executive-consolidated-report` → key risk callout.
137
+
138
+ ---
139
+
140
+ ## Rule 7 — Read-Only Discipline
141
+
142
+ Every FDE report is **read-only against Evidence/**. The report skills MUST NOT:
143
+
144
+ - Trigger `pull-*` skills.
145
+ - Call WorkIQ for fresh data.
146
+ - Make Graph / CRM / ADO writes.
147
+ - Send any outbound message (mail, Teams DM, RSVP comment, CRM note, ADO comment).
148
+
149
+ If the freshest Evidence is older than `chat.freshness_warn_days` (default 14), the report MUST:
150
+
151
+ 1. Warn the user at the top of the report (recommended phrasing: "Freshest evidence is N days old — consider `@Kushi refresh <project>` before relying on this report for high-stakes decisions").
152
+ 2. Continue to generate the report from what's on disk.
153
+ 3. Never silently auto-refresh.
154
+
155
+ ---
156
+
157
+ ## Rule 8 — Citation Density
158
+
159
+ Every assertion (every fact, name, date, dollar figure, decision, stage claim, FDE-fit signal, risk) MUST carry a citation. Citations point to one of:
160
+
161
+ - `[source: <alias>/<source>/snapshot/<file>.md as of YYYY-MM-DD]`
162
+ - `[source: <alias>/<source>/stream/YYYY-MM-DD_<source>-stream.md · <event-id-or-timestamp>]`
163
+ - `[source: _Consolidated/YYYY-MM-DD_consolidated.md]`
164
+ - `[source: State/<NN>_<name>.md]` (full profile only)
165
+ - `[source: reference-packs/fde/<file>.md · packaged|user-override|project-override]`
166
+
167
+ A paragraph without at least one inline `[source: …]` is a defect. The FDE report skills MUST surface this defect as a `Rule 8.1` validation warning if any paragraph lacks citation at write time.
168
+
169
+ ---
170
+
171
+ ## Rule 9 — Privacy Posture (External-Facing Reports)
172
+
173
+ For `customer` shape (or any report intended for an external audience):
174
+
175
+ - Suppress internal MACC/ECIF dollar figures unless previously shared with the customer (per CRM `commercial_shared_externally` field or explicit user confirmation).
176
+ - Suppress MS staffing detail (FDE crew composition, allocation %, cost rates).
177
+ - Suppress FDE-internal stage terminology ("Stage 3 — Triage Approved" → "currently in triage").
178
+ - Suppress CRM record IDs and internal ADO work item IDs.
179
+ - Suppress attendee emails (use display names only).
180
+
181
+ Internal reports (`weekly`, `short`, `long`, `handoff`, full triage bundle) include all of the above.
182
+
183
+ ---
184
+
185
+ ## See also
186
+
187
+ - `core-fde-reference.md` — the operating model these rules ground against (FDE definition, anti-patterns, fitness checklist, stage gates, CRM status meanings, risk categories).
188
+ - `intake-questions.md` — the 6 FDE Intake questions + role rules consumed by `fde-intake`.
189
+ - `README.md` — pack overview and 3-layer override.
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: "aggregate-project"
3
+ version: "1.0.0"
4
+ description: "Pull-only multi-source aggregation for a project. Runs every enabled pull-* skill + consolidate-evidence, but DOES NOT run build-state. Produces a complete Evidence/ folder (the public contract) without Kushi's State/ overlay — intended for standalone use and for integration with external rollup systems."
5
+ ---
6
+
7
+ # Skill: aggregate-project
8
+
9
+ ## Purpose
10
+
11
+ `aggregate-project` is Kushi's **pull-only** producer. It captures evidence from every enabled source and merges per-user streams, but stops short of building State/. Use it when:
12
+
13
+ 1. You want raw, multi-source evidence on disk and will render reports yourself (external rollup repo, BI tooling, custom templates).
14
+ 2. You want to refresh evidence frequently but rebuild State/ only on a slower cadence (call `@Kushi state <project>` separately when needed).
15
+ 3. You're installed at the `core` profile, where `build-state` doesn't exist.
16
+
17
+ This skill **never** writes to `State/`. It only writes to `Evidence/`.
18
+
19
+ ## Sequence
20
+
21
+ 1. **Resolve project** — fuzzy-match against `m365-mutable.json knownSections` -> `active_projects` -> `<engagement-root>` subfolders.
22
+ 2. **Resolve window** — default = since last `aggregate`/`refresh`/`bootstrap` watermark in `Evidence/run-log.yml`; fallback 7 days if no watermark.
23
+ 3. **Pull each enabled source in turn** (`pull-email`, `pull-teams`, `pull-meetings`, `pull-onenote`, `pull-sharepoint`, `pull-crm`, `pull-ado`) — each writes its own snapshot/ + stream/ files under `Evidence/<alias>/<source>/`.
24
+ 4. **Run `consolidate-evidence`** — merges all aliases' streams into `Evidence/_Consolidated/<YYYY-MM-DD>_consolidated.md`. Skip silently if only one alias exists.
25
+ 5. **Update `Evidence/run-log.yml`** — record this aggregate run, its watermark, the sources pulled, the alias that produced it.
26
+ 6. **DO NOT run `build-state`.** State/ is not the concern of this skill.
27
+
28
+ ## Output contract
29
+
30
+ After a successful run, the following exists on disk under `<engagement-root>/<project>/`:
31
+
32
+ ```
33
+ Evidence/
34
+ ├── run-log.yml <- manifest (public)
35
+ ├── <alias>/
36
+ │ ├── email/stream/YYYY-MM-DD_email-stream.md <- stream shape
37
+ │ ├── teams/{snapshot,stream}/... <- snapshot + stream
38
+ │ ├── meetings/{snapshot,stream}/...
39
+ │ ├── onenote/{snapshot,stream}/...
40
+ │ ├── sharepoint/{snapshot,stream}/...
41
+ │ ├── crm/{snapshot,stream}/... <- if enabled
42
+ │ └── ado/{snapshot,stream}/... <- if enabled
43
+ └── _Consolidated/
44
+ └── YYYY-MM-DD_consolidated.md <- if multi-user
45
+ ```
46
+
47
+ `State/` is **NOT** touched. Existing `State/*.md` files (from earlier `refresh`/`state` runs) remain unchanged.
48
+
49
+ See `docs/reference/evidence-contract.md` for the full schema (filename rules, frontmatter, citation format).
50
+
51
+ ## What this skill never does
52
+
53
+ - Never runs `build-state`. If the user wants State/, they say `@Kushi state <project>` or `@Kushi refresh <project>` separately.
54
+ - Never sends outbound messages.
55
+ - Never reads/writes outside the resolved project's folder.
56
+
57
+ ## How users invoke this
58
+
59
+ - `@Kushi aggregate <project>` (default — since last watermark)
60
+ - `@Kushi aggregate <project> last N days`
61
+ - `@Kushi aggregate <project> since <date>`
62
+ - `@Kushi aggregate <project> <from>..<to>`
63
+
64
+ ## Relationship to other verbs
65
+
66
+ | Want to... | Use |
67
+ |---|---|
68
+ | Just capture evidence | `aggregate` |
69
+ | Capture + rebuild State/ | `refresh` (= aggregate + build-state) |
70
+ | Rebuild State/ only, no new pulls | `state` |
71
+ | Capture from one source only | `pull <source>` |
72
+ | Merge per-user streams without pulling | `consolidate` |
@@ -0,0 +1,162 @@
1
+ ---
2
+ name: "ask-project"
3
+ version: "2.0.0"
4
+ description: "Read-only Q&A over an already-bootstrapped project. Answers natural-language questions about a project (status, decisions, MACC, stakeholders, risks, action items, timeline, specific docs/meetings) using only the project's State/, Evidence/, and snapshot/ files. Cited; no source pulls; no outbound."
5
+ ---
6
+
7
+ # Skill: ask-project
8
+
9
+ Run this whenever the user asks a question about a known project — even without an explicit verb.
10
+
11
+ The user does NOT need to type `/ask-project` or `@Kushi ask`. If the message:
12
+
13
+ 1. **Names a project** (matches `<engagement-root>/<project>/Evidence/`, `TempAssets/<project>/external-context/`, or `discovery.project_aliases` in any `.settings.yml`), AND
14
+ 2. **Asks a question or requests a fact / status / summary** (interrogatives: what / who / when / where / why / how / status of / list / show / summarize / compare across the same project)
15
+
16
+ …then dispatch here. **Producer verbs (bootstrap / refresh / pull / state / consolidate / status) win over `ask` if the message is unambiguously a producer verb.** When ambiguous, ask the user.
17
+
18
+ ## Hard rules
19
+
20
+ - **Read-only.** No `pull-*`, no Graph writes, no WorkIQ calls during answering. Source pulls are a separate user-initiated step.
21
+ - **No cross-project bleed.** Answer only from the resolved project's own folders. If the question requires comparing two projects, ask the user to confirm and run `ask-project` per project, then merge in the answer.
22
+ - **Citation Ledger applies.** Every fact, decision, person, date, $ figure carries inline `[source: <alias>/<folder>/<file> · YYYY-MM-DD]` per `instructions/citation-ledger.instructions.md` and `instructions/answer-from-evidence.instructions.md`. If the corpus does not support an answer, say so explicitly — never invent.
23
+ - **Privacy posture.** Same as Kushi global: no outbound messages, no leaking attendee emails into anything visible to others. Answer goes to chat only.
24
+ - **Freshness gate, not freshness auto-fix.** If the freshest source relevant to the question is older than `chat.freshness_warn_days` (default 14), warn the user and offer `@Kushi refresh <project>` — but NEVER auto-refresh.
25
+ - **Reference packs may be consulted for domain doctrine.** When the question maps to a known reference-pack domain (currently only `fde/` — FDE stages, fitness, CRM status meanings, intake gates, risk categories, "MACC", "is this FDE-fit"), ALSO load the matching reference pack as additional grounding using the 3-layer override order (project → user → packaged). Cite reference-pack assertions with `[source: reference-packs/<pack>/<file>.md · <layer>]` where layer is `packaged` / `user-override` / `project-override`. Reference-pack content NEVER overrides project Evidence/ for facts about *this* project; it only provides definitions, gates, and rubrics.
26
+
27
+ ## Inputs
28
+
29
+ - `<project>` — fuzzy-matched project name. If multiple plausible matches, ask the user.
30
+ - `<question>` — the user's natural-language question. May span topics; pick the dominant topic for primary file selection.
31
+
32
+ ## Steps
33
+
34
+ ### Step 1 — Resolve project root
35
+
36
+ In order, stop on first hit:
37
+
38
+ 1. Exact `<engagement-root>/<project>/Evidence/` folder.
39
+ 2. Fuzzy match against `discovery.project_aliases` in any `<engagement-root>/<project>/Evidence/<alias>/.settings.yml`.
40
+ 3. `<engagement-root>/<project>/external-context/` (lighter-weight projects without full bootstrap).
41
+ 4. `~/.copilot/project-evidence.yml` `active_projects` list.
42
+
43
+ If zero matches → ask user. If multiple → list candidates and ask user to pick. **Echo the resolved root path before answering** so the user can confirm.
44
+
45
+ ### Step 2 — Classify the question
46
+
47
+ Map the question to one or more **answer kinds**, which determines which files to load:
48
+
49
+ | Question shape | Primary files |
50
+ |---|---|
51
+ | "what is the status of …", "where are we on …" | `State/00_overview.md`, latest `Evidence/<alias>/_Consolidated/`, `Evidence/run-log.yml` |
52
+ | "what's been decided about …", "did we decide …" | `State/01_decisions.md` |
53
+ | "who is the EM / FDE / stakeholder for …", "who's working on …" | `State/02_stakeholders.md`, `Evidence/contributors.yml` |
54
+ | "what's the architecture / solution / approach …" | `State/03_architecture-and-solution.md`, snapshot SharePoint files matching `Architecture/` |
55
+ | "what happened in the meeting on …", "what was discussed at …" | `Evidence/<alias>/Meetings/<date>_*.md` matching the date/topic |
56
+ | "what action items / next steps / open asks …" | `State/05_action-items.md`, `State/09_open-questions.md` |
57
+ | "what risks / blockers / dependencies …" | `State/06_risks-and-issues.md` |
58
+ | "what's the timeline / when is …", "milestone for …" | `State/07_timeline-and-milestones.md` |
59
+ | "what's the MACC / ECIF / commercials / $ size for …" | grep `MACC`, `ECIF`, `\$[0-9]`, `consumption commitment` across `State/` + `Evidence/<alias>/_Consolidated/` |
60
+ | "what does the deck / SOW / doc say about …" | `<project>/SharePoint/snapshot/files/*.md` matching the doc name; fallback to `tree.md` to locate |
61
+ | "what was in the email from X about Y" | grep across `Evidence/<alias>/Email/` |
62
+ | "what's in OneNote about …" | `Evidence/<alias>/OneNote/` + `external-context/*onenote*.md` |
63
+ | "summary of the project" | `State/00_overview.md` (this file IS the answer) |
64
+
65
+ If the question doesn't fit, default to: `State/00_overview.md` + greppable scan of all `State/*.md` for topic keywords.
66
+
67
+ ### Step 3 — Load files (cheapest → richest, stop when sufficient)
68
+
69
+ 1. Load the **primary files** identified in Step 2.
70
+ 2. If primary files don't have the answer, expand to: latest week's `Evidence/<alias>/_Consolidated/` file.
71
+ 3. If still insufficient, expand to per-source latest week files for the relevant source.
72
+ 4. If still insufficient, scan `external-context/`.
73
+ 5. If still insufficient, scan `<project>/SharePoint/snapshot/files/` (these are AI-summarized doc bodies).
74
+ 6. If still insufficient → answer **"I don't have evidence for that. Want me to refresh `<source>` for `<project>`?"**
75
+
76
+ **Do not** read every file in the project — that's wasteful. Stop as soon as the answer is supported by ≥1 cited source.
77
+
78
+ ### Step 4 — Freshness gate
79
+
80
+ Before answering, read `Evidence/run-log.yml` (or `.settings.yml` `last_runs:`). For each source actually used in the answer:
81
+
82
+ - If `last_pulled` is within `chat.freshness_warn_days` (default 14) → no warning.
83
+ - If older → emit a one-liner before the answer: `> ⚠️ Freshness: <source> last pulled <YYYY-MM-DD> (<N> days ago). Answer reflects evidence as of that date. Run @Kushi refresh <project> to update.`
84
+
85
+ ### Step 5 — Compose the answer
86
+
87
+ Format:
88
+
89
+ ```
90
+ **<project>** — <one-line restatement of the question>
91
+
92
+ <answer in plain prose or short bullets, every assertion cited inline>
93
+
94
+ **Sources used**
95
+ - `<alias>/<folder>/<file>` · YYYY-MM-DD
96
+ - `<alias>/<folder>/<file>` · YYYY-MM-DD
97
+
98
+ **Confidence**: high | medium | low — <one-line reason>
99
+
100
+ <optional: "Want me to refresh X to get fresher evidence?" or "I noticed open question Y in 09_open-questions.md — want me to surface it?">
101
+ ```
102
+
103
+ **Confidence rubric**:
104
+ - **high** — answer comes from `State/*.md` (already curated + cited), or from ≥2 corroborating Evidence files, AND freshness OK.
105
+ - **medium** — answer comes from a single Evidence file, OR State file is older than the underlying Evidence change, OR freshness 14–30 days.
106
+ - **low** — answer is partial/inferred from snapshot summaries only, OR freshness >30 days, OR conflicting evidence.
107
+
108
+ ### Step 6 — Surface follow-ups (no sends)
109
+
110
+ If the answer touches a Pending Outbound, an Open Question, or a Risk, mention it as a one-liner suggestion. **Never offer to send anything.** Per global rule, recommendations go into `State/09_open-questions.md` only — `ask-project` does not write either, it just points.
111
+
112
+ ## Stop conditions
113
+
114
+ - Project unresolved → ask user.
115
+ - Question is actually a producer verb in disguise ("refresh AGCO", "pull email for X") → defer to that verb's skill.
116
+ - Corpus does not support the answer → say so + offer refresh.
117
+ - Evidence folder missing entirely → reply: "Project `<X>` is not bootstrapped. Run `@Kushi bootstrap <X>` first."
118
+
119
+ ## Triggers
120
+
121
+ Auto-trigger when the user message contains a project name AND any of:
122
+
123
+ - "what is …", "what's …", "what was …"
124
+ - "who is …", "who's …", "who was …"
125
+ - "when is …", "when did …", "when's …"
126
+ - "status of …", "where are we on …", "where do we stand on …"
127
+ - "show me …", "list …", "summarize …"
128
+ - "is there …", "do we have …", "did we …", "was there …"
129
+ - "tell me about …"
130
+ - Bare project-name + topic (e.g. "AGCO MACC", "Noridian risks", "HCA next steps")
131
+
132
+ Explicit triggers also accepted:
133
+
134
+ - `@Kushi ask <project> <question>`
135
+ - `/ask-project <project> <question>`
136
+ - `ask kushi about <project>: <question>`
137
+
138
+ ## Examples
139
+
140
+ ### Example 1 — Status question
141
+ > User: "what's the status of AGCO?"
142
+ > → Resolve `Engagement Assets/AGCO/`. Load `State/00_overview.md` + `run-log.yml`. Answer with cited bullets + freshness line.
143
+
144
+ ### Example 2 — Specific fact
145
+ > User: "what's the MACC for AGCO and is it confirmed?"
146
+ > → Load `State/00_overview.md`, `State/01_decisions.md`, grep `MACC` across `_Consolidated/`. Answer with $ figure + confirmation status, citing each.
147
+
148
+ ### Example 3 — Doc question
149
+ > User: "what does the FDE intake deck say about Noridian's MPXe scope?"
150
+ > → Resolve Noridian. Read `SharePoint/snapshot/files/` matching "intake" + "MPXe". Cite slide-level if available.
151
+
152
+ ### Example 4 — Cross-project (refused)
153
+ > User: "compare AGCO and HCA on MACC sizing"
154
+ > → "I'll answer per project to keep evidence boundaries clean. First AGCO: … Then HCA: …"
155
+
156
+ ### Example 5 — Stale evidence
157
+ > User: "what's the latest on Noridian?" (last pull was 21 days ago)
158
+ > → Emit freshness warning, then answer from what's there, then offer `@Kushi refresh Noridian`.
159
+
160
+ ### Example 6 — Missing evidence
161
+ > User: "what did Mark say in last week's call about pricing?"
162
+ > → If no Meetings file for that week: "I don't have a meetings transcript for week of YYYY-MM-DD. Want me to pull meetings for AGCO since YYYY-MM-DD?"
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: "bootstrap-project"
3
+ version: "2.1.0"
4
+ description: "First-time setup for a project: machine preflight (WorkIQ check, optional az login), side-by-side config (templates -> live filled), engagement-root + project resolution, initial 30d snapshot+stream pull across all enabled sources. Builds State/ only on the `full` profile (skipped on `standard`). Idempotent — safe to re-run."
5
+ ---
6
+
7
+ # Skill: bootstrap-project
8
+
9
+ Run this when the user says any of: "bootstrap a new project", "set up project evidence for `<X>`", "add me to project `<X>`", "I'm new to `<X>`", "do it all for `<X>`" (and the project has no Evidence/ folder yet).
10
+
11
+ ## Profile-aware behavior
12
+
13
+ This skill is **profile-aware** as of Kushi v3.3.0:
14
+
15
+ - On `standard` profile (the default) — Step 6 (build-state) is **skipped**. The project's `State/` folder is NOT scaffolded; Evidence/ is the public contract.
16
+ - On `full` profile — Step 6 runs and `State/` is scaffolded + built.
17
+
18
+ The active profile is read from `kushi-install.json#profile` next to this agent file. If absent, default to `standard`.
19
+
20
+ ## Inputs
21
+
22
+ - `<project>` — engagement name (fuzzy-matched per `engagement-root-resolution.instructions.md`).
23
+ - `<window>` — defaults to **last 30 days** (override with `last N days` / `since <date>`).
24
+ - Implicit: current contributor `<alias>` (from personal config).
25
+
26
+ ## Steps
27
+
28
+ ### Step 1 — Machine preflight (SETUP)
29
+
30
+ Verify in order. Stop on hard failures.
31
+
32
+ 1. **OS + host runtime** — display OS + Node/PowerShell version. Informational.
33
+ 2. **WorkIQ install (REQUIRED, hard stop)** — read `<USER_HOME>/.copilot/project-evidence.yml workiq.cli_path`. If missing, probe known paths:
34
+ - `$HOME\.copilot\bin\workiq.cmd`
35
+ - `$env:LOCALAPPDATA\Programs\WorkIQ\workiq.cmd`
36
+ - `$env:ProgramFiles\WorkIQ\workiq.cmd`
37
+ If found, persist path. If not found, ask user for path (or to install). Test with `<workiq.cli_path> --help`. Without WorkIQ, M365 sources will all fail — STOP.
38
+ 3. **Conditional az login** — only if `<engagement-root>/.project-evidence/crm/config.yml` OR `<engagement-root>/.project-evidence/ado/config.yml` exists. Per `az-auth-conditional.instructions.md`. Soft warning on failure, never blocking.
39
+ 4. **Engagement-root resolution** — per `engagement-root-resolution.instructions.md`. Persist to `<USER_HOME>/.copilot/project-evidence.yml engagement_root` if newly resolved.
40
+
41
+ Display SETUP summary table with ✅ / ⚙️ / ❌ / ⚠️ / ➖ markers.
42
+
43
+ ### Step 2 — Side-by-side config bootstrap
44
+
45
+ Per `side-by-side-config.instructions.md`. For each missing live file, copy the template into place and ask the user ONLY for blank required fields. Group questions logically.
46
+
47
+ Required live files:
48
+
49
+ | Live file | Template source |
50
+ |---|---|
51
+ | `<USER_HOME>/.copilot/project-evidence.yml` | `templates/init/project-evidence.template.yml` |
52
+ | `<engagement-root>/.project-evidence/m365/m365-auth.json` | `templates/init/m365-auth.template.json` |
53
+ | `<engagement-root>/.project-evidence/m365/m365-mutable.json` | `templates/init/m365-mutable.template.json` |
54
+ | `<engagement-root>/<project>/integrations.yml` | `templates/init/project-integrations.template.yml` |
55
+ | `<engagement-root>/<project>/Evidence/contributors.yml` | `templates/init/project-contributors.template.yml` |
56
+ | `<engagement-root>/<project>/Evidence/<alias>/.settings.yml` | `templates/init/project-user-settings.template.yml` |
57
+
58
+ Optional (only if user enables CRM/ADO):
59
+
60
+ | Live file | Template source |
61
+ |---|---|
62
+ | `<engagement-root>/.project-evidence/crm/config.yml` | `templates/init/crm-config.template.yml` |
63
+ | `<engagement-root>/.project-evidence/ado/config.yml` | `templates/init/ado-config.template.yml` |
64
+
65
+ ### Step 3 — Project folder scaffold
66
+
67
+ Create the project folder structure (per `engagement-root-resolution.instructions.md`):
68
+
69
+ ```
70
+ <engagement-root>/<project>/
71
+ integrations.yml
72
+ Evidence/
73
+ run-log.yml ← initial: empty watermarks
74
+ contributors.yml
75
+ <alias>/.settings.yml
76
+ State/ ← FULL PROFILE ONLY
77
+ 00_overview.md 01_decisions.md 02_stakeholders.md
78
+ 03_architecture-and-solution.md 04_workshops-and-key-meetings.md
79
+ 05_action-items.md 06_risks-and-issues.md
80
+ 07_timeline-and-milestones.md 08_artifacts-and-deliverables.md
81
+ 09_open-questions.md
82
+ ```
83
+
84
+ The `State/` subtree is created **only on `full` profile**. On `standard`, only `Evidence/` is scaffolded. State files (when scaffolded) come from `templates/state/*.template.md`.
85
+
86
+ ### Step 4 — Initial pull (last 30 days)
87
+
88
+ Dispatch to each enabled per-source skill with `--window last 30 days`:
89
+
90
+ 1. `pull-email`
91
+ 2. `pull-teams`
92
+ 3. `pull-meetings`
93
+ 4. `pull-onenote`
94
+ 5. `pull-sharepoint`
95
+ 6. `pull-crm` (if enabled)
96
+ 7. `pull-ado` (if enabled)
97
+
98
+ Each produces snapshot/ + stream/ output per `snapshot-vs-stream.instructions.md`.
99
+
100
+ ### Step 5 — Consolidate (single contributor = no-op)
101
+
102
+ If multiple contributors already exist, dispatch `consolidate-evidence`. For first-time bootstrap (one user), skip.
103
+
104
+ ### Step 6 — Build state (FULL PROFILE ONLY)
105
+
106
+ If `kushi-install.json#profile` is `full` → dispatch `build-state` to render `State/*.md` from the freshly-pulled Evidence.
107
+
108
+ If `standard` (or `core`) → **skip this step**. Note in the run summary: *"State/ rollup skipped (profile = `standard`). To enable, re-install with `npx github:gim-home/kushi --clawpilot --profile full --force`."*
109
+
110
+ ### Step 7 — Verify + summary
111
+
112
+ Per `side-by-side-config.instructions.md` "Verification" rule, list all live config files (path + size + last-write time). Show:
113
+ - SETUP summary table
114
+ - Side-by-side config table (templates ↔ live files)
115
+ - Per-source pull table (snapshot count + stream weeks covered)
116
+ - New Open Questions count
117
+
118
+ End with a one-liner pointing at Q&A:
119
+
120
+ > ✅ `<project>` is bootstrapped. You can now ask questions naturally — e.g. *"what's the status of `<project>`?"*, *"who is the EM on `<project>`?"*, *"what's the MACC for `<project>`?"*. No `@Kushi ask` prefix needed; the `ask-project` skill auto-dispatches when a project name + question is detected.
121
+
122
+ ## Triggers
123
+
124
+ - "bootstrap a new project"
125
+ - "set up project evidence for `<name>`"
126
+ - "add me to project `<name>`"
127
+ - "I'm new to `<name>`, set me up"
128
+ - "do it all for `<name>`" (when project has no Evidence/ folder yet)
129
+ - "redo onboarding for `<name>`" (forces re-prompt of all config questions)
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: "build-state"
3
+ version: "2.0.0"
4
+ description: "Render <project>/State/*.md from existing Evidence (snapshot/ + stream/). No source pulls — pure re-render. Latest fact wins on conflicts. Every assertion cited. Always updates Open Questions."
5
+ ---
6
+
7
+ # Skill: build-state
8
+
9
+ Run this when the user says: "regenerate state for `<X>`", "rebuild State", "@Kushi state `<X>`". This skill makes NO source calls — it only reads Evidence and writes State.
10
+
11
+ ## Inputs
12
+
13
+ - `<project>` — already-bootstrapped project.
14
+
15
+ ## Steps
16
+
17
+ ### Step 1 — Read all Evidence
18
+
19
+ For the resolved `<project>`:
20
+ - Walk `Evidence/<alias>/<source>/snapshot/**/*.md` (current truth per entity).
21
+ - Walk `Evidence/<alias>/<source>/stream/**/*.md` (chronological events).
22
+ - Walk `Evidence/_Consolidated/**/*.md` (multi-user merged where present).
23
+
24
+ ### Step 2 — For each State file (00–08), regenerate
25
+
26
+ | State file | Pulls primarily from |
27
+ |---|---|
28
+ | 00_overview.md | snapshot/CRM/<id>.md, snapshot/sharepoint/files/*overview*.md, snapshot/onenote/pages/*overview*.md |
29
+ | 01_decisions.md | stream/meetings/* (decision lines), stream/teams/* (decision lines), stream/email/* (decision lines), snapshot/ado/items/* (state changes) |
30
+ | 02_stakeholders.md | snapshot/teams/chat-roster.md, snapshot/crm/<id>.md (engagement contacts), stream/email/* (sender/recipient analysis) |
31
+ | 03_architecture-and-solution.md | snapshot/onenote/pages/*architecture*.md, snapshot/sharepoint/files/*arch*.md, stream/meetings/* (arch discussions) |
32
+ | 04_workshops-and-key-meetings.md | snapshot/meetings/series-index.md, stream/meetings/* (per-meeting blocks) |
33
+ | 05_action-items.md | stream/meetings/* (action lines), stream/teams/* (action lines), snapshot/ado/items/* |
34
+ | 06_risks-and-issues.md | stream/meetings/* (risk lines), stream/email/* (escalations), snapshot/ado/items/* (risk-tagged) |
35
+ | 07_timeline-and-milestones.md | snapshot/crm/<id>.md (milestones), snapshot/ado/items/* (iterations), stream/meetings/* (date commits) |
36
+ | 08_artifacts-and-deliverables.md | snapshot/sharepoint/tree.md + files/*, snapshot/onenote/pages/* |
37
+
38
+ ### Step 3 — Conflict resolution
39
+
40
+ - Latest fact wins on conflicts (compare `as of YYYY-MM-DD` snapshots and stream event timestamps).
41
+ - Preserve superseded values via `Supersedes:` line under the new entry.
42
+ - Each State file ends with a `## Conflicts` section listing every superseded value with both citations.
43
+
44
+ ### Step 4 — Citation density
45
+
46
+ Per `citation-ledger.instructions.md`: every assertion in every State file MUST have an inline citation. Snapshot citations use `as of YYYY-MM-DD`; stream citations use `· YYYY-MM-DD`. Where a fact is BOTH "currently true" AND "decided on date X", cite both.
47
+
48
+ ### Step 5 — Open Questions (mandatory every run)
49
+
50
+ Update `<project>/State/09_open-questions.md`:
51
+ - Scan new evidence for items that are conflicting, second-hand, low-fidelity, or that prompt a follow-up question → add as new `Q-NNN` rows under 🔴 Open / 🟡 Partial. Set Fidelity (Low/Medium/High), Category, Source, Asked Of, Needed By.
52
+ - For every existing 🔴/🟡 row, check if new evidence answers it. If yes: flip to 🟢 Resolved, fill Answer + Source of Answer + Resolved On, fold the answer into the appropriate State file (00–08), record path in **Folded Into**. Never delete rows.
53
+ - If a question is no longer relevant (scope cut, decision overtaken), flip to ⚫ Stale with reason.
54
+ - Bump the file's `As of:` line. Briefly mention in run-log how many opened / partial / resolved / staled.
55
+
56
+ ### Step 6 — Banner
57
+
58
+ Top of every State file:
59
+
60
+ ```markdown
61
+ > _As of: YYYY-MM-DD HH:mm. Regenerated by @Kushi build-state. Source: Evidence/ snapshots + streams._
62
+ ```
63
+
64
+ ## Triggers
65
+
66
+ - "regenerate state for `<X>`"
67
+ - "rebuild state"
68
+ - "@Kushi state `<X>`"
69
+ - "re-render State after I fixed `<file>`"