@iamu-dev/iamu 0.3.0-beta.6 → 0.4.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/bin.js +10335 -7169
- package/dist/commands/advise.d.ts +31 -0
- package/dist/commands/answer-input.d.ts +20 -0
- package/dist/commands/complete.d.ts +1 -5
- package/dist/commands/context.d.ts +0 -7
- package/dist/commands/evaluate.d.ts +5 -0
- package/dist/commands/match.d.ts +5 -0
- package/dist/commands/new-finding.d.ts +2 -0
- package/dist/commands/open.d.ts +2 -1
- package/dist/commands/register-walkthrough.d.ts +1 -1
- package/dist/commands/report-data.d.ts +16 -0
- package/dist/commands/report.d.ts +6 -2
- package/dist/commands/summary.d.ts +4 -0
- package/dist/index.js +10485 -7296
- package/dist/templates/prompts/advise.md +111 -0
- package/dist/templates/prompts/walk.md +10 -7
- package/dist/templates/skills/iamu-findings.md +31 -22
- package/dist/templates/skills/iamu-new.md +5 -4
- package/dist/templates/skills/iamu-propose.md +5 -4
- package/dist/templates/skills/iamu-run.md +74 -25
- package/dist/templates/skills/iamu-status.md +7 -7
- package/dist/ui/html-report.d.ts +119 -0
- package/dist/ui/report-view.d.ts +116 -0
- package/package.json +3 -3
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Advise: from findings to fixes and directions
|
|
2
|
+
|
|
3
|
+
You are the advisor. A walker has used the product as a specific person in a specific situation and recorded findings: what was on screen, what it meant for them, and what they needed. A judge has answered whether they would come back. You come after both, out of character. Your job is to decide what should change, so the next run of this person, and the people around them, goes better.
|
|
4
|
+
|
|
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
|
+
|
|
7
|
+
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
|
+
|
|
9
|
+
## How to work
|
|
10
|
+
|
|
11
|
+
Work in this order. Do not skip ahead to writing fixes.
|
|
12
|
+
|
|
13
|
+
1. **Read the flow first.** Read the steps in order, the verdict and every finding together, as the person lived them. Ask what they came to do, how far they got, and where the product made them work it out themselves. One finding is a moment; the flow is the story.
|
|
14
|
+
|
|
15
|
+
2. **Meet the need.** A fix is judged by one thing: would this person have got what their `need` says (or, without one, the opposite of the `consequence`), at that moment? A fix that is technically correct but leaves the need unmet is wrong. Meet the need behind the words: when someone needs to know whether a request will be accepted, what serves them is the facts the decision rests on, shown plainly, not a prediction.
|
|
16
|
+
|
|
17
|
+
**Facts over forecasts.** Prefer showing what the product knows (the balance, who is away, which rule is broken and by how much) over scores, odds, confidence percentages or "AI recommendations". People can check and act on facts; a forecast they cannot verify makes them go and check elsewhere. Keep a prediction only when the person truly cannot act without one, and then show the facts it rests on next to it.
|
|
18
|
+
|
|
19
|
+
3. **Diagnose: local or symptom.** Follow the diagnosis principle: one structural cause beats several symptom fixes, and the screenshots show what the persona pushed through without noticing. For each finding decide its `scope`:
|
|
20
|
+
- `local`: confined to one screen, element or string. A label, a missing value, a bug.
|
|
21
|
+
- `systemic`: a symptom of something shared. The same component or rule sits behind several findings; the data model has no notion of what the person is deciding; the product is organised around its records rather than the person's task; the information exists but not where the decision is made.
|
|
22
|
+
The code is your evidence. Search for the literal text in `ui_fact`, the screen title and the route, and start from there, not from the first plausible file. Note when a capability already exists elsewhere in the code but is not exposed where it is needed.
|
|
23
|
+
|
|
24
|
+
4. **Decide what the system should do. Often less.** Before adding anything, ask in this order:
|
|
25
|
+
- Does this belong in the system at all, or is it a human process the system should record or stay out of? Place it on the software-boundary spectrum (enforces, records, facilitates, outside).
|
|
26
|
+
- Should this person see it at all? Role clarity: nobody sees everything at once. Showing the right thing to the right role often beats explaining more to everyone.
|
|
27
|
+
- Would removing, merging or deferring something make this better? Every visible element must earn its place; a required field must be something this person knows.
|
|
28
|
+
- Is the rule real? Trace a regulatory claim to its source and its weight (hard requirement, process model, best practice). Never block work over a best practice.
|
|
29
|
+
Prefer removing, hiding by role, deferring or leaving to people over adding. When you add something, say what it replaces or why nothing could.
|
|
30
|
+
|
|
31
|
+
5. **Protect what works.** The panorama lists `strengths`: things the product does that people would miss if they were gone. A change must not remove or bury them; if it would, say so in the reach.
|
|
32
|
+
|
|
33
|
+
6. **Look at how the leading systems in this domain do it.** Use the project's domain (see Context). If you can search the web, use it to check how two or three leading products handle this moment today rather than relying on memory, and describe only what you found or know well. Ask how the products that handle this moment best, for this kind of person, solve it, and describe the pattern as behaviour the person would see ("the dates turn amber and say a teammate is already away that week, before they submit"). Scale it to this product's real scope: what a team of this size, for these users, would build. Not the enterprise suite's full surface. A brand may be named only next to the mechanism, never instead of it.
|
|
34
|
+
|
|
35
|
+
7. **Decide the ideal, then fit it to the code.** First what the person should experience. Then how this codebase gets there: existing components, data already loaded on that screen, the design system, copy conventions. Cite each file and the symbol you build on in `builds_on`. When the ideal needs more than the code has, say what it would take. Do not shrink the advice to what is easy to change.
|
|
36
|
+
|
|
37
|
+
8. **Size by severity.** `minor` and `observation`: one or two sentences, no quick fix. `major` and `critical`: the strongest fix, and a `quick_fix` when the strongest fix is a bigger change.
|
|
38
|
+
|
|
39
|
+
9. **Group shared causes.** Findings with one root cause get one `group`, with the cause stated once. Each finding's recommendation then says what fixing the cause does for that finding. Group members must cite at least one file in common.
|
|
40
|
+
|
|
41
|
+
10. **Propose directions for the flow.** Now step back from single findings. Ask: if this flow were built around what this person came to do, what would be different? Propose 0 to 3 **directions**: structural changes, described as behaviour. Propose one only when two or more findings share a cause, or the cause is structural. Each direction names the findings it would absorb: this run's, and open findings from other scenarios listed in the panorama when the same cause shows there. Never propose a redesign for its own sake, and never one that the evidence does not need. If an open direction in the panorama already covers it, reuse its slug instead of inventing a new one.
|
|
42
|
+
|
|
43
|
+
11. **Reason about reach.** For each direction, go through the project's other personas and scenarios in the panorama and ask:
|
|
44
|
+
- who else likely benefits, and why (`effect: "helps"`);
|
|
45
|
+
- who could be hurt: someone who relies on what you would move, hide or change (`effect: "risk"`);
|
|
46
|
+
- which scenarios must be re-run to check it actually helped (`verify`, including this one).
|
|
47
|
+
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.
|
|
48
|
+
|
|
49
|
+
12. **Look at what nobody walked.** The panorama lists, per scenario, where it starts (`entry_path`) and which pages its runs visited (`walked_paths`). Compare that with the routes in the code. 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).
|
|
50
|
+
|
|
51
|
+
13. **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.
|
|
52
|
+
|
|
53
|
+
14. **Decline rather than guess.** If a finding is not actionable from what you know, leave it out.
|
|
54
|
+
|
|
55
|
+
## Writing
|
|
56
|
+
|
|
57
|
+
- Recommendations, quick fixes and direction texts are prose for a product person and a developer reading together. Plain, specific, in the product's own words.
|
|
58
|
+
- **No file paths or code symbols in the prose.** They go in `builds_on` only. The prose is shown to a later walker who must stay outside the code.
|
|
59
|
+
- A recommendation says what the person would see and why it meets their need, then how it fits this product.
|
|
60
|
+
|
|
61
|
+
## Answer
|
|
62
|
+
|
|
63
|
+
Reply with one JSON object and nothing else.
|
|
64
|
+
|
|
65
|
+
For a run:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"groups": [{ "id": "g1", "root_cause": "…" }],
|
|
70
|
+
"advice": [
|
|
71
|
+
{
|
|
72
|
+
"finding_id": "<ref from the bundle, e.g. F3>",
|
|
73
|
+
"scope": "local | systemic",
|
|
74
|
+
"recommendation": "…",
|
|
75
|
+
"quick_fix": "… or null",
|
|
76
|
+
"builds_on": [{ "path": "relative/path/from/project/root", "symbol": "text that occurs in that file" }],
|
|
77
|
+
"group": "g1 or null",
|
|
78
|
+
"direction": "<direction slug> or null",
|
|
79
|
+
"heuristic": "the UX principle at stake (e.g. recognition_over_recall) or null"
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"directions": [
|
|
83
|
+
{
|
|
84
|
+
"slug": "kebab-case-name",
|
|
85
|
+
"title": "Short imperative title",
|
|
86
|
+
"problem": "The shared cause, in product terms",
|
|
87
|
+
"change": "What the person would experience instead",
|
|
88
|
+
"leading_practice": "How leading systems in this domain handle it, scaled to this product",
|
|
89
|
+
"size": "small | medium | large",
|
|
90
|
+
"absorbs": ["<ref, e.g. F3>", "<ref, e.g. F12>"],
|
|
91
|
+
"reach": [{ "scenario": "<scenario slug>", "effect": "helps | risk", "reason": "…" }],
|
|
92
|
+
"verify": ["<scenario slug>"],
|
|
93
|
+
"builds_on": [{ "path": "…", "symbol": "…" }]
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
"observations": [
|
|
97
|
+
{
|
|
98
|
+
"kind": "coverage_gap | feature_risk",
|
|
99
|
+
"title": "Short title",
|
|
100
|
+
"detail": "What is missing or risky, and why it matters here",
|
|
101
|
+
"suggested_scenario": "Who, in what situation, starting where (coverage gaps) or null"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`observations` are at most five, never absorb findings and are never treated as evidence.
|
|
108
|
+
|
|
109
|
+
For a project synthesis (the bundle says `"mode": "project"`), answer with `directions` and `observations` only: `{ "directions": [ … ], "observations": [ … ] }`. Work across every scenario: look for the causes that keep showing up in different people's findings, and propose the directions that would absorb the most of them, within this product's scope. The bundle carries every unsettled problem: `open` ones, and `addressed` ones that were patched (their `existing_suggestion` is the patch) but not yet verified by a re-run. Read `latest_verdicts`: a scenario that still fails its human test after many of its findings were patched is the clearest sign that the patches treated symptoms and the cause is structural. Say so in the direction's `problem` when it applies.
|
|
110
|
+
|
|
111
|
+
Every `finding_id` and `absorbs` entry must be a finding `ref` from the bundle (`F1`, `F2`, …), copied exactly. Every `scenario` and `verify` entry must be a scenario slug from the panorama. Every `builds_on` path must exist and contain its symbol. Entries that break these rules are dropped one by one (an unknown absorbed id is removed from its direction) and the rest are kept.
|
|
@@ -56,7 +56,7 @@ Not every lens produces a finding at every screen. But you must consciously chec
|
|
|
56
56
|
- **observation** — An enhancement opportunity. Not friction, but a missed chance to help.
|
|
57
57
|
|
|
58
58
|
Finding type pairing:
|
|
59
|
-
- `helps` → always observation severity. Record
|
|
59
|
+
- `helps` → always observation severity. Record each one you meet: something the product does that actively supports the persona and would be missed if removed. Not baseline competence ("the button is easy to find"). These tell whoever fixes the problems what to protect.
|
|
60
60
|
- `hinders` → critical, major, or minor.
|
|
61
61
|
- `missing` → critical, major, or minor.
|
|
62
62
|
- `incorrect` → critical or major only.
|
|
@@ -174,15 +174,17 @@ The CLI automatically handles sequential numbering, timestamps, screenshot captu
|
|
|
174
174
|
**Findings:** Always scaffold with the CLI — never create finding files by hand or call host Edit/Write tools:
|
|
175
175
|
|
|
176
176
|
```bash
|
|
177
|
-
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 --
|
|
177
|
+
iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type hinders --severity major --ui-fact "What the UI showed" --consequence "Impact on persona" --task-impact impairs --confidence high --need "What I needed at that moment" --description "What happened and why it mattered" --json
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
- `--type`: `helps | hinders | missing | irrelevant | incorrect`
|
|
181
181
|
- `--severity`: `critical | major | minor | observation`
|
|
182
182
|
- `--task-impact`: `blocks | impairs | slows | neutral | accelerates | enables`
|
|
183
183
|
- `--confidence`: `high | medium | low`
|
|
184
|
-
- `--
|
|
185
|
-
- `--
|
|
184
|
+
- `--need`: for every finding that is not `helps`, what you needed at that moment, in your own terms as the persona ("I needed to know the code was wrong before I submitted")
|
|
185
|
+
- `--description`: markdown body describing what happened and why it mattered
|
|
186
|
+
|
|
187
|
+
**Record the need, never the fix.** You are outside the product: you cannot see its code or know what it would take to change. Write what you needed, not how the screen should change, and keep solutions out of the description too ("add inline validation" is a fix; "I needed to know before I pressed Send" is a need). A separate advisor reads the code after the walk and writes the fix from your need.
|
|
186
188
|
|
|
187
189
|
Leave `triage_status` alone; triage is not the walker's job.
|
|
188
190
|
|
|
@@ -195,10 +197,11 @@ Leave `triage_status` alone; triage is not the walker's job.
|
|
|
195
197
|
After walking, record your synthesis using the CLI:
|
|
196
198
|
|
|
197
199
|
```bash
|
|
198
|
-
iamu summary <run-id> --worked "What worked
|
|
200
|
+
iamu summary <run-id> --worked "What worked 1" --worked "What worked 2" --question "Question for the team" --setup-note "Doubt about the test setup"
|
|
199
201
|
```
|
|
200
202
|
|
|
201
|
-
- `--worked` —
|
|
202
|
-
- `--question` — Questions that
|
|
203
|
+
- `--worked` — What worked for this persona, one point each: the screen or moment and what it did for them ("The confirmation names who is notified, so I knew I was done"). Include the strengths you recorded and anything else that made the task easier. Usually three to six points.
|
|
204
|
+
- `--question` — Questions for the product team: decisions the walk raised that the product does not settle and that you could not settle as the persona ("Should a reporter see the investigator's checklist at all?", "Is the 14-day notice rule enforced or only advised?"). Not doubts about the test itself.
|
|
205
|
+
- `--setup-note` — Doubts about the test setup, not the product: data that seemed missing or unrealistic, an account that could not see what the situation needs, a date the scenario assumes ("No absences are recorded for summer 2027, so 'nobody is away' may only mean no data"). These go to whoever stages the scenario.
|
|
203
206
|
|
|
204
207
|
Then return your final summary to the orchestrating agent so it can run `iamu complete` and the evaluation stage.
|
|
@@ -61,7 +61,7 @@ Ask whether to pick one up. When the user picks a request:
|
|
|
61
61
|
|
|
62
62
|
### 2. List mode: present open findings grouped by scenario
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
Run `iamu findings --open --json`. Each finding carries `slug`, `scenario`, `type`, `severity`, `title`, `where` (page and step), `recommendation` (the advisor's, or null) and `fix_state`. For how each scenario is doing, run `iamu report --json` and keep the newest row per `scenario`: its `summary.verdict` (label, question, answer) is the scenario's current outcome.
|
|
65
65
|
|
|
66
66
|
Filter to `triage_status: open`.
|
|
67
67
|
|
|
@@ -73,18 +73,22 @@ Filter to `triage_status: open`.
|
|
|
73
73
|
|
|
74
74
|
A run that simply did not come across a finding proves nothing — never call a fix verified because it was not seen. After the list, if any fixes await a re-run, say how many and in which scenarios (`iamu status --json` → `rerun`, with `requests.open` for team requests), and offer `iamu-run <scenario>` for the first one.
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
**Directions before findings.** Run `iamu directions --json`. Directions are structural changes the advisor proposed after a walk, each absorbing several findings (sometimes across scenarios), with the people it could hurt and the scenarios to re-run. If any are `proposed` or `accepted`, show them above the tally, one line each: `◆ <title> (<size>, <status>) · absorbs <N> findings in <S> scenarios · could hurt: <scenarios or "none predicted">`. Offer them first: taking a direction fixes its findings together, which beats patching them one by one. For each the user can **take it** (`iamu directions set <slug> --status accepted`, then implement it, or hand it to planning when it is `large`), take **only the local fixes** (leave it `proposed`, triage its findings below), **defer**, or **reject** (`--status rejected`; it is never proposed again). When a taken direction is implemented, mark it `done` and offer `iamu-run` for every scenario in its `verify` list. Reach is a prediction: say "likely" and "could", never "will".
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
Findings Tally: <N> Open (<C> Critical · <M> Major · <m> Minor) across <S> Scenarios
|
|
80
|
-
Awaiting verification: <K> addressed findings pending re-run
|
|
78
|
+
When open findings span three or more scenarios and there are no open directions, or the user asks what to change first, offer a project synthesis: `iamu advise --project --json`, dispatch a thorough-tier subagent with `iamu/.analysis/advise_prompt.md` as its only context, and record its answer with `iamu advise-record --project --data '<json>'`. It proposes directions across every scenario.
|
|
81
79
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
Render it as Markdown, not inside a code fence, so the tables render. Start with a one-line tally, then one block per scenario, scenarios with the worst verdict first:
|
|
81
|
+
|
|
82
|
+
**<N> open problems** (<C> critical · <M> major · <m> minor) across <S> scenarios · <K> fixes awaiting a re-run
|
|
83
|
+
|
|
84
|
+
### <persona> · <situation> — **<NO / PARTIAL / YES>**
|
|
85
|
+
<the scenario's latest `summary.verdict.answer`, first sentence or two>
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
| # | Finding | Severity | Where | What to do |
|
|
88
|
+
|---|---|---|---|---|
|
|
89
|
+
| 1 | <title> | **Critical** | <where> | <first sentence of recommendation, or — > |
|
|
90
|
+
|
|
91
|
+
Number findings continuously across scenarios, so "fix 3" means one finding. Sort each table worst first (critical → major → minor → observation; incorrect, hinders and missing before irrelevant). Leave strengths (`helps`) out of the tables. Keep the "What to do" cell to one sentence: the full recommendation belongs in the finding card (step 3).
|
|
88
92
|
|
|
89
93
|
Ask the user how they would like to triage:
|
|
90
94
|
|
|
@@ -112,18 +116,23 @@ Read the finding file at `iamu/findings/<slug>.md`. Parse the YAML frontmatter (
|
|
|
112
116
|
|
|
113
117
|
Synthesize a scannable triage summary. Do NOT output an undifferentiated wall of bullets or academic schema labels like "UI Fact:". The reviewer must be able to parse **What is broken** and **What to fix** in under 3 seconds.
|
|
114
118
|
|
|
119
|
+
**Advised findings are shown as they are.** When the frontmatter has `advised_by`, the recommendation was written after the walk by the advisor, from the code and the persona's need; a `**Part of:**` line names the direction it belongs to. Show it as is, and before applying it read `iamu/.runs/<run>/advice.json` and check that each `builds_on` file still exists and contains its symbol; if not, say the advice is stale before editing.
|
|
120
|
+
|
|
121
|
+
**Raise the recommendation before you show it** (only when there is no `advised_by`: older runs, findings pulled from the cloud, or runs whose advisor stage did not run). The walker wrote it without seeing the code, and it often patches the symptom. Ask what the products that handle this moment best would do for this persona — the established pattern and why it works, not a brand name. Then take a quick look at what this codebase can build that on: existing components, data already on the screen, the design system. Show the strongest fix that fits this project. When it is a bigger change than the walker's proposal, keep a small step that helps now as the quick fix. When the walker's proposal is already the right one, show it as is. Never recommend what the project cannot support without saying what it would take. Your reasoning stays out of the card — it is what "Discuss" is for.
|
|
122
|
+
|
|
115
123
|
Format the visible finding in chat:
|
|
116
124
|
|
|
117
125
|
```markdown
|
|
118
126
|
### Finding #<N>/<total> [<SEVERITY>] — <title>
|
|
119
127
|
> **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
|
|
120
|
-
> **Evidence:**
|
|
128
|
+
> **Evidence:** <project root>/iamu/.runs/<run>/screenshots/step-<N>.png · Cloud: <full https URL from iamu open <run-id> --print>
|
|
121
129
|
|
|
122
130
|
**❌ Problem:**
|
|
123
131
|
<What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
|
|
124
132
|
|
|
125
133
|
**💡 Recommendation:**
|
|
126
|
-
<
|
|
134
|
+
<The strongest fix that fits this project, grounded in the finding and the code>
|
|
135
|
+
<Only when the recommendation is a bigger change: *Quick fix:* <small step that helps now>>
|
|
127
136
|
```
|
|
128
137
|
*(For `type: "helps"` findings, omit `**❌ Problem:**` and `**💡 Recommendation:**`; render `**✓ Strength:** <Observation>`)*.
|
|
129
138
|
|
|
@@ -214,15 +223,14 @@ dismissed (not_relevant): <finding-slug>
|
|
|
214
223
|
|
|
215
224
|
If the user is in list-mode iteration (picked "walk through them", "all critical", or a scenario group), loop to step 3 for the next finding in the queue.
|
|
216
225
|
|
|
217
|
-
When all findings in the queue are triaged, present the
|
|
226
|
+
When all findings in the queue are triaged, present what was decided, one row per finding, as a Markdown table (not in a code fence). Every finding in the queue gets a row, so none silently disappears:
|
|
218
227
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
```
|
|
228
|
+
| # | Finding | Decision | Action |
|
|
229
|
+
|---|---|---|---|
|
|
230
|
+
| 1 | <title> | Fix now | <what will change, or "Done" once applied> |
|
|
231
|
+
| 2 | <title> | Direction | `<direction slug>` |
|
|
232
|
+
| 3 | <title> | Defer | Revisit after the next run |
|
|
233
|
+
| 4 | <title> | Dismissed | <reason>; guidance `<slug>` taught to future walks |
|
|
226
234
|
|
|
227
235
|
If `<N> > 0` findings were queued for fix:
|
|
228
236
|
- Prompt the user:
|
|
@@ -236,7 +244,7 @@ If `<N> > 0` findings were queued for fix:
|
|
|
236
244
|
Proceeding with code edits — say "done" to keep fixes open in iamu/findings/.
|
|
237
245
|
|
|
238
246
|
- **Executing the queued fixes:**
|
|
239
|
-
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>"`.
|
|
247
|
+
When Option 1 is chosen, apply code edits for each queued finding sequentially in the workspace — the fix shown on its card or agreed in Discuss, not the walker's original text. Verify the changes once (run test/typecheck suite). Update each finding with `iamu triage <slug> --status addressed --note "<summary of fix>"`.
|
|
240
248
|
Run `iamu validate --all` to verify all entities before reporting done.
|
|
241
249
|
|
|
242
250
|
- **Closed-Loop Regression Verification (1-Click):**
|
|
@@ -264,12 +272,13 @@ Report it in one line: `Synced <N> findings to Iamu Cloud.` If the result has `c
|
|
|
264
272
|
|
|
265
273
|
Then end with the dashboard link from `iamu open --print` (step replay, screenshots side by side, the team's view of the same findings):
|
|
266
274
|
|
|
267
|
-
> ☁️ **Cloud
|
|
275
|
+
> ☁️ **Cloud:** <full https URL from iamu open --print>
|
|
268
276
|
|
|
269
277
|
In linked-no-credentials mode, end with `Decisions are local only — iamu auth login, then iamu sync, to share them.` Skip this section entirely in local-only mode. The terminal surface is complete.
|
|
270
278
|
|
|
271
279
|
## Guidelines
|
|
272
280
|
|
|
281
|
+
- **Links a terminal can open.** Terminals open only what they can see. Write web addresses in full (`https://…`), never hidden behind link text, and files as absolute paths (the project root plus the path), never relative. Name scenarios, personas and findings by slug in backticks; they need no link.
|
|
273
282
|
- **Terminal-complete.** Everything the user needs to triage fits in chat. Citations, recommendations, linked steps, screenshots (as paths the agent can read if it has image support). Dashboard is nice-to-have, not required.
|
|
274
283
|
- **Group by scenario, not by type.** Findings aggregate around scenarios. When reviewing, the context of "what happened in Maria's shift handoff?" matters before deciding on each finding — not seeing all severity:critical across projects.
|
|
275
284
|
- **Severity-sorted within each group.** Within a scenario group, sort CRITICAL → MAJOR → MINOR → OBS. Within the same severity, show hinders/missing/incorrect before helps.
|
|
@@ -253,12 +253,12 @@ For drafts (no persona): omit `--persona`, omit `--body`.
|
|
|
253
253
|
|
|
254
254
|
### 7. Summarize
|
|
255
255
|
|
|
256
|
-
Present the created entities with
|
|
256
|
+
Present the created entities by slug, with the scenario file as an absolute path, and exact run commands:
|
|
257
257
|
|
|
258
258
|
```
|
|
259
|
-
Created Scenario:
|
|
260
|
-
• Situation:
|
|
261
|
-
• Persona:
|
|
259
|
+
Created Scenario: `<scenario-slug>` (<project root>/iamu/scenarios/<scenario-slug>.md)
|
|
260
|
+
• Situation: `<outline-slug>`
|
|
261
|
+
• Persona: `<persona-slug>` (or "draft — no persona bound yet")
|
|
262
262
|
• Capability: <primary_capability>
|
|
263
263
|
|
|
264
264
|
Next step:
|
|
@@ -271,6 +271,7 @@ Run `iamu validate --all` to verify all entities before reporting done.
|
|
|
271
271
|
|
|
272
272
|
## Guidelines
|
|
273
273
|
|
|
274
|
+
- **Links a terminal can open.** Terminals open only what they can see. Write web addresses in full (`https://…`), never hidden behind link text, and files as absolute paths (the project root plus the path), never relative. Name scenarios, personas and findings by slug in backticks; they need no link.
|
|
274
275
|
- **Brainstorm, don't fill forms.** Propose varied seeds. Challenge assumptions. The best scenarios are ones the user hadn't considered.
|
|
275
276
|
- **Problem-space only.** Scenarios describe human situations — never UI, screens, buttons, or features. The walkthrough discovers whether the product supports the situation.
|
|
276
277
|
- **Ground in the domain, not the codebase.** Start from what the persona's week demands. A situation the product cannot support yet is a good scenario: the walk shows the gap with evidence.
|
|
@@ -69,10 +69,10 @@ Present candidates as scannable numbered cards. Do NOT use multi-column markdown
|
|
|
69
69
|
|
|
70
70
|
#### A. When proposing Scenarios:
|
|
71
71
|
|
|
72
|
-
Lead with existing coverage
|
|
72
|
+
Lead with existing coverage by slug, then render the candidates:
|
|
73
73
|
|
|
74
74
|
```
|
|
75
|
-
Existing coverage: <N> scenarios (
|
|
75
|
+
Existing coverage: <N> scenarios (`<slug1>`, ...). Uncovered areas: <gaps>.
|
|
76
76
|
|
|
77
77
|
1. <Short situation name> (<Actor from context>)
|
|
78
78
|
• Capability: <Capability slug, e.g. billing-invoicing>
|
|
@@ -116,10 +116,10 @@ You MUST output the proposed candidates to the chat stream FIRST. In the SAME tu
|
|
|
116
116
|
|
|
117
117
|
#### B. When proposing Personas:
|
|
118
118
|
|
|
119
|
-
Lead with existing persona coverage
|
|
119
|
+
Lead with existing persona coverage by slug and uncovered roles from `context.yml`:
|
|
120
120
|
|
|
121
121
|
```
|
|
122
|
-
Existing personas:
|
|
122
|
+
Existing personas: `<slug1>`, ... Uncovered roles from context.yml: <roles>.
|
|
123
123
|
|
|
124
124
|
1. <Name> (<Actor role>)
|
|
125
125
|
• Friction & Biases: <Specific friction triggers, skepticism, and bounce risks>
|
|
@@ -179,6 +179,7 @@ Ground rules for generation:
|
|
|
179
179
|
|
|
180
180
|
## Guidelines
|
|
181
181
|
|
|
182
|
+
- **Links a terminal can open.** Terminals open only what they can see. Write web addresses in full (`https://…`), never hidden behind link text, and files as absolute paths (the project root plus the path), never relative. Name scenarios, personas and findings by slug in backticks; they need no link.
|
|
182
183
|
- **This skill produces seeds, not finished files.** `iamu-new` handles the full scaffolding. This skill handles the harder upstream question: what and who is worth testing?
|
|
183
184
|
- **Context is load-bearing.** Without project context, you produce the same feature-validation scenarios and generic marketing bios that freeform chat produces. The `context.yml` grounding makes the difference.
|
|
184
185
|
- **Don't pad to 5.** If only 2–3 strong candidates exist, propose 2–3. Padding with weak candidates undermines trust.
|
|
@@ -329,10 +329,10 @@ Step files live at `iamu/.runs/<run-id>/steps/<NNN>.json`. The CLI manages monot
|
|
|
329
329
|
|
|
330
330
|
**Recording findings:**
|
|
331
331
|
|
|
332
|
-
Use the CLI to create findings with valid frontmatter, UUID, slug,
|
|
332
|
+
Use the CLI to create findings with valid frontmatter, UUID, slug, need and description in one atomic call (the walker records what the persona needed, never the fix; the advisor writes the fix in step C2):
|
|
333
333
|
|
|
334
334
|
```bash
|
|
335
|
-
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 --
|
|
335
|
+
iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type hinders --severity major --ui-fact "What the UI showed" --consequence "Impact on persona" --task-impact impairs --confidence high --need "What I needed at that moment" --description "What happened and why it mattered" --json
|
|
336
336
|
```
|
|
337
337
|
|
|
338
338
|
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.
|
|
@@ -349,7 +349,7 @@ Findings never name a human test: the walker does not see them. The judge links
|
|
|
349
349
|
**Closing Synthesis:**
|
|
350
350
|
Before finishing the walk, record persona synthesis using `iamu summary`:
|
|
351
351
|
```bash
|
|
352
|
-
iamu summary <run-id> --worked "What worked
|
|
352
|
+
iamu summary <run-id> --worked "What worked 1" --worked "What worked 2" --question "Question for the team" --setup-note "Doubt about the test setup"
|
|
353
353
|
```
|
|
354
354
|
|
|
355
355
|
**Post-walk pipeline (MANDATORY — do NOT skip any step):**
|
|
@@ -397,7 +397,23 @@ iamu evaluate-record <run-id> --data '<raw_verdicts_json>' --no-prompt --no-push
|
|
|
397
397
|
|
|
398
398
|
This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
|
|
399
399
|
|
|
400
|
-
**
|
|
400
|
+
**C2. Advise: fixes and directions.** Get the advisor prompt:
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
iamu advise <run-id> --json
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
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`:
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
iamu advise-record <run-id> --data '<raw_advice_json>'
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
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.
|
|
413
|
+
|
|
414
|
+
The judge (C) and the advisor (C2) are independent, so their subagents may run in parallel, but run `evaluate-record` and `advise-record` one after the other: both rewrite finding files. On a host without subagents, run the advise prompt yourself inline and record it the same way.
|
|
415
|
+
|
|
416
|
+
**D. Read the completed canonical.** Read `iamu/.runs/<run-id>/canonical.json` for the final data including the verification delta (if a prior run exists) and `analysis.directions` (if the advisor ran). Use this for step 5 presentation.
|
|
401
417
|
|
|
402
418
|
**E. Publish (linked mode only).** Upload the completed run, screenshots, verdicts, and findings in one atomic sync:
|
|
403
419
|
|
|
@@ -415,7 +431,7 @@ It prints the URL only if the run is on the cloud; otherwise it exits 1 and says
|
|
|
415
431
|
|
|
416
432
|
In linked-no-credentials or local-only mode, skip E.
|
|
417
433
|
|
|
418
|
-
Only after A→E are complete, proceed to step 5.
|
|
434
|
+
Only after A→E (with C2) are complete, proceed to step 5.
|
|
419
435
|
|
|
420
436
|
### 4a. Walk methodology summary
|
|
421
437
|
|
|
@@ -427,42 +443,74 @@ The `walker_prompt` from `iamu instructions walk` is the source of truth and con
|
|
|
427
443
|
|
|
428
444
|
### 5. Present assessment — stay in the conversation
|
|
429
445
|
|
|
430
|
-
You MUST output the complete Executive Scorecard to the chat stream FIRST.
|
|
446
|
+
You MUST output the complete Executive Scorecard to the chat stream FIRST. Build it from `iamu report <scenario-slug> --json`: the first row is this run, and its `summary` holds everything below already assembled (verdict, per-test labels, the since-last-run outcome of each earlier finding, findings with titles, where and recommendations, directions, observations). Do not re-read `canonical.json` or `verdicts.json` yourself. Output rich Markdown, not inside a code fence, so tables render. Write addresses and file paths out in full so a terminal can open them:
|
|
447
|
+
|
|
448
|
+
### <summary.persona> · <summary.situation>
|
|
449
|
+
<summary.steps> steps · Cloud: <cloud_url, the full https address> *(not on the cloud: the row's `report_path`, the absolute path to report.md)*
|
|
450
|
+
|
|
451
|
+
If `summary.checks` is set, say first what this run was checking, in one line: `Re-checked <fixes> fixes waiting for a re-check: <fixed> confirmed fixed, <cameBack> came back, the rest not confirmed`, plus the directions that landed. Name the ones that came back.
|
|
431
452
|
|
|
432
|
-
|
|
433
|
-
|
|
453
|
+
> **<summary.verdict.question>** **<summary.verdict.label>**
|
|
454
|
+
> <summary.verdict.answer>
|
|
434
455
|
|
|
435
|
-
|
|
436
|
-
> **Question:** "<human_tests[0].question>"
|
|
437
|
-
> **Verdict:** **<NO / PARTIAL / YES>** — <1-2 sentences evaluator reasoning from verdicts.json / report.md>
|
|
456
|
+
If `summary.tests` has more than one test, add one line per test: `**<label>** · <question>`.
|
|
438
457
|
|
|
439
|
-
|
|
440
|
-
*(If local-only, render instead: `> **Artifact:** [iamu/.runs/<run-id>/report.md](iamu/.runs/<run-id>/report.md) (Local only)`)*
|
|
458
|
+
If `summary.since` is set, show what happened to every earlier finding this run re-checked (`summary.since.items`), then one line for the new ones:
|
|
441
459
|
|
|
442
|
-
|
|
443
|
-
1. **[CRITICAL]** · *<type>* · <Short title> (Step <N> at `<short_url_path>`)
|
|
444
|
-
2. **[MAJOR]** · *<type>* · <Short title> (Step <N> at `<short_url_path>`)
|
|
445
|
-
...
|
|
446
|
-
(Helps: • [helps] <short title> (Step <N>))
|
|
460
|
+
**Since the last run** (<date of summary.since.baselineAt>)
|
|
447
461
|
|
|
448
|
-
|
|
462
|
+
| Earlier finding | Now | Notes |
|
|
463
|
+
|---|---|---|
|
|
464
|
+
| <title> | **Resolved** / **Persists** / Not seen / Unclear | <item.note, or — > |
|
|
449
465
|
|
|
450
|
-
|
|
466
|
+
For a persisting finding, put its qualifiers in brackets: the `shift` ("less severe, major → minor") and "the fix did not hold" when `fixedBefore` is true (it was marked fixed before this run).
|
|
467
|
+
|
|
468
|
+
`+ <summary.since.added> new problems this run.` "Not seen" means the walk did not pass that way: never call it fixed.
|
|
469
|
+
|
|
470
|
+
**Findings** (<N> problems, <K> strengths), worst first:
|
|
471
|
+
|
|
472
|
+
| # | Finding | Severity | Where | What to do |
|
|
473
|
+
|---|---|---|---|---|
|
|
474
|
+
| 1 | <title> | **Major** | <where> | <first sentence or two of recommendation, or — > |
|
|
475
|
+
|
|
476
|
+
Mark a finding that persists from the last run with `(persists)` after its title. Strengths go on one line under the table: `✓ Strengths: <title>; <title>`.
|
|
477
|
+
|
|
478
|
+
If `summary.directions` is non-empty:
|
|
479
|
+
|
|
480
|
+
**Directions** (structural changes the advisor proposes)
|
|
481
|
+
|
|
482
|
+
| Direction | Size | Absorbs | Re-run to check |
|
|
483
|
+
|---|---|---|---|
|
|
484
|
+
| <title> | <size> | <absorbs> findings | <verify> scenarios |
|
|
485
|
+
|
|
486
|
+
Reach is a prediction until those scenarios run again.
|
|
487
|
+
|
|
488
|
+
If `summary.observations` is non-empty, end with **Also worth knowing**: one bullet each, `Not walked: <title>` (coverage_gap) or `Risk: <title>` (feature_risk).
|
|
489
|
+
|
|
490
|
+
If `summary.setupNotes` is non-empty, add **Test setup** with one bullet each. These are doubts about the test, not the product (missing data, an account that cannot see enough, a date the scenario assumes). Offer the `iamu-stage` skill to fix the setup before the next run; a finding that rests on a setup doubt may not be real.
|
|
491
|
+
|
|
492
|
+
Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the scorecard scannable: the tables are the summary.
|
|
451
493
|
|
|
452
494
|
**Zero-Friction Triage Transition (Eliminate Meta-Prompt Gate):**
|
|
453
495
|
Do NOT prompt the user with a generic "How would you like to proceed?" multiple-choice modal. That intermediate prompt adds cognitive friction, duplicates the triage options, and obscures the assessment scorecard.
|
|
454
496
|
|
|
455
|
-
- **If
|
|
456
|
-
Output: "
|
|
497
|
+
- **If `summary.findings` is empty (no problems):**
|
|
498
|
+
Output: "No problems found in this run." The verdict above still stands on its own: a run without findings can still answer NO.
|
|
457
499
|
Do not enter triage.
|
|
458
500
|
|
|
459
|
-
- **If
|
|
501
|
+
- **If `summary.findings` is not empty:**
|
|
460
502
|
Output the Executive Scorecard above to chat FIRST, and advance IMMEDIATELY to triage on **Finding #1 of <total>** (Step 6 below) in the same turn. The user can choose to queue to fix, queue all remaining fixes (batch accept), dismiss, or discuss directly from Finding #1.
|
|
461
503
|
|
|
462
504
|
### 6. Conversational Triage & Guided Review
|
|
463
505
|
|
|
464
506
|
The conversation is the triage surface. Do NOT eject the user to manual CLI commands or dump them at file paths.
|
|
465
507
|
|
|
508
|
+
**Directions come first.** When the advisor proposed directions, offer them before going finding by finding, one at a time: what changes for the person, which findings it absorbs (in this and other scenarios), who it could hurt, and the size. The user chooses:
|
|
509
|
+
- **Take it**: `iamu directions set <slug> --status accepted`, then implement it (or hand it to planning when it is large). The findings it absorbs are fixed by the direction, not patched one by one.
|
|
510
|
+
- **Only the local fixes**: leave the direction `proposed` and triage its findings normally below.
|
|
511
|
+
- **Defer** (leave `proposed`) or **reject** (`iamu directions set <slug> --status rejected`; it will not be proposed again).
|
|
512
|
+
After a taken direction lands, mark it `done` and re-run the scenarios in its `verify` list, not only this one.
|
|
513
|
+
|
|
466
514
|
#### A. Guided One-by-One Review ("walk through them" / "review one by one")
|
|
467
515
|
When the user asks to review findings one by one:
|
|
468
516
|
1. **Present Finding #N in a scannable format (High Visual Hierarchy):**
|
|
@@ -472,7 +520,7 @@ When the user asks to review findings one by one:
|
|
|
472
520
|
```markdown
|
|
473
521
|
### Finding #<N>/<total> [<SEVERITY>] — <title>
|
|
474
522
|
> **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
|
|
475
|
-
> **Evidence:**
|
|
523
|
+
> **Evidence:** <run_dir>/screenshots/step-<N>.png · Cloud: <full https URL from iamu open <run-id> --print>
|
|
476
524
|
|
|
477
525
|
**❌ Problem:**
|
|
478
526
|
<What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
|
|
@@ -599,6 +647,7 @@ Run `iamu validate --all` to verify all entities before reporting done. If older
|
|
|
599
647
|
|
|
600
648
|
## Guidelines
|
|
601
649
|
|
|
650
|
+
- **Links a terminal can open.** Terminals open only what they can see. Write web addresses in full (`https://…`), never hidden behind link text, and files as absolute paths (the project root plus the path), never relative. Name scenarios, personas and findings by slug in backticks; they need no link.
|
|
602
651
|
- **Drafts bind in-line, not as a detour.** If the user picks a draft, the persona-bind step should feel like part of running — not a separate invocation.
|
|
603
652
|
- **All generation is local.** All generation — persona suggestions, brief — uses the local LLM directly. No server-side LLM calls.
|
|
604
653
|
- **Scenario vocabulary.** Say "scenario" — never "outline" — when addressing the user.
|
|
@@ -608,4 +657,4 @@ Run `iamu validate --all` to verify all entities before reporting done. If older
|
|
|
608
657
|
- **Validate before done.** Always run `iamu validate --all` after a walkthrough to catch any issues.
|
|
609
658
|
- **Use CLI for scaffolding.** `iamu start-run` for runs, `iamu new-finding` for findings, `iamu complete` for assembly. Never manually create run directories or generate UUIDs.
|
|
610
659
|
- **Step files:** Record steps via the CLI (`iamu browse step` or `iamu step`), which manages step numbering, screenshots, and atomic writes to `steps/001.json`.
|
|
611
|
-
- **Finding bodies:**
|
|
660
|
+
- **Finding bodies:** `iamu new-finding` writes the description; the recommendation is written by `iamu advise-record` (step C2), never by the walker.
|
|
@@ -21,9 +21,9 @@ $ARGUMENTS
|
|
|
21
21
|
|
|
22
22
|
Do NOT use `find`, `grep`, or `cat` to dump raw `.md` files in `iamu/`. The CLI outputs clean, validated data.
|
|
23
23
|
|
|
24
|
-
### 2. Format entity responses with an executive tally
|
|
24
|
+
### 2. Format entity responses with an executive tally
|
|
25
25
|
|
|
26
|
-
When the user asks for project status, lead with an executive tally banner, followed by compact 1-line bullet points
|
|
26
|
+
When the user asks for project status, lead with an executive tally banner, followed by compact 1-line bullet points that name entities by slug in backticks. Do not link entity files: a relative path opens nowhere in a terminal. Web addresses are written out in full.
|
|
27
27
|
|
|
28
28
|
**ANTI-BLOAT DIRECTIVE:** Do NOT output multi-column markdown tables (they wrap awkwardly and break borders in terminal viewports). Keep each entity to a single scannable line:
|
|
29
29
|
|
|
@@ -33,17 +33,17 @@ Product Map: <T> Surfaces (<R> Reached · <U> Unreached) [if explore map exis
|
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
**Personas:**
|
|
36
|
-
•
|
|
36
|
+
• `elin-dahl` — Elin Dahl · Architect & first-time house owner in Falun · active
|
|
37
37
|
|
|
38
38
|
**Scenarios:**
|
|
39
|
-
•
|
|
39
|
+
• `replacing-windows` — `elin-dahl` · outline: `measure-and-order` · ready
|
|
40
40
|
|
|
41
41
|
**Findings:**
|
|
42
|
-
• `1` [CRITICAL · hinders] Submit fails opaquely on empty field —
|
|
42
|
+
• `1` [CRITICAL · hinders] Submit fails opaquely on empty field — `<slug>`
|
|
43
43
|
|
|
44
44
|
**Awaiting Verification (Needs a Re-run):**
|
|
45
45
|
If `iamu status` reports fixes awaiting a re-run:
|
|
46
|
-
•
|
|
46
|
+
• `<scenario-slug>` — <N> fixes awaiting verification from a re-run (`iamu-run <scenario-slug>`)
|
|
47
47
|
|
|
48
48
|
**Product Map & Unreached Surfaces:**
|
|
49
49
|
If `iamu status --json` has `explore` data:
|
|
@@ -57,7 +57,7 @@ The directory `iamu/.prompts/` contains internal prompt templates (`persona.md`,
|
|
|
57
57
|
|
|
58
58
|
For a project-status question, add one line on the cloud from `iamu status --json` (`mode`, `sync`, `requests`) and `iamu auth status --json` (`authenticated`):
|
|
59
59
|
|
|
60
|
-
- **Linked** → `Cloud: linked —
|
|
60
|
+
- **Linked** → `Cloud: linked — <full https URL from iamu open --print>`, then only what needs action: unpushed changes (`sync.pending_new` + `sync.pending_updates` + `walkthroughs.pending`, and `sync.local_deletions.count`) → `iamu sync`; `requests.open` above zero → `<N> team requests — iamu-findings`.
|
|
61
61
|
- **Linked, no credentials** → `Cloud: linked, but this machine has no credentials — iamu auth login.`
|
|
62
62
|
- **Local-only** → `Cloud: local-only.` Nothing more; no upgrade pitch.
|
|
63
63
|
|