@iamu-dev/iamu 0.8.0-beta.2 → 0.8.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -5
- package/dist/adapters/registry.d.ts +6 -0
- package/dist/adapters/types.d.ts +22 -5
- package/dist/bin.js +7267 -4650
- package/dist/build-hash.txt +1 -0
- package/dist/commands/advise.d.ts +13 -1
- package/dist/commands/browse-driver.d.ts +14 -0
- package/dist/commands/browse.d.ts +70 -6
- package/dist/commands/complete.d.ts +37 -2
- package/dist/commands/context.d.ts +16 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/explore-crawl.d.ts +5 -2
- package/dist/commands/init.d.ts +8 -2
- package/dist/commands/instructions.d.ts +0 -15
- package/dist/commands/match.d.ts +6 -0
- package/dist/commands/mcp-config.d.ts +84 -6
- package/dist/commands/new-entity.d.ts +28 -0
- package/dist/commands/post-walk.d.ts +21 -0
- package/dist/commands/pull.d.ts +1 -0
- package/dist/commands/set-entity.d.ts +2 -0
- package/dist/commands/skills.d.ts +13 -4
- package/dist/commands/step-numbering.d.ts +2 -1
- package/dist/commands/step.d.ts +2 -0
- package/dist/commands/triage.d.ts +4 -2
- package/dist/index.js +7254 -4639
- package/dist/templates/prompts/advise.md +8 -61
- package/dist/templates/prompts/design-review.md +1 -1
- package/dist/templates/prompts/designer.md +11 -4
- package/dist/templates/prompts/walk.md +6 -0
- package/dist/templates/skills/iamu-design.md +1 -1
- package/dist/templates/skills/iamu-findings.md +13 -24
- package/dist/templates/skills/iamu-new.md +14 -4
- package/dist/templates/skills/iamu-run.md +68 -33
- package/dist/templates/skills/iamu-setup.md +7 -1
- package/dist/templates/skills/iamu-stage.md +4 -4
- package/dist/ui/html-report.d.ts +5 -0
- package/package.json +3 -3
|
@@ -4,6 +4,12 @@ You are the advisor. A walker has used the product as a specific person in a spe
|
|
|
4
4
|
|
|
5
5
|
Unlike the walker, you may read the project's code (read-only) and look at the screenshots. You do not drive the product.
|
|
6
6
|
|
|
7
|
+
**Read budget (run mode):**
|
|
8
|
+
- Open only the step screenshots linked in `findings[].steps`.
|
|
9
|
+
- Open **at most 3–5 source files** directly responsible for the screens where `F<n>` occurred (find them in `panorama.source_files`, which lists the walked app first, or by searching for the literal `ui_fact` text). **Do not crawl unrelated screens.**
|
|
10
|
+
- In step 13, compare `walked_paths` with `panorama.code_routes` and `panorama.source_files`; do not crawl the repository to discover routes.
|
|
11
|
+
- `panorama.code_index: { partial: true }` means the scan of the code was cut short by its time budget: those lists are incomplete, so a route missing from them is not evidence that it does not exist or was never walked.
|
|
12
|
+
|
|
7
13
|
You decide with the same product principles the walker observes with. They follow this method under "Product principles". Apply them at every step, not as a checklist at the end.
|
|
8
14
|
|
|
9
15
|
## How to work
|
|
@@ -53,7 +59,7 @@ Work in this order. Do not skip ahead to writing fixes.
|
|
|
53
59
|
- which scenarios must be re-run to check it actually helped (`verify`, including this one).
|
|
54
60
|
These are predictions, not observations. Give a reason for each. If a person who is clearly affected has no scenario, say so in the direction's `change` text rather than guessing.
|
|
55
61
|
|
|
56
|
-
13. **Look at what nobody walked.** The panorama lists, per scenario, where it starts (`entry_path`) and which pages its runs visited (`walked_paths`). Compare
|
|
62
|
+
13. **Look at what nobody walked.** The panorama lists, per scenario, where it starts (`entry_path`) and which pages its runs visited (`walked_paths`, empty for a scenario never walked), alongside the routes (`panorama.code_routes`) and source files (`panorama.source_files`) pre-extracted from the code, the walked app first. Compare `walked_paths` with them (do not crawl the codebase to discover routes). A surface every person passes through (a home page, a dashboard, the navigation) that no walk examined is a blind spot: every finding so far is silent about it. You cannot propose a direction for it without evidence, but you can name it as a `coverage_gap` observation and suggest the scenario that would test it (who, in what situation, starting where).
|
|
57
63
|
|
|
58
64
|
14. **Question a feature's premise when it carries real risk.** Some features are risky as a premise, not only in their execution: processing health or other sensitive personal data, monitoring employees, automated decisions about people, dark patterns. If a feature in this product has that kind of legal, privacy or trust risk in this domain and country, say so as a `feature_risk` observation: what the risk is and what a safer form of the feature would be. Do not drop the feature from your advice on your own.
|
|
59
65
|
|
|
@@ -70,66 +76,7 @@ Work in this order. Do not skip ahead to writing fixes.
|
|
|
70
76
|
|
|
71
77
|
## Answer
|
|
72
78
|
|
|
73
|
-
Reply with one JSON object and nothing else.
|
|
74
|
-
|
|
75
|
-
For a run:
|
|
76
|
-
|
|
77
|
-
```json
|
|
78
|
-
{
|
|
79
|
-
"groups": [{ "id": "g1", "root_cause": "…" }],
|
|
80
|
-
"advice": [
|
|
81
|
-
{
|
|
82
|
-
"finding_id": "<ref from the bundle, e.g. F3>",
|
|
83
|
-
"scope": "local | systemic",
|
|
84
|
-
"recommendation": "…",
|
|
85
|
-
"quick_fix": "… or null",
|
|
86
|
-
"builds_on": [{ "path": "relative/path/from/project/root", "symbol": "text that occurs in that file" }],
|
|
87
|
-
"group": "g1 or null",
|
|
88
|
-
"direction": "<direction slug> or null",
|
|
89
|
-
"heuristic": "the UX principle at stake (e.g. recognition_over_recall) or null",
|
|
90
|
-
"check": {
|
|
91
|
-
"verdict": "confirmed | overstated | understated | setup",
|
|
92
|
-
"severity": "for overstated or understated: the severity it deserves, else null",
|
|
93
|
-
"why": "What the code or a screenshot shows, citing the step"
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
],
|
|
97
|
-
"directions": [
|
|
98
|
-
{
|
|
99
|
-
"slug": "kebab-case-name",
|
|
100
|
-
"title": "Short imperative title",
|
|
101
|
-
"problem": "The shared cause, in product terms",
|
|
102
|
-
"change": "What the person would experience instead",
|
|
103
|
-
"leading_practice": "How leading systems in this domain handle it, scaled to this product",
|
|
104
|
-
"size": "small | medium | large",
|
|
105
|
-
"absorbs": ["<ref, e.g. F3>", "<ref, e.g. F12>"],
|
|
106
|
-
"reach": [{ "scenario": "<scenario slug>", "effect": "helps | risk", "reason": "…" }],
|
|
107
|
-
"verify": ["<scenario slug>"],
|
|
108
|
-
"builds_on": [{ "path": "…", "symbol": "…" }]
|
|
109
|
-
}
|
|
110
|
-
],
|
|
111
|
-
"observations": [
|
|
112
|
-
{
|
|
113
|
-
"kind": "coverage_gap | feature_risk",
|
|
114
|
-
"title": "Short title",
|
|
115
|
-
"detail": "What is missing or risky, and why it matters here",
|
|
116
|
-
"suggested_scenario": "Who, in what situation, starting where (coverage gaps) or null"
|
|
117
|
-
}
|
|
118
|
-
],
|
|
119
|
-
"design_proposals": [
|
|
120
|
-
{
|
|
121
|
-
"slug": "kebab-case",
|
|
122
|
-
"kind": "challenge | new",
|
|
123
|
-
"file": "The design file it changes (from design.files)",
|
|
124
|
-
"rule": "For challenge: the rule's name as the doc writes it; else null",
|
|
125
|
-
"before": "Text copied exactly from the doc: the rule's text (challenge) or the passage the addition follows (new)",
|
|
126
|
-
"after": "The better wording (challenge), or that passage followed by the addition (new)",
|
|
127
|
-
"why": "What the evidence shows",
|
|
128
|
-
"evidence": ["<ref, e.g. F3 or S2>"]
|
|
129
|
-
}
|
|
130
|
-
]
|
|
131
|
-
}
|
|
132
|
-
```
|
|
79
|
+
Reply with one JSON object and nothing else. Its exact shape, for this bundle's mode, is under "Output JSON schema (strict)" at the very end of this prompt, after the bundle. For a run it carries `groups`, `advice`, `directions`, `observations` and `design_proposals`.
|
|
133
80
|
|
|
134
81
|
An observation earns its place only by meeting step 13 (a surface every person passes through that no walk examined) or step 14 (a feature whose premise carries real legal, privacy or trust risk here). Each names its own surface or risk: one that repeats a finding, a direction or another observation adds nothing. Raise every one that meets the bar and none that does not. `observations` never absorb findings and are never treated as evidence.
|
|
135
82
|
|
|
@@ -13,7 +13,7 @@ You review one surface of the product: a page, its states, and the flows that pa
|
|
|
13
13
|
|
|
14
14
|
- **Several people, one surface.** When visitors need different things here (one wants a firm answer, another a fast decision), say who should see what. Role clarity often beats explaining more to everyone.
|
|
15
15
|
- **Evidence, seen or taste, always labelled.** `evidence`: a visitor's walk shows it; cite the refs (`F3`). `seen`: you saw or measured it yourself in the browser (a clipped control, a 3.1:1 contrast); give the screenshot path. `taste`: your judgement against the rules or general craft. All are welcome; never pass one off as another.
|
|
16
|
-
- **Name the rule.** When an issue breaks a rule in the design docs, give the rule's name
|
|
16
|
+
- **Name the rule.** When an issue breaks a rule in the design docs, give the rule's canonical name from that file's `rules` array in `design.files` (or, if none is listed, 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
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`.
|
|
@@ -16,10 +16,12 @@ The person already judged what it was like: whether the product fits their role,
|
|
|
16
16
|
- `findings`: what the person filed on this run, as refs: `F<n>` for problems, `S<n>` for what helped, each with its `step`. A finding's `severity` is the one the person filed.
|
|
17
17
|
- `walker_summary`: what worked for them, what they still wondered, and how the walk ended.
|
|
18
18
|
- `screens`: the run's screens in walk order. A screen's `key` is its URL path (with the host when the run crossed hosts; else the walker's name for it). A screen visited twice has two `visits`. Screenshot paths are relative to `run_dir`. Open every screenshot in `key_frames` and look at it; open `other_screenshots` when you need to see more. `steps` carry what the person did and thought at each step.
|
|
19
|
-
- `design.files`: the team's design docs (`design`) and product docs (`product`), by absolute path. A file with a `heading` means that section only. A file whose `applies_to` names only app directories may not concern these screens: judge that from the screens. `design.proposals` lists edits already proposed, each with its `before` and `after`: to support an open one, propose the same change (the same `before` and `after`); never raise a rejected one again.
|
|
19
|
+
- `design.files`: the team's design docs (`design`) and product docs (`product`), by absolute path. A file with a `heading` means that section only. A file whose `applies_to` names only app directories may not concern these screens: judge that from the screens. Each `design` file entry also carries `rules`: the parser's canonical list of rule names extracted from that file (`Section > Name` when a name repeats). `design.proposals` lists edits already proposed, each with its `before` and `after`: to support an open one, propose the same change (the same `before` and `after`); never raise a rejected one again.
|
|
20
|
+
- `facts`: computed from the team's code and docs, not taste; `null` when nothing is off. `facts.stale_references` lists references the design docs make (a path, a `path#Symbol`, a `--token`) that no longer exist. `facts.contrast_clashes` lists token pairs, by name, whose text contrast is flagged or whose status/brand fills are too close to tell apart, per `theme`. Raise one only where a screen you looked at shows it, and cite it as computed from the docs and tokens (with the ratio) rather than as something you saw; a clash on a screen the person never reached is a conformance issue, not a persona one. Never treat a missing `facts` as proof that the docs are current.
|
|
20
21
|
- `judged_against`: `design-docs` when the team's design docs apply to this run, else `general-craft`.
|
|
21
22
|
- `ignored`: issues a person has read and dismissed (one with no `screen` was about the whole run). Do not raise them again unless they got worse; if one did, say how.
|
|
22
|
-
- `
|
|
23
|
+
- `guidance`: the team's active guidance rules and settled constraints (`iamu/guidance/`), including test-locked copy or styling and domain conventions. Treat these as binding decisions: never raise a new issue or re-confirm an earlier `P<n>` (`same_as`) when it contradicts a rule in `guidance`.
|
|
24
|
+
- `open_findings`: your earlier issues on these screens that are still being worked on, as refs `P<n>`. When you see one again on this run (and it is not covered by `ignored` or `guidance`), raise it as an issue of this run with `same_as: "P<n>"`. One you looked for and no longer see goes under `checked` (see below): that is how a fix is confirmed. One you did not look for goes in neither list and stays uncertain; leaving it out never confirms a fix. In the summary, say which still show and which are gone.
|
|
23
25
|
- `setup_notes`: about the test setup (accounts, seeded data), not the product. Never judge the product by them.
|
|
24
26
|
|
|
25
27
|
## What you open
|
|
@@ -30,7 +32,7 @@ Open only the screenshots the bundle lists and the files `design.files` lists. N
|
|
|
30
32
|
|
|
31
33
|
1. **Read the design docs first** (every file in `design.files`), then the persona and the situation.
|
|
32
34
|
2. **Go screen by screen, in walk order.** For each screen, say what it is for this person at this moment, and what on it serves them.
|
|
33
|
-
3. **With design docs** (`design-docs`): apply the rules that concern each screen. Cite each rule by its exact
|
|
35
|
+
3. **With design docs** (`design-docs`): apply the rules that concern each screen. Cite each rule by its exact canonical string from that file's `rules` array in `design.files` (or, if none is listed, its heading or the bold words that open it, without a closing full stop or colon) and the `entry` it is in (from `design.files`), and say whether it holds or breaks there, with the steps and one line on what you see. When the same name occurs twice in one file, write `Section > Name`. **Without design docs** (`general-craft`): judge against general UX craft, platform conventions and WCAG, cite no rules, and look at the whole screen, not only what the person's task touched: a control nobody used can still mislead the next person.
|
|
34
36
|
4. **Judge the craft the person could not see:** consistency across the screens, contrast and accessibility (estimated from the screenshot: say so), copy and formats, interaction and states (what is shown after an action, while loading, when empty, when it fails), and hierarchy and density where they explain a finding or concern what the walk passed by.
|
|
35
37
|
5. **Label every claim.** `evidence`: a finding shows it; cite its refs. `seen`: you see it in a screenshot; cite the steps. `taste`: your judgement against the docs or general craft. All are welcome; never pass one off as another.
|
|
36
38
|
6. **Never restate a finding, except as its design cause.** Before you write an issue, check the findings: if it is about the same problem on the same screen as an `F<n>`, in any words, it is not a new issue. Either give its design cause, citing that `F<n>` in `evidence` and its `step` in `steps` (that is what links your issue to the finding as its cause), or leave it out. Role fit, overload and "this is not for me" are the person's findings; raise them only as such a cause.
|
|
@@ -89,6 +91,9 @@ Reply with one JSON object and nothing else:
|
|
|
89
91
|
"same_as": "P<n> when it is an earlier issue seen again, else null"
|
|
90
92
|
}
|
|
91
93
|
],
|
|
94
|
+
"checked": [
|
|
95
|
+
{ "ref": "P<n>", "screen": "<that finding's screen>", "steps": [<n>], "note": "One line: what you saw instead" }
|
|
96
|
+
],
|
|
92
97
|
"conflicts": [
|
|
93
98
|
{ "rule": "The rule's name", "file": "The entry it is in", "before": "The rule's text, copied exactly", "after": "Better wording", "why": "How following it failed the person", "evidence": ["F<n>"] }
|
|
94
99
|
],
|
|
@@ -98,4 +103,6 @@ Reply with one JSON object and nothing else:
|
|
|
98
103
|
}
|
|
99
104
|
```
|
|
100
105
|
|
|
101
|
-
`screen` is a screen's `key` from the bundle, and `steps` are step numbers from it.
|
|
106
|
+
`screen` is a screen's `key` from the bundle, and `steps` are step numbers from it.
|
|
107
|
+
|
|
108
|
+
**checked** (optional): for an earlier designer finding listed under `P<n>` whose screen you actually judged in this run, and which you looked for and no longer see, add `{ "ref": "P<n>", "screen": "<that finding's screen>", "steps": [<the step numbers where you looked>], "note": "<one line: what you saw instead>" }`. List a `P<n>` only when its screen is one of the screens in this bundle and you looked at it at the steps you name. A finding you see again is answered with `same_as` on your issue instead. One you did not look for goes in neither list: it stays uncertain. Never list a check for a screen you did not judge, or without steps. With `general-craft`, leave `rules`, `conflicts` and `design_proposals` empty and every `breaks` null.
|
|
@@ -147,6 +147,12 @@ When an environment is unseeded or test records are missing:
|
|
|
147
147
|
- If your persona role is a creator (e.g. employee or consultant creating an item), click the creation CTA (e.g. "+ Ny reseräkning", "+ New") and proceed with your task.
|
|
148
148
|
- If your persona role is read-only (e.g. an auditor or manager) and cannot create data, do NOT record false "missing data" bugs against the product. Conclude the walk noting that the environment lacks the required preconditions.
|
|
149
149
|
|
|
150
|
+
## Host product vs. subject payload (Seeded defects & inspected content)
|
|
151
|
+
|
|
152
|
+
Many products display, inspect, or triage a **subject** — an embedded preview or screenshot of another app, a customer submission, a failing test run, a security alert, an audit log, or a document with errors.
|
|
153
|
+
- **Separate the host UI from the subject payload:** When your persona's job is to review, flag, or act on defects inside an inspected subject (e.g. spotting a squeezed sidebar or wrong notice inside a previewed app screenshot, or triaging a failing check), those defects belong to the **subject** you are inspecting — they are NOT bugs in the **host product** you are using.
|
|
154
|
+
- **Evaluate the host product's tools:** Act on the seeded subject defects using the host product's workflow as the persona would. Only file an `iamu` finding (`hinders`, `missing`, `incorrect`) if the **host product** makes it hard, confusing, or impossible to see, flag, or resolve the subject's defects.
|
|
155
|
+
|
|
150
156
|
## Semantic squinting (Adapting to environmental mismatch)
|
|
151
157
|
|
|
152
158
|
Your prompt may include an approximation strategy (e.g. "If Malmö is missing, choose Göteborg").
|
|
@@ -59,7 +59,7 @@ A project set up with an earlier version keeps its rules in `iamu/design.md`, wi
|
|
|
59
59
|
A surface is a page with its states and the flows through it. Review a surface, not a single finding: a page that collected eight separate fixes needs to be seen whole.
|
|
60
60
|
|
|
61
61
|
1. Run `iamu design review <target> --json`. The target is a path (`/request`), a finding (its page), or a direction slug (the pages its findings are on). It writes a prompt with the surface's dossier: who passes through and what they said there, open problems with each person's need, strengths, fixes already tried and whether they held, what was dismissed, and the design docs that apply to the page. If it returns `warnings` (an installed prompt that differs from the shipped one), show them.
|
|
62
|
-
2. Tell the user in a line or two what the reviewer looks at, from the result: the surface and its `paths`, how many visitors, open problems and strengths it weighs, and whether there are design docs to judge against. Then dispatch a subagent (thorough tier) **with browser access** and the prompt file (`prompt_file_abs`) as its only context. It opens
|
|
62
|
+
2. Tell the user in a line or two what the reviewer looks at, from the result: the surface and its `paths`, how many visitors, open problems and strengths it weighs, and whether there are design docs to judge against. Then dispatch a subagent (thorough tier) **with browser access** and the prompt file (`prompt_file_abs`) as its only context. It opens the product's target URL (named in the prompt's dossier) + the path, signs in as the testability notes say, opens menus and states, compares with the walks' screenshots, and answers with JSON. Run it in the foreground where your host allows, so its progress shows. If it runs in the background, say what it is doing while you wait, and do not end your turn with only a wait notice.
|
|
63
63
|
3. Write the answer to `answer_file_abs` (from the review result) and record it: `iamu design review-record <target> --file <answer_file_abs>`. Show anything it reports as `rejected` or in `warnings` (a dropped proposal, a rule not found): never let it disappear silently.
|
|
64
64
|
4. Present, in this order:
|
|
65
65
|
- the summary (what the surface is for, for whom, how well it serves them);
|
|
@@ -184,28 +184,20 @@ triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
|
|
|
184
184
|
|
|
185
185
|
- **Design change needed** → the change requires design thinking (restructuring a flow, new capability, API contract touch, multiple files). Do NOT fix inline. Use the project's own change process if it has one — check the agent docs and the repo for it (an `openspec/` directory and its change skills, an ADR or RFC folder, an issue tracker the docs name) and start the change there with the finding's persona + scenario context pre-filled. Only if the project has none, draft a short design doc. Then leave the finding `open` until the change ships. Attach the change reference in `triage_note`: `"Design change: <reference>. Re-triage when the change ships."`.
|
|
186
186
|
|
|
187
|
-
- **
|
|
187
|
+
- **Dismiss (`not_relevant` / `walker_error` / `out_of_scope` / `duplicate`)** → the finding is not a problem to fix:
|
|
188
|
+
- Quick 1-step dismiss (defaults to `not_relevant` and writes `"Don't report: <title>"`): `iamu triage <slug> --status dismissed`.
|
|
189
|
+
- With custom rationale or rule:
|
|
190
|
+
- *Not relevant* (by design): `iamu triage <slug> --status dismissed --reason not_relevant [--note "<why>"] [--rule "<rule string>"]`.
|
|
191
|
+
- *Walker error* (the walker misread the screen): `iamu triage <slug> --status dismissed --reason walker_error [--note "<what it misread>"] [--rule "<rule string>"]`.
|
|
192
|
+
- *Out of scope* (handled outside the system): `iamu triage <slug> --status dismissed --reason out_of_scope [--note "<how it is handled>"] [--rule "<rule string>"]`.
|
|
193
|
+
- *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>"`):
|
|
194
|
+
`iamu triage [slug] --status dismissed [--note "<why>"] --rule "Don't report: <X>" --sweep "<keyword>"`.
|
|
195
|
+
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, the matcher, the judge (`evaluate`) and `fix-brief` respect. The designer never reads tester guidance: a swept designer finding is dismissed, and later designer's reviews are told not to raise it again.
|
|
196
|
+
- *Duplicate* of another finding: `iamu triage <slug> --status dismissed --duplicate-of <other-slug> [--note "<note>"]` (no rule is written).
|
|
188
197
|
|
|
189
|
-
|
|
198
|
+
`not_relevant`, `walker_error`, and `out_of_scope` 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, or `--no-guidance` to skip writing a rule. 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>'."**
|
|
190
199
|
|
|
191
|
-
- **
|
|
192
|
-
> "To teach future walkthroughs what not to report, why should this be dismissed?
|
|
193
|
-
> • **By design / intended behavior:** (Why this pattern is expected)
|
|
194
|
-
> • **Walker error:** (What the walker misread or did wrong)
|
|
195
|
-
> • **Out of scope:** (Non-issue for this product/flow)
|
|
196
|
-
> What specific rule should future walkers follow?"
|
|
197
|
-
|
|
198
|
-
Once the user provides their rationale:
|
|
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>"`.
|
|
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, the matcher, the judge (`evaluate`) and `fix-brief` respect. The designer never reads tester guidance: a swept designer finding is dismissed, and later designer's reviews are told not to raise it again.
|
|
204
|
-
- *Duplicate* of another finding: `--reason duplicate --note "Duplicate of <slug>"` (no rule is written).
|
|
205
|
-
|
|
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.
|
|
207
|
-
|
|
208
|
-
- **Keep (no decision yet)** → rare. Use only when the reviewer genuinely needs more information. Leave `triage_status: open` and add a `triage_note` noting what you are waiting for: `"Waiting on <thing> before triage."`.
|
|
200
|
+
- **Keep open (no decision yet)** → leave `triage_status: open` and optionally attach a `triage_note`: `iamu triage <slug> --status open --note "Waiting on <thing> before triage."`.
|
|
209
201
|
|
|
210
202
|
Report back with the action taken:
|
|
211
203
|
|
|
@@ -213,11 +205,8 @@ Report back with the action taken:
|
|
|
213
205
|
addressed (fix now): <finding-slug>
|
|
214
206
|
Change: made handoff notes optional on /sv/handoff
|
|
215
207
|
|
|
216
|
-
deferred: <finding-slug>
|
|
217
|
-
Note: revisit after Q3 mobile release
|
|
218
|
-
|
|
219
208
|
dismissed (duplicate): <finding-slug>
|
|
220
|
-
|
|
209
|
+
Duplicate of: frontline-worker--incident-report-overwhelm-a7b2c1
|
|
221
210
|
|
|
222
211
|
dismissed (not_relevant): <finding-slug>
|
|
223
212
|
Reason: the beta badge is intentional until launch
|
|
@@ -42,9 +42,14 @@ Determine the mode based on `$ARGUMENTS` and user intent:
|
|
|
42
42
|
1. Ground in `iamu/context.yml` actors, domain, and jurisdiction.
|
|
43
43
|
2. Define role, disposition, key biases, friction triggers, and domain vocabulary.
|
|
44
44
|
3. Propose the persona candidate to the user (name, role, disposition, expectations).
|
|
45
|
-
4. Once confirmed, scaffold the persona into `iamu/personas/` with its background narrative and `## Today` section passed via `--body` (or update later with `iamu set persona <slug> --body
|
|
45
|
+
4. Once confirmed, scaffold the persona into `iamu/personas/` with its background narrative and `## Today` section passed via `--body-file` (or update later with `iamu set persona <slug> --body-file <path>`; `-` reads stdin). Never put `\n` inside `--body`, it is stored literally:
|
|
46
46
|
```bash
|
|
47
|
-
iamu new persona --name "<Name>" --role "<Role>" --disposition "<Disposition>" --body
|
|
47
|
+
iamu new persona --name "<Name>" --role "<Role>" --disposition "<Disposition>" --body-file - --json <<'EOF'
|
|
48
|
+
<Background narrative and test expectations>
|
|
49
|
+
|
|
50
|
+
## Today
|
|
51
|
+
<How this person does the job today without the product>
|
|
52
|
+
EOF
|
|
48
53
|
```
|
|
49
54
|
5. Ensure the persona's markdown body includes their background narrative and test expectations, ending with a `## Today` section: how this person does the job the product is for today, without it (a paper sheet, a spreadsheet, phone calls, a colleague, another tool), and what that costs or gives them. The walker holds the product against it and the judge weighs voluntary use against it.
|
|
50
55
|
6. Run `iamu validate --all`.
|
|
@@ -239,9 +244,14 @@ The `--capability`, `--additional-capabilities`, `--tension`, `--narrative`, and
|
|
|
239
244
|
|
|
240
245
|
**3. Persona** (if user picked a new persona to scaffold):
|
|
241
246
|
```bash
|
|
242
|
-
iamu new persona --name "Maria Gomez" --role "Site Safety Coordinator" --disposition "Time-pressured, prefers physical paper over complex forms" --body
|
|
247
|
+
iamu new persona --name "Maria Gomez" --role "Site Safety Coordinator" --disposition "Time-pressured, prefers physical paper over complex forms" --body-file - --json <<'EOF'
|
|
248
|
+
<Persona background narrative and test expectations>
|
|
249
|
+
|
|
250
|
+
## Today
|
|
251
|
+
<How this person does the job today without the product>
|
|
252
|
+
EOF
|
|
243
253
|
```
|
|
244
|
-
The `--role`, `--disposition`, and `--body` flags populate frontmatter and the markdown body directly (or you can update the body via `iamu set persona <slug> --body
|
|
254
|
+
The `--role`, `--disposition`, and `--body-file` flags populate frontmatter and the markdown body directly (or you can update the body via `iamu set persona <slug> --body-file <path>`; `-` reads stdin). Never put `\n` inside `--body`: it is stored literally. Leave `access` out — which product account the persona uses is decided when the scenario is staged in `iamu-run`. End the body with a `## Today` section: how this person does the job the product is for today, without it (a paper sheet, a spreadsheet, phone calls, a colleague, another tool), and what that costs or gives them. The walker holds the product against it and the judge weighs voluntary use against it.
|
|
245
255
|
|
|
246
256
|
**4. Scenario** (the binding):
|
|
247
257
|
```bash
|
|
@@ -14,9 +14,9 @@ This skill resolves what scenario to run following a clear **Target Scenario Res
|
|
|
14
14
|
|
|
15
15
|
**`--target <url>` (or a bare `http(s)://...` URL in `$ARGUMENTS`):** when `$ARGUMENTS` contains `--target <url>` or a URL, take it out before resolving the scenario and persist it immediately with `iamu set testability --target <url>` (and if the resolved scenario had its own `target_url` override that was shadowing the project target, clear it with `iamu set scenario <slug> --no-target` unless the user asked for a scenario-only URL).
|
|
16
16
|
|
|
17
|
-
**`--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
|
|
17
|
+
**`--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. Pass `--no-ux` to `iamu post-walk`, which records the skip itself (reason `--no-ux`). Only on the manual path (no `post-walk`), run `iamu designer-record <run-id> --skipped "--no-ux"` after A. Never both: a second record is refused. Either way the report says it was skipped. There is no project setting for it: every other run gets a designer's review.
|
|
18
18
|
|
|
19
|
-
**`--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):
|
|
19
|
+
**`--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): pass `--critic` to `iamu post-walk`, which records the skip itself (reason `--critic`); only on the manual path, run `iamu designer-record <run-id> --skipped "--critic"` after A. Never both. 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.`
|
|
20
20
|
|
|
21
21
|
**`--fresh`:** when `$ARGUMENTS` contains `--fresh`, take it out before resolving the scenario. Clear the app's storage after `iamu browse start` (step 4) so the walk starts from clean storage, not from what an earlier walk left behind. `iamu browse` only; per invocation, like `--no-ux`.
|
|
22
22
|
|
|
@@ -236,7 +236,7 @@ Never silently guess login credentials or auth strategy without confirming with
|
|
|
236
236
|
|
|
237
237
|
**Interactive Auth Handshake (for `interactive`, enterprise auth, SSO, 2FA, BankID):**
|
|
238
238
|
If `auth_strategy` is `interactive` or the product is behind enterprise login where automated dev persona switching is not configured:
|
|
239
|
-
1. Open the browser to the target URL (`iamu browse start --run <run-id>`
|
|
239
|
+
1. Open the browser to the target URL (`iamu browse start` or browser tool). There is no run id yet; step 4 creates the run, and `iamu browse start --run <run-id>` there sizes the already open browser for the persona.
|
|
240
240
|
2. Prompt the human user:
|
|
241
241
|
> 👉 **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...
|
|
242
242
|
3. Wait for the user to confirm, then let the walker drive the authenticated session.
|
|
@@ -269,7 +269,7 @@ Use the returned `run_id` and `path` for all subsequent operations.
|
|
|
269
269
|
iamu browse start --run <run-id>
|
|
270
270
|
```
|
|
271
271
|
|
|
272
|
-
It sizes the page as the device the persona's tags name (`mobile`/`phone`, `tablet`/`ipad`, `desktop`/`laptop`; `start-run`
|
|
272
|
+
It sizes the page as the device the persona's tags name (`mobile`/`phone`, `tablet`/`ipad`, `desktop`/`laptop`; `start-run --json` returns it as `viewport.device`) and resizes a browser left at another persona's size.
|
|
273
273
|
|
|
274
274
|
**Fresh walk (`--fresh`, `iamu browse` only).** When `--fresh` was given, or when running iterative passes against a browser left open (e.g. with `--critic`), clear the origin's storage after `browse start` so each walk starts from clean app storage:
|
|
275
275
|
|
|
@@ -287,10 +287,10 @@ iamu instructions walk --scenario <scenario-slug> --run <run-id> --surface brows
|
|
|
287
287
|
|
|
288
288
|
The result's `walker_prompt` is the walker's entire prompt (also persisted at `walker_prompt_path`). Pass it verbatim — do not rewrite, summarize or trim it. The prompt already carries the dismissed findings, the active tester guidance rules (`iamu/guidance/`) for this scenario, and — when fixes await a re-run — the places they were seen (places only, never what was wrong; the list is in `revisit`). The rest of the bundle (`persona`, `outline`, `access`, `dismissed_findings`, `tester_guidance`, …) is there for you, not the walker. If `access` is missing a half, fill it in first (step 3) and re-run this command.
|
|
289
289
|
|
|
290
|
-
**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
|
|
290
|
+
**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 (the standard interactive mode of most agent hosts), 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:
|
|
291
291
|
"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."
|
|
292
292
|
|
|
293
|
-
**CRITICAL: Dispatch the walker as an isolated subagent.** Spawn a fresh subagent using your host
|
|
293
|
+
**CRITICAL: Dispatch the walker as an isolated subagent.** Spawn a fresh subagent using your host's own subagent mechanism. The subagent gets ONLY the walking prompt (`walker_prompt`) — no prior conversation history.
|
|
294
294
|
|
|
295
295
|
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.
|
|
296
296
|
|
|
@@ -300,17 +300,18 @@ A fresh subagent is NOT blind by default. On most hosts it still loads the proje
|
|
|
300
300
|
- **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`.
|
|
301
301
|
|
|
302
302
|
**Model tiering & subagent dispatch:**
|
|
303
|
-
- **Walker (Browser Navigation):** High turn count, and a judgement at every screen about what fits the persona's role. Use the **mid** tier
|
|
304
|
-
- **Matcher:** Short-text classification (same problem or not) into strict JSON that `match-record` validates. Use the **fastest** tier (
|
|
305
|
-
- **Judge:** Evaluates the human tests from the walk's recorded steps and findings (`judge_prompt.md`, text-only reading comprehension). Use the **mid** tier
|
|
303
|
+
- **Walker (Browser Navigation):** High turn count, and a judgement at every screen about what fits the persona's role. Use the **mid** tier by default: on the role-fit benchmark it found the same problems as the fastest tier about 1.7× faster, at a higher price per token. In `--critic` loops, where cost per walk matters more than the time of one walk, the **fastest** tier is an option.
|
|
304
|
+
- **Matcher:** Short-text classification (same problem or not) into strict JSON that `match-record` validates. Use the **fastest** tier (else the mid tier).
|
|
305
|
+
- **Judge:** Evaluates the human tests from the walk's recorded steps and findings (`judge_prompt.md`, text-only reading comprehension). Use the **mid** tier.
|
|
306
|
+
- **Advisor and designer:** the **thorough** tier.
|
|
306
307
|
|
|
307
|
-
|
|
308
|
-
# In Claude Code:
|
|
309
|
-
Agent({ description: "Walk <scenario-slug> as <persona.name>", model: "sonnet", prompt: "<walker_prompt, verbatim>" })
|
|
308
|
+
Dispatch each with your host's subagent launcher, giving it the model for the tier, the walker prompt verbatim (or, for the other stages, the path to the prompt file). Example model names per host, which change over time; use what your host offers at that tier:
|
|
310
309
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
310
|
+
| Tier | Claude Code | Antigravity |
|
|
311
|
+
|------|-------------|-------------|
|
|
312
|
+
| fastest | `haiku` | `flash_lite` |
|
|
313
|
+
| mid | `sonnet` | `flash` |
|
|
314
|
+
| thorough | `opus` | the host's strongest model |
|
|
314
315
|
|
|
315
316
|
The subagent inherits the driving-surface tools and drives the product independently. It does not see this conversation.
|
|
316
317
|
|
|
@@ -385,12 +386,25 @@ iamu summary <run-id> --worked "What worked 1" --worked "What worked 2" --questi
|
|
|
385
386
|
|
|
386
387
|
**Post-walk pipeline (MANDATORY — do NOT skip any step):**
|
|
387
388
|
|
|
388
|
-
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; the designer's review (C3) starts right after A and runs beside B, C and C2. D and E wait until every record (B, C, C2, C3) is in, so the report you read and the run you publish are complete.
|
|
389
|
+
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 once the judge's verdict is recorded (the advisor reads it); the designer's review (C3) starts right after A and runs beside B, C and C2. D and E wait until every record (B, C, C2, C3) is in, so the report you read and the run you publish are complete.
|
|
389
390
|
|
|
390
391
|
> **CRITICAL EXECUTION RULE (Zero Host File Tools):**
|
|
391
|
-
> 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
|
|
392
|
+
> 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`, `iamu post-walk`, 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 via stdin heredoc (`--file - <<'EOF' ... EOF`), `--file <path>`, or `--data '<json>'`.
|
|
392
393
|
|
|
393
|
-
**
|
|
394
|
+
**Fast path — prepare all post-walk prompts in one hop:**
|
|
395
|
+
You can complete the run locally AND generate `match_prompt.md`, `judge_prompt.md` and `designer_prompt.md` in a single command; the advisor's prompt waits for the judge:
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
iamu post-walk <run-id> --json
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
`iamu post-walk <run-id> --json` returns the `needed` status, `prompt_file_abs`, and `answer_file_abs` for `match`, `evaluate`, `advise`, and `designer` in one JSON object (pass `--critic` or `--no-ux` when applicable; it records those skips itself). The advisor reads the judge's verdict, so until `verdicts.json` exists `advise` comes back as `needed: false` with `reason: "awaiting judge"` and no prompt.
|
|
402
|
+
|
|
403
|
+
Call `post-walk` twice:
|
|
404
|
+
1. After the walk: dispatch the matcher, the judge and the designer from the prompts it wrote, and write each answer to its `answer_file_abs` (or record it with the `*-record` command).
|
|
405
|
+
2. After `evaluate-record` has recorded the verdict: run `iamu post-walk <run-id> --json` again. It records every answer file that has arrived, in lock-safe order, and now builds `advise_prompt.md`. Dispatch the advisor from it (C2) and record its answer the same way.
|
|
406
|
+
|
|
407
|
+
**A. Assemble canonical + report (local).** Use `--no-push` so post-processing stays fast, local, and synchronous (already done if you ran `iamu post-walk <run-id> --json`):
|
|
394
408
|
|
|
395
409
|
```bash
|
|
396
410
|
iamu complete <run-id> --no-prompt --no-push --json
|
|
@@ -400,53 +414,64 @@ This reads all steps, findings, and entity files, assembles `canonical.json`, ge
|
|
|
400
414
|
|
|
401
415
|
**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.
|
|
402
416
|
|
|
403
|
-
**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`
|
|
417
|
+
**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 post-walk <run-id> --json` (or `iamu match` and `iamu evaluate`), then dispatch the needed 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".
|
|
404
418
|
|
|
405
419
|
**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.
|
|
406
420
|
|
|
407
|
-
**
|
|
421
|
+
**Avoid zsh quote-escaping failures when recording JSON:** Subagent outputs are 5–15 KB of JSON that frequently contain single quotes (`"Something's off"`) and escaped double quotes (`"\"Hall rules\""`). Prefer piping via a single-quoted heredoc (`--file - <<'EOF'`) or `--file <path>` so the shell never interprets quotes inside the JSON.
|
|
422
|
+
|
|
423
|
+
**B. Match findings to earlier runs.** Get the matcher bundle (if not already prepared via `iamu post-walk`):
|
|
408
424
|
|
|
409
425
|
```bash
|
|
410
426
|
iamu match <run-id> --json
|
|
411
427
|
```
|
|
412
428
|
|
|
413
|
-
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
|
|
429
|
+
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). Record its JSON answer via `--file - <<'EOF'` (or `--data`):
|
|
414
430
|
|
|
415
431
|
```bash
|
|
416
|
-
iamu match-record <run-id> --
|
|
432
|
+
iamu match-record <run-id> --file - <<'EOF'
|
|
433
|
+
<raw_matches_json>
|
|
434
|
+
EOF
|
|
435
|
+
# or: iamu match-record <run-id> --data '<raw_matches_json>'
|
|
417
436
|
```
|
|
418
437
|
|
|
419
438
|
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.
|
|
420
439
|
|
|
421
|
-
**C. Evaluate human tests.** Get the evaluation prompt:
|
|
440
|
+
**C. Evaluate human tests.** Get the evaluation prompt (if not already prepared via `iamu post-walk`):
|
|
422
441
|
|
|
423
442
|
```bash
|
|
424
443
|
iamu evaluate <run-id> --json
|
|
425
444
|
```
|
|
426
445
|
|
|
427
|
-
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 **mid** model tier
|
|
446
|
+
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 **mid** model tier). After the evaluator returns verdicts, record them via `--file - <<'EOF'` (or `--data`). Like every record command it stays local and never prompts; E publishes:
|
|
428
447
|
|
|
429
448
|
```bash
|
|
430
|
-
iamu evaluate-record <run-id> --
|
|
449
|
+
iamu evaluate-record <run-id> --file - <<'EOF'
|
|
450
|
+
<raw_verdicts_json>
|
|
451
|
+
EOF
|
|
452
|
+
# or: iamu evaluate-record <run-id> --data '<raw_verdicts_json>'
|
|
431
453
|
```
|
|
432
454
|
|
|
433
455
|
This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
|
|
434
456
|
|
|
435
|
-
**C2. Advise: fixes and directions.** Skip in `--critic` mode.
|
|
457
|
+
**C2. Advise: fixes and directions.** Skip in `--critic` mode. The advisor starts from the judge's verdict, so it runs only after `evaluate-record` has recorded it, never beside the judge. Get the advisor prompt (a second `iamu post-walk <run-id> --json` after `evaluate-record` builds it; before that `advise` says `needed: false`, `reason: "awaiting judge"`):
|
|
436
458
|
|
|
437
459
|
```bash
|
|
438
460
|
iamu advise <run-id> --json
|
|
439
461
|
```
|
|
440
462
|
|
|
441
|
-
If `needed` is `false` (blocked run, nothing open to advise, or already advised), skip to D. Otherwise read the prompt from `iamu/.runs/<run-id>/advise_prompt.md` and dispatch an advisor subagent with it as its only context (use the **thorough** model tier). Unlike the walker, the advisor reads the project's code (read-only) and the screenshots: it classifies each finding local or systemic, writes the fix from the persona's need, looks at how leading systems in the domain handle the moment, and proposes directions for the flow with their predicted reach on other personas. Record its JSON answer via `--data
|
|
463
|
+
If `needed` is `false` (blocked run, nothing open to advise, or already advised), skip to D. Otherwise read the prompt from `iamu/.runs/<run-id>/advise_prompt.md` and dispatch an advisor subagent with it as its only context (use the **thorough** model tier). Unlike the walker, the advisor reads the project's code (read-only) and the screenshots: it classifies each finding local or systemic, writes the fix from the persona's need, looks at how leading systems in the domain handle the moment, and proposes directions for the flow with their predicted reach on other personas. Tell the advisor to read the whole prompt (its answer schema is at the end) and to open at most 3–5 source files behind the screens where its findings occurred, found through `panorama.source_files` and `panorama.code_routes` in the bundle, rather than crawling unrelated screens. Record its JSON answer via `--file - <<'EOF'` (or `--data`):
|
|
442
464
|
|
|
443
465
|
```bash
|
|
444
|
-
iamu advise-record <run-id> --
|
|
466
|
+
iamu advise-record <run-id> --file - <<'EOF'
|
|
467
|
+
<raw_advice_json>
|
|
468
|
+
EOF
|
|
469
|
+
# or: iamu advise-record <run-id> --data '<raw_advice_json>'
|
|
445
470
|
```
|
|
446
471
|
|
|
447
472
|
Each entry is checked on its own. Entries that come back rejected (an invented file or symbol, a path in the prose, a direction with too little evidence) stay unadvised and the rest is kept; a run is advised once, so do not record again. Mention rejected entries in step 5. Keep the result's `directions` and `rerun` for step 5.
|
|
448
473
|
|
|
449
|
-
|
|
474
|
+
Dispatch the advisor (C2) after `evaluate-record`, never in parallel with the judge: it reads the verdict. Run `evaluate-record` and `advise-record` one after the other too: both rewrite finding files. On a host without subagents, run the advise prompt yourself inline and record it the same way.
|
|
450
475
|
|
|
451
476
|
**C3. Designer's review.** For every run (unless `--no-ux` or `--critic` was given), start it as soon as A is done:
|
|
452
477
|
|
|
@@ -454,17 +479,20 @@ The judge (C) and the advisor (C2) are independent, so their subagents may run i
|
|
|
454
479
|
iamu designer <run-id> --json
|
|
455
480
|
```
|
|
456
481
|
|
|
457
|
-
If `needed` is `false` (`reason` is `blocked`, `no_screens` or `already_recorded`), skip it. Otherwise dispatch a fresh subagent that can look at images (the **thorough** model tier) with `iamu/.runs/<run-id>/designer_prompt.md` as its only context, alongside the matcher (B), the judge (C) and the advisor (C2) where the host allows. The subagent MUST open and look at the key screenshots the prompt lists (their paths are `key_screenshots` in the result) with its own file-viewing tool, judging visual hierarchy, layout, contrast and typography against the design docs the prompt names, else general craft. What it finds are designer findings: judgement, never the persona's experience, and never counted with the persona's findings or in the verdict.
|
|
482
|
+
If `needed` is `false` (`reason` is `blocked`, `no_screens` or `already_recorded`), skip it. Otherwise dispatch a fresh subagent that can look at images (the **thorough** model tier) with `iamu/.runs/<run-id>/designer_prompt.md` as its only context, alongside the matcher (B), the judge (C) and, once the verdict is in, the advisor (C2) where the host allows. The subagent MUST open and look at the key screenshots the prompt lists (their paths are `key_screenshots` in the result) with its own file-viewing tool, judging visual hierarchy, layout, contrast and typography against the design docs the prompt names, else general craft. What it finds are designer findings: judgement, never the persona's experience, and never counted with the persona's findings or in the verdict.
|
|
458
483
|
|
|
459
484
|
The advisor (C2) does not wait for the designer, but D and E do: when its answer arrives, record it:
|
|
460
485
|
|
|
461
486
|
```bash
|
|
462
|
-
iamu designer-record <run-id> --
|
|
487
|
+
iamu designer-record <run-id> --file - <<'EOF'
|
|
488
|
+
<raw_designer_json>
|
|
489
|
+
EOF
|
|
490
|
+
# or: iamu designer-record <run-id> --data '<raw_designer_json>'
|
|
463
491
|
```
|
|
464
492
|
|
|
465
493
|
Record commands run one at a time: `match-record`, `evaluate-record` and `advise-record` keep their order, and `designer-record` goes between them when its answer arrives (the CLI also holds each run's record lock, so one that starts while another records waits for it). It re-derives the report and never touches the persona's finding files. If the subagent fails or its answer is rejected, retry once, then continue without it and record `iamu designer-record <run-id> --skipped "the designer failed"`. If `designer-record` says `rederive_failed`, run the `fix` it prints.
|
|
466
494
|
|
|
467
|
-
**Never fabricate a review.** Where the host can dispatch a subagent that looks at images, the review is that subagent's. Only on a host that cannot dispatch one, and only when you can open and look at the screenshots yourself, answer `designer_prompt.md` yourself and record it with `iamu designer-record <run-id> --by-orchestrator --data '<raw_designer_json>'
|
|
495
|
+
**Never fabricate a review.** Where the host can dispatch a subagent that looks at images, the review is that subagent's. Only on a host that cannot dispatch one, and only when you can open and look at the screenshots yourself, answer `designer_prompt.md` yourself and record it with `iamu designer-record <run-id> --by-orchestrator --file - <<'EOF'` (or `iamu designer-record <run-id> --by-orchestrator --data '<raw_designer_json>'`): the report then says it was written by the orchestrator, which is less independent. If neither is possible, record `iamu designer-record <run-id> --skipped "no subagent can look at images"`. `--no-ux` and `--critic` record their own reasons (see the top of this skill).
|
|
468
496
|
|
|
469
497
|
Keep the result's `proposals`, and `offer_template` from `iamu designer`, for step 5.
|
|
470
498
|
|
|
@@ -625,8 +653,15 @@ When the user asks to review findings one by one:
|
|
|
625
653
|
> • **By design / intended behavior:** (Why this pattern is expected)
|
|
626
654
|
> • **Walker error:** (What the walker misread or did wrong)
|
|
627
655
|
> • **Out of scope:** (Non-issue for this product/flow)
|
|
656
|
+
> • **Duplicate:** (Same problem as another finding)
|
|
628
657
|
> What specific rule should future walkers follow?"
|
|
629
|
-
|
|
658
|
+
|
|
659
|
+
Map the user's choice to the `--reason` value; no other value is accepted (`invalid_reason`):
|
|
660
|
+
- By design / intended behavior → `not_relevant`
|
|
661
|
+
- Walker error → `walker_error`
|
|
662
|
+
- Out of scope → `out_of_scope`
|
|
663
|
+
- Duplicate → `duplicate` (add `--duplicate-of <slug>`; it writes no guidance rule)
|
|
664
|
+
|
|
630
665
|
Once the user provides their reasoning (or if already clear from discussion):
|
|
631
666
|
Derive a concise, actionable guidance rule string.
|
|
632
667
|
Execute: `iamu triage <slug> --status dismissed --reason <reason> --note "<user rationale>" --rule "<rule string>"`.
|
|
@@ -390,8 +390,14 @@ Step 3b: Walk Surface & Persona Login
|
|
|
390
390
|
```
|
|
391
391
|
3. **Scaffold Persona**:
|
|
392
392
|
```bash
|
|
393
|
-
iamu new persona --name "<Name>" --role "<Role>" --disposition "<Disposition>"
|
|
393
|
+
iamu new persona --name "<Name>" --role "<Role>" --disposition "<Disposition>" [--access "<confirmed-account-or-role>"] --body-file - --json <<'EOF'
|
|
394
|
+
<2-4 sentence narrative detailing technical habits, patience level, and specific friction triggers>
|
|
395
|
+
|
|
396
|
+
## Today
|
|
397
|
+
<how they do this job today without the product, and what that costs or gives them>
|
|
398
|
+
EOF
|
|
394
399
|
```
|
|
400
|
+
Pass a multi-line body with `--body-file` (a path, or `-` for stdin as above), never with `\n` inside `--body`: the shell does not turn `\n` into a newline, so the file would store a literal backslash-n.
|
|
395
401
|
4. **Scaffold Bound Scenario**:
|
|
396
402
|
```bash
|
|
397
403
|
iamu new scenario --name "<persona-slug>--<outline-slug>" --outline "<outline-slug>" --persona "<persona-slug>" --entry "<confirmed_entry_path>" --body "<Persona's first-person test brief describing what they intend to achieve>" --json
|
|
@@ -45,10 +45,10 @@ Run `iamu instructions stage [slug] --json` to inspect the scenario's paired per
|
|
|
45
45
|
iamu instructions stage <slug> --json
|
|
46
46
|
```
|
|
47
47
|
This loads:
|
|
48
|
-
- **Who:**
|
|
49
|
-
- **Where:**
|
|
50
|
-
- **What:**
|
|
51
|
-
- **Human Tests:**
|
|
48
|
+
- **Who:** `persona.role`, `persona.disposition`, and `persona.access` (the persona's own account or role key; null when unset).
|
|
49
|
+
- **Where:** `scenario.entry_path` (the landing route; null when unset) and `scenario.target_url`.
|
|
50
|
+
- **What:** `scenario.state` and `outline.narrative`: what world state must exist for the situation to make sense? (e.g. "Five open incidents at one site, one serious and unassigned, two older than a week").
|
|
51
|
+
- **Human Tests:** `outline.human_tests`, the questions that will be evaluated (e.g. "Can Maria see which incident is unassigned without clicking each row?").
|
|
52
52
|
|
|
53
53
|
### 2. Scout the Codebase & Environment (The "How")
|
|
54
54
|
|
package/dist/ui/html-report.d.ts
CHANGED
|
@@ -59,12 +59,17 @@ export interface HtmlReportSinceItem {
|
|
|
59
59
|
title: string;
|
|
60
60
|
note?: string;
|
|
61
61
|
step_ids?: string[];
|
|
62
|
+
visited?: boolean;
|
|
62
63
|
fixed_before?: boolean;
|
|
63
64
|
severity_before?: string;
|
|
64
65
|
severity_now?: string;
|
|
66
|
+
/** `resolvedUntriaged` only: the finding file to triage. */
|
|
67
|
+
slug?: string;
|
|
65
68
|
}
|
|
66
69
|
export interface HtmlReportVerification {
|
|
67
70
|
resolved: HtmlReportSinceItem[];
|
|
71
|
+
/** Gone this run per the matcher, but never marked addressed. */
|
|
72
|
+
resolvedUntriaged?: HtmlReportSinceItem[];
|
|
68
73
|
persists: HtmlReportSinceItem[];
|
|
69
74
|
notObserved?: HtmlReportSinceItem[];
|
|
70
75
|
newFindings: Array<{
|