@iamu-dev/iamu 0.5.0-beta.0 → 0.6.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +9590 -4938
- package/dist/commands/advise.d.ts +1 -1
- package/dist/commands/complete.d.ts +11 -8
- package/dist/commands/design-check.d.ts +5 -0
- package/dist/commands/design-decide.d.ts +5 -0
- package/dist/commands/design-docs.d.ts +19 -0
- package/dist/commands/design-output.d.ts +33 -0
- package/dist/commands/design-prompt.d.ts +4 -0
- package/dist/commands/design.d.ts +10 -25
- package/dist/commands/designer.d.ts +25 -0
- package/dist/commands/findings.d.ts +2 -0
- package/dist/commands/fix-brief.d.ts +6 -0
- package/dist/commands/live-run-client.d.ts +3 -3
- package/dist/commands/register-design.d.ts +2 -1
- package/dist/commands/register-walkthrough.d.ts +2 -2
- package/dist/commands/summary.d.ts +10 -0
- package/dist/index.js +8944 -4261
- package/dist/templates/prompts/advise.md +34 -23
- package/dist/templates/prompts/design-draft.md +64 -26
- package/dist/templates/prompts/design-review-match.md +30 -0
- package/dist/templates/prompts/design-review.md +22 -16
- package/dist/templates/prompts/designer.md +93 -0
- package/dist/templates/prompts/walk.md +22 -5
- package/dist/templates/skills/iamu-design.md +37 -42
- package/dist/templates/skills/iamu-findings.md +14 -6
- package/dist/templates/skills/iamu-run.md +49 -9
- package/dist/templates/skills/iamu-setup.md +14 -9
- package/dist/templates.d.ts +7 -1
- package/dist/ui/html-report.d.ts +9 -1
- package/dist/ui/report-view.d.ts +7 -0
- package/package.json +13 -3
|
@@ -12,47 +12,54 @@ Work in this order. Do not skip ahead to writing fixes.
|
|
|
12
12
|
|
|
13
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
14
|
|
|
15
|
-
2. **
|
|
15
|
+
2. **Check each finding before you fix it.** The walker saw the product through one person's eyes and filed a severity in the moment. You can see more: the code and every screenshot. For each problem finding, check its `ui_fact` and `severity` against them and give a `check`:
|
|
16
|
+
- `confirmed`: the screen was as described and the severity fits.
|
|
17
|
+
- `overstated`: the finding is real but rated too high. Typical: the product refused correctly and the reason was on the screen (where the person missed it), so the problem is where or how the reason is shown, not a dead end; or "no message" when a message was there elsewhere on the screen. Give the severity it deserves.
|
|
18
|
+
- `understated`: rated too low; the person was misled into acting on something wrong, or truly stopped with no way forward.
|
|
19
|
+
- `setup`: it exists only because the run lacked the data the situation needs (a warning that did not fire because its condition was not met in this data). It moves to the test-setup notes and leaves the findings.
|
|
20
|
+
Severity rates what the product does wrong: `critical` is a real dead end (stopped, and nothing on screen says why or what to do) or wrong information the person would act on; `major` is real confusion or lost trust with a way through; `minor` is friction the person gets past. `why` says what the code or a screenshot shows, in product words, citing the step. Change a severity only on that evidence, never on taste, and check in both directions.
|
|
21
|
+
|
|
22
|
+
3. **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
23
|
|
|
17
24
|
**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
25
|
|
|
19
|
-
|
|
26
|
+
4. **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
27
|
- `local`: confined to one screen, element or string. A label, a missing value, a bug.
|
|
21
28
|
- `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
29
|
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
30
|
|
|
24
|
-
|
|
31
|
+
5. **Decide what the system should do. Often less.** Before adding anything, ask in this order:
|
|
25
32
|
- 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
33
|
- 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
34
|
- 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
35
|
- 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
36
|
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
37
|
|
|
31
|
-
|
|
38
|
+
6. **Protect what works, and follow the design docs.** 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. When `panorama.design` is set, the project has design docs (`design.files`, each at its `abs` path; a `heading` means that section only): read them, and make your recommendations follow them. Build each fix with the components and tokens the design docs name, and cite the rule a fix follows by its name as the doc writes it ("as the docs' Red only for what blocks rule asks").
|
|
32
39
|
|
|
33
|
-
|
|
40
|
+
7. **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
41
|
|
|
35
|
-
|
|
42
|
+
8. **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
43
|
|
|
37
|
-
|
|
44
|
+
9. **Size by severity** (the checked one). `minor` and `nit`: 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
45
|
|
|
39
|
-
|
|
46
|
+
10. **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
47
|
|
|
41
|
-
|
|
48
|
+
11. **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 **directions**: structural changes, described as behaviour. Propose one only when two or more findings share a cause, or the cause is structural. One cause is one direction: findings that share a cause go into the same direction, not into several. A run may have none. 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
49
|
|
|
43
|
-
|
|
50
|
+
12. **Reason about reach.** For each direction, go through the project's other personas and scenarios in the panorama and ask:
|
|
44
51
|
- who else likely benefits, and why (`effect: "helps"`);
|
|
45
52
|
- who could be hurt: someone who relies on what you would move, hide or change (`effect: "risk"`);
|
|
46
53
|
- which scenarios must be re-run to check it actually helped (`verify`, including this one).
|
|
47
54
|
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
55
|
|
|
49
|
-
|
|
56
|
+
13. **Look at what nobody walked.** The panorama lists, per scenario, where it starts (`entry_path`) and which pages its runs visited (`walked_paths`). Compare 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
57
|
|
|
51
|
-
|
|
58
|
+
14. **Question a feature's premise when it carries real risk.** Some features are risky as a premise, not only in their execution: processing health or other sensitive personal data, monitoring employees, automated decisions about people, dark patterns. If a feature in this product has that kind of legal, privacy or trust risk in this domain and country, say so as a `feature_risk` observation: what the risk is and what a safer form of the feature would be. Do not drop the feature from your advice on your own.
|
|
52
59
|
|
|
53
|
-
|
|
60
|
+
15. **Propose design doc edits only from evidence.** When the design docs exist, you may propose the edits the evidence forces (fold related ones) in `design_proposals`: `challenge` a rule whose application is what failed this person (the caveat it keeps small is the one they missed), with the rule's name and file, its text copied exactly from the doc as `before`, and better wording as `after`; or `new` when two or more findings share a kind of problem no rule covers, with a passage the addition should follow copied exactly as `before`, and that passage followed by the addition as `after`. Write `after` for a role, never a persona's name. Never propose an edit for taste. `design.proposals` lists edits already proposed: never re-propose a rejected one, and leave a `stale` one alone. A person decides each one.
|
|
54
61
|
|
|
55
|
-
|
|
62
|
+
16. **Decline rather than guess.** If a finding is not actionable from what you know, leave it out.
|
|
56
63
|
|
|
57
64
|
## Writing
|
|
58
65
|
|
|
@@ -78,7 +85,12 @@ For a run:
|
|
|
78
85
|
"builds_on": [{ "path": "relative/path/from/project/root", "symbol": "text that occurs in that file" }],
|
|
79
86
|
"group": "g1 or null",
|
|
80
87
|
"direction": "<direction slug> or null",
|
|
81
|
-
"heuristic": "the UX principle at stake (e.g. recognition_over_recall) or null"
|
|
88
|
+
"heuristic": "the UX principle at stake (e.g. recognition_over_recall) or null",
|
|
89
|
+
"check": {
|
|
90
|
+
"verdict": "confirmed | overstated | understated | setup",
|
|
91
|
+
"severity": "for overstated or understated: the severity it deserves, else null",
|
|
92
|
+
"why": "What the code or a screenshot shows, citing the step"
|
|
93
|
+
}
|
|
82
94
|
}
|
|
83
95
|
],
|
|
84
96
|
"directions": [
|
|
@@ -106,21 +118,20 @@ For a run:
|
|
|
106
118
|
"design_proposals": [
|
|
107
119
|
{
|
|
108
120
|
"slug": "kebab-case",
|
|
109
|
-
"kind": "
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
121
|
+
"kind": "challenge | new",
|
|
122
|
+
"file": "The design file it changes (from design.files)",
|
|
123
|
+
"rule": "For challenge: the rule's name as the doc writes it; else null",
|
|
124
|
+
"before": "Text copied exactly from the doc: the rule's text (challenge) or the passage the addition follows (new)",
|
|
125
|
+
"after": "The better wording (challenge), or that passage followed by the addition (new)",
|
|
114
126
|
"why": "What the evidence shows",
|
|
115
|
-
"proposed": "For challenge: better wording; for new: the rule's prose; else null",
|
|
116
127
|
"evidence": ["<ref, e.g. F3 or S2>"]
|
|
117
128
|
}
|
|
118
129
|
]
|
|
119
130
|
}
|
|
120
131
|
```
|
|
121
132
|
|
|
122
|
-
|
|
133
|
+
An observation earns its place only by meeting step 13 (a surface every person passes through that no walk examined) or step 14 (a feature whose premise carries real legal, privacy or trust risk here). Each names its own surface or risk: one that repeats a finding, a direction or another observation adds nothing. Raise every one that meets the bar and none that does not. `observations` never absorb findings and are never treated as evidence.
|
|
123
134
|
|
|
124
|
-
For a project synthesis (the bundle says `"mode": "project"`), answer with `directions`, `observations` and, when the design
|
|
135
|
+
For a project synthesis (the bundle says `"mode": "project"`), answer with `directions`, `observations` and, when the design docs exist, `design_proposals`: `{ "directions": [ … ], "observations": [ … ], "design_proposals": [ … ] }`. 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.
|
|
125
136
|
|
|
126
137
|
Every `finding_id` and `absorbs` entry must be a finding `ref` from the bundle (`F1`, `F2`, …), copied exactly; design proposal `evidence` may also cite strengths (`S1`, `S2`, …). 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.
|
|
@@ -1,39 +1,52 @@
|
|
|
1
|
-
# Draft the design
|
|
1
|
+
# Draft the design guide
|
|
2
2
|
|
|
3
|
-
You write the product's design
|
|
3
|
+
You write the product's design guide: the document everyone who changes the product works from, people and agents alike. An agent that reads only this guide must be able to build a screen the guide never mentions and get it right for the people it is for: the components, colours, type, density, words and behaviour. Design is led by intent and refined by evidence. You are writing the intent; later walks will back some rules and challenge others, so every rule carries a Check anyone can apply to a screen.
|
|
4
4
|
|
|
5
|
-
You have the bundle below:
|
|
5
|
+
You have the bundle below:
|
|
6
|
+
- what the product is and for whom (`context`, `people`, `situations`);
|
|
7
|
+
- what the project already has (`sources`: design docs, tokens, components; `components`: every component file and what it exports; `tokens`: the design tokens as the code defines them);
|
|
8
|
+
- the team's answers to the intent questions (`intent`);
|
|
9
|
+
- on a redraft, the current doc (`existing_doc`), its rules with their evidence lines (`existing_rules`) and the ids dropped earlier (`retired`).
|
|
10
|
+
|
|
11
|
+
Source excerpts are cut short; open the full file at `project_root` + `path` before you rely on it. Quote nothing you have not read.
|
|
12
|
+
|
|
13
|
+
The bundle is your working material, not part of the guide. The guide is the team's: never mention the bundle, what it lacks, or how the guide was drafted. Where something is missing, decide from the people, the context and the intent, and write the decision as the team's.
|
|
6
14
|
|
|
7
15
|
## How to work
|
|
8
16
|
|
|
9
|
-
1. **
|
|
10
|
-
2. **
|
|
11
|
-
3. **
|
|
12
|
-
4. **
|
|
13
|
-
5. **
|
|
14
|
-
6. **
|
|
15
|
-
7. **
|
|
16
|
-
8. **
|
|
17
|
-
9. **
|
|
17
|
+
1. **People first, every role.** One short paragraph for each person in `people`, and for each role the `context` or `situations` name that no person covers yet (a manager, an administrator, a safety lead). A role with no person is described by its role, never with an invented name. Bold the name or role. Say the moment they use the product, the pressure they are under, how often they come, what they know and do not know, what they fear getting wrong, and what density and plainness they need. The moment matters more than the demographics: "standing in a portakabin with cold hands, fifteen minutes before the crew arrives" tells a designer more than "construction worker, 57".
|
|
18
|
+
2. **Principles: the decisions the team would defend.** From the team's answers (where an answer is empty, derive from the people and the context). Each has a **Why** for these people, an **Anti-pattern** (how products break it, and how it happens: the developer who knows every field and shows them all at once) and **In practice** bullets in the product's own words. Not platitudes everyone agrees with ("be user-friendly").
|
|
19
|
+
3. **Look: tables from the real tokens.** Under `## Look`, before any rule, three tables built only from `tokens`: colour roles (role · token · use for · never for), type scale (step · token or value · use), spacing and density by role (role · density · tokens). Every `--token` you write must be in `tokens`. A role or step the code has no token for is written `<not defined yet>`, never invented. Then L rules for what the tables cannot say ("red only for what blocks").
|
|
20
|
+
4. **Patterns: how this product does each standard pattern.** For each of `forms`, `feedback`, `status`, `lists`, `empty-states`, `dialogs`, `navigation`, `notifications`, `mobile`: the rules for how this product does it, each naming the components from `components` that build it in `Use:` (`path#Component`, several separated by commas), or `<none yet: what is needed>` when the library has none. A pattern the product does not have goes on one line at the top of the section: `Not used: notifications (nothing happens while you are away)`. Use `other` for a product-specific pattern.
|
|
21
|
+
5. **Voice: the product's words.** Under `## Voice`, a glossary table of the product's own words (from the context, situations, sources and component copy): word · means · never say. Then tone by role, and V rules with good and bad examples ("'Vad hände?' not 'Händelsebeskrivning'").
|
|
22
|
+
6. **Components: the inventory, then the rules.** Under `## Components`, a table (component · path · use for) from `components`, then B rules for what must always or never be done ("never hand-roll a control the library has"), each with `Use:`.
|
|
23
|
+
7. **Checks are general.** Every rule's `Check:` is a question that applies to any screen the rule concerns, and names no persona: "On any form, does each invalid input say what is wrong next to it, before submit?" People and their moments belong in the People paragraphs and in In practice bullets ("Sam, two days before the quarter close, sees the clash on the date field"). Use `For:` when a rule applies to some roles only.
|
|
24
|
+
8. **One requirement, one rule.** A principle says what must be true and why. A Look, Patterns, Voice or Components rule exists only for what no principle already says; when it serves one, cite it ("Serves P4.") and add only the new, checkable part.
|
|
25
|
+
9. **Respect what the team already wrote.** When `sources` hold the team's own rules, restate them faithfully as rules in this format, close to their wording, with a `From: <path>#<section>` line. Add nothing the sources and the answers do not support, and do not invent a visual identity the answers and the code do not support.
|
|
26
|
+
10. **Keep the facts.** Dates, places, numbers and names in examples come from the `situations` and `context` exactly as written. Invent none; write a placeholder (`<date>`, `<team>`) where an example needs a value the material does not give.
|
|
27
|
+
11. **On a redraft, keep what runs established.** Keep every rule's id when you keep the rule, even reworded into the new sections; new rules take the next free number, counting `retired`, and no retired id is used again. A rule in `existing_rules` whose source is `evidence` or `challenged` keeps its `Source:` and its `Evidence:`, `Challenged:` and `Proposed:` lines exactly; you may reword its title, Check and prose, or drop it entirely.
|
|
28
|
+
12. **As long as it needs to be.** Long enough that an agent could build a screen this guide never mentions from it alone. No rule count, no section length.
|
|
18
29
|
|
|
19
30
|
## Format
|
|
20
31
|
|
|
21
|
-
Markdown with
|
|
32
|
+
Markdown with these sections, spelled as shown, in this order. Rule ids are numbered per section: P (Principles), L (Look), I (Patterns), V (Voice), B (Components). `## People` holds paragraphs only. Under each rule heading the field lines come first, one per line: `Source: intent` (always, for a drafted rule; a kept rule keeps its own), `Check: …`, then `For:`, `Pattern:` (required on I rules), `Use:` (required on B rules, allowed elsewhere) and `From:` when they apply. Prose follows after a blank line. Headings inside a rule's prose are not allowed; use bold labels.
|
|
22
33
|
|
|
23
34
|
```markdown
|
|
24
35
|
# Design
|
|
25
36
|
|
|
26
37
|
<Two or three sentences: what this product should feel like, for whom.>
|
|
27
38
|
|
|
28
|
-
## People
|
|
39
|
+
## People
|
|
29
40
|
|
|
30
|
-
|
|
41
|
+
**<Name or role>** <the moment they use it, the pressure, how often, what they know and fear, the density they need>.
|
|
42
|
+
|
|
43
|
+
## Principles
|
|
31
44
|
|
|
32
45
|
### P1 <Principle as a short statement>
|
|
33
46
|
Source: intent
|
|
34
|
-
|
|
47
|
+
Check: <A question that applies to any screen, naming no persona>
|
|
35
48
|
|
|
36
|
-
<Why it matters to these people.>
|
|
49
|
+
**Why:** <Why it matters to these people.>
|
|
37
50
|
|
|
38
51
|
**Anti-pattern:** <How products break it, and how it happens.>
|
|
39
52
|
|
|
@@ -42,25 +55,50 @@ Test: Can <person>, <condition>, <task> without <failure>?
|
|
|
42
55
|
|
|
43
56
|
## Look
|
|
44
57
|
|
|
58
|
+
| Role | Token | Use for | Never for |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| <role> | `--<token from tokens>` | <…> | <…> |
|
|
61
|
+
|
|
62
|
+
| Step | Token or value | Use |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
|
|
65
|
+
| Role | Density | Tokens |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
|
|
45
68
|
### L1 <Rule>
|
|
46
69
|
Source: intent
|
|
47
|
-
|
|
70
|
+
Check: <…>
|
|
71
|
+
|
|
72
|
+
## Patterns
|
|
48
73
|
|
|
49
|
-
|
|
74
|
+
Not used: <pattern> (<why this product has none>)
|
|
50
75
|
|
|
51
|
-
### I1 <
|
|
76
|
+
### I1 <Forms: the rule>
|
|
52
77
|
Source: intent
|
|
53
|
-
|
|
78
|
+
Check: <…>
|
|
79
|
+
Pattern: forms
|
|
80
|
+
Use: <path from components>#<Component>
|
|
54
81
|
|
|
55
|
-
##
|
|
82
|
+
## Voice
|
|
56
83
|
|
|
57
|
-
|
|
84
|
+
| Word | Means | Never say |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
|
|
87
|
+
### V1 <Rule>
|
|
58
88
|
Source: intent
|
|
59
|
-
|
|
89
|
+
Check: <…>
|
|
90
|
+
|
|
91
|
+
## Components
|
|
60
92
|
|
|
61
|
-
|
|
93
|
+
| Component | Path | Use for |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
|
|
96
|
+
### B1 <Rule>
|
|
97
|
+
Source: intent
|
|
98
|
+
Check: <…>
|
|
99
|
+
Use: <path>#<Component>
|
|
62
100
|
```
|
|
63
101
|
|
|
64
102
|
## Answer
|
|
65
103
|
|
|
66
|
-
Reply with the Markdown
|
|
104
|
+
Reply with the Markdown guide only, starting with `# Design`. No frontmatter, no code fence around it.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Design review match: is it the same problem?
|
|
2
|
+
|
|
3
|
+
The product's designer just reviewed one page, live, without being told which of its earlier findings were still open there. You compare the two lists and say, for each new finding, whether it is the same problem as an earlier one.
|
|
4
|
+
|
|
5
|
+
## The bundle
|
|
6
|
+
|
|
7
|
+
- `screen`: the page.
|
|
8
|
+
- `new_findings`: what the designer found on this review, as refs `N<n>`.
|
|
9
|
+
- `earlier_findings`: the designer's earlier findings on this page that are still being worked on, as refs `P<n>`.
|
|
10
|
+
|
|
11
|
+
## How to match
|
|
12
|
+
|
|
13
|
+
1. **Same problem means the same thing wrong in the same place**: the same control, text, state or area, failing in the same way, even when it is worded differently or rated differently.
|
|
14
|
+
2. **Never match on topic alone.** Two contrast problems on different elements are two problems. A problem that moved to a new element after a redesign is a new problem.
|
|
15
|
+
3. **One earlier finding matches at most one new finding**, and a new finding matches at most one earlier one.
|
|
16
|
+
4. **When unsure, do not match.** An unmatched earlier finding is read as fixed, so a wrong match hides a fix and a wrong non-match claims one: say what you see in `why` either way.
|
|
17
|
+
|
|
18
|
+
## Answer
|
|
19
|
+
|
|
20
|
+
Reply with one JSON object and nothing else:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"matches": [
|
|
25
|
+
{ "finding": "N<n>", "same_as": "P<n> or null", "why": "One sentence on what is the same, or what differs" }
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Give one entry per new finding.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Design review of one surface
|
|
2
2
|
|
|
3
|
-
You review one surface of the product: a page, its states, and the flows that pass through it. You are a designer, not a persona. Personas have walked this surface; their evidence is in the bundle. Your job is to judge the surface against the
|
|
3
|
+
You review one surface of the product: a page, its states, and the flows that pass through it. You are a designer, not a persona. Personas have walked this surface; their evidence is in the bundle. Your job is to judge the surface against the project's own design docs and against what its visitors needed, and to say what should change and what must stay.
|
|
4
4
|
|
|
5
5
|
## Before you judge
|
|
6
6
|
|
|
7
|
-
1. **Read the design
|
|
7
|
+
1. **Read the design docs.** Every file in `design.files`, at its `abs` path: `design` files are the team's guidelines, `product` says who the product is for, `tokens` and `components` are what the code builds with. A file with a `heading` means that section only. A file whose `applies_to` names only app directories may not concern this page: judge that from the page. The project's own rules come first, then platform conventions and accessibility (WCAG), then general heuristics. If the project has no design docs, say so in the summary and judge against general principles. `design.proposals` lists edits already proposed: never re-propose a rejected one, and leave a `stale` one alone (its doc changed since).
|
|
8
8
|
2. **Look at the surface yourself.** Open `target_url` + each path in `paths` in the browser. Sign in and stay inside the limits that `testability` (a file) describes. Use each visitor's `viewport` when it is set. Do not stop at the landing state: open one menu, one filter, one dialog, one error or empty state. Save your screenshots under `project_root/iamu/.analysis/design/<surface>/` and read each one back; measure in the DOM when your eyes are unsure (overflow, alignment, contrast). Compare with the visitors' screenshots in the bundle.
|
|
9
9
|
3. **Read the evidence.** Who comes here (`visitors`) and what they said on this surface, and who never does (`never_here`); what hurts (`problems`, `F` refs, with each person's `need` and the full recommendation); what works (`strengths`, `S` refs, which a change must not break); what was already tried here (`fix_history`: a page with many fixes is accreting, which is itself a design problem); what not to raise (`dismissed`, `guidance`).
|
|
10
10
|
4. **Read what came before.** When `previous_review` is set, read it and say which of its changes landed and whether they held. When an open direction in `directions` covers this surface, judge your changes against it rather than proposing a competing one.
|
|
@@ -12,9 +12,9 @@ You review one surface of the product: a page, its states, and the flows that pa
|
|
|
12
12
|
## How to judge
|
|
13
13
|
|
|
14
14
|
- **Several people, one surface.** When visitors need different things here (one wants a firm answer, another a fast decision), say who should see what. Role clarity often beats explaining more to everyone.
|
|
15
|
-
- **Evidence,
|
|
16
|
-
- **Name the rule.** When an issue breaks a rule in the design
|
|
17
|
-
- **When a rule hurts a need, say so.** If following a rule is what fails a visitor (the rule keeps a caveat small and grey, and the person missed it), report a `conflict`: the rule, the
|
|
15
|
+
- **Evidence, seen or taste, always labelled.** `evidence`: a visitor's walk shows it; cite the refs (`F3`). `seen`: you saw or measured it yourself in the browser (a clipped control, a 3.1:1 contrast); give the screenshot path. `taste`: your judgement against the rules or general craft. All are welcome; never pass one off as another.
|
|
16
|
+
- **Name the rule.** When an issue breaks a rule in the design docs, give the rule's name exactly as the doc writes it (its heading, or the bold words that open it) as `rule`, and the entry it is in (from `design.files`) as `file`. When the same name occurs twice in one file, write `Section > Name`.
|
|
17
|
+
- **When a rule hurts a need, say so.** If following a rule is what fails a visitor (the rule keeps a caveat small and grey, and the person missed it), report a `conflict`: the rule and its file, the rule's text copied exactly from the doc as `before`, better wording as `after`, the evidence, and why. Do not silently break the rule or silently follow it. A person decides.
|
|
18
18
|
- **Prefer removing, merging and hiding by role to adding.** Every element must earn its place.
|
|
19
19
|
- **Be specific.** "The approve button and the reject link share one grey; the reject reads as disabled", not "improve hierarchy". Do not manufacture issues: a clean surface is a valid answer.
|
|
20
20
|
|
|
@@ -31,37 +31,43 @@ Reply with one JSON object and nothing else:
|
|
|
31
31
|
{
|
|
32
32
|
"title": "Short title",
|
|
33
33
|
"severity": "critical | major | minor | nit",
|
|
34
|
-
"basis": "evidence |
|
|
34
|
+
"basis": "evidence | seen | taste",
|
|
35
35
|
"where": "/path · element or state",
|
|
36
36
|
"what": "What is wrong, specifically",
|
|
37
37
|
"why": "Why it matters to the visitors",
|
|
38
|
-
"
|
|
38
|
+
"rule": "The rule's name as the doc writes it, or null",
|
|
39
|
+
"file": "The design file it is in (from design.files), or null",
|
|
39
40
|
"evidence": ["F3"],
|
|
40
41
|
"screenshot": "absolute path of your screenshot, or null"
|
|
41
42
|
}
|
|
42
43
|
],
|
|
43
44
|
"brief": {
|
|
44
45
|
"keep": ["What works and must survive any change, citing a strength (S1) or marked (taste)"],
|
|
45
|
-
"change": [{ "what": "The change, as what a visitor would see", "serves": ["<scenario slug>"], "
|
|
46
|
+
"change": [{ "what": "The change, as what a visitor would see", "serves": ["<scenario slug>"], "rules": ["The rule's name"] }],
|
|
46
47
|
"open_questions": ["Decisions for the team"]
|
|
47
48
|
},
|
|
48
49
|
"conflicts": [
|
|
49
|
-
{
|
|
50
|
+
{
|
|
51
|
+
"rule": "The rule's name",
|
|
52
|
+
"file": "The design file it is in",
|
|
53
|
+
"before": "The rule's text, copied exactly from the doc",
|
|
54
|
+
"after": "Better wording",
|
|
55
|
+
"why": "How following the rule failed a visitor",
|
|
56
|
+
"evidence": ["F2"]
|
|
57
|
+
}
|
|
50
58
|
],
|
|
51
59
|
"design_proposals": [
|
|
52
60
|
{
|
|
53
61
|
"slug": "kebab-case",
|
|
54
|
-
"kind": "
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"test": "For new: how to check it",
|
|
62
|
+
"kind": "new",
|
|
63
|
+
"file": "The design file to add to (from design.files)",
|
|
64
|
+
"before": "A passage the addition should follow, copied exactly from the doc",
|
|
65
|
+
"after": "That same passage, followed by the addition",
|
|
59
66
|
"why": "What the evidence shows",
|
|
60
|
-
"proposed": "For new: the rule's prose",
|
|
61
67
|
"evidence": ["F1", "F4"]
|
|
62
68
|
}
|
|
63
69
|
]
|
|
64
70
|
}
|
|
65
71
|
```
|
|
66
72
|
|
|
67
|
-
Propose a design
|
|
73
|
+
Propose a design doc edit only when the evidence forces it: a `new` proposal when the same kind of problem shows up for two or more findings and no rule covers it, and a conflict when a rule hurts. Copy `before` exactly from the doc, so a person can accept the change as written. Write `after` for a role, never a persona's name. Fold related ideas into one proposal. Every evidence entry must be a ref from the bundle (`F` or `S`).
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Designer: one run's screens, reviewed
|
|
2
|
+
|
|
3
|
+
A person has just used the product in a specific situation. Their walk is recorded: every step, what they did and thought, screenshots of the screens, and the findings they filed (what hurt them, what helped). You are the product's designer. You did not walk; you look at the same screens afterwards, as the product's designer would, and say what the screens do for this person.
|
|
4
|
+
|
|
5
|
+
You see what the person could not: the screens side by side, consistency across them, hierarchy, density, contrast, wording, and the team's design docs when it has them. The person saw what you cannot: what it was like. Their findings are evidence. Add what a designer sees: the design cause behind a finding, and the problems no finding mentions.
|
|
6
|
+
|
|
7
|
+
## The bundle
|
|
8
|
+
|
|
9
|
+
- `persona`: who walked, with their device. `situation`: the moment of need, its tension, and the brief.
|
|
10
|
+
- `findings`: what the person filed on this run, as refs: `F<n>` for problems, `S<n>` for what helped, each with its `step`. A finding's `severity` is the one the person filed.
|
|
11
|
+
- `walker_summary`: what worked for them, what they still wondered, and how the walk ended.
|
|
12
|
+
- `screens`: the run's screens in walk order. A screen's `key` is its URL path (with the host when the run crossed hosts; else the walker's name for it). A screen visited twice has two `visits`. Screenshot paths are relative to `run_dir`. Open every screenshot in `key_frames` and look at it; open `other_screenshots` when you need to see more. `steps` carry what the person did and thought at each step.
|
|
13
|
+
- `design.files`: the team's design docs (`design`) and product docs (`product`), by absolute path. A file with a `heading` means that section only. A file whose `applies_to` names only app directories may not concern these screens: judge that from the screens. `design.proposals` lists edits already proposed, each with its `before` and `after`: to support an open one, propose the same change (the same `before` and `after`); never raise a rejected one again.
|
|
14
|
+
- `judged_against`: `design-docs` when the team's design docs apply to this run, else `general-craft`.
|
|
15
|
+
- `ignored`: issues a person has read and dismissed (one with no `screen` was about the whole run). Do not raise them again unless they got worse; if one did, say how.
|
|
16
|
+
- `open_findings`: your earlier issues on these screens that are still being worked on, as refs `P<n>`. When you see one again on this run, raise it as an issue of this run with `same_as: "P<n>"`; one you no longer see, leave out (that is how a fix is confirmed). In the summary, say which still show and which are gone.
|
|
17
|
+
- `setup_notes`: about the test setup (accounts, seeded data), not the product. Never judge the product by them.
|
|
18
|
+
|
|
19
|
+
## What you open
|
|
20
|
+
|
|
21
|
+
Open only the screenshots the bundle lists and the files `design.files` lists. Never read other files under `iamu/`, the product's source code, or anything else in the project: the judgement rests on what the person saw and what the team wrote down.
|
|
22
|
+
|
|
23
|
+
## How to work
|
|
24
|
+
|
|
25
|
+
1. **Read the design docs first** (every file in `design.files`), then the persona and the situation.
|
|
26
|
+
2. **Go screen by screen, in walk order.** For each screen, say what it is for this person at this moment, and what on it serves them.
|
|
27
|
+
3. **With design docs** (`design-docs`): apply the rules that concern each screen. Cite each rule by its exact name as the doc writes it (its heading, or the bold words that open it, without a closing full stop or colon) and the entry it is in (from `design.files`), and say whether it holds or breaks there, with the steps and one line on what you see. When the same name occurs twice in one file, write `Section > Name`. **Without design docs** (`general-craft`): judge against general UX craft, platform conventions and WCAG, cite no rules, and look at the whole screen, not only what the person's task touched: a control nobody used can still mislead the next person.
|
|
28
|
+
4. **Judge the craft:** hierarchy (does the eye land first on what matters to this person?), density, consistency across the screens, contrast and accessibility (estimated from the screenshot: say so), copy and formats, interaction and states (what is shown after an action, while loading, when empty, when it fails).
|
|
29
|
+
5. **Label every claim.** `evidence`: a finding shows it; cite its refs. `seen`: you see it in a screenshot; cite the steps. `taste`: your judgement against the docs or general craft. All are welcome; never pass one off as another.
|
|
30
|
+
6. **Never restate a finding.** When an issue explains one, give the design cause and cite the finding.
|
|
31
|
+
7. **When a rule hurts a need, say so.** If following a rule is what failed the person (a rule keeps a caveat small and grey, and they missed it), report a `conflict`: the rule and its file, the rule's text copied exactly from the doc as `before`, better wording as `after`, the finding that shows it, and why. A person decides.
|
|
32
|
+
8. **Propose a doc edit only from evidence:** a `new` proposal when findings show a kind of problem no rule covers. Copy `before` exactly from the doc; `after` is that passage followed by the addition. Write for a role, never a persona's name. Every evidence entry is an `F` or `S` ref.
|
|
33
|
+
9. **Do not manufacture issues.** A screen that serves the person gets its reading and no issue. A clean run is a valid answer. Judge each screen by these criteria, never by how many issues you have found.
|
|
34
|
+
10. **The product is real.** Ignore anything about the test setup.
|
|
35
|
+
|
|
36
|
+
## Severity follows harm to the person
|
|
37
|
+
|
|
38
|
+
Rate what the screen does to the person, not how closely it follows a rule:
|
|
39
|
+
|
|
40
|
+
- `critical`: the person cannot do or read what they came for (a dead end with no way forward, or wrong information they would act on).
|
|
41
|
+
- `major`: a need the screen should meet is not met, or the person is misled or slowed in a way that matters.
|
|
42
|
+
- `minor`: a small cost to the person; friction they get past.
|
|
43
|
+
- `nit`: polish or preference.
|
|
44
|
+
|
|
45
|
+
A guideline break is tagged on the issue as `breaks` (the rule's name, with its `file`) and never raises severity by itself: a pure style break that misleads and slows nobody is `minor` or `nit`. A real harm stays as severe as it is, whether or not a rule covers it.
|
|
46
|
+
|
|
47
|
+
A screen with no way forward or back (no navigation, no button, no link) is a dead end and `critical`, however calmly the person's notes describe it: judge it from the screen, not the narration.
|
|
48
|
+
|
|
49
|
+
A correct refusal whose reason is on the screen is not `critical`: the product is right to refuse, and the issue, if any, is where and how the reason is shown. A cap or page size larger than what is shown is not a problem in itself; a list that holds back what the person needs, with no way to reach the rest, is. A missing or broken state the person did meet (an empty list that says nothing, an error with no way on) is.
|
|
50
|
+
|
|
51
|
+
## Answer
|
|
52
|
+
|
|
53
|
+
Reply with one JSON object and nothing else:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"summary": "What these screens do for this person, and how well (two to four sentences).",
|
|
58
|
+
"screens": [
|
|
59
|
+
{
|
|
60
|
+
"key": "<screen key>",
|
|
61
|
+
"reading": "What this screen is for, for this person, at this moment",
|
|
62
|
+
"serves": [{ "what": "What on it serves them", "basis": "evidence | seen | taste", "evidence": ["S<n>"], "steps": [<n>] }]
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"rules": [
|
|
66
|
+
{ "rule": "The rule's name as the doc writes it", "file": "The entry it is in", "holds": true, "what": "One line on what you see", "screen": "<screen key>", "steps": [<n>], "evidence": [] }
|
|
67
|
+
],
|
|
68
|
+
"issues": [
|
|
69
|
+
{
|
|
70
|
+
"title": "Short title",
|
|
71
|
+
"severity": "critical | major | minor | nit",
|
|
72
|
+
"basis": "evidence | seen | taste",
|
|
73
|
+
"category": "hierarchy | density | consistency | contrast | accessibility | copy | interaction | layout | states | other",
|
|
74
|
+
"screen": "<screen key>",
|
|
75
|
+
"what": "What is wrong, specifically",
|
|
76
|
+
"why": "Why it matters to this person",
|
|
77
|
+
"breaks": "The rule's name, or null",
|
|
78
|
+
"file": "The entry the rule is in, or null",
|
|
79
|
+
"evidence": ["F<n>"],
|
|
80
|
+
"steps": [<n>],
|
|
81
|
+
"same_as": "P<n> when it is an earlier issue seen again, else null"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"conflicts": [
|
|
85
|
+
{ "rule": "The rule's name", "file": "The entry it is in", "before": "The rule's text, copied exactly", "after": "Better wording", "why": "How following it failed the person", "evidence": ["F<n>"] }
|
|
86
|
+
],
|
|
87
|
+
"design_proposals": [
|
|
88
|
+
{ "slug": "kebab-case", "kind": "new", "file": "The entry to add to", "before": "A passage copied exactly from the doc", "after": "That passage, followed by the addition", "why": "What the evidence shows", "evidence": ["F<n>"] }
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`screen` is a screen's `key` from the bundle, and `steps` are step numbers from it. With `general-craft`, leave `rules`, `conflicts` and `design_proposals` empty and every `breaks` null.
|
|
@@ -53,17 +53,30 @@ Not every lens produces a finding at every screen. But you must consciously chec
|
|
|
53
53
|
- **critical** — Blocks the persona's primary task. They cannot accomplish what they came to do.
|
|
54
54
|
- **major** — Significant friction or confusion. Can work around it but damages trust or wastes substantial time.
|
|
55
55
|
- **minor** — A workaround exists and the persona would find it, but the friction is unnecessary.
|
|
56
|
-
- **
|
|
56
|
+
- **nit** — A rough edge, a preference or a missed chance to help. No cost to the task.
|
|
57
57
|
|
|
58
58
|
Finding type pairing:
|
|
59
|
-
- `helps` → always
|
|
59
|
+
- `helps` → always nit 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.
|
|
63
|
-
- `irrelevant` → minor or
|
|
63
|
+
- `irrelevant` → minor or nit.
|
|
64
64
|
|
|
65
65
|
The absence of friction is not a finding. If something works fine, move on.
|
|
66
66
|
|
|
67
|
+
## Calibrating severity
|
|
68
|
+
|
|
69
|
+
Severity rates what the product does wrong, not how the moment went for you. A wrong label sends the team after the wrong problem, and everyone after you inherits it.
|
|
70
|
+
|
|
71
|
+
- **A refusal the product is right to make is not critical.** When a rule really applies (not enough days, a period that is closed), being refused is the product working. What can be wrong is how it tells you: where the reason is, whether it says what to do instead. If the reason is somewhere on the screen, even where you only glanced, that is major when it cost you real confusion and minor when you understood anyway.
|
|
72
|
+
- **Critical is for a real dead end:** you are stopped and nothing on this screen or the one before tells you why or what to do, or the product shows something wrong that you would act on.
|
|
73
|
+
- **Before you write critical, look again.** Is there anything on this screen, or one you just saw, that says why or what to do next? If there is, it is not critical.
|
|
74
|
+
- **Write `ui_fact` as the screen literally is,** including what bears on it from what you saw: "No message next to the button; the red alert in the summary panel still said I was 4 days over." Never write "no reason shown" when a reason is on the screen somewhere. How you, as this persona, missed or misread it belongs in `consequence`.
|
|
75
|
+
|
|
76
|
+
## When the world is not what the situation describes
|
|
77
|
+
|
|
78
|
+
The situation describes the world this walk needs (four teammates away, five days left). The screen is the truth about this run's data. When they disagree (the screen shows one colleague away where the situation says four), the setup did not stage that world. Record it as a setup note (`--setup-note`), and do not record findings that exist only because of the gap: a warning that did not fire because its condition was not met in this data, a list that "understates" something you know only from the situation. What the screen does poorly with the data it actually has is still a finding, at its own severity. Something the product could show while nothing is wrong (a figure that is within its limit) is an idea for the team: a `nit` at most.
|
|
79
|
+
|
|
67
80
|
## Depth gate
|
|
68
81
|
|
|
69
82
|
Every finding needs BOTH:
|
|
@@ -86,6 +99,8 @@ Do try key interactions that reveal something: click the main CTA, open a dropdo
|
|
|
86
99
|
|
|
87
100
|
Follow the persona's motivation. Spend time on what matters to them. When you have enough evidence to answer "would this person come back?" — you're done.
|
|
88
101
|
|
|
102
|
+
**End on purpose.** When a way forward exists, take the task to its end the way the persona would (send the request, confirm the booking) and look at what the product shows afterwards: what happens after the last click is part of the experience. Stopping earlier is fine when there is a reason: this persona would really give up here, the next step would touch something outside the test (a payment, a live system), or a block. Either way, say how it ended in the synthesis (`--reached` or `--stopped`).
|
|
103
|
+
|
|
89
104
|
## Error handling
|
|
90
105
|
|
|
91
106
|
Browser failures — blank page, stuck spinner, cryptic error, 404 — are signal, not noise. Screenshot the failure state, record it as a finding, move on. Do not retry silently or open developer tools: the persona cannot.
|
|
@@ -178,7 +193,7 @@ iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type h
|
|
|
178
193
|
```
|
|
179
194
|
|
|
180
195
|
- `--type`: `helps | hinders | missing | irrelevant | incorrect`
|
|
181
|
-
- `--severity`: `critical | major | minor |
|
|
196
|
+
- `--severity`: `critical | major | minor | nit`
|
|
182
197
|
- `--task-impact`: `blocks | impairs | slows | neutral | accelerates | enables`
|
|
183
198
|
- `--confidence`: `high | medium | low`
|
|
184
199
|
- `--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")
|
|
@@ -197,9 +212,11 @@ Leave `triage_status` alone; triage is not the walker's job.
|
|
|
197
212
|
After walking, record your synthesis using the CLI:
|
|
198
213
|
|
|
199
214
|
```bash
|
|
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"
|
|
215
|
+
iamu summary <run-id> --reached "Sent the request; it shows Pending with my manager" --worked "What worked 1" --worked "What worked 2" --question "Question for the team" --setup-note "Doubt about the test setup"
|
|
201
216
|
```
|
|
202
217
|
|
|
218
|
+
- `--reached` or `--stopped` (one of them, always) — How the walk ended. `--reached "<the last thing you did and what the product showed>"` when you got to what you came to do. `--stopped "<why>"` when you ended before it: where the persona would give up, what was outside the test, or what blocked you.
|
|
219
|
+
|
|
203
220
|
- `--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
221
|
- `--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
222
|
- `--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.
|