@iamu-dev/iamu 0.3.0-beta.5 → 0.3.0-beta.6

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 CHANGED
@@ -13647,8 +13647,8 @@ import { dirname as dirname3, join as join4, resolve as resolve2 } from "path";
13647
13647
  import { fileURLToPath as fileURLToPath2 } from "url";
13648
13648
  import chalk6 from "chalk";
13649
13649
  function getVersion() {
13650
- if ("0.3.0-beta.5") {
13651
- return "0.3.0-beta.5";
13650
+ if ("0.3.0-beta.6") {
13651
+ return "0.3.0-beta.6";
13652
13652
  }
13653
13653
  try {
13654
13654
  const thisDir = dirname3(fileURLToPath2(import.meta.url));
@@ -15996,13 +15996,20 @@ async function report(scenario, opts) {
15996
15996
  console.log(JSON.stringify(rows, null, 2));
15997
15997
  return;
15998
15998
  }
15999
- if (scenario || completedRuns.length === 1) {
15999
+ if (scenario || !opts?.all || completedRuns.length === 1) {
16000
16000
  const run = completedRuns[0];
16001
16001
  const c = run.canonical;
16002
16002
  console.log();
16003
16003
  console.log(
16004
16004
  chalk13.bold(` ${run.manifest.scenario_slug}`) + chalk13.dim(` \u2014 ${run.runId.slice(0, 30)}\u2026`)
16005
16005
  );
16006
+ if (!scenario && completedRuns.length > 1) {
16007
+ console.log(
16008
+ chalk13.dim(
16009
+ ` (Showing latest run for ${run.manifest.scenario_slug}. Pass --all to list all recent runs)`
16010
+ )
16011
+ );
16012
+ }
16006
16013
  console.log(
16007
16014
  ` ${chalk13.dim("url:")} ${run.manifest.target_url} ${chalk13.dim("completed:")} ${run.manifest.completed_at}`
16008
16015
  );
@@ -16095,9 +16102,26 @@ async function report(scenario, opts) {
16095
16102
  }
16096
16103
  }
16097
16104
  }
16105
+ if (c.human_tests && c.human_tests.length > 0) {
16106
+ console.log();
16107
+ console.log(chalk13.bold(" Human Tests:"));
16108
+ for (const ht of c.human_tests) {
16109
+ const v2 = ht.verdict ?? "pending";
16110
+ const color = v2 === "yes" ? chalk13.green : v2 === "no" ? chalk13.red : chalk13.yellow;
16111
+ console.log(
16112
+ ` ${symbols.dot} ${chalk13.bold(ht.question)} \u2192 ${color(v2.toUpperCase())}`
16113
+ );
16114
+ if (ht.reasoning) {
16115
+ console.log(` ${chalk13.dim(ht.reasoning)}`);
16116
+ }
16117
+ }
16118
+ }
16098
16119
  if (c.human_test_overall?.answer) {
16099
16120
  console.log();
16100
16121
  console.log(chalk13.bold(" Verdict: ") + c.human_test_overall.answer);
16122
+ if (c.human_test_overall.reasoning) {
16123
+ console.log(` ${chalk13.dim(c.human_test_overall.reasoning)}`);
16124
+ }
16101
16125
  }
16102
16126
  }
16103
16127
  console.log();
@@ -26110,13 +26134,15 @@ function registerFindingsCommands(program2) {
26110
26134
  await triage2(refs, opts);
26111
26135
  }
26112
26136
  );
26113
- program2.command("report [scenario]").helpGroup("Findings:").description("Show walkthrough results and findings summary").option("--json", "Output as JSON").addHelpText(
26137
+ program2.command("report [scenario]").helpGroup("Findings:").description("Show walkthrough results and findings summary").option("--json", "Output as JSON").option("--all", "Show summary table of all recent runs").addHelpText(
26114
26138
  "after",
26115
- "\nExamples:\n $ iamu report\n $ iamu report checkout-flow\n $ iamu report --json"
26116
- ).action(async (scenario, opts) => {
26117
- const { report: report3 } = await Promise.resolve().then(() => (init_report(), report_exports));
26118
- await report3(scenario, opts);
26119
- });
26139
+ "\nExamples:\n $ iamu report\n $ iamu report checkout-flow\n $ iamu report --all\n $ iamu report --json"
26140
+ ).action(
26141
+ async (scenario, opts) => {
26142
+ const { report: report3 } = await Promise.resolve().then(() => (init_report(), report_exports));
26143
+ await report3(scenario, opts);
26144
+ }
26145
+ );
26120
26146
  program2.command("serve").helpGroup("Findings:").description("[deprecated] Open dashboard (formerly local web UI)").addOption(
26121
26147
  new Option2("--open", "Open the dashboard in a browser").hideHelp()
26122
26148
  ).option("--no-open", "Print the dashboard URL instead of opening a browser").addHelpText(
@@ -1,3 +1,4 @@
1
1
  export declare function report(scenario?: string, opts?: {
2
2
  json?: boolean;
3
+ all?: boolean;
3
4
  }): Promise<void>;
package/dist/index.js CHANGED
@@ -13592,8 +13592,8 @@ import { dirname as dirname3, join as join4, resolve as resolve2 } from "path";
13592
13592
  import { fileURLToPath as fileURLToPath2 } from "url";
13593
13593
  import chalk6 from "chalk";
13594
13594
  function getVersion() {
13595
- if ("0.3.0-beta.5") {
13596
- return "0.3.0-beta.5";
13595
+ if ("0.3.0-beta.6") {
13596
+ return "0.3.0-beta.6";
13597
13597
  }
13598
13598
  try {
13599
13599
  const thisDir = dirname3(fileURLToPath2(import.meta.url));
@@ -15941,13 +15941,20 @@ async function report(scenario, opts) {
15941
15941
  console.log(JSON.stringify(rows, null, 2));
15942
15942
  return;
15943
15943
  }
15944
- if (scenario || completedRuns.length === 1) {
15944
+ if (scenario || !opts?.all || completedRuns.length === 1) {
15945
15945
  const run = completedRuns[0];
15946
15946
  const c = run.canonical;
15947
15947
  console.log();
15948
15948
  console.log(
15949
15949
  chalk13.bold(` ${run.manifest.scenario_slug}`) + chalk13.dim(` \u2014 ${run.runId.slice(0, 30)}\u2026`)
15950
15950
  );
15951
+ if (!scenario && completedRuns.length > 1) {
15952
+ console.log(
15953
+ chalk13.dim(
15954
+ ` (Showing latest run for ${run.manifest.scenario_slug}. Pass --all to list all recent runs)`
15955
+ )
15956
+ );
15957
+ }
15951
15958
  console.log(
15952
15959
  ` ${chalk13.dim("url:")} ${run.manifest.target_url} ${chalk13.dim("completed:")} ${run.manifest.completed_at}`
15953
15960
  );
@@ -16040,9 +16047,26 @@ async function report(scenario, opts) {
16040
16047
  }
16041
16048
  }
16042
16049
  }
16050
+ if (c.human_tests && c.human_tests.length > 0) {
16051
+ console.log();
16052
+ console.log(chalk13.bold(" Human Tests:"));
16053
+ for (const ht of c.human_tests) {
16054
+ const v2 = ht.verdict ?? "pending";
16055
+ const color = v2 === "yes" ? chalk13.green : v2 === "no" ? chalk13.red : chalk13.yellow;
16056
+ console.log(
16057
+ ` ${symbols.dot} ${chalk13.bold(ht.question)} \u2192 ${color(v2.toUpperCase())}`
16058
+ );
16059
+ if (ht.reasoning) {
16060
+ console.log(` ${chalk13.dim(ht.reasoning)}`);
16061
+ }
16062
+ }
16063
+ }
16043
16064
  if (c.human_test_overall?.answer) {
16044
16065
  console.log();
16045
16066
  console.log(chalk13.bold(" Verdict: ") + c.human_test_overall.answer);
16067
+ if (c.human_test_overall.reasoning) {
16068
+ console.log(` ${chalk13.dim(c.human_test_overall.reasoning)}`);
16069
+ }
16046
16070
  }
16047
16071
  }
16048
16072
  console.log();
@@ -26047,13 +26071,15 @@ function registerFindingsCommands(program) {
26047
26071
  await triage2(refs, opts);
26048
26072
  }
26049
26073
  );
26050
- program.command("report [scenario]").helpGroup("Findings:").description("Show walkthrough results and findings summary").option("--json", "Output as JSON").addHelpText(
26074
+ program.command("report [scenario]").helpGroup("Findings:").description("Show walkthrough results and findings summary").option("--json", "Output as JSON").option("--all", "Show summary table of all recent runs").addHelpText(
26051
26075
  "after",
26052
- "\nExamples:\n $ iamu report\n $ iamu report checkout-flow\n $ iamu report --json"
26053
- ).action(async (scenario, opts) => {
26054
- const { report: report3 } = await Promise.resolve().then(() => (init_report(), report_exports));
26055
- await report3(scenario, opts);
26056
- });
26076
+ "\nExamples:\n $ iamu report\n $ iamu report checkout-flow\n $ iamu report --all\n $ iamu report --json"
26077
+ ).action(
26078
+ async (scenario, opts) => {
26079
+ const { report: report3 } = await Promise.resolve().then(() => (init_report(), report_exports));
26080
+ await report3(scenario, opts);
26081
+ }
26082
+ );
26057
26083
  program.command("serve").helpGroup("Findings:").description("[deprecated] Open dashboard (formerly local web UI)").addOption(
26058
26084
  new Option2("--open", "Open the dashboard in a browser").hideHelp()
26059
26085
  ).option("--no-open", "Print the dashboard URL instead of opening a browser").addHelpText(
@@ -50,7 +50,11 @@ Determine the mode based on `$ARGUMENTS` and user intent:
50
50
  6. Run `iamu validate --all`.
51
51
  7. Summarize: persona created in `iamu/personas/<slug>.md`. Prompt user: "You can now pair `<slug>` with a scenario draft via `iamu-new`, or propose situations for them via `iamu-propose`." Stop here for standalone persona requests.
52
52
 
53
- - **Fast-Path Scenario mode** (when intent, topic, or a candidate from `iamu-propose` is provided or referenced from conversational context, e.g. `iamu-new "checkout friction"`, "let's do candidate 2", "draft that", "option 1"):
53
+ - **Fast-Path Scenario mode** (when intent, topic, an Acceptance Criterion / User Story, or a candidate from `iamu-propose` is provided or referenced from conversational context, e.g. `iamu-new "checkout friction"`, `iamu-new "AC: System must require re-auth on payout change"`, "let's do candidate 2", "draft that", "option 1"):
54
+ - **Acceptance Criteria & User Stories:** When input contains an AC or user story:
55
+ 1. *Walkability check:* If the requirement is pure backend/infra (DB encryption, cron jobs, latency) with no observable human/browser workflow, reject: *"Deterministic backend constraint — verify via unit/integration tests."*
56
+ 2. *Entity mapping:* Map the requirement directly to the outline's `--human-test` question (framed as an observable outcome, not a DOM selector) and the story context to the outline's situation (`--narrative`), following the standard `outline.md` and `combine.md` methodologies (zero UI/screen language, evaluated at run completion).
57
+ 3. *Cast matching:* Match the story's actor to an existing persona in `iamu/personas/` (`iamu list personas`). Only propose a new persona if no fitting role exists in the panel.
54
58
  If the user refers to a candidate proposed in the current session, resolve that candidate's details directly from the conversation history.
55
59
  Do NOT drag the user through multiple question modals. Skip Step 2 entirely!
56
60
  Jump directly to Step 3 and present the **Complete Scenario Spec-Sheet** (Situation + Bound Persona + Evaluation Checkpoint + Walker Brief) for **1-click / 1-key acceptance**.
@@ -76,10 +80,27 @@ Present 2–3 scannable scenario proposals. Each proposal MUST bundle the situat
76
80
  • Evaluation Checkpoint: "<Concrete binary question>"
77
81
  ```
78
82
 
79
- **Interactive Decision:**
83
+ **Dual-Surface Candidate Selection (Sequencing Rule):**
84
+ You MUST output the candidate proposals to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the candidates and options embedded in the `question` argument:
85
+
80
86
  - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
81
- - Question: "Scaffold this scenario for walkthrough?"
82
- - Options:
87
+ - **Question:**
88
+ """
89
+ Proposed Test Journey Candidates:
90
+
91
+ 1. <Bundle 1 Title> (<Capability>)
92
+ • Persona: <Persona 1 Name> (<Role>)
93
+ • Tension: <1 concise sentence on human or organizational tension>
94
+ • Evaluation Checkpoint: "<Concrete binary yes/partial/no question>"
95
+
96
+ 2. <Alternative Title> (<Capability>)
97
+ • Persona: <Alternative Persona Name> (<Role>)
98
+ • Tension: <1 concise sentence>
99
+ • Evaluation Checkpoint: "<Concrete binary question>"
100
+
101
+ Scaffold this scenario for walkthrough?
102
+ """
103
+ - **Options:**
83
104
  1. "[Recommended] Scaffold '<Bundle 1 Title>' as <Persona 1 Name>"
84
105
  2. "Switch persona: Walk as <Alternative Persona Name> (<Role>)"
85
106
  3. "Select alternative: '<Bundle 2 Title>' as <Persona 2 Name>"
@@ -98,7 +119,7 @@ Present 2–3 scannable scenario proposals. Each proposal MUST bundle the situat
98
119
 
99
120
  In Fast-Path mode or when customizing, present the complete scenario as a structured, scannable Spec-Sheet before creating anything. Every field shown here is written verbatim to disk on confirmation.
100
121
 
101
- Keep the narrative capped at 2–3 punchy sentences (problem-space only, zero UI terms). (Note: When passing text to modal prompt tools like `ask_question`, use plain text without header hashes or blockquotes; in normal chat output, format clearly with standard markdown).
122
+ Keep the narrative capped at 2–3 punchy sentences (problem-space only, zero UI terms).
102
123
 
103
124
  ```
104
125
  Scenario Spec-Sheet: <Outline Title>
@@ -119,10 +140,26 @@ Persona & Brief:
119
140
  "<First-person brief in persona voice (2–3 sentences). Describes what they intend to achieve before touching the product. Written verbatim to scenario markdown body.>"
120
141
  ```
121
142
 
122
- **Interactive Draft Confirmation:**
143
+ **Dual-Surface Draft Confirmation (Sequencing Rule):**
144
+ You MUST output the complete Scenario Spec-Sheet to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the spec-sheet embedded in the `question` argument so the user can verify all details within the dialog:
145
+
123
146
  - If your environment provides an interactive user-prompt tool, invoke it:
124
- - Question: "Scaffold scenario '<Outline Title>'?"
125
- - Options:
147
+ - **Question:**
148
+ """
149
+ Scenario Spec-Sheet: <Outline Title>
150
+
151
+ Situation & Stakes:
152
+ Narrative: <2–3 sentences problem-space only, zero UI terms>
153
+ Tension: <Colliding needs in X vs Y format or "None">
154
+ Evaluation: <Concrete binary yes/partial/no question scored at evaluation>
155
+
156
+ Persona & Brief:
157
+ Persona: <Name> (<Role>) — Friction: <Diagnostic friction trigger>
158
+ Walker Brief: "<First-person brief in persona voice (2–3 sentences)>"
159
+
160
+ Scaffold scenario '<Outline Title>'?
161
+ """
162
+ - **Options:**
126
163
  1. "[Recommended] Scaffold scenario and prepare walkthrough"
127
164
  2. "Switch persona: Walk as <Alternative Persona> (<Role>)"
128
165
  3. "Adjust situation, checkpoint, or brief"
@@ -55,12 +55,13 @@ Build a coverage picture: which capabilities have scenarios? Which actors from `
55
55
 
56
56
  ### 3. Determine focus
57
57
 
58
- Four entry paths based on `$ARGUMENTS`:
58
+ Five entry paths based on `$ARGUMENTS`:
59
59
 
60
60
  - **Persona / Tester panel** (e.g. `iamu-propose "personas"`, `"who else should we test with?"`, `"propose new personas"`) — analyze which actors from `context.yml` lack personas in `iamu/personas/`. Focus proposals on creating durable, diagnostically biased personas for uncovered roles.
61
61
  - **Area or capability** (e.g. `iamu-propose "employee provisioning"`) — focus proposals on this area. Match against capabilities and context actors/workflows.
62
62
  - **Open-ended** (e.g. `iamu-propose`, `iamu-propose "what's missing?"`) — analyze coverage gaps across scenarios and persona diversity. Prioritize untested product areas and actors without personas.
63
63
  - **Specific tension** (e.g. `iamu-propose "what happens when the safety coordinator disagrees with HR?"`) — use as seed but ground in context. Verify the tension is real (do these actors and dynamics exist in the domain?).
64
+ - **Requirement / Acceptance Criteria** (e.g. `iamu-propose "AC: require re-auth on payout change"`, user stories, or RFP clauses) — verify walkability first (reject pure backend/infra for unit/integration coverage). Ground the requirement in domain situations: propose 2–3 contrasting candidates showing how different actors from `context.yml` or the casting panel encounter this requirement under different pressures, with the AC mapped to each candidate's `--human-test` evaluation checkpoint.
64
65
 
65
66
  ### 4. Present candidates (Numbered Cards)
66
67
 
@@ -88,10 +89,24 @@ Existing coverage: <N> scenarios ([<slug1>](iamu/scenarios/<slug1>.md), ...). Un
88
89
  • Tension: <1-line human/domain tension>
89
90
  • Stress-tests: <What this reveals about the product>
90
91
 
91
- **Interactive Candidate Selection:**
92
+ **Dual-Surface Candidate Selection (Sequencing Rule):**
93
+ You MUST output the proposed candidates to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the candidates and tensions embedded in the `question` argument:
94
+
92
95
  - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
93
- - Question: "Which scenario candidate would you like to scaffold?"
94
- - Options:
96
+ - **Question:**
97
+ """
98
+ Proposed Scenario Candidates:
99
+
100
+ 1. <Candidate 1 Title> (<Actor>)
101
+ • Capability: <Capability slug> · Tension: <1-line human tension>
102
+ 2. <Candidate 2 Title> (<Actor>)
103
+ • Capability: <Capability slug> · Tension: <1-line human tension>
104
+ 3. <Candidate 3 Title> (<Actor>)
105
+ • Capability: <Capability slug> · Tension: <1-line human tension>
106
+
107
+ Which scenario candidate would you like to scaffold?
108
+ """
109
+ - **Options:**
95
110
  1. "[Recommended] Scaffold '<Candidate 1 Title>' (<Actor>)"
96
111
  2. "Scaffold '<Candidate 2 Title>' (<Actor>)"
97
112
  3. "Scaffold '<Candidate 3 Title>' (<Actor>)"
@@ -119,10 +134,24 @@ Existing personas: [<slug1>](iamu/personas/<slug1>.md), ... Uncovered roles from
119
134
  • Key Expectations & Vocabulary: <Domain terms and spec requirements>
120
135
  ```
121
136
 
122
- **Interactive Persona Selection:**
137
+ **Dual-Surface Persona Selection (Sequencing Rule):**
138
+ You MUST output the proposed personas to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the candidates embedded in the `question` argument:
139
+
123
140
  - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
124
- - Question: "Which persona would you like to add to the casting panel?"
125
- - Options:
141
+ - **Question:**
142
+ """
143
+ Proposed Persona Candidates:
144
+
145
+ 1. <Name 1> (<Actor role>)
146
+ • Friction: <Friction triggers and bounce risks>
147
+ 2. <Name 2> (<Actor role>)
148
+ • Friction: <Friction triggers and bounce risks>
149
+ 3. <Name 3> (<Actor role>)
150
+ • Friction: <Friction triggers and bounce risks>
151
+
152
+ Which persona would you like to add to the casting panel?
153
+ """
154
+ - **Options:**
126
155
  1. "[Recommended] Add <Name 1> (<Actor role>)"
127
156
  2. "Add <Name 2> (<Actor role>)"
128
157
  3. "Add <Name 3> (<Actor role>)"
@@ -427,17 +427,19 @@ The `walker_prompt` from `iamu instructions walk` is the source of truth and con
427
427
 
428
428
  ### 5. Present assessment — stay in the conversation
429
429
 
430
- Render results **inline** as a concise executive scorecard.
431
-
432
- **ANTI-BLOAT DIRECTIVE:** Terminal viewports are small. Never output multi-screen walls of markdown text. The overview exists only to present the top-line score and orient the user for triage. Do NOT dump long quotes, recommendations, full descriptions, or "What Worked" essays here — those belong in the interactive triage step below.
433
-
434
- Keep the presentation under 15 lines total. Output as rich Markdown (do NOT wrap the entire summary in a triple-backtick code block so links render as clickable):
430
+ You MUST output the complete Executive Scorecard to the chat stream FIRST. Output as rich Markdown (do NOT wrap the entire summary in code fences so links render as clickable):
435
431
 
436
432
  ### Walkthrough Complete: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
437
433
  **Verdict:** <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (<StepCount> steps)
438
- **Checkpoint:** "<human_tests[0].question>" → <No / Partial / Yes>: <1-sentence direct answer>
439
434
 
440
- #### Findings:
435
+ > 🎯 **Human Test Checkpoint:**
436
+ > **Question:** "<human_tests[0].question>"
437
+ > **Verdict:** **<NO / PARTIAL / YES>** — <1-2 sentences evaluator reasoning from verdicts.json / report.md>
438
+
439
+ > ☁️ **Cloud Walkthrough:** [Open in Iamu Cloud](<url from iamu open <run-id> --print>)
440
+ *(If local-only, render instead: `> **Artifact:** [iamu/.runs/<run-id>/report.md](iamu/.runs/<run-id>/report.md) (Local only)`)*
441
+
442
+ #### Findings Overview:
441
443
  1. **[CRITICAL]** · *<type>* · <Short title> (Step <N> at `<short_url_path>`)
442
444
  2. **[MAJOR]** · *<type>* · <Short title> (Step <N> at `<short_url_path>`)
443
445
  ...
@@ -445,23 +447,17 @@ Keep the presentation under 15 lines total. Output as rich Markdown (do NOT wrap
445
447
 
446
448
  (If canonical.json contains a `verification` section, include a 1-line delta: `Since last run: ✓ <N> fixed · ✗ <M> persist · + <K> new`.)
447
449
 
448
- > ☁️ **Cloud Walkthrough:** [Open in Iamu Cloud](<url from iamu open <run-id> --print>)
449
- *(If local-only, render instead: `> **Artifact:** [iamu/.runs/<run-id>/report.md](iamu/.runs/<run-id>/report.md) (Local only)`)*
450
+ Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the scorecard scannable.
450
451
 
451
- Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the entire summary under 15 lines, then immediately present the triage prompt below.
452
+ **Zero-Friction Triage Transition (Eliminate Meta-Prompt Gate):**
453
+ Do NOT prompt the user with a generic "How would you like to proceed?" multiple-choice modal. That intermediate prompt adds cognitive friction, duplicates the triage options, and obscures the assessment scorecard.
452
454
 
453
- 7. **Next actions (Interactive Triage Selection)**:
454
- When the walkthrough completes and yields findings:
455
- - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
456
- - Question: "Walkthrough complete: <F> findings reported. How would you like to proceed?"
457
- - Options:
458
- 1. "[Recommended] Walk through findings one by one"
459
- 2. "Apply fixes for all clear findings (batch fix)"
460
- 3. "Discuss findings and persona friction points"
461
- 4. "Re-run walkthrough to test changes"
462
- - Otherwise (in CLI or text-only environments):
463
- Walkthrough complete: <F> findings reported. I recommend walking through findings one by one.
464
- Proceeding with one-by-one triage. (Say "batch fix", "discuss", or "re-run" to change course).
455
+ - **If `<F> == 0` (Walkthrough Passed):**
456
+ Output: "✓ Walkthrough passed with zero friction points or blockers. Scenario validated successfully."
457
+ Do not enter triage.
458
+
459
+ - **If `<F> > 0` (Walkthrough Has Findings):**
460
+ Output the Executive Scorecard above to chat FIRST, and advance IMMEDIATELY to triage on **Finding #1 of <total>** (Step 6 below) in the same turn. The user can choose to queue to fix, queue all remaining fixes (batch accept), dismiss, or discuss directly from Finding #1.
465
461
 
466
462
  ### 6. Conversational Triage & Guided Review
467
463
 
@@ -77,7 +77,10 @@ No local codebase detected. To seed context, provide one of:
77
77
 
78
78
  ### 3. Step 1/3: Establish the Safety Fence (`iamu/testability.md`)
79
79
 
80
- Present the detected environment and safety fence. Explain clearly *why* this boundary is required before any autonomous agent runs. Do NOT wrap in markdown code fences (` ``` `) when presenting to the user:
80
+ Present the detected environment and safety fence. Explain clearly *why* this boundary is required before any autonomous agent runs.
81
+
82
+ **Dual-Surface Prompting (Sequencing Rule):**
83
+ You MUST output the safety fence card to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the full context embedded in the `question` argument:
81
84
 
82
85
  ```text
83
86
  Step 1/3: Safety Fence & Environment Boundary
@@ -93,12 +96,30 @@ Detected Environment:
93
96
  **Interactive Decision Gate:**
94
97
  Prompt the user to verify the safety boundary:
95
98
  - If interactive user-prompt tools exist (`ask_question`, `ask_followup_question`), invoke it:
96
- - Question: "Confirm safety fence and dev environment?"
97
- - Options:
99
+ - **Question:**
100
+ """
101
+ Step 1/3: Confirm Safety Fence & Dev Environment
102
+
103
+ Target URL: <target_url>
104
+ Dev Command: <dev_command>
105
+ Safe Fixtures: <detected seed scripts or mock handlers>
106
+
107
+ DO NOT WALK (Untestable Boundaries):
108
+ <detected external services, real SMS/email gateways, external submission portals>
109
+
110
+ Confirm safety fence and dev environment?
111
+ """
112
+ - **Options:**
98
113
  1. "[Recommended] Safety boundaries look safe — save fence and proceed"
99
114
  2. "Adjust boundaries (add forbidden external URLs, change dev command or port)"
100
115
  3. "Skip safety fence for now"
101
116
  - Otherwise (text-only/CLI):
117
+ Step 1/3: Safety Fence & Environment Boundary
118
+ Target URL: <target_url>
119
+ Dev Command: <dev_command>
120
+ Safe Fixtures: <detected seed scripts or mock handlers>
121
+ DO NOT WALK: <detected external services>
122
+
102
123
  Safety boundaries look safe. I recommend saving fence and proceeding.
103
124
  Proceeding to save safety fence — say "adjust" to change boundaries or "skip" to defer.
104
125
 
@@ -138,7 +159,10 @@ iamu set testability \
138
159
 
139
160
  Explain the purpose of project context: traditional tests only assert button clicks; Iamu evaluates user confusion, workflow friction, and whether a real person can succeed under real-world constraints.
140
161
 
141
- Present the discovered domain and project description. Do NOT introduce or ask the user to approve personas or roles at this stage — personas are cast later when designing specific test journeys. Do NOT wrap in markdown code fences (` ``` `) when presenting to the user:
162
+ Present the discovered domain and project description. Do NOT introduce or ask the user to approve personas or roles at this stage — personas are cast later when designing specific test journeys.
163
+
164
+ **Dual-Surface Prompting (Sequencing Rule):**
165
+ You MUST output the domain context and project description to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the complete substantive project description embedded in the `question` argument so the reviewer can read the full text directly within the dialog modal:
142
166
 
143
167
  ```text
144
168
  Step 2/3: Project Domain & Description
@@ -154,15 +178,38 @@ Project Description:
154
178
  <1 cohesive paragraph: what the software fundamentally does, its primary user workflows, and the real-world conditions under which it is used. No marketing buzzwords, no hedging, and no tech stack trivia.>
155
179
  ```
156
180
 
157
- **Interactive Decision Gate:**
158
- Prompt the user to verify the project description:
181
+ **CRITICAL: Embed Full Project Description in Interactive Prompt Modal:**
182
+ Host interactive tools (`ask_question`, `ask_followup_question`) render a modal that obscures the terminal/chat and displays ONLY the tool's `question` argument. Never ask the user to confirm an invisible description. You MUST embed the full drafted project description text inside the `question` argument:
183
+
159
184
  - If interactive user-prompt tools exist (`ask_question`, `ask_followup_question`), invoke it:
160
- - Question: "Confirm project domain & description?"
161
- - Options:
185
+ - **Question:**
186
+ """
187
+ Step 2/3: Confirm Project Domain & Description
188
+
189
+ Domain: <domain name>
190
+ Industry: <industry>
191
+ Jurisdiction: <jurisdiction or omit if standard web app>
192
+ Governed By: <statutory regulations or standards, or omit if unregulated>
193
+
194
+ PROJECT DESCRIPTION:
195
+ <1 cohesive paragraph: what the software fundamentally does, its primary user workflows, and the real-world conditions under which it is used>
196
+
197
+ Confirm project domain & description?
198
+ """
199
+ - **Options:**
162
200
  1. "[Recommended] Project description is accurate — proceed to design first test"
163
201
  2. "Save project description only (skip scenario creation for now)"
164
202
  3. "Adjust domain or description"
165
203
  - Otherwise (text-only/CLI):
204
+ Step 2/3: Project Domain & Description
205
+ Domain: <domain name>
206
+ Industry: <industry>
207
+ Jurisdiction: <jurisdiction>
208
+ Governed By: <statutory regulations or standards>
209
+
210
+ Project Description:
211
+ <1 cohesive paragraph>
212
+
166
213
  Project description is accurate. I recommend proceeding to design your first test.
167
214
  Proceeding to first test design — say "save only" or describe adjustments to change course.
168
215
 
@@ -185,7 +232,10 @@ iamu set context \
185
232
 
186
233
  Explain the journey model: an Iamu test binds a **Persona** (with habits, pressures, and impatience) to a **Situation** (a realistic high-stakes problem) with an **Evaluation Checkpoint** (a concrete binary question for the AI judge).
187
234
 
188
- Present the proposed test journey, including explicit **Auth Precondition Verification**. Do NOT wrap in markdown code fences (` ``` `) when presenting to the user:
235
+ Present the proposed test journey, including explicit **Auth Precondition Verification**.
236
+
237
+ **Dual-Surface Prompting (Sequencing Rule):**
238
+ You MUST output the baseline test proposal to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the full journey spec embedded in the `question` argument:
189
239
 
190
240
  ```text
191
241
  Step 3/3: Co-Design Your First Test Journey
@@ -204,11 +254,26 @@ Baseline Test Proposal (WYSIWGW Spec-Sheet):
204
254
  Walker Brief: "<2–3 sentence first-person test brief that will be written verbatim to disk. States immediate intent and constraints before opening tool. Zero UI terminology.>"
205
255
  ```
206
256
 
207
- **Interactive Decision Gate:**
208
- Prompt the user to verify the scenario and its auth precondition:
257
+ **CRITICAL: Embed Journey Spec in Interactive Prompt Modal:**
209
258
  - If interactive user-prompt tools exist (`ask_question`, `ask_followup_question`), invoke it:
210
- - Question: "Scaffold this baseline journey?"
211
- - Options:
259
+ - **Question:**
260
+ """
261
+ Step 3/3: Confirm Baseline Test Journey
262
+
263
+ Capability: <Capability Name> (<What staff can do in this area>)
264
+ Persona: <Name> (<Role / Title>) — Friction: <Diagnostic friction trigger>
265
+ Situation: <Outline Title>
266
+ Core Tension: <Core problem-space tension in X vs Y format>
267
+ Evaluation Check: <Concrete binary yes/partial/no question for evaluator>
268
+ Walk Surface: Entry: `<entry_path>` | Target: `<target_url>`
269
+ Auth Precondition: <Detected auth mechanism>
270
+
271
+ WALKER BRIEF:
272
+ "<2–3 sentence first-person test brief>"
273
+
274
+ Scaffold this baseline journey?
275
+ """
276
+ - **Options:**
212
277
  1. "[Recommended] Scaffold journey with <detected auth mechanism>"
213
278
  2. "Use interactive human login handshake (pause browser for live login)"
214
279
  3. "Switch role / design a different scenario (write-in)"
@@ -105,10 +105,25 @@ Now present the **Strategic Fork** to the user. Do not be an unyielding bureaucr
105
105
  - State: "This situation reads a public page and requires no pre-existing world state."
106
106
  - Mark `--state-description "No particular data needed"`.
107
107
 
108
- **Interactive Decision Gate:**
108
+ **Dual-Surface Staging Gate (Sequencing Rule):**
109
+ You MUST output the staging options to the chat stream FIRST. In the SAME turn, invoke `ask_question` with the staging options and requirements embedded in the `question` argument:
110
+
109
111
  - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
110
- - Question: "How should we stage '<scenario-slug>' for walkthrough?"
111
- - Options:
112
+ - **Question:**
113
+ """
114
+ Staging Plan for '<scenario-slug>':
115
+
116
+ Entry Route: <route>
117
+ Required World State: <Description of required world in domain words>
118
+
119
+ Staging Options:
120
+ • Option A (Testability): <concrete seed or mock fixture proposal>
121
+ • Option B (Semantic Squinting): <squinting rule formula>
122
+ • Option C (Zero Setup): <why flow is public or self-contained>
123
+
124
+ How should we stage '<scenario-slug>' for walkthrough?
125
+ """
126
+ - **Options:**
112
127
  1. "[Recommended] Option A: Build Testability (<brief seed proposal>)"
113
128
  2. "Option B: Semantic Squinting (test immediately against current dev database)"
114
129
  3. "Option C: Zero Setup Needed (public or self-contained flow)"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamu-dev/iamu",
3
- "version": "0.3.0-beta.5",
3
+ "version": "0.3.0-beta.6",
4
4
  "type": "module",
5
5
  "description": "Test your product as realistic personas — scenario-driven development CLI",
6
6
  "license": "UNLICENSED",
@@ -58,9 +58,9 @@
58
58
  "tsup": "^8.5.1",
59
59
  "typescript": "^5.8.0",
60
60
  "vitest": "^4.1.11",
61
- "@iamu-dev/local-store": "0.1.0",
62
61
  "@iamu-dev/protocol": "0.1.0",
63
- "@iamu/tsconfig": "0.1.0"
62
+ "@iamu/tsconfig": "0.1.0",
63
+ "@iamu-dev/local-store": "0.1.0"
64
64
  },
65
65
  "scripts": {
66
66
  "build": "tsup && tsc -b --force tsconfig.build.json --emitDeclarationOnly && node scripts/copy-assets.mjs",