convoke-agents 3.0.4 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,441 @@
1
+ # The Vortex Deep Dive — Product Discovery from Context to Decision
2
+
3
+ **Team:** Vortex Pattern (7 Agents, 22 Workflows, 10 Handoff Contracts)
4
+ **Module:** Convoke (bme)
5
+ **Version:** 3.0.4
6
+ **Last Updated:** 2026-04-05
7
+
8
+ ---
9
+
10
+ ## What This Guide Covers
11
+
12
+ The per-agent user guides tell you *how to use each agent*. This guide tells you *how the team works together* — the pipeline logic, what flows between agents, what good artifacts look like, where teams get stuck, and how to navigate the system like someone who built it.
13
+
14
+ If you've read the individual user guides for Emma, Isla, Mila, Liam, Wade, Noah, and Max, you're ready for this.
15
+
16
+ ---
17
+
18
+ ## The Vortex at a Glance
19
+
20
+ The Vortex is a 7-stream product discovery framework based on the [Innovation Vortex](https://unfix.com/innovation-vortex) from the unFIX model. Each stream has a dedicated agent. Artifacts flow forward through handoff contracts, while feedback loops route backward when evidence demands it.
21
+
22
+ ```
23
+ Emma 🎯 Isla 🔍 Mila 🔬 Liam 💡 Wade 🧪 Noah 📡 Max 🧭
24
+ Contextualize → Empathize → Synthesize → Hypothesize → Externalize → Sensitize → Systematize
25
+ (strategy) (research) (convergence) (hypotheses) (experiments) (production) (decisions)
26
+ ```
27
+
28
+ **The big idea:** You don't build features. You discover whether a problem is worth solving, for whom, and how — then you test that bet as cheaply as possible before committing resources. The Vortex gives that process structure.
29
+
30
+ ---
31
+
32
+ ## How to Read This Guide
33
+
34
+ This guide is organized around five layers:
35
+
36
+ 1. **The Pipeline** — How artifacts flow from one agent to the next
37
+ 2. **Walkthrough: A Complete Vortex Cycle** — Step-by-step through a realistic scenario
38
+ 3. **Artifact Examples** — What good output looks like at each stage
39
+ 4. **Scenarios & Entry Points** — Where to start depending on your situation
40
+ 5. **Anti-Patterns** — Where teams go wrong and how to avoid it
41
+
42
+ ---
43
+
44
+ ## Part 1: The Pipeline
45
+
46
+ ### Forward Flow (HC1-HC5)
47
+
48
+ The core pipeline moves artifacts forward through five handoff contracts:
49
+
50
+ | Contract | From | To | What Flows | In Plain English |
51
+ |----------|------|-----|-----------|------------------|
52
+ | **HC1** | Isla 🔍 | Mila 🔬 | Empathy artifacts (maps, interviews, observations) with synthesized insights | "Here's everything we learned from talking to users" |
53
+ | **HC2** | Mila 🔬 | Liam 💡 | Converged problem definition (JTBD + Pains & Gains + evidence) | "Here's the single problem worth solving, and why we believe it" |
54
+ | **HC3** | Liam 💡 | Wade 🧪 | 1-3 hypothesis contracts with risk maps and testing order | "Here are our bets, ranked by what could kill us fastest" |
55
+ | **HC4** | Wade 🧪 | Noah 📡 | Experiment context (results, baselines, success criteria) | "Here's what we tested and what happened — watch these signals in production" |
56
+ | **HC5** | Noah 📡 | Max 🧭 | Signal report (production intelligence + experiment lineage) | "Here's what production is telling us, mapped back to our original hypotheses" |
57
+
58
+ ### Feedback Loops (HC6-HC10)
59
+
60
+ When evidence says "go back," these contracts route work backward:
61
+
62
+ | Contract | From | To | Trigger | In Plain English |
63
+ |----------|------|-----|---------|------------------|
64
+ | **HC6** | Max 🧭 | Mila 🔬 | Pivot decision — problem correct, solution wrong | "Our problem is real but our approach failed. Re-synthesize." |
65
+ | **HC7** | Max 🧭 | Isla 🔍 | Critical evidence gap identified | "We're missing something fundamental. Go find out." |
66
+ | **HC8** | Max 🧭 | Emma 🎯 | Problem space itself is wrong | "We've been solving the wrong problem entirely." |
67
+ | **HC9** | Liam 💡 | Isla 🔍 | Unvalidated lethal assumption detected mid-hypothesis | "This assumption could kill us and we have zero evidence. Validate before proceeding." |
68
+ | **HC10** | Noah 📡 | Isla 🔍 | Anomalous user behavior in production | "Users are doing something we never predicted. Investigate." |
69
+
70
+ ### The Pipeline Diagram
71
+
72
+ ```
73
+ ┌─────────────────────────────────────────────┐
74
+ │ VORTEX PATTERN │
75
+ │ 7 Streams · 7 Agents │
76
+ └─────────────────────────────────────────────┘
77
+
78
+ ┌──────────┐ HC1 ┌──────────┐ HC2 ┌──────────┐ HC3 ┌──────────┐
79
+ │ Isla 🔍 │─────────▶│ Mila 🔬 │─────────▶│ Liam 💡 │─────────▶│ Wade 🧪 │
80
+ │ Empathize │ artifact │Synthesize│ artifact │Hypothesiz│ artifact │Externaliz│
81
+ └──────────┘ └──────────┘ └──────────┘ └──────────┘
82
+ ▲ ▲ │ │
83
+ │ │ HC9│flag HC4│artifact
84
+ │ HC6│routing │ │
85
+ │ │ ▼ ▼
86
+ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
87
+ │ Emma 🎯 │◀── HC8 ──│ Max 🧭 │◀── HC5 ──│ Noah 📡 │◀─────────┘
88
+ │Contextual│ routing │Systematiz│ artifact │ Sensitize│
89
+ └──────────┘ └──────────┘ └──────────┘
90
+ │ │ │
91
+ │ HC7│routing HC10│flag
92
+ │ │ │
93
+ └──────────────────────┴────────────────────┘
94
+ ▼ to Isla 🔍
95
+ ```
96
+
97
+ **Isla is the gravity well.** She has three formal inbound feedback contracts (HC7, HC9, HC10) plus organic routing from multiple workflows. When in doubt, the Vortex sends you back to the user research.
98
+
99
+ ---
100
+
101
+ ## Part 2: Walkthrough — A Complete Vortex Cycle
102
+
103
+ Let's walk through a realistic scenario end-to-end. You're a product team at a B2B SaaS company exploring whether to build an onboarding assistant for new customers.
104
+
105
+ ### Stage 1: Emma — Contextualize the Problem Space
106
+
107
+ **What you do:** Invoke Emma and run **[LP] Create Lean Persona** and **[PV] Define Product Vision**.
108
+
109
+ **Step-by-step through Lean Persona:**
110
+
111
+ | Step | What Emma Asks | What a Good Answer Looks Like |
112
+ |------|---------------|-------------------------------|
113
+ | 1. Define Job-to-be-Done | "What job is the user trying to accomplish?" | "New B2B customers need to configure their first integration within 48 hours of purchase so they see value before buyer's remorse sets in." (Specific job, not vague "onboard customers") |
114
+ | 2. Current Solution Analysis | "How do they solve this today? What hurts?" | "They read a 40-page setup guide, attend a 1-hour onboarding call, and still email support 2-3 times. Average time-to-first-value: 12 days." |
115
+ | 3. Problem Contexts | "When and where does this occur?" | "Immediately post-purchase. The champion who bought is under pressure to show ROI to their manager within 30 days." |
116
+ | 4. Forces & Anxieties | "What pushes/holds them?" | "Push: boss expects demo in 2 weeks. Hold: fear of breaking their existing integrations. Anxiety: 'What if I configured it wrong and corrupt our data?'" |
117
+ | 5. Success Criteria | "What does success look like?" | "First integration live within 48 hours. Zero support tickets during setup. Champion feels confident enough to onboard their own team." |
118
+ | 6. Synthesize | "What are your 3 riskiest assumptions?" | See artifact example below |
119
+
120
+ **What you get:** A lean persona artifact file like `lean-persona-setup-champion-2026-04-05.md` — a hypothesis about your user, their job, their pains, and what you need to validate.
121
+
122
+ **The Compass suggests:** Head to Isla (user-interview) to validate persona assumptions, or to Wade (lean-experiment) if you want to test the riskiest one immediately.
123
+
124
+ ### Stage 2: Isla — Empathize Through Discovery
125
+
126
+ **What you do:** Invoke Isla and run **[UI] User Interview** to validate Emma's lean persona with real users.
127
+
128
+ Isla guides you through structuring interview questions around the JTBD and pains you identified. She helps you avoid leading questions and focus on behavior observation rather than opinion collection.
129
+
130
+ **What flows to Mila (HC1):** Empathy artifacts containing interview findings, key themes, pain patterns, and desired gains — all grounded in evidence from real conversations.
131
+
132
+ ### Stage 3: Mila — Synthesize Into a Problem Definition
133
+
134
+ **What you do:** Invoke Mila and run **[RC] Research Convergence**.
135
+
136
+ Mila loads Isla's HC1 artifacts and converges them into a single, actionable problem definition. She uses JTBD framing and Pains & Gains analysis to distill multiple research inputs into one coherent picture.
137
+
138
+ **What flows to Liam (HC2):** A problem definition artifact with:
139
+ - A converged problem statement with confidence level
140
+ - Primary JTBD ("When [situation], I want to [motivation], so I can [expected outcome]")
141
+ - Prioritized pains with evidence sources
142
+ - Prioritized gains with expected impact
143
+ - An evidence summary showing traceability
144
+ - Embedded assumptions with validation status
145
+
146
+ ### Stage 4: Liam — Engineer Testable Hypotheses
147
+
148
+ **What you do:** Invoke Liam and run **[HE] Hypothesis Engineering**.
149
+
150
+ Liam loads Mila's HC2 problem definition and turns it into 1-3 rigorous, falsifiable hypotheses using structured brainwriting and the 4-field contract format.
151
+
152
+ **Step-by-step:**
153
+
154
+ | Step | What Liam Does | What Matters |
155
+ |------|---------------|-------------|
156
+ | 1. Setup | Validates HC2 input — is the problem definition strong enough? | If the problem definition is weak, Liam sends you back to Mila |
157
+ | 2. Problem Context | Unpacks JTBD, pains, gains, and maps the hypothesis landscape | This is where Liam identifies which pains are most "hypothesis-worthy" |
158
+ | 3. Brainwriting | Engineers 1-3 hypotheses using the 4-field format | Each hypothesis has: Expected Outcome, Target Behavior Change, Rationale, Riskiest Assumption |
159
+ | 4. Assumption Mapping | Maps every assumption by lethality x uncertainty | The kill chart: what could destroy your idea, and how sure are you about it? |
160
+ | 5. Synthesize | Produces HC3 artifact with testing order | The riskiest assumption becomes the first experiment target |
161
+
162
+ **The HC9 flag:** If Liam encounters an assumption so dangerous and unvalidated that testing it without prior research is reckless, he flags it via HC9 and routes you back to Isla for targeted discovery. This is a safety valve — it prevents you from running experiments on foundations of sand.
163
+
164
+ **What flows to Wade (HC3):** 1-3 hypothesis contracts, each with the 4-field format, plus a risk map and recommended testing order.
165
+
166
+ ### Stage 5: Wade — Run Lean Experiments
167
+
168
+ **What you do:** Invoke Wade and run **[LE] Lean Experiment**.
169
+
170
+ Wade loads Liam's HC3 artifact and designs the cheapest, fastest experiment to test the riskiest assumption first. He follows Build-Measure-Learn.
171
+
172
+ **Step-by-step through Lean Experiment:**
173
+
174
+ | Step | What Wade Does | What Matters |
175
+ |------|---------------|-------------|
176
+ | 1. Hypothesis | Loads hypothesis from HC3, confirms it's testable | The hypothesis statement becomes the experiment brief |
177
+ | 2. Design | Designs the experiment (type, audience, timeline) | Wade pushes for the cheapest valid test — a landing page over a prototype, a prototype over an MVP |
178
+ | 3. Metrics | Defines success criteria and measurement plan | "If we see X, the hypothesis is supported. If we see Y, it's invalidated." |
179
+ | 4. Run | Guides you through execution | The actual experiment happens outside the tool — Wade tracks it |
180
+ | 5. Analyze | Analyzes results against success criteria | Raw data becomes insight |
181
+ | 6. Decide | Experiment conclusion and next-step recommendation | Validated? Continue forward. Invalidated? Route to Max for a strategic decision |
182
+
183
+ **What flows to Noah (HC4):** Experiment context including results, baselines, success criteria, and which hypotheses were confirmed or rejected.
184
+
185
+ ### Stage 6: Noah — Read Production Signals
186
+
187
+ **What you do:** Invoke Noah and run **[SI] Signal Interpretation**.
188
+
189
+ Noah loads Wade's HC4 experiment context and interprets production signals through the lens of your original hypotheses. He doesn't just report metrics — he maps them back to the bets you made.
190
+
191
+ **The HC10 flag:** If Noah detects user behavior that doesn't match any hypothesis — something completely unexpected — he flags it via HC10 and routes you back to Isla to investigate. Anomalies are discovery opportunities.
192
+
193
+ **What flows to Max (HC5):** A signal report containing signal descriptions, experiment lineage, and trend analysis. Intelligence only — no strategic recommendations (that's Max's job).
194
+
195
+ ### Stage 7: Max — Make the Strategic Decision
196
+
197
+ **What you do:** Invoke Max and run **[PP] Pivot / Patch / Persevere**.
198
+
199
+ Max loads Noah's HC5 signal report (and any accumulated learning cards) and guides you through a rigorous strategic decision.
200
+
201
+ **Step-by-step:**
202
+
203
+ | Step | What Max Does | What Matters |
204
+ |------|---------------|-------------|
205
+ | 1. Evidence Review | Gathers all learning cards, experiment results, signals | Everything on the table — no cherry-picking |
206
+ | 2. Hypothesis Assessment | Scores each original hypothesis: confirmed, partial, invalidated | Honest assessment against evidence |
207
+ | 3. Option Analysis | Analyzes Pivot, Patch, and Persevere with pros/cons/risks | Forces you to consider all three options seriously |
208
+ | 4. Stakeholder Input | Captures team perspectives and concerns | Prevents unilateral decisions |
209
+ | 5. Decision | Documents the decision with rationale | The record says WHY, not just WHAT |
210
+ | 6. Action Plan | Creates concrete next steps for the chosen direction | A decision without an action plan is just an opinion |
211
+
212
+ **The routing from Max:**
213
+ - **Pivot** → HC6 to Mila (re-synthesize problem with new evidence)
214
+ - **Patch** → Back to Wade (adjust experiment and re-test)
215
+ - **Persevere** → HC7 to Isla (if deeper insight needed) or continue to next development phase
216
+ - **Wrong problem entirely** → HC8 to Emma (recontextualize)
217
+
218
+ ---
219
+
220
+ ## Part 3: Artifact Examples
221
+
222
+ ### Lean Persona (Emma's Output)
223
+
224
+ ```markdown
225
+ # Lean Persona: Setup Champion
226
+
227
+ ## Job-to-be-Done
228
+ **When** a B2B customer purchases our platform,
229
+ **I want to** configure my first integration within 48 hours,
230
+ **so I can** demonstrate value to my manager before buyer's remorse sets in.
231
+
232
+ **Frequency:** Once per customer lifecycle (critical window)
233
+ **Importance:** Mission-critical — failure here drives churn
234
+
235
+ ## Current Solution
236
+ - 40-page setup guide (avg. read time: never)
237
+ - 1-hour onboarding call (booked 5-7 days post-purchase)
238
+ - 2-3 support emails during setup
239
+ - Average time-to-first-value: 12 days
240
+
241
+ ## Pain Points
242
+ 1. **Gap between purchase excitement and first value** — 12-day gap kills momentum
243
+ 2. **Fear of misconfiguration** — "What if I break our existing integrations?"
244
+ 3. **Setup guide assumes expert knowledge** — new users don't know the terminology
245
+
246
+ ## Riskiest Assumptions
247
+ 1. ASSUMPTION: Customers would self-serve if the guide were interactive (not PDF)
248
+ 2. ASSUMPTION: The 48-hour window is the real deadline (not 30 days)
249
+ 3. ASSUMPTION: Fear of misconfiguration is the primary blocker (not complexity)
250
+ ```
251
+
252
+ ### HC2 Problem Definition (Mila's Output)
253
+
254
+ ```markdown
255
+ ## Converged Problem Statement
256
+ New B2B customers experience a critical 12-day gap between purchase and first
257
+ value realization, driven by configuration complexity and fear of breaking
258
+ existing integrations. This gap directly correlates with 60-day churn rate.
259
+
260
+ **Confidence:** Medium (5 interviews + support ticket analysis; no quantitative validation yet)
261
+
262
+ ## Primary JTBD
263
+ When I purchase a new B2B platform,
264
+ I want to see it working with my data within 48 hours,
265
+ so I can justify the purchase to my manager and feel confident in my decision.
266
+
267
+ ## Pains (Prioritized)
268
+ | Pain | Priority | Evidence |
269
+ |------|----------|----------|
270
+ | 12-day time-to-first-value | High | 5/5 interviewees cited frustration |
271
+ | Fear of misconfiguration | High | 4/5 interviewees delayed setup due to fear |
272
+ | Setup guide assumes expertise | Medium | 3/5 interviewees couldn't parse terminology |
273
+
274
+ ## Assumptions
275
+ | Assumption | Risk if Wrong | Status |
276
+ |-----------|--------------|--------|
277
+ | 48-hour window is the real deadline | Solving for wrong urgency | Assumed |
278
+ | Fear > complexity as primary blocker | Wrong intervention design | Partially Validated |
279
+ ```
280
+
281
+ ### HC3 Hypothesis Contract (Liam's Output)
282
+
283
+ ```markdown
284
+ ## Hypothesis 1: Guided Setup Reduces Time-to-Value
285
+
286
+ **Expected Outcome:** Interactive setup wizard reduces time-to-first-value
287
+ from 12 days to under 48 hours for 70% of new customers.
288
+
289
+ **Target Behavior Change:** Customers complete first integration without
290
+ contacting support (currently 0% self-serve; target: 60%).
291
+
292
+ **Rationale:** Interview evidence shows customers abandon the PDF guide
293
+ within 5 minutes. Interactive guidance addresses both complexity and
294
+ fear-of-misconfiguration by providing guardrails.
295
+
296
+ **Riskiest Assumption:** Customers would actually use a self-serve wizard
297
+ instead of waiting for the onboarding call. (If they prefer human
298
+ guidance regardless, the wizard investment is wasted.)
299
+
300
+ ## Assumption Risk Map
301
+ | Assumption | Lethality | Uncertainty | Priority |
302
+ |-----------|-----------|-------------|----------|
303
+ | Customers prefer self-serve over human onboarding | High | High | Test First |
304
+ | 48-hour window drives urgency | Medium | High | Test Soon |
305
+ | Fear of misconfiguration is solvable with UI guardrails | High | Medium | Test Soon |
306
+ ```
307
+
308
+ ---
309
+
310
+ ## Part 4: Scenarios & Entry Points
311
+
312
+ Not every discovery starts at Stream 1. Here's where to enter the Vortex depending on your situation:
313
+
314
+ ### "We have a new product idea but haven't talked to users yet"
315
+
316
+ **Start with:** Emma 🎯 → [LP] Lean Persona, then [PV] Product Vision
317
+ **Flow:** Emma → Isla (validate with users) → full forward pipeline
318
+
319
+ This is the classic greenfield path. Emma sets the strategic context, then Isla validates it with reality.
320
+
321
+ ### "We have user research but it's scattered across docs and interviews"
322
+
323
+ **Start with:** Mila 🔬 → [RC] Research Convergence
324
+ **Flow:** Mila → Liam → Wade → Noah → Max
325
+
326
+ Skip Emma and Isla if you already have solid research. Mila will synthesize it into a problem definition. If Mila finds gaps in the research, she'll route you back to Isla.
327
+
328
+ ### "We know the problem — we need hypotheses to test"
329
+
330
+ **Start with:** Liam 💡 → [HE] Hypothesis Engineering
331
+ **Flow:** Liam → Wade → Noah → Max
332
+
333
+ If you have a validated problem definition (or can write one that meets HC2 standards), jump straight to Liam.
334
+
335
+ ### "We ran experiments but don't know what to do with the results"
336
+
337
+ **Start with:** Max 🧭 → [LC] Learning Card or [PP] Pivot / Patch / Persevere
338
+ **Flow:** Max decides the next direction
339
+
340
+ Max is the decision engine. Feed him evidence and he'll guide you through a structured decision.
341
+
342
+ ### "We're in production and seeing weird signals"
343
+
344
+ **Start with:** Noah 📡 → [SI] Signal Interpretation
345
+ **Flow:** Noah → Max (for decision) or → Isla via HC10 (if anomalous)
346
+
347
+ Noah maps production behavior back to your original hypotheses. Unexpected behavior triggers deeper investigation.
348
+
349
+ ### "We have everything — just need to navigate"
350
+
351
+ **Start with:** Max 🧭 → [VN] Vortex Navigation
352
+ **Flow:** Max runs a 7-stream gap analysis and tells you where you're weakest
353
+
354
+ Vortex Navigation is the GPS. It assesses your current state across all seven streams and recommends where to focus.
355
+
356
+ ---
357
+
358
+ ## Part 5: Anti-Patterns
359
+
360
+ ### 1. "Demographic Persona Syndrome"
361
+
362
+ **The mistake:** Creating personas with names like "Sarah, 34, Marketing Manager, lives in Brooklyn, likes yoga."
363
+
364
+ **Why it fails:** Demographics don't predict behavior. A 34-year-old marketing manager and a 52-year-old engineering director can have the identical job-to-be-done. Emma will push back on this — lean personas focus on jobs, pains, and forces.
365
+
366
+ **The fix:** Start with the job. "When [situation], I want to [motivation], so I can [expected outcome]." Demographics are decoration; jobs are decision-drivers.
367
+
368
+ ### 2. "Skipping Straight to Solutions"
369
+
370
+ **The mistake:** Going from Emma's lean persona directly to Wade's experiments without synthesizing the problem (Mila) or engineering hypotheses (Liam).
371
+
372
+ **Why it fails:** Without a converged problem definition, your experiments test vague ideas instead of specific hypotheses. Without explicit assumptions, you don't know what you're validating.
373
+
374
+ **The fix:** Respect the pipeline. Mila's convergence and Liam's hypothesis engineering are where vague intuitions become testable bets. You can move fast through them, but don't skip them.
375
+
376
+ ### 3. "The Unfalsifiable Hypothesis"
377
+
378
+ **The mistake:** Writing hypotheses like "We believe users will like our product because it's better."
379
+
380
+ **Why it fails:** If you can't prove it wrong, it's not a hypothesis — it's a wish. Liam's 4-field format forces specificity: expected outcome (measurable), behavior change (observable), rationale (evidence-grounded), riskiest assumption (falsifiable).
381
+
382
+ **The fix:** Every hypothesis must have a riskiest assumption that, if wrong, kills the whole idea. If you can't name it, your hypothesis isn't specific enough.
383
+
384
+ ### 4. "Sunk Cost Perseverance"
385
+
386
+ **The mistake:** Continuing to invest in a direction because you've already spent time/money on it, not because evidence supports it.
387
+
388
+ **Why it fails:** Evidence doesn't care about your budget. Max's Pivot / Patch / Persevere framework explicitly surfaces sunk-cost reasoning so you can recognize it.
389
+
390
+ **The fix:** Max requires you to analyze all three options (Pivot, Patch, Persevere) with evidence before deciding. "We've already invested X" is not evidence that the direction is correct — it's a cognitive bias.
391
+
392
+ ### 5. "Ignoring the Feedback Loops"
393
+
394
+ **The mistake:** Treating the Vortex as a one-way conveyor belt: Emma → Isla → Mila → Liam → Wade → Noah → Max → done.
395
+
396
+ **Why it fails:** Discovery is iterative. Evidence will invalidate assumptions, reveal new problems, and surface surprises. The feedback loops (HC6-HC10) exist precisely because the forward path is rarely straight.
397
+
398
+ **The fix:** When Max says "pivot," trust the process and route back. When Liam flags an assumption (HC9), don't ignore it. When Noah sees an anomaly (HC10), investigate it. The loops are features, not failures.
399
+
400
+ ### 6. "Testing Everything At Once"
401
+
402
+ **The mistake:** Running experiments on all three hypotheses simultaneously.
403
+
404
+ **Why it fails:** If multiple experiments run concurrently, you can't isolate which hypothesis is responsible for the signal. Liam's risk map exists to prioritize: test the riskiest assumption first, then the next.
405
+
406
+ **The fix:** Follow the recommended testing order from HC3. Test the assumption that could kill your idea first. If it survives, test the next one. Sequential testing is slower but produces clean evidence.
407
+
408
+ ### 7. "Production Data Without Experiment Lineage"
409
+
410
+ **The mistake:** Treating production metrics as standalone signals without connecting them back to original hypotheses.
411
+
412
+ **Why it fails:** A metric going up means nothing without context. Noah's job is to interpret signals *through the lens of your hypotheses* — that's the experiment lineage. Without it, you're reacting to noise.
413
+
414
+ **The fix:** Always ensure Noah has Wade's HC4 experiment context before interpreting signals. The lineage is what turns data into intelligence.
415
+
416
+ ---
417
+
418
+ ## Quick Reference: Agent Cheat Sheet
419
+
420
+ | Agent | Stream | Core Question | Primary Workflows | Key Output |
421
+ |-------|--------|--------------|-------------------|------------|
422
+ | Emma 🎯 | Contextualize | Who are we building for and why? | Lean Persona, Product Vision, Contextualize Scope | Lean personas, product vision, problem scope |
423
+ | Isla 🔍 | Empathize | What do real users actually experience? | Empathy Map, User Interview, User Discovery | Empathy artifacts, interview findings, discovery research |
424
+ | Mila 🔬 | Synthesize | What's the single problem worth solving? | Research Convergence, Pivot Resynthesis, Pattern Mapping | HC2 problem definition (JTBD + Pains & Gains) |
425
+ | Liam 💡 | Hypothesize | What are our testable bets? | Hypothesis Engineering, Assumption Mapping, Experiment Design | HC3 hypothesis contracts with risk maps |
426
+ | Wade 🧪 | Externalize | What's the cheapest way to test this? | Lean Experiment, Proof of Concept, Proof of Value, MVP | Experiment results with baselines and success criteria |
427
+ | Noah 📡 | Sensitize | What is production telling us? | Signal Interpretation, Behavior Analysis, Production Monitoring | HC5 signal reports with experiment lineage |
428
+ | Max 🧭 | Systematize | What should we do with this evidence? | Learning Card, Pivot/Patch/Persevere, Vortex Navigation | Strategic decisions with rationale and action plans |
429
+
430
+ ---
431
+
432
+ ## Further Reading
433
+
434
+ - **Per-agent guides:** See `EMMA-USER-GUIDE.md` through `MAX-USER-GUIDE.md` in this directory for invocation details, menu options, and troubleshooting
435
+ - **Compass Routing Reference:** `_bmad/bme/_vortex/compass-routing-reference.md` — the authoritative routing table
436
+ - **Handoff Contract Schemas:** `_bmad/bme/_vortex/contracts/` — the exact artifact formats
437
+ - **Innovation Vortex (unFIX):** [unfix.com/innovation-vortex](https://unfix.com/innovation-vortex) — the original pattern this team implements
438
+
439
+ ---
440
+
441
+ *The Vortex doesn't tell you what to build. It tells you what's worth building — and gives you the evidence to prove it.*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convoke-agents",
3
- "version": "3.0.4",
3
+ "version": "3.1.0",
4
4
  "description": "Agent teams for complex systems, compatible with BMad Method",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -23,7 +23,9 @@
23
23
  "convoke-update": "scripts/update/convoke-update.js",
24
24
  "convoke-version": "scripts/update/convoke-version.js",
25
25
  "convoke-migrate": "scripts/update/convoke-migrate.js",
26
- "convoke-doctor": "scripts/convoke-doctor.js"
26
+ "convoke-doctor": "scripts/convoke-doctor.js",
27
+ "convoke-migrate-artifacts": "scripts/migrate-artifacts.js",
28
+ "convoke-portfolio": "scripts/lib/portfolio/portfolio-engine.js"
27
29
  },
28
30
  "scripts": {
29
31
  "install:agents": "node scripts/install-all-agents.js",
@@ -36,7 +38,8 @@
36
38
  "test:coverage": "c8 node --test tests/unit/*.test.js tests/integration/*.test.js tests/p0/*.test.js",
37
39
  "lint": "eslint scripts/ index.js tests/",
38
40
  "docs:audit": "node scripts/docs-audit.js",
39
- "archive": "node scripts/archive.js"
41
+ "archive": "node scripts/archive.js",
42
+ "check": "node scripts/convoke-check.js"
40
43
  },
41
44
  "keywords": [
42
45
  "convoke-agents",
@@ -72,6 +75,7 @@
72
75
  "dependencies": {
73
76
  "chalk": "^4.1.2",
74
77
  "fs-extra": "^11.3.3",
78
+ "gray-matter": "^4.0.3",
75
79
  "js-yaml": "^4.1.0"
76
80
  },
77
81
  "devDependencies": {
@@ -3,15 +3,13 @@
3
3
  const fs = require('fs-extra');
4
4
  const path = require('path');
5
5
  const { findProjectRoot } = require('./update/lib/utils');
6
-
7
- // --- Category registry from ADR ---
8
- const VALID_CATEGORIES = [
9
- 'prd', 'epic', 'arch', 'adr', 'brief', 'report', 'spec', 'vision',
10
- 'hc', 'persona', 'experiment', 'learning', 'sprint', 'decision',
11
- 'research'
12
- ];
13
-
14
- const NAMING_PATTERN = /^[a-z][a-z0-9-]*\.(?:md|yaml)$/;
6
+ const {
7
+ parseFilename,
8
+ NAMING_PATTERN,
9
+ toLowerKebab,
10
+ ensureCleanTree,
11
+ scanArtifactDirs
12
+ } = require('./lib/artifact-utils');
15
13
 
16
14
  // Living documents that are exempt from the category prefix requirement
17
15
  const EXEMPT_FILES = [
@@ -27,37 +25,6 @@ const SKIP_ROOT = ['.backups', '.logs', '_archive', ...SCAN_DIRS,
27
25
  'brainstorming', 'design-artifacts', 'journey-examples',
28
26
  'project-documentation', 'test-artifacts'];
29
27
 
30
- function isValidCategory(cat) {
31
- const base = cat.replace(/\d+$/, '');
32
- return VALID_CATEGORIES.includes(base) || VALID_CATEGORIES.includes(cat);
33
- }
34
-
35
- const DATED_PATTERN = /^(.+)-(\d{4}-\d{2}-\d{2})\.(md|yaml)$/;
36
- const CATEGORIZED_PATTERN = /^([a-z]+\d*)-(.+)\.(md|yaml)$/;
37
-
38
- // --- Helpers ---
39
-
40
- function parseFilename(filename) {
41
- const lower = filename.toLowerCase();
42
- const dated = lower.match(DATED_PATTERN);
43
- const categorized = lower.match(CATEGORIZED_PATTERN);
44
-
45
- return {
46
- filename,
47
- isDated: !!dated,
48
- date: dated ? dated[2] : null,
49
- baseName: dated ? dated[1] : lower.replace(/\.(md|yaml)$/, ''),
50
- category: categorized ? categorized[1] : null,
51
- hasValidCategory: categorized ? isValidCategory(categorized[1]) : false,
52
- isUppercase: filename !== lower,
53
- matchesConvention: NAMING_PATTERN.test(filename) && categorized && isValidCategory(categorized[1])
54
- };
55
- }
56
-
57
- function toLowerKebab(filename) {
58
- return filename.toLowerCase();
59
- }
60
-
61
28
  function groupByKey(files) {
62
29
  const groups = {};
63
30
  for (const f of files) {
@@ -117,6 +84,16 @@ Dry-run by default — shows what would happen without changing anything.
117
84
  process.exit(1);
118
85
  }
119
86
 
87
+ // Clean tree check — only when applying changes (dry-run is safe)
88
+ if (apply) {
89
+ try {
90
+ ensureCleanTree(SCAN_DIRS, projectRoot);
91
+ } catch (err) {
92
+ console.error(`❌ ${err.message}`);
93
+ process.exit(1);
94
+ }
95
+ }
96
+
120
97
  const outputDir = path.join(projectRoot, '_bmad-output');
121
98
  const archiveDir = path.join(outputDir, '_archive');
122
99
  const indexPath = path.join(archiveDir, 'INDEX.md');
@@ -124,13 +101,17 @@ Dry-run by default — shows what would happen without changing anything.
124
101
  const actions = { archive: [], rename: [], warnings: [] };
125
102
 
126
103
  // 1. Scan subdirectories for superseded dated files
104
+ const scannedFiles = await scanArtifactDirs(projectRoot, SCAN_DIRS);
105
+ // Group scanned files by directory for per-dir processing
106
+ const filesByDir = {};
107
+ for (const f of scannedFiles) {
108
+ if (!filesByDir[f.dir]) filesByDir[f.dir] = [];
109
+ filesByDir[f.dir].push({ ...parseFilename(f.filename), dir: f.dir, fullPath: f.fullPath });
110
+ }
111
+
127
112
  for (const dir of SCAN_DIRS) {
128
113
  const fullDir = path.join(outputDir, dir);
129
- if (!fs.existsSync(fullDir)) continue;
130
-
131
- const files = (await fs.readdir(fullDir))
132
- .filter(f => !f.startsWith('.'))
133
- .map(f => ({ ...parseFilename(f), dir }));
114
+ const files = filesByDir[dir] || [];
134
115
 
135
116
  // Find superseded versions
136
117
  const groups = groupByKey(files);
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Convoke Check — Local CI mirror.
5
+ *
6
+ * Runs the same checks as .github/workflows/ci.yml so failures are caught
7
+ * before push. Intended for use in dev-story step 9 and manual pre-push.
8
+ *
9
+ * Steps (matching CI jobs):
10
+ * 1. Lint (npm run lint)
11
+ * 2. Unit tests (npm test)
12
+ * 3. Integration (npm run test:integration)
13
+ * 4. Jest lib (npx jest tests/lib/)
14
+ * 5. Coverage (npm run test:coverage) [--skip-coverage to omit]
15
+ *
16
+ * @module convoke-check
17
+ */
18
+
19
+ const { execSync } = require('child_process');
20
+ const { findProjectRoot } = require('./update/lib/utils');
21
+
22
+ const STEPS = [
23
+ { name: 'Lint', cmd: 'npm run lint' },
24
+ { name: 'Unit tests', cmd: 'npm test' },
25
+ { name: 'Integration tests', cmd: 'npm run test:integration' },
26
+ { name: 'Jest lib tests', cmd: 'npx jest tests/lib/ --no-coverage' },
27
+ { name: 'Coverage', cmd: 'npm run test:coverage', skippable: true }
28
+ ];
29
+
30
+ function run() {
31
+ const args = process.argv.slice(2);
32
+
33
+ if (args.includes('--help') || args.includes('-h')) {
34
+ console.log(`
35
+ Usage: convoke-check [options]
36
+
37
+ Runs the full CI-equivalent validation locally.
38
+
39
+ Options:
40
+ --skip-coverage Skip the coverage step (faster)
41
+ --help, -h Show this help
42
+ `);
43
+ return;
44
+ }
45
+
46
+ const projectRoot = findProjectRoot();
47
+ if (!projectRoot) {
48
+ console.error('Error: Not in a Convoke project. Could not find _bmad/ directory.');
49
+ process.exit(1);
50
+ }
51
+
52
+ const skipCoverage = args.includes('--skip-coverage');
53
+ const results = [];
54
+ let failed = false;
55
+
56
+ for (const step of STEPS) {
57
+ if (step.skippable && skipCoverage) {
58
+ results.push({ name: step.name, status: 'skipped' });
59
+ continue;
60
+ }
61
+
62
+ console.log(`\n--- ${step.name} ---`);
63
+ try {
64
+ execSync(step.cmd, { cwd: projectRoot, stdio: 'inherit' });
65
+ results.push({ name: step.name, status: 'pass' });
66
+ } catch {
67
+ results.push({ name: step.name, status: 'FAIL' });
68
+ failed = true;
69
+ // Continue to run remaining steps so all failures are visible
70
+ }
71
+ }
72
+
73
+ // Summary
74
+ console.log('\n=== Convoke Check Summary ===');
75
+ for (const r of results) {
76
+ const icon = r.status === 'pass' ? 'PASS' : r.status === 'skipped' ? 'SKIP' : 'FAIL';
77
+ console.log(` [${icon}] ${r.name}`);
78
+ }
79
+
80
+ if (failed) {
81
+ console.log('\nCI check FAILED. Fix the above issues before pushing.');
82
+ process.exit(1);
83
+ } else {
84
+ console.log('\nAll checks passed. Safe to push.');
85
+ }
86
+ }
87
+
88
+ run();