@jevitate/cli 0.9.0 → 0.11.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 (190) hide show
  1. package/dist/anchor-baselines.d.ts +26 -0
  2. package/dist/anchor-baselines.js +25 -0
  3. package/dist/anchor-baselines.js.map +1 -0
  4. package/dist/approval-provenance.d.ts +32 -2
  5. package/dist/approval-provenance.js +92 -5
  6. package/dist/approval-provenance.js.map +1 -1
  7. package/dist/approved-demo.d.ts +86 -0
  8. package/dist/approved-demo.js +184 -0
  9. package/dist/approved-demo.js.map +1 -0
  10. package/dist/bin.js +13352 -7050
  11. package/dist/build-info.generated.js +2 -2
  12. package/dist/campaign-api.d.ts +15 -0
  13. package/dist/campaign-api.js +67 -6
  14. package/dist/campaign-api.js.map +1 -1
  15. package/dist/campaign-cli.js +7 -2
  16. package/dist/campaign-cli.js.map +1 -1
  17. package/dist/campaign-preflight.d.ts +76 -0
  18. package/dist/campaign-preflight.js +117 -0
  19. package/dist/campaign-preflight.js.map +1 -0
  20. package/dist/catalog-analysis.js +14 -0
  21. package/dist/catalog-analysis.js.map +1 -1
  22. package/dist/catalog-api.js +12 -4
  23. package/dist/catalog-api.js.map +1 -1
  24. package/dist/catalog-bundle-api.d.ts +83 -0
  25. package/dist/catalog-bundle-api.js +309 -0
  26. package/dist/catalog-bundle-api.js.map +1 -0
  27. package/dist/catalog-bundle-findings.d.ts +64 -0
  28. package/dist/catalog-bundle-findings.js +326 -0
  29. package/dist/catalog-bundle-findings.js.map +1 -0
  30. package/dist/catalog-bundle.d.ts +296 -0
  31. package/dist/catalog-bundle.js +777 -0
  32. package/dist/catalog-bundle.js.map +1 -0
  33. package/dist/catalog-cli.d.ts +6 -0
  34. package/dist/catalog-cli.js +181 -5
  35. package/dist/catalog-cli.js.map +1 -1
  36. package/dist/catalog-refs.d.ts +42 -0
  37. package/dist/catalog-refs.js +188 -0
  38. package/dist/catalog-refs.js.map +1 -0
  39. package/dist/catalog-review.d.ts +3 -1
  40. package/dist/catalog-review.js +61 -0
  41. package/dist/catalog-review.js.map +1 -1
  42. package/dist/catalog.d.ts +27 -3
  43. package/dist/catalog.js +46 -2
  44. package/dist/catalog.js.map +1 -1
  45. package/dist/check-api.js +180 -9
  46. package/dist/check-api.js.map +1 -1
  47. package/dist/check-cli.d.ts +2 -0
  48. package/dist/check-cli.js +96 -2
  49. package/dist/check-cli.js.map +1 -1
  50. package/dist/check-execute.d.ts +18 -0
  51. package/dist/check-execute.js +56 -3
  52. package/dist/check-execute.js.map +1 -1
  53. package/dist/check-types.d.ts +105 -0
  54. package/dist/check-types.js.map +1 -1
  55. package/dist/cli-output.d.ts +6 -0
  56. package/dist/cli-output.js +38 -1
  57. package/dist/cli-output.js.map +1 -1
  58. package/dist/cli-shared.d.ts +10 -0
  59. package/dist/cli-shared.js +0 -4
  60. package/dist/cli-shared.js.map +1 -1
  61. package/dist/cold-start-report.d.ts +32 -0
  62. package/dist/cold-start-report.js +31 -0
  63. package/dist/cold-start-report.js.map +1 -0
  64. package/dist/defect-evidence.js +10 -5
  65. package/dist/defect-evidence.js.map +1 -1
  66. package/dist/demo-aspect-api.d.ts +11 -0
  67. package/dist/demo-aspect-api.js +27 -2
  68. package/dist/demo-aspect-api.js.map +1 -1
  69. package/dist/demo-aspect-cli.js +5 -0
  70. package/dist/demo-aspect-cli.js.map +1 -1
  71. package/dist/demo-capture.d.ts +79 -2
  72. package/dist/demo-capture.js +504 -12
  73. package/dist/demo-capture.js.map +1 -1
  74. package/dist/environments.d.ts +8 -1
  75. package/dist/environments.js +14 -3
  76. package/dist/environments.js.map +1 -1
  77. package/dist/exit-codes.js +16 -0
  78. package/dist/exit-codes.js.map +1 -1
  79. package/dist/explore-adversarial.js +2 -2
  80. package/dist/explore-adversarial.js.map +1 -1
  81. package/dist/explore-shared.d.ts +11 -0
  82. package/dist/explore-shared.js +9 -0
  83. package/dist/explore-shared.js.map +1 -1
  84. package/dist/findings-filing.js +7 -3
  85. package/dist/findings-filing.js.map +1 -1
  86. package/dist/forge-verify.d.ts +224 -0
  87. package/dist/forge-verify.js +649 -0
  88. package/dist/forge-verify.js.map +1 -0
  89. package/dist/github-issue-filer.js +15 -9
  90. package/dist/github-issue-filer.js.map +1 -1
  91. package/dist/init-codeowners.d.ts +19 -0
  92. package/dist/init-codeowners.js +66 -0
  93. package/dist/init-codeowners.js.map +1 -1
  94. package/dist/job-draft-api.d.ts +52 -0
  95. package/dist/job-draft-api.js +110 -0
  96. package/dist/job-draft-api.js.map +1 -0
  97. package/dist/journeeze-api.d.ts +77 -0
  98. package/dist/journeeze-api.js +371 -0
  99. package/dist/journeeze-api.js.map +1 -0
  100. package/dist/journeeze-connect.d.ts +156 -0
  101. package/dist/journeeze-connect.js +357 -0
  102. package/dist/journeeze-connect.js.map +1 -0
  103. package/dist/journey-anchor-api.d.ts +37 -0
  104. package/dist/journey-anchor-api.js +58 -0
  105. package/dist/journey-anchor-api.js.map +1 -0
  106. package/dist/journey-anchor-cli.d.ts +17 -0
  107. package/dist/journey-anchor-cli.js +104 -0
  108. package/dist/journey-anchor-cli.js.map +1 -0
  109. package/dist/journey-anchor-gate.d.ts +52 -0
  110. package/dist/journey-anchor-gate.js +101 -0
  111. package/dist/journey-anchor-gate.js.map +1 -0
  112. package/dist/journey-api.d.ts +30 -1
  113. package/dist/journey-api.js +118 -16
  114. package/dist/journey-api.js.map +1 -1
  115. package/dist/journey-cli.js +93 -10
  116. package/dist/journey-cli.js.map +1 -1
  117. package/dist/journey-demo-api.d.ts +29 -0
  118. package/dist/journey-demo-api.js +29 -7
  119. package/dist/journey-demo-api.js.map +1 -1
  120. package/dist/journey-heal.js +1 -1
  121. package/dist/journey-heal.js.map +1 -1
  122. package/dist/journey-lint-sarif.d.ts +3 -2
  123. package/dist/journey-lint-sarif.js +11 -2
  124. package/dist/journey-lint-sarif.js.map +1 -1
  125. package/dist/journey-migrate-api.d.ts +54 -0
  126. package/dist/journey-migrate-api.js +64 -0
  127. package/dist/journey-migrate-api.js.map +1 -0
  128. package/dist/journey-network-checks.d.ts +11 -0
  129. package/dist/journey-network-checks.js +36 -13
  130. package/dist/journey-network-checks.js.map +1 -1
  131. package/dist/journey-proposal-store.d.ts +9 -0
  132. package/dist/journey-proposal-store.js +23 -0
  133. package/dist/journey-proposal-store.js.map +1 -1
  134. package/dist/journey-result-record.d.ts +2 -0
  135. package/dist/journey-result-record.js +5 -0
  136. package/dist/journey-result-record.js.map +1 -1
  137. package/dist/journey-review-api.js +9 -1
  138. package/dist/journey-review-api.js.map +1 -1
  139. package/dist/journey-review.d.ts +11 -1
  140. package/dist/journey-review.js +77 -5
  141. package/dist/journey-review.js.map +1 -1
  142. package/dist/journey-stale-api.d.ts +40 -0
  143. package/dist/journey-stale-api.js +57 -0
  144. package/dist/journey-stale-api.js.map +1 -0
  145. package/dist/load-api.js +4 -2
  146. package/dist/load-api.js.map +1 -1
  147. package/dist/locator-health-api.d.ts +101 -0
  148. package/dist/locator-health-api.js +203 -0
  149. package/dist/locator-health-api.js.map +1 -0
  150. package/dist/locator-health.d.ts +195 -0
  151. package/dist/locator-health.js +419 -0
  152. package/dist/locator-health.js.map +1 -0
  153. package/dist/mcp-api.d.ts +3 -1
  154. package/dist/mcp-api.js +21 -2
  155. package/dist/mcp-api.js.map +1 -1
  156. package/dist/mcp-cli-tools.d.ts +4 -1
  157. package/dist/mcp-cli-tools.js +82 -10
  158. package/dist/mcp-cli-tools.js.map +1 -1
  159. package/dist/openrouter-call.d.ts +23 -10
  160. package/dist/openrouter-call.js +14 -11
  161. package/dist/openrouter-call.js.map +1 -1
  162. package/dist/png-pixels.d.ts +12 -0
  163. package/dist/png-pixels.js +96 -0
  164. package/dist/png-pixels.js.map +1 -0
  165. package/dist/project-config.d.ts +29 -0
  166. package/dist/project-config.js +76 -0
  167. package/dist/project-config.js.map +1 -0
  168. package/dist/regression-api.js +2 -1
  169. package/dist/regression-api.js.map +1 -1
  170. package/dist/server-log-verify.js +2 -1
  171. package/dist/server-log-verify.js.map +1 -1
  172. package/dist/signal-triage.js +7 -3
  173. package/dist/signal-triage.js.map +1 -1
  174. package/dist/source-run-api.js +2 -2
  175. package/dist/source-run-api.js.map +1 -1
  176. package/dist/verify-fix-api.d.ts +29 -0
  177. package/dist/verify-fix-api.js +43 -2
  178. package/dist/verify-fix-api.js.map +1 -1
  179. package/dist/verify-fix-cli.js +4 -0
  180. package/dist/verify-fix-cli.js.map +1 -1
  181. package/dist/zip-store.d.ts +15 -0
  182. package/dist/zip-store.js +93 -0
  183. package/dist/zip-store.js.map +1 -0
  184. package/package.json +12 -10
  185. package/skills/jevitate-ci-check/SKILL.md +16 -0
  186. package/skills/jevitate-demo/SKILL.md +4 -1
  187. package/skills/jevitate-getting-started/SKILL.md +7 -2
  188. package/skills/jevitate-run-journey/SKILL.md +15 -0
  189. package/skills/jevitate-test-campaign/SKILL.md +26 -0
  190. package/skills/jevitate-verify-fix/SKILL.md +5 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * #471 — a minimal, deterministic ZIP writer for the Journeeze catalog bundle upload (journeeze-saas
3
+ * `docs/contract/catalog-bundle-upload-v1.md` §4.2: `application/zip`, `bundle.json` at the root
4
+ * and the media under `media/`). Entries are STORED (media is already compressed), in the given
5
+ * order, with a fixed timestamp (1980-01-01 00:00) and no extra fields, so the same bundle always
6
+ * gives the same bytes — a re-publish reuses its Idempotency-Key with the same body digest. No
7
+ * ZIP64: refused past 4 GiB or 65,535 entries (far above the contract's 256 MiB upload).
8
+ */
9
+ const CRC_TABLE = (() => {
10
+ const t = new Uint32Array(256);
11
+ for (let n = 0; n < 256; n++) {
12
+ let c = n;
13
+ for (let k = 0; k < 8; k++)
14
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
15
+ t[n] = c >>> 0;
16
+ }
17
+ return t;
18
+ })();
19
+ export function crc32(data) {
20
+ let c = 0xffffffff;
21
+ for (let i = 0; i < data.length; i++)
22
+ c = CRC_TABLE[(c ^ data[i]) & 0xff] ^ (c >>> 8);
23
+ return (c ^ 0xffffffff) >>> 0;
24
+ }
25
+ const SAFE_NAME = /^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/-]{1,512}$/u;
26
+ /** 1980-01-01 00:00:00 in MS-DOS date/time. */
27
+ const DOS_TIME = 0;
28
+ const DOS_DATE = (0 << 9) | (1 << 5) | 1;
29
+ export function zipStore(entries) {
30
+ if (entries.length > 0xffff)
31
+ throw new Error("too many ZIP entries");
32
+ const seen = new Set();
33
+ const locals = [];
34
+ const centrals = [];
35
+ let offset = 0;
36
+ for (const e of entries) {
37
+ if (!SAFE_NAME.test(e.name))
38
+ throw new Error(`unsafe ZIP entry name ${JSON.stringify(e.name)}`);
39
+ if (seen.has(e.name))
40
+ throw new Error(`duplicate ZIP entry ${e.name}`);
41
+ seen.add(e.name);
42
+ const name = Buffer.from(e.name, "utf8");
43
+ const crc = crc32(e.data);
44
+ const size = e.data.byteLength;
45
+ if (offset + 30 + name.length + size > 0xffffffff)
46
+ throw new Error("ZIP too large");
47
+ const local = Buffer.alloc(30);
48
+ local.writeUInt32LE(0x04034b50, 0);
49
+ local.writeUInt16LE(20, 4); // version needed
50
+ local.writeUInt16LE(0x0800, 6); // flags: UTF-8 names
51
+ local.writeUInt16LE(0, 8); // stored
52
+ local.writeUInt16LE(DOS_TIME, 10);
53
+ local.writeUInt16LE(DOS_DATE, 12);
54
+ local.writeUInt32LE(crc, 14);
55
+ local.writeUInt32LE(size, 18);
56
+ local.writeUInt32LE(size, 22);
57
+ local.writeUInt16LE(name.length, 26);
58
+ local.writeUInt16LE(0, 28);
59
+ const central = Buffer.alloc(46);
60
+ central.writeUInt32LE(0x02014b50, 0);
61
+ central.writeUInt16LE(20, 4); // version made by
62
+ central.writeUInt16LE(20, 6);
63
+ central.writeUInt16LE(0x0800, 8);
64
+ central.writeUInt16LE(0, 10);
65
+ central.writeUInt16LE(DOS_TIME, 12);
66
+ central.writeUInt16LE(DOS_DATE, 14);
67
+ central.writeUInt32LE(crc, 16);
68
+ central.writeUInt32LE(size, 20);
69
+ central.writeUInt32LE(size, 24);
70
+ central.writeUInt16LE(name.length, 28);
71
+ central.writeUInt16LE(0, 30); // extra
72
+ central.writeUInt16LE(0, 32); // comment
73
+ central.writeUInt16LE(0, 34); // disk
74
+ central.writeUInt16LE(0, 36); // internal attrs
75
+ central.writeUInt32LE(0, 38); // external attrs
76
+ central.writeUInt32LE(offset, 42);
77
+ locals.push(local, name, Buffer.from(e.data.buffer, e.data.byteOffset, e.data.byteLength));
78
+ centrals.push(central, name);
79
+ offset += 30 + name.length + size;
80
+ }
81
+ const cd = Buffer.concat(centrals);
82
+ const end = Buffer.alloc(22);
83
+ end.writeUInt32LE(0x06054b50, 0);
84
+ end.writeUInt16LE(0, 4);
85
+ end.writeUInt16LE(0, 6);
86
+ end.writeUInt16LE(entries.length, 8);
87
+ end.writeUInt16LE(entries.length, 10);
88
+ end.writeUInt32LE(cd.length, 12);
89
+ end.writeUInt32LE(offset, 16);
90
+ end.writeUInt16LE(0, 20);
91
+ return Buffer.concat([...locals, cd, end]);
92
+ }
93
+ //# sourceMappingURL=zip-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-store.js","sourceRoot":"","sources":["../src/zip-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jevitate/cli",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Autonomous browser testing that turns discovered bugs into deterministic regression tests: explore a web app in a real browser, confirm findings with evidence, and replay them as regressions in CI.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,7 +30,7 @@
30
30
  "jevitate"
31
31
  ],
32
32
  "engines": {
33
- "node": ">=20"
33
+ "node": ">=22"
34
34
  },
35
35
  "bin": {
36
36
  "jevitate": "dist/bin.js"
@@ -54,31 +54,33 @@
54
54
  "@openrouter/ai-sdk-provider": "^3.1.0",
55
55
  "@typesafe-ai/sdk": "^0.6.0",
56
56
  "ai": "^7.0.107",
57
- "better-sqlite3": "^11.0.0",
57
+ "better-sqlite3": "^13.0.3",
58
58
  "commander": "^12.0.0",
59
59
  "playwright": "^1.49.0"
60
60
  },
61
61
  "devDependencies": {
62
+ "ajv": "^8.20.0",
63
+ "ajv-formats": "^3.0.1",
62
64
  "esbuild": "^0.28.2",
63
65
  "@jevitate/ai-core": "0.1.0",
64
- "@jevitate/daemon": "0.1.0",
65
- "@jevitate/domain": "0.1.0",
66
66
  "@jevitate/example-site": "0.1.0",
67
- "@jevitate/explore": "0.1.0",
68
- "@jevitate/inbox": "0.1.0",
69
67
  "@jevitate/findings": "0.1.0",
70
- "@jevitate/interpreter": "0.1.0",
68
+ "@jevitate/domain": "0.1.0",
69
+ "@jevitate/inbox": "0.1.0",
70
+ "@jevitate/explore": "0.1.0",
71
71
  "@jevitate/journey": "0.1.0",
72
+ "@jevitate/interpreter": "0.1.0",
72
73
  "@jevitate/mcp-facade": "0.1.0",
73
- "@jevitate/missions": "0.1.0",
74
+ "@jevitate/daemon": "0.1.0",
74
75
  "@jevitate/playwright": "0.1.0",
76
+ "@jevitate/missions": "0.1.0",
75
77
  "@jevitate/recorder": "0.1.0",
76
78
  "@jevitate/recording": "0.1.0",
77
79
  "@jevitate/regression": "0.1.0",
78
80
  "@jevitate/runtime": "0.1.0",
79
81
  "@jevitate/screenplay": "0.1.0",
80
- "@jevitate/skills": "0.1.0",
81
82
  "@jevitate/sources": "0.1.0",
83
+ "@jevitate/skills": "0.1.0",
82
84
  "@jevitate/ux": "0.1.0",
83
85
  "@jevitate/storage-sqlite": "0.1.0",
84
86
  "@jevitate/load": "0.1.0"
@@ -59,6 +59,22 @@ Relative paths resolve against the suite file.
59
59
  with a proposal in `.proposals/` for a person to `journey review` / `journey promote --proposal`;
60
60
  commit `.proposals/` with the PR. Without a change context the flag is refused (64).
61
61
 
62
+ - Locator health (which selector rung each recorded step resolves by, and whether it meets the
63
+ project's `testIdAttributes` convention in `.jevitate/project.json`) is advisory: fixes appear as
64
+ SARIF warnings and in `check.json`. `--max-brittle-steps <n>` (MCP `run_check` `maxBrittleSteps`)
65
+ opts into a gate: a Journey item with more than n brittle steps is a gating finding (exit 1).
66
+ `jevitate locator-health [--journey <id>] [--baseline <file>] --json` (MCP `locator_health`)
67
+ reports it on its own and never gates.
68
+ - `--require-approvals [--allow-channels tty,pr-review]` fails a missing or stale approval, or one
69
+ made over a channel not allowed. `pr-review` (an approval jevitate verified through a merged,
70
+ approved GitHub pull request) is re-verified through the GitHub API on every check (it needs
71
+ `GITHUB_TOKEN` and `pull-requests: read`); one that cannot be re-verified is an `unverified`
72
+ violation. No flag or tool argument sets `pr-review`. See the jevitate repo's `docs/ci.md`.
73
+ - Publishing the catalog to Journeeze from CI: set the `JOURNEEZE_UPLOAD_KEY` secret and run
74
+ `jevitate publish journeeze --json` (MCP `publish_to_journeeze`; `--dry-run` sends nothing).
75
+ Refusals carry an `E_JOURNEEZE_*` code (64 when the key or connection is the problem, 2 when
76
+ Journeeze could not take it).
77
+
62
78
  ## Exit codes: gate on 1, and treat 2 and 64 as broken
63
79
 
64
80
  `0` pass · `1` at least one gating finding (a Journey assertion, an invariant, a goal check, a
@@ -13,7 +13,10 @@ something the app didn't do.
13
13
  - Demos and Journey replays run against a named environment from the committed
14
14
  `.jevitate/environments.json` (`jevitate init` writes an example with a `local` entry). Each
15
15
  entry has `baseUrl` (an origin), an optional `allow` list, `fixtures` and `hooks`. Mark a live
16
- site with `"production": true`. `demo` refuses one (`E_DEMO_PRODUCTION_ENV`, exit 64).
16
+ site with `"production": true`. `demo` refuses one (`E_DEMO_PRODUCTION_ENV`, exit 64). Mark a
17
+ seeded, synthetic tenant with `"synthetic": true`: only a demo approved there ships masked media
18
+ (jz-mask-v1) to Journeeze with `catalog export` / `publish journeeze`. Set it only when the human
19
+ says the environment holds no real customer data.
17
20
  - The file never holds a secret or a session. Sessions and secret fields live in
18
21
  `~/.jevitate/targets.json`, keyed by the environment's origin, with `personas` for named
19
22
  sessions. Never write a session or password into the repo.
@@ -59,10 +59,14 @@ Then pick the matching skill:
59
59
  `find_capabilities`/`run_journey` = `journey find`/`journey run`, `author_journey` =
60
60
  `explore-author-journey`, `create_demo`/`demo_journey` = `demo`/`journey demo`, `verify_fix` =
61
61
  `verify-fix`, `regressions` = `regression capture|run`, `ledger` = `ledger …`, `run_check` =
62
- `check`, `get_report` = `report`, `ux_review` = `ux`. The full table is in the jevitate repo's
62
+ `check`, `get_report` = `report`, `ux_review` = `ux`, `locator_health` = `locator-health`,
63
+ `draft_job_outcomes` = `job draft-outcomes`, `export_catalog_bundle` = `catalog export`,
64
+ `publish_to_journeeze` = `publish journeeze`. The full table is in the jevitate repo's
63
65
  `docs/agents.md`.
64
66
  - These are never available over MCP: `record` (a person clicks), `init`, `ai setup` (secret entry),
65
- `ui`, `source trust` and `source add --accept-tou`. Operator settings are never tool arguments
67
+ `ui`, `source trust`, `source add --accept-tou`, `connect journeeze` (a person enters where the
68
+ Journeeze upload key is kept; `publish_to_journeeze` never sees the key) and `journey migrate`
69
+ (a one-time rewrite the operator commits). Operator settings are never tool arguments
66
70
  either: shell hooks, browser binaries, which environment variable a secret comes from, and
67
71
  log-command sources. Tell the human the CLI command instead.
68
72
  - Raw browser tools (click, fill, evaluate, get DOM or cookies) don't exist on purpose. Never
@@ -79,6 +83,7 @@ you do, show them what they are approving:
79
83
  - promoting a mission target: `jevitate mission target promote <id>`
80
84
  - trusting a third-party Journey or accepting a source's Terms of Use (CLI only)
81
85
  - approving a catalog persona or job, waiving an unvetted link, acknowledging findings: `jevitate persona approve <id>`, `jevitate job approve <id>`, `journey promote --accept-unvetted`, `--accept-findings` (approve and acknowledge are CLI only; MCP reads `review_persona` / `review_job` / `catalog_status` / `analyze_catalog`)
86
+ - connecting the project to Journeeze: `jevitate connect journeeze` (CLI only, a person at a terminal). Drafting a job's desired outcomes (`job draft-outcomes` / `draft_job_outcomes`) is not an approval: it marks them `provenance: ai_draft`, and a person still reviews and runs `job approve`
82
87
  - approving or cancelling an inbox item: only in `jevitate ui`. The MCP tools `approve_action` and `cancel_command` always refuse.
83
88
 
84
89
  Every CLI approval (`journey promote`, `demo approve`, `persona approve`, `job approve`, and the
@@ -46,6 +46,10 @@ artifact; your job is to find the right one and run it with the right params.
46
46
  - Evidence: `--record-video` (listed as `videoPaths`), `--screenshots
47
47
  [screens|steps]` (`screenshotPaths` + an `index.md`), `--headed`/`--slow-mo <ms>`
48
48
  to watch it. `--viewport 375x812` / `--device "iPhone 13"` for mobile.
49
+ - A step's `responseStatus` check waits up to 15 s for a request that was sent
50
+ but not yet answered (a cold start after a deploy); `--step-response-timeout
51
+ <ms>` (MCP `run_journey`'s `stepResponseTimeoutMs`) raises it for one run. A
52
+ late 2xx is an advisory `slowSteps` finding, not a failure.
49
53
  - For a narrated demo video or a step-by-step guide of a Journey, use
50
54
  `jevitate-demo` (`journey demo`, `journey annotate`).
51
55
 
@@ -112,6 +116,17 @@ artifact; your job is to find the right one and run it with the right params.
112
116
  proof, change since the last approval, and the content hash. Pass that hash
113
117
  as `--reviewed-hash` (MCP `reviewedHash`) so the approval is refused
114
118
  (`E_JOURNEY_REVIEW_STALE`) if the Journey changed after they read it.
119
+ - A new Journey, or one whose content changed beyond step ids, must follow the
120
+ anchor rules to promote (lowercase anchor names, anchors carrying their
121
+ step's `stepId`, a job-linked Journey naming at least one anchor, valid
122
+ `serves`/`jobStep` references); otherwise promote is refused with
123
+ `E_JOURNEY_ANCHOR_RULES` and the fix for each problem. The sheet and
124
+ `journey lint` show the same problems as warnings first.
125
+ - `jevitate journey review --stale --json` (MCP `review_journey` with
126
+ `stale: true`) lists every promoted Journey whose approval is stale;
127
+ `stepIdOnly: true` marks one whose only change is minted step ids (after
128
+ `jevitate journey migrate --step-ids`, which the operator runs and
129
+ commits). Re-approving those is still the person's act.
115
130
  - `jevitate journey promote <id>` promotes a local Journey — a person's
116
131
  approval, never automatic. It needs an interactive terminal: after the
117
132
  sheet, the person types the Journey id (or the first 8 characters of its
@@ -44,6 +44,14 @@ never the click path; independent `--success` checks (page or network state); pr
44
44
  whether it mutates state; and a run order (jobs that create data run before jobs that use it).
45
45
  A job you can't write a checkable `--success` for is too vague. Split it or narrow it.
46
46
 
47
+ Optionally give a job its steps and desired outcomes (`steps`, `desiredOutcomes` with a `metric`
48
+ measured between anchors or the reserved `"job_start"` / `"job_end"`, a `target`, `guardrail: true`
49
+ for what must never get worse; docs/catalog.md). `jevitate job draft-outcomes <id> --real --json`
50
+ (MCP `draft_job_outcomes`) drafts 1-3 outcomes marked `provenance: ai_draft` for the human to
51
+ review; it never approves, and an approved job becomes stale. On each job-linked Journey, mark
52
+ where the job's steps start and end with anchors (`jobStep`, `boundary`), so its metrics are
53
+ measurable; `catalog status` lists the reference problems (`refIssues`).
54
+
47
55
  ## 3. Discovery: one goal run per job
48
56
 
49
57
  For each job, as the right persona, with no scripted path:
@@ -70,6 +78,15 @@ mission takes over on the live page:
70
78
 
71
79
  ```bash
72
80
  jevitate journey anchors <journey-id> --json # the named states worth exploring from, with suggested probes
81
+ jevitate journey anchors <journey-id> --suggest --json # advisory: where the flow changes state (writes nothing)
82
+ jevitate journey anchor add <journey-id> --name <name> --step <n|stepId> --json # a DRAFT Journey only
83
+ ```
84
+
85
+ Over MCP: `journey_anchors` (`suggest: true`), `journey_anchor_add`, `journey_anchor_remove`, and
86
+ `lint_journey` with `fix: true` (stamps number-only anchors with their step id). Anchor edits refuse a
87
+ promoted Journey: its approval binds to the content hash, so edit a draft and a person re-promotes it.
88
+
89
+ ```bash
73
90
  jevitate explore --from-journey <journey-id> --at-step <anchor|n> --param <k=v> --env <env> --strategy adversarial --storage-state <persona-file> --max-actions 60 --evidence-video --real --json
74
91
  ```
75
92
 
@@ -105,6 +122,10 @@ Flags such as `--allow-destructive`, `--paid`, `--invariants`, `--log-source`/`-
105
122
  `--evidence-video` on `campaign run` are forwarded to every mission; `--hook-timeout-ms` bounds the
106
123
  spec's hooks. An invalid spec is refused with every problem listed (exit 64). Shell `before`/`after` restore
107
124
  hooks in the spec run only with `--allow-shell-hooks`, and only when the human asked for them.
125
+ Before any mission, a preflight checks every start URL is reachable, every session is signed in and
126
+ no app call slips outside the allow list, and refuses with the problems listed. Fix them;
127
+ `--skip-preflight` (MCP `run_campaign` `skipPreflight`) only when the human asks, and it is recorded
128
+ on the report.
108
129
 
109
130
  ## 5. A small untargeted pass, plus non-journey attacks
110
131
 
@@ -167,6 +188,11 @@ probability ≥ its `threshold` (Jev only advises). Then `jevitate catalog statu
167
188
  `fixed` by verify-fix (with a ledger entry or regression); the final round ran on the release
168
189
  build; and no `inconclusive` run was counted as a pass. Anything short of that, report it as open.
169
190
 
191
+ To share the vetted catalog, `jevitate catalog export --format journeeze-bundle --out <dir>
192
+ [--check <check.json>] --json` (MCP `export_catalog_bundle`) writes a Journeeze catalog bundle, and
193
+ `jevitate publish journeeze --json` (MCP `publish_to_journeeze`) uploads it once a person has run
194
+ `jevitate connect journeeze` (or CI sets `JOURNEEZE_UPLOAD_KEY`). Neither approves anything.
195
+
170
196
  ## Templates
171
197
 
172
198
  Job spec (one per job, `.jevitate/jobs.json`; the old `.jevitate/campaign/jobs.json` is still
@@ -24,6 +24,11 @@ the evidence. No model decides any of these verdicts.
24
24
  target's session in `~/.jevitate/targets.json`. A finding recorded at a viewport or device
25
25
  replays at that emulation. `--viewport`/`--device` that differ are refused unless
26
26
  `--allow-emulation-override` is passed.
27
+ - A finding replays under the allow list stored with its result. To prove an allow-list
28
+ config fix (e.g. `localhost` → `127.0.0.1`), pass `--allow <origin...>` or `--env <name>`
29
+ (that environment's CURRENT allow list), never both; MCP: `verify_fix`'s `env` only (an MCP caller never names origins).
30
+ The report then carries `allowlistOverride` (origins used, what was added and removed): say so
31
+ when you report the verdict.
27
32
 
28
33
  ## Evidence for a PR or an issue
29
34