@jevitate/cli 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.js +40 -30
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/author-journey-cli.d.ts +4 -0
  5. package/dist/author-journey-cli.js +109 -0
  6. package/dist/author-journey-cli.js.map +1 -0
  7. package/dist/bin.js +58077 -22454
  8. package/dist/bin.js.map +1 -1
  9. package/dist/browser-run-options.d.ts +58 -0
  10. package/dist/browser-run-options.js +106 -0
  11. package/dist/browser-run-options.js.map +1 -0
  12. package/dist/build-info.generated.d.ts +2 -0
  13. package/dist/build-info.generated.js +10 -0
  14. package/dist/build-info.generated.js.map +1 -0
  15. package/dist/check-api.d.ts +5 -0
  16. package/dist/check-api.js +233 -0
  17. package/dist/check-api.js.map +1 -0
  18. package/dist/check-budget.d.ts +26 -0
  19. package/dist/check-budget.js +89 -0
  20. package/dist/check-budget.js.map +1 -0
  21. package/dist/check-cli.d.ts +31 -0
  22. package/dist/check-cli.js +109 -0
  23. package/dist/check-cli.js.map +1 -0
  24. package/dist/check-execute.d.ts +25 -0
  25. package/dist/check-execute.js +385 -0
  26. package/dist/check-execute.js.map +1 -0
  27. package/dist/check-plan.d.ts +113 -0
  28. package/dist/check-plan.js +448 -0
  29. package/dist/check-plan.js.map +1 -0
  30. package/dist/check-suite.d.ts +171 -0
  31. package/dist/check-suite.js +515 -0
  32. package/dist/check-suite.js.map +1 -0
  33. package/dist/check-types.d.ts +181 -0
  34. package/dist/check-types.js +35 -0
  35. package/dist/check-types.js.map +1 -0
  36. package/dist/cli-args.d.ts +26 -0
  37. package/dist/cli-args.js +50 -0
  38. package/dist/cli-args.js.map +1 -0
  39. package/dist/cli-output.d.ts +102 -0
  40. package/dist/cli-output.js +516 -0
  41. package/dist/cli-output.js.map +1 -0
  42. package/dist/cli-reference.d.ts +3 -0
  43. package/dist/cli-reference.js +81 -0
  44. package/dist/cli-reference.js.map +1 -0
  45. package/dist/cli-refusal.d.ts +12 -0
  46. package/dist/cli-refusal.js +52 -0
  47. package/dist/cli-refusal.js.map +1 -0
  48. package/dist/cli-shared.d.ts +330 -0
  49. package/dist/cli-shared.js +492 -0
  50. package/dist/cli-shared.js.map +1 -0
  51. package/dist/cli-surface.d.ts +33 -0
  52. package/dist/cli-surface.js +48 -0
  53. package/dist/cli-surface.js.map +1 -0
  54. package/dist/conversation-options.d.ts +15 -0
  55. package/dist/conversation-options.js +10 -0
  56. package/dist/conversation-options.js.map +1 -0
  57. package/dist/credentials-file.d.ts +15 -0
  58. package/dist/credentials-file.js +56 -0
  59. package/dist/credentials-file.js.map +1 -0
  60. package/dist/data-dir.d.ts +1 -1
  61. package/dist/data-dir.js +1 -1
  62. package/dist/defect-evidence.d.ts +141 -0
  63. package/dist/defect-evidence.js +502 -0
  64. package/dist/defect-evidence.js.map +1 -0
  65. package/dist/demo-aspect-api.d.ts +209 -0
  66. package/dist/demo-aspect-api.js +397 -0
  67. package/dist/demo-aspect-api.js.map +1 -0
  68. package/dist/demo-aspect-cli.d.ts +3 -0
  69. package/dist/demo-aspect-cli.js +241 -0
  70. package/dist/demo-aspect-cli.js.map +1 -0
  71. package/dist/demo-capture.d.ts +108 -0
  72. package/dist/demo-capture.js +438 -0
  73. package/dist/demo-capture.js.map +1 -0
  74. package/dist/engine.d.ts +35 -0
  75. package/dist/engine.js +25 -0
  76. package/dist/engine.js.map +1 -0
  77. package/dist/environments.d.ts +155 -0
  78. package/dist/environments.js +364 -0
  79. package/dist/environments.js.map +1 -0
  80. package/dist/exit-codes.d.ts +46 -0
  81. package/dist/exit-codes.js +91 -0
  82. package/dist/exit-codes.js.map +1 -0
  83. package/dist/explore-adversarial.d.ts +137 -0
  84. package/dist/explore-adversarial.js +218 -0
  85. package/dist/explore-adversarial.js.map +1 -0
  86. package/dist/explore-api.d.ts +7 -187
  87. package/dist/explore-api.js +7 -301
  88. package/dist/explore-api.js.map +1 -1
  89. package/dist/explore-author.d.ts +79 -0
  90. package/dist/explore-author.js +86 -0
  91. package/dist/explore-author.js.map +1 -0
  92. package/dist/explore-cli.d.ts +7 -0
  93. package/dist/explore-cli.js +963 -0
  94. package/dist/explore-cli.js.map +1 -0
  95. package/dist/explore-coverage.d.ts +158 -0
  96. package/dist/explore-coverage.js +240 -0
  97. package/dist/explore-coverage.js.map +1 -0
  98. package/dist/explore-feature.d.ts +127 -0
  99. package/dist/explore-feature.js +220 -0
  100. package/dist/explore-feature.js.map +1 -0
  101. package/dist/explore-goal.d.ts +253 -0
  102. package/dist/explore-goal.js +374 -0
  103. package/dist/explore-goal.js.map +1 -0
  104. package/dist/explore-shared.d.ts +152 -0
  105. package/dist/explore-shared.js +129 -0
  106. package/dist/explore-shared.js.map +1 -0
  107. package/dist/explore-specs.d.ts +53 -0
  108. package/dist/explore-specs.js +333 -0
  109. package/dist/explore-specs.js.map +1 -0
  110. package/dist/findings-filing.d.ts +64 -0
  111. package/dist/findings-filing.js +108 -0
  112. package/dist/findings-filing.js.map +1 -0
  113. package/dist/fixture-auth.d.ts +52 -0
  114. package/dist/fixture-auth.js +82 -0
  115. package/dist/fixture-auth.js.map +1 -0
  116. package/dist/fixture-cli.d.ts +70 -0
  117. package/dist/fixture-cli.js +178 -0
  118. package/dist/fixture-cli.js.map +1 -0
  119. package/dist/github-issue-filer.d.ts +62 -0
  120. package/dist/github-issue-filer.js +188 -0
  121. package/dist/github-issue-filer.js.map +1 -0
  122. package/dist/host-health-run.d.ts +24 -0
  123. package/dist/host-health-run.js +27 -0
  124. package/dist/host-health-run.js.map +1 -0
  125. package/dist/http-5xx-outcome.d.ts +6 -0
  126. package/dist/http-5xx-outcome.js +39 -0
  127. package/dist/http-5xx-outcome.js.map +1 -0
  128. package/dist/inbox-cli.d.ts +7 -0
  129. package/dist/inbox-cli.js +197 -0
  130. package/dist/inbox-cli.js.map +1 -0
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +1 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/init-cli.d.ts +4 -0
  135. package/dist/init-cli.js +127 -0
  136. package/dist/init-cli.js.map +1 -0
  137. package/dist/init-keys.d.ts +19 -2
  138. package/dist/init-keys.js +15 -4
  139. package/dist/init-keys.js.map +1 -1
  140. package/dist/init-next-steps.d.ts +35 -0
  141. package/dist/init-next-steps.js +79 -0
  142. package/dist/init-next-steps.js.map +1 -0
  143. package/dist/invariants-file.d.ts +34 -0
  144. package/dist/invariants-file.js +68 -0
  145. package/dist/invariants-file.js.map +1 -0
  146. package/dist/invariants-validate.d.ts +30 -0
  147. package/dist/invariants-validate.js +105 -0
  148. package/dist/invariants-validate.js.map +1 -0
  149. package/dist/journey-annotate-api.d.ts +76 -0
  150. package/dist/journey-annotate-api.js +256 -0
  151. package/dist/journey-annotate-api.js.map +1 -0
  152. package/dist/journey-annotate-cli.d.ts +9 -0
  153. package/dist/journey-annotate-cli.js +179 -0
  154. package/dist/journey-annotate-cli.js.map +1 -0
  155. package/dist/journey-api.d.ts +79 -2
  156. package/dist/journey-api.js +136 -19
  157. package/dist/journey-api.js.map +1 -1
  158. package/dist/journey-cli.d.ts +4 -0
  159. package/dist/journey-cli.js +370 -0
  160. package/dist/journey-cli.js.map +1 -0
  161. package/dist/journey-demo-api.d.ts +112 -0
  162. package/dist/journey-demo-api.js +392 -0
  163. package/dist/journey-demo-api.js.map +1 -0
  164. package/dist/journey-demo-cli.d.ts +10 -0
  165. package/dist/journey-demo-cli.js +155 -0
  166. package/dist/journey-demo-cli.js.map +1 -0
  167. package/dist/kill-signal.d.ts +193 -0
  168. package/dist/kill-signal.js +284 -0
  169. package/dist/kill-signal.js.map +1 -0
  170. package/dist/launch-armed.d.ts +37 -0
  171. package/dist/launch-armed.js +31 -0
  172. package/dist/launch-armed.js.map +1 -0
  173. package/dist/ledger-api.d.ts +106 -0
  174. package/dist/ledger-api.js +237 -0
  175. package/dist/ledger-api.js.map +1 -0
  176. package/dist/ledger-cli.d.ts +18 -0
  177. package/dist/ledger-cli.js +107 -0
  178. package/dist/ledger-cli.js.map +1 -0
  179. package/dist/load-api.d.ts +29 -11
  180. package/dist/load-api.js +23 -15
  181. package/dist/load-api.js.map +1 -1
  182. package/dist/load-cli.d.ts +4 -0
  183. package/dist/load-cli.js +97 -0
  184. package/dist/load-cli.js.map +1 -0
  185. package/dist/log-correlation.d.ts +147 -0
  186. package/dist/log-correlation.js +325 -0
  187. package/dist/log-correlation.js.map +1 -0
  188. package/dist/log-lines.d.ts +131 -0
  189. package/dist/log-lines.js +389 -0
  190. package/dist/log-lines.js.map +1 -0
  191. package/dist/log-sources.d.ts +71 -0
  192. package/dist/log-sources.js +235 -0
  193. package/dist/log-sources.js.map +1 -0
  194. package/dist/logs-cli.d.ts +3 -0
  195. package/dist/logs-cli.js +51 -0
  196. package/dist/logs-cli.js.map +1 -0
  197. package/dist/logs-retention.d.ts +28 -0
  198. package/dist/logs-retention.js +84 -0
  199. package/dist/logs-retention.js.map +1 -0
  200. package/dist/mcp-api.d.ts +89 -1
  201. package/dist/mcp-api.js +472 -18
  202. package/dist/mcp-api.js.map +1 -1
  203. package/dist/mcp-args.d.ts +38 -0
  204. package/dist/mcp-args.js +131 -0
  205. package/dist/mcp-args.js.map +1 -0
  206. package/dist/mcp-cli-bridge.d.ts +34 -0
  207. package/dist/mcp-cli-bridge.js +62 -0
  208. package/dist/mcp-cli-bridge.js.map +1 -0
  209. package/dist/mcp-cli-runner.d.ts +29 -0
  210. package/dist/mcp-cli-runner.js +44 -0
  211. package/dist/mcp-cli-runner.js.map +1 -0
  212. package/dist/mcp-cli-tools.d.ts +125 -0
  213. package/dist/mcp-cli-tools.js +680 -0
  214. package/dist/mcp-cli-tools.js.map +1 -0
  215. package/dist/mcp-paths.d.ts +28 -0
  216. package/dist/mcp-paths.js +76 -0
  217. package/dist/mcp-paths.js.map +1 -0
  218. package/dist/mission-actors.d.ts +40 -0
  219. package/dist/mission-actors.js +72 -0
  220. package/dist/mission-actors.js.map +1 -0
  221. package/dist/mission-api.d.ts +35 -0
  222. package/dist/mission-api.js +58 -2
  223. package/dist/mission-api.js.map +1 -1
  224. package/dist/mission-cli.d.ts +4 -0
  225. package/dist/mission-cli.js +247 -0
  226. package/dist/mission-cli.js.map +1 -0
  227. package/dist/mission-exit.d.ts +22 -0
  228. package/dist/mission-exit.js +26 -0
  229. package/dist/mission-exit.js.map +1 -0
  230. package/dist/mission-fixtures.d.ts +225 -0
  231. package/dist/mission-fixtures.js +828 -0
  232. package/dist/mission-fixtures.js.map +1 -0
  233. package/dist/mission-journal.d.ts +60 -0
  234. package/dist/mission-journal.js +115 -0
  235. package/dist/mission-journal.js.map +1 -0
  236. package/dist/mission-queue-cli.d.ts +10 -0
  237. package/dist/mission-queue-cli.js +198 -0
  238. package/dist/mission-queue-cli.js.map +1 -0
  239. package/dist/mission-queue-runner.d.ts +126 -0
  240. package/dist/mission-queue-runner.js +397 -0
  241. package/dist/mission-queue-runner.js.map +1 -0
  242. package/dist/multi-run-cli.d.ts +37 -0
  243. package/dist/multi-run-cli.js +110 -0
  244. package/dist/multi-run-cli.js.map +1 -0
  245. package/dist/multi-run.d.ts +339 -0
  246. package/dist/multi-run.js +619 -0
  247. package/dist/multi-run.js.map +1 -0
  248. package/dist/openrouter-call.d.ts +22 -0
  249. package/dist/openrouter-call.js +63 -0
  250. package/dist/openrouter-call.js.map +1 -0
  251. package/dist/profile-cli.d.ts +4 -0
  252. package/dist/profile-cli.js +57 -0
  253. package/dist/profile-cli.js.map +1 -0
  254. package/dist/program.d.ts +3 -75
  255. package/dist/program.js +119 -1921
  256. package/dist/program.js.map +1 -1
  257. package/dist/project-dir.d.ts +96 -0
  258. package/dist/project-dir.js +220 -0
  259. package/dist/project-dir.js.map +1 -0
  260. package/dist/record-api.d.ts +10 -6
  261. package/dist/record-api.js +39 -28
  262. package/dist/record-api.js.map +1 -1
  263. package/dist/record-cli.d.ts +4 -0
  264. package/dist/record-cli.js +64 -0
  265. package/dist/record-cli.js.map +1 -0
  266. package/dist/recording-cli.d.ts +4 -0
  267. package/dist/recording-cli.js +248 -0
  268. package/dist/recording-cli.js.map +1 -0
  269. package/dist/regression-api.d.ts +101 -0
  270. package/dist/regression-api.js +384 -5
  271. package/dist/regression-api.js.map +1 -1
  272. package/dist/regression-cli.d.ts +4 -0
  273. package/dist/regression-cli.js +232 -0
  274. package/dist/regression-cli.js.map +1 -0
  275. package/dist/report-api.d.ts +146 -0
  276. package/dist/report-api.js +430 -0
  277. package/dist/report-api.js.map +1 -0
  278. package/dist/report-cli.d.ts +12 -0
  279. package/dist/report-cli.js +147 -0
  280. package/dist/report-cli.js.map +1 -0
  281. package/dist/result-schema.d.ts +22 -0
  282. package/dist/result-schema.js +28 -0
  283. package/dist/result-schema.js.map +1 -0
  284. package/dist/run-index.d.ts +29 -0
  285. package/dist/run-index.js +70 -0
  286. package/dist/run-index.js.map +1 -0
  287. package/dist/run-screenshots.d.ts +123 -0
  288. package/dist/run-screenshots.js +229 -0
  289. package/dist/run-screenshots.js.map +1 -0
  290. package/dist/runtime-env.d.ts +8 -0
  291. package/dist/runtime-env.js +22 -0
  292. package/dist/runtime-env.js.map +1 -0
  293. package/dist/secret-args.d.ts +23 -0
  294. package/dist/secret-args.js +45 -0
  295. package/dist/secret-args.js.map +1 -0
  296. package/dist/serve-cli.d.ts +4 -0
  297. package/dist/serve-cli.js +95 -0
  298. package/dist/serve-cli.js.map +1 -0
  299. package/dist/server-log-verify.d.ts +34 -0
  300. package/dist/server-log-verify.js +115 -0
  301. package/dist/server-log-verify.js.map +1 -0
  302. package/dist/session-check.d.ts +14 -0
  303. package/dist/session-check.js +44 -0
  304. package/dist/session-check.js.map +1 -0
  305. package/dist/site-cli.d.ts +4 -0
  306. package/dist/site-cli.js +127 -0
  307. package/dist/site-cli.js.map +1 -0
  308. package/dist/site-gate-cli.d.ts +28 -0
  309. package/dist/site-gate-cli.js +58 -0
  310. package/dist/site-gate-cli.js.map +1 -0
  311. package/dist/source-api.js +18 -3
  312. package/dist/source-api.js.map +1 -1
  313. package/dist/source-cli.d.ts +4 -0
  314. package/dist/source-cli.js +284 -0
  315. package/dist/source-cli.js.map +1 -0
  316. package/dist/source-run-api.d.ts +27 -1
  317. package/dist/source-run-api.js +22 -11
  318. package/dist/source-run-api.js.map +1 -1
  319. package/dist/storage-state-snapshot.d.ts +50 -0
  320. package/dist/storage-state-snapshot.js +87 -0
  321. package/dist/storage-state-snapshot.js.map +1 -0
  322. package/dist/suite-explore-options.d.ts +289 -0
  323. package/dist/suite-explore-options.js +140 -0
  324. package/dist/suite-explore-options.js.map +1 -0
  325. package/dist/target-config.d.ts +109 -0
  326. package/dist/target-config.js +216 -0
  327. package/dist/target-config.js.map +1 -0
  328. package/dist/transcript-file.d.ts +12 -0
  329. package/dist/transcript-file.js +23 -0
  330. package/dist/transcript-file.js.map +1 -0
  331. package/dist/ui-api.d.ts +3 -0
  332. package/dist/ui-api.js +7 -1
  333. package/dist/ui-api.js.map +1 -1
  334. package/dist/usability-capture.d.ts +43 -0
  335. package/dist/usability-capture.js +326 -0
  336. package/dist/usability-capture.js.map +1 -0
  337. package/dist/usage-config.d.ts +36 -0
  338. package/dist/usage-config.js +114 -0
  339. package/dist/usage-config.js.map +1 -0
  340. package/dist/ux-api.d.ts +3 -75
  341. package/dist/ux-api.js +3 -220
  342. package/dist/ux-api.js.map +1 -1
  343. package/dist/ux-cli.d.ts +4 -0
  344. package/dist/ux-cli.js +102 -0
  345. package/dist/ux-cli.js.map +1 -0
  346. package/dist/ux-config.d.ts +29 -0
  347. package/dist/ux-config.js +103 -0
  348. package/dist/ux-config.js.map +1 -0
  349. package/dist/ux-evidence.d.ts +54 -0
  350. package/dist/ux-evidence.js +197 -0
  351. package/dist/ux-evidence.js.map +1 -0
  352. package/dist/ux-review.d.ts +112 -0
  353. package/dist/ux-review.js +151 -0
  354. package/dist/ux-review.js.map +1 -0
  355. package/dist/ux-usability.d.ts +238 -0
  356. package/dist/ux-usability.js +494 -0
  357. package/dist/ux-usability.js.map +1 -0
  358. package/dist/verify-fix-api.d.ts +173 -0
  359. package/dist/verify-fix-api.js +454 -0
  360. package/dist/verify-fix-api.js.map +1 -0
  361. package/dist/verify-fix-cli.d.ts +4 -0
  362. package/dist/verify-fix-cli.js +110 -0
  363. package/dist/verify-fix-cli.js.map +1 -0
  364. package/package.json +19 -14
  365. package/skills/jevitate-ci-check/SKILL.md +77 -0
  366. package/skills/jevitate-demo/SKILL.md +61 -0
  367. package/skills/jevitate-explore/SKILL.md +88 -87
  368. package/skills/jevitate-getting-started/SKILL.md +88 -0
  369. package/skills/jevitate-load-test/SKILL.md +11 -2
  370. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  371. package/skills/jevitate-record/SKILL.md +23 -5
  372. package/skills/jevitate-run-journey/SKILL.md +61 -17
  373. package/skills/jevitate-sources/SKILL.md +57 -14
  374. package/skills/jevitate-ux-review/SKILL.md +106 -16
  375. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: jevitate-getting-started
3
+ description: Start here for any jevitate task, or when unsure which jevitate skill applies — checks setup (keys, .jevitate/, MCP), gets a first useful result against the user's app URL, routes to the right skill (explore, run-journey, record, demo, verify-fix, ci-check, ux-review, load-test, sources, mission-scope), and says when to use the jevitate MCP tools vs the CLI, what the exit codes mean, and which approvals only a human may give.
4
+ ---
5
+
6
+ Jevitate tests a web app in a real browser and returns evidence: typed outcomes, exit codes,
7
+ Recordings, replayable Journeys, videos and screenshots. You never drive the browser yourself.
8
+ You pick the command, pass it the user's intent, and report what came back honestly.
9
+
10
+ ## 1. Check the setup (once per session)
11
+
12
+ - `jevitate ai status --json` shows which AI features have their keys, by name only, never a value.
13
+ Goal runs, authoring, demos and UX reviews need `generation` and `judgment` (`--real`). Without
14
+ them, use a key-free command (see step 2), or ask the human to run `jevitate ai setup generation`
15
+ and `jevitate ai setup judgment` themselves. Setup is interactive. Never ask for a key in chat.
16
+ - The repo has a `.jevitate/` directory (Journeys, regressions, baselines, logs and
17
+ `environments.json`). If it's missing, the human runs `jevitate init` (it also installs these
18
+ skills and registers the MCP server). `jevitate init --dry-run` changes nothing.
19
+ - The app must be running and the human must have authorized its URL. Jevitate only acts on an
20
+ authorized origin (`--url`'s own origin, or an explicit `--allow` list). It refuses a production
21
+ target for authoring runs and demos. Never widen the allowlist on your own.
22
+
23
+ ## 2. A first useful result
24
+
25
+ | The user has | Run |
26
+ | --- | --- |
27
+ | keys, and a task a user does | `jevitate explore --url <app-url> --goal "<task>" --success "urlIncludes:/<done-path>" --real --json` |
28
+ | keys, and a question about the app | `jevitate explore --url <app-url> --goal "find out <question>; report the answer" --real --json` (read-only by default) |
29
+ | no keys | `jevitate explore --strategy adversarial --url <app-url> --fake-ai --json`: misuse is planned in code, and the findings (HTTP 5xx, uncaught errors, hangs, invariant violations) come from hard signals, not a model |
30
+ | no keys, one feature | `jevitate explore --feature <name> --route "/<area>/**" --url <app-url> --json` (model-free) |
31
+
32
+ Then pick the matching skill:
33
+
34
+ | The user wants to | Skill |
35
+ | --- | --- |
36
+ | explore, find bugs, or check that a goal is reachable | `jevitate-explore` |
37
+ | know what to test after a diff or PR | `jevitate-mission-scope` |
38
+ | replay a known flow (a saved Journey) | `jevitate-run-journey` |
39
+ | record a flow they click through | `jevitate-record` |
40
+ | get a narrated demo video or a step-by-step guide | `jevitate-demo` |
41
+ | reproduce a finding, prove a fix, attach evidence to a PR, or lock a bug in as a regression | `jevitate-verify-fix` |
42
+ | gate CI (JUnit, SARIF, baselines, a defect report) | `jevitate-ci-check` |
43
+ | get a usability critique | `jevitate-ux-review` |
44
+ | run a load test | `jevitate-load-test` |
45
+ | share or run third-party Journeys | `jevitate-sources` |
46
+
47
+ ## 3. MCP tools or the CLI
48
+
49
+ - If the jevitate MCP tools are in your tool list (`init` registers `jevitate mcp` for Claude
50
+ Code, Cursor and Codex), use them. They take typed arguments named after the CLI flags
51
+ (`--storage-state` becomes `storageState`), run the same command in process, and return
52
+ `{exitCode, data}`. Exit 2 (proved nothing) and every refusal come back as MCP errors
53
+ (`invalid_args` or `refused`, with the `E_…` code), never as a pass.
54
+ - Otherwise use the CLI with `--json`: one line on stdout, `{v, ok, data}` or
55
+ `{v, ok: false, error: {code, message}}`. Read the exit code as well.
56
+ - Common pairs: `run_exploration` = `explore`, `queue_exploration` + `run_queued_missions` +
57
+ `get_mission_result` = `mission queue` + `mission run` + `mission result`,
58
+ `find_capabilities`/`run_journey` = `journey find`/`journey run`, `author_journey` =
59
+ `explore-author-journey`, `create_demo`/`demo_journey` = `demo`/`journey demo`, `verify_fix` =
60
+ `verify-fix`, `regressions` = `regression capture|run`, `ledger` = `ledger …`, `run_check` =
61
+ `check`, `get_report` = `report`, `ux_review` = `ux`. The full table is in the jevitate repo's
62
+ `docs/agents.md`.
63
+ - These are never available over MCP: `record` (a person clicks), `init`, `ai setup` (secret entry),
64
+ `ui`, `source trust` and `source add --accept-tou`. Operator settings are never tool arguments
65
+ either: shell hooks, browser binaries, which environment variable a secret comes from, and
66
+ log-command sources. Tell the human the CLI command instead.
67
+ - Raw browser tools (click, fill, evaluate, get DOM or cookies) don't exist on purpose. Never
68
+ swap in another browser-automation tool to get around a refusal.
69
+
70
+ ## 4. Decisions that belong to the human
71
+
72
+ Only do these when the human has asked for that specific action in this conversation. Before
73
+ you do, show them what they are approving:
74
+
75
+ - promoting a Journey: `jevitate journey promote <id>` / `promote_journey`
76
+ - applying drafted annotations: `jevitate journey annotate <id> --approve` / `annotate_journey` with `approve: true`
77
+ - approving a demo, which promotes its Journey: `jevitate demo approve <id>` / `approve_demo`
78
+ - promoting a mission target: `jevitate mission target promote <id>`
79
+ - trusting a third-party Journey or accepting a source's Terms of Use (CLI only)
80
+ - approving or cancelling an inbox item: only in `jevitate ui`. The MCP tools `approve_action` and `cancel_command` always refuse.
81
+
82
+ ## 5. Exit codes (every command)
83
+
84
+ `0` clean / passed / fixed · `1` defects found, a gating finding, or still reproduces · `2`
85
+ inconclusive: the run proved nothing, so never report it as a pass · `3` the app hung (reproduced) ·
86
+ `4` intermittent · `64` usage error, nothing ran (bad flag, unknown id, missing keys
87
+ `E_AI_SETUP_REQUIRED`, target not allowed) · `130`/`143` interrupted, but the partial result was
88
+ written. Report the outcome the tool gave you. Never round it up.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-load-test
3
- description: Runs a seeded, human-paced concurrent load test of a promoted Journey via `jevitate load run`, against an explicitly authorized target only. Use when a user wants a capacity/throughput measurement, not a single functional run.
3
+ description: Run a seeded, human-paced concurrent load test of a promoted jevitate Journey (`jevitate load run`, MCP `run_load_test`) against an origin the human explicitly authorized, optionally on a named environment (`--env`). Use when the user wants capacity, throughput or latency numbers. For a single functional run, use jevitate-run-journey.
4
4
  ---
5
5
 
6
6
  You scope and run a throughput/capacity measurement, never a single functional
@@ -19,12 +19,21 @@ check (use `jevitate-run-journey` for that instead).
19
19
 
20
20
  - `jevitate load run <journeyId> --authorized-origin <origin> [--authorized-origin
21
21
  <origin2> ...] --param k=v --concurrency <n> --iterations <n> --seed <n>
22
- --json`.
22
+ [--storage-state <file>] --json`.
23
23
  - `<journeyId>` must be a promoted Journey id (same discovery flow as
24
24
  `jevitate-run-journey`: `jevitate journey find`/`find_capabilities` first).
25
+ - `--env <name>` / `--base-url <origin>` runs it against a named environment
26
+ (`.jevitate/environments.json`) instead of the recorded site; the
27
+ `--authorized-origin` must still name that origin explicitly.
28
+ - MCP: `run_load_test` takes the same arguments (`authorizedOrigin`,
29
+ `concurrency`, `iterations`, `seed`, …).
25
30
  - `--seed` makes the run reproducible — if the human wants to compare two
26
31
  configurations, keep the seed fixed and vary only `--concurrency`/
27
32
  `--iterations`.
33
+ - `--storage-state <file>` seeds EVERY pool member's session from the same
34
+ Playwright storageState file (the same authenticated pre-step as `jevitate
35
+ journey run` — see `jevitate-run-journey`), for load-testing a Journey that
36
+ needs an authenticated session.
28
37
 
29
38
  ## Reading the result
30
39
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-mission-scope
3
- description: Reads a diff, pull request, changelog, or user story and scopes change-driven testing — identifies at-risk routes/features, maps them to existing promoted Journeys, runs the most relevant ones, and recommends which newly-discovered repros to promote. Use when a user wants to know "what should I test" after a code change, rather than testing everything or picking targets blindly.
3
+ description: Turn a diff, pull request, changelog or user story into targeted jevitate testing. Finds at-risk routes and features, maps them to promoted Journeys (`journey find` / `find_capabilities`) and runs those, scopes bounded missions where nothing covers a gap (including queued missions on promoted targets), and recommends which new repros to promote or capture as regressions. Use when the user asks "what should I test?" after a code change, or wants a change-scoped check.
4
4
  ---
5
5
 
6
6
  You scope testing to what actually changed. You never drive a browser yourself —
@@ -54,6 +54,8 @@ tool to scope a **bounded** mission at the specific at-risk area:
54
54
  --url <authorized-url>` (bounded misuse + a trusted hard-signal defect oracle).
55
55
  - For state coverage of the changed area: `jevitate explore --strategy coverage
56
56
  --url <authorized-url>`.
57
+ - In CI, the same scoping is `jevitate check --suite <file> --changed-routes '<glob>'`: only the
58
+ Journeys and goals touching those routes run (see `jevitate-ci-check`).
57
59
  - Only if you cannot reach an authorized target at all (or `jevitate explore`
58
60
  is genuinely absent from your environment) do you stop and report the gap —
59
61
  never fall back to a generic browser-automation tool; that would bypass every
@@ -86,22 +88,28 @@ quantity.
86
88
 
87
89
  `queue_exploration` runs against a PROMOTED mission target, never a raw URL.
88
90
  When you want to queue a scoped mission at an at-risk area via MCP:
89
- - `jevitate mission target add <id> --url <authorized-url> [--goal ...] [--route
90
- <glob> ...] --json` registers the target (unpromoted).
91
+ - `jevitate mission target add <id> --name <name> --authorized-origin
92
+ <authorized-origin> --base-url <url> [--description <text>] --json`
93
+ registers the target (unpromoted). Note the target's own registration takes
94
+ NO `--goal`/`--route` — those are `queue_exploration` call arguments
95
+ (`target`, `goal`, `feature`, `route`, ...), supplied per-enqueue, not baked
96
+ into the target itself.
91
97
  - `jevitate mission target list --json` shows registered targets and their
92
98
  promoted/unpromoted state.
93
99
  - `jevitate mission target promote <id> --json` promotes it — a human-gated act,
94
- same as Journey promotion. Only a promoted target is enqueueable.
100
+ same as Journey promotion (`jevitate journey promote <id>`). Only a promoted
101
+ target is enqueueable.
95
102
 
96
103
  Then `queue_exploration({ target: "<id>", ... })` (via the `jevitate mcp`
97
104
  server, registered with `jevitate mcp --print-config ...` or `jevitate init`)
98
105
  enqueues a bounded mission and returns a `missionId`.
99
106
 
100
- ## Known gaps
107
+ An app whose API lives on another origin declares it on the target:
108
+ `--authorized-origin <app-origin> --api-origin <api-origin>` (repeatable; each a
109
+ bare http(s) origin). A queued mission can reach only those origins.
101
110
 
102
- - The MCP inbox/command-queue tools (`queue_retrieval`, `queue_action`,
103
- `get_command`, `list_incoming`, `get_thread`, `approve_action`,
104
- `cancel_command`, `get_site_health`) are registered on the `jevitate mcp`
105
- server but return a typed `not_implemented` error today — the wired tools are
106
- `find_capabilities`, `run_journey`, `queue_exploration`, and
107
- `ai_generate_text`. Scoping and running work fully through those four.
111
+ Queued missions run when the queue is drained: `run_queued_missions` over MCP (it drains once),
112
+ or `jevitate mission run --once --real --json` (`--watch` keeps draining).
113
+ `get_mission_result({ id: missionId })` reports `queued`/`running` (`pending: true`), the typed
114
+ result once done, or `failed`. `queue_exploration` only enqueues — treat the returned `missionId`
115
+ as "accepted," not "finished," until the result says otherwise.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-record
3
- description: Capture a demonstrated browser flow into a Recording (`jevitate record --url`) and post-process it — diff multiple takes, review/classify fill steps (postdoc), fit a timing policy, promote a value to a variable — via the jevitate CLI. Use to record human-demonstrated takes and turn them into a parameterized, replayable artifact.
3
+ description: Record a flow the human clicks through (`jevitate record --url`, CLI only, headed), then post-process the takes: diff them, classify values as constants, variables or hand-backs (postdoc), fit a timing policy, and promote a value to a variable (`jevitate recording ...`, MCP `recordings`). Use when the user wants to demonstrate a flow themselves. If they want jevitate to find and save the flow for them, use `explore-author-journey` (jevitate-explore).
4
4
  ---
5
5
 
6
6
  You drive Jevitate's human-driven authoring mode (RxD): capturing a take from a
@@ -13,16 +13,27 @@ headed browser demonstration a human performs — you launch it and they drive.
13
13
  - `jevitate record --url <authorized-url> [--intent "<framing>"] [--retro
14
14
  "<note>"] [--allow <origin>] [--out <dir>] --json` opens a headed browser at
15
15
  an authorized origin and records the human's demonstrated flow into a
16
- `Recording` JSON file (default `~/.jevitate/recordings`). The session is
16
+ `Recording` JSON file (default `.jevitate/logs/<date>/` in the repo, else
17
+ `~/.jevitate/logs/<date>/`). The session is
17
18
  headed by design — a record session IS a live human demonstration; add
18
19
  `--headless` only when a caller explicitly asks. The target must be
19
- authorized (defaults to `--url`'s own origin; widen only with explicit
20
- `--allow`), and an unauthorized target is refused
21
- (`E_UNAUTHORIZED_EXPLORE_TARGET`).
20
+ authorized (`--allow` REPLACES the default allowlist when given at all —
21
+ it defaults to `--url`'s own origin only when `--allow` is omitted
22
+ entirely; include that origin explicitly in `--allow` if you still need
23
+ it), and an unauthorized target is refused (`E_UNAUTHORIZED_EXPLORE_TARGET`).
24
+ - **Ending a take**: press Enter on stdin, or send SIGINT (Ctrl-C) — both end
25
+ the take the SAME way (the demonstrated steps are stopped and written to
26
+ disk). This matters most for `--headless`, where there is no visible
27
+ window to interact with: Ctrl-C is the way to end a headless take, and it
28
+ saves the take rather than killing the process and losing it.
22
29
  - The emitted `recordingPath` is the take you then feed into the diff/postdoc
23
30
  flow below. Capture two or more takes of the same flow (varying the data each
24
31
  time) when you want `diff` to classify which values are variables.
25
32
 
33
+ - `record` is never an MCP tool (a person does the clicking). As an agent, give the human the
34
+ command to run, and wait for the `recordingPath` it prints. `diff`/`fit`/`postdoc`/`promote`
35
+ are available over MCP as the `recordings` tool (`action`).
36
+
26
37
  ## Diff multiple takes
27
38
 
28
39
  - `jevitate recording diff <takeA.json> <takeB.json> [more.json...] --json` —
@@ -30,6 +41,13 @@ headed browser demonstration a human performs — you launch it and they drive.
30
41
  (constant vs. likely-variable) with a confidence score. Read the confidences;
31
42
  do not treat a low-confidence classification as settled — surface it to the
32
43
  human via `postdoc` instead of deciding for them.
44
+ - **Input shape**: `diff`/`postdoc` accept ONLY a `jevitate record`-produced
45
+ take file — `{ "recording": <Recording>, "values": {...} }`. A raw
46
+ `Recording` (what `explore`, `explore-author-journey`, or a usability run
47
+ write directly — `{version, site, pages, ...}` with no `recording`/`values`
48
+ wrapper) is refused with a clear `E_INVALID_TAKE` message naming the
49
+ mismatch, not a zod dump. Wrap a raw Recording as `{ "recording": <it>,
50
+ "values": {} }` first if you need to diff/postdoc one.
33
51
 
34
52
  ## Review and classify (postdoc)
35
53
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-run-journey
3
- description: Find and run a promoted Jevitate Journey by id, with typed params, via the jevitate CLI or the find_capabilities/run_journey MCP tools. Use when a user wants to execute a known, already-recorded browser automation (a login, a checkout, a form submission) rather than explore or record a new one.
3
+ description: Find and replay a promoted jevitate Journey (a saved, deterministic browser flow such as a login, checkout or form submission) by id with typed params, on any named environment (`--env`/`--base-url`), optionally with video and screenshots and self-heal. Runs via `jevitate journey find|run` or MCP `find_capabilities`/`run_journey`. Also covers promoting (human-only). Use when a known flow should be re-run or regression-checked, not explored or recorded fresh.
4
4
  ---
5
5
 
6
6
  You drive already-published, promoted Jevitate Journeys. You never write or invent
@@ -25,13 +25,43 @@ artifact; your job is to find the right one and run it with the right params.
25
25
  Every param the `find`/`find_capabilities` result listed under `params` is
26
26
  required; passing an unknown param key is a refusal (`E_INVALID_PARAMS`), not
27
27
  a silent ignore. An unknown id is `E_UNKNOWN_JOURNEY`.
28
- - MCP: `run_journey(id, params)` — same param-schema validation, same refusal on
29
- an unknown id or params. It NEVER accepts inline steps or a raw recording —
30
- a published id only.
28
+ - MCP: `run_journey({ id, params, storageState? })` — same param-schema
29
+ validation, same refusal on an unknown id or params. It NEVER accepts inline
30
+ steps or a raw recording — a published id only.
31
31
  - Read the JSON envelope's `outcome` field. `"ok"` and `"healed"` (a run that
32
- recovered via self-heal) are both successes; `"quarantined"` (and any other
33
- value, including a secret-handback pause) means it did not complete — report
34
- that honestly, do not summarize a non-success outcome as success.
32
+ recovered via self-heal) are both successes (exit 0); `"quarantined"` (exit 1)
33
+ and any other value, including a secret-handback pause, mean it did not
34
+ complete — report that honestly, with the step it stopped at. Exit 64 is a
35
+ refusal before anything ran (unknown id, bad params, a step off the allowlist).
36
+
37
+ ## Where it runs (`--env`) and what it records
38
+
39
+ - `--env <name>` replays on a named environment from the repo's
40
+ `.jevitate/environments.json` (its `baseUrl` plus `allow`); `--base-url <origin>`
41
+ is an ad-hoc one (e.g. a preview deploy). Without either, the Journey runs on
42
+ the site it was recorded on. A step on an origin the environment doesn't allow
43
+ is refused (64) before any browser opens. MCP: `run_journey`'s `env`/`baseUrl`.
44
+ - Evidence: `--record-video` (listed as `videoPaths`), `--screenshots
45
+ [screens|steps]` (`screenshotPaths` + an `index.md`), `--headed`/`--slow-mo <ms>`
46
+ to watch it. `--viewport 375x812` / `--device "iPhone 13"` for mobile.
47
+ - For a narrated demo video or a step-by-step guide of a Journey, use
48
+ `jevitate-demo` (`journey demo`, `journey annotate`).
49
+
50
+ ## Authenticated Journeys (#118)
51
+
52
+ - A Journey authored behind a login needs a deterministic authenticated
53
+ pre-step to replay: `--storage-state <file>` (a Playwright storageState JSON
54
+ path — cookies + origin storage) on `jevitate journey run`, `jevitate load
55
+ run`, and `jevitate source run`; over MCP, `run_journey`'s optional
56
+ `storageState` argument is the SAME thing — a file PATH on the machine
57
+ running the MCP server, never raw cookie/session content in the call itself.
58
+ The file's contents are read only by the browser session; never logged,
59
+ never echoed back.
60
+ - A Journey CAN declare `metadata.requiresAuth: true` if it only reaches its
61
+ steps from an authenticated session. A run given no `storageState` then
62
+ fails fast — before any browser opens — with `E_JOURNEY_REQUIRES_AUTH`
63
+ naming the actual problem, instead of a confusing deep
64
+ `replay-target-not-found` partway through the steps.
35
65
 
36
66
  ## Self-heal (optional, additive)
37
67
 
@@ -54,19 +84,33 @@ artifact; your job is to find the right one and run it with the right params.
54
84
  result in this same session — a promoted id can be revoked; don't rely on a
55
85
  memorized id from an earlier conversation.
56
86
 
87
+ ## Promoting a Journey
88
+
89
+ - `jevitate journey promote <id> --json` promotes a local Journey — a
90
+ deliberate human-approval gate (mirrors `mission target promote`'s
91
+ semantics), never automatic — run it (or MCP `promote_journey`) only when
92
+ the human tells you to. Every authored/recorded Journey starts
93
+ `metadata.promoted: false` (`explore-author-journey`, `jevitate record` +
94
+ `recording postdoc`); only a promoted Journey is discoverable via `journey
95
+ find`/`find_capabilities` and runnable via `journey run`/`run_journey`.
96
+ There is still no "raw Recording -> promoted Journey in one step" command —
97
+ a Recording becomes a Journey first (through an authoring path, or the
98
+ `JourneyRegistry` API), then `journey promote <id>` promotes it.
99
+
100
+ ## Step intent (annotations)
101
+
102
+ - `journey run` reports `intent.withoutObjective` (steps with no stated objective). It is
103
+ informational and never a failure. Drafting and approving objectives is `journey annotate`
104
+ (see `jevitate-demo`); `--approve` is the human's call, like promote.
105
+
57
106
  ## Publishing to a distributed source
58
107
 
59
108
  - `jevitate journey publish <id> --to <source>` pushes a PROMOTED local Journey
60
109
  up to a registered distributed source (see `jevitate-sources`). It preserves
61
110
  every publish-side guard: promoted-only, secret-references-only, and
62
111
  declared-origin coverage; it writes onto a new `publish/<id>` branch and,
63
- when `gh` is present, opens a PR. It never publishes an unpromoted Journey.
64
-
65
- ## Known gaps
66
-
67
- - There is no single "raw Recording -> promoted Journey" command: a Recording
68
- becomes a Journey through the authoring paths (`jevitate
69
- explore-author-journey`, which writes an UNPROMOTED Journey a human still
70
- promotes) or the `JourneyRegistry` API, and promotion stays a deliberate
71
- human gate. If a user asks you to "promote this recording," recommend those
72
- paths rather than guessing at a promote command — do not invent one.
112
+ when `gh` is present, opens a PR. When `gh` is absent, or a PR can't be
113
+ opened (e.g. the remote isn't GitHub), the branch is still pushed and the
114
+ command still reports success (`pushed: true`, no PR) with instructions to
115
+ open one manually — pushing the branch is never reported as a failure. It
116
+ never publishes an unpromoted Journey.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-sources
3
- description: Manage Jevitate's distributed Journey sources — add/list/pull/update/remove git-backed sources, trust individual Journeys (content-hash-bound), run a trusted remote Journey through the run-gate, and publish a local promoted Journey up to a source — via `jevitate source ...` and `jevitate journey publish`. Use when sharing Journeys across repos or trusting/running a third-party Journey; use jevitate-run-journey for an already-local Journey.
3
+ description: Share Journeys across repos and teams with jevitate's git-backed sources. Covers add/list/pull/update/remove (`jevitate source ...`, MCP `sources`), human-only trust of a single Journey (content-hash-bound), running a trusted remote Journey through the run-gate (`source run`), and publishing a promoted local Journey (`journey publish`, MCP `publish_journey`). Use for third-party or shared Journeys. For a Journey already in this repo, use jevitate-run-journey.
4
4
  ---
5
5
 
6
6
  You add, trust, run, and publish federated Journeys across git-backed sources.
@@ -18,6 +18,41 @@ invokable surface, not a programmatic-only capability.
18
18
  "risky"`), and `trusted` (whether this project has acknowledged that exact
19
19
  content). Trust is LOCAL and per-user; it is bound to a content hash, so any
20
20
  change to a Journey's content invalidates its trust until re-approved.
21
+ - `riskClass` is engine-derived, not author-declared: a Journey is
22
+ `"read-only"` iff every step is a `navigate`/`waitFor`/`extract`/`assert`, or
23
+ a `click` whose target has ARIA role `link` (following a link reads a page,
24
+ it does not mutate anything), AND every absolute `navigate` stays within
25
+ `declaredOrigins`. Anything else — a non-link `click` (e.g. a button),
26
+ `fill`/`select`/`press`/`handback`, or a navigate that could leave
27
+ `declaredOrigins` — is conservatively `"risky"` and needs `source trust`
28
+ before it can run.
29
+
30
+ - Simpler, for Journeys your own team shares: mount a Journeys repo as a git submodule under
31
+ `.jevitate/journeys/<name>/`. Its Journeys appear as `<name>/<id>` in `journey list`/`find`/`run`,
32
+ `check` and the MCP tools, and the submodule pin is reviewed like code. Use sources (below) for
33
+ third-party Journeys that need Terms of Use and per-Journey trust.
34
+
35
+ ## The source manifest shape
36
+
37
+ A source repo (what `source add <name> <gitUrl>` clones) needs exactly this at
38
+ its root, or `source add`/`source update` refuse with `E_SOURCE_INVALID_MANIFEST`:
39
+
40
+ - `jevitate.json` — `{ "version": 1, "source": "<name>", "sites": [{ "origin":
41
+ "<https://...>", "automationPolicy": "allowed", "touBasis": "<free text>" }, ...] }`.
42
+ `sites` declares every origin this source's Journeys are authorized to touch
43
+ and the Terms-of-Use basis for each; `source add --accept-tou` acknowledges
44
+ ALL of them together.
45
+ - `journeys/*.journey.json` — one file per shared Journey: an ordinary
46
+ `Journey` (`{ metadata, recording }`, same shape `jevitate journey list`
47
+ reads) PLUS a top-level `declaredOrigins: string[]` (at least one absolute
48
+ URL) — the origins THIS Journey is authorized to touch, which must all
49
+ appear in the manifest's `sites`. `jevitate journey publish` writes this
50
+ file for you (deriving `declaredOrigins` from the Journey's absolute
51
+ `navigate` steps, or from `recording.site` when its navigates are relative —
52
+ e.g. an `explore-author-journey`-authored Journey — or from an explicit
53
+ `--declare-origin`); a hand-authored source repo must match this shape
54
+ exactly, `.strict()` — unknown/missing keys fail the whole load, one bad
55
+ file at a time (never a silent partial list).
21
56
 
22
57
  ## Add and manage sources
23
58
 
@@ -42,10 +77,12 @@ invokable surface, not a programmatic-only capability.
42
77
 
43
78
  ## Run a trusted remote Journey (through the run-gate)
44
79
 
45
- - `jevitate source run <name> <journeyId> --param k=v ... --json` runs a
46
- remote-source Journey THROUGH `@jevitate/sources`' `resolveForRun` gate. Every
47
- refusal is a typed error thrown BEFORE any browser launches, each with its own
48
- code so a caller knows WHY:
80
+ - `jevitate source run <name> <journeyId> --param k=v ... [--storage-state
81
+ <file>] --json` runs a remote-source Journey THROUGH `@jevitate/sources`'
82
+ `resolveForRun` gate. `--storage-state` is the same authenticated pre-step
83
+ as `jevitate journey run` (see `jevitate-run-journey`), for a source Journey
84
+ that needs one. Every refusal is a typed error thrown BEFORE any browser
85
+ launches, each with its own code so a caller knows WHY:
49
86
  - `E_SOURCE_RUN_HASH_MISMATCH` — the pinned content no longer matches what was
50
87
  trusted.
51
88
  - `E_SOURCE_RUN_UNTRUSTED` — a `risky` Journey that was never trusted.
@@ -63,10 +100,16 @@ invokable surface, not a programmatic-only capability.
63
100
  - `jevitate journey publish <id> --to <source> [--declare-origin <origin> ...]
64
101
  [--as <newId>] --json` pushes a PROMOTED local Journey up to a registered
65
102
  source. It preserves every publish-side guard (promoted-only,
66
- secret-references-only, declared-origin coverage), writes onto a new
67
- `publish/<id>` branch, and opens a PR when `gh` is present (degrading to
68
- printed instructions when it is not). It refuses an unpromoted Journey
69
- (`E_JOURNEY_PUBLISH_NOT_PROMOTED`) and an embedded secret
103
+ secret-references-only, declared-origin coverage — derived from the
104
+ Journey's absolute `navigate` steps, or from `recording.site` when they are
105
+ relative), writes onto a new `publish/<id>` branch, and opens a PR when `gh`
106
+ is present. The branch push is reported as `pushed: true` regardless of
107
+ whether a PR could be opened: when `gh` is absent, OR `gh` is present but
108
+ `gh pr create` fails (e.g. the remote isn't GitHub), the result still comes
109
+ back `ok: true` with `pushed: true` and no `prUrl`, plus printed
110
+ instructions to open the PR manually — the push already happened by that
111
+ point, so a PR failure is never reported as a publish failure. It refuses an
112
+ unpromoted Journey (`E_JOURNEY_PUBLISH_NOT_PROMOTED`) and an embedded secret
70
113
  (`E_JOURNEY_PUBLISH_SECRET`).
71
114
 
72
115
  ## What you must never do
@@ -80,9 +123,9 @@ invokable surface, not a programmatic-only capability.
80
123
  - Never widen a Journey's declared origins on publish beyond what the human
81
124
  authorized just to make coverage pass.
82
125
 
83
- ## Known gaps
126
+ ## MCP
84
127
 
85
- - There is no MCP-tool surface over federated sources yet — the
86
- `find_capabilities`/`run_journey` MCP tools operate over the LOCAL promoted
87
- store, not remote sources. Federated add/trust/run/publish are CLI-only today;
88
- drive the `jevitate source ...` commands directly.
128
+ - The `sources` tool takes `add`/`list`/`pull`/`update`/`remove`/`run` as its `action` (the same
129
+ gate and refusals as the CLI), and `publish_journey` mirrors `journey publish`. Accepting a
130
+ source's Terms of Use (`source add --accept-tou`) and `source trust` are CLI-only on purpose:
131
+ they are the human's consent, so tell the human the command instead of looking for a tool.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-ux-review
3
- description: Produce ranked, cited, advisory usability findings for a flow — offline over a saved Recording (`jevitate ux <recording> --app-class`) or live over an authorized target (`jevitate explore --strategy usability --goal --app-class`). Use when a human wants a UX/usability critique of a journey, not a pass/fail functional test. Findings are advisory and never gate a run.
3
+ description: Produce ranked, cited, advisory usability findings (preview) for a flow — offline over a saved Recording (`jevitate ux <recording> --app-class`, MCP `ux_review`) or live on an authorized target (`jevitate explore --strategy usability --goal --app-class`, MCP `run_exploration`). Use when the user wants a UX or usability critique, not a pass/fail test. Findings are advisory and never gate a run.
4
4
  ---
5
5
 
6
6
  You produce a UX review: ranked, cited, evidence-anchored usability findings for
@@ -9,22 +9,40 @@ fails a run or a build. Every finding is calibrated to an app class (a consumer
9
9
  signup and an internal admin tool are held to different bars) and cites a rubric
10
10
  item; the platform structurally cannot emit an uncited finding.
11
11
 
12
+ PREVIEW (0.2.0): these findings are a preview feature. The independent quality
13
+ grader is not yet calibrated across apps, and how findings are grouped/deduped
14
+ is still being redesigned (issues #133, #198). `report.preview` is `true` and
15
+ `report.headline` says so; tell the human this is a preview, not a finished
16
+ verdict.
17
+
12
18
  ## Two modes — pick by what you have
13
19
 
14
20
  - OFFLINE, over a saved Recording — `jevitate ux <recording.json> --app-class
15
- <class> [--persona <p>] [--job "<text>"] [--out <dir>] --json`. Analyzes a
21
+ <class> [--persona <p>] [--job "<text>"] [--out <dir>] [--min-confidence <n>]
22
+ [--show <labels>] --real --json`. Analyzes a
16
23
  Recording you already captured (e.g. from `jevitate-record` or a successful
17
24
  `jevitate explore`). It launches no browser. `--app-class` is REQUIRED
18
- (e.g. `consumer`, `admin`, `internal`); `--job` sharpens relevance.
25
+ (e.g. `consumer`, `admin`, `internal`); `--job` sharpens relevance. It reads
26
+ the artifacts next to `<stem>.recording.json` automatically: the live
27
+ usability run's evidence sidecar `<stem>.evidence.json` (the screens as
28
+ analyzed plus the run signals), `<stem>.result.json` or
29
+ `<stem>.transcript.json`, and `<stem>.screens/`. With the sidecar, offline
30
+ review reproduces the live run's findings. Without it, `report.evidenceCaveats`
31
+ names what could not be checked. `--evidence` and `--result` override the
32
+ discovered files.
19
33
  - LIVE, against an authorized target — `jevitate explore --strategy usability
20
34
  --url <authorized-url> --goal "<the job>" --app-class <class> [--allow
21
- <origin>] [--secret <value>] [--max-actions <n>] --real --json`. Drives the
35
+ <origin>] [--secret <value>] [--max-actions <n>] [--min-confidence <n>]
36
+ [--show <labels>] --real --json`. Drives the
22
37
  exploration loop toward the job (Jev makes the browsing decisions, not you)
23
38
  and reviews each observed screen against the rubric as it goes. Needs a
24
39
  gateway: `--real` (live, after `jevitate ai setup`) or `--fake-ai` (a
25
40
  deterministic pipeline smoke that will NOT produce a real review). No
26
41
  selection fails closed.
27
42
 
43
+ Over MCP: `ux_review` is the offline mode (`recording`, `appClass`, …); `run_exploration`
44
+ with `strategy: "usability"` is the live mode. Usability is not a queueable mission strategy.
45
+
28
46
  Prefer OFFLINE when a Recording already exists — it is cheaper, deterministic,
29
47
  and touches no live site. Use LIVE only when there is no Recording and the human
30
48
  authorized the target.
@@ -43,21 +61,93 @@ authorized the target.
43
61
  authorized. Pass real secrets/PII via `--secret` so they stay out of every
44
62
  model call.
45
63
 
64
+ ## Filtering what is shown
65
+
66
+ - `--min-confidence <0..1>` (also `JEVITATE_UX_MIN_CONFIDENCE`, or `ux.minConfidence` in
67
+ `~/.jevitate/config.json`; default 0.3): findings below it are suppressed.
68
+ - `--show <labels>` (also `JEVITATE_UX_SHOW`, or `ux.show` in the config): an
69
+ opt-in filter on the quality grade. The grades are `actionable`,
70
+ `relevant-minor`, `generic` and `wrong`. The default shows ALL grades. The
71
+ grader is not calibrated (no held-out, multi-rater kappa ≥ 0.4 off its tuning
72
+ app), so it labels findings and does not hide them. Each finding carries its
73
+ grade in `quality`, and `report.qualityFiltered` says whether a filter was
74
+ applied. `--show actionable,relevant-minor` restores the old filter.
75
+ - `--max-findings-per-page <n>` (also `JEVITATE_UX_MAX_FINDINGS_PER_PAGE`, or
76
+ `ux.maxFindingsPerPage` in the config; default 5): caps findings per route,
77
+ highest-confidence first (0.2.0, issue #198 interim — a full redesign is
78
+ tracked there). The rest are counted in `report.suppressed` as
79
+ `per-page-cap`, never dropped silently.
80
+ - Nothing is dropped silently: every suppressed candidate is counted in
81
+ `report.suppressed`. Change a filter only when the human asks, and say which
82
+ filter you changed.
83
+
46
84
  ## Reading the result
47
85
 
48
- - The report is a set of findings, each with a `severity` (`info` | `minor` |
49
- `major`), a rubric `citation` (`source` + `ref`), and redacted evidence refs
50
- pointing at the screen/control it is about. Rank your summary by severity and
51
- lead with the `major` findings.
52
- - Report findings as ADVISORY recommendations, with their citations — never as
53
- defects that block shipping, and never restate a finding without the rubric
54
- citation the tool attached (the citation is what makes it more than an
55
- opinion).
86
+ - Lead with `report.headline`. It gives the findings grounded in observed run
87
+ behavior, the heuristic-only count in the appendix, and "N suppressed (by
88
+ rubric item: …)".
89
+ - `report.findings` holds only findings with behavioral evidence:
90
+ - run signals (tier `signal`): a hung request, a stuck job still offered
91
+ again, a duplicate write or create, a failed submit with no or only generic
92
+ error copy, a repeated assistant reply, an inert control, an internal id,
93
+ or a URL whose page shows another route's content. Each cites its steps,
94
+ requests, text and screenshot in `signal`.
95
+ - rubric findings grounded in the friction the run hit on that screen: a
96
+ backtrack, a retry, a dead end, a long wait, an error, an abandoned field,
97
+ or the goal not reached. `journeyEvidence` gives the kind and step range.
98
+ - Their `severity` and `impact` come from the observed impact on the job:
99
+ `blocked` > `slowed` > `confused`. Findings on the same friction point are
100
+ collapsed into one, with the others listed in `contributing`.
101
+ - `report.heuristicAppendix` holds rubric findings with no observed friction.
102
+ They are screen-level heuristics only, capped at `info`. Mention them as an
103
+ appendix, never as the review's findings.
104
+ - Each finding is specific and grounded:
105
+ - `observation`: what is wrong, naming the control, label or text, relative to
106
+ the job.
107
+ - `userImpact`: what it costs the user.
108
+ - `recommendation`: a concrete change to that control or text.
109
+ - `controls` and `quotes`: the implicated controls and verbatim on-screen text.
110
+ Independent code checked that both exist on the screen.
111
+ - `evidenceRefs`: only those controls, not every control on the page.
112
+ - `route`, `screenId`, `occurrences` and `screenIds`: where it was seen. The
113
+ same item on the same route and controls is one finding with a count.
114
+ - `severity` (`info` | `minor` | `major`) and a rubric `citation` (`source` +
115
+ `ref`).
116
+ - `quality`: the independent grader's label and its confidence.
117
+ - `confidence` with its `confidenceBasis`: violation × applicability ×
118
+ grounding × agreement. Quote the observation and recommendation; don't
119
+ paraphrase them into generic heuristic advice.
120
+ - `contributing` (0.2.0, issue #198 interim): DIFFERENT rubric items that
121
+ fired on the SAME control on the SAME route are collapsed into one
122
+ finding — the highest-confidence one leads, the rest are listed here with
123
+ their own `rubricItemId`, `citation`, `observation` and `occurrences`. Read
124
+ it as "these principles all flagged the same thing", not as noise to
125
+ ignore — mention the other principles when it matters.
126
+ - Rank your summary the way the report does: by `impact`, then severity. Lead
127
+ with what blocked the job.
128
+ - `report.suppressed` counts what was not shown: `byReason`, `byRubricItem` and
129
+ `byRubricItemRoute`. The reasons are:
130
+ - `ungrounded`: named no control or text.
131
+ - `rejected-evidence`: cited a control or text that is not on the screen.
132
+ - `not-confirmed`: the specifics step found no concrete violation.
133
+ - `below-min-confidence`
134
+ - `quality-policy`: a grade outside an explicit `--show` filter.
135
+ - `per-page-cap` (0.2.0, issue #198 interim): the route already has
136
+ `--max-findings-per-page` findings shown; this one ranked lower.
137
+ Say how many were suppressed. `clean: true` only happens with zero findings
138
+ AND zero suppressed, so never describe a report with suppressions as "no
139
+ issues".
140
+ - `coverage.notApplicable` lists items whose rubric precondition did not hold,
141
+ for example choice overload on a 2-control screen. Those items are evaluated,
142
+ not skipped.
143
+ - Report findings as ADVISORY recommendations, with their citations. They are
144
+ never defects that block shipping. Never restate a finding without the rubric
145
+ citation the tool attached; the citation is what makes it more than an opinion.
56
146
  - An analysis that FAILED (`E_UX_ANALYSIS`) is a real failure to surface
57
- honestly — never fabricate a clean "no issues found" report from a failed run.
58
- Offline review over a bare Recording is coverage-limited (it sees only what
59
- the Recording captured — no live a11y tree, no runtime contrast); say so when
60
- the Recording is thin, rather than implying the flow is fully vetted.
147
+ honestly. Never fabricate a clean "no issues found" report from a failed run.
148
+ Offline review over a bare Recording is coverage-limited: it sees only what
149
+ the Recording captured, with no live a11y tree and no runtime contrast. When
150
+ the Recording is thin, say so rather than implying the flow is fully vetted.
61
151
 
62
152
  ## What you must never do
63
153