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