@iamu-dev/iamu 0.3.0-beta.0 → 0.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -115,16 +115,20 @@ Reply '1' to walk through all [default], select 2-3, or enter a finding number/s
115
115
 
116
116
  Read the finding file at `iamu/findings/<slug>.md`. Parse the YAML frontmatter (`severity`, `type`, `title`, `ui_fact`, `consequence`, `persona`, `walkthrough_step_id`, `screen_title`, `page_url`, `run`) and markdown body (description and recommendation).
117
117
 
118
- Synthesize a comprehensive, dashboard-aligned triage summary. Do NOT force an artificial single `Source: file:line` (UX friction and user blockers often span entire flows, API errors, or policy). Instead, present:
118
+ Synthesize a scannable triage summary. Do NOT output an undifferentiated wall of bullets or academic schema labels like "UI Fact:". The reviewer must be able to parse **What is broken** and **What to fix** in under 3 seconds.
119
119
 
120
- ```
121
- Finding <N>/<total>: [<SEVERITY> · <type>] <title>
122
- • Persona: <Persona Name> (<Role>) · <Screen title or URL, Step N>
123
- • UI Fact: <What the UI showed or did (ui_fact)>
124
- • Consequence: <Impact on the persona completing their task (consequence)>
125
- • Agent Insight: <1–2 plain-language sentences synthesizing why this happens and what it means in context>
126
- • Recommendation: <Concrete fix proposal from finding body>
127
- • Evidence: <iamu/.runs/<run>/screenshots/step-<N>.png> [Dashboard](<url if cloud_linked>)
120
+ Format the visible finding in chat:
121
+
122
+ ```markdown
123
+ ### Finding #<N>/<total> [<SEVERITY>] — <title>
124
+ > **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
125
+ > **Evidence:** `iamu/.runs/<run>/screenshots/step-<N>.png` [Dashboard](<url if cloud_linked>)
126
+
127
+ **❌ Problem:**
128
+ <What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
129
+
130
+ **💡 Recommendation:**
131
+ <Concrete fix proposal from finding body>
128
132
  ```
129
133
 
130
134
  If the project is cloud-linked, include the link to the finding in Iamu Cloud (from `iamu open --print`).
@@ -135,38 +139,45 @@ Emit this card visibly into the conversation.
135
139
 
136
140
  Every finding must land on a decision — never silently skip. Match the user's intent to the closest option.
137
141
 
138
- **CRITICAL: Embed Full Context in Interactive Prompt Modals:**
139
- Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **You must embed the complete finding summary inside the `question` argument** so the reviewer has full context directly in the dialog without having to close the modal.
142
+ **CRITICAL: Embed Scannable Finding in Interactive Prompt Modals:**
143
+ Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **Embed this exact scannable structure inside the `question` argument** with blank lines separating the sections:
140
144
 
141
145
  - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
142
146
  - **Question:**
143
147
  """
144
- Finding #<N>/<total>: <title>
148
+ Finding #<N>/<total> [<SEVERITY>]: <title>
149
+ Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
150
+
151
+ ❌ PROBLEM:
152
+ <What is broken or awkward on screen and why it hinders the persona in 1–2 direct sentences>
145
153
 
146
- • Impact: [<SEVERITY> · <type>]
147
- • Persona: <Persona Name> (<Role>) · <Screen title or URL, Step N>
148
- • UI Fact: <ui_fact>
149
- • Consequence: <consequence>
150
- • Agent Insight: <1–2 sentences explaining why this happens in simple terms>
151
- • Recommendation: <concrete recommendation>
152
- • Evidence: <screenshot path, local file link, and cloud dashboard link if linked>
154
+ 💡 RECOMMENDATION:
155
+ <Concrete fix proposal from finding body>
153
156
 
154
157
  How should we triage this finding?
155
158
  """
156
159
  - **Options:**
157
- 1. "[Recommended] Queue to fix (mark for fix & continue triage)"
158
- 2. "Dismiss / Won't fix (record reason & walker guidance rule)"
159
- 3. "Design change needed (open issue / design doc)"
160
- 4. "Defer (revisit in later milestone)"
161
- 5. "Fix immediately (leave triage now)"
160
+ 1. "[Recommended] Queue to fix (<brief 3-5 word fix summary>)"
161
+ 2. "Dismiss / Skip (<brief reason if obvious, e.g. keep current design>)"
162
+ 3. "Discuss / Explore trade-offs"
163
+ 4. "Fix immediately (leave triage now)"
164
+ 5. "Next finding (keep open / defer)"
162
165
  - Otherwise (in CLI or text-only environments):
163
166
 
164
- Triage Finding #<N>/<total>: '<finding title>'
165
- 1. [Recommended] Queue to fix (mark for fix & continue triage)
166
- 2. Dismiss / Won't fix (record reason & walker guidance rule)
167
- 3. Design change needed (open issue / design doc)
168
- 4. Defer (revisit in later milestone)
169
- 5. Fix immediately (leave triage now)
167
+ Finding #<N>/<total> [<SEVERITY>]: <title>
168
+ Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
169
+
170
+ ❌ PROBLEM:
171
+ <What went wrong and why it hinders the persona in 1–2 direct sentences>
172
+
173
+ 💡 RECOMMENDATION:
174
+ <Concrete fix proposal>
175
+
176
+ 1. [Recommended] Queue to fix (<brief 3-5 word fix summary>)
177
+ 2. Dismiss / Skip (not relevant or walker error)
178
+ 3. Discuss / Explore trade-offs
179
+ 4. Fix immediately (leave triage now)
180
+ 5. Next finding (keep open / defer)
170
181
 
171
182
  Reply '1' to queue fix [default], enter 2-5, or describe your decision:
172
183
 
@@ -183,6 +194,9 @@ triage_status: addressed
183
194
  triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
184
195
  ```
185
196
 
197
+ - **Discuss / Explore trade-offs (Conversational Dialogue Mode — NO MODAL LOOPS)** → when the user chooses "Discuss", asks a question, or wants to explore architectural trade-offs:
198
+ **DO NOT invoke `ask_question` or present multiple-choice menus.** Stay in natural conversational chat as a senior pair programmer. Answer follow-up questions, inspect code, benchmark against competitors, and discuss options in plain markdown. Converse naturally back and forth until you reach a conclusion together. Only when a consensus or decision is reached ("let's queue it", "dismiss it", "fix it now"), record the decision and proceed. Do NOT trap the user with modal dialogs after each conversational turn.
199
+
186
200
  - **Queue to fix [Recommended in list-mode]** → add to the session's fix queue. Tell the user in 1 line: "✓ Queued for fix. Advancing to next finding..." and loop to the next finding. Complete the triage queue across all findings first.
187
201
 
188
202
  - **Fix immediately (leave triage now)** → the change is small, one-or-two files, and user explicitly chose to leave triage now. 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.
@@ -193,12 +207,19 @@ triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
193
207
 
194
208
  - **Won't fix (accepted trade-off)** → the problem is real but the team accepts it. `iamu triage <slug> --status wont_fix --note "<the trade-off>"`. It stays out of future walks' dismissed list only as a known issue — no guidance rule is written.
195
209
 
196
- - **Not relevant / walker got it wrong** → the finding should never have been reported. Ask which, because they teach different things:
197
- - *Not relevant* (by design, out of scope): `iamu triage <slug> --status dismissed --reason not_relevant --note "<why it is not a problem>"`.
198
- - *Walker error* (the walker misread the screen): `iamu triage <slug> --status dismissed --reason walker_error --note "<what it misread>"`.
210
+ - **Not relevant / walker got it wrong (Load-Bearing Guidance Learning)** → the finding should never have been reported. **Never infer the reason silently.** Always ask the user:
211
+ > "To teach future walkthroughs what not to report, why should this be dismissed?
212
+ > • **By design / intended behavior:** (Why this pattern is expected)
213
+ > • **Walker error:** (What the walker misread or did wrong)
214
+ > • **Out of scope:** (Non-issue for this product/flow)
215
+ > What specific rule should future walkers follow?"
216
+
217
+ Once the user provides their rationale:
218
+ - *Not relevant* (by design, out of scope): `iamu triage <slug> --status dismissed --reason not_relevant --note "<why it is not a problem>" --rule "<rule string>"`.
219
+ - *Walker error* (the walker misread the screen): `iamu triage <slug> --status dismissed --reason walker_error --note "<what it misread>" --rule "<rule string>"`.
199
220
  - *Duplicate* of another finding: `--reason duplicate --note "Duplicate of <slug>"` (no rule is written).
200
221
 
201
- Not relevant and walker error write a **tester guidance rule** to `iamu/guidance/<slug>.md` that every later walker reads (and the matcher uses to flag repeats). The rule text defaults to "Don't report: <title>"; pass `--rule "<one sentence the walker can act on>"` when the title is too narrow or too broad. The rule applies to the whole project unless you pass `--scope outline` or `--scope capability` — narrow it when the finding is only irrelevant in this situation. Several findings dismissed for the same reason go in one call and share one rule. **Tell the user: "Dismissed — future walkthroughs are told not to report this"** and name the rule file. One-word notes ("nope") degrade future runs — name the reason specifically.
222
+ Not relevant and walker error write a **tester guidance rule** to `iamu/guidance/<slug>.md` that every later walker reads (and the matcher uses to flag repeats). The rule text defaults to "Don't report: <title>"; pass `--rule "<one sentence the walker can act on>"` when the title is too narrow or too broad. The rule applies to the whole project unless you pass `--scope outline` or `--scope capability` — narrow it when the finding is only irrelevant in this situation. Several findings dismissed for the same reason go in one call and share one rule. **Tell the user: "✓ Dismissed (<reason>) — Guidance rule taught to future walks in iamu/guidance/<slug>.md: '<rule string>'."** One-word notes ("nope") degrade future runs — capture the user's specific rationale.
202
223
 
203
224
  - **Keep (no decision yet)** → rare. Use only when the reviewer genuinely needs more information. Leave `triage_status: open` and add a `triage_note` noting what you are waiting for: `"Waiting on <thing> before triage."`.
204
225
 
@@ -216,7 +216,7 @@ If the product is behind enterprise login where automated dev persona switching
216
216
  If automated switching exists:
217
217
  1. Check the project's own agent docs (`CLAUDE.md`, `AGENTS.md`) for a documented way to switch user or role.
218
218
  2. Map the persona to the closest account or role the product actually has. If nothing fits, say so.
219
- 3. Write what you learned: the mechanism into the `iamu/testability.md` frontmatter as `access:` (it is test setup, so it does not belong in `context.yml`, which holds the domain; if `iamu doctor` finds it there, move it), and the persona's own key with `iamu set persona <slug> --access <key>`. Passwords and tokens never go in either — name where they live (an env var, a vault entry) instead.
219
+ 3. Persist what you learned: the mechanism into `iamu/testability.md` via `iamu set testability --access "<key>"`, and the persona's own key with `iamu set persona <slug> --access <key>`. Passwords and tokens never go in either — name where they live (an env var, a vault entry) instead.
220
220
 
221
221
  Carry the result into the walking prompt as the `## Access` section: the exact steps to become the persona, with the instruction to do them BEFORE the first recorded step.
222
222
 
@@ -248,15 +248,15 @@ iamu browse start --run <run-id>
248
248
 
249
249
  It sizes the page as the device the persona's tags name (`mobile`/`phone`, `tablet`/`ipad`, `desktop`/`laptop`; `start-run` prints it as `device`) and resizes a browser left at another persona's size.
250
250
 
251
- **Get the walker prompt.** The CLI composes the whole thing — persona, situation, brief, access, driving surface, methodology, dismissed findings and the run-directory contract (steps, screenshots, findings, `summary.json`):
251
+ **Get the walker prompt.** The CLI composes the whole thing — persona, situation, brief, access, driving surface, methodology, dismissed findings and the run-directory contract (steps, screenshots, findings, `summary.json`). It also automatically writes `walker_prompt.txt` to the run directory (`iamu/.runs/<run-id>/walker_prompt.txt`):
252
252
 
253
253
  ```bash
254
254
  iamu instructions walk --scenario <scenario-slug> --run <run-id> --surface browse --json
255
255
  ```
256
256
 
257
- `--surface browse` (the default) describes `iamu browse`; start it first (`iamu browse start --run <run-id>`, above). Using your own browser tool instead, pass one sentence naming it and how it saves screenshots, e.g. `--surface "Chrome DevTools MCP attached to the user's Chrome; take_screenshot with filePath"`. For a native app, describe the simulator tool and add the native notes below.
257
+ **Never create prompt generator scripts or temporary files.** The CLI generates and persists the prompt automatically. Never write custom `.cjs`, `.js`, or `.sh` generator scripts into `.cache/`, `iamu/`, or the workspace. Hand-crafting files triggers host IDE file permission prompts.
258
258
 
259
- The result's `walker_prompt` is the walker's entire prompt. Pass it verbatim — do not rewrite, summarize or trim it. The prompt already carries the dismissed findings, the active tester guidance rules (`iamu/guidance/`) for this scenario, and — when fixes await a re-run — the places they were seen (places only, never what was wrong; the list is in `revisit`). The rest of the bundle (`persona`, `outline`, `access`, `dismissed_findings`, `tester_guidance`, …) is there for you, not the walker. If `access` is missing a half, fill it in first (step 3) and re-run this command.
259
+ The result's `walker_prompt` is the walker's entire prompt (also persisted at `walker_prompt_path`). Pass it verbatim — do not rewrite, summarize or trim it. The prompt already carries the dismissed findings, the active tester guidance rules (`iamu/guidance/`) for this scenario, and — when fixes await a re-run — the places they were seen (places only, never what was wrong; the list is in `revisit`). The rest of the bundle (`persona`, `outline`, `access`, `dismissed_findings`, `tester_guidance`, …) is there for you, not the walker. If `access` is missing a half, fill it in first (step 3) and re-run this command.
260
260
 
261
261
  **Preflight: Unattended execution check.** A walkthrough executes 15–30 terminal commands sequentially (`iamu browse step`, `iamu new-finding`). If your agent host requires manual confirmation for terminal/shell commands (standard interactive mode in Claude Code, Cursor, Antigravity, Cline, Windsurf, etc.), the walker subagent will stall waiting for approval on every step. Before dispatching, verify that command auto-approval / unattended execution is enabled in your environment, or warn the user once:
262
262
  "Autonomous walkthroughs require auto-approving terminal commands so the walker can drive the product unattended. If command approvals are prompted, please enable auto-approval or expect to approve steps manually."
@@ -357,6 +357,9 @@ iamu summary <run-id> --worked "What worked well 1" --worked "What worked well 2
357
357
 
358
358
  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.
359
359
 
360
+ > **CRITICAL EXECUTION RULE (Zero Host File Tools):**
361
+ > Never invoke host edit or write tools (`write_to_file`, `create_file`, `replace_file_content`, etc.) on any files in `iamu/` (including run artifacts, steps, findings, outlines, personas, scenarios, or guidance). All files in `iamu/` must be generated and modified exclusively via `iamu` CLI commands (`iamu new`, `iamu set`, `iamu step`, `iamu new-finding`, `iamu evaluate-record`, `iamu match-record`, etc.). If an entity needs a field updated (e.g. adding a capability to an outline), run `iamu set <type> <slug> ...` instead of editing files by hand. Record subagent JSON outputs directly through the CLI using `--data '<json>'` (or pipe via stdin).
362
+
360
363
  **A. Assemble canonical + report (local).** Use `--no-push` so post-processing stays fast, local, and synchronous:
361
364
 
362
365
  ```bash
@@ -373,11 +376,10 @@ This reads all steps, findings, and entity files, assembles `canonical.json`, ge
373
376
  iamu match <run-id> --json
374
377
  ```
375
378
 
376
- 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`):
379
+ 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` (do NOT create a `matches.json` file yourself; pass the JSON string directly into `--data`):
377
380
 
378
381
  ```bash
379
- iamu match-record <run-id> --data '<matches.json>'
380
- # or: iamu match-record <run-id> --file <matches.json>
382
+ iamu match-record <run-id> --data '<raw_matches_json>'
381
383
  ```
382
384
 
383
385
  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.
@@ -388,11 +390,10 @@ This links recurrences to their earlier canonical finding, marks earlier finding
388
390
  iamu evaluate <run-id> --json
389
391
  ```
390
392
 
391
- 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`):
393
+ 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` (do NOT create a `verdicts.json` file yourself; pass the JSON string directly into `--data`):
392
394
 
393
395
  ```bash
394
- iamu evaluate-record <run-id> --data '<verdicts.json>' --no-prompt --no-push
395
- # or: iamu evaluate-record <run-id> --file <verdicts.json> --no-prompt --no-push
396
+ iamu evaluate-record <run-id> --data '<raw_verdicts_json>' --no-prompt --no-push
396
397
  ```
397
398
 
398
399
  This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
@@ -475,52 +476,63 @@ The conversation is the triage surface. Do NOT eject the user to manual CLI comm
475
476
 
476
477
  #### A. Guided One-by-One Review ("walk through them" / "review one by one")
477
478
  When the user asks to review findings one by one:
478
- 1. **Present Finding #N in a comprehensive, dashboard-aligned summary:**
479
- Do NOT force an artificial single `Location: file:line` (UX friction and user blockers often span entire flows, API errors, or policy). Instead, present:
480
- ```
481
- Finding <N>/<total>: [<SEVERITY> · <type>] <title>
482
- • Persona: <Persona Name> (<Role>) · <Screen title or URL, Step N>
483
- • UI Fact: <What the UI showed or did (ui_fact)>
484
- • Consequence: <Impact on the persona completing their task (consequence)>
485
- • Agent Insight: <1–2 plain-language sentences synthesizing why this happens and what it means in context>
486
- • Recommendation: <Concrete fix proposal from finding body>
487
- • Evidence: <iamu/.runs/<run>/screenshots/step-<N>.png> [Dashboard](<url if cloud_linked>)
479
+ 1. **Present Finding #N in a scannable format (High Visual Hierarchy):**
480
+ Do NOT output an undifferentiated wall of bullets or academic schema labels like "UI Fact:". The reviewer must be able to parse **What is broken** and **What to fix** in under 3 seconds.
481
+
482
+ Format the visible finding in chat:
483
+ ```markdown
484
+ ### Finding #<N>/<total> [<SEVERITY>] — <title>
485
+ > **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
486
+ > **Evidence:** `iamu/.runs/<run>/screenshots/step-<N>.png` [Dashboard](<url if cloud_linked>)
487
+
488
+ **❌ Problem:**
489
+ <What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
490
+
491
+ **💡 Recommendation:**
492
+ <Concrete fix proposal from finding body>
488
493
  ```
489
494
  If the project is cloud-linked, include the link to the finding in Iamu Cloud (from `iamu open --print`).
490
495
 
491
496
  Followed immediately by the decision prompt:
492
497
 
493
- **CRITICAL: Embed Full Context in Interactive Prompt Modals:**
494
- Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **You must embed the complete finding summary inside the `question` argument** so the reviewer has full context directly in the dialog without having to close the modal.
498
+ **CRITICAL: Embed Scannable Finding in Interactive Prompt Modals:**
499
+ Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **Embed this exact scannable structure inside the `question` argument** with blank lines separating the sections (never a solid block of bullets):
495
500
 
496
501
  - If interactive tool available (e.g. `ask_question`, `ask_followup_question`), invoke it:
497
502
  - **Question:**
498
503
  """
499
- Finding #<N>/<total>: <title>
504
+ Finding #<N>/<total> [<SEVERITY>]: <title>
505
+ Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
500
506
 
501
- • Impact: [<SEVERITY> · <type>]
502
- • Persona: <Persona Name> (<Role>) · <Screen title or URL, Step N>
503
- • UI Fact: <ui_fact>
504
- • Consequence: <consequence>
505
- • Agent Insight: <1–2 sentences explaining why this happens in simple terms>
506
- • Recommendation: <concrete recommendation>
507
- • Evidence: <screenshot path, local file link, and cloud dashboard link if linked>
507
+ ❌ PROBLEM:
508
+ <What is broken or awkward on screen and why it hinders the persona in 1–2 direct sentences>
509
+
510
+ 💡 RECOMMENDATION:
511
+ <Concrete fix proposal from finding body>
508
512
 
509
513
  How should we triage this finding?
510
514
  """
511
515
  - **Options:**
512
- 1. "[Recommended] Queue to fix (mark for fix & continue triage)"
513
- 2. "Dismiss / Skip (not relevant or walker error)"
516
+ 1. "[Recommended] Queue to fix (<brief 3-5 word fix summary>)"
517
+ 2. "Dismiss / Skip (<brief reason if obvious, e.g. keep current design>)"
514
518
  3. "Discuss / Explore trade-offs"
515
519
  4. "Fix immediately (leave triage now)"
516
520
  5. "Next finding (keep open / defer)"
517
521
  - Otherwise (CLI / text-only):
518
- Triage Finding #<N>/<total>: '<finding title>'
519
- 1. [Recommended] Queue to fix (mark for fix & continue triage)
520
- 2. Dismiss / Skip (not relevant or walker error)
521
- 3. Discuss / Explore trade-offs
522
- 4. Fix immediately (leave triage now)
523
- 5. Next finding (keep open / defer)
522
+ Finding #<N>/<total> [<SEVERITY>]: <title>
523
+ Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
524
+
525
+ ❌ PROBLEM:
526
+ <What went wrong and why it hinders the persona in 1–2 direct sentences>
527
+
528
+ 💡 RECOMMENDATION:
529
+ <Concrete fix proposal>
530
+
531
+ 1. [Recommended] Queue to fix (<brief 3-5 word fix summary>)
532
+ 2. Dismiss / Skip (not relevant or walker error)
533
+ 3. Discuss / Explore trade-offs
534
+ 4. Fix immediately (leave triage now)
535
+ 5. Next finding (keep open / defer)
524
536
  Reply '1' to queue fix [default], select 2-5, or describe your decision:
525
537
 
526
538
  2. **Handle the user's decision**:
@@ -528,21 +540,29 @@ When the user asks to review findings one by one:
528
540
  Add finding to the session's fix queue.
529
541
  Tell the user in 1 line: "✓ Queued for fix. Ready for finding #<N+1>?" and advance immediately.
530
542
  Do NOT edit code or leave triage yet — complete triage across all findings first.
531
- - **Skip / Dismiss**:
532
- If reason is not specified, ask or infer the appropriate category:
533
- - `out_of_scope`: Not relevant to this project/flow scope.
534
- - `not_relevant`: By design / intended behavior.
535
- - `walker_error`: Walker misread the screen or made a navigational error.
536
- - `duplicate`: Duplicate of another finding.
537
- Execute: `iamu triage <slug> --status dismissed --reason <reason> --note "<why>"`.
538
- Tell the user in 1 line: "✓ Dismissed as `<reason>` — guidance rule recorded."
543
+ - **Skip / Dismiss (Load-Bearing Guidance Learning)**:
544
+ **Never infer dismissal rationale silently.** If the user has not yet explained why this finding is dismissed, prompt them directly in conversational chat:
545
+ > "To teach future walkthroughs what not to report, why should this be dismissed?
546
+ > • **By design / intended behavior:** (Why this pattern is expected)
547
+ > • **Walker error:** (What the walker misread or did wrong)
548
+ > • **Out of scope:** (Non-issue for this product/flow)
549
+ > What specific rule should future walkers follow?"
550
+
551
+ Once the user provides their reasoning (or if already clear from discussion):
552
+ Derive a concise, actionable guidance rule string.
553
+ Execute: `iamu triage <slug> --status dismissed --reason <reason> --note "<user rationale>" --rule "<rule string>"`.
554
+ Tell the user in 1 line:
555
+ `✓ Dismissed (<reason>) — Guidance rule taught to future walks in iamu/guidance/<slug>.md: "<rule string>"`
539
556
  Then advance to finding #<N+1>.
540
- - **Discuss / Why (STRICT CONSTRAINT: maximum 3-4 concise bullets, under 80 words total)**:
541
- 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:
557
+ - **Discuss / Explore trade-offs (Conversational Dialogue Mode — NO MODAL LOOPS)**:
558
+ When the user chooses "Discuss", asks a question, or challenges an idea:
559
+ **DO NOT invoke `ask_question` or present multiple-choice menus.** Stay in natural conversational chat as a senior pair programmer:
542
560
  • **Root Cause:** 1 sentence on why the UI or workflow behaves this way (and source file if known).
543
561
  • **Persona Friction:** 1 sentence on the practical operational consequence.
544
- • **Recommended Fix & Trade-off:** 1-2 sentences with concrete approach and any trade-offs.
545
- Immediately re-prompt the triage decision for finding #<N>.
562
+ • **Recommended Fix & Trade-off:** Concrete architectural approach, competitor benchmarks, and trade-offs.
563
+ Converse naturally with the user back and forth in plain markdown text. Answer follow-up questions, inspect code, and discuss options until a conclusion is reached.
564
+ **Only when a consensus is reached** (e.g. user says: "let's do that", "queue it", "dismiss it", "fix it now"):
565
+ Record the agreed decision and advance to finding #<N+1>. Do NOT trap the user with modal dialogs after each conversational turn.
546
566
  - **Fix immediately (leave triage now)**:
547
567
  If the user explicitly chooses to drop out of triage and fix right now:
548
568
  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>"`.
@@ -110,18 +110,16 @@ Reply '1' to accept [default], select 2-3, or tell me what to adjust:
110
110
  ```
111
111
 
112
112
  **Action on confirmation (Option 1):**
113
- Write `iamu/testability.md`:
114
- ```markdown
115
- ---
116
- target_url: <target_url>
117
- dev_command: <dev_command>
118
- auth_strategy: <dev_switcher | interactive | test_accounts | public>
119
- access: <How a walker becomes a given user: the switching mechanism, e.g. 'In the page, run localStorage.setItem("dev_persona", "<persona access>") and reload.' Omit when unknown. Never passwords or tokens.>
120
- harnesses:
121
- - <detected harnesses>
122
- ---
123
-
124
- # Project Testability & Environment
113
+ Persist the safety fence using `iamu set testability` (never invoke host file creation or edit tools):
114
+ ```bash
115
+ iamu set testability \
116
+ --target "<target_url>" \
117
+ --dev-command "<dev_command>" \
118
+ --auth-strategy "<dev_switcher | interactive | test_accounts | public>" \
119
+ [--access "<access mechanism>"] \
120
+ [--harnesses "<detected harness 1>, <detected harness 2>"] \
121
+ [--untestable-boundaries "<external dependency 1>, <external dependency 2>"] \
122
+ --body "# Project Testability & Environment
125
123
 
126
124
  ## Target & Run Instructions
127
125
  - Command: <dev command>
@@ -137,7 +135,8 @@ harnesses:
137
135
  - <List existing MSW mock files, DB seed scripts, or fixture directories>
138
136
 
139
137
  ## Untestable Boundaries (Do Not Walk)
140
- - <List un-mocked external dependencies and external submission portals>
138
+ - <List un-mocked external dependencies and external submission portals>" \
139
+ --json
141
140
  ```
142
141
 
143
142
  ---
@@ -182,22 +181,16 @@ Reply '1' to accept [default], select 2-3, or tell me what to adjust:
182
181
  ```
183
182
 
184
183
  **Action on confirmation (Option 1):**
185
- Write `iamu/context.yml`. Put structured fields in frontmatter and the project description in the markdown body below the `---`:
186
- ```yaml
187
- ---
188
- schema_version: 1
189
- domain: <domain>
190
- # industry: <industry> # optional
191
- # jurisdiction: <jurisdiction> # strictly optional - omit if standard web app
192
- # governed_by: # strictly optional - omit if not regulated
193
- # - name: <statutory regulation>
194
- # authority_level: regulation
195
- ---
196
-
197
- <The substantive 1–2 paragraph project description and core user workflows>
184
+ Persist the domain context using `iamu set context` (never invoke host file creation or edit tools). Put structured fields in frontmatter and the project description in the markdown body below the `---` via `--body`:
185
+ ```bash
186
+ iamu set context \
187
+ --domain "<domain>" \
188
+ [--industry "<industry>"] \
189
+ --body "<The substantive 1–2 paragraph project description and core user workflows>" \
190
+ --json
198
191
  ```
199
192
 
200
- *If user chooses Option 2 (Save context only):* write `context.yml` and exit cleanly:
193
+ *If user chooses Option 2 (Save context only):* run `iamu set context ...` as above, and exit cleanly:
201
194
  "✓ Project context initialized. When you're ready to create your first test journey, run `/iamu:new`."
202
195
 
203
196
  ---
@@ -213,6 +206,7 @@ Step 3/3: Co-Design Your First Test Journey
213
206
  Why this matters: Validates whether a real human with specific operational pressures can complete a critical task without getting blocked or frustrated.
214
207
 
215
208
  Baseline Test Proposal (WYSIWGW Spec-Sheet):
209
+ Capability: <Capability Name> (<What staff can do in this area>)
216
210
  Persona: <Name> (<Role / Title>)
217
211
  • Reality: <Working context, physical habits, tenure, pressures>
218
212
  • Friction: <Diagnostic friction, skepticism, bounce trigger>
@@ -246,19 +240,23 @@ Reply '1' to accept [default], select 2-4, or tell me what to adjust:
246
240
  ```
247
241
 
248
242
  **Action on confirmation (Option 1 or Option 2):**
249
- 1. **Scaffold Persona**:
243
+ 1. **Scaffold Primary Capability** (if not already existing):
250
244
  ```bash
251
- iamu new persona --name "<Name>" --role "<Role>" --disposition "<Disposition>" --body "<2-4 sentence narrative detailing technical habits, patience level, and specific friction triggers>" [--access "<account-or-role>"] --json
245
+ iamu new capability --name "<Capability Name>" --description "<What staff can do in this area>" --json
252
246
  ```
253
247
  2. **Scaffold Situation Outline**:
254
248
  ```bash
255
- iamu new outline --name "<Outline Title>" --tension "<Core Tension>" --human-test "<Concrete yes/partial/no evaluation question>" --narrative "<2-3 sentence problem-space narrative without UI terms>" --json
249
+ iamu new outline --name "<Outline Title>" --capability "<capability-slug>" --tension "<Core Tension>" --human-test "<Concrete yes/partial/no evaluation question>" --narrative "<2-3 sentence problem-space narrative without UI terms>" --json
250
+ ```
251
+ 3. **Scaffold Persona**:
252
+ ```bash
253
+ iamu new persona --name "<Name>" --role "<Role>" --disposition "<Disposition>" --body "<2-4 sentence narrative detailing technical habits, patience level, and specific friction triggers>" [--access "<account-or-role>"] --json
256
254
  ```
257
- 3. **Scaffold Bound Scenario**:
255
+ 4. **Scaffold Bound Scenario**:
258
256
  ```bash
259
257
  iamu new scenario --name "<persona-slug>--<outline-slug>" --outline "<outline-slug>" --persona "<persona-slug>" --entry "<entry_path>" --body "<Persona's first-person test brief describing what they intend to achieve>" --json
260
258
  ```
261
- 4. **Validate all entities**:
259
+ 5. **Validate all entities**:
262
260
  ```bash
263
261
  iamu validate --all
264
262
  ```
@@ -325,6 +323,7 @@ If login times out or fails:
325
323
  - **Clean terminal formatting.** Do not wrap agent briefings in markdown code fences (` ``` `). Use fixed column alignment for attributes and clean tree diagrams for generated files.
326
324
  - **Non-regulated software is the default.** Do not invent or force regulations (`governed_by`) on apps, developer tools, or consumer software. If the codebase has no compliance documentation, omit `governed_by` entirely.
327
325
  - **Explore automatically.** Read the codebase before asking the user anything. The user should only need to confirm or correct, not describe their own project from scratch.
328
- - **Context on disk is load-bearing.** Once step 4 writes `iamu/context.yml`, every downstream skill (`iamu-new`, `iamu-run`) auto-loads it.
326
+ - **Context on disk is load-bearing.** Once `iamu set context` writes `iamu/context.yml`, every downstream skill (`iamu-new`, `iamu-run`) auto-loads it.
327
+ - **Never invoke host Edit or Write tools.** Always scaffold or modify configuration and entities via `iamu set` and `iamu new` shell commands. Host tool edits trigger modal confirmation tripwires for the user.
329
328
  - **Handle re-runs gracefully.** An already-scaffolded project is a no-op on scaffold, a refresh on context/personas/scenarios (if the user opts in), and a re-prompt on cloud link.
330
329
  - **Handle errors gracefully.** Unreachable file → note it, move on. Unreachable cloud → report and let the user retry or defer.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamu-dev/iamu",
3
- "version": "0.3.0-beta.0",
3
+ "version": "0.3.0-beta.1",
4
4
  "type": "module",
5
5
  "description": "Test your product as realistic personas — scenario-driven development CLI",
6
6
  "license": "UNLICENSED",
@@ -59,8 +59,8 @@
59
59
  "typescript": "^5.8.0",
60
60
  "vitest": "^4.1.11",
61
61
  "@iamu-dev/local-store": "0.1.0",
62
- "@iamu/tsconfig": "0.1.0",
63
- "@iamu-dev/protocol": "0.1.0"
62
+ "@iamu-dev/protocol": "0.1.0",
63
+ "@iamu/tsconfig": "0.1.0"
64
64
  },
65
65
  "scripts": {
66
66
  "build": "tsup && tsc -b --force tsconfig.build.json --emitDeclarationOnly && node scripts/copy-assets.mjs",