@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 +35 -9
- package/dist/commands/report.d.ts +1 -0
- package/dist/index.js +35 -9
- package/dist/templates/skills/iamu-new.md +45 -8
- package/dist/templates/skills/iamu-propose.md +36 -7
- package/dist/templates/skills/iamu-run.md +18 -22
- package/dist/templates/skills/iamu-setup.md +78 -13
- package/dist/templates/skills/iamu-stage.md +18 -3
- package/package.json +3 -3
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.
|
|
13651
|
-
return "0.3.0-beta.
|
|
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(
|
|
26117
|
-
|
|
26118
|
-
|
|
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(
|
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.
|
|
13596
|
-
return "0.3.0-beta.
|
|
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(
|
|
26054
|
-
|
|
26055
|
-
|
|
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
|
-
**
|
|
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
|
|
82
|
-
|
|
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).
|
|
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
|
-
**
|
|
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
|
|
125
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
|
94
|
-
|
|
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
|
-
**
|
|
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
|
|
125
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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.
|
|
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
|
|
97
|
-
|
|
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.
|
|
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
|
|
158
|
-
|
|
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
|
|
161
|
-
|
|
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**.
|
|
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
|
|
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
|
|
211
|
-
|
|
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
|
-
**
|
|
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
|
|
111
|
-
|
|
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.
|
|
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",
|