@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.
- package/dist/ai-cli.d.ts +31 -11
- package/dist/ai-cli.js +100 -67
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.js +3 -1
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +48715 -40027
- package/dist/browser-run-options.d.ts +32 -1
- package/dist/browser-run-options.js +69 -0
- package/dist/browser-run-options.js.map +1 -1
- package/dist/build-info.generated.js +2 -2
- package/dist/campaign-api.d.ts +153 -0
- package/dist/campaign-api.js +447 -0
- package/dist/campaign-api.js.map +1 -0
- package/dist/campaign-cli.d.ts +8 -0
- package/dist/campaign-cli.js +109 -0
- package/dist/campaign-cli.js.map +1 -0
- package/dist/check-api.js +3 -2
- package/dist/check-api.js.map +1 -1
- package/dist/check-budget.js +2 -1
- package/dist/check-budget.js.map +1 -1
- package/dist/check-execute.d.ts +4 -0
- package/dist/check-execute.js +46 -10
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.d.ts +5 -0
- package/dist/check-plan.js +77 -4
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.d.ts +14 -1
- package/dist/check-suite.js +26 -1
- package/dist/check-suite.js.map +1 -1
- package/dist/cli-output.d.ts +4 -0
- package/dist/cli-output.js +52 -5
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +13 -3
- package/dist/cli-shared.js +52 -7
- package/dist/cli-shared.js.map +1 -1
- package/dist/defect-evidence.d.ts +3 -2
- package/dist/defect-evidence.js +12 -8
- package/dist/defect-evidence.js.map +1 -1
- package/dist/demo-aspect-api.js +2 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +3 -1
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/demo-capture.d.ts +37 -3
- package/dist/demo-capture.js +119 -20
- package/dist/demo-capture.js.map +1 -1
- package/dist/explore-adversarial.d.ts +11 -4
- package/dist/explore-adversarial.js +22 -13
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-cli.js +282 -31
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +17 -2
- package/dist/explore-coverage.js +20 -14
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +0 -2
- package/dist/explore-feature.js +7 -9
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +25 -7
- package/dist/explore-goal.js +62 -19
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-shared.d.ts +53 -3
- package/dist/explore-shared.js +48 -1
- package/dist/explore-shared.js.map +1 -1
- package/dist/fixture-auth.d.ts +13 -2
- package/dist/fixture-auth.js +19 -6
- package/dist/fixture-auth.js.map +1 -1
- package/dist/fixture-cli.d.ts +29 -0
- package/dist/fixture-cli.js +121 -7
- package/dist/fixture-cli.js.map +1 -1
- package/dist/github-issue-filer.js +2 -1
- package/dist/github-issue-filer.js.map +1 -1
- package/dist/host-health-run.d.ts +2 -1
- package/dist/host-health-run.js +8 -2
- package/dist/host-health-run.js.map +1 -1
- package/dist/init-cli.js +34 -5
- package/dist/init-cli.js.map +1 -1
- package/dist/init-keys.d.ts +11 -0
- package/dist/init-keys.js +5 -2
- package/dist/init-keys.js.map +1 -1
- package/dist/journey-annotate-api.js +17 -4
- package/dist/journey-annotate-api.js.map +1 -1
- package/dist/journey-annotate-cli.js +3 -1
- package/dist/journey-annotate-cli.js.map +1 -1
- package/dist/journey-api.d.ts +26 -1
- package/dist/journey-api.js +51 -25
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +44 -3
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +2 -0
- package/dist/journey-demo-api.js +23 -10
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-demo-cli.js +5 -2
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-prefix.d.ts +194 -0
- package/dist/journey-prefix.js +279 -0
- package/dist/journey-prefix.js.map +1 -0
- package/dist/key-report.d.ts +49 -0
- package/dist/key-report.js +101 -0
- package/dist/key-report.js.map +1 -0
- package/dist/kill-signal.js +0 -1
- package/dist/kill-signal.js.map +1 -1
- package/dist/ledger-api.js +3 -1
- package/dist/ledger-api.js.map +1 -1
- package/dist/log-correlation.d.ts +63 -1
- package/dist/log-correlation.js +125 -16
- package/dist/log-correlation.js.map +1 -1
- package/dist/log-sources.js +6 -5
- package/dist/log-sources.js.map +1 -1
- package/dist/log-trace.d.ts +80 -0
- package/dist/log-trace.js +210 -0
- package/dist/log-trace.js.map +1 -0
- package/dist/logs-cli.js +60 -1
- package/dist/logs-cli.js.map +1 -1
- package/dist/logs-retention.js +2 -1
- package/dist/logs-retention.js.map +1 -1
- package/dist/masked-input.d.ts +22 -0
- package/dist/masked-input.js +99 -0
- package/dist/masked-input.js.map +1 -0
- package/dist/mcp-api.d.ts +3 -1
- package/dist/mcp-api.js +49 -7
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +12 -0
- package/dist/mcp-args.js +33 -0
- package/dist/mcp-args.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +6 -1
- package/dist/mcp-cli-tools.js +103 -16
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mission-api.js +2 -1
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.js +3 -1
- package/dist/mission-cli.js.map +1 -1
- package/dist/mission-fixtures.d.ts +10 -1
- package/dist/mission-fixtures.js +49 -15
- package/dist/mission-fixtures.js.map +1 -1
- package/dist/mission-queue-runner.d.ts +2 -0
- package/dist/mission-queue-runner.js +18 -5
- package/dist/mission-queue-runner.js.map +1 -1
- package/dist/multi-run-cli.js +7 -1
- package/dist/multi-run-cli.js.map +1 -1
- package/dist/openrouter-call.js +3 -2
- package/dist/openrouter-call.js.map +1 -1
- package/dist/program.js +4 -0
- package/dist/program.js.map +1 -1
- package/dist/project-dir.js +3 -2
- package/dist/project-dir.js.map +1 -1
- package/dist/record-api.d.ts +3 -1
- package/dist/record-api.js +5 -2
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.js +14 -2
- package/dist/record-cli.js.map +1 -1
- package/dist/regression-api.d.ts +6 -0
- package/dist/regression-api.js +4 -2
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.js +56 -4
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.js +2 -1
- package/dist/report-api.js.map +1 -1
- package/dist/resource-preflight.d.ts +87 -0
- package/dist/resource-preflight.js +160 -0
- package/dist/resource-preflight.js.map +1 -0
- package/dist/result-schema.d.ts +1 -1
- package/dist/result-schema.js +1 -1
- package/dist/run-key-preflight.d.ts +42 -0
- package/dist/run-key-preflight.js +82 -0
- package/dist/run-key-preflight.js.map +1 -0
- package/dist/run-screenshots.js +11 -5
- package/dist/run-screenshots.js.map +1 -1
- package/dist/runtime-env.js +3 -2
- package/dist/runtime-env.js.map +1 -1
- package/dist/server-log-verify.d.ts +2 -0
- package/dist/server-log-verify.js +8 -3
- package/dist/server-log-verify.js.map +1 -1
- package/dist/signal-triage.d.ts +147 -0
- package/dist/signal-triage.js +281 -0
- package/dist/signal-triage.js.map +1 -0
- package/dist/site-gate-cli.js +2 -1
- package/dist/site-gate-cli.js.map +1 -1
- package/dist/source-api.js +2 -1
- package/dist/source-api.js.map +1 -1
- package/dist/suite-explore-options.d.ts +36 -0
- package/dist/suite-explore-options.js +23 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/target-config.d.ts +12 -0
- package/dist/target-config.js +15 -0
- package/dist/target-config.js.map +1 -1
- package/dist/type-fixture-file.d.ts +9 -0
- package/dist/type-fixture-file.js +48 -0
- package/dist/type-fixture-file.js.map +1 -0
- package/dist/ui-api.js +4 -3
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.js +4 -3
- package/dist/usability-capture.js.map +1 -1
- package/dist/usage-config.d.ts +1 -1
- package/dist/usage-config.js +1 -1
- package/dist/ux-claim-probe.d.ts +45 -0
- package/dist/ux-claim-probe.js +386 -0
- package/dist/ux-claim-probe.js.map +1 -0
- package/dist/ux-cli.js +8 -1
- package/dist/ux-cli.js.map +1 -1
- package/dist/ux-product.d.ts +14 -0
- package/dist/ux-product.js +39 -0
- package/dist/ux-product.js.map +1 -0
- package/dist/ux-review.d.ts +4 -0
- package/dist/ux-review.js +27 -7
- package/dist/ux-review.js.map +1 -1
- package/dist/ux-usability.d.ts +34 -9
- package/dist/ux-usability.js +102 -16
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-api.d.ts +21 -0
- package/dist/verify-fix-api.js +85 -33
- package/dist/verify-fix-api.js.map +1 -1
- package/dist/verify-fix-cli.js +7 -2
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +11 -11
- package/skills/jevitate-explore/SKILL.md +13 -0
- package/skills/jevitate-getting-started/SKILL.md +2 -1
- 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.
|