Environments
Group Personas and share variables across tests in an Environment.
An Environment is a named group of project Personas. A Persona may belong to multiple Environments in the same project. Boards select one optional Environment. Starting URLs and execution settings stay on boards and Tests.
Endpoints
| Method | Path | Scope |
|---|---|---|
| GET | /v1/projects/:projectId/environments | read |
| POST | /v1/projects/:projectId/environments | write |
| GET | /v1/environments/:id | read |
| PATCH | /v1/environments/:id | write |
| DELETE | /v1/environments/:id | write |
Create with { "name": "Staging", "personaIds": ["<persona-id>"] }. Patch any field; personaIds replaces the full membership list, and [] disconnects all members. Names are unique per project, up to 80 characters. Membership IDs must be unique and belong to this project and workspace. Responses include id, name, personaIds, candidate personas with names/descriptions, project/workspace IDs and timestamps.
A referenced Environment cannot be deleted. A Persona used by a reusable Test cannot be disconnected until that Test is reassigned.
Shared variables
Create or patch variables alongside name and personaIds:
{
"variables": [
{ "key": "BASE_URL", "value": "https://staging.example.com", "isSensitive": false },
{ "key": "SHARED_TOKEN", "value": "<secret>", "isSensitive": true }
]
}The array replaces the Environment's variable set; [] removes them all, and omitting variables preserves them. Keys match [A-Z][A-Z0-9_]{0,63}, with at most 100 variables and 10,000 characters per value. Keys must be unique. New keys require a value (which may be an empty string).
Responses include variables with id, key, isSensitive, and hasValue; only non-sensitive values are returned. On update, omit value to keep a stored value, matching by ID or key. Changing a stored sensitive value to non-sensitive requires an explicit replacement value. IDs must belong to this Environment.
Every Run uses its selected Environment's variables plus its selected Persona's variables. Persona values override matching keys. A Persona shared across Environments inherits only from the Environment selected for that Run; other Personas' values are never included. Runs without a Persona still receive their Environment variables. Sensitive values stay encrypted at rest and use %KEY% placeholders in browser actions. Neither variable values nor secrets are sent to Jev.
Ticket selection
Each Attempt freezes the Environment and available Persona metadata. After ticket enrichment and testability assessment, Jev through Vercel AI Gateway estimates match probabilities. Smoketest selects the highest probability, even when every match is weak. Exact ties use ascending Persona ID. There is no confidence threshold or no-match outcome.
No Environment or no Personas runs without a Persona. One Persona is selected automatically. Gateway failures or invalid probabilities retry, then end in preparation No Result. Login repair preserves the selected Persona. Choose Persona in the Attempt flow shows the Environment, selection, description and all estimated probabilities.
Reusable Tests and migration
Reusable Tests explicitly set environmentId and personaId; use personaId: null for no Persona. When supplying or changing environmentId, personaId must also be supplied. Membership is validated. Scheduled and manual Runs use that explicit choice.
The old account-specific Environment concept is now Persona. Existing variables remain on migrated Personas, preserving account selection. New shared variables can be managed on Environment endpoints; /personas manages Persona-specific overrides.