@jevitate/cli 0.2.0 → 0.4.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 (217) hide show
  1. package/dist/ai-cli.d.ts +31 -11
  2. package/dist/ai-cli.js +100 -67
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/author-journey-cli.js +3 -1
  5. package/dist/author-journey-cli.js.map +1 -1
  6. package/dist/bin.js +48715 -40027
  7. package/dist/browser-run-options.d.ts +32 -1
  8. package/dist/browser-run-options.js +69 -0
  9. package/dist/browser-run-options.js.map +1 -1
  10. package/dist/build-info.generated.js +2 -2
  11. package/dist/campaign-api.d.ts +153 -0
  12. package/dist/campaign-api.js +447 -0
  13. package/dist/campaign-api.js.map +1 -0
  14. package/dist/campaign-cli.d.ts +8 -0
  15. package/dist/campaign-cli.js +109 -0
  16. package/dist/campaign-cli.js.map +1 -0
  17. package/dist/check-api.js +3 -2
  18. package/dist/check-api.js.map +1 -1
  19. package/dist/check-budget.js +2 -1
  20. package/dist/check-budget.js.map +1 -1
  21. package/dist/check-execute.d.ts +4 -0
  22. package/dist/check-execute.js +46 -10
  23. package/dist/check-execute.js.map +1 -1
  24. package/dist/check-plan.d.ts +5 -0
  25. package/dist/check-plan.js +77 -4
  26. package/dist/check-plan.js.map +1 -1
  27. package/dist/check-suite.d.ts +14 -1
  28. package/dist/check-suite.js +26 -1
  29. package/dist/check-suite.js.map +1 -1
  30. package/dist/cli-output.d.ts +4 -0
  31. package/dist/cli-output.js +52 -5
  32. package/dist/cli-output.js.map +1 -1
  33. package/dist/cli-shared.d.ts +13 -3
  34. package/dist/cli-shared.js +52 -7
  35. package/dist/cli-shared.js.map +1 -1
  36. package/dist/defect-evidence.d.ts +3 -2
  37. package/dist/defect-evidence.js +12 -8
  38. package/dist/defect-evidence.js.map +1 -1
  39. package/dist/demo-aspect-api.js +2 -1
  40. package/dist/demo-aspect-api.js.map +1 -1
  41. package/dist/demo-aspect-cli.js +3 -1
  42. package/dist/demo-aspect-cli.js.map +1 -1
  43. package/dist/demo-capture.d.ts +37 -3
  44. package/dist/demo-capture.js +119 -20
  45. package/dist/demo-capture.js.map +1 -1
  46. package/dist/explore-adversarial.d.ts +11 -4
  47. package/dist/explore-adversarial.js +22 -13
  48. package/dist/explore-adversarial.js.map +1 -1
  49. package/dist/explore-cli.js +282 -31
  50. package/dist/explore-cli.js.map +1 -1
  51. package/dist/explore-coverage.d.ts +17 -2
  52. package/dist/explore-coverage.js +20 -14
  53. package/dist/explore-coverage.js.map +1 -1
  54. package/dist/explore-feature.d.ts +0 -2
  55. package/dist/explore-feature.js +7 -9
  56. package/dist/explore-feature.js.map +1 -1
  57. package/dist/explore-goal.d.ts +25 -7
  58. package/dist/explore-goal.js +62 -19
  59. package/dist/explore-goal.js.map +1 -1
  60. package/dist/explore-shared.d.ts +53 -3
  61. package/dist/explore-shared.js +48 -1
  62. package/dist/explore-shared.js.map +1 -1
  63. package/dist/fixture-auth.d.ts +13 -2
  64. package/dist/fixture-auth.js +19 -6
  65. package/dist/fixture-auth.js.map +1 -1
  66. package/dist/fixture-cli.d.ts +29 -0
  67. package/dist/fixture-cli.js +121 -7
  68. package/dist/fixture-cli.js.map +1 -1
  69. package/dist/github-issue-filer.js +2 -1
  70. package/dist/github-issue-filer.js.map +1 -1
  71. package/dist/host-health-run.d.ts +2 -1
  72. package/dist/host-health-run.js +8 -2
  73. package/dist/host-health-run.js.map +1 -1
  74. package/dist/init-cli.js +34 -5
  75. package/dist/init-cli.js.map +1 -1
  76. package/dist/init-keys.d.ts +11 -0
  77. package/dist/init-keys.js +5 -2
  78. package/dist/init-keys.js.map +1 -1
  79. package/dist/journey-annotate-api.js +17 -4
  80. package/dist/journey-annotate-api.js.map +1 -1
  81. package/dist/journey-annotate-cli.js +3 -1
  82. package/dist/journey-annotate-cli.js.map +1 -1
  83. package/dist/journey-api.d.ts +26 -1
  84. package/dist/journey-api.js +51 -25
  85. package/dist/journey-api.js.map +1 -1
  86. package/dist/journey-cli.d.ts +1 -1
  87. package/dist/journey-cli.js +44 -3
  88. package/dist/journey-cli.js.map +1 -1
  89. package/dist/journey-demo-api.d.ts +2 -0
  90. package/dist/journey-demo-api.js +23 -10
  91. package/dist/journey-demo-api.js.map +1 -1
  92. package/dist/journey-demo-cli.js +5 -2
  93. package/dist/journey-demo-cli.js.map +1 -1
  94. package/dist/journey-prefix.d.ts +194 -0
  95. package/dist/journey-prefix.js +279 -0
  96. package/dist/journey-prefix.js.map +1 -0
  97. package/dist/key-report.d.ts +49 -0
  98. package/dist/key-report.js +101 -0
  99. package/dist/key-report.js.map +1 -0
  100. package/dist/kill-signal.js +0 -1
  101. package/dist/kill-signal.js.map +1 -1
  102. package/dist/ledger-api.js +3 -1
  103. package/dist/ledger-api.js.map +1 -1
  104. package/dist/log-correlation.d.ts +63 -1
  105. package/dist/log-correlation.js +125 -16
  106. package/dist/log-correlation.js.map +1 -1
  107. package/dist/log-sources.js +6 -5
  108. package/dist/log-sources.js.map +1 -1
  109. package/dist/log-trace.d.ts +80 -0
  110. package/dist/log-trace.js +210 -0
  111. package/dist/log-trace.js.map +1 -0
  112. package/dist/logs-cli.js +60 -1
  113. package/dist/logs-cli.js.map +1 -1
  114. package/dist/logs-retention.js +2 -1
  115. package/dist/logs-retention.js.map +1 -1
  116. package/dist/masked-input.d.ts +22 -0
  117. package/dist/masked-input.js +99 -0
  118. package/dist/masked-input.js.map +1 -0
  119. package/dist/mcp-api.d.ts +3 -1
  120. package/dist/mcp-api.js +49 -7
  121. package/dist/mcp-api.js.map +1 -1
  122. package/dist/mcp-args.d.ts +12 -0
  123. package/dist/mcp-args.js +33 -0
  124. package/dist/mcp-args.js.map +1 -1
  125. package/dist/mcp-cli-tools.d.ts +6 -1
  126. package/dist/mcp-cli-tools.js +103 -16
  127. package/dist/mcp-cli-tools.js.map +1 -1
  128. package/dist/mission-api.js +2 -1
  129. package/dist/mission-api.js.map +1 -1
  130. package/dist/mission-cli.js +3 -1
  131. package/dist/mission-cli.js.map +1 -1
  132. package/dist/mission-fixtures.d.ts +10 -1
  133. package/dist/mission-fixtures.js +49 -15
  134. package/dist/mission-fixtures.js.map +1 -1
  135. package/dist/mission-queue-runner.d.ts +2 -0
  136. package/dist/mission-queue-runner.js +18 -5
  137. package/dist/mission-queue-runner.js.map +1 -1
  138. package/dist/multi-run-cli.js +7 -1
  139. package/dist/multi-run-cli.js.map +1 -1
  140. package/dist/openrouter-call.js +3 -2
  141. package/dist/openrouter-call.js.map +1 -1
  142. package/dist/program.js +4 -0
  143. package/dist/program.js.map +1 -1
  144. package/dist/project-dir.js +3 -2
  145. package/dist/project-dir.js.map +1 -1
  146. package/dist/record-api.d.ts +3 -1
  147. package/dist/record-api.js +5 -2
  148. package/dist/record-api.js.map +1 -1
  149. package/dist/record-cli.js +14 -2
  150. package/dist/record-cli.js.map +1 -1
  151. package/dist/regression-api.d.ts +6 -0
  152. package/dist/regression-api.js +4 -2
  153. package/dist/regression-api.js.map +1 -1
  154. package/dist/regression-cli.js +56 -4
  155. package/dist/regression-cli.js.map +1 -1
  156. package/dist/report-api.js +2 -1
  157. package/dist/report-api.js.map +1 -1
  158. package/dist/resource-preflight.d.ts +87 -0
  159. package/dist/resource-preflight.js +160 -0
  160. package/dist/resource-preflight.js.map +1 -0
  161. package/dist/result-schema.d.ts +1 -1
  162. package/dist/result-schema.js +1 -1
  163. package/dist/run-key-preflight.d.ts +42 -0
  164. package/dist/run-key-preflight.js +82 -0
  165. package/dist/run-key-preflight.js.map +1 -0
  166. package/dist/run-screenshots.js +11 -5
  167. package/dist/run-screenshots.js.map +1 -1
  168. package/dist/runtime-env.js +3 -2
  169. package/dist/runtime-env.js.map +1 -1
  170. package/dist/server-log-verify.d.ts +2 -0
  171. package/dist/server-log-verify.js +8 -3
  172. package/dist/server-log-verify.js.map +1 -1
  173. package/dist/signal-triage.d.ts +147 -0
  174. package/dist/signal-triage.js +281 -0
  175. package/dist/signal-triage.js.map +1 -0
  176. package/dist/site-gate-cli.js +2 -1
  177. package/dist/site-gate-cli.js.map +1 -1
  178. package/dist/source-api.js +2 -1
  179. package/dist/source-api.js.map +1 -1
  180. package/dist/suite-explore-options.d.ts +36 -0
  181. package/dist/suite-explore-options.js +23 -0
  182. package/dist/suite-explore-options.js.map +1 -1
  183. package/dist/target-config.d.ts +12 -0
  184. package/dist/target-config.js +15 -0
  185. package/dist/target-config.js.map +1 -1
  186. package/dist/type-fixture-file.d.ts +9 -0
  187. package/dist/type-fixture-file.js +48 -0
  188. package/dist/type-fixture-file.js.map +1 -0
  189. package/dist/ui-api.js +4 -3
  190. package/dist/ui-api.js.map +1 -1
  191. package/dist/usability-capture.js +4 -3
  192. package/dist/usability-capture.js.map +1 -1
  193. package/dist/usage-config.d.ts +1 -1
  194. package/dist/usage-config.js +1 -1
  195. package/dist/ux-claim-probe.d.ts +45 -0
  196. package/dist/ux-claim-probe.js +386 -0
  197. package/dist/ux-claim-probe.js.map +1 -0
  198. package/dist/ux-cli.js +8 -1
  199. package/dist/ux-cli.js.map +1 -1
  200. package/dist/ux-product.d.ts +14 -0
  201. package/dist/ux-product.js +39 -0
  202. package/dist/ux-product.js.map +1 -0
  203. package/dist/ux-review.d.ts +4 -0
  204. package/dist/ux-review.js +27 -7
  205. package/dist/ux-review.js.map +1 -1
  206. package/dist/ux-usability.d.ts +34 -9
  207. package/dist/ux-usability.js +102 -16
  208. package/dist/ux-usability.js.map +1 -1
  209. package/dist/verify-fix-api.d.ts +21 -0
  210. package/dist/verify-fix-api.js +85 -33
  211. package/dist/verify-fix-api.js.map +1 -1
  212. package/dist/verify-fix-cli.js +7 -2
  213. package/dist/verify-fix-cli.js.map +1 -1
  214. package/package.json +11 -11
  215. package/skills/jevitate-explore/SKILL.md +13 -0
  216. package/skills/jevitate-getting-started/SKILL.md +2 -1
  217. package/skills/jevitate-test-campaign/SKILL.md +206 -0
@@ -0,0 +1,206 @@
1
+ ---
2
+ name: jevitate-test-campaign
3
+ description: Plan and run an end-to-end release test campaign of a whole web app with jevitate: preflight, a jobs-to-be-done catalog, discovery runs → draft Journeys, journey-anchored adversarial/exploratory missions, full-stack evidence, triage by exit code, verify-fix and regressions, budgets, CI suites and the release gate. Use to test a release or "the whole app" across many user jobs. For one run, use that tool's skill.
4
+ ---
5
+
6
+ A campaign is many bounded runs, chosen on purpose and read honestly. An untargeted sweep from the
7
+ landing page stays shallow (a handful of states near the entry pages) and never reaches the core
8
+ jobs. Anchor everything on the jobs users actually do. Load `jevitate-explore`,
9
+ `jevitate-run-journey`, `jevitate-verify-fix` and `jevitate-ci-check` for the flags of each step.
10
+
11
+ ## 0. Targets and environments
12
+
13
+ - Test a non-production environment the human has authorized: a local dev server, a preview or a
14
+ staging build. Name each in `.jevitate/environments.json` so Journeys run with `--env <name>`.
15
+ - Iterate on a dev or debug build (hot reload makes frontend fixes cheap). Timing findings there
16
+ are advisory. Run the final round on the compiled release build before the gate, and leave load
17
+ testing (`jevitate-load-test`) to a release-like environment.
18
+ - Never point a sweep at a database other test work is using. Seed or reset it (`--fixtures`, or an
19
+ operator `--before`/`--after` hook) so runs don't pollute each other.
20
+
21
+ ## 1. Preflight (stop on any failure)
22
+
23
+ - `jevitate ai status --json`: the keys must be accepted live, not just present.
24
+ - One tiny `--real` goal run proves the model path end to end before you queue an hour of runs.
25
+ - One Playwright storageState per persona (kept under `~/.jevitate/`, never committed). Check each
26
+ still logs in: a quick goal run per persona with `--storage-state <file>` and a `--success`
27
+ check on a page only that persona sees. Use `--save-storage-state` on the same file when the app
28
+ rotates refresh tokens.
29
+ - Target health: the start URL answers and the backend is up. A dead target makes every run
30
+ `inconclusive`, which tells you nothing.
31
+
32
+ ## 2. Build the job catalog first
33
+
34
+ List every user job from the app's routes, API surface and product docs: persona, job, and the
35
+ signal that proves it worked. Write one goal spec per job (template below): the outcome only,
36
+ never the click path; independent `--success` checks (page or network state); preconditions;
37
+ whether it mutates state; and a run order (jobs that create data run before jobs that use it).
38
+ A job you can't write a checkable `--success` for is too vague. Split it or narrow it.
39
+
40
+ ## 3. Discovery: one goal run per job
41
+
42
+ For each job, as the right persona, with no scripted path:
43
+
44
+ ```bash
45
+ jevitate explore-author-journey --url <start-url> --goal "<outcome only>" --success "<check>" --id <job-id> --name "<job>" --storage-state <persona-file> --real --json
46
+ ```
47
+
48
+ - Reached: an UNPROMOTED draft Journey is written. Promotion is a human decision. List the drafts
49
+ and ask the human to review and run `jevitate journey promote <id>`. Never promote yourself.
50
+ - Stuck, detour, `exhausted` or `inconclusive`: that is a finding about the job itself
51
+ (discoverability, UX, a broken step), not only a crash. Log it in the register.
52
+ - A question rather than a task ("how many seats does the plan allow?") is a find-out run: a
53
+ `--goal "find out …; report the answer"` with no `--success`, read-only by default.
54
+
55
+ ## 4. Journey-anchored missions (where most defects are)
56
+
57
+ Defects cluster mid-flow: a verification step, a checkout, a half-finished build. Start missions
58
+ from a promoted Journey's key intermediate states, not the landing page. The Journey's prefix is
59
+ replayed in the mission's OWN browser context (page, form contents and session kept), then the
60
+ mission takes over on the live page:
61
+
62
+ ```bash
63
+ jevitate journey anchors <journey-id> --json # the named states worth exploring from, with suggested probes
64
+ 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
65
+ ```
66
+
67
+ - `--at-step` takes an anchor name (from `metadata.anchors`) or a 1-based step number. Only the
68
+ prefix's own `--param`s are required. `--strategy` may be goal, coverage, exploratory,
69
+ adversarial or usability (`--feature`, `--repeat`, `--persona` and `--actor` are refused).
70
+ - A prefix that no longer replays ends the run `inconclusive` with `failure.kind: "journey-stale"`
71
+ (exit 2): the Journey drifted. Fix or re-author it; never fall back to a bare `--url`.
72
+ - Results and findings carry `branch: {journeyId, step, anchor}`: the exact point they came from.
73
+ - `--at-step all` (or `anchors`) sweeps every step: each in a fresh session restored by
74
+ `--fixtures`, `--max-actions` split evenly per step, one deduped report naming each defect's steps.
75
+ - `verify-fix` and regressions replay such a finding THROUGH the Journey prefix (re-supply secret
76
+ params with `--param`); a stale prefix is `inconclusive` (`journey-stale`), never `fixed`.
77
+ - `--strategy adversarial` attacks the anchor: replaying a one-time code, swapping a tenant id
78
+ mid-flow, a double submit at checkout, an expired share link, skipping a step-up (the anchor's
79
+ `probes` list what to try). `--strategy exploratory` follows newly revealed controls from there.
80
+ `--strategy usability --goal "<job>" --app-class <class>` critiques the job (`jevitate-ux-review`).
81
+ - `--persona <name=storageState>` (repeatable, without `--from-journey`) runs the same mission per
82
+ role and diffs them; a 403 for one and 200 for another is a candidate authorization finding.
83
+ - `--invariants <file>` turns app rules ("Saved means stored") into code-decided defects. Lint
84
+ them first: `jevitate invariants validate <files...> --url <url>`.
85
+
86
+ Sweep many anchors with a campaign (template below): discovery replays each job's whole Journey (a
87
+ stale one skips its missions), then every anchored mission runs in order with the spec's
88
+ `fixtures` restore around each run, and ONE deduped report comes back (each defect lists the
89
+ Journey steps it branched from):
90
+
91
+ ```bash
92
+ jevitate campaign run .jevitate/campaign/campaign.json --real --json
93
+ ```
94
+
95
+ Flags such as `--allow-destructive`, `--paid`, `--invariants`, `--log-source`/`--log-defect` and
96
+ `--evidence-video` on `campaign run` are forwarded to every mission; `--hook-timeout-ms` bounds the
97
+ spec's hooks. An invalid spec is refused with every problem listed (exit 64). Shell `before`/`after` restore
98
+ hooks in the spec run only with `--allow-shell-hooks`, and only when the human asked for them.
99
+
100
+ ## 5. A small untargeted pass, plus non-journey attacks
101
+
102
+ Keep one `--strategy coverage --scope app` run per persona to find orphan and dead-end screens.
103
+ Attacks that no Journey reaches (direct API authorization, forged or reordered webhooks,
104
+ cross-tenant requests, session fixation across hosts) are scripted by the operator; record what
105
+ was tried in the register, so the gate can show they were covered.
106
+
107
+ ## 6. Full-stack evidence on every run
108
+
109
+ Tail the backend while the browser runs, so each finding carries its server-side cause:
110
+ `--log-source docker:<container>` (or `file:<path>`), `--log-defect error`, and
111
+ `--log-correlation-header <name>` when the app propagates a request id. Matching log lines are
112
+ redacted and attached to the step that caused them. Add `--log-triage` so each finding carries only
113
+ its related lines (`defects[].relatedLogs`): put those in the issue, not the whole log. Add `--evidence-video` (a captioned clip per
114
+ defect) or `--screenshots`, and link the files from the issue.
115
+
116
+ ## 7. Triage by exit code, then collect before fixing
117
+
118
+ `0` clean · `1` defects found · `2` inconclusive (proved nothing: never a pass; fix the budget,
119
+ session or check and rerun) · `3` hang · `4` intermittent · `64` refused, nothing ran. Report the
120
+ outcome you got. Never round it up.
121
+
122
+ 1. Collect: a campaign's own `campaign.md` is already one deduped list; across campaigns and
123
+ ad-hoc runs, `jevitate report --target <origin> --since <campaign-start> --json` dedupes every run
124
+ into one defect list. Keep one register (template below) tagged by layer and severity.
125
+ 2. Fix: frontend fixes under the hot-reload dev server, rechecked at once; backend fixes batched
126
+ into one rebuild.
127
+ 3. Prove: `jevitate verify-fix --result <run>.result.json --fingerprint <fp> --replays 3 --json` for
128
+ every finding. Only `fixed` counts. Then `jevitate ledger add <run>.result.json <fp> --json` and,
129
+ when the human asks, `jevitate regression capture --from <run>.json --result <run>.result.json --fingerprint <fp> --id <id> --json`.
130
+ 4. Re-sweep the jobs the fixes touched, and compare: `jevitate diff <runA> <runB> --json`.
131
+
132
+ ## 8. Budgets and machine limits
133
+
134
+ - Every run has a cap: `--max-actions` (and `--max-decisions` for model-driven runs). Start at
135
+ 40–60 per mission; raise it only for a run that ended `exhausted` on a real job.
136
+ - Run missions one at a time. Check free memory before each; a browser killed by the OOM killer
137
+ reads as `crashed`, not as an app defect.
138
+ - Mark paid controls with `--paid <pattern>` so retries and hang replays never repeat them. Never
139
+ add `--allow-destructive` or `--allow-writes` unless the human asked.
140
+
141
+ ## 9. CI: promoted Journeys + a check suite
142
+
143
+ Put every promoted Journey, the invariants, the key goals and a few anchored missions in a suite,
144
+ and gate with `jevitate check --suite <suite.json> --target-build <sha> --json` (MCP `run_check`;
145
+ see `jevitate-ci-check`). Tag the release candidate's clean run as a baseline:
146
+ `jevitate baseline tag <name> <runs...>`. In CI, exit 1 fails the build, and exit 2 or 64 is a
147
+ broken check, never green.
148
+
149
+ ## 10. The gate
150
+
151
+ Release only when: every job in the catalog has a promoted Journey that passes; every finding is
152
+ `fixed` by verify-fix (with a ledger entry or regression); the final round ran on the release
153
+ build; and no `inconclusive` run was counted as a pass. Anything short of that, report it as open.
154
+
155
+ ## Templates
156
+
157
+ Job spec (one per job, `.jevitate/campaign/jobs.json`) — the catalog you plan from:
158
+
159
+ ```json
160
+ [{
161
+ "id": "invite-teammate",
162
+ "persona": "admin",
163
+ "storageState": "~/.jevitate/sessions/admin.json",
164
+ "goal": "invite a new teammate by email and see them listed as pending",
165
+ "success": ["textIncludes:role=table|Pending", "responseStatus:POST /api/invites=2xx"],
166
+ "preconditions": ["an org with a free seat"],
167
+ "mutates": true,
168
+ "order": 3
169
+ }]
170
+ ```
171
+
172
+ Anchors live on the promoted Journey itself (`metadata.anchors`, listed by `jevitate journey anchors <id>`):
173
+
174
+ ```json
175
+ "anchors": [{ "name": "invite-form", "step": 4, "description": "the filled invite form", "probes": ["double submit", "invite into another org id"] }]
176
+ ```
177
+
178
+ Campaign spec (`.jevitate/campaign/campaign.json`, for `jevitate campaign run`):
179
+
180
+ ```json
181
+ {
182
+ "version": 1,
183
+ "name": "release-candidate",
184
+ "env": "staging",
185
+ "fixtures": "restore.json",
186
+ "maxRuns": 40,
187
+ "maxActions": 60,
188
+ "jobs": [
189
+ { "id": "invite-teammate", "journey": "invite-teammate", "storageState": "~/.jevitate/sessions/admin.json",
190
+ "params": { "email": "new@example.test" }, "anchors": ["invite-form"], "strategies": ["adversarial", "exploratory"] },
191
+ { "id": "checkout", "journey": "checkout", "anchors": ["payment", 6], "strategies": ["adversarial"], "maxActions": 40 }
192
+ ]
193
+ }
194
+ ```
195
+
196
+ Issue register (one row per deduped finding, `.jevitate/campaign/register.md`):
197
+
198
+ ```text
199
+ | fingerprint | job | layer (fe/be) | severity | outcome | evidence | status (open/fixed/verified) | regression |
200
+ ```
201
+
202
+ ## What you must never do
203
+
204
+ - Never promote a Journey, approve an inbox item or capture a regression on your own. Ask.
205
+ - Never count `inconclusive`, `intermittent` or a single clean replay as passing.
206
+ - Never widen `--allow` beyond what the human authorized, and never test production.