@iamu-dev/iamu 0.2.0-beta.7 → 0.3.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/adapters/claude-plugin.d.ts +13 -0
  2. package/dist/adapters/registry.d.ts +6 -0
  3. package/dist/adapters/types.d.ts +19 -0
  4. package/dist/bin.d.ts +2 -0
  5. package/dist/bin.js +6660 -1556
  6. package/dist/build-info.d.ts +53 -0
  7. package/dist/cloud-url.d.ts +19 -0
  8. package/dist/commands/auth-http.d.ts +37 -0
  9. package/dist/commands/auth-project-choice.d.ts +74 -0
  10. package/dist/commands/auth-token-input.d.ts +21 -0
  11. package/dist/commands/auth.d.ts +84 -0
  12. package/dist/commands/browse-actions.d.ts +61 -0
  13. package/dist/commands/browse-driver.d.ts +121 -0
  14. package/dist/commands/browse.d.ts +195 -0
  15. package/dist/commands/cloud-push.d.ts +27 -0
  16. package/dist/commands/complete.d.ts +132 -0
  17. package/dist/commands/completion.d.ts +2 -0
  18. package/dist/commands/context.d.ts +81 -0
  19. package/dist/commands/credentials.d.ts +144 -0
  20. package/dist/commands/diff-filter.d.ts +11 -0
  21. package/dist/commands/doctor.d.ts +33 -0
  22. package/dist/commands/edit-entity.d.ts +8 -0
  23. package/dist/commands/evaluate.d.ts +34 -0
  24. package/dist/commands/explore-crawl.d.ts +67 -0
  25. package/dist/commands/explore.d.ts +53 -0
  26. package/dist/commands/findings.d.ts +7 -0
  27. package/dist/commands/init.d.ts +27 -0
  28. package/dist/commands/instructions-walk.d.ts +69 -0
  29. package/dist/commands/instructions.d.ts +30 -0
  30. package/dist/commands/list.d.ts +5 -0
  31. package/dist/commands/live-run-client.d.ts +127 -0
  32. package/dist/commands/match.d.ts +15 -0
  33. package/dist/commands/mcp-config.d.ts +10 -0
  34. package/dist/commands/new-entity.d.ts +34 -0
  35. package/dist/commands/new-finding.d.ts +25 -0
  36. package/dist/commands/open.d.ts +8 -0
  37. package/dist/commands/port.d.ts +17 -0
  38. package/dist/commands/preflight.d.ts +26 -0
  39. package/dist/commands/prune.d.ts +11 -0
  40. package/dist/commands/pull.d.ts +5 -0
  41. package/dist/commands/register-cloud.d.ts +5 -0
  42. package/dist/commands/register-findings.d.ts +5 -0
  43. package/dist/commands/register-project.d.ts +5 -0
  44. package/dist/commands/register-walkthrough.d.ts +5 -0
  45. package/dist/commands/register.d.ts +10 -0
  46. package/dist/commands/report.d.ts +3 -0
  47. package/dist/commands/serve.d.ts +11 -0
  48. package/dist/commands/set-entity.d.ts +46 -0
  49. package/dist/commands/skills.d.ts +34 -0
  50. package/dist/commands/start-run.d.ts +56 -0
  51. package/dist/commands/status.d.ts +3 -0
  52. package/dist/commands/step-numbering.d.ts +87 -0
  53. package/dist/commands/step.d.ts +96 -0
  54. package/dist/commands/summary.d.ts +20 -0
  55. package/dist/commands/sync.d.ts +6 -0
  56. package/dist/commands/triage.d.ts +21 -0
  57. package/dist/commands/update.d.ts +4 -0
  58. package/dist/commands/validate.d.ts +11 -0
  59. package/dist/commands/view-results.d.ts +9 -0
  60. package/dist/index.d.ts +9 -0
  61. package/dist/index.js +6617 -1559
  62. package/dist/sync-mcp/fatal.d.ts +42 -0
  63. package/dist/sync-mcp/server.d.ts +1 -0
  64. package/dist/sync-mcp/tools.d.ts +12 -0
  65. package/dist/templates/prompts/walk.md +62 -37
  66. package/dist/templates/skills/iamu-findings.md +118 -42
  67. package/dist/templates/skills/iamu-new.md +107 -58
  68. package/dist/templates/skills/iamu-propose.md +36 -20
  69. package/dist/templates/skills/iamu-run.md +277 -114
  70. package/dist/templates/skills/iamu-setup.md +259 -150
  71. package/dist/templates/skills/iamu-stage.md +164 -0
  72. package/dist/templates/skills/iamu-status.md +16 -11
  73. package/dist/templates.d.ts +10 -0
  74. package/dist/ui/journey-diff.d.ts +3 -0
  75. package/dist/ui/json.d.ts +6 -0
  76. package/dist/ui/logger.d.ts +5 -0
  77. package/dist/ui/panic.d.ts +11 -0
  78. package/dist/ui/symbols.d.ts +11 -0
  79. package/dist/ui/table.d.ts +20 -0
  80. package/dist/ui/update-check.d.ts +6 -0
  81. package/dist/worktree-state.d.ts +49 -0
  82. package/package.json +8 -8
  83. package/dist/eval/gemini-eval-cli.js +0 -976
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: iamu-run
3
- description: Execute a scenario walkthrough. Accepts scenario slug / UUID / free-form intent / no-arg. Intent chains into iamu-new first, then runs.
3
+ description: Use when executing a persona walkthrough, running or testing a scenario, driving the browser against the product, verifying fixes, or when the user says "run it", "test it", or "walk through the app".
4
4
  generatedBy: __IAMU_VERSION__
5
5
  ---
6
6
 
7
7
  Run a scenario against a running product. The walkthrough executes in your agent session using a driving surface you control — a browser MCP for a web product, or the iOS Simulator for a native app — no separate Iamu runner involved for local flows.
8
8
 
9
- This skill resolves what you want to run from your argument:
9
+ This skill resolves what scenario to run following a clear **Target Scenario Resolution Precedence**:
10
10
 
11
- - Scenario slug or UUID → load + execute.
12
- - Free-form intent ("checkout abandonment", "returning customer friction") → fuzzy-match against existing scenarios; if nothing fits, chain into `iamu-new` to draft first, then execute.
13
- - No argument → pickable list of scenarios: scenarios that need a re-run first, then drafts and ready-to-run.
11
+ 1. **Explicit argument (`$ARGUMENTS`):** Exact slug / UUID, fuzzy slug match, or free-form intent (which chains into `iamu-new`).
12
+ 2. **Active conversational context:** When `$ARGUMENTS` is empty or generic (e.g. "it", "that", "this", "run it", "walk it", "go"), and a scenario was created, modified, staged, or discussed in the active session — immediately resolve to that active scenario without prompting or re-scanning.
13
+ 3. **No argument & No active session scenario:** Check unfinished runs, then present a prioritized pickable list (reruns needing proof first, then drafts and ready-to-run).
14
14
 
15
15
  $ARGUMENTS
16
16
 
@@ -18,6 +18,8 @@ $ARGUMENTS
18
18
 
19
19
  Before starting, check that `iamu/context.yml` exists and has `domain` filled in. If it is missing or empty, run the `iamu-setup` skill first — context grounds every walkthrough. If `iamu/` does not exist at all, run `iamu init` first.
20
20
 
21
+ **Fast Preflight Type/Lint Gate:** Run `iamu preflight` before booting dev servers or walkers. If syntax, typecheck, or lint checks fail, halt immediately with the compiler diagnostic and fix them before launching the browser. Never burn minutes on a browser session against code that will not compile.
22
+
21
23
  ## Steps
22
24
 
23
25
  ### 0. Verify a driving surface
@@ -41,16 +43,22 @@ Tell the user in one line which one you picked and why. If the project's own age
41
43
  A native app has no URL, and a browser tool is not a substitute for one. If the product is native, the target is a device plus a build (step 3).
42
44
 
43
45
  If no surface is available, stop and tell the user:
44
-
45
- > A walkthrough needs a driving surface. For a web product, `iamu browse` works wherever Chrome or Chromium is installed (or set `IAMU_BROWSER`); a browser-driving MCP that attaches to Chrome also works — restart your agent session after installing one and re-run `iamu-run`. For a native iOS app, a simulator control tool must be available in this session.
46
+ "A walkthrough needs a driving surface. For a web product, `iamu browse` works wherever Chrome or Chromium is installed (or set `IAMU_BROWSER`); a browser-driving MCP that attaches to Chrome also works — restart your agent session after installing one and re-run `iamu-run`. For a native iOS app, a simulator control tool must be available in this session."
46
47
 
47
48
  Do NOT proceed to step 1 before a driving surface is confirmed.
48
49
 
49
- **Unfinished runs.** Run `iamu status --json` and look at `runs.incomplete`. A run listed there was started but never reached `iamu complete` — the walker died or the session ended — so its steps and findings exist but it has no report, no verdicts, and no delta. If there are any, tell the user how many and offer, once:
50
+ **Unfinished runs.** Only check and offer when `iamu-run` has no explicit argument AND no active scenario exists in the session context. If an explicit scenario slug or intent was passed, OR if an active scenario is resolved from the conversation context, do NOT block execution with this prompt — log at most a single line (`Note: <N> unfinished run(s) pending — use iamu status to inspect`) and proceed directly to step 1.
51
+
52
+ When `$ARGUMENTS` is empty and no active scenario exists in context, check `iamu status --json` for `runs.incomplete`. If any exist, offer once:
50
53
 
51
- - **Finish** one that has step files: run the post-walk pipeline (step 4, A→B→C→D) on it as it stands. A partial walk with a report is worth more than a complete one nobody assembled.
52
- - **Discard** ones with no steps: delete the run directory. Runs are ephemeral; findings already written to `iamu/findings/` are kept.
53
- - **Leave them** and carry on.
54
+ - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
55
+ - Question: "Found <N> unfinished walkthrough run(s). How would you like to handle them?"
56
+ - Options:
57
+ 1. "[Recommended] Ignore and continue with new run"
58
+ 2. "Finish run `<run-id>`: Run post-walk assembly on existing steps"
59
+ 3. "Discard empty unfinished runs"
60
+ - Otherwise (in text-only/conversational environments), state that you are proceeding with Option 1 by default:
61
+ "Note: Found <N> unfinished walkthrough run(s). Proceeding with a new run [1]. (Reply 2 to finish run `<run-id>` or 3 to discard empty runs)."
54
62
 
55
63
  Do not block the new run on this, and do not ask again in the same session.
56
64
 
@@ -60,17 +68,23 @@ Do not block the new run on this, and do not ask again in the same session.
60
68
  - **Linked, no credentials** (`cloud_linked` true, `authenticated` false) → say once: "This project is cloud-linked, but this machine has no credentials — the run stays local until `iamu auth login`." Continue.
61
69
  - **Local-only** → nothing to do here.
62
70
 
63
- ### 1. Resolve the argument
71
+ ### 1. Resolve the target scenario
64
72
 
65
- Four paths based on `$ARGUMENTS`:
73
+ Follow this precedence cascade:
66
74
 
67
- **UUID or exact slug match** → Read scenario files from `iamu/scenarios/` directory, or run `iamu list scenarios --json`, and match. Load and skip to step 3.
75
+ #### Path 1: Explicit Argument (`$ARGUMENTS` is provided)
76
+ - **UUID or exact slug match** → Read scenario files from `iamu/scenarios/` directory, or run `iamu list scenarios --json`, and match. Load and skip to step 3.
77
+ - **Slug-like arg with no exact match** → Run fuzzy match against existing scenario slugs (simple substring / levenshtein — the agent should judge similarity). If the best match is obviously close (shared two or more tokens), confirm with the user: "Did you mean `<slug>`?" Accept / correct / treat as free-form intent.
78
+ - **Free-form intent string** (quoted or multi-word, no match) → Chain into `iamu-new` with the intent as seed. After `iamu-new` completes and returns a scenario slug, continue here with that slug.
68
79
 
69
- **Slug-like arg with no exact match** → Run fuzzy match against existing scenario slugs (simple substring / levenshtein — the agent should judge similarity). If the best match is obviously close (shared two or more tokens), confirm with the user: "Did you mean `<slug>`?" Accept / correct / treat as free-form intent.
80
+ #### Path 2: Active Session Context (Conversational Anaphora & Recency)
81
+ When `$ARGUMENTS` is empty, generic (e.g. "it", "that", "this", "run", "go"), or the user says "run it" / "walk through it" / "let's test that" / triggers `iamu-run` right after scenario creation, staging, or discussion:
82
+ - **Immediately bind to the active scenario** created, modified, staged, or discussed in the current conversation turn or session.
83
+ - **Do NOT prompt the user or show a selection menu.** State the binding in one sentence (e.g. `Running active scenario maria-gomez--busy-shift...`) and proceed directly to Step 3 (or Step 2 if unbonded draft).
70
84
 
71
- **Free-form intent string** (quoted or multi-word, no match) → Chain into `iamu-new` with the intent as seed. After `iamu-new` completes and returns a scenario slug, continue here with that slug.
72
-
73
- **No arg** → Run `iamu status --json` and `iamu list scenarios --json` (or read `iamu/scenarios/`). `rerun` in the status output lists scenarios holding fixes that no later run has proven yet — a fix counts only once a re-run of its scenario shows it working. Present that group first, most awaiting fixes first, with its `reason`; then drafts and ready-to-run (a scenario in the first group is not repeated below):
85
+ #### Path 3: No Argument & No Active Session Scenario (Global Selection)
86
+ When `$ARGUMENTS` is empty and no specific scenario is active in the conversation:
87
+ - Run `iamu status --json` and `iamu list scenarios --json` (or read `iamu/scenarios/`). `rerun` in the status output lists scenarios holding fixes that no later run has proven yet — a fix counts only once a re-run of its scenario shows it working. Present that group first, most awaiting fixes first, with its `reason`; then drafts and ready-to-run (a scenario in the first group is not repeated below):
74
88
 
75
89
  ```
76
90
  Needs a re-run (fixes awaiting proof):
@@ -84,15 +98,34 @@ Ready to run:
84
98
  4. dev-patel--checkout-abandon — Abandoned cart x Dev Patel
85
99
  ```
86
100
 
87
- Omit the first group when `rerun` is empty. User picks a number or slug. Drafts get a bind prompt before execution (step 2); ready-to-run scenarios skip to step 3.
101
+ Omit the first group when `rerun` is empty. If `requests.open` in the status output is above zero, put one line above the list: `Team requests: <N> waiting — iamu-findings picks them up.` Teammates queued those in Iamu Cloud; a verify or run request names the scenario to walk.
102
+
103
+ - **Single-Entity Auto-Selection (Zero-Prompt Fast Path):**
104
+ If only one runnable scenario exists in the project (or only one scenario needs a re-run), do NOT present a selection menu or ask for confirmation. Immediately state: `Using scenario: <slug> (sole scenario in project. Override with iamu-run <other>)` and advance directly to Step 3 (or Step 2 if unbonded draft).
88
105
 
89
- If `requests.open` in the status output is above zero, put one line above the list: `Team requests: <N> waiting — iamu-findings picks them up.` Teammates queued those in Iamu Cloud; a verify or run request names the scenario to walk.
106
+ **Interactive Scenario Selection:**
107
+ - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it with the top prioritized candidates as selectable options:
108
+ - Question: "Which scenario would you like to run?"
109
+ - Options:
110
+ 1. "[Recommended] <Slug or Title>" (e.g. top rerun needing proof, or primary ready scenario)
111
+ 2. "<Alternative Scenario Slug or Title>"
112
+ 3. "Draft a new scenario..."
113
+ - Otherwise, prompt: "Pick a scenario number (1–N), enter a slug, or type an intent to draft a new one."
114
+
115
+ Drafts get a bind prompt before execution (step 2); ready-to-run scenarios skip to step 3.
90
116
 
91
117
  ### 2. Bind persona (draft path only)
92
118
 
93
119
  If the resolved scenario has `persona: null`, prompt to bind before executing:
94
120
 
95
- "This scenario is a draft — no persona bound. Pick one, or draft a new persona."
121
+ **Interactive Persona Binding:**
122
+ - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
123
+ - Question: "This scenario is a draft with no persona bound. Which persona should walk it?"
124
+ - Options:
125
+ 1. "[Recommended] <Existing Persona 1> (<Role>)"
126
+ 2. "<Existing Persona 2> (<Role>)"
127
+ 3. "Draft a new persona candidate"
128
+ - Otherwise, ask: "This scenario is a draft — no persona bound. Pick an existing persona (1–N), or type 'new' to propose candidates."
96
129
 
97
130
  1. Read `iamu/personas/` directory or run `iamu list personas`; present as pickable list + "new" option.
98
131
  2. Picked existing → bind that persona by updating the scenario file's `persona` field.
@@ -113,9 +146,33 @@ After bind + brief, the scenario is ready to execute. Continue to step 3.
113
146
 
114
147
  ### 3. Target
115
148
 
116
- **Web** — ask for the target URL (live product, staging, or localhost). If the scenario has a default `target_url` in its frontmatter, offer that with a confirm.
117
-
118
- Where the walk *starts* is part of the situation, not of the environment: a persona arriving from a video, an email or a search result lands on a specific page, not the home page. If the scenario has `entry_path`, `iamu start-run` resolves it against the target — pass the product's base URL as `--target`. If it has none but the situation clearly begins on a particular page, set `entry_path` in the scenario frontmatter first (a path like `/en/episodes/1`, never a full URL), so this run and every later one start there. A walk started on the wrong page reports the detour as a finding.
149
+ **Web** — determine the target URL:
150
+ 1. If the user passed an explicit target or the scenario has `target_url`, use that.
151
+ 2. Otherwise, check `iamu/testability.md` for `target_url`.
152
+ 3. If still unconfigured, prompt the user for the target URL (live product, staging, or localhost).
153
+ **Dev Server Preflight Check:**
154
+ Verify target reachability before launching the walker with `iamu doctor --target <url>` (or a fast HTTP probe).
155
+ If the target is a local URL (e.g. `http://localhost:*`, `http://127.0.0.1:*`) and is unreachable:
156
+ 1. Inspect `iamu/testability.md` for `Command:` under `## Target & Run Instructions` (or check `package.json` for a `dev` or `start` script).
157
+ 2. Prompt the user:
158
+ - If interactive tool available:
159
+ - Question: "Target URL <url> is unreachable. Boot dev server now?"
160
+ - Options:
161
+ 1. "[Recommended] Boot dev server in background (`<dev_command>`) and proceed"
162
+ 2. "I will start the dev server manually (wait for port)"
163
+ 3. "Specify a different target URL"
164
+ - Otherwise (CLI / text-only):
165
+ Target URL <url> is unreachable. Boot dev server now?
166
+ 1. [Recommended] Boot dev server in background (`<dev_command>`) and proceed
167
+ 2. I will start the dev server manually (wait for port)
168
+ 3. Specify a different target URL
169
+ Reply '1' to boot dev server [default], select 2-3, or provide target URL:
170
+ 3. If Option 1 is chosen:
171
+ - Launch `<dev_command>` in the background as a managed daemon process.
172
+ - Poll `<url>` with HTTP requests until it responds (timeout: 30s).
173
+ - Once reachable, proceed immediately to the walkthrough.
174
+
175
+ Where the walk *starts* is part of the situation, not of the environment: a persona arriving from a video, an email or a search result lands on a specific page, not the home page. If the scenario has `entry_path`, `iamu start-run` resolves it against the target — pass the product's base URL as `--target`. If it has none but the situation clearly begins on a particular page, set it first with `iamu set scenario <slug> --entry <path>` (a path like `/en/episodes/1`, never a full URL), so this run and every later one start there. A walk started on the wrong page reports the detour as a finding.
119
176
 
120
177
  **Native iOS** — the target is a device plus a build. Establish three things:
121
178
 
@@ -127,30 +184,39 @@ Record it as a target string the run can carry, for example `sim://<device-name>
127
184
 
128
185
  **Then verify the starting state before spawning anyone.** Launch the app and take ONE screenshot confirming the product is where the scenario assumes it starts. Wait a few seconds after launch first: a screen rendered before its state lands shows the wrong thing, and verifying too early makes the verification itself lie — in the direction of "the harness is broken", which costs a debugging detour or, worse, waves a real seeding bug through.
129
186
 
187
+ **Stage the starting state — first run of a scenario.** Drafting a scenario deliberately leaves out the product's code, pages and data, so its first run is where it gets staged. If the scenario has no `state` yet, invoke the `iamu-stage` skill (or stage inline):
188
+
189
+ 1. From the outline, persona and brief, say in plain words what the world must contain for the situation to play out (which records, how old, in what condition, who else is involved) and who the persona must be signed in as.
190
+ 2. Check what the project already has to produce that world: seed scripts, fixtures, factories, mock handlers. `iamu/testability.md` lists the known ones; the codebase has the rest.
191
+ 3. Show the user each requirement and whether it is met, then agree how to get there: an existing seed, a change to a seed script or mock handler (propose it as a diff for the user to apply), data the user creates by hand, or letting the walker approximate.
192
+ 4. Record the outcome on the scenario so later runs do not ask again: `iamu set scenario <slug> --state-description "<the world, in domain words>" --state-approximation "<how the walker picks the closest record when the exact one is missing>"`. When the situation needs no particular data (a visitor reading a public page), record that too: `--state-description "No particular data needed"`. Project-wide facts learned on the way ("the seed needs Docker running") go in the `iamu/testability.md` body.
193
+
194
+ Staging adds to a scenario and never changes what it is about: do not edit the narrative, tension, human tests or brief; if one looks wrong, tell the user. When the product cannot support the situation, walk it anyway — the persona hitting that wall is the finding. Stop only when the walk itself cannot be set up: the persona's account cannot be reached, the data cannot be produced, or the situation crosses an untestable boundary.
195
+
130
196
  **Expected State & Semantic Squinting — verify environment before walking.** A scenario testing triage, review, or audits requires a populated, realistic system.
131
197
  1. **Expected State:** If the scenario defines `state.description`, verify the landing screen matches what the persona expects to see (e.g. populated register, open incidents). If the screen is completely blank and the persona cannot self-seed, stop early and report the run as blocked by missing preconditions rather than logging false product bugs.
132
198
  2. **Data Squinting & Approximation:** If the exact record described in the narrative is absent (e.g. no "damaged conveyor belt" hazard), the walker must follow `state.approximation` — "squint" at the real data, pick the closest plausible record (e.g. an active mechanical or safety hazard), and proceed with the evaluation/delegation workflow.
133
199
  - **Squinting Guardrail:** Squinting is bounded to semantically related items within the same domain workflow. It does NOT permit drifting to unrelated modules (e.g. switching from risk assessment to user profile settings). If no plausible record exists, declare the run blocked.
134
200
  3. **Empty State Fallback:**
135
201
  - If the database is empty and the persona role has creation rights (e.g. Manager or Reporter), the persona may create the minimal viable record in-character to proceed with the core test.
136
- - If the persona role is read-only or subordinate (cannot self-seed), stop and report the run as blocked by preconditions.
202
+ - If the persona role is read-only or subordinate (cannot self-seed), stop and report the run as blocked by preconditions (`iamu summary <run-id> --blocked "<what was missing>"`).
137
203
 
138
204
  **Access — how the walker becomes this persona.** A walk as a forklift driver that runs with an administrator's session reports nothing true about what the driver can see or reach. Access is recorded in two places, and `iamu instructions walk` (step 4) returns both as `access`:
139
205
 
140
- - `access.project` — from `iamu/context.yml` `access`: HOW switching user is done in this product (a dev persona switcher, a storage key, seeded test accounts, a login form). Written once per project.
206
+ - `access.project` — from `iamu/testability.md` `access` (older projects: `iamu/context.yml`): HOW switching user is done in this product (a dev persona switcher, a storage key, seeded test accounts, a login form). Written once per project.
141
207
  - `access.persona` — from the persona file's `access`: WHICH user this persona is (an account name, a role, a switcher key).
142
208
 
143
209
  **Interactive Auth Handshake (for enterprise auth, SSO, 2FA, BankID):**
144
210
  If the product is behind enterprise login where automated dev persona switching is not configured:
145
211
  1. Open the browser to the target URL (`iamu browse start --run <run-id>` or browser tool).
146
212
  2. Prompt the human user:
147
- > 👉 **Please log in as `<persona.role>` (`<persona.name>`) in the opened browser window.** Press Enter once you reach the dashboard to hand control to the walker...
213
+ > 👉 **Please log in as `<persona.role>` (`<persona.name>`) in the opened browser window.** Tell me once you reach the dashboard (e.g. "I'm logged in") to hand control to the walker...
148
214
  3. Wait for the user to confirm, then let the walker drive the authenticated session.
149
215
 
150
216
  If automated switching exists:
151
217
  1. Check the project's own agent docs (`CLAUDE.md`, `AGENTS.md`) for a documented way to switch user or role.
152
218
  2. Map the persona to the closest account or role the product actually has. If nothing fits, say so.
153
- 3. Write what you learned: the mechanism into `iamu/context.yml` as `access:`, the persona's own key into `iamu/personas/<slug>.md` frontmatter as `access:`. Passwords and tokens never go in either — name where they live (an env var, a vault entry) instead.
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.
154
220
 
155
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.
156
222
 
@@ -164,13 +230,16 @@ iamu start-run <scenario-slug> --target <target> --json
164
230
 
165
231
  This creates the run directory, writes `walkthrough.json` with resolved persona/outline slugs and the build under test (git SHA and branch, whether there are uncommitted changes outside `iamu/` with a fingerprint of them, CI run when in CI), and returns:
166
232
  ```json
167
- { "run_id": "...", "path": "...", "scenario_slug": "...", "target_url": "...", "persona_slug": "...", "outline_slug": "...", "build": { "git_sha": "...", "git_branch": "...", "git_dirty": false }, "environment": "https://staging.example.com" }
233
+ { "run_id": "...", "path": "...", "scenario_slug": "...", "target_url": "...", "live_viewer_url": "https://app.iamu.dev/projects/.../live/...", "persona_slug": "...", "outline_slug": "...", "build": { "git_sha": "...", "git_branch": "...", "git_dirty": false }, "environment": "https://staging.example.com" }
168
234
  ```
169
235
 
170
236
  Pass `--build <label>` to name the build (a version or release tag) and `--env <name>` to name the environment (`staging`, `production`); without `--env` the environment is the target URL's origin. Neither is needed for a local walk.
171
237
 
172
238
  Use the returned `run_id` and `path` for all subsequent operations.
173
239
 
240
+ **If `live_viewer_url` is returned**, immediately output it to the user so the operator can follow along live in their browser:
241
+ 🔴 **Live stream:** `<live_viewer_url>`
242
+
174
243
  **Size the browser for this persona** (`iamu browse` only), every run — also when a browser is already open from an earlier run:
175
244
 
176
245
  ```bash
@@ -190,11 +259,16 @@ iamu instructions walk --scenario <scenario-slug> --run <run-id> --surface brows
190
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.
191
260
 
192
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:
193
- > "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."
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."
194
263
 
195
264
  **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.
196
265
 
197
- 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.
266
+ 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.
267
+
268
+ **Subagent Capability Fencing (Superpowers Pattern):**
269
+ - **Tool Whitelist:** If the host allows tool restriction, grant the walker ONLY the browser driving tools (`iamu browse` or browser MCP) and read-only inspection.
270
+ - **Tool Blacklist:** Strictly strip file write/edit tools (`write_to_file`, `replace_file_content`, patch/edit tools, and source git commits). The walker is an observer, never a developer.
271
+ - **Child Session Suppression:** The walker must never execute parent workflow routines (`iamu init`, `iamu triage`, `iamu new`). All steps, findings, and summaries are recorded atomically via `iamu browse step`, `iamu new-finding`, and `iamu summary`.
198
272
 
199
273
  **Model tiering & subagent dispatch:**
200
274
  - **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.
@@ -221,6 +295,15 @@ The subagent inherits the driving-surface tools and drives the product independe
221
295
 
222
296
  After the walker returns, continue to the post-walk pipeline below.
223
297
 
298
+ **Live progress reporting (terminal monitoring):**
299
+ While the walker subagent executes, maintain visible feedback in the terminal:
300
+ - At start (if cloud-linked): output the live dashboard viewer link: `Live stream: <viewer_url>`
301
+ - As progress occurs (on subagent notifications or milestone steps): output a concise single-line progress update:
302
+ `step <N> · <action/surface> · <F> finding(s)`
303
+ This gives the terminal operator immediate real-time visibility into the persona's progress.
304
+ - If the walker stops because the user pressed Stop in the viewer (`The user stopped this run from the live viewer. End the walk now.`), respect the cancellation and proceed to post-walk assembly with existing steps.
305
+ - Once the walker finishes, announce completion and proceed immediately to the post-walk pipeline.
306
+
224
307
  **Recording steps:**
225
308
 
226
309
  Use atomic CLI commands to drive and record in one step — do NOT manually author JSON files:
@@ -247,15 +330,13 @@ Step files live at `iamu/.runs/<run-id>/steps/<NNN>.json`. The CLI manages monot
247
330
 
248
331
  **Recording findings:**
249
332
 
250
- Use the CLI to create findings with valid frontmatter, UUID, and slug:
333
+ Use the CLI to create findings with valid frontmatter, UUID, slug, description, and recommendation in one atomic call:
251
334
 
252
335
  ```bash
253
- 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
336
+ 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
254
337
  ```
255
338
 
256
- 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": "..." }`.
257
-
258
- After the CLI scaffolds the file, edit the file to add the finding body (description + recommendation) below the frontmatter.
339
+ 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.
259
340
 
260
341
  Valid `--type` values: `helps`, `hinders`, `missing`, `irrelevant`, `incorrect`.
261
342
  Valid `--severity` values: `critical`, `major`, `minor`, `observation`.
@@ -266,6 +347,12 @@ Findings never name a human test: the walker does not see them. The judge links
266
347
 
267
348
  **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.
268
349
 
350
+ **Closing Synthesis:**
351
+ Before finishing the walk, record persona synthesis using `iamu summary`:
352
+ ```bash
353
+ iamu summary <run-id> --worked "What worked well 1" --worked "What worked well 2" --question "Open question 1"
354
+ ```
355
+
269
356
  **Post-walk pipeline (MANDATORY — do NOT skip any step):**
270
357
 
271
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.
@@ -278,16 +365,19 @@ iamu complete <run-id> --no-prompt --no-push --json
278
365
 
279
366
  This reads all steps, findings, and entity files, assembles `canonical.json`, generates `report.md`, and computes the delta against prior runs.
280
367
 
368
+ **If the result has `blocked`**, the walker could not start the walk as it was set up (`iamu summary --blocked`): it could not become the persona, or the world the situation needs was not there. That is a setup problem, not a product finding. Skip B and C — a blocked run is never compared with earlier runs and never counts as a re-run. Tell the user in one line what was missing (`blocked.reason`), then run the `iamu-stage` skill with that reason as the starting point: fix the scenario's `state`, the persona's access, or the seed, and offer to run the scenario again. Findings the walker recorded before it stopped stay as they are. E still runs in linked mode; the report says the run was blocked.
369
+
281
370
  **B. Match findings to earlier runs.** Get the matcher bundle:
282
371
 
283
372
  ```bash
284
373
  iamu match <run-id> --json
285
374
  ```
286
375
 
287
- 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:
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`):
288
377
 
289
378
  ```bash
290
- iamu match-record <run-id> --file <matches.json>
379
+ iamu match-record <run-id> --data '<matches.json>'
380
+ # or: iamu match-record <run-id> --file <matches.json>
291
381
  ```
292
382
 
293
383
  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.
@@ -298,10 +388,11 @@ This links recurrences to their earlier canonical finding, marks earlier finding
298
388
  iamu evaluate <run-id> --json
299
389
  ```
300
390
 
301
- 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`:
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`):
302
392
 
303
393
  ```bash
304
- iamu evaluate-record <run-id> --file <verdicts.json> --no-prompt --no-push
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
305
396
  ```
306
397
 
307
398
  This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
@@ -336,72 +427,47 @@ The `walker_prompt` from `iamu instructions walk` is the source of truth and con
336
427
 
337
428
  ### 5. Present assessment — stay in the conversation
338
429
 
339
- Render results **inline** with a high-contrast executive summary banner, followed by findings enriched with persona voice, evidence citations, and clickable file links.
340
-
341
- 1. **Executive Summary Banner & Focus Checkpoint**
342
-
343
- Read the outline's `human_tests[0].question` and answer it directly. Use the evaluation verdict if available:
430
+ Render results **inline** as a concise executive scorecard.
344
431
 
345
- ```
346
- Walkthrough: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
347
- Verdict: <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (Steps: <N>)
348
- Focus Checkpoint: "<human_tests[0].question>" → <No / Partial / Yes>: <1-2 sentence direct answer explaining why>
349
- ```
350
-
351
- 2. **Progress since last run** (only when canonical.json contains a `verification` section). Present the delta:
352
-
353
- ```
354
- Since this scenario's last run:
355
- ✓ 1 fixed, re-checked (handoff note saves — step 6)
356
- ✗ 1 persists (timeout warning)
357
- ○ 2 not seen this run (handoff list filtering, submit confirmation)
358
- + 1 new since that run (date picker locale)
359
- ```
360
-
361
- `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.
362
-
363
- 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**:
364
-
365
- **Hinders / Missing** (act on these):
366
-
367
- 1. [CRITICAL · hinders] Submit fails opaquely when required field empty ([file](iamu/findings/<slug>.md))
368
- • Persona: <Persona Name>: "<Persona reaction quote or consequence showing real human friction>"
369
- • Evidence: Step <N> at <url> (Screenshot: [view](iamu/.runs/<run-id>/screenshots/<NNN>.png))
370
- • Recommendation: <Concrete recommendation from finding>
432
+ **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.
371
433
 
372
- 2. [MAJOR · hinders] Date picker has no "today" shortcut ([file](iamu/findings/<slug>.md))
373
- • Persona: <Persona Name>: "<Persona reaction quote or consequence>"
374
- • Evidence: Step <N> at <url>
375
- • Recommendation: <Concrete recommendation from finding>
434
+ Keep the presentation under 15 lines total:
376
435
 
377
- **Helps** (preserve these):
378
-
379
- • [helps] Search auto-suggests from recent entries (Step <N>)
436
+ ```
437
+ Walkthrough: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
438
+ Verdict: <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (Steps: <N>)
439
+ Focus Checkpoint: "<human_tests[0].question>" → <No / Partial / Yes>: <1-sentence direct answer>
380
440
 
381
- 4. **What worked** — supportive moments worth preserving (brief, from `what_worked` in the canonical JSON).
441
+ Findings:
442
+ 1. [<CRITICAL|MAJOR|MINOR> · <type>] <Short title> (Step <N> at <short_url_path>)
443
+ 2. [<CRITICAL|MAJOR|MINOR> · <type>] <Short title> (Step <N> at <short_url_path>)
444
+ ...
445
+ (Helps: • [helps] <short title> (Step <N>))
382
446
 
383
- 5. **Next-scenario suggestion** — read `iamu/scenarios/` to check coverage, then suggest one of:
384
- - Same scenario with a different persona (if other personas exist for this situation)
385
- - Adjacent untested scenario in the same capability
386
- - Nothing (if coverage is good)
447
+ Cloud: <Shareable report: <url> | Local only>
448
+ ```
387
449
 
388
- 6. **Cloud** — one line, by mode:
389
- - **Linked, run on the cloud** → `Shareable report: <url>` (screenshots and step replay for anyone on the team).
390
- - **Linked, run not on the cloud** → the reason from step E and its remedy, e.g. `Cloud: queued — retries on the next iamu sync`.
391
- - **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.`
450
+ (If canonical.json contains a `verification` section, include a 1-line delta: `Since last run: ✓ <N> fixed · ✗ <M> persist · + <K> new`.)
451
+ Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the entire summary under 15 lines, then immediately present the triage prompt below.
392
452
 
393
- 7. **Next actions (Conversational Triage)**:
453
+ 7. **Next actions (Interactive Triage Selection)**:
454
+ When the walkthrough completes and yields findings:
455
+ - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
456
+ - Question: "Walkthrough complete: <F> findings reported. How would you like to proceed?"
457
+ - Options:
458
+ 1. "[Recommended] Walk through findings one by one"
459
+ 2. "Apply fixes for all clear findings (batch fix)"
460
+ 3. "Discuss findings and persona friction points"
461
+ 4. "Re-run walkthrough to test changes"
462
+ - Otherwise (in CLI or text-only environments):
394
463
 
395
- Conclude your report with clear conversational prompts instead of raw terminal commands:
464
+ Walkthrough complete: <F> findings reported.
465
+ 1. [Recommended] Walk through findings one by one
466
+ 2. Apply fixes for all clear findings (batch fix)
467
+ 3. Discuss findings and persona friction points
468
+ 4. Re-run walkthrough to test changes
396
469
 
397
- ```
398
- What would you like to do?
399
- • "walk through them" → Review findings one by one with persona context & code location
400
- • "fix 1 and 2" → Have me implement code fixes directly
401
- • "discuss 2" → Ask why the persona hit this friction or explore trade-offs
402
- • "skip 3" / "dismiss 3" → Dismiss finding (out of scope, intended, or walker error)
403
- • "re-run" → Re-run walkthrough to verify fixes
404
- ```
470
+ Reply '1' to review findings [default], enter 2-4, or tell me how to proceed:
405
471
 
406
472
  ### 6. Conversational Triage & Guided Review
407
473
 
@@ -409,19 +475,59 @@ The conversation is the triage surface. Do NOT eject the user to manual CLI comm
409
475
 
410
476
  #### A. Guided One-by-One Review ("walk through them" / "review one by one")
411
477
  When the user asks to review findings one by one:
412
- 1. **Present Finding #N in isolation**:
413
- - Number, severity, type, and title
414
- - Persona consequence quote and why the friction occurred
415
- - Relevant source code location (inspect project files to provide file path + line numbers)
416
- - Step & screenshot evidence ([view](iamu/.runs/<run-id>/screenshots/<NNN>.png))
417
- - Actionable recommendation
418
- - Clear options prompt:
419
- `Options: [Fix now] [Skip / Dismiss] [Discuss / Why] [Next finding]`
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>)
488
+ ```
489
+ If the project is cloud-linked, include the link to the finding in Iamu Cloud (from `iamu open --print`).
490
+
491
+ Followed immediately by the decision prompt:
492
+
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.
495
+
496
+ - If interactive tool available (e.g. `ask_question`, `ask_followup_question`), invoke it:
497
+ - **Question:**
498
+ """
499
+ Finding #<N>/<total>: <title>
500
+
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>
508
+
509
+ How should we triage this finding?
510
+ """
511
+ - **Options:**
512
+ 1. "[Recommended] Queue to fix (mark for fix & continue triage)"
513
+ 2. "Dismiss / Skip (not relevant or walker error)"
514
+ 3. "Discuss / Explore trade-offs"
515
+ 4. "Fix immediately (leave triage now)"
516
+ 5. "Next finding (keep open / defer)"
517
+ - 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)
524
+ Reply '1' to queue fix [default], select 2-5, or describe your decision:
420
525
 
421
526
  2. **Handle the user's decision**:
422
- - **Fix now**:
423
- 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>"`).
424
- Tell the user the fix is applied and ask: "Ready for finding #<N+1>?".
527
+ - **Queue to fix [Recommended]**:
528
+ Add finding to the session's fix queue.
529
+ Tell the user in 1 line: "✓ Queued for fix. Ready for finding #<N+1>?" and advance immediately.
530
+ Do NOT edit code or leave triage yet — complete triage across all findings first.
425
531
  - **Skip / Dismiss**:
426
532
  If reason is not specified, ask or infer the appropriate category:
427
533
  - `out_of_scope`: Not relevant to this project/flow scope.
@@ -429,17 +535,74 @@ When the user asks to review findings one by one:
429
535
  - `walker_error`: Walker misread the screen or made a navigational error.
430
536
  - `duplicate`: Duplicate of another finding.
431
537
  Execute: `iamu triage <slug> --status dismissed --reason <reason> --note "<why>"`.
432
- Tell the user: "Dismissed as `<reason>` — created guidance rule in `iamu/guidance/<slug>.md` so future walkthroughs will not report this."
538
+ Tell the user in 1 line: "✓ Dismissed as `<reason>` — guidance rule recorded."
433
539
  Then advance to finding #<N+1>.
434
- - **Discuss / Why**:
435
- 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.
436
- - **Next**:
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:
542
+ • **Root Cause:** 1 sentence on why the UI or workflow behaves this way (and source file if known).
543
+ • **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>.
546
+ - **Fix immediately (leave triage now)**:
547
+ If the user explicitly chooses to drop out of triage and fix right now:
548
+ 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>"`.
549
+ Tell the user in 1 line: "✓ Applied fix. Finding #<N> marked addressed."
550
+ - **Next finding (keep open / defer)**:
437
551
  Leave open (or set `triage_status: deferred` with note) and advance to finding #<N+1>.
438
552
 
439
553
  3. **Wrap up after all findings are reviewed**:
554
+ Report the triage recap in 1-2 lines:
555
+ ```text
556
+ Triage Complete: <K> queued for fix, <D> dismissed, <O> kept open/deferred.
557
+ ```
558
+ If `<K> > 0` (findings are queued for fix):
559
+ - Prompt the user to execute the batch:
560
+ - If interactive tool available:
561
+ - Question: "Triage complete. Apply fixes for the <K> queued findings now?"
562
+ - Options:
563
+ 1. "[Recommended] Apply fixes for queued findings in workspace now"
564
+ 2. "Re-run walkthrough to verify dismissed items first"
565
+ 3. "Done for now (keep fixes open in iamu/findings/)"
566
+ - Otherwise (CLI / text-only):
567
+ Apply fixes for the <K> queued findings now?
568
+ 1. [Recommended] Apply fixes for queued findings in workspace now
569
+ 2. Re-run walkthrough to verify dismissed items first
570
+ 3. Done for now (keep fixes open in iamu/findings/)
571
+ Reply '1' to apply fixes [default], or select 2-3:
572
+
573
+ - **Executing the queued fixes:**
574
+ When Option 1 is chosen, apply code edits for each queued finding sequentially in the workspace. Verify the changes once (run test/typecheck suite). Update each finding with `iamu triage <slug> --status addressed --note "<summary of fix>"`.
575
+ Tell the user: "✓ Applied fixes for <K> findings. All marked addressed."
576
+
440
577
  - Run `iamu validate --all`.
441
- - In linked mode, run `iamu sync --json` once so teammates see the triage decisions.
442
- - Suggest re-running the walkthrough: `iamu-run <scenario-slug>` to verify fixes.
578
+
579
+ - **Closed-Loop Regression Verification (1-Click):**
580
+ Immediately prompt the user to verify the fixes hold in practice:
581
+ - If interactive tool available:
582
+ - Question: "Fixes applied and validated. Verify them now with a walkthrough re-run?"
583
+ - Options:
584
+ 1. "[Recommended] Re-run walkthrough to verify fixes hold"
585
+ 2. "Done for now (leave verification for later)"
586
+ - Otherwise (CLI / text-only):
587
+ Verify fixes now?
588
+ 1. [Recommended] Re-run walkthrough to verify fixes hold
589
+ 2. Done for now (leave verification for later)
590
+ Reply '1' to re-run [default], or select 2:
591
+
592
+ When Option 1 is chosen:
593
+ 1. Start the verification run: `iamu start-run <scenario-slug> --target <target> --json`. Note: `start-run` automatically pulls all awaiting findings into `revisit` places in `walkthrough.json`.
594
+ 2. Walk through the scenario, ensuring the persona visits the revisit places.
595
+ 3. Assemble the run with `iamu complete <run-id> --json`. The canonical assembly compares against the baseline run and outputs `verification` (`resolved`, `persists`, `new_findings`).
596
+ 4. Report the verification verdict:
597
+ ```text
598
+ Verification Complete:
599
+ Scenario: <scenario-slug>
600
+ Baseline run: <baseline_run_id>
601
+ Verified fixes: ✓ <N> resolved
602
+ Regressions: 0 new findings
603
+ ```
604
+ 5. If any finding persists or a regression occurred, present only the remaining items for follow-up triage.
605
+ 6. In linked mode, run `iamu sync --json` once so teammates see the verified decisions.
443
606
 
444
607
  #### B. Direct Batch Actions ("fix 1 and 2", "fix all critical")
445
608
  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`.