@iamu-dev/iamu 0.2.0-beta.4 → 0.2.0-beta.6
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/dist/bin.js +238 -23
- package/dist/commands/start-run.d.ts +52 -0
- package/dist/index.js +238 -23
- package/dist/templates/skills/iamu-findings.md +27 -29
- package/dist/templates/skills/iamu-new.md +42 -43
- package/dist/templates/skills/iamu-propose.md +34 -18
- package/dist/templates/skills/iamu-run.md +99 -43
- package/dist/templates/skills/iamu-status.md +21 -14
- package/package.json +2 -2
|
@@ -56,53 +56,48 @@ Determine the mode based on `$ARGUMENTS` and user intent:
|
|
|
56
56
|
|
|
57
57
|
### 2. Propose scenario seeds
|
|
58
58
|
|
|
59
|
-
Propose 2–3 scenario seeds
|
|
59
|
+
Propose 2–3 scenario seeds as scannable numbered cards. Do NOT use multi-column markdown tables with full prose sentences (they wrap awkwardly and break borders in terminal viewports). If personas exist in `iamu/personas/`, explicitly indicate which existing cast member pairs with each seed concept.
|
|
60
60
|
|
|
61
61
|
```
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
1. <Title> (<Type> · <existing persona slug or context actor>)
|
|
63
|
+
• Tension: <1 concise sentence on the human or organizational tension>
|
|
64
|
+
• Stress-tests: <What this reveals about the product>
|
|
65
|
+
|
|
66
|
+
2. <Title> (<Type> · <existing persona slug or context actor>)
|
|
67
|
+
• Tension: <1 concise sentence>
|
|
68
|
+
• Stress-tests: <What this reveals about the product>
|
|
69
|
+
|
|
70
|
+
3. <Title> (<Type> · <existing persona slug or context actor>)
|
|
71
|
+
• Tension: <1 concise sentence>
|
|
72
|
+
• Stress-tests: <What this reveals about the product>
|
|
67
73
|
```
|
|
68
74
|
|
|
69
75
|
Ask the user: "Which seed should we develop (1–3), or suggest another angle?"
|
|
70
76
|
|
|
71
77
|
### 3. Develop the situation
|
|
72
78
|
|
|
73
|
-
Once the user picks a direction, draft the
|
|
74
|
-
|
|
75
|
-
- **Narrative** (3–5 sentences) — mundane specifics, not abstract test language. Time pressure, competing priorities, real constraints. Write it as a human story.
|
|
76
|
-
- **Tension** (usually null; set only when two legitimate needs genuinely collide — e.g., speed vs. thoroughness, privacy vs. transparency)
|
|
77
|
-
- **Situation roles** (2–4 people with stakes) — each person should see the situation differently. Not conflict for drama — realistic tension like: one person wants to move on, another wants to investigate.
|
|
78
|
-
- **Complexity level**
|
|
79
|
-
|
|
80
|
-
**Before finalizing**, ask the user: "What should this walkthrough focus on?" This is the research question — what they want to learn. Examples: "Can a new admin onboard without training?", "Does the checkout flow work under time pressure?", "Is the reporting workflow accessible to non-technical users?"
|
|
81
|
-
|
|
82
|
-
From their answer, derive ONE concrete human test — a specific yes/partial/no checkpoint the evaluation step will score. Suggest it and let the user refine:
|
|
79
|
+
Once the user picks a direction (e.g. "1"), draft the situation concisely.
|
|
83
80
|
|
|
84
|
-
|
|
85
|
-
> Human test: "Could the admin complete employee bulk-import without consulting documentation?"
|
|
81
|
+
Do NOT ask an open-ended question like "What should this walkthrough focus on?" and then immediately answer it yourself in the same turn. Instead, propose an opinionated research focus question and one concrete binary (yes/partial/no) human checkpoint directly in the draft for the user to confirm or adjust.
|
|
86
82
|
|
|
87
|
-
|
|
83
|
+
Do NOT use markdown blockquote syntax (`>`), which renders as stray `|` pipe characters in terminal frontends. Keep the narrative capped at 2–3 punchy sentences (problem-space only, zero UI terms).
|
|
88
84
|
|
|
89
85
|
Present the draft to the user as a structured, scannable block **before creating anything**:
|
|
90
86
|
|
|
91
87
|
```
|
|
92
88
|
### Situation Draft: <Name>
|
|
93
89
|
|
|
94
|
-
|
|
95
|
-
>
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
> **Human Checkpoint:** <derived checkpoint question>
|
|
90
|
+
Narrative: <2–3 sentences describing the human situation, time pressure, or physical reality without mentioning software UI>
|
|
91
|
+
Tension: <Legitimate colliding needs or "None">
|
|
92
|
+
Focus Question: <Proposed research focus question, e.g. "Can a frontline worker submit an urgent slip hazard report in under 60 seconds without abandoning floor duties?">
|
|
93
|
+
Human Checkpoint: <Concrete binary yes/partial/no question scored at evaluation>
|
|
99
94
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
95
|
+
Roles with Stakes:
|
|
96
|
+
• <Role 1>: <Stake>
|
|
97
|
+
• <Role 2>: <Stake>
|
|
103
98
|
```
|
|
104
99
|
|
|
105
|
-
|
|
100
|
+
Ask the user: "Ready to test this draft, or would you like to refine the focus question or circumstances? (Enter to accept, or type adjustments)"
|
|
106
101
|
|
|
107
102
|
### 4. Pick or propose personas
|
|
108
103
|
|
|
@@ -110,25 +105,25 @@ User approves, refines ("make it more time-pressured"), or rejects.
|
|
|
110
105
|
Inspect `iamu/personas/` (`iamu list personas`). If an existing persona in the casting panel is a natural fit for this situation, propose them first to build longitudinal test history:
|
|
111
106
|
`Reusable from panel: <slug> (<role>) — <why they fit this situation>`
|
|
112
107
|
|
|
113
|
-
If no existing persona fits, or if testing an uncovered perspective is needed, propose 2–3 persona candidates
|
|
114
|
-
|
|
115
|
-
- Different roles (the manager vs. the field worker vs. the auditor)
|
|
116
|
-
- Different dispositions (the patient learner vs. the harried pragmatist)
|
|
117
|
-
- Different contexts (first time vs. experienced, desktop vs. mobile, fluent vs. second-language)
|
|
108
|
+
If no existing persona fits, or if testing an uncovered perspective is needed, propose 2–3 persona candidates as numbered cards (do NOT use a wide table):
|
|
118
109
|
|
|
119
110
|
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
111
|
+
1. <Name> (<Role>)
|
|
112
|
+
• Friction & Biases: <Specific friction triggers, skepticism, and bounce risks>
|
|
113
|
+
• Why this tests something different: <Unique perspective or workflow divergence>
|
|
114
|
+
|
|
115
|
+
2. <Name> (<Role>)
|
|
116
|
+
• Friction & Biases: <Specific friction triggers, skepticism, and bounce risks>
|
|
117
|
+
• Why this tests something different: <Unique perspective or workflow divergence>
|
|
125
118
|
```
|
|
126
119
|
|
|
127
120
|
The user picks one (or more — each becomes a separate scenario). "New" to propose different candidates. "Skip" to save as draft without a persona.
|
|
128
121
|
|
|
129
122
|
### 5. Classify into capabilities
|
|
130
123
|
|
|
131
|
-
Situations carry ONE primary capability (product area grouping) and optional secondary capabilities (cross-cutting tags). Read existing capabilities from `iamu/capabilities
|
|
124
|
+
Situations carry ONE primary capability (product area grouping) and optional secondary capabilities (cross-cutting tags). Read existing capabilities directly from `iamu/capabilities/` or `iamu/context.yml`.
|
|
125
|
+
|
|
126
|
+
Do NOT execute interactive bash commands (like `iamu list capabilities`) during conversational turns; resolve capabilities silently from workspace files.
|
|
132
127
|
|
|
133
128
|
- **High confidence match** → assign silently, one line: `Capability: <slug> (auto)`
|
|
134
129
|
- **Low confidence or new** → ask: "Create new capability `<slug>`?"
|
|
@@ -178,12 +173,16 @@ For drafts (no persona): omit `--persona`, omit the brief body.
|
|
|
178
173
|
|
|
179
174
|
### 7. Summarize
|
|
180
175
|
|
|
176
|
+
Present the created entities with clickable file links and exact run commands:
|
|
177
|
+
|
|
181
178
|
```
|
|
182
|
-
Scenario: <scenario-slug>
|
|
183
|
-
Situation: <
|
|
184
|
-
Persona: <persona-
|
|
179
|
+
Created Scenario: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md)
|
|
180
|
+
• Situation: [<outline-slug>](iamu/outlines/<outline-slug>.md)
|
|
181
|
+
• Persona: [<persona-slug>](iamu/personas/<persona-slug>.md) (or "draft — no persona bound yet")
|
|
182
|
+
• Capability: <primary_capability>
|
|
185
183
|
|
|
186
|
-
|
|
184
|
+
Next step:
|
|
185
|
+
iamu-run <scenario-slug> # Run walkthrough as <persona-name>
|
|
187
186
|
```
|
|
188
187
|
|
|
189
188
|
Run `iamu validate --all` to verify all entities before reporting done.
|
|
@@ -61,40 +61,56 @@ Four entry paths based on `$ARGUMENTS`:
|
|
|
61
61
|
- **Open-ended** (e.g. `iamu-propose`, `iamu-propose "what's missing?"`) — analyze coverage gaps across both scenarios and persona diversity. Prioritize uncovered capabilities and actors without personas.
|
|
62
62
|
- **Specific tension** (e.g. `iamu-propose "what happens when the safety coordinator disagrees with HR?"`) — use as seed but ground in context. Verify the tension is real (do these actors and dynamics exist in the domain?).
|
|
63
63
|
|
|
64
|
-
### 4. Present candidates (
|
|
64
|
+
### 4. Present candidates (Numbered Cards)
|
|
65
65
|
|
|
66
|
-
Present candidates
|
|
66
|
+
Present candidates as scannable numbered cards. Do NOT use multi-column markdown tables with full prose sentences (they wrap awkwardly and break borders in terminal viewports). Do NOT dump long paragraphs, full narratives, or regulatory citations upfront.
|
|
67
67
|
|
|
68
68
|
#### A. When proposing Scenarios:
|
|
69
69
|
|
|
70
|
-
Lead with
|
|
70
|
+
Lead with existing coverage using clickable links, then render the candidates:
|
|
71
71
|
|
|
72
72
|
```
|
|
73
|
-
Existing coverage: <N> scenarios (<
|
|
73
|
+
Existing coverage: <N> scenarios ([<slug1>](iamu/scenarios/<slug1>.md), ...). Uncovered areas: <gaps>.
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
| 2 | ... | ... | ... | ... |
|
|
79
|
-
| 3 | ... | ... | ... | ... |
|
|
75
|
+
1. <Short situation name> (<Actor from context>)
|
|
76
|
+
• Tension: <1-line human/domain tension>
|
|
77
|
+
• Stress-tests: <What this reveals about the product>
|
|
80
78
|
|
|
81
|
-
|
|
79
|
+
2. <Short situation name> (<Actor from context>)
|
|
80
|
+
• Tension: <1-line human/domain tension>
|
|
81
|
+
• Stress-tests: <What this reveals about the product>
|
|
82
|
+
|
|
83
|
+
3. <Short situation name> (<Actor from context>)
|
|
84
|
+
• Tension: <1-line human/domain tension>
|
|
85
|
+
• Stress-tests: <What this reveals about the product>
|
|
86
|
+
|
|
87
|
+
Next action:
|
|
88
|
+
Type 1, 2, or 3 to scaffold via iamu-new
|
|
89
|
+
Or describe adjustments (e.g. "make #2 more time-pressured", "explore <area>")
|
|
82
90
|
```
|
|
83
91
|
|
|
84
92
|
#### B. When proposing Personas:
|
|
85
93
|
|
|
86
|
-
Lead with existing persona coverage and uncovered roles from `context.yml`:
|
|
94
|
+
Lead with existing persona coverage using clickable links and uncovered roles from `context.yml`:
|
|
87
95
|
|
|
88
96
|
```
|
|
89
|
-
Existing personas: <
|
|
97
|
+
Existing personas: [<slug1>](iamu/personas/<slug1>.md), ... Uncovered roles from context.yml: <roles>.
|
|
98
|
+
|
|
99
|
+
1. <Name> (<Actor role>)
|
|
100
|
+
• Friction & Biases: <Specific friction triggers, skepticism, and bounce risks>
|
|
101
|
+
• Key Expectations & Vocabulary: <Domain terms and spec requirements>
|
|
102
|
+
|
|
103
|
+
2. <Name> (<Actor role>)
|
|
104
|
+
• Friction & Biases: <Specific friction triggers, skepticism, and bounce risks>
|
|
105
|
+
• Key Expectations & Vocabulary: <Domain terms and spec requirements>
|
|
90
106
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
| 2 | ... | ... | ... | ... |
|
|
95
|
-
| 3 | ... | ... | ... | ... |
|
|
107
|
+
3. <Name> (<Actor role>)
|
|
108
|
+
• Friction & Biases: <Specific friction triggers, skepticism, and bounce risks>
|
|
109
|
+
• Key Expectations & Vocabulary: <Domain terms and spec requirements>
|
|
96
110
|
|
|
97
|
-
|
|
111
|
+
Next action:
|
|
112
|
+
Type 1, 2, or 3 to scaffold via iamu-new
|
|
113
|
+
Or describe adjustments
|
|
98
114
|
```
|
|
99
115
|
|
|
100
116
|
Ground rules for generation:
|
|
@@ -185,12 +185,16 @@ The result's `walker_prompt` is the walker's entire prompt. Pass it verbatim —
|
|
|
185
185
|
|
|
186
186
|
A fresh subagent is NOT blind by default. On most hosts it still loads the project's agent instructions and can read files in the repo, so it may know the domain model, the route table, and why a screen was built the way it was — none of which the persona knows. The methodology's "Stay outside the product" rule is what keeps it honest; it is part of `walker_prompt` — never remove or soften it. If the host lets you restrict a subagent's tools, give the walker only the driving surface, file write/edit, and a shell for `iamu` commands.
|
|
187
187
|
|
|
188
|
+
**Model tiering & subagent dispatch:**
|
|
189
|
+
- **Walker (Browser Navigation):** High turn count, mechanical tool-use. Use the **fast** model tier (`flash` or `haiku`) by default to cut walk time by ~60% and conserve session quota.
|
|
190
|
+
- **Matcher & Judge:** Broad synthesis and semantic comparison. Use the **thorough** frontier tier (`pro`, `sonnet`, or active model) to prevent severity inflation.
|
|
191
|
+
|
|
188
192
|
```
|
|
189
193
|
# In Claude Code:
|
|
190
|
-
Agent({ description: "Walk <scenario-slug> as <persona.name>", prompt: "<walker_prompt, verbatim>" })
|
|
194
|
+
Agent({ description: "Walk <scenario-slug> as <persona.name>", model: "haiku", prompt: "<walker_prompt, verbatim>" })
|
|
191
195
|
|
|
192
196
|
# In Antigravity / generic subagent hosts:
|
|
193
|
-
invoke_subagent(Role="Persona Walker", Prompt="<walker_prompt, verbatim>")
|
|
197
|
+
invoke_subagent(Role="Persona Walker", Model="flash", Prompt="<walker_prompt, verbatim>")
|
|
194
198
|
```
|
|
195
199
|
|
|
196
200
|
The subagent inherits the driving-surface tools and drives the product independently. It does not see this conversation.
|
|
@@ -202,7 +206,7 @@ The subagent inherits the driving-surface tools and drives the product independe
|
|
|
202
206
|
- **Screenshot every 3-4 taps at most.** Batching more desyncs the moment an answer opens a screen she did not expect.
|
|
203
207
|
- **Coordinates are device points, origin top-left.** A scaled screenshot must be mapped back to that space before tapping.
|
|
204
208
|
|
|
205
|
-
**If subagent dispatch is not supported by your host editor** (e.g. standard Cursor
|
|
209
|
+
**If subagent dispatch or model-switching is not supported by your host editor** (e.g. standard Cursor / Windsurf single-session mode), fall back to walking directly in the current session (inheriting the active model) — but strictly adhere to the persona behavioral constraints in `walker_prompt`.
|
|
206
210
|
|
|
207
211
|
After the walker returns, continue to the post-walk pipeline below.
|
|
208
212
|
|
|
@@ -215,6 +219,12 @@ Use atomic CLI commands to drive and record in one step — do NOT manually auth
|
|
|
215
219
|
iamu browse step --run <run-id> --action "Opened dashboard" --note "First thing I see is the overview panel" goto https://app.example.com/dashboard
|
|
216
220
|
iamu browse step --run <run-id> --action "Click checkout" --note "Button was hard to find" click button "Checkout"
|
|
217
221
|
```
|
|
222
|
+
**Avoid shell quoting friction:** When persona notes or actions contain quotes, apostrophes, or multi-line monologues, use `--step-file <path>` (or `-` for stdin) to avoid shell escaping errors:
|
|
223
|
+
```bash
|
|
224
|
+
iamu browse step --run <run-id> --step-file <path-to-step.json> click button "Checkout"
|
|
225
|
+
# or pass the entire action payload including cmd via JSON / stdin:
|
|
226
|
+
# { "action": "...", "note": "...", "cmd": ["click", "button", "Checkout"] }
|
|
227
|
+
```
|
|
218
228
|
This executes the browser action, waits for the DOM, takes the screenshot into `screenshots/step-N.png`, captures the URL, and writes `steps/NNN.json` atomically.
|
|
219
229
|
|
|
220
230
|
- **When using an external surface (iOS Simulator / custom MCP):**
|
|
@@ -249,26 +259,21 @@ Findings never name a human test: the walker does not see them. The judge links
|
|
|
249
259
|
|
|
250
260
|
After the walker returns, you MUST complete ALL of the following before presenting findings to the user. Do NOT present findings early. Do NOT ask the user anything. Execute steps A→B→C→D→E in order.
|
|
251
261
|
|
|
252
|
-
**A. Assemble canonical + report.** Use
|
|
262
|
+
**A. Assemble canonical + report (local).** Use `--no-push` so post-processing stays fast, local, and synchronous:
|
|
253
263
|
|
|
254
264
|
```bash
|
|
255
|
-
iamu complete <run-id> --no-prompt
|
|
265
|
+
iamu complete <run-id> --no-prompt --no-push --json
|
|
256
266
|
```
|
|
257
267
|
|
|
258
|
-
This reads all steps, findings, and entity files, assembles `canonical.json`, generates `report.md`, computes the delta against prior runs
|
|
268
|
+
This reads all steps, findings, and entity files, assembles `canonical.json`, generates `report.md`, and computes the delta against prior runs.
|
|
259
269
|
|
|
260
|
-
|
|
261
|
-
```bash
|
|
262
|
-
iamu complete <run-id> --no-prompt --json
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
**B. Match findings to earlier runs.** A fresh walker never words a recurring problem the same way twice, so `complete` alone reports recurrences as new and earlier findings as "not seen". Get the matcher bundle:
|
|
270
|
+
**B. Match findings to earlier runs.** Get the matcher bundle:
|
|
266
271
|
|
|
267
272
|
```bash
|
|
268
273
|
iamu match <run-id> --json
|
|
269
274
|
```
|
|
270
275
|
|
|
271
|
-
If `needed` is `false` (no earlier findings for this scenario, or none this run), skip to C. Otherwise dispatch a matcher subagent with
|
|
276
|
+
If `needed` is `false` (no earlier findings for this scenario, or none this run), skip to C. Otherwise, read the prompt from `iamu/.runs/<run-id>/match_prompt.md` directly and dispatch a matcher subagent with it as its only context (use the **thorough** model tier, e.g. `Model="pro"` in Antigravity, to accurately evaluate semantic equivalence). Write its JSON answer to `<matches.json>` and record it:
|
|
272
277
|
|
|
273
278
|
```bash
|
|
274
279
|
iamu match-record <run-id> --file <matches.json>
|
|
@@ -276,23 +281,23 @@ iamu match-record <run-id> --file <matches.json>
|
|
|
276
281
|
|
|
277
282
|
This links recurrences to their earlier canonical finding, marks earlier findings the run's steps show fixed (only with cited steps), and re-derives the delta and report. If the matcher's output is rejected, show the error to the matcher once and retry; if it fails again, continue without it — the exact-text delta from A stands.
|
|
278
283
|
|
|
279
|
-
**C. Evaluate human tests.**
|
|
284
|
+
**C. Evaluate human tests.** Get the evaluation prompt:
|
|
280
285
|
|
|
281
286
|
```bash
|
|
282
287
|
iamu evaluate <run-id> --json
|
|
283
288
|
```
|
|
284
289
|
|
|
285
|
-
|
|
290
|
+
Read the evaluation prompt from `iamu/.runs/<run-id>/judge_prompt.md` directly. Dispatch the evaluator as a subagent with that prompt (use the **thorough** model tier, e.g. `Model="pro"` in Antigravity, to prevent severity inflation). After the evaluator returns verdicts, record them locally with `--no-push`:
|
|
286
291
|
|
|
287
292
|
```bash
|
|
288
|
-
iamu evaluate-record <run-id> --file <verdicts.json> --no-prompt
|
|
293
|
+
iamu evaluate-record <run-id> --file <verdicts.json> --no-prompt --no-push
|
|
289
294
|
```
|
|
290
295
|
|
|
291
|
-
This
|
|
296
|
+
This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
|
|
292
297
|
|
|
293
298
|
**D. Read the completed canonical.** Read `iamu/.runs/<run-id>/canonical.json` for the final data including verification delta (if a prior run exists). Use this for step 5 presentation.
|
|
294
299
|
|
|
295
|
-
**E. Publish (linked mode only).**
|
|
300
|
+
**E. Publish (linked mode only).** Upload the completed run, screenshots, verdicts, and findings in one atomic sync:
|
|
296
301
|
|
|
297
302
|
```bash
|
|
298
303
|
iamu sync --json
|
|
@@ -320,15 +325,17 @@ The `walker_prompt` from `iamu instructions walk` is the source of truth and con
|
|
|
320
325
|
|
|
321
326
|
### 5. Present assessment — stay in the conversation
|
|
322
327
|
|
|
323
|
-
Render results **inline**
|
|
324
|
-
|
|
325
|
-
1. **Overall assessment** — answer the research question from the outline's human test. Read the outline's `human_tests[0].question` (the focus question the user defined when creating the scenario). Frame the verdict around it:
|
|
328
|
+
Render results **inline** with a high-contrast executive summary banner, followed by findings enriched with persona voice, evidence citations, and clickable file links.
|
|
326
329
|
|
|
327
|
-
|
|
330
|
+
1. **Executive Summary Banner & Focus Checkpoint**
|
|
328
331
|
|
|
329
|
-
|
|
332
|
+
Read the outline's `human_tests[0].question` and answer it directly. Use the evaluation verdict if available:
|
|
330
333
|
|
|
331
|
-
|
|
334
|
+
```
|
|
335
|
+
Walkthrough: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
|
|
336
|
+
Verdict: <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (Steps: <N>)
|
|
337
|
+
Focus Checkpoint: "<human_tests[0].question>" → <No / Partial / Yes>: <1-2 sentence direct answer explaining why>
|
|
338
|
+
```
|
|
332
339
|
|
|
333
340
|
2. **Progress since last run** (only when canonical.json contains a `verification` section). Present the delta:
|
|
334
341
|
|
|
@@ -340,25 +347,25 @@ Render results **inline** so the user can act without leaving the conversation.
|
|
|
340
347
|
+ 1 new since that run (date picker locale)
|
|
341
348
|
```
|
|
342
349
|
|
|
343
|
-
`resolved` means the matcher saw this run's steps do the thing the finding said failed — say which step. `not_observed` means only that this walk did not record the finding again. Never present it as fixed: the walker may have stopped before that screen or taken another route. Say which ones were not seen and, if the walk plainly never reached the screen they live on, say that too.
|
|
350
|
+
`resolved` means the matcher saw this run's steps do the thing the finding said failed — say which step. `not_observed` means only that this walk did not record the finding again. Never present it as fixed: the walker may have stopped before that screen or taken another route. Say which ones were not seen and, if the walk plainly never reached the screen they live on, say that too.
|
|
344
351
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
3. **Findings** — severity-first (CRITICAL → MAJOR → MINOR), grouped by type (hinders and missing first — the actionable ones — then helps at the bottom):
|
|
352
|
+
3. **Findings** — severity-first (CRITICAL → MAJOR → MINOR), grouped by type (hinders and missing first, helps at the bottom). For each finding, include the **persona reaction**, **evidence citation**, and **clickable link**:
|
|
348
353
|
|
|
349
354
|
**Hinders / Missing** (act on these):
|
|
350
355
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
+
1. [CRITICAL · hinders] Submit fails opaquely when required field empty ([file](iamu/findings/<slug>.md))
|
|
357
|
+
• Persona: <Persona Name>: "<Persona reaction quote or consequence showing real human friction>"
|
|
358
|
+
• Evidence: Step <N> at <url> (Screenshot: [view](iamu/.runs/<run-id>/screenshots/<NNN>.png))
|
|
359
|
+
• Recommendation: <Concrete recommendation from finding>
|
|
360
|
+
|
|
361
|
+
2. [MAJOR · hinders] Date picker has no "today" shortcut ([file](iamu/findings/<slug>.md))
|
|
362
|
+
• Persona: <Persona Name>: "<Persona reaction quote or consequence>"
|
|
363
|
+
• Evidence: Step <N> at <url>
|
|
364
|
+
• Recommendation: <Concrete recommendation from finding>
|
|
356
365
|
|
|
357
366
|
**Helps** (preserve these):
|
|
358
367
|
|
|
359
|
-
|
|
360
|
-
|---|------|---------|
|
|
361
|
-
| 4 | helps | Search auto-suggests from recent entries |
|
|
368
|
+
• [helps] Search auto-suggests from recent entries (Step <N>)
|
|
362
369
|
|
|
363
370
|
4. **What worked** — supportive moments worth preserving (brief, from `what_worked` in the canonical JSON).
|
|
364
371
|
|
|
@@ -369,16 +376,65 @@ Render results **inline** so the user can act without leaving the conversation.
|
|
|
369
376
|
|
|
370
377
|
6. **Cloud** — one line, by mode:
|
|
371
378
|
- **Linked, run on the cloud** → `Shareable report: <url>` (screenshots and step replay for anyone on the team).
|
|
372
|
-
- **Linked, run not on the cloud** → the reason from step E and its remedy, e.g. `Cloud: queued — retries on the next iamu sync
|
|
373
|
-
- **
|
|
374
|
-
- **Sync conflicts or pending deletions** (step E) → one line each: name the findings a teammate changed and give the CLI's resolution (`iamu pull --force` to take theirs after copying your edits aside, or `iamu sync --keep-mine` to keep yours — the user runs that one); for deletions, tell the user to review them and run `iamu sync --confirm-deletes` themselves.
|
|
375
|
-
- **Local-only** → nothing, with one exception: on the project's first completed run (`iamu status --json` → `runs.count` is 1), add `Want a link to share this report? iamu auth login connects the project to Iamu Cloud — optional, everything keeps working locally.` Never repeat it on later runs unless the user asks how to share a report.
|
|
379
|
+
- **Linked, run not on the cloud** → the reason from step E and its remedy, e.g. `Cloud: queued — retries on the next iamu sync`.
|
|
380
|
+
- **Local-only** → on first completed run: `Want a link to share this report? iamu auth login connects to Iamu Cloud — optional, everything keeps working locally.`
|
|
376
381
|
|
|
377
|
-
7. **
|
|
382
|
+
7. **Next actions (Conversational Triage)**:
|
|
378
383
|
|
|
379
|
-
|
|
384
|
+
Conclude your report with clear conversational prompts instead of raw terminal commands:
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
What would you like to do?
|
|
388
|
+
• "walk through them" → Review findings one by one with persona context & code location
|
|
389
|
+
• "fix 1 and 2" → Have me implement code fixes directly
|
|
390
|
+
• "discuss 2" → Ask why the persona hit this friction or explore trade-offs
|
|
391
|
+
• "skip 3" / "dismiss 3" → Dismiss finding (out of scope, intended, or walker error)
|
|
392
|
+
• "re-run" → Re-run walkthrough to verify fixes
|
|
393
|
+
```
|
|
380
394
|
|
|
381
|
-
|
|
395
|
+
### 6. Conversational Triage & Guided Review
|
|
396
|
+
|
|
397
|
+
The conversation is the triage surface. Do NOT eject the user to manual CLI commands or dump them at file paths.
|
|
398
|
+
|
|
399
|
+
#### A. Guided One-by-One Review ("walk through them" / "review one by one")
|
|
400
|
+
When the user asks to review findings one by one:
|
|
401
|
+
1. **Present Finding #N in isolation**:
|
|
402
|
+
- Number, severity, type, and title
|
|
403
|
+
- Persona consequence quote and why the friction occurred
|
|
404
|
+
- Relevant source code location (inspect project files to provide file path + line numbers)
|
|
405
|
+
- Step & screenshot evidence ([view](iamu/.runs/<run-id>/screenshots/<NNN>.png))
|
|
406
|
+
- Actionable recommendation
|
|
407
|
+
- Clear options prompt:
|
|
408
|
+
`Options: [Fix now] [Skip / Dismiss] [Discuss / Why] [Next finding]`
|
|
409
|
+
|
|
410
|
+
2. **Handle the user's decision**:
|
|
411
|
+
- **Fix now**:
|
|
412
|
+
Make the code edit, verify it loads (or check local tests/types), update the finding's frontmatter (`triage_status: addressed`, `triage_note: "<summary of fix>"`).
|
|
413
|
+
Tell the user the fix is applied and ask: "Ready for finding #<N+1>?".
|
|
414
|
+
- **Skip / Dismiss**:
|
|
415
|
+
If reason is not specified, ask or infer the appropriate category:
|
|
416
|
+
- `out_of_scope`: Not relevant to this project/flow scope.
|
|
417
|
+
- `not_relevant`: By design / intended behavior.
|
|
418
|
+
- `walker_error`: Walker misread the screen or made a navigational error.
|
|
419
|
+
- `duplicate`: Duplicate of another finding.
|
|
420
|
+
Execute: `iamu triage <slug> --status dismissed --reason <reason> --note "<why>"`.
|
|
421
|
+
Tell the user: "Dismissed as `<reason>` — created guidance rule in `iamu/guidance/<slug>.md` so future walkthroughs will not report this."
|
|
422
|
+
Then advance to finding #<N+1>.
|
|
423
|
+
- **Discuss / Why**:
|
|
424
|
+
Analyze why the persona experienced this friction, cite the persona brief and steps/screenshots, evaluate whether competitor tools solve this pattern, and give a direct opinion on whether it's worth fixing.
|
|
425
|
+
- **Next**:
|
|
426
|
+
Leave open (or set `triage_status: deferred` with note) and advance to finding #<N+1>.
|
|
427
|
+
|
|
428
|
+
3. **Wrap up after all findings are reviewed**:
|
|
429
|
+
- Run `iamu validate --all`.
|
|
430
|
+
- In linked mode, run `iamu sync --json` once so teammates see the triage decisions.
|
|
431
|
+
- Suggest re-running the walkthrough: `iamu-run <scenario-slug>` to verify fixes.
|
|
432
|
+
|
|
433
|
+
#### B. Direct Batch Actions ("fix 1 and 2", "fix all critical")
|
|
434
|
+
Read the finding details from the canonical JSON (already in context), inspect the code, make the edits, and update frontmatter to `triage_status: addressed` with `triage_note`.
|
|
435
|
+
|
|
436
|
+
#### C. Ad-hoc Questions & Challenges ("why did Karl do that?", "is #2 really a bug?")
|
|
437
|
+
Answer directly using persona brief context and step evidence. If the walker got confused or misinterpreted intended behavior, recommend dismissing as `walker_error` or `not_relevant` rather than adding unnecessary code.
|
|
382
438
|
|
|
383
439
|
**Linked mode: publish triage decisions.** When the user is done fixing and dismissing, run `iamu sync --json` once so teammates see the decisions (and any team request for these findings closes). Report it in one line (`Synced 3 findings to Iamu Cloud.`), with conflicts handled as in item 6. Do not sync after every single edit.
|
|
384
440
|
|
|
@@ -21,24 +21,28 @@ $ARGUMENTS
|
|
|
21
21
|
|
|
22
22
|
Do NOT use `find`, `grep`, or `cat` to dump raw `.md` files in `iamu/`. The CLI outputs clean, validated data.
|
|
23
23
|
|
|
24
|
-
### 2. Format entity responses
|
|
24
|
+
### 2. Format entity responses with an executive tally and clickable links
|
|
25
25
|
|
|
26
|
-
When the user asks for
|
|
26
|
+
When the user asks for project status, lead with an executive tally banner, followed by scannable tables with clickable markdown file links:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Project Status: <P> Personas · <S> Scenarios (<R> Tested, <U> Untested) · <F> Open Findings · <C> Capabilities
|
|
30
|
+
```
|
|
27
31
|
|
|
28
32
|
**Personas:**
|
|
29
33
|
| Slug | Name | Role | Status |
|
|
30
34
|
|---|---|---|---|
|
|
31
|
-
| `elin-dahl` | Elin Dahl | Architect & first-time house owner in Falun | active |
|
|
35
|
+
| [`elin-dahl`](iamu/personas/elin-dahl.md) | Elin Dahl | Architect & first-time house owner in Falun | active |
|
|
32
36
|
|
|
33
37
|
**Scenarios:**
|
|
34
38
|
| Slug | Persona | Outline | Status / Target |
|
|
35
39
|
|---|---|---|---|
|
|
36
|
-
| `replacing-windows` | `elin-dahl` | `measure-and-order` | ready |
|
|
40
|
+
| [`replacing-windows`](iamu/scenarios/replacing-windows.md) | [`elin-dahl`](iamu/personas/elin-dahl.md) | [`measure-and-order`](iamu/outlines/measure-and-order.md) | ready |
|
|
37
41
|
|
|
38
42
|
**Findings:**
|
|
39
|
-
| # | Severity | Type | Finding |
|
|
43
|
+
| # | Severity | Type | Finding | File |
|
|
40
44
|
|---|---|---|---|---|
|
|
41
|
-
| 1 | CRITICAL | hinders | Submit fails opaquely on empty field |
|
|
45
|
+
| 1 | CRITICAL | hinders | Submit fails opaquely on empty field | [`view`](iamu/findings/<slug>.md) |
|
|
42
46
|
|
|
43
47
|
### 3. Ignore internal templates
|
|
44
48
|
|
|
@@ -52,13 +56,16 @@ For a project-status question, add one line on the cloud from `iamu status --jso
|
|
|
52
56
|
- **Linked, no credentials** → `Cloud: linked, but this machine has no credentials — iamu auth login.`
|
|
53
57
|
- **Local-only** → `Cloud: local-only.` Nothing more; no upgrade pitch.
|
|
54
58
|
|
|
55
|
-
### 5. Provide
|
|
59
|
+
### 5. Provide copy-pasteable next actions
|
|
60
|
+
|
|
61
|
+
Conclude with exact copy-pasteable commands:
|
|
56
62
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
|
|
63
|
+
```
|
|
64
|
+
Next actions:
|
|
65
|
+
iamu-run <scenario-slug> # Run a walkthrough for this scenario
|
|
66
|
+
iamu-propose # Propose missing personas or scenarios
|
|
67
|
+
iamu-new # Draft a new scenario or persona
|
|
68
|
+
iamu-findings # Triage open findings
|
|
69
|
+
iamu open # Open project in cloud dashboard
|
|
70
|
+
```
|
|
64
71
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iamu-dev/iamu",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Test your product as realistic personas — scenario-driven development CLI",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"tsup": "^8.5.1",
|
|
58
58
|
"typescript": "^5.8.0",
|
|
59
59
|
"vitest": "^4.1.11",
|
|
60
|
-
"@iamu-dev/local-store": "0.1.0",
|
|
61
60
|
"@iamu-dev/protocol": "0.1.0",
|
|
61
|
+
"@iamu-dev/local-store": "0.1.0",
|
|
62
62
|
"@iamu/tsconfig": "0.1.0"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|