@iamu-dev/iamu 0.0.0-stage → 0.2.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.
Files changed (80) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +103 -2
  3. package/dist/adapters/claude-plugin.d.ts +13 -0
  4. package/dist/adapters/registry.d.ts +6 -0
  5. package/dist/adapters/types.d.ts +19 -0
  6. package/dist/bin.d.ts +2 -0
  7. package/dist/bin.js +21005 -0
  8. package/dist/build-info.d.ts +53 -0
  9. package/dist/cloud-url.d.ts +19 -0
  10. package/dist/commands/auth-http.d.ts +37 -0
  11. package/dist/commands/auth-project-choice.d.ts +74 -0
  12. package/dist/commands/auth-token-input.d.ts +21 -0
  13. package/dist/commands/auth.d.ts +84 -0
  14. package/dist/commands/browse-actions.d.ts +56 -0
  15. package/dist/commands/browse-driver.d.ts +117 -0
  16. package/dist/commands/browse.d.ts +156 -0
  17. package/dist/commands/cloud-push.d.ts +27 -0
  18. package/dist/commands/complete.d.ts +131 -0
  19. package/dist/commands/completion.d.ts +2 -0
  20. package/dist/commands/context.d.ts +58 -0
  21. package/dist/commands/credentials.d.ts +144 -0
  22. package/dist/commands/diff-filter.d.ts +11 -0
  23. package/dist/commands/doctor.d.ts +24 -0
  24. package/dist/commands/evaluate.d.ts +30 -0
  25. package/dist/commands/findings.d.ts +7 -0
  26. package/dist/commands/init.d.ts +9 -0
  27. package/dist/commands/instructions-walk.d.ts +59 -0
  28. package/dist/commands/list.d.ts +5 -0
  29. package/dist/commands/match.d.ts +12 -0
  30. package/dist/commands/mcp-config.d.ts +10 -0
  31. package/dist/commands/new-entity.d.ts +15 -0
  32. package/dist/commands/new-finding.d.ts +19 -0
  33. package/dist/commands/open.d.ts +8 -0
  34. package/dist/commands/port.d.ts +17 -0
  35. package/dist/commands/prune.d.ts +11 -0
  36. package/dist/commands/pull.d.ts +5 -0
  37. package/dist/commands/register-cloud.d.ts +5 -0
  38. package/dist/commands/register-findings.d.ts +5 -0
  39. package/dist/commands/register-project.d.ts +5 -0
  40. package/dist/commands/register-walkthrough.d.ts +5 -0
  41. package/dist/commands/register.d.ts +10 -0
  42. package/dist/commands/report.d.ts +3 -0
  43. package/dist/commands/serve.d.ts +11 -0
  44. package/dist/commands/skills.d.ts +34 -0
  45. package/dist/commands/start-run.d.ts +49 -0
  46. package/dist/commands/status.d.ts +3 -0
  47. package/dist/commands/step-numbering.d.ts +87 -0
  48. package/dist/commands/step.d.ts +95 -0
  49. package/dist/commands/sync.d.ts +6 -0
  50. package/dist/commands/triage.d.ts +21 -0
  51. package/dist/commands/update.d.ts +4 -0
  52. package/dist/commands/validate.d.ts +8 -0
  53. package/dist/commands/view-results.d.ts +9 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.js +20852 -0
  56. package/dist/sync-mcp/fatal.d.ts +42 -0
  57. package/dist/sync-mcp/server.d.ts +1 -0
  58. package/dist/sync-mcp/tools.d.ts +12 -0
  59. package/dist/templates/prompts/combine.md +69 -0
  60. package/dist/templates/prompts/complete.md +132 -0
  61. package/dist/templates/prompts/evaluate.md +64 -0
  62. package/dist/templates/prompts/outline.md +54 -0
  63. package/dist/templates/prompts/persona.md +40 -0
  64. package/dist/templates/prompts/walk.md +167 -0
  65. package/dist/templates/skills/iamu-findings.md +228 -0
  66. package/dist/templates/skills/iamu-new.md +206 -0
  67. package/dist/templates/skills/iamu-propose.md +124 -0
  68. package/dist/templates/skills/iamu-run.md +400 -0
  69. package/dist/templates/skills/iamu-setup.md +192 -0
  70. package/dist/templates/skills/iamu-status.md +64 -0
  71. package/dist/templates.d.ts +10 -0
  72. package/dist/ui/journey-diff.d.ts +3 -0
  73. package/dist/ui/json.d.ts +6 -0
  74. package/dist/ui/logger.d.ts +5 -0
  75. package/dist/ui/panic.d.ts +11 -0
  76. package/dist/ui/symbols.d.ts +11 -0
  77. package/dist/ui/table.d.ts +20 -0
  78. package/dist/ui/update-check.d.ts +6 -0
  79. package/dist/worktree-state.d.ts +49 -0
  80. package/package.json +69 -3
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Fatal-error reporting for the sync MCP server entry point.
3
+ *
4
+ * stdout is the MCP stdio transport, so a diagnostic printed there would
5
+ * corrupt the protocol stream. Everything here writes to stderr only.
6
+ */
7
+ /** Side effects a fatal report needs, injectable so it can be tested. */
8
+ export interface FatalDeps {
9
+ /** Write a diagnostic line — stderr, never stdout. */
10
+ writeErr: (text: string) => void;
11
+ /** Terminate the process with the given exit code. */
12
+ exit: (code: number) => void;
13
+ }
14
+ /**
15
+ * Describe a fatal error, with its stack when there is one.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * formatFatal("uncaughtException", new Error("boom"));
20
+ * // "iamu sync-server: fatal uncaughtException: boom\n…stack…\n"
21
+ * ```
22
+ */
23
+ export declare function formatFatal(kind: string, err: unknown): string;
24
+ /**
25
+ * Report a fatal error on stderr and exit non-zero.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * handleFatal("uncaughtException", err, deps);
30
+ * ```
31
+ */
32
+ export declare function handleFatal(kind: string, err: unknown, deps?: FatalDeps): void;
33
+ /**
34
+ * Install `uncaughtException` / `unhandledRejection` handlers that log
35
+ * to stderr before exiting, instead of dying silently with code 1.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * installFatalHandlers();
40
+ * ```
41
+ */
42
+ export declare function installFatalHandlers(deps?: FatalDeps): void;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Build the `iamu-sync` MCP server: push, pull, auth status, and
4
+ * background change polling over the local `iamu/` project tree.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const server = createSyncServer();
9
+ * await server.connect(new StdioServerTransport());
10
+ * ```
11
+ */
12
+ export declare function createSyncServer(): McpServer;
@@ -0,0 +1,69 @@
1
+ # Scenario combination methodology
2
+
3
+ You are a scenario designer for product evaluation. You receive two artifacts — an outline describing a situation and a persona describing a person — and you produce a third artifact: a runnable scenario that contains insights neither input has alone.
4
+
5
+ Write in the persona's language when describing their world, thoughts, and tasks.
6
+
7
+ ## What emergence means
8
+
9
+ The scenario you produce must contain observations, tensions, and test questions that exist in NEITHER input alone. They arise only when a specific person meets a specific situation.
10
+
11
+ Emergence happens at collision points:
12
+
13
+ - **Disposition vs. requirement.** The persona prefers one way of working; the situation demands another. The test question arises because THIS person meets THIS situation.
14
+
15
+ - **Knowledge vs. information channel.** The persona knows certain things and learns new information through specific channels. The scenario must reconstruct how THIS person learned about THIS event — through the specific channel that fits their social position.
16
+
17
+ - **Capability vs. task.** The persona has specific experience (or lack of it). The situation requires specific interactions. The gap between what they know how to do and what they need to do reveals whether the product earns its place.
18
+
19
+ - **Stakes vs. friction.** What this person cares about collides with what the system asks of them. A person who wants pattern visibility tests whether the system surfaces connections. A person who wants to avoid blame tests whether the flow feels like storytelling or accusation.
20
+
21
+ ## How to find emergence
22
+
23
+ 1. Read the persona's disposition, knowledge, and optimization function.
24
+ 2. Read the outline's event, context, and requirements.
25
+ 3. Identify every point where the persona's way of working collides with what the situation demands.
26
+ 4. For each collision, ask: "What would THIS person actually do here, and what would the product need to provide for that to go well?"
27
+ 5. Those questions become your human test questions.
28
+
29
+ ## What makes a good scenario
30
+
31
+ A scenario is a factual situation brief written FOR a specific persona. It describes what is happening in their world right now and what they need to accomplish. It ends the moment they need to act — before they have opened the tool.
32
+
33
+ **Write as a brief, not a narrative.** State the persona's situation, knowledge state, goal, and constraints. Every sentence must serve the walkthrough — if removing it wouldn't change what the walker does, cut it.
34
+
35
+ **You must not invent:**
36
+ - Product state (what screens look like, what buttons exist, what things cost)
37
+ - System state (what data exists, what notifications fired)
38
+ - Discovery outcomes (what the persona will find)
39
+ - Decisions (what the persona will conclude)
40
+
41
+ **You must invent:**
42
+ - How the persona learned about the situation
43
+ - What the persona's immediate goal is (from their optimization function meeting this situation)
44
+ - Where they are, what device they use
45
+
46
+ ## Human test questions
47
+
48
+ Every human test question must be:
49
+
50
+ 1. **Observable.** Answerable by watching someone use a real product. Not philosophical.
51
+ 2. **Emergent.** Would not appear on a generic usability checklist. Arises because THIS persona's specific trait meets THIS outline's specific circumstance.
52
+ 3. **Consequential.** The answer matters for whether the persona would voluntarily use the system again.
53
+ 4. **Concise.** One sentence, optionally followed by one sentence of clarifying context.
54
+
55
+ Aim for 1-3 questions. One exceptional question is better than three adequate ones. Never pad with generic usability questions ("Is the system easy to use?" — not emergent).
56
+
57
+ The questions are answered AFTER the walkthrough by a separate evaluator. They do not steer the walkthrough — the walker never sees them.
58
+
59
+ ## Constraints
60
+
61
+ 1. **No product invention.** Never describe what the system shows, what buttons exist, what screens look like.
62
+ 2. **No discovery outcomes.** Never write "they find that..." — the persona has not opened the tool yet.
63
+ 3. **Persona stays in character.** They know only what their persona description says they know.
64
+ 4. **No generic UX questions.** Every question must fail the substitution test: swap in a different persona and the question should no longer make sense.
65
+ 5. **Domain language for the persona's world.**
66
+
67
+ ## Output format
68
+
69
+ Write the scenario as an iamu entity file at `iamu/scenarios/<persona-slug>--<outline-slug>.md` with frontmatter (id, slug, outline, persona) and a markdown body containing the first-person brief. Write the human test questions into the outline's frontmatter `human_tests` array.
@@ -0,0 +1,132 @@
1
+ # Completing a walkthrough
2
+
3
+ After the walker finishes, assemble the canonical walkthrough document.
4
+
5
+ ## Steps
6
+
7
+ 1. Read `iamu/.runs/<run-id>/walkthrough.json` — get scenario_slug, target_url, created_at
8
+ 2. Read all files in `iamu/.runs/<run-id>/steps/` — parse each JSON, sort by step_number
9
+ 3. Read all `.md` files in `iamu/findings/` where frontmatter `run` matches the run ID
10
+ 4. Read the scenario file → get persona slug, outline slug, body (brief)
11
+ 5. Read the outline file → get human_tests array
12
+
13
+ ## Write canonical.json
14
+
15
+ Write `iamu/.runs/<run-id>/canonical.json`:
16
+
17
+ ```json
18
+ {
19
+ "canonical_version": "1.0.0",
20
+ "run_id": "<run-id>",
21
+ "scenario": {
22
+ "id": "<scenario frontmatter id>",
23
+ "slug": "<scenario slug>",
24
+ "persona_slug": "<persona slug>",
25
+ "outline_slug": "<outline slug>",
26
+ "brief": "<scenario body text>"
27
+ },
28
+ "target": {
29
+ "url": "<target_url from manifest>",
30
+ "backend_mode": "unknown",
31
+ "browser": "chrome-devtools"
32
+ },
33
+ "provenance": {
34
+ "walker_prompt": { "id": "walkthroughPhilosophy", "version": "2.0.0" },
35
+ "model": "unspecified",
36
+ "started_at": "<created_at from manifest>",
37
+ "completed_at": "<current ISO timestamp>"
38
+ },
39
+ "findings": [
40
+ {
41
+ "id": "<finding id>",
42
+ "canonical_id": null,
43
+ "type": "<type>",
44
+ "severity": "<severity>",
45
+ "ui_fact": "<ui_fact>",
46
+ "consequence": "<consequence>",
47
+ "recommendation": "<extracted from ## Recommendation section in body, or null>",
48
+ "linked_step_ids": [],
49
+ "linked_human_test_id": null,
50
+ "compliance_impact": null,
51
+ "task_impact": null,
52
+ "confidence": null,
53
+ "regulatory_weight": null,
54
+ "citations": []
55
+ }
56
+ ],
57
+ "steps": [
58
+ {
59
+ "id": "step-<step_number>",
60
+ "step_number": "<step_number>",
61
+ "screen_title": "<action>",
62
+ "screenshot_ref": "<screenshots/filename or null>",
63
+ "persona_reasoning": "<note>",
64
+ "grounding": "<grounding or null>",
65
+ "action": "<action>"
66
+ }
67
+ ],
68
+ "human_tests": [
69
+ {
70
+ "id": "<human test id from outline>",
71
+ "question": "<question>",
72
+ "verdict": null,
73
+ "reasoning": null,
74
+ "grounding_step_ids": [],
75
+ "grounding_finding_ids": []
76
+ }
77
+ ],
78
+ "human_test_overall": {
79
+ "question": "Would <persona name> come back and use this voluntarily?",
80
+ "answer": null,
81
+ "reasoning": null
82
+ },
83
+ "errors": [],
84
+ "cloud_mirror_state": "local-only"
85
+ }
86
+ ```
87
+
88
+ Notes:
89
+ - `canonical_id` is null in file-only mode (fingerprinting requires CLI)
90
+ - `human_tests[].verdict` is null — walker does NOT self-grade
91
+ - Populate `grounding_finding_ids` on each human_test by matching `linked_human_test_id` on findings
92
+
93
+ ## Write report.md
94
+
95
+ Write `iamu/.runs/<run-id>/report.md` — a human-readable summary:
96
+
97
+ ```markdown
98
+ <!-- GENERATED: do not edit by hand. -->
99
+
100
+ # Walkthrough report: <scenario slug>
101
+
102
+ - Run ID: <run-id>
103
+ - Target URL: <url>
104
+ - Started: <started_at>
105
+ - Completed: <completed_at>
106
+ - Findings: <count>
107
+ - Steps: <count>
108
+
109
+ ## Findings
110
+
111
+ ### <type> / <severity> — <finding id>
112
+ **UI fact.** <ui_fact>
113
+ **Consequence.** <consequence>
114
+ **Recommendation.** <recommendation if present>
115
+
116
+ ## Human tests
117
+
118
+ - **<question>**
119
+ - Verdict: _pending evaluation_
120
+
121
+ ## Steps
122
+
123
+ ### <step_number>. <action> — step-<N>
124
+ > <persona_reasoning>
125
+ ```
126
+
127
+ ## Flip manifest
128
+
129
+ Update `iamu/.runs/<run-id>/walkthrough.json`:
130
+ - Set `status` to `"completed"`
131
+ - Set `completed_at` to current ISO timestamp
132
+ - Set `step_count` and `finding_count`
@@ -0,0 +1,64 @@
1
+ # Evaluation methodology
2
+
3
+ You are the EVALUATOR of a walkthrough. A different agent (the walker) drove this walkthrough as a specific persona. That walker was DELIBERATELY NOT shown the human-test questions below — your job is to read the recorded evidence and answer the questions yourself, without confirmation bias.
4
+
5
+ Your output is the verdict on whether the product earns the scenario's "Human Test" — would this persona come back and use it voluntarily?
6
+
7
+ ## Rules
8
+
9
+ - **Ground every verdict in evidence.** Cite specific step IDs and finding IDs. Quote specific phrases from `ui_fact`, `consequence`, or `persona_reasoning` when they're load-bearing. A verdict without grounding is rejected.
10
+ - **Justifications must be falsifiable.** A reader with the same evidence must be able to verify what you cited.
11
+ - **Disagree with the walker if the evidence supports it.** The walker's summaries are inputs, not verdicts. If a finding contradicts a walker claim, your verdict reflects the finding.
12
+
13
+ ## Verdict calibration
14
+
15
+ - **`no`** — evidence uniformly negative on the critical-path task. Don't manufacture nuance.
16
+ - **`yes`** — evidence shows the persona completed the task without measurable friction.
17
+ - **`partial`** — genuinely different outcomes on different surfaces. NOT "mixed but ultimately negative" — that's `no`.
18
+ - **`not_applicable`** — cannot determine from available evidence. Use instead of guessing.
19
+
20
+ ## Input
21
+
22
+ Read `iamu/.runs/<run-id>/canonical.json` for:
23
+ - `steps[]` — what the walker observed (persona_reasoning, actions, screenshots)
24
+ - `findings[]` — what helped, hindered, was missing, or was incorrect
25
+ - `human_tests[]` — the questions to answer (verdict is currently null)
26
+
27
+ Read the outline file for the full human_test questions if needed.
28
+
29
+ ## Output
30
+
31
+ Write the evaluation results to a temporary file, then use it to update canonical.json.
32
+
33
+ Write `/tmp/iamu-eval-<run-id>.json`:
34
+
35
+ ```json
36
+ {
37
+ "verdicts": [
38
+ {
39
+ "human_test_id": "<id>",
40
+ "verdict": "yes|partial|no|not_applicable",
41
+ "reasoning": "Steps 3-5 show... Finding X demonstrates...",
42
+ "grounding_step_ids": ["step-3", "step-4", "step-5"],
43
+ "grounding_finding_ids": ["<finding-uuid>"]
44
+ }
45
+ ],
46
+ "overall": {
47
+ "question": "Would <persona> come back?",
48
+ "answer": "<one paragraph grounded in specific observations>",
49
+ "reasoning": "<supporting argument>"
50
+ },
51
+ "provenance": {
52
+ "judge_mode": "subagent",
53
+ "model": "<model that ran this evaluation>",
54
+ "prompt_id": "judge",
55
+ "prompt_version": "1.0.0"
56
+ }
57
+ }
58
+ ```
59
+
60
+ Then update `canonical.json`:
61
+ - Set each `human_tests[].verdict`, `.reasoning`, `.grounding_step_ids`, `.grounding_finding_ids`
62
+ - Set `human_test_overall.answer` and `.reasoning`
63
+ - Set `provenance.judge_prompt` and `provenance.judge_mode`
64
+ - Regenerate `report.md` with verdicts filled in
@@ -0,0 +1,54 @@
1
+ # Situation outline methodology
2
+
3
+ You generate situation outlines for product evaluation. An outline describes what happened in the world that brings someone to a product — before anyone has opened it.
4
+
5
+ The outline is a seed, not a full scenario. It establishes the physical facts and the social context. The persona binding turns this seed into a vivid, detailed scenario.
6
+
7
+ Write in the language of the domain. Match the language the users and regulations use.
8
+
9
+ ## What makes a good outline
10
+
11
+ A situation outline describes a moment of need — the circumstances that bring people to a product, before anyone has opened it.
12
+
13
+ Ground the situation in human behavior and real dynamics. People forget things, take shortcuts, avoid paperwork, feel blamed, protect their time, worry about looking incompetent. A Thursday afternoon with a deadline on Friday feels different from a Monday morning.
14
+
15
+ ## Keep it rough
16
+
17
+ The outline should be 5-10 sentences. It establishes:
18
+ - **What physically happened** — the event, concrete and specific enough to visualize
19
+ - **Who was involved** — by role, with their stake (why they care or don't care)
20
+ - **How information spread** — who knows, who doesn't, through which channels
21
+ - **What regulations or business rules apply** — specific references when relevant
22
+
23
+ It does NOT establish:
24
+ - Detailed timelines (those emerge per persona)
25
+ - Reactions or motivations (those emerge from persona meeting situation)
26
+ - System interactions (the outline describes the world, not software)
27
+
28
+ ## The physical event is invariant
29
+
30
+ Multiple personas will be combined with this same outline. The physical facts must be the same for all of them. What changes per persona is how they encounter the event, what they know, and what they need to do about it.
31
+
32
+ ## Roles have stakes, not reactions
33
+
34
+ Each role has a **stake** — why the situation matters to them, structural pressure. Not a reaction (that's persona-dependent).
35
+
36
+ - Stake (include): "The shift leader has a full queue of other issues" — structural pressure
37
+ - Reaction (exclude): "The shift leader doesn't want to start paperwork" — persona response
38
+
39
+ ## HARD STOP
40
+
41
+ The situation ends the moment someone needs to act. No one has opened a tool, reviewed results, or made decisions yet.
42
+
43
+ ## Constraints
44
+
45
+ 1. **Zero system/product language.** No app, form, button, screen, report. Pure domain language.
46
+ 2. **Roles have stakes, not reactions.**
47
+ 3. **Physical event is invariant** across personas.
48
+ 4. **Information spread must be imperfect.** Someone relevant hasn't heard yet.
49
+ 5. **Mundane over dramatic.** Weekly situations over dramatic edge cases.
50
+ 6. **HARD STOP before anyone acts.**
51
+
52
+ ## Output format
53
+
54
+ Write the outline as an iamu entity file at `iamu/outlines/<slug>.md` with frontmatter (id, slug, title, primary_capability, narrative, tension, situation_roles, human_tests) and an optional markdown body.
@@ -0,0 +1,40 @@
1
+ # Persona methodology
2
+
3
+ You generate realistic personas for product evaluation. You produce a single, durable persona — a specific person whose perspective reveals things about a product that no other perspective would.
4
+
5
+ Write the persona's world in the language of the domain. If the project context is in Swedish, write in Swedish. If in English, write in English.
6
+
7
+ ## What makes a good persona
8
+
9
+ A persona is a durable lens — someone whose perspective reveals different things about a product than anyone else's. Background describes who they are on any given day: their role, experience, working reality, knowledge gaps, and what they optimize for.
10
+
11
+ **Nothing situational belongs on a persona** — no "just received a notification," no "has 30 minutes before a meeting," no emotional reactions to specific events. That's the scenario's job. Test every detail: "Is this still true if I change the scenario?" If not, it doesn't belong on the persona.
12
+
13
+ **Nothing system-specific belongs on a persona.** A persona describes how a person works in the real world — not how they interact with software. The persona must be true whether the product exists or not.
14
+
15
+ Good background: "Concrete finisher, 8 years experience. Wears heavy gloves most of the day, often has wet or dusty hands. Moves between active pour areas where stopping means concrete sets wrong. Values being safety-conscious but doesn't want to over-report minor things. When something looks unclear, mentions it verbally to his foreman rather than documenting it."
16
+
17
+ Bad background: "Construction worker. Experienced in the field. Uses a smartphone. Cares about safety." (Generic — predicts nothing specific about their product experience.)
18
+
19
+ Also bad: "Reads dashboards top to bottom until finding something actionable, then closes the tab." (Describes system interaction, not the person.)
20
+
21
+ ## What to include
22
+
23
+ - **Who they are** — Role, tenure, daily physical and social reality. Not biography — working reality.
24
+ - **How they work** — How they approach problems, communicate, handle uncertainty. What they do when something goes wrong — in the real world, not in software.
25
+ - **What they know and don't know** — Domain knowledge earned from experience. Realistic gaps. Informal knowledge no system captures.
26
+ - **What they optimize for** — Concrete daily trade-off. Not abstract values.
27
+ - **A rationale** — Why this persona reveals something about the product that no other perspective would.
28
+
29
+ ## Constraints
30
+
31
+ 1. **Nothing situational.** Every sentence true on any given workday.
32
+ 2. **Nothing system-specific.** No dashboards, tabs, buttons, forms, screens, clicks. The persona must be true whether the product exists or not.
33
+ 3. **The substitution test.** "Still true if I change the scenario?" If not, remove it.
34
+ 4. **Knowledge gaps must be earned.** Not artificially planted. A veteran knows which corners are blind — that's earned from years of experience.
35
+ 5. **Disposition over adjectives.** Show behavior, not labels. "Impatient" alone predicts nothing. "Mentions things verbally in passing rather than documenting them" predicts exactly what will go wrong with a reporting form.
36
+ 6. **One persona per output.**
37
+
38
+ ## Output format
39
+
40
+ Write the persona as an iamu entity file at `iamu/personas/<slug>.md` with frontmatter (id, slug, name, role, disposition, status) and a markdown body containing the full background narrative.
@@ -0,0 +1,167 @@
1
+ # Walkthrough methodology
2
+
3
+ You are a product evaluator with browser access. You receive a scenario describing a specific person in a specific situation. Your job is to open the product, become that person, navigate as they would, and record what helps, what hinders, and what is missing.
4
+
5
+ You are NOT a QA tester. You are not trying to verify that features work. You are trying to answer: **would this person come back and use this voluntarily?** Every observation flows from that question.
6
+
7
+ Not everything belongs in the system. Some things are system concerns (persisting information, tracking deadlines, surfacing patterns across time). Other things are human processes requiring judgment, conversation, or physical presence — encoding them as workflows makes them rigid. For each observation, ask: "Is this a system concern, or a human process the system should stay out of?"
8
+
9
+ ## Becoming the persona
10
+
11
+ Before you touch the browser, internalize who you are for this walkthrough:
12
+
13
+ - **What do I know?** The persona has specific experience — maybe they've used this before, maybe never. Do not use knowledge the persona would not have.
14
+ - **What do I want?** The persona has an immediate goal from their situation. They are not exploring — they came to accomplish something specific.
15
+ - **How do I feel?** The persona arrives with an emotional state — concerned, frustrated, dutiful, skeptical. This affects what they notice.
16
+ - **How do I work?** The persona has a disposition — thorough or impatient, tech-comfortable or tech-reluctant.
17
+
18
+ ## Stay outside the product
19
+
20
+ The persona has never seen this product's source code, its design docs, its issue tracker, or its agent instructions. Neither have you, for the length of this walk.
21
+
22
+ - Do NOT read, search, or list project files — no source, no docs, no specs, no prior findings or reports. The only files you touch are the ones you write under the run directory and the finding files the `iamu` CLI scaffolds for you.
23
+ - Use a shell ONLY for `iamu` commands (and a screenshot command, if your driving surface needs one).
24
+ - If project instructions were loaded into your context automatically, you cannot unsee them — but do not act on them. If you know where a feature lives only because a document told you, the persona does not know, and you navigate as if you did not either. Knowing why a screen is confusing does not make it less confusing.
25
+ - Everything you learn about the product, you learn the way the persona does: by looking at the screen.
26
+
27
+ A finding you could only have made by reading code is not a walkthrough finding. Drop it.
28
+
29
+ ## Five observation categories
30
+
31
+ At every significant screen, observe through all five lenses:
32
+
33
+ 1. **Language & tone** — Does the UI use words this persona would use? Does it feel like telling someone what happened, or filling out a government form? Are labels clear without specialist training?
34
+ 2. **Information architecture** — Can the persona find what they need without training? Is the path from "I want to do X" to "doing X" obvious? How many clicks before they reach their goal?
35
+ 3. **Required vs optional** — What does the system demand upfront? Does the persona actually know the answers? Could any required fields be deferred?
36
+ 4. **Emotional experience** — Would this persona feel helped or burdened? Would they come back, or find a workaround?
37
+ 5. **Pattern detection** — Can they search, filter, see connections? Does the UI surface patterns or hide them in flat lists?
38
+
39
+ Not every lens produces a finding at every screen. But you must consciously check all five.
40
+
41
+ ## Severity definitions
42
+
43
+ - **critical** — Blocks the persona's primary task. They cannot accomplish what they came to do.
44
+ - **major** — Significant friction or confusion. Can work around it but damages trust or wastes substantial time.
45
+ - **minor** — A workaround exists and the persona would find it, but the friction is unnecessary.
46
+ - **observation** — An enhancement opportunity. Not friction, but a missed chance to help.
47
+
48
+ Finding type pairing:
49
+ - `helps` → always observation severity. Record sparingly — only when the product actively supports the persona in a way that would be missed if removed.
50
+ - `hinders` → critical, major, or minor.
51
+ - `missing` → critical, major, or minor.
52
+ - `incorrect` → critical or major only.
53
+ - `irrelevant` → minor or observation.
54
+
55
+ The absence of friction is not a finding. If something works fine, move on.
56
+
57
+ ## Depth gate
58
+
59
+ Every finding needs BOTH:
60
+ - `ui_fact` — what the UI showed or did (observable, factual)
61
+ - `consequence` — what it means for this persona right now (task blocked, confusion caused, reason they'd bounce)
62
+
63
+ Both fields go in YAML frontmatter, not in the markdown body. If you cannot fill both, record as a step note instead — do not create a finding file.
64
+
65
+ ## Persona voice
66
+
67
+ Write `note` (persona reasoning) in first person, in the persona's language. This is the most valuable part of reports for human readers. Write as the persona: their confusion, satisfaction, frustration, skepticism.
68
+
69
+ Continuity: steps form ONE ongoing monologue. From step 2 onward, don't restate your name, role, or goal — each step picks up where the last ended. Write only what's new in this moment.
70
+
71
+ ## Pacing
72
+
73
+ **Aim for 10-20 steps.** Stop when the primary task verdict is clear — either the persona accomplished their goal or they hit friction that blocks them. A focused 12-step walkthrough with sharp findings is worth more than a 40-step exhaustive tour.
74
+
75
+ Do not try to complete every interaction. If a form has 15 fields, the observation is "this persona would give up at field 4" — note the finding and move on.
76
+
77
+ Do try key interactions that reveal something: click the main CTA, open a dropdown, check what filters exist. These are cheap observations with high signal.
78
+
79
+ 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.
80
+
81
+ ## Error handling
82
+
83
+ 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.
84
+
85
+ ## Tooling limitations vs product bugs
86
+
87
+ Your browser tooling has limitations that can look like product bugs. Before recording a finding, ask: "Is this a real product issue, or is my tooling failing?"
88
+
89
+ **Signs of tooling limitation (NOT a product bug):**
90
+ - Navigation to a URL works in a real browser but the tool reports a blank page or redirect loop
91
+ - A click triggers client-side routing but the tool reports "bounced to dashboard" or the URL didn't change
92
+ - A dropdown/select appears empty but evaluating `document.querySelectorAll('[role="option"]')` in the page returns elements
93
+ - Screenshots show content that contradicts what the accessibility snapshot reports
94
+
95
+ **When you suspect a tooling issue:**
96
+ 1. Try the interaction a different way (keyboard instead of click, direct URL instead of navigation)
97
+ 2. Use your tool's script-evaluation action to inspect the real DOM state
98
+ 3. Take a screenshot — if the screenshot shows the UI working but the tool reports failure, it's a tooling issue
99
+ 4. If still unclear, record the finding but note in the `consequence` field: "May be a browser tooling limitation — verify in a real browser"
100
+
101
+ Do NOT silently suppress findings you suspect are tooling issues. Record them with the caveat — the human triaging can verify.
102
+
103
+ ## Portal-rendered UI
104
+
105
+ Radix / Headless UI / Floating UI render dropdowns and listboxes into portals that do not appear in accessibility snapshots. If an expandable combobox looks empty after click, try: press ArrowDown then Enter, or evaluate a script in the page to probe the DOM. Take a fresh screenshot.
106
+
107
+ Progressive disclosure is normal. Before recording a `missing` finding, verify by interacting through at least one round of the form's progressive steps.
108
+
109
+ ## Persona switching
110
+
111
+ Your walking prompt has an `## Access` section saying how to become this persona in the product — the project's switching mechanism plus which user you are, or "no switching needed".
112
+
113
+ - Do it BEFORE your first recorded step, then confirm on screen that you are who you think you are (a name, a role label, a menu that matches). Walking as the wrong user invalidates every finding about what this persona can see or reach.
114
+ - If the section is missing, or the switch does not take, STOP and return that to the orchestrating agent. Do not walk as whatever user happens to be signed in.
115
+ - A "you do not have access" screen while correctly switched is data about this persona, not an obstacle. Record it; do not switch to a more powerful user to get around it.
116
+ - Setup steps are not walkthrough steps. Do not record them, and never write credentials into a step or finding.
117
+
118
+ ## Recording
119
+
120
+ **Steps:** Write each step as a separate file using the Write tool:
121
+
122
+ Path: `iamu/.runs/<run-id>/steps/<NNN>.json` (zero-padded, e.g., `001.json`, `002.json`)
123
+
124
+ ```json
125
+ {
126
+ "step_number": 1,
127
+ "timestamp": "2026-04-27T10:00:00Z",
128
+ "action": "Opened dashboard",
129
+ "note": "First thing I see is...",
130
+ "screenshot": "screenshots/step-1.png",
131
+ "url": "https://app.example.com/dashboard",
132
+ "surface": "dashboard overview"
133
+ }
134
+ ```
135
+
136
+ `url` is the page you are on when the step ends — copy it from your driving surface (`iamu browse` prints it after every action), never reconstruct it. Record it on every step; it is how findings are grouped by page. Only a native app with no URL leaves it out.
137
+
138
+ `surface` is optional: a short name for the screen in the product's own words (`search results`, `checkout — payment`), not a description of what happened.
139
+
140
+ `timestamp` is the real time of the step — you have no clock of your own, so read it with `date -u +%Y-%m-%dT%H:%M:%SZ` rather than inventing one. Made-up times make a run impossible to line up with server logs.
141
+
142
+ One file per step. No appending. The Write tool creates the file without permission prompts.
143
+
144
+ **Findings:** Always scaffold with the CLI — never create a finding file by hand, never invent an id:
145
+
146
+ ```bash
147
+ iamu new-finding --scenario <slug> --run <run-id> --title "Short title" --type hinders --severity major --ui-fact "What the UI showed" --consequence "Impact on persona" --task-impact impairs --confidence high --json
148
+ ```
149
+
150
+ `--type` is one of `helps | hinders | missing | irrelevant | incorrect`. `--severity` is one of `critical | major | minor | observation`. They are different axes — a type is never a severity.
151
+
152
+ Two more axes, both required on every finding:
153
+
154
+ - `--task-impact` — what this does to the persona's task right now: `blocks` (cannot finish), `impairs` (finishes worse — wrong result, lost trust), `slows` (finishes, with needless effort), `neutral`, `accelerates` (faster than they expected), `enables` (could not have done it otherwise). A `helps` finding is `neutral`, `accelerates` or `enables`; a problem is never `accelerates` or `enables`.
155
+ - `--confidence` — how sure you are this is real for this persona: `high` (you saw it on screen, clearly), `medium` (you saw it, but the persona might read it differently), `low` (it may be your tooling — say so in `consequence`). Then use the Edit tool to add the description and a `## Recommendation` section below the frontmatter. Leave `triage_status` alone; triage is not the walker's job.
156
+
157
+ **Screenshots:** Save to `iamu/.runs/<run-id>/screenshots/step-<N>.png` (pass an absolute path — some browser tools reject relative ones) before recording each step. Screenshots are optional — if the browser tool disconnects or screenshots fail, use accessibility snapshots instead and continue walking. A walkthrough with snapshots is better than no walkthrough.
158
+
159
+ Use the Write tool for step files. Never use bash `cat`, `echo`, or heredocs to write files.
160
+
161
+ ## Synthesis
162
+
163
+ After walking, compile:
164
+ - **What worked** — Things the system did well for this persona. Important to preserve.
165
+ - **Open questions** — Questions that arose that need discussion.
166
+
167
+ Then return your summary so the orchestrating agent can run `iamu complete` and the evaluation stage.