Skip to main content
Skip to Content

agent-qa.config.yaml sits at the root of your project. init writes a complete one, and everything below is relative to the folder it lives in.

Example

agent-qa.config.yaml
workspace:  testMatch: [tests/**/*.yaml]  suiteMatch: [suites/**/*.suite.yaml]  hooksFile: hooks.yaml  envFile: .env  secretsFile: .env.secrets.localservices:  dashboard:    port: 3470  cache:    dir: .agent-qa/cache  vision:    screenshotSize: 256k    effectiveResolution: 768  accessibility:    enabled: true    runAfter: test-endregistry:  llms:    - name: claude-code      provider: anthropic-subscription      model: claude-sonnet-5-5  targets:    komazon:      platform: web      url: https://playground.vostride.dev/shop/plugins:  - name: subscription    package: "@vostride/agent-qa-subscription-auth"use:  llm: claude-code  browser:    name: chromium    headless: true    viewport: { width: 1280, height: 720 }  timeout:    step: 20m    test: 90m    navigation: 2m  planner:    maxActions: 30    maxPlanningTurns: 30    previousStepCount: 5

workspaceWhere tests, suites, hooks, variables and secrets live. Required.

The smallest valid config is the workspace block. Running tests also needs a model entry and a target, and a native mobile app target needs use.mobile.appState.

Top level

KeyRequiredHolds
workspaceYesWhere project files live.
servicesNoLocal services and their settings.
knowledgeNoWhere memidex keeps its records.
registryNoModels, remotes, targets and devices.
useNoRun settings.
pluginsNoPlugin entries: browser and device services, and subscription sign-in.
analyticsNoUsage analytics and the dashboard's pass rate.

workspace

KeyTypeMeaning
testMatchlist of globs, requiredWhere test files are. init writes tests/**/*.yaml.
suiteMatchlist of globs, requiredWhere suite files are. init writes suites/**/*.suite.yaml.
testPathIgnorelist of globsFiles to leave out of discovery.
hooksFilepath, requiredThe hooks file. It must exist.
envFilepath, requiredVariables for tests. It must exist and may be empty.
secretsFilepath, requiredSecrets for tests, remotes and plugins, masked everywhere. It must exist and may be empty.

services

KeyTypeDefaultMeaning
dashboard.portnumber3470Dashboard port.
dashboard.dbPathpath.agent-qa/runs.dbThe run store.
dashboard.artifactsDirpath.agent-qa/artifactsRun artifacts.
dashboard.baseUrlURLnoneYour dashboard's address, used for links in MCP results.
dashboard.hosthost127.0.0.1Only loopback addresses are accepted.
mcp.enabledbooleantrue when the block existsDeclaring services.mcp makes the dashboard serve MCP too.
mcp.portnumber3471Port for the dashboard's MCP endpoint.
cache.dirpath.agent-qa/cacheWhere the action cache lives. Required in the block.
authState.dirpath.agent-qa/auth-statesWhere saved logins live.
logging.levelsilent, error, warn, info, debugwarn from initLog level. --log-level overrides it.
recording.enabledbooleantrueRecord a video of each session.
recording.keepFailuresOnlybooleanfalseKeep videos of failed tests only.
vision.screenshotSizesizenoneLargest screenshot sent to the model. init writes 256k. Needs effectiveResolution.
vision.effectiveResolutionnumbernoneLongest edge, in pixels, of screenshots sent to the model. init writes 768.
accessibility.enabledbooleannoneRun accessibility checks on web. Required in the block.
accessibility.standardwcag2a, wcag2aa, wcag2aaaAA rulesWhich rules to check.
accessibility.runAftertest-end, every-stepnoneWhen to check.
accessibility.failOnViolationbooleanfalseFail the step on critical or serious violations.
accessibility.disableRuleslistnoneaxe rule IDs to skip.
accessibility.excludelistnoneCSS selectors to leave out.

Without services.vision, screenshots are sent to the model at full size.

knowledge

KeyTypeDefaultMeaning
dirpath inside the projectagent-qa-knowledgeWhere memidex keeps records and policies.

registry

llms

A list of named model entries. Tests use the one use.llm names. Each entry has name, provider, model, and for some providers baseURL. See Models and credentials.

remotes

A list of places tests run other than this machine: a Playwright server, a CDP endpoint, an Appium server, or a service a plugin serves. Each entry has a protocol and url, or a plugin, never both.

registry:
  remotes:
    - name: grid
      protocol: playwright
      url: wss://grid.example.com/playwright
      query:
        token: "{{secret:GRID_TOKEN}}"
    - name: kernel
      plugin: kernel
      settings:
        headless: true
KeyTypeMeaning
namelowercase slug, requiredThe remote's name, used by use.browser.remote and a device's remote. local is reserved for this machine.
protocolplaywright, cdp, appiumWhat the URL speaks. URL remotes only.
urlURLThe endpoint. URL remotes only.
querymapParameters added to the URL. playwright and cdp only.
headersmapHeaders sent when agent-qa connects. URL remotes only.
basicAuthuser, passwordBasic authentication. URL remotes only.
pluginplugins entry nameThe entry that serves it. Plugin remotes only.
settingsmapThe plugin's settings for this place. Plugin remotes only.
connectTimeoutduration, default 5mHow long the connection may take.
uploadTimeoutduration, default 10mHow long a plugin's app upload may take. Plugin remotes only.
contextnew, reuseWhether a web test opens its own browser context or uses the browser's first one. cdp and plugin remotes.
capabilitiesmapAppium capabilities for every device on the remote. appium and plugin remotes.

Every credential is a quoted {{secret:NAME}} reference to a name in workspace.secretsFile. See Remote browsers and devices and Plugins.

targets

KeyTypeMeaning
<name>lowercase letters, digits, hyphensThe target's name, used by tests and suites.
platformweb, android, ios, requiredWhat the target is.
urlURLWhere web tests start. Required for web.
producttextThe product the target belongs to. It partitions knowledge and policies. Defaults to the target's name.
environmentlocal, shared, productionA label for the target's environment. agent-qa runs every target the same way.
appPackage, appActivitytextThe Android app.
bundleIdtextThe iOS app.
devicedevice nameThe device this mobile target's tests run on, unless a suite or test picks another.
app.pathrelative pathA build installed on a device on this machine before a mobile test.
app.reftextWhat a remote server installs: an https URL or the server's own reference.

devices

A map of named devices for mobile tests. See Mobile testing.

KeyTypeMeaning
<name>textThe device's name, used by a target's device, use.device in a suite or test, and --device.
platformandroid, ios, requiredThe device's platform.
modeltextWhat the device is called, such as Pixel 8 or iPhone 16.
osquoted textThe Android or iOS version, such as "18.4". A number is refused.
idtextAn Android serial or a simulator UDID, to pick one of two identical devices.
remoteremote nameAn appium or plugin remote the device runs on. Without it, the device is on this machine.
capabilitiesmapAppium capabilities, merged after agent-qa's own and the remote's.

use

These are project-wide run settings. Suites and tests can override each one in their own use.

KeyTypeDefaultMeaning
llmmodel entry namenoneThe model that runs tests and learns from them.
browser.namechromium, firefox, webkitnoneBrowser for web tests. name and headless are both required when browser is set.
browser.headlessbooleantrueHide the browser window.
browser.viewportwidth and heightnoneWindow size.
browser.remoteremote name, or locallocalWhere web tests run. See Remote browsers and devices.
mobile.appStatepreserve, resetnoneKeep or clear app data between mobile sessions. Required to run a native mobile app; init writes preserve for Android and iOS projects.
timeout.step, timeout.test, timeout.navigationdurationsnoneAll three are required when timeout is set. init writes 20m, 90m and 2m.
planner.maxActionsnumber30Most actions in one step.
planner.maxPlanningTurnsnumber30Most model calls in one step.
planner.previousStepCountnumber5How many earlier steps the model sees. Required when planner is set.
logCapture.console, logCapture.networkbooleansnoneRecord console and network logs. Both are required when logCapture is set.
cachebooleantruefalse turns off the action cache.
parallelbooleanfalseRun tests at the same time.
workersnumber3How many tests run at once when parallel.
buildTagtextnoneNames the app build under test. --build-tag and AGENT_QA_BUILD_TAG override it.

device and authState belong in a suite or test, not here.

plugins

A list of plugin entries. Each one names a plugin package and holds its account's options, and remotes name the entry.

plugins:
  - name: subscription
    package: "@vostride/agent-qa-subscription-auth"
  - name: kernel
    package: "@vostride/agent-qa-plugin-kernel"
    options:
      apiKey: "{{secret:KERNEL_API_KEY}}"
KeyTypeMeaning
namelowercase slug, requiredThe entry's name, unique in the list. Remotes name it with plugin.
packagenpm package nameThe plugin's package, exactly as installed.
pathfolder inside the projectA plugin folder, instead of package, while you develop one.
optionsmapThe account's values, checked against the plugin's own schema. Credentials are {{secret:NAME}} references.

See Plugins.

analytics

KeyMeaning
privacy: trueTurns off usage analytics and error reporting. See Safety and privacy.
passRateScope.attributesCounts only runs with these run attributes in the dashboard's pass rate. Each value is exact text or { regex: "<pattern>" }.

Removed keys

These keys are gone. validate and every command that loads the config refuse each one with a message that says what to do.

KeyInstead
allowProductionDelete it. Production targets run like any other target, and environment is a label.
evalDelete it. agent-qa eval replay takes its settings as flags.
services.cache.ttlDelete it. Cached plans do not expire by age.
services.mcp.host, path, transportDelete them. agent-qa mcp listens on 127.0.0.1, answers on any path, and uses stdio or --http.
services.accessibility.runAfter: navigationUse test-end or every-step.
knowledge.contextBudgetTokens, knowledge.commitArtifactsDelete them. agent-qa sizes each run's knowledge itself, and knowledge bundles never commit images.
registry.providersList remote browsers and Appium servers under registry.remotes, with credentials in the secrets file.
registry.devices.<name>.matchDescribe the device with model and os, and id for one unit. Move app IDs to the target and other Appium settings to capabilities.
registry.devices.<name>.transportList the Appium server under registry.remotes and set the device's remote.
registry.targets.<name>.app.browserstackSet app.ref.
plugins.auth, plugins.providersMake plugins a list of named entries.

agent-qa.local.yaml is no longer read either. See v0.2.x to v0.3.x.