@iamu-dev/iamu 0.7.0-beta.0 → 0.8.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.
@@ -66,6 +66,7 @@ Work in this order. Do not skip ahead to writing fixes.
66
66
  - Recommendations, quick fixes and direction texts are prose for a product person and a developer reading together. Plain, specific, in the product's own words.
67
67
  - **No file paths or code symbols in the prose.** They go in `builds_on` only. The prose is shown to a later walker who must stay outside the code.
68
68
  - A recommendation says what the person would see and why it meets their need, then how it fits this product.
69
+ - **Titles** of directions and observations: A title is a headline someone scans in a list: what changes for the person (a direction) or what is missing or risky (an observation), in a few words. Aim for about 60 characters; the detail belongs in the fields below it. Meaning comes first: never drop a word that carries it just to be shorter. A clear title of 75 characters beats a cryptic one of 40. Too long: "The equipment picker has no mobile vehicles and its menu captures focus over the free-text field". Better: "Equipment list has no forklifts; open menu blocks free text".
69
70
 
70
71
  ## Answer
71
72
 
@@ -31,7 +31,7 @@ Write `iamu/.runs/<run-id>/canonical.json`:
31
31
  "browser": "chrome-devtools"
32
32
  },
33
33
  "provenance": {
34
- "walker_prompt": { "id": "walkthroughPhilosophy", "version": "2.0.0" },
34
+ "walker_prompt": { "id": "walkthroughPhilosophy", "version": "<the walker prompt version; iamu complete records the current one>" },
35
35
  "model": "unspecified",
36
36
  "started_at": "<created_at from manifest>",
37
37
  "completed_at": "<current ISO timestamp>"
@@ -16,17 +16,26 @@ You review one surface of the product: a page, its states, and the flows that pa
16
16
  - **Name the rule.** When an issue breaks a rule in the design docs, give the rule's name exactly as the doc writes it (its heading, or the bold words that open it) as `rule`, and the entry it is in (from `design.files`) as `file`. When the same name occurs twice in one file, write `Section > Name`.
17
17
  - **When a rule hurts a need, say so.** If following a rule is what fails a visitor (the rule keeps a caveat small and grey, and the person missed it), report a `conflict`: the rule and its file, the rule's text copied exactly from the doc as `before`, better wording as `after`, the evidence, and why. Do not silently break the rule or silently follow it. A person decides.
18
18
  - **Prefer removing, merging and hiding by role to adding.** Every element must earn its place.
19
+ - **Confirm resolved problems.** When a problem in `problems` or an unverified fix in `fix_history` (`state: "awaiting_rerun"`, carrying a `ref` like `F1`, `F2`, ...) is now visibly fixed on the live surface, list it in `resolved` with its `ref` (`"F1"`) and one sentence (`how`) describing what on the live screen resolves the visitor's need. Never list the same ref in both `issues[].evidence` and `resolved`.
19
20
  - **Be specific.** "The approve button and the reject link share one grey; the reject reads as disabled", not "improve hierarchy". Do not manufacture issues: a clean surface is a valid answer.
20
21
 
21
22
  Severity: `critical` (broken, unreachable, unreadable), `major` (a visitor's need is not met, or the surface is clearly inconsistent), `minor` (polish), `nit` (preference).
22
23
 
23
24
  ## Answer
24
25
 
26
+ **Titles.** A title is a headline someone scans in a list: what is wrong and where, in a few words. Aim for about 60 characters; the detail belongs in `what` and `why`. Meaning comes first: never drop a word that carries it just to be shorter. A clear title of 75 characters beats a cryptic one of 40. Too long: "The equipment picker has no mobile vehicles and its menu captures focus over the free-text field". Better: "Equipment list has no forklifts; open menu blocks free text".
27
+
25
28
  Reply with one JSON object and nothing else:
26
29
 
27
30
  ```json
28
31
  {
29
32
  "summary": "What this surface is for, for whom, and how well it serves them (two to four sentences).",
33
+ "resolved": [
34
+ {
35
+ "ref": "F1",
36
+ "how": "What on the live screen now resolves this visitor's need"
37
+ }
38
+ ],
30
39
  "issues": [
31
40
  {
32
41
  "title": "Short title",
@@ -50,6 +50,8 @@ A correct refusal whose reason is on the screen is not `critical`: the product i
50
50
 
51
51
  ## Answer
52
52
 
53
+ **Titles.** A title is a headline someone scans in a list: what is wrong and where, in a few words. Aim for about 60 characters; the detail belongs in `what` and `why`. Meaning comes first: never drop a word that carries it just to be shorter. A clear title of 75 characters beats a cryptic one of 40. Too long: "The equipment picker has no mobile vehicles and its menu captures focus over the free-text field". Better: "Equipment list has no forklifts; open menu blocks free text".
54
+
53
55
  Reply with one JSON object and nothing else:
54
56
 
55
57
  ```json
@@ -192,6 +192,7 @@ The CLI automatically handles sequential numbering, timestamps, screenshot captu
192
192
  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 --need "What I needed at that moment" --description "What happened and why it mattered" --json
193
193
  ```
194
194
 
195
+ - `--title`: A title is a headline someone scans in a list: what goes wrong (or works) and where, in a few words. Aim for about 60 characters; the detail belongs in `--ui-fact`, `--consequence` and `--description`. Meaning comes first: never drop a word that carries it just to be shorter. A clear title of 75 characters beats a cryptic one of 40. Too long: "The equipment picker has no mobile vehicles and its menu captures focus over the free-text field". Better: "Equipment list has no forklifts; open menu blocks free text".
195
196
  - `--type`: `helps | hinders | missing | irrelevant | incorrect`
196
197
  - `--severity`: `critical | major | minor | nit`
197
198
  - `--task-impact`: `blocks | impairs | slows | neutral | accelerates | enables`
@@ -76,12 +76,17 @@ Run `iamu design proposals --json` and decide each open proposal exactly as the
76
76
 
77
77
  ## D. The fix loop
78
78
 
79
- Fix by looking, not by hoping. For one finding:
79
+ Fix by looking, not by hoping:
80
80
 
81
- 1. `iamu fix-brief <finding> --json` (a slug, id, or id prefix). It gives the **before** (page, step and screenshot where the persona hit it), what they **needed**, the full recommendation, the design rules tied to this finding by name with the file and line where each is now (`found: false` when the docs no longer have it), the design docs that apply (`design_files`), what the last design review said about it, the strengths on the same page that must keep working, other open problems there, fixes already tried there, the direction it belongs to, where to save screenshots (`shots_dir`), and the **loop** itself.
82
- 2. Follow `loop` step by step. Save before and after screenshots in `shots_dir` and show their absolute paths when you report.
83
- 3. If the change that meets the need breaks a design rule, stop and report it (the rule, the need, both screenshots) and propose a challenge: never ship either side silently.
84
- 4. If fix-brief says the finding has no known page, take the page from the finding's step and still screenshot it before you edit.
81
+ - **One finding:** `iamu fix-brief <finding> --json` (a slug, id, or `<run-id>#D<n>`).
82
+ - **One surface (all open findings on a page):** `iamu fix-brief /path --json` (e.g. `iamu fix-brief /approvals`).
83
+ - **A multi-scenario wave (all open surfaces in order):** `iamu fix-brief --wave --json`.
84
+
85
+ 1. Run the matching `iamu fix-brief` command. It gives the **before** screenshots, what each visitor **needed**, the design rules tied to the findings with the file and line where each is now (`found: false` when the docs no longer have it), the design docs that apply (`design_files`), what the last design review said, the strengths on the page that must keep working (`protect`), fixes already tried there (`fix_history`, with `verified` patterns that held and `recurred` approaches that failed alongside what the post-fix walk still saw), where to save screenshots (`shots_dir`), and the **loop** itself.
86
+ 2. Check `fix_history` before editing: never repeat a `recurred` approach, and keep the patterns from `verified` fixes intact.
87
+ 3. Follow `loop` step by step. Save before and after screenshots in `shots_dir` and show their absolute paths when you report. When fixing a surface or a wave, use `iamu design review <path> --blind` as the fast designer inner check on the page, and batch persona walkthrough re-runs (`rerun` / `scenarios_to_rerun`) once at the end of the wave.
88
+ 4. If the change that meets the need breaks a design rule, stop and report it (the rule, the need, both screenshots) and propose a challenge: never ship either side silently.
89
+ 5. If fix-brief says a finding has no known page, take the page from the finding's step and still screenshot it before you edit.
85
90
 
86
91
  ## E. Start a design doc from the template
87
92
 
@@ -39,7 +39,7 @@ Follow this precedence cascade:
39
39
 
40
40
  When `iamu/config.json` has `cloud_linked: true` and the `iamu_requests` tool is available, call it once before listing. If it returns `ok: false` (not linked, not authenticated, or `cloud_too_old`), skip this section silently.
41
41
 
42
- If `count > 0`, show the requests first, before the findings tables:
42
+ If `count > 0`, show the requests first, before the findings list:
43
43
 
44
44
  ```
45
45
  Requests from the team (2)
@@ -53,7 +53,7 @@ Ask whether to pick one up. When the user picks a request:
53
53
 
54
54
  1. Call `iamu_requests_claim` with its `id`. If it fails with `lease_held`, say who holds it and when the lease expires, and return to the list.
55
55
  2. Follow `next` from the result:
56
- - `fix` → go to step 4's **Fix now** branch for the finding. The claim payload carries `canonical.findingIds`; open the matching `iamu/findings/*.md` (frontmatter `id`) for the walkthrough context. Use `canonical.uiFact` and `canonical.consequence` as the problem statement.
56
+ - `fix` → go to step 4's **Fix immediately** branch for the finding. The claim payload carries `canonical.findingIds`; open the matching `iamu/findings/*.md` (frontmatter `id`) for the walkthrough context. Use `canonical.uiFact` and `canonical.consequence` as the problem statement.
57
57
  - `verify` or `run` → run `iamu-run <scenario.id>`; offer `scenario.targetUrl` as the target when present.
58
58
  3. Tell the user the request closes itself on the next `iamu sync` — step 6 runs it.
59
59
 
@@ -61,7 +61,7 @@ Ask whether to pick one up. When the user picks a request:
61
61
 
62
62
  ### 2. List mode: present open findings grouped by scenario
63
63
 
64
- Run `iamu findings --open --json`. Each finding carries `slug`, `source` (`persona` or `designer`), `basis` (the designer's: evidence, seen or taste), `design_causes` (how many designer findings explain it), `scenario`, `type`, `severity`, `title`, `where` (page and step), `recommendation` (the advisor's, or null) and `fix_state`. One list, worst first, with both sources: say on every row who found it ("Ana found" / "the designer found (seen)"), never sum their counts into one number, and say "taste" plainly when a designer finding's basis is taste. A designer finding with no `scenario` came from a page review; group it under its page. For how each scenario is doing, run `iamu report --json` and keep the newest row per `scenario`: its `summary.verdict` (label, question, answer) is the scenario's current outcome.
64
+ Run `iamu findings --open --json`. Each finding carries `slug`, `source` (`persona` or `designer`), `basis` (the designer's: evidence, seen or taste), `design_causes` (how many designer findings explain it), `scenario`, `type`, `severity`, `title`, `where` (page and step), `recommendation` (the advisor's, or null) and `fix_state`. One list, worst first, with both sources: every line says who found it (the persona through its block, the designer on the line itself), never sum their counts into one number, and say "taste" plainly when a designer finding's basis is taste. A designer finding with no `scenario` came from a page review; group it under its page. For how each scenario is doing, run `iamu report --json` and keep the newest row per `scenario`: its `summary.verdict` (label, question, answer) is the scenario's current outcome.
65
65
 
66
66
  Filter to `triage_status: open`.
67
67
 
@@ -85,39 +85,33 @@ A run that simply did not come across a finding proves nothing — never call a
85
85
 
86
86
  When open findings span three or more scenarios and there are no open directions, or the user asks what to change first, offer a project synthesis: `iamu advise --project --json`, dispatch a thorough-tier subagent with `iamu/.analysis/advise_prompt.md` as its only context, and record its answer with `iamu advise-record --project --data '<json>'`. It proposes directions across every scenario.
87
87
 
88
- Render it as Markdown, not inside a code fence, so the tables render. Start with a one-line tally, then one block per scenario, scenarios with the worst verdict first:
88
+ Render it as Markdown, not inside a code fence. It is read in a terminal: no tables, one line per finding, so the list can be taken in at a glance. Start with a one-line tally, then one block per scenario, scenarios with the worst verdict first:
89
89
 
90
- **<N> open problems** (<C> critical · <M> major · <m> minor) across <S> scenarios · <K> fixes awaiting a re-run
90
+ **<N> open problems** · <counts by severity, only the ones above zero, e.g. "1 critical · 4 major · 4 minor"> · <S> scenarios · <K> fixes awaiting a re-run
91
91
 
92
92
  ### <persona> · <situation> — **<NO / PARTIAL / YES>**
93
- <the scenario's latest `summary.verdict.answer`, first sentence or two>
93
+ > <the scenario's latest `summary.verdict.answer`, its first sentence>
94
94
 
95
- | # | Finding | Severity | Where | What to do |
96
- |---|---|---|---|---|
97
- | 1 | <title> | **Critical** | <where> | <first sentence of recommendation, or — > |
95
+ 1. **Critical** · <title> · <where>
96
+ 2. **Major** · designer (seen) · <title> · <where>
98
97
 
99
- Number findings continuously across scenarios, so "fix 3" means one finding. Sort each table worst first (critical → major → minor → nit; incorrect, hinders and missing before irrelevant). Leave strengths (`helps`) out of the tables. Keep the "What to do" cell to one sentence: the full recommendation belongs in the finding card (step 3).
98
+ A persona finding's line needs no name: the block's heading names the persona who found it. A designer finding's line says `designer (<basis>)` after the severity, and `designer (taste)` plainly when its basis is taste. Add ` ↳ design cause` to a persona finding the designer explained (`design_causes` above zero). A page-review designer finding with no `scenario` goes in a block headed `### <page> — page review`.
100
99
 
101
- Ask the user how they would like to triage:
100
+ Number findings continuously across scenarios, so "fix 3" means one finding. Sort each block worst first (critical → major → minor → nit; incorrect, hinders and missing before irrelevant). Leave strengths (`helps`) out. No recommendation on the line: it belongs in the finding card (step 3). With more than 7 in a block, show the worst 7 and end it with `+<n> more (<counts by severity>)`.
102
101
 
103
- - **"walk through them"** → iterate through all open findings one-by-one in order with compact card (`[Fix now] [Skip / Dismiss] [Discuss] [Next]`).
104
- - **"all critical"** → iterate through all critical findings in order.
105
- - **Scenario group name** (e.g. "group 1") → iterate through that scenario's findings.
102
+ End with the choices on one line, the recommended one first, and **stop**. Do not use a question tool here, since it covers the list:
103
+
104
+ `Next: **walk through** (one by one from #1) · **critical only** · **<persona> · <situation>** (one scenario) · **fix 3** · **dismiss 3**`
105
+
106
+ Recommend **walk through**; recommend a direction first when one is open (see "Directions before findings"). Then, on the user's word:
107
+
108
+ - **"walk through"** → iterate through all open findings one-by-one in order with compact card (`[Fix now] [Skip / Dismiss] [Discuss] [Next]`).
109
+ - **"critical only"** → iterate through all critical findings in order.
110
+ - **A scenario** (its heading, or "group 1") → iterate through that scenario's findings.
106
111
  - **Single number or slug** → single finding (skip to step 3).
107
- - **"fix 1 and 2"** → make code fixes and mark addressed immediately.
112
+ - **"fix 1 and 2"** → the list shows no recommendations, so never fix from a number alone: show each named finding's card (step 3, without the decision prompt), then one line: `Fix <these N> as shown? Say "yes", or name the ones to leave out.` Only on a yes, fix each as step 4's **Fix immediately** branch does.
108
113
  - **"skip 3" / "dismiss 3"** → dismiss with reason (`out_of_scope`, `not_relevant`, `walker_error`, `duplicate`).
109
114
 
110
- **Interactive Triage Strategy:**
111
- - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
112
- - Question: "How would you like to review these <N> open findings?"
113
- - Options:
114
- 1. "[Recommended] Walk through findings one by one"
115
- 2. "Focus only on Critical findings (<C> items)"
116
- 3. "Review by scenario group: <Top Scenario>"
117
- - Otherwise (in CLI or text-only environments):
118
- How would you like to triage these <N> open findings? I recommend walking through findings one by one.
119
- Proceeding with one-by-one triage. (Say "critical only", specify a scenario group, or enter a finding number/slug).
120
-
121
115
  ### 3. Direct triage: review one finding
122
116
 
123
117
  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).
@@ -204,6 +198,9 @@ triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
204
198
  Once the user provides their rationale:
205
199
  - *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>"`.
206
200
  - *Walker error* (the walker misread the screen): `iamu triage <slug> --status dismissed --reason walker_error --note "<what it misread>" --rule "<rule string>"`.
201
+ - *Project-wide sweep ("we never want X" / "X is a test harness everywhere")*: When the user's intent applies across the entire product (including designer findings or other scenarios), pass `--sweep` (or `--sweep "<keyword>"`):
202
+ `iamu triage [slug] --status dismissed --note "<why>" --rule "Don't report: <X>" --sweep "<keyword>"`.
203
+ This sweeps and dismisses every matching open persona and designer finding across all scenarios and surfaces in one command, and records a project-wide guidance rule that the walker, matcher, judge, designer, and `fix-brief` all respect.
207
204
  - *Duplicate* of another finding: `--reason duplicate --note "Duplicate of <slug>"` (no rule is written).
208
205
 
209
206
  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.
@@ -254,7 +251,7 @@ If `<N> > 0` findings were queued for fix:
254
251
  Proceeding with code edits — say "done" to keep fixes open in iamu/findings/.
255
252
 
256
253
  - **Executing the queued fixes:**
257
- When Option 1 is chosen, fix each queued finding in turn with the fix loop (`iamu fix-brief <slug>`, before and after screenshots of its page, helped / hurt / no visible change) — the fix shown on its card or agreed in Discuss, not the walker's original text. Findings on the same page go together: fix them as one change to that surface. Verify once at the end (run test/typecheck suite). Update each finding with `iamu triage <slug> --status addressed --note "<summary of fix>"`.
254
+ When Option 1 is chosen, findings on the same page go together as one coherent change to that surface (`iamu fix-brief /path --json` for one page, or `iamu fix-brief --wave --json` across multiple pages/scenarios; `iamu fix-brief <slug>` for a single isolated finding). Check `fix_history` first so you never repeat a `recurred` approach, and keep every strength in `protect` intact. Save before and after screenshots in `shots_dir`, use `iamu design review <path> --blind` as a fast inner check when a surface has multiple or structural edits, and do not re-run persona walkthroughs between individual findings. Verify once at the end (run test/typecheck suite). Update each fixed finding with `iamu triage <slug...> --status addressed --note "<summary of fix>"`.
258
255
  Run `iamu validate --all` to verify all entities before reporting done.
259
256
 
260
257
  - **Closed-Loop Regression Verification (1-Click):**
@@ -14,6 +14,8 @@ This skill resolves what scenario to run following a clear **Target Scenario Res
14
14
 
15
15
  **`--no-ux`:** when `$ARGUMENTS` contains `--no-ux`, take it out before resolving the scenario and skip the designer's review (step C3) for this run only: after A, record `iamu designer-record <run-id> --skipped "--no-ux"` so the report says it was skipped. There is no project setting for it: every other run gets a designer's review.
16
16
 
17
+ **`--critic`:** when `$ARGUMENTS` contains `--critic`, take it out before resolving the scenario. This run is one critic pass in a builder ↔ critic loop (a gauntlet loop) the user orchestrates: the builder needs the verdict and the findings fast, not fixes or a design review. Skip the advisor (C2) entirely and skip the designer's review (C3): after A, record `iamu designer-record <run-id> --skipped "critic mode"`. Run A, B, C, D (and E in linked mode) as usual. In step 5, present the glance without the Advisor and Designer lines, and do not offer **directions** or **designer**. Per invocation only, like `--no-ux`. When the loop looks converged (every human test passes, or no open major or critical findings), add one line: `Loop looks converged: run once without --critic for the advisor's and designer's review.`
18
+
17
19
  $ARGUMENTS
18
20
 
19
21
  ## Prerequisites
@@ -249,6 +251,12 @@ iamu browse start --run <run-id>
249
251
 
250
252
  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.
251
253
 
254
+ **Fresh walk in a loop (`--fresh`, `iamu browse` only).** When running iterative passes against a running browser (e.g. with `--critic` or `--fresh`), clear the origin's storage after `browse start` so each walk starts from clean app storage:
255
+
256
+ ```bash
257
+ iamu browse clear-storage --run <run-id>
258
+ ```
259
+
252
260
  **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`):
253
261
 
254
262
  ```bash
@@ -273,7 +281,8 @@ A fresh subagent is NOT blind by default. On most hosts it still loads the proje
273
281
 
274
282
  **Model tiering & subagent dispatch:**
275
283
  - **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.
276
- - **Matcher & Judge:** Broad synthesis and semantic comparison. Use the **thorough** frontier tier (`pro`, `sonnet`, or active model) to prevent severity inflation.
284
+ - **Matcher:** Short-text classification (same problem or not) into strict JSON that `match-record` validates. Use the **fastest** tier (`haiku` in Claude Code, `flash_lite` in Antigravity, else the fast tier).
285
+ - **Judge:** Evaluates the human tests from the walk's recorded steps and findings (`judge_prompt.md`, text-only reading comprehension). Use the **fast** tier (`sonnet` in Claude Code, `flash` in Antigravity).
277
286
 
278
287
  ```
279
288
  # In Claude Code:
@@ -356,7 +365,7 @@ iamu summary <run-id> --worked "What worked 1" --worked "What worked 2" --questi
356
365
 
357
366
  **Post-walk pipeline (MANDATORY — do NOT skip any step):**
358
367
 
359
- 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; the designer's review (C3) starts right after A and runs beside them.
368
+ 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 A, then B and C in parallel, then C2, D and E in order; the designer's review (C3) starts right after A and runs beside them.
360
369
 
361
370
  > **CRITICAL EXECUTION RULE (Zero Host File Tools):**
362
371
  > 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).
@@ -371,13 +380,17 @@ This reads all steps, findings, and entity files, assembles `canonical.json`, ge
371
380
 
372
381
  **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.
373
382
 
383
+ **B and C run in parallel.** The matcher (B) and the judge (C) answer different questions from different inputs, and the judge never reads the matcher's output. Run `iamu match` and `iamu evaluate` one after the other (both are instant), then dispatch both subagents at the same time. Record their answers one after the other as they arrive (`match-record` and `evaluate-record` both rewrite the report; never run them at the same time). Keep them separate: the judge must not see earlier runs' findings, so its verdict cannot drift toward "it was fixed, so it passes".
384
+
385
+ **How to dispatch the matcher and the judge.** Do not paste the prompt into the dispatch; give the absolute path. Their whole prompt is: `Read <absolute path to match_prompt.md / judge_prompt.md> and answer exactly as it says. Everything you need is in that file. Do not open any other file, run any command or search any code. Reply with the JSON only.` Both are pure reading tasks; a subagent that goes looking for context (the repo, the CLI's source, other runs) costs minutes and can see things it must not.
386
+
374
387
  **B. Match findings to earlier runs.** Get the matcher bundle:
375
388
 
376
389
  ```bash
377
390
  iamu match <run-id> --json
378
391
  ```
379
392
 
380
- 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`):
393
+ If `needed` is `false` (no earlier findings for this scenario, or none this run), there is no matcher subagent. 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 **fastest** model tier: `haiku` in Claude Code, `Model="flash_lite"` in Antigravity). Record its JSON answer via `--data` (do NOT create a `matches.json` file yourself; pass the JSON string directly into `--data`):
381
394
 
382
395
  ```bash
383
396
  iamu match-record <run-id> --data '<raw_matches_json>'
@@ -391,7 +404,7 @@ This links recurrences to their earlier canonical finding, marks earlier finding
391
404
  iamu evaluate <run-id> --json
392
405
  ```
393
406
 
394
- 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`):
407
+ Read the evaluation prompt from `iamu/.runs/<run-id>/judge_prompt.md` directly. Dispatch the evaluator as a subagent with that prompt, at the same time as the matcher (use the **fast** model tier: `sonnet` in Claude Code, `Model="flash"` in Antigravity). 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`):
395
408
 
396
409
  ```bash
397
410
  iamu evaluate-record <run-id> --data '<raw_verdicts_json>' --no-prompt --no-push
@@ -399,7 +412,7 @@ iamu evaluate-record <run-id> --data '<raw_verdicts_json>' --no-prompt --no-push
399
412
 
400
413
  This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
401
414
 
402
- **C2. Advise: fixes and directions.** Get the advisor prompt:
415
+ **C2. Advise: fixes and directions.** Skip in `--critic` mode. Otherwise get the advisor prompt:
403
416
 
404
417
  ```bash
405
418
  iamu advise <run-id> --json
@@ -415,7 +428,7 @@ Each entry is checked on its own. Entries that come back rejected (an invented f
415
428
 
416
429
  The judge (C) and the advisor (C2) are independent, so their subagents may run in parallel, but run `evaluate-record` and `advise-record` one after the other: both rewrite finding files. On a host without subagents, run the advise prompt yourself inline and record it the same way.
417
430
 
418
- **C3. Designer's review.** For every run (unless `--no-ux` was given), start it as soon as A is done:
431
+ **C3. Designer's review.** For every run (unless `--no-ux` or `--critic` was given), start it as soon as A is done:
419
432
 
420
433
  ```bash
421
434
  iamu designer <run-id> --json
@@ -459,73 +472,61 @@ The `walker_prompt` from `iamu instructions walk` is the source of truth and con
459
472
  - **Dedup**: Skip findings in the dismissed list or already logged in the current run.
460
473
  - **Graceful degradation**: On judge evaluation failure, set verdicts to pending/null and proceed with report presentation.
461
474
 
462
- ### 5. Present assessment — stay in the conversation
463
-
464
- You MUST output the complete Executive Scorecard to the chat stream FIRST. Build it from `iamu report <scenario-slug> --json`: the first row is this run, and its `summary` holds everything below already assembled (verdict, per-test labels, the since-last-run outcome of each earlier finding, findings with titles, where and recommendations, directions, observations). Do not re-read `canonical.json` or `verdicts.json` yourself. Output rich Markdown, not inside a code fence, so tables render. Write addresses and file paths out in full so a terminal can open them:
465
-
466
- ### <summary.persona> · <summary.situation>
467
- <summary.steps> steps · Cloud: <cloud_url, the full https address> *(not on the cloud: the row's `report_path`, the absolute path to report.md)*
468
-
469
- If `summary.checks` is set, say first what this run was checking, in one line: `Re-checked <fixes> fixes waiting for a re-check: <fixed> confirmed fixed, <cameBack> came back, the rest not confirmed`, plus the directions that landed. Name the ones that came back.
470
-
471
- > **<summary.verdict.question>** **<summary.verdict.label>**
472
- > <summary.verdict.answer>
473
-
474
- If `summary.tests` has more than one test, add one line per test: `**<label>** · <question>`.
475
-
476
- If `summary.since` is set, show what happened to every earlier finding this run re-checked (`summary.since.items`), then one line for the new ones:
475
+ ### 5. Present the result — a glance, then the user decides
477
476
 
478
- **Since the last run** (<date of summary.since.baselineAt>)
477
+ Build it from `iamu report <scenario-slug> --json`: the first row is this run, and its `summary` holds everything already assembled (verdict, per-test labels, the since-last-run outcome of each earlier finding, findings with titles and where, directions, observations). Do not re-read `canonical.json` or `verdicts.json` yourself.
479
478
 
480
- | Earlier finding | Now | Notes |
481
- |---|---|---|
482
- | <title> | **Resolved** / **Persists** / Not seen / Unclear | <item.note, or — > |
479
+ The result is read in a terminal first. Show a **glance** the user can take in without scrolling: about 15 lines, no tables, one line per item, the verdict on top. The depth (the persona's reasoning step by step, the screenshots, every recommendation) lives in the walkthrough report; link it and do not retell it. Output Markdown, not inside a code fence. Write addresses and paths out in full so a terminal can open them.
483
480
 
484
- For a persisting finding, put its qualifiers in brackets: the `shift` ("less severe, major → minor") and "the fix did not hold" when `fixedBefore` is true (it was marked fixed before this run).
481
+ **The glance**, in this order. Leave out every line whose data is empty:
485
482
 
486
- `+ <summary.since.added> new problems this run.` "Not seen" means the walk did not pass that way: never call it fixed.
483
+ ### <summary.persona> · <summary.situation> — **<summary.verdict.label>**
484
+ > <summary.verdict.question> <summary.verdict.answer, its first sentence>
487
485
 
488
- **Findings** (<N> problems, <K> strengths), worst first:
486
+ - `summary.tests` with more than one test: one line, `Tests: **<label>** <question, shortened to a few words> · **<label>** …`.
487
+ - `summary.checks`: `↻ Re-checked <fixes> fixes: <fixed> confirmed fixed, <cameBack> came back (<their titles>)`.
488
+ - `summary.since`: `Since <date of summary.since.baselineAt>: <n> resolved · <n> persist · <n> not seen · +<summary.since.added> new`. Name a persisting finding whose fix did not hold (`fixedBefore`): `(fix did not hold: <title>)`.
489
489
 
490
- | # | Finding | Severity | Where | What to do |
491
- |---|---|---|---|---|
492
- | 1 | <title> | **Major** | <where> | <first sentence or two of recommendation, or — > |
490
+ Then the problems, worst first:
493
491
 
494
- Mark a finding that persists from the last run with `(persists)` after its title. When the designer gave a finding's design cause (a `summary.designer.issues` entry whose `design_cause_of` is that finding's `id`), add it under the row as `↳ Design cause (designer, <basis>): <what>`. Strengths go on one line under the table: `✓ Strengths: <title>; <title>`.
492
+ **<N> problems** · <counts by severity, only the ones above zero, e.g. "1 major · 2 minor">
493
+ 1. **<Severity>** · <title> · <where>
494
+ 2. **<Severity>** · <title> · <where>
495
495
 
496
- If `summary.directions` is non-empty:
496
+ One line per finding, numbered as in step 6, so "fix 2" means one finding. Add ` (persists)` after a title that persists from the last run, ` (unstable)` when the finding's `stability` is `unstable`, and ` ↳ design cause` when the designer gave one (a `summary.designer.issues` entry whose `design_cause_of` is that finding's `id`). No recommendation here: it is in the card. Show at most 7; past that, end with `+<n> more (<counts by severity>)`. With no problems, write `No problems found.` instead: the verdict still stands on its own, a run without findings can still answer NO.
497
497
 
498
- **Directions** (structural changes the advisor proposes)
498
+ An **unstable** finding has come and gone across this scenario's runs without a fix recorded against it: it may be critic noise rather than a product problem. Whoever acts on the findings (the user, or a builder agent in a loop) confirms an unstable finding (re-run, or a person checks the screen) before changing code for it. When any are shown, add one line under the list: `(unstable) = came and went across runs without a fix; confirm before acting.`
499
499
 
500
- | Direction | Size | Absorbs | Re-run to check |
501
- |---|---|---|---|
502
- | <title> | <size> | <absorbs> findings | <verify> scenarios |
500
+ `✓ <K> strengths: <title>; <title>` on one line.
503
501
 
504
- Reach is a prediction until those scenarios run again.
502
+ Then, one short line each, only the ones that apply. These are counts; the detail is behind the words in the last line:
503
+ - Designer (`summary.designer`): `Designer: <n> major or critical · <n> minor · <n> rules broken`, its count apart from the persona's, never one total. Add `judged against general craft` when `judged_against` is `general-craft`, and `written by the orchestrator` when `dispatch` is `inline`.
504
+ - Advisor: `Advisor: <n> directions (absorb <n> findings)`, plus `· <n> notes` for `summary.observations` and `· <n> entries rejected` when the advise record (C2) rejected entries.
505
+ - Design docs: `Design docs: <N> proposed edits — decided after the findings` (`design_proposals` from C2, `proposals` from C3). They wait for a person; never apply them yourself.
506
+ - ⚠ Test setup (`summary.setupNotes`): `⚠ Test setup: <n> doubts about the test, not the product. A finding resting on one may not be real.` Never fold this one away.
507
+ - Sync (E): `⚠ Sync: <n> findings changed by a teammate too` when the result has `conflicts`: name them and give the resolution (`iamu pull --force` to take theirs after copying your edits aside, or `iamu sync --keep-mine` to keep yours). When it has `pending_deletes`: `<n> deletions wait for you: check them, then run iamu sync --confirm-deletes`. Never run either yourself.
508
+ - Design doc offer: only when the designer's result (C3) had `offer_template: true`: `No design doc yet: say "start it" and I'll draft one from your code with you, or "no" and I won't offer again.` On "start it", after triage, follow the `iamu-design` skill, mode E. On "no", run `iamu design template --decline`.
505
509
 
506
- If `summary.designer` is set, add the **Designer's review**: the designer's judgement of these screens, never the persona's experience. Give its count apart from the persona's ("2 designer findings"), never one total.
507
- - One line on what it was judged against: the design docs in `summary.designer.design_files`, or, when `judged_against` is `general-craft`, `Judged against general craft: recording the project's design docs makes this review sharper`, followed by the `hint` command `iamu designer` printed. Say so when `dispatch` is `inline` ("written by the orchestrator, less independent").
508
- - When the designer's result (C3) had `offer_template: true` (no design doc recorded or found, and the offer not declined), add one line: `No design doc yet: I can start one from your code (tokens, components, the roles you test with) and fill in the rest with you. Say "start it", or "no" and I won't offer it again.` On "start it", after triage, follow the `iamu-design` skill, mode E. On "no", run `iamu design template --decline`. Never offer it when the result does not say so.
509
- - The rule breaks (`summary.designer.rules_broken`), one line each: `"<rule>" (<file>) on <screen>, step <n>`, then `<rules_held> rules held`.
510
- - The major and critical designer findings that are not a design cause (`summary.designer.issues` with no `design_cause_of`), one line each: `<id> · designer · <severity> · <basis> · <screen> · <title>`, with `breaks "<rule>"` when it breaks one; then the count of minor and nit ones in one line.
510
+ Then the link to the full walkthrough, which shows the persona's reasoning beside each screenshot:
511
511
 
512
- If `summary.observations` is non-empty, end with **Also worth knowing** (the advisor's notes): one bullet each, `Not walked: <title>` (coverage_gap) or `Feature risk: <title>` (feature_risk).
512
+ `Walkthrough: <the cloud URL from E>`. Not on the cloud: run `iamu open <run-id> --local --print` and give the path it prints (the local HTML report).
513
513
 
514
- If the advise step or the designer proposed design doc edits (`design_proposals` in the advise result, `proposals` in the designer result), add one line: `Design docs: <N> proposed edits — decided after the findings`. They wait for a person; never apply them yourself.
514
+ End with the choices on one line, the recommended one first, and **stop**: the user reads the result before deciding. Do not open Finding #1, and do not use a question tool here, since it covers the glance.
515
515
 
516
- If `summary.setupNotes` is non-empty, add **Test setup** with one bullet each. These are doubts about the test, not the product (missing data, an account that cannot see enough, a date the scenario assumes). Offer the `iamu-stage` skill to fix the setup before the next run; a finding that rests on a setup doubt may not be real.
516
+ `Next: **triage** (one by one from #1) · **fix 2** · **directions** · **designer** · **since** · **setup**`
517
517
 
518
- Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the scorecard scannable: the tables are the summary.
518
+ Name only the words that apply. Recommend **directions** when the advisor proposed any, **setup** when there are setup doubts, else **triage**. With no problems and no major or critical designer findings, offer only the open words (`designer`, `since`), or nothing.
519
519
 
520
- **Zero-Friction Triage Transition (Eliminate Meta-Prompt Gate):**
521
- Do NOT prompt the user with a generic "How would you like to proceed?" multiple-choice modal. That intermediate prompt adds cognitive friction, duplicates the triage options, and obscures the assessment scorecard.
520
+ **Behind the words.** When the user says one, show it, then offer the same Next line again (without the word just used):
522
521
 
523
- - **If `summary.findings` is empty (no problems):**
524
- Output: "No problems found in this run." The verdict above still stands on its own: a run without findings can still answer NO.
525
- Do not enter finding triage for the persona; when the designer's review has major or critical designer findings, triage those (step 6 lists them the same way), then the proposed design doc edits.
522
+ - **triage** / a number: step 6. **fix 2** / "fix 1 and 3": step 6B, which shows the cards and waits for a yes before any edit.
523
+ - **directions**: step 6, "Directions come first".
524
+ - **since**: each item of `summary.since.items` on one line, `<Resolved / Persists / Not seen / Unclear> · <title> · <item.note>`, with a persisting one's `shift` ("less severe, major → minor") and "the fix did not hold" when `fixedBefore`. "Not seen" means the walk did not pass that way: never call it fixed.
525
+ - **designer**: the designer's judgement of these screens, never the persona's experience. One line on what it was judged against (the files in `summary.designer.design_files`, or for `general-craft`: `Judged against general craft: recording the project's design docs makes this review sharper`, and the `hint` command `iamu designer` printed). Then the rule breaks, one line each: `"<rule>" (<file>) on <screen>, step <n>`, then `<rules_held> rules held`. Then the major and critical designer findings that are not a design cause, one line each: `<id> · <severity> · <basis> · <screen> · <title>`, with `breaks "<rule>"` when set; then the count of minor and nit ones.
526
+ - **notes**: the advisor's `summary.observations`, one bullet each, `Not walked: <title>` (coverage_gap) or `Feature risk: <title>` (feature_risk).
527
+ - **setup**: `summary.setupNotes`, one bullet each (missing data, an account that cannot see enough, a date the scenario assumes); offer the `iamu-stage` skill to fix the setup before the next run.
526
528
 
527
- - **If `summary.findings` is not empty:**
528
- Output the Executive Scorecard above to chat FIRST, and advance IMMEDIATELY to triage on **Finding #1 of <total>** (Step 6 below) in the same turn. The user can choose to queue to fix, queue all remaining fixes (batch accept), dismiss, or discuss directly from Finding #1.
529
+ Do NOT output `### What Worked` paragraphs, open-question lists or the recommendations in the glance: the walkthrough report holds them.
529
530
 
530
531
  ### 6. Conversational Triage & Guided Review
531
532
 
@@ -677,12 +678,12 @@ When the user asks to review findings one by one:
677
678
  6. In linked mode, run `iamu sync --json` once so teammates see the verified decisions.
678
679
 
679
680
  #### B. Direct Batch Actions ("fix 1 and 2", "fix all critical")
680
- 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`.
681
+ The glance shows no recommendations, so never fix from a number alone. First show each named finding's card (step 6A format, without the decision prompt), then one line: `Fix <these N> as shown? Say "yes", or name the ones to leave out.` Only on a yes, fix each with the fix loop (`iamu fix-brief <slug> --json` and its `loop`; findings on one page go together as one change; a designer finding from `iamu fix-brief <run-id>#D<n> --json`) and record each with `iamu triage <slug> --status addressed --note "<summary of fix>"`. Then continue as in item 3's "Executing the queued fixes" from `iamu validate --all`.
681
682
 
682
683
  #### C. Ad-hoc Questions & Challenges ("why did Karl do that?", "is #2 really a bug?")
683
684
  Answer directly using persona brief context and step evidence. If the walker got confused or misinterpreted intended behavior, recommend dismissing as `walker_error` or `not_relevant` rather than adding unnecessary code.
684
685
 
685
- **Linked mode: publish triage decisions.** When the user is done fixing and dismissing, run `iamu sync --json` once so teammates see the decisions (and any team request for these findings closes). Report it in one line (`Synced 3 findings to Iamu Cloud.`), with conflicts handled as in item 6. Do not sync after every single edit.
686
+ **Linked mode: publish triage decisions.** When the user is done fixing and dismissing, run `iamu sync --json` once so teammates see the decisions (and any team request for these findings closes). Report it in one line (`Synced 3 findings to Iamu Cloud.`), with conflicts and pending deletions handled as in step 5's Sync line. Do not sync after every single edit.
686
687
 
687
688
  **Do NOT** dump the user at file paths. The report and finding files exist for later reference, but the conversation is the triage surface. Mention artifacts only if the user asks for them or wants to share the report externally. The cloud link is the exception: in linked mode it IS the shareable report, so it always goes in the presentation.
688
689
 
@@ -14,6 +14,11 @@ export interface RunFindingRow {
14
14
  recommendation: string | null;
15
15
  persists: boolean;
16
16
  isNew: boolean;
17
+ /**
18
+ * Spike (fast-critic-loop D6): how the finding behaved across its
19
+ * scenario's runs. `unstable` means confirm before acting on it.
20
+ */
21
+ stability?: "stable" | "unstable" | "first_seen";
17
22
  }
18
23
  export type SinceOutcome = "resolved" | "persists" | "not_seen" | "uncertain";
19
24
  export interface RunView {
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@iamu-dev/iamu",
3
- "version": "0.7.0-beta.0",
3
+ "version": "0.8.0-beta.0",
4
4
  "type": "module",
5
5
  "description": "Test your product as realistic personas — scenario-driven development CLI",
6
- "license": "UNLICENSED",
6
+ "license": "MIT",
7
7
  "author": "Iamu <hello@iamu.dev>",
8
8
  "homepage": "https://iamu.dev",
9
9
  "repository": {
@@ -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-dev/protocol": "0.1.0",
63
- "@iamu/tsconfig": "0.1.0"
62
+ "@iamu/tsconfig": "0.1.0",
63
+ "@iamu-dev/protocol": "0.1.0"
64
64
  },
65
65
  "scripts": {
66
66
  "build": "tsup && tsc -b --force tsconfig.build.json --emitDeclarationOnly && node scripts/copy-assets.mjs",