@iamu-dev/iamu 0.2.0-beta.12 → 0.2.0-beta.13

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.
@@ -131,51 +131,49 @@ Your walking prompt has an `## Access` section saying how to become this persona
131
131
 
132
132
  ## Recording
133
133
 
134
- **Steps:** Write each step as a separate file using the Write tool:
135
-
136
- Path: `iamu/.runs/<run-id>/steps/<NNN>.json` (zero-padded, e.g., `001.json`, `002.json`)
137
-
138
- ```json
139
- {
140
- "step_number": 1,
141
- "timestamp": "2026-04-27T10:00:00Z",
142
- "action": "Opened dashboard",
143
- "note": "First thing I see is...",
144
- "screenshot": "screenshots/step-1.png",
145
- "url": "https://app.example.com/dashboard",
146
- "surface": "dashboard overview"
147
- }
148
- ```
149
-
150
- `url` is the page you are on when the step ends — copy it from your driving surface (`iamu browse` prints it after every action), never reconstruct it. Record it on every step; it is how findings are grouped by page. Only a native app with no URL leaves it out.
134
+ **Steps:** Record each step atomically via the CLI — never hand-craft raw JSON step files with custom scripts or host Write tools:
151
135
 
152
- `surface` is optional: a short name for the screen in the product's own words (`search results`, `checkout — payment`), not a description of what happened.
136
+ - For `iamu browse`:
137
+ ```bash
138
+ iamu browse step --run <run-id> --action "<action>" --note "<first-person monologue>" <command> [args...]
139
+ ```
140
+ - For other surfaces:
141
+ ```bash
142
+ iamu step --run <run-id> --action "<action>" --note "<first-person monologue>" [--shot <screenshot-path>] [--url <url>]
143
+ ```
153
144
 
154
- `timestamp` is the real time of the step — you have no clock of your own, so read it with `date -u +%Y-%m-%dT%H:%M:%SZ` rather than inventing one. Made-up times make a run impossible to line up with server logs.
145
+ `action` is what you did (e.g. "Clicked Checkout button").
146
+ `note` is your internal first-person persona reaction in character.
147
+ The CLI automatically handles sequential numbering, timestamps, screenshot capture/linking, and live event streaming.
155
148
 
156
- One file per step. No appending. The Write tool creates the file without permission prompts.
157
-
158
- **Findings:** Always scaffold with the CLI — never create a finding file by hand, never invent an id:
149
+ **Findings:** Always scaffold with the CLI — never create finding files by hand or call host Edit/Write tools:
159
150
 
160
151
  ```bash
161
- iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type hinders --severity major --ui-fact "What the UI showed" --consequence "Impact on persona" --task-impact impairs --confidence high --json
152
+ iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type hinders --severity major --ui-fact "What the UI showed" --consequence "Impact on persona" --task-impact impairs --confidence high --description "Detailed markdown description of the issue" --recommendation "Concrete fix proposal" --json
162
153
  ```
163
154
 
164
- `--type` is one of `helps | hinders | missing | irrelevant | incorrect`. `--severity` is one of `critical | major | minor | observation`. They are different axes — a type is never a severity.
165
-
166
- Two more axes, both required on every finding:
155
+ - `--type`: `helps | hinders | missing | irrelevant | incorrect`
156
+ - `--severity`: `critical | major | minor | observation`
157
+ - `--task-impact`: `blocks | impairs | slows | neutral | accelerates | enables`
158
+ - `--confidence`: `high | medium | low`
159
+ - `--description`: markdown body describing what happened and why
160
+ - `--recommendation`: concrete suggestion for how to improve or fix the issue
167
161
 
168
- - `--task-impact` — what this does to the persona's task right now: `blocks` (cannot finish), `impairs` (finishes worse — wrong result, lost trust), `slows` (finishes, with needless effort), `neutral`, `accelerates` (faster than they expected), `enables` (could not have done it otherwise). A `helps` finding is `neutral`, `accelerates` or `enables`; a problem is never `accelerates` or `enables`.
169
- - `--confidence` — how sure you are this is real for this persona: `high` (you saw it on screen, clearly), `medium` (you saw it, but the persona might read it differently), `low` (it may be your tooling — say so in `consequence`). Then use the Edit tool to add the description and a `## Recommendation` section below the frontmatter. Leave `triage_status` alone; triage is not the walker's job.
162
+ Leave `triage_status` alone; triage is not the walker's job.
170
163
 
171
- **Screenshots:** Save to `iamu/.runs/<run-id>/screenshots/step-<N>.png` (pass an absolute path — some browser tools reject relative ones) before recording each step. Screenshots are optional — if the browser tool disconnects or screenshots fail, use accessibility snapshots instead and continue walking. A walkthrough with snapshots is better than no walkthrough.
164
+ **Screenshots:** Screenshots are captured automatically by `iamu browse step`. If driving manually, save to `iamu/.runs/<run-id>/screenshots/step-<N>.png` before recording each step. Screenshots are optional — if the browser tool disconnects or screenshots fail, use accessibility snapshots instead and continue walking.
172
165
 
173
- Use the Write tool for step files. Never use bash `cat`, `echo`, or heredocs to write files.
166
+ **Execution rule:** Execute everything via CLI commands in the shell. Never invoke host Edit or Write tools on files in the workspace.
174
167
 
175
168
  ## Synthesis
176
169
 
177
- After walking, compile:
178
- - **What worked** — Things the system did well for this persona. Important to preserve.
179
- - **Open questions** — Questions that arose that need discussion.
170
+ After walking, record your synthesis using the CLI:
171
+
172
+ ```bash
173
+ iamu summary <run-id> --worked "What worked well 1" --worked "What worked well 2" --question "Open question 1"
174
+ ```
175
+
176
+ - `--worked` — Things the system did well for this persona. Important to preserve.
177
+ - `--question` — Questions that arose that need discussion.
180
178
 
181
- Then return your summary so the orchestrating agent can run `iamu complete` and the evaluation stage.
179
+ Then return your final summary to the orchestrating agent so it can run `iamu complete` and the evaluation stage.
@@ -67,27 +67,22 @@ Filter to `triage_status: open`.
67
67
 
68
68
  A run that simply did not come across a finding proves nothing — never call a fix verified because it was not seen. After the list, if any fixes await a re-run, say how many and in which scenarios (`iamu status --json` → `rerun`, with `requests.open` for team requests), and offer `iamu-run <scenario>` for the first one.
69
69
 
70
- Group by `scenario` field and render with an executive tally header, followed by a severity-sorted list per scenario group (CRITICAL → MAJOR → MINOR → OBS; hinders and missing first, helps last), including persona quotes, evidence, and clickable file links:
70
+ Group by `scenario` field and render with an executive tally header, followed by a compact, severity-sorted 1-line list per finding (CRITICAL → MAJOR → MINOR → OBS; hinders and missing first, helps last):
71
71
 
72
72
  ```
73
73
  Findings Tally: <N> Open (<C> Critical · <M> Major · <m> Minor) across <S> Scenarios
74
74
  Awaiting verification: <K> addressed findings pending re-run
75
75
 
76
76
  ▼ [<scenario>](iamu/scenarios/<scenario>.md) (4 findings)
77
- 1. [CRITICAL · hinders] Handoff list is cluttered ([file](iamu/findings/<slug>.md))
78
- • Persona: <Persona Name>: "<Persona reaction or consequence quote>"
79
- • Evidence: Step <N> at <url>
80
- • Recommendation: Add status filter chips
81
-
82
- 2. [MAJOR · missing] No visible confirmation after shift submit ([file](iamu/findings/<slug>.md))
83
- • Persona: <Persona Name>: "<Persona reaction or consequence quote>"
84
- • Evidence: Step <N> at <url>
85
- • Recommendation: Show inline success toast
77
+ 1. [CRITICAL · hinders] Handoff list is cluttered (Step <N>)
78
+ 2. [MAJOR · missing] No visible confirmation after shift submit (Step <N>)
86
79
  ```
87
80
 
81
+ **ANTI-BLOAT DIRECTIVE:** Do NOT dump persona quotes, evidence URLs, or recommendations into the overview tally. Keep it strictly 1 line per finding so the user can scan it in 3 seconds.
82
+
88
83
  Ask the user how they would like to triage:
89
84
 
90
- - **"walk through them"** → iterate through all open findings one-by-one in order with full context, code location, and triage choices (`[Fix now] [Skip / Dismiss] [Discuss] [Next]`).
85
+ - **"walk through them"** → iterate through all open findings one-by-one in order with compact card (`[Fix now] [Skip / Dismiss] [Discuss] [Next]`).
91
86
  - **"all critical"** → iterate through all critical findings in order.
92
87
  - **Scenario group name** (e.g. "group 1") → iterate through that scenario's findings.
93
88
  - **Single number or slug** → single finding (skip to step 3).
@@ -113,27 +108,17 @@ Press Enter to walk through all [1], select 2-3, or enter a finding number/slug:
113
108
 
114
109
  ### 3. Direct triage: review one finding
115
110
 
116
- Read the finding file at `iamu/findings/<slug>.md`. Parse the YAML frontmatter and markdown body. Inspect the codebase to identify the source file and line responsible. Render full detail with clickable links and evidence:
111
+ Read the finding file at `iamu/findings/<slug>.md`. Parse the YAML frontmatter and markdown body. Inspect the codebase to identify the source file and line responsible. Render a compact, 4-line triage card:
117
112
 
118
113
  ```
119
- Finding: <title> ([file](iamu/findings/<slug>.md))
120
- Scenario: [<scenario>](iamu/scenarios/<scenario>.md)
121
- Severity: <severity> · Type: <type> · Status: <triage_status>
122
-
123
- Persona Quote: "<persona_reaction_or_consequence>"
124
- UI Fact: <ui_fact>
125
- Evidence: Step <N> at <url> (Screenshot: [view](iamu/.runs/<run>/screenshots/<NNN>.png))
114
+ Finding: [<SEVERITY> · <type>] <title> ([file](iamu/findings/<slug>.md))
115
+ Friction: <Persona Name>: "<1-sentence reaction or consequence quote>"
126
116
  Source: <file:line path in repository, e.g. src/components/HandoffModal.tsx:42>
127
-
128
- Description:
129
- <markdown body above ## Recommendation>
130
-
131
- Recommendation:
132
- <## Recommendation section, or "none">
133
-
134
- Report: [report.md](iamu/.runs/<run>/report.md)
117
+ Proposal: <1-sentence concrete fix recommendation>
135
118
  ```
136
119
 
120
+ Do NOT dump raw markdown bodies, multi-paragraph descriptions, or file link lists. Keep the triage card under 5 lines so the decision prompt is immediately visible without scrolling.
121
+
137
122
  If the finding references a run directory, mention the report path for context. If the user wants to see the screenshot, read from `iamu/.runs/<run>/screenshots/`.
138
123
 
139
124
  ### 4. Prompt for triage action
@@ -177,7 +162,7 @@ triage_status: addressed
177
162
  triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
178
163
  ```
179
164
 
180
- - **Fix now** → the change is small, one-or-two files, no architectural decision needed (label, field made optional, filter added, typo). Make the edit, verify it loads (if a dev server is running, open the affected screen and check), then update frontmatter: `triage_status: addressed` with a one-line change summary in `triage_note`. Do not close a finding as addressed before the change lands and is inspected. Tell the user the fix now awaits a re-run: only a later walkthrough of the scenario turns it verified.
165
+ - **Fix now** → the change is small, one-or-two files, no architectural decision needed (label, field made optional, filter added, typo). Make the edit, verify it loads (if a dev server is running, open the affected screen and check), then record: `iamu triage <slug> --status addressed --note "<one-line change summary>"`. Do not close a finding as addressed before the change lands and is inspected. Tell the user the fix now awaits a re-run: only a later walkthrough of the scenario turns it verified.
181
166
 
182
167
  - **Design change needed** → the change requires design thinking (restructuring a flow, new capability, API contract touch, multiple files). Do NOT fix inline. Use the project's own change process if it has one — check the agent docs and the repo for it (an `openspec/` directory and its change skills, an ADR or RFC folder, an issue tracker the docs name) and start the change there with the finding's persona + scenario context pre-filled. Only if the project has none, draft a short design doc. Then leave the finding `open` until the change ships. Attach the change reference in `triage_note`: `"Design change: <reference>. Re-triage when the change ships."`.
183
168
 
@@ -229,7 +229,7 @@ The result's `walker_prompt` is the walker's entire prompt. Pass it verbatim —
229
229
 
230
230
  **CRITICAL: Dispatch the walker as an isolated subagent.** Spawn a fresh subagent using your host editor's subagent mechanism (e.g. `Agent(...)` in Claude Code, `invoke_subagent` in Antigravity, or host-native subagent launcher). The subagent gets ONLY the walking prompt (`walker_prompt`) — no prior conversation history.
231
231
 
232
- 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.
232
+ 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 and a shell for `iamu` commands. The walker never needs direct host file-editing tools: all steps, findings, and summaries are recorded atomically via CLI commands.
233
233
 
234
234
  **Model tiering & subagent dispatch:**
235
235
  - **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.
@@ -291,15 +291,13 @@ Step files live at `iamu/.runs/<run-id>/steps/<NNN>.json`. The CLI manages monot
291
291
 
292
292
  **Recording findings:**
293
293
 
294
- Use the CLI to create findings with valid frontmatter, UUID, and slug:
294
+ Use the CLI to create findings with valid frontmatter, UUID, slug, description, and recommendation in one atomic call:
295
295
 
296
296
  ```bash
297
- iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type hinders --severity major --ui-fact "What the UI showed" --consequence "Impact on persona" --task-impact impairs --confidence high --json
297
+ iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type hinders --severity major --ui-fact "What the UI showed" --consequence "Impact on persona" --task-impact impairs --confidence high --description "Detailed markdown description" --recommendation "Concrete fix proposal" --json
298
298
  ```
299
299
 
300
- This generates a valid UUID, derives the slug from the title, and writes a frontmatter-valid file to `iamu/findings/<slug>.md`. Returns `{ "slug": "...", "path": "...", "id": "..." }`.
301
-
302
- After the CLI scaffolds the file, edit the file to add the finding body (description + recommendation) below the frontmatter.
300
+ This generates a valid UUID, derives the slug from the title, and writes the complete finding file to `iamu/findings/<slug>.md`. Returns `{ "slug": "...", "path": "...", "id": "..." }`. Never invoke host Edit or Write tools.
303
301
 
304
302
  Valid `--type` values: `helps`, `hinders`, `missing`, `irrelevant`, `incorrect`.
305
303
  Valid `--severity` values: `critical`, `major`, `minor`, `observation`.
@@ -310,6 +308,12 @@ Findings never name a human test: the walker does not see them. The judge links
310
308
 
311
309
  **DEPTH GATE:** Both `--ui-fact` and `--consequence` should be provided. If you cannot articulate both, record as a step note instead — do not create a finding file.
312
310
 
311
+ **Closing Synthesis:**
312
+ Before finishing the walk, record persona synthesis using `iamu summary`:
313
+ ```bash
314
+ iamu summary <run-id> --worked "What worked well 1" --worked "What worked well 2" --question "Open question 1"
315
+ ```
316
+
313
317
  **Post-walk pipeline (MANDATORY — do NOT skip any step):**
314
318
 
315
319
  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.
@@ -328,10 +332,11 @@ This reads all steps, findings, and entity files, assembles `canonical.json`, ge
328
332
  iamu match <run-id> --json
329
333
  ```
330
334
 
331
- 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:
335
+ 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). Record its JSON answer via `--data` (or `--file`):
332
336
 
333
337
  ```bash
334
- iamu match-record <run-id> --file <matches.json>
338
+ iamu match-record <run-id> --data '<matches.json>'
339
+ # or: iamu match-record <run-id> --file <matches.json>
335
340
  ```
336
341
 
337
342
  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.
@@ -342,10 +347,11 @@ This links recurrences to their earlier canonical finding, marks earlier finding
342
347
  iamu evaluate <run-id> --json
343
348
  ```
344
349
 
345
- 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`:
350
+ 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` via `--data` (or `--file`):
346
351
 
347
352
  ```bash
348
- iamu evaluate-record <run-id> --file <verdicts.json> --no-prompt --no-push
353
+ iamu evaluate-record <run-id> --data '<verdicts.json>' --no-prompt --no-push
354
+ # or: iamu evaluate-record <run-id> --file <verdicts.json> --no-prompt --no-push
349
355
  ```
350
356
 
351
357
  This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
@@ -380,59 +386,28 @@ The `walker_prompt` from `iamu instructions walk` is the source of truth and con
380
386
 
381
387
  ### 5. Present assessment — stay in the conversation
382
388
 
383
- Render results **inline** with a high-contrast executive summary banner, followed by findings enriched with persona voice, evidence citations, and clickable file links.
384
-
385
- 1. **Executive Summary Banner & Focus Checkpoint**
386
-
387
- Read the outline's `human_tests[0].question` and answer it directly. Use the evaluation verdict if available:
388
-
389
- ```
390
- Walkthrough: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
391
- Verdict: <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (Steps: <N>)
392
- Focus Checkpoint: "<human_tests[0].question>" → <No / Partial / Yes>: <1-2 sentence direct answer explaining why>
393
- ```
394
-
395
- 2. **Progress since last run** (only when canonical.json contains a `verification` section). Present the delta:
396
-
397
- ```
398
- Since this scenario's last run:
399
- ✓ 1 fixed, re-checked (handoff note saves — step 6)
400
- ✗ 1 persists (timeout warning)
401
- ○ 2 not seen this run (handoff list filtering, submit confirmation)
402
- + 1 new since that run (date picker locale)
403
- ```
404
-
405
- `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.
406
-
407
- 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**:
408
-
409
- **Hinders / Missing** (act on these):
410
-
411
- 1. [CRITICAL · hinders] Submit fails opaquely when required field empty ([file](iamu/findings/<slug>.md))
412
- • Persona: <Persona Name>: "<Persona reaction quote or consequence showing real human friction>"
413
- • Evidence: Step <N> at <url> (Screenshot: [view](iamu/.runs/<run-id>/screenshots/<NNN>.png))
414
- • Recommendation: <Concrete recommendation from finding>
389
+ Render results **inline** as a concise executive scorecard.
415
390
 
416
- 2. [MAJOR · hinders] Date picker has no "today" shortcut ([file](iamu/findings/<slug>.md))
417
- • Persona: <Persona Name>: "<Persona reaction quote or consequence>"
418
- • Evidence: Step <N> at <url>
419
- • Recommendation: <Concrete recommendation from finding>
391
+ **ANTI-BLOAT DIRECTIVE:** Terminal viewports are small. Never output multi-screen walls of markdown text. The overview exists only to present the top-line score and orient the user for triage. Do NOT dump long quotes, recommendations, full descriptions, or "What Worked" essays here — those belong in the interactive triage step below.
420
392
 
421
- **Helps** (preserve these):
393
+ Keep the presentation under 15 lines total:
422
394
 
423
- • [helps] Search auto-suggests from recent entries (Step <N>)
395
+ ```
396
+ Walkthrough: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
397
+ Verdict: <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (Steps: <N>)
398
+ Focus Checkpoint: "<human_tests[0].question>" → <No / Partial / Yes>: <1-sentence direct answer>
424
399
 
425
- 4. **What worked** — supportive moments worth preserving (brief, from `what_worked` in the canonical JSON).
400
+ Findings:
401
+ 1. [<CRITICAL|MAJOR|MINOR> · <type>] <Short title> (Step <N> at <short_url_path>)
402
+ 2. [<CRITICAL|MAJOR|MINOR> · <type>] <Short title> (Step <N> at <short_url_path>)
403
+ ...
404
+ (Helps: • [helps] <short title> (Step <N>))
426
405
 
427
- 5. **Next-scenario suggestion** — read `iamu/scenarios/` to check coverage, then suggest one of:
428
- - Same scenario with a different persona (if other personas exist for this situation)
429
- - Adjacent untested scenario in the same capability
430
- - Nothing (if coverage is good)
406
+ Cloud: <Shareable report: <url> | Local only>
407
+ ```
431
408
 
432
- 6. **Cloud** — one line, by mode:
433
- - **Linked, run on the cloud** → `Shareable report: <url>` (screenshots and step replay for anyone on the team).
434
- - **Linked, run not on the cloud** → the reason from step E and its remedy, e.g. `Cloud: queued — retries on the next iamu sync`.
435
- - **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.`
409
+ (If canonical.json contains a `verification` section, include a 1-line delta: `Since last run: ✓ <N> fixed · ✗ <M> persist · + <K> new`.)
410
+ Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the entire summary under 15 lines, then immediately present the triage prompt below.
436
411
 
437
412
  7. **Next actions (Interactive Triage Selection)**:
438
413
  When the walkthrough completes and yields findings:
@@ -460,20 +435,21 @@ The conversation is the triage surface. Do NOT eject the user to manual CLI comm
460
435
 
461
436
  #### A. Guided One-by-One Review ("walk through them" / "review one by one")
462
437
  When the user asks to review findings one by one:
463
- 1. **Present Finding #N in isolation**:
464
- - Number, severity, type, and title
465
- - Persona consequence quote and why the friction occurred
466
- - Relevant source code location (inspect project files to provide file path + line numbers)
467
- - Step & screenshot evidence ([view](iamu/.runs/<run-id>/screenshots/<NNN>.png))
468
- - Actionable recommendation
469
- - Interactive decision prompt:
470
- - If interactive tool available:
471
- - Question: "Triage Finding #<N>: '<finding title>'?"
472
- - Options:
473
- 1. "[Recommended] Fix now (apply inline code fix & verify)"
474
- 2. "Dismiss / Skip (not relevant or walker error)"
475
- 3. "Discuss / Explore trade-offs"
476
- 4. "Next finding (keep open)"
438
+ 1. **Present Finding #N in a compact card (maximum 4 lines):**
439
+ ```
440
+ Finding <N>/<total>: [<SEVERITY> · <type>] <title>
441
+ Friction: <Persona Name>: "<1-sentence reaction quote>"
442
+ Location: <file:line path in repository, e.g. frontend/src/components/Form.tsx:309>
443
+ Proposal: <1-sentence concrete fix recommendation>
444
+ ```
445
+ Followed immediately by the decision prompt:
446
+ - If interactive tool available:
447
+ - Question: "Triage Finding #<N>: '<finding title>'?"
448
+ - Options:
449
+ 1. "[Recommended] Fix now (apply inline code fix & verify)"
450
+ 2. "Dismiss / Skip (not relevant or walker error)"
451
+ 3. "Discuss / Explore trade-offs"
452
+ 4. "Next finding (keep open)"
477
453
  - Otherwise (CLI / text-only):
478
454
  Triage Finding #<N>: '<finding title>'
479
455
  1. [Recommended] Fix now (apply inline code fix & verify)
@@ -485,8 +461,8 @@ When the user asks to review findings one by one:
485
461
 
486
462
  2. **Handle the user's decision**:
487
463
  - **Fix now**:
488
- 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>"`).
489
- Tell the user the fix is applied and ask: "Ready for finding #<N+1>?".
464
+ Make the code edit, verify it loads (or check local tests/types), update the finding with `iamu triage <slug> --status addressed --note "<summary of fix>"`.
465
+ Tell the user in 1 line: "✓ Applied fix to `<file>:<line>`. Finding #<N> marked addressed." and ask: "Ready for finding #<N+1>?".
490
466
  - **Skip / Dismiss**:
491
467
  If reason is not specified, ask or infer the appropriate category:
492
468
  - `out_of_scope`: Not relevant to this project/flow scope.
@@ -494,10 +470,14 @@ When the user asks to review findings one by one:
494
470
  - `walker_error`: Walker misread the screen or made a navigational error.
495
471
  - `duplicate`: Duplicate of another finding.
496
472
  Execute: `iamu triage <slug> --status dismissed --reason <reason> --note "<why>"`.
497
- Tell the user: "Dismissed as `<reason>` — created guidance rule in `iamu/guidance/<slug>.md` so future walkthroughs will not report this."
473
+ Tell the user in 1 line: "✓ Dismissed as `<reason>` — guidance rule recorded."
498
474
  Then advance to finding #<N+1>.
499
- - **Discuss / Why**:
500
- 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.
475
+ - **Discuss / Why (STRICT CONSTRAINT: maximum 3-4 concise bullets, under 80 words total)**:
476
+ Never write multi-section essays, markdown headers (`### Trade-off Analysis`, `#### 1. Why it was built this way`, `#### 2. The Operational Failure`), or ASCII/markdown tables. Deliver a direct, surgical 3-bullet answer:
477
+ • **Root Cause:** 1 sentence on why the code does this (`file:line`).
478
+ • **Persona Friction:** 1 sentence on the practical operational consequence.
479
+ • **Recommended Fix & Trade-off:** 1-2 sentences with concrete code approach and any trade-off.
480
+ Immediately re-prompt the triage decision.
501
481
  - **Next**:
502
482
  Leave open (or set `triage_status: deferred` with note) and advance to finding #<N+1>.
503
483
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamu-dev/iamu",
3
- "version": "0.2.0-beta.12",
3
+ "version": "0.2.0-beta.13",
4
4
  "type": "module",
5
5
  "description": "Test your product as realistic personas — scenario-driven development CLI",
6
6
  "license": "UNLICENSED",
@@ -58,9 +58,9 @@
58
58
  "tsup": "^8.5.1",
59
59
  "typescript": "^5.8.0",
60
60
  "vitest": "^4.1.11",
61
- "@iamu-dev/protocol": "0.1.0",
62
61
  "@iamu-dev/local-store": "0.1.0",
63
- "@iamu/tsconfig": "0.1.0"
62
+ "@iamu/tsconfig": "0.1.0",
63
+ "@iamu-dev/protocol": "0.1.0"
64
64
  },
65
65
  "scripts": {
66
66
  "build": "tsup && tsc -b --force tsconfig.build.json --emitDeclarationOnly && node scripts/copy-assets.mjs",