@iamu-dev/iamu 0.4.0-beta.0 → 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.
@@ -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 sparingly — only when the product actively supports the persona in a way that would be missed if removed.
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.
@@ -197,10 +197,11 @@ Leave `triage_status` alone; triage is not the walker's job.
197
197
  After walking, record your synthesis using the CLI:
198
198
 
199
199
  ```bash
200
- iamu summary <run-id> --worked "What worked well 1" --worked "What worked well 2" --question "Open question 1"
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"
201
201
  ```
202
202
 
203
- - `--worked` — Things the system did well for this persona. Important to preserve.
204
- - `--question` — Questions that arose that need discussion.
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.
205
206
 
206
207
  Then return your final summary to the orchestrating agent so it can run `iamu complete` and the evaluation stage.
@@ -125,7 +125,7 @@ Format the visible finding in chat:
125
125
  ```markdown
126
126
  ### Finding #<N>/<total> [<SEVERITY>] — <title>
127
127
  > **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
128
- > **Evidence:** [step-<N>.png](iamu/.runs/<run>/screenshots/step-<N>.png) · [View in Cloud Walkthrough](<url from iamu open <run-id> --print>)
128
+ > **Evidence:** <project root>/iamu/.runs/<run>/screenshots/step-<N>.png · Cloud: <full https URL from iamu open <run-id> --print>
129
129
 
130
130
  **❌ Problem:**
131
131
  <What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
@@ -223,15 +223,14 @@ dismissed (not_relevant): <finding-slug>
223
223
 
224
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.
225
225
 
226
- When all findings in the queue are triaged, present the summary:
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:
227
227
 
228
- ```text
229
- Triage complete.
230
- Queued for fix: <N>
231
- Dismissed: <N>
232
- Rescoped (design change / defer): <N>
233
- Kept open: <N>
234
- ```
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 |
235
234
 
236
235
  If `<N> > 0` findings were queued for fix:
237
236
  - Prompt the user:
@@ -273,12 +272,13 @@ Report it in one line: `Synced <N> findings to Iamu Cloud.` If the result has `c
273
272
 
274
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):
275
274
 
276
- > ☁️ **Cloud Walkthrough:** [Open in Iamu Cloud](<url from iamu open --print>)
275
+ > ☁️ **Cloud:** <full https URL from iamu open --print>
277
276
 
278
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.
279
278
 
280
279
  ## Guidelines
281
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.
282
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.
283
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.
284
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 clickable file links and exact run commands:
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: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md)
260
- • Situation: [<outline-slug>](iamu/outlines/<outline-slug>.md)
261
- • Persona: [<persona-slug>](iamu/personas/<persona-slug>.md) (or "draft — no persona bound yet")
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 using clickable links, then render the candidates:
72
+ Lead with existing coverage by slug, then render the candidates:
73
73
 
74
74
  ```
75
- Existing coverage: <N> scenarios ([<slug1>](iamu/scenarios/<slug1>.md), ...). Uncovered areas: <gaps>.
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 using clickable links and uncovered roles from `context.yml`:
119
+ Lead with existing persona coverage by slug and uncovered roles from `context.yml`:
120
120
 
121
121
  ```
122
- Existing personas: [<slug1>](iamu/personas/<slug1>.md), ... Uncovered roles from context.yml: <roles>.
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.
@@ -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 well 1" --worked "What worked well 2" --question "Open question 1"
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):**
@@ -443,10 +443,12 @@ The `walker_prompt` from `iamu instructions walk` is the source of truth and con
443
443
 
444
444
  ### 5. Present assessment — stay in the conversation
445
445
 
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 and links are clickable:
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
447
 
448
448
  ### <summary.persona> · <summary.situation>
449
- <summary.steps> steps · [Open in Iamu Cloud](<summary.cloud>) *(local-only: `[report.md](iamu/.runs/<run-id>/report.md)`)*
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.
450
452
 
451
453
  > **<summary.verdict.question>** **<summary.verdict.label>**
452
454
  > <summary.verdict.answer>
@@ -457,9 +459,11 @@ If `summary.since` is set, show what happened to every earlier finding this run
457
459
 
458
460
  **Since the last run** (<date of summary.since.baselineAt>)
459
461
 
460
- | Earlier finding | Now |
461
- |---|---|
462
- | <title> | ✓ Resolved / ✗ Persists / ○ Not seen / ? Unclear |
462
+ | Earlier finding | Now | Notes |
463
+ |---|---|---|
464
+ | <title> | **Resolved** / **Persists** / Not seen / Unclear | <item.note, or — > |
465
+
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).
463
467
 
464
468
  `+ <summary.since.added> new problems this run.` "Not seen" means the walk did not pass that way: never call it fixed.
465
469
 
@@ -483,6 +487,8 @@ Reach is a prediction until those scenarios run again.
483
487
 
484
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).
485
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
+
486
492
  Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the scorecard scannable: the tables are the summary.
487
493
 
488
494
  **Zero-Friction Triage Transition (Eliminate Meta-Prompt Gate):**
@@ -514,7 +520,7 @@ When the user asks to review findings one by one:
514
520
  ```markdown
515
521
  ### Finding #<N>/<total> [<SEVERITY>] — <title>
516
522
  > **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
517
- > **Evidence:** [step-<N>.png](iamu/.runs/<run>/screenshots/step-<N>.png) · [View in Cloud Walkthrough](<url from iamu open <run-id> --print>)
523
+ > **Evidence:** <run_dir>/screenshots/step-<N>.png · Cloud: <full https URL from iamu open <run-id> --print>
518
524
 
519
525
  **❌ Problem:**
520
526
  <What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
@@ -641,6 +647,7 @@ Run `iamu validate --all` to verify all entities before reporting done. If older
641
647
 
642
648
  ## Guidelines
643
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.
644
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.
645
652
  - **All generation is local.** All generation — persona suggestions, brief — uses the local LLM directly. No server-side LLM calls.
646
653
  - **Scenario vocabulary.** Say "scenario" — never "outline" — when addressing the user.
@@ -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 and clickable links
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 with clickable markdown file links.
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
- • [`elin-dahl`](iamu/personas/elin-dahl.md) — Elin Dahl · Architect & first-time house owner in Falun · active
36
+ • `elin-dahl` — Elin Dahl · Architect & first-time house owner in Falun · active
37
37
 
38
38
  **Scenarios:**
39
- • [`replacing-windows`](iamu/scenarios/replacing-windows.md) — [`elin-dahl`](iamu/personas/elin-dahl.md) · outline: [`measure-and-order`](iamu/outlines/measure-and-order.md) · ready
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 — [`view`](iamu/findings/<slug>.md)
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
- • [`<scenario-slug>`](iamu/scenarios/<scenario-slug>.md) — <N> fixes awaiting verification from a re-run (`iamu-run <scenario-slug>`)
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 — [Open Project in Iamu Cloud](<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`.
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
 
@@ -1,3 +1,4 @@
1
+ import { type CheckOutcome, type RunChecks } from "@iamu-dev/local-store";
1
2
  export interface HtmlReportHighlight {
2
3
  targetBox: {
3
4
  x: number;
@@ -40,16 +41,31 @@ export interface HtmlReportFinding {
40
41
  uiFact?: string | null;
41
42
  consequence?: string | null;
42
43
  recommendation?: string | null;
44
+ /** "/request · step 8" */
45
+ where?: string | null;
46
+ isNew?: boolean;
47
+ persists?: boolean;
43
48
  }
44
49
  export interface HtmlReportVerdict {
45
50
  question: string;
46
51
  rating: string;
47
52
  reasoning?: string;
48
53
  }
54
+ export interface HtmlReportSinceItem {
55
+ title: string;
56
+ note?: string;
57
+ step_ids?: string[];
58
+ fixed_before?: boolean;
59
+ severity_before?: string;
60
+ severity_now?: string;
61
+ }
49
62
  export interface HtmlReportVerification {
50
- resolved: unknown[];
51
- persists: unknown[];
52
- newFindings: unknown[];
63
+ resolved: HtmlReportSinceItem[];
64
+ persists: HtmlReportSinceItem[];
65
+ notObserved?: HtmlReportSinceItem[];
66
+ newFindings: Array<{
67
+ type?: string;
68
+ }>;
53
69
  }
54
70
  export interface HtmlReportData {
55
71
  scenarioName: string;
@@ -67,9 +83,25 @@ export interface HtmlReportData {
67
83
  steps: HtmlReportStep[];
68
84
  findings: HtmlReportFinding[];
69
85
  verdicts?: HtmlReportVerdict[];
86
+ /** The run's answer to "would they come back", with one label for all tests. */
87
+ overall?: {
88
+ question: string;
89
+ label: string;
90
+ answer: string | null;
91
+ reasoning: string | null;
92
+ } | null;
70
93
  verification?: HtmlReportVerification | null;
71
94
  whatWorked?: string[];
72
95
  openQuestions?: string[];
96
+ /** The walker's doubts about the test setup. */
97
+ setupNotes?: string[];
98
+ /** What a re-run was sent to check, with this run's outcome for each fix. */
99
+ checks?: {
100
+ fixes: Array<RunChecks["fixes"][number] & {
101
+ outcome: CheckOutcome;
102
+ }>;
103
+ directions: string[];
104
+ } | null;
73
105
  }
74
106
  export declare function generateHtmlReport(data: HtmlReportData): string;
75
107
  /**
@@ -40,6 +40,12 @@ export interface RunView {
40
40
  items: Array<{
41
41
  title: string;
42
42
  outcome: SinceOutcome;
43
+ /** Why the matcher judged it so. */
44
+ note: string | null;
45
+ /** Marked addressed before this run: persisting means the fix did not hold. */
46
+ fixedBefore: boolean;
47
+ /** Persists only: "less severe, major → minor" or "worse, …", else "". */
48
+ shift: string;
43
49
  }>;
44
50
  } | null;
45
51
  findings: RunFindingRow[];
@@ -54,11 +60,26 @@ export interface RunView {
54
60
  kind: string;
55
61
  title: string;
56
62
  }>;
63
+ /** The fixes this run re-checked: how many, confirmed fixed, and came back. */
64
+ checks: {
65
+ fixes: number;
66
+ fixed: number;
67
+ cameBack: number;
68
+ directions: string[];
69
+ } | null;
70
+ /** The walker's doubts about the test setup. */
71
+ setupNotes: string[];
57
72
  }
58
73
  export interface OverviewRun {
59
74
  completedAt: string | null;
60
75
  label: VerdictLabel;
61
76
  problems: number;
77
+ /** Problems by severity: critical, major, minor (minor includes observations). */
78
+ bySeverity: {
79
+ critical: number;
80
+ major: number;
81
+ minor: number;
82
+ };
62
83
  resolved: number;
63
84
  persists: number;
64
85
  added: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamu-dev/iamu",
3
- "version": "0.4.0-beta.0",
3
+ "version": "0.4.0-beta.1",
4
4
  "type": "module",
5
5
  "description": "Test your product as realistic personas — scenario-driven development CLI",
6
6
  "license": "UNLICENSED",