Design and execute
Build spreadsheet-driven single-turn, multi-turn, tool-routing, semantic, and stress tests with explicit expected-response contracts.
Download the watsonx Orchestrate Test Suite for designing, running, diagnosing, recording, and comparing agent tests.
Move from a single probe to a complete regression campaign without losing the response, evaluator, trace, timing, or recording evidence behind each result.
Build spreadsheet-driven single-turn, multi-turn, tool-routing, semantic, and stress tests with explicit expected-response contracts.
Review final responses, constituent requests, evaluator verdicts, execution paths, timing, warnings, and available trace evidence in one debugger.
Record immutable runs, replay outcomes, compare baselines, export reports, and preserve complete worksheet workspaces for repeatable review.
Once the Test Suite is running, it automatically checks for a newer published version. A packaged standalone BUILD can install it transactionally; Git/source workspaces are protected and offer a manual download instead.
The running Test Suite compares its suite and build versions with this trusted release catalog.
A new-version notice explains what is available and lets the user update now or download manually.
The active worksheet workspace is saved before updated files are installed into the current folder.
A supervisor starts the updated backend as a fresh process, the browser reloads cleanly, and the saved workspace is restored.
The Test Suite serves its own browser interface. There is no separate front-end build or hosted login layer for local use.
Use the primary download button above unless you intentionally need a retained previous release.
Keep the complete package together so automatic updates can safely replace application files in place.
Open a terminal in the unzipped folder and run npm start.
Use the exact loopback URL shown in the terminal, create a profile, and begin with a 1 × 1 probe.
Retained releases support controlled rollback, comparison, and reproducibility. New installations should normally use the latest release.
The full workspace tutorial is rendered here as accessible HTML. Use the section navigator to move directly to installation, test design, evaluation, reporting, recording, collaboration, or troubleshooting.
This tutorial explains how to use the watsonx Orchestrate Test Suite in this workspace. It covers the browser application used to design, run, diagnose, record, and compare agent tests, and it also covers the repository's automated developer checks.
The instructions were verified against the workspace on August 19, 2026. At that time the root package was wxots-standalone 469.0.0, the UI identified itself as Suite Version 0.7 / Build 24, and the workspace required Node.js 22.20 or newer.
The repository has two meanings of “test suite”:
npm run check.The important directories are:
| Path | Purpose |
|---|---|
app/ | Local Express runtime, REST routes, evaluators, recording codec, and AgentOps support |
ui/ | Browser UI, spreadsheet, runtimes, evaluator configuration, reports, and debugger |
ui/intents/ | Sample and working CSV test datasets plus intents.txt |
scripts/ | Build scripts and automated regression checks |
wxots-db/ | Optional filesystem-backed collaboration and artifact-sharing service |
wxots-version/ | Download/version catalog service and its checks |
app/docs/ | REST, recording-format, traffic-safety, and performance references |
wxots-standalone is still the live package name, server identity, launcher/build identity, and published artifact prefix. Do not remove those references. What the current suite does not use are extracted historical source copies such as wxots-standalone-v*/ or BUILD-OLDER/; the application, developer checks, and release scripts all use the root source tree. BUILD/ is ignored, reproducible output from the current build script, not a second source tree.
The earlier independent wxots-landingpage/ application is also no longer part of this workspace. Current update metadata, release history, and downloadable standalone ZIPs are owned by wxots-version/. Those published ZIPs are live version-catalog data and must not be confused with the removed extracted source copies.
The typical execution flow is:
Profile + runtime
↓
Spreadsheet row + expected-response contract
↓
Agent invocation or captured-response evaluation
↓
Response evaluator + optional tool/trace checks
↓
Status, score, timing, debugger evidence, report, recording, exportsUse this short path the first time. The rest of the tutorial explains every step in depth.
npm install.npm start.http://127.0.0.1:3038.ui/intents/sample_multiturn_clarification_tests.csv, or create one row manually.1 while learning..wxotsw workspace before making major changes.You need:
Check the tools:
node --version
npm --versionFrom the repository root:
npm installThe application has no browser build step for ordinary development. The files in ui/ are served directly.
npm startThe terminal prints the actual address, local state directory, optional wxots-db connection, and a machine-readable WXOTS_BOUND_PORT line. The preferred port is 3038; if it is busy, the application searches later ports within its configured range.
Open the exact URL printed by the process. Do not assume 3038 if the server reports a different port.
WXOTS_PORT=3040 npm startTo bind to another interface, set WXOTS_HOST. Keep the default 127.0.0.1 unless remote access is deliberately required.
On macOS, Launch wxots.command starts the local harness, opens a browser, and leaves the server log in a Terminal window.
With the default port:
curl -fsS http://127.0.0.1:3038/api/healthFor a compact view when jq is installed:
curl -fsS http://127.0.0.1:3038/api/health \
| jq '{status, service, version, transport, trafficGovernor}'The response should report status: "ok". It also exposes the active outbound traffic-governor limits.
Press Ctrl-C in the terminal that is running npm start. A normal stop preserves the disk-backed workspace state.
When the configured version service reports a newer release, the Test Suite displays an update prompt. Stop any active run and choose Update now.
Automatic replacement is available only from a packaged standalone BUILD started with its launcher or npm start. A Git/source checkout is protected: it may report that a newer version exists, but it offers manual download instead of overwriting tracked source files.
The standalone updater:
.env, and local GGUF model directory, rolling back the old application if replacement fails;The default .wxots-harness-state/ directory is beside the installed BUILD/, so it is outside the application files being replaced. A custom WXO_STATE_DIR or WXOTS_NATIVE_MODEL_DIR is also left untouched when it is outside the installation and is explicitly preserved when it is located inside the installation tree. Downloaded releases do not contain another user's state or models and therefore cannot replace the state already on the local machine.
The main screen is a workbook-style test environment.
The left panel holds saved service-instance and agent bindings. Its actions are:
Exported API keys are encrypted for re-import by the suite, but profile exports should still be handled as sensitive artifacts.
The upper ribbon contains these major groups:
| Group | Main jobs |
|---|---|
| Test Data | Import/map CSV, generate rows, insert/delete rows, undo/redo, clean data, save/open/share test cases |
| Workspace | Save/open/share a rich worksheet workspace, manage columns and appearance |
| Run | Select run mode, probe, throttle, run, pause, stop, report, export, record, playback, and compare |
| Apps | AgentOps, Test Plan, Inspector, and REST API workspaces |
| Cell Editor | View or edit the complete value of the selected cell and copy captured responses |
| Configuration | Choose the runtime engine and model |
The ribbon groups are draggable and resizable. The entire ribbon area and its icon height are also resizable.
The center grid is the executable test-case sheet. Workbook tabs appear below it. You can open several CSVs as separate tabs, reorder tabs, close tabs, and merge tabs into a new sheet.
The bottom bar provides:
The search field accepts either case-insensitive text or a JavaScript-style regular expression such as /^claim-\d+$/i. The adjacent replacement field applies changes to editable fields in matching rows.
The status filter can show all rows or only Pending, Running, Captured, Passed, Failed, Error, Stopped, or Skipped rows. Snapshot exports honor the current filters.
The right panel has three primary tabs:
The debugger can be docked on the right or along the bottom and resized.
When wxots-db is configured and reachable, the people icon opens:
The test suite still works locally when wxots-db is absent.
| Shortcut | Action |
|---|---|
| Arrow keys | Move one cell |
| Enter | Edit/save and move down |
| Escape | Cancel editing |
| Tab / Shift+Tab | Move horizontally |
? | Open shortcut help |
| Ctrl/Cmd+Z | Undo |
| Ctrl/Cmd+Shift+Z | Redo |
Use a profile when running the production watsonx Orchestrate agent or when an auxiliary workflow needs that instance's model or metadata.
``text https://api.us-south.watson-orchestrate.cloud.ibm.com/instances/<instance-id> ``
The badge above the sheet should show both the service instance and selected agent. If you switch agents after running tests, the suite preserves result contexts per profile/agent instead of mixing results.
Reopen the profile if:
Discovery uses the direct REST API. Closing the profile dialog cancels an in-progress refresh, and starting a new refresh supersedes the previous one.
Use Save As to export profiles. The suite removes plaintext apiKey values and stores encrypted equivalents in the JSON payload. Use Open to restore them. Do not hand-edit the encrypted fields.
Cloud/shared workspaces deliberately omit reusable API keys. Each recipient must enter their own credentials before executing tests.
Configuration → Runtime -- Unavailable --
Runtime switching is currently unavailable. The suite always uses watsonx Orchestrate through the active profile and selected hosted agent. Standard builds do not download or package llama.cpp.
This is the default and the correct choice for production certification.
It uses:
Developers can explicitly package the dormant native engine for future-feature work with WXOTS_BUNDLE_NATIVE_RUNTIME=true npm run build. This opt-in is not required or used by the currently available product workflow.
A row is a stress workload when threadCount > 1, requestsPerThread > 1, or testType is performance_scalability. Stress workloads bypass Tool Sandbox and use the production agent Direct API so latency, throughput, tool execution, and service limits are real. Confirm the active profile and traffic estimate before continuing.
There are four main ways to build a sheet.
The default seed row is enabled and contains hello. Replace it with a meaningful request, then configure its expected result.
For a minimal functional row, fill:
1;1;1 for single-turn tests..csv file.Recognized aliases include utterance, question, and userUtterance for input; expectedResponses, expectedChoices, and allowedIntents for expected results; and evaluationMode or evaluator for the evaluator.
Unmapped source columns are hidden rather than destroyed. The suite can preserve supplemental CSV fields for round-tripping.
Useful samples:
ui/intents/sample_multiturn_clarification_tests.csvui/intents/IntentAgent_InputTestData.csvui/intents/IA_MasterRegressionSuite.csv1 unless load is intentional.Generated data is a deterministic local scaffold. Review and correct the utterances, expected contracts, and metadata before treating it as ground truth.
Choose the + beside the workbook tabs to open another CSV as a new sheet. Tabs can be dragged into a different order.
To merge sheets:
Choose Test Data → Clean to review unreadable symbols or invalid text markers. The suite presents proposed fixes and applies only those you select.
| Column | Meaning |
|---|---|
| Execute? | Includes the row in All/From Current runs |
| Thread Count | Requested virtual workers; maximum 50 |
| Requests Per Thread | Sequential requests per worker; maximum 1000 |
| User Utterance | Required request sent to the agent |
| Subsegment | Optional structured context such as group or individual |
| Channel | Optional context such as chat or voice |
| Watson Intent | Intent metadata or reference label |
| Expected Results | The expected-response contract |
| Max Turns | Maximum multi-turn conversation length |
Supplemental fields include testType, riskLevel, testObjective, expected tool sequences, trace assertions, RAG/transaction assertions, resilience/fault settings, safety settings, and regression triggers. Use Workspace → Show Columns to reveal or hide them.
The suite fills:
Double-click an Expected Results cell to open the three-panel editor.
intents.txt, search, and select acceptable intents.expectedResponsesConfig CSV preview.The serialized configuration is exported as one CSV field and restored on import. Use the dialog rather than hand-editing that JSON whenever possible.
The expected-response dialog exposes six principal contract types. The lower-level evaluation modes also include contains and informational for imported or wizard-created rows.
| Contract/mode | Pass condition | Best use |
|---|---|---|
| Exact Matches / strict | Output equals one configured value | Stable machine-readable responses |
| Intents / intent | Case-insensitive exact match to one ` | |
| contains | Output contains any configured expected phrase | Flexible text with mandatory concepts |
| regex | Output satisfies a JavaScript regular expression | Structured patterns and controlled formats |
| Semantic Response | Selected model judges enabled behavioral requirements | Generative answers with variable wording |
| Disambiguation Options | Agent asks a related clarification with enough allowed choices | Ambiguous utterances |
| Multi-turn Dialog | Agent reaches an allowed final intent within maxTurns | Clarification and slot-filling flows |
| Verify Tool Calls Only | Required tools are captured in order; response text is ignored | Tool-routing contracts |
| informational | Any nonempty response passes | Smoke tests requiring later human review |
Separate acceptable alternatives with || in CSV data:
claims_request_claim_status||claims_request_claim_detailsUse short, meaningful concepts rather than full prose:
claim||under review||next stepThe row passes if the output contains an alternative. Do not use common words that could cause accidental passes.
Use regex for controlled structures, for example:
/^CLAIM-\d{6}$/iTest the expression independently. Invalid regex is reported instead of silently treated as a match.
Select at least one requirement:
Reference answers are optional and can be separated by a line containing ---. Temperature 0 is recommended for repeatable pass/fail decisions.
Knowledge requirements are evidence-based: a claim in the final answer is not enough. The suite looks for captured retrieval, citation, or tool evidence, optionally for a named tool.
Semantic evaluation needs a directly callable evaluator model. Production-agent fallback for auxiliary evaluation is disabled by default for safety.
Select the allowed intent family and the minimum number of related choices. Chat allows up to five choices. Voice-friendly mode limits the clarification to at most three concise choices and can impose a word cap.
Select one or more tools in the required order. All required tools must appear in order; unrelated calls may occur between them. Arguments, results, and response text do not affect this specific check.
For stricter end-to-end validation, reveal and populate the supplemental tool assertion columns and enable strict validation in Test Plan.
What is the status of my claim?.1 and Max Turns to 1.claims_request_claim_status.There are two supported styles.
Dialog contract through the UI:
Scripted CSV/row turns: place a JSON array in the turns field:
[
{
"user": "I need help with a bill",
"expected": "claims_charge_details_inquiry"
},
{
"user": "It is for June 15",
"expected": "claims_charge_details_inquiry",
"humanDelayMs": 12000
}
]Human delay is recorded separately and excluded from agent response timing. If the agent asks for information and no scripted reply exists, model-generated user simulation requires a directly callable model; unsafe production-agent fallback is off by default.
Use this when production tools must not execute.
1 × 1 and run or chat.Example stub:
[
{
"name": "lookup_claim",
"parameters": {
"type": "object",
"properties": {
"claimId": { "type": "string" }
}
},
"cases": [
{
"when": { "claimId": "C-100" },
"output": { "status": "pending" }
},
{
"when": { "claimId": "/^ERR-/" },
"error": "Claim service unavailable"
}
]
}
]The sandbox uses the real selected model and visible instructions but bypasses the production agent endpoint, production tools, native memory, collaborators, and hidden orchestration.
Before increasing counts, compute:
iterations per row = threadCount × requestsPerThread
base suite iterations = sum(iterations for every enabled row)This is not necessarily the total outbound-call count. Multi-turn conversations, semantic evaluation, model-generated user replies, endpoint-shape fallback, and the agent's own tool fan-out can add calls.
Start with a small canary:
threadCount=1 and requestsPerThread=1.The default process-wide governor allows at most 4 concurrent outbound requests and queues at most 250. It is process-local; multiple suite processes multiply aggregate traffic.
Open Apps → Test Plan.
The plan contains:
For each applicable discipline:
The plan includes:
Readiness findings are advisory and do not themselves block execution. Strict tool and trace switches can convert those specific validation failures into row failures.
Choose Generate Test Matrix. The suite creates or updates one draft row for each applicable discipline.
Generated rows:
testType;testObjective, not Expected Results;source=test_plan;Complete and review every draft before enabling it.
Choose a representative active row, then choose Generate Resilience Suite. The suite creates disabled drafts for ambiguity, conflicting requests, mid-turn correction, non-cooperation, prompt injection, unauthorized tool use, timeouts, errors, empty/malformed/partial tool results, and recovery behavior.
Fault profiles activate only in Tool Sandbox. Review the inherited expected contract before enabling any generated row.
Use Import JSON and Export JSON in the Test Plan workspace to share planning metadata separately from executable sheets.
Open Run → Run Mode.
| Mode | Behavior |
|---|---|
| Run and evaluate immediately | Invokes the agent and evaluates each response now |
| Capture responses only | Invokes and saves responses without testing the expected contract |
| Test Captured Responses | Re-evaluates existing captures using the current expected settings; rows without captures are skipped |
Capture-first is useful when evaluator criteria are still being tuned or when you want to compare several contracts against the same model output without paying for another production invocation.
Choose All. Only checked Execute rows run.
Select a row and choose Rows N–end. Enabled rows before the selection are excluded from the scope and may show Skipped when they had no prior result.
Choose Throttle and enter a delay in milliseconds. The pause occurs between test-case rows and is excluded from agent elapsed time. Valid values are 0 through 600,000.
Throttle is useful for demonstrations, conservative production traffic, or downstream systems with rate limits. It does not replace the server's global concurrency governor.
| Status | Meaning |
|---|---|
| Pending | Not yet executed/evaluated |
| Running | Active row or request group |
| Captured | Response saved without an immediate verdict |
| Passed | Response contract and strict checks passed |
| Failed | Evaluator failed, or a strict tool/trace check failed |
| Error | Invocation, evaluator, configuration, or transport error |
| Needs Clarification | Conversation requires another turn under the active contract |
| Stopped | User cancellation interrupted the row/run |
| Skipped | Outside scope, disabled, or missing captured evidence in captured-test mode |
For stress rows, one failed constituent request fails the aggregate row. The grid can show a compact final value while reports retain individual request results.
Review:
Double-click Final Response(s) to open Captured Output. It lists individual thread/request responses, timings, status, evaluator explanations, and copy actions.
The Evaluation tab can report on:
Choose Load trace when a trace ID exists. Export the report as JSON for tooling or Markdown for human review.
The debugger's REST API tab shows local health, transport, the active profile, known endpoints, and the latest request/response for manual diagnostics. Credentials are redacted from diagnostics and recordings.
The timing contract is important:
agentResponseMs = Direct API HTTP round-trip minus governor queue time
harnessOverheadMs = client/server/evaluation/persistence work outside agent latencyAverage Request Latency averages independent thread/request executions. Maximum Request Latency is the slowest one. Human delay in multi-turn scripts is excluded from agent timing.
After a run, choose Report. The report includes outcome counts, pass rate, latency/performance summaries, readiness dimensions, and run metadata. Choose Export PDF from the report dialog for a portable review artifact.
Exports:
.xlsx with filters;Uses the same visible/filter-aware view as Excel Snapshot but writes CSV.
These tuning-oriented exports create one output row per captured thread/request response. Fields include prompt, actual response, status, thread, request, expected result, evaluator mode/reason, score, latency, agent, and timestamp.
Use a Response export for model tuning or error analysis. Use a Snapshot export to reproduce what an analyst currently sees in the sheet.
Test Data → Save/Save As writes the complete round-trip schema, including hidden configuration, results, execution context, and packed per-agent result context. It is the best format for continued spreadsheet editing, but not as easy to read as the filtered snapshots.
.wxorec file.The recording includes rows, results, request/response diagnostics, evaluation evidence, traces, reasoning metadata, runtime events, benchmarks, and telemetry when available. Credential-shaped fields are redacted.
The dialog also offers Summary, Pattern Insights, Inspector, refresh, and sharing for local recordings.
Comparisons are most useful when the input sheet is held constant across agents, model versions, instruction changes, or environments.
New .wxorec files are lossless binary containers with:
WXOREC2\n;Legacy JSON recordings remain readable.
Convert or inspect from the repository root:
node app/scripts/wxorec-convert.js inspect path/to/run.wxorec
node app/scripts/wxorec-convert.js to-json path/to/run.wxorec /tmp/run.json
node app/scripts/wxorec-convert.js to-binary path/to/legacy.json /tmp/run.binary.wxorecThe utility refuses to overwrite an existing output file. The older documentation mentions an npm recordings:convert script, but the current root package.json does not define it; use the direct Node commands above.
Open Apps → AgentOps to set:
Choose Export IBM EVAL Dataset to create a draft ground-truth scaffold from enabled rows. Enrich trajectories, dependency graphs, and reviewed ground truth before using it as a certification dataset.
Enter the host, public key, and secret key, then optionally enable trace sending. You can also export Langfuse JSONL without live publication. Credentials are stored locally; protect the machine and workspace accordingly.
Open Apps → Inspector to analyze the selected agent using:
Recommended workflow:
The clone workflow creates a draft clone and does not modify or deploy the original agent. It uses governed management calls and requires confirmation.
| Artifact | Contains | Best use |
|---|---|---|
| Test-case CSV | Rows, contracts, results, supplemental/config fields, result contexts | Spreadsheet round-trip and interchange |
.wxotsw workspace | Current active worksheet, settings, profiles without shared credentials, results, report/history, debugger, evaluation settings, test plan | Full working-session backup/transfer |
| Profile JSON | Profile metadata and encrypted API keys | Moving profile definitions between trusted local copies |
.wxorec | Immutable run evidence and diagnostics | Replay, comparison, audit, analysis |
Snapshot .xlsx/.csv | Filtered visible view | Review and reporting |
Response .xlsx/.csv | One row per response | Tuning and response-level analysis |
Choose Workspace → Save As. In browsers with File System Access support, later Save updates the same file. Otherwise, each save downloads a new .wxotsw bundle.
A workspace captures the current active sheet, not every open workbook tab. When opened, it replaces the current active worksheet; other tabs remain available.
.wxotsw or compatible JSON.By default, profiles, rows, workspaces, preferences, reports, and recordings use .wxots-harness-state/ or the configured state directory. Large state is compacted and stored through local server endpoints so browser quota is not the primary limit.
Do not delete the state directory when you intend to preserve local work. The build process keeps it outside BUILD/ so rebuilding does not remove it.
wxots-db sharingTo run the collaboration service locally, use two terminals.
Terminal 1:
npm run start:dbTerminal 2:
WXOTS_DB_URL=http://127.0.0.1:3041 npm startThen use Share or Cloud Open in the Test Data/Workspace groups. Recordings can be shared from Playback or Compare. wxots-db stores presence, chat, and JSON artifacts; it is optional, not the primary test execution engine.
Shared profile data excludes reusable API keys. That is a permission boundary, not an inconvenience to bypass.
Open Apps → REST API for endpoint discovery, generated examples, and exposure configuration.
Important routes include:
GET /api/health
GET /api/harness/capabilities
GET /api/wxo/debug-endpoints
POST /api/wxo/agents
POST /api/wxo/invoke
POST /api/wxo/semantic-evaluate
POST /api/wxo/conversation-reply
POST /api/wxo/tool-sandbox-invoke
GET /api/recordings
POST /api/recordings
GET /api/runtime/status
POST /api/runtime/models
POST /api/runtime/invokeInspect the live capability catalog:
curl -fsS http://127.0.0.1:3038/api/harness/capabilities | jqThe core request shape is:
{
"profile": {
"baseUrl": "https://api.us-south.watson-orchestrate.cloud.ibm.com/instances/<id>",
"apiKey": "<credential>",
"selectedAgentId": "<agent-id>"
},
"input": "What is the status of my claim?",
"timeoutMs": 90000
}Send POST requests with Content-Type: application/json. Avoid placing credentials in shell history; use a protected request file, a secret manager, or an approved encrypted client workflow.
/api/public/* endpoints are deny-by-default. The REST API workspace can map approved capabilities to public paths and mark only deliberate operations as exposed. An unexposed path returns 404 with “This suite API is not exposed.”
Treat clone, delete, live invocation, telemetry, and alert routes as privileged operations. Do not expose them merely to simplify a script.
The current capability manifest lists full “run test suite,” upload, and report automation as future public APIs. Today, the UI is the primary batch-run orchestrator; the REST endpoints expose lower-level invocation, evaluation, recordings, diagnostics, and AgentOps building blocks.
The root package does not define npm test. Use npm run check.
npm run checkThis performs JavaScript syntax checks and runs the root regression scripts in sequence. It also runs npm --prefix wxots-version run check.
The suite is self-contained: runtime/network behavior is exercised through local fixture servers and temporary directories, not production watsonx Orchestrate traffic.
Expected successful output ends with messages such as:
Native runtime release selection, bundle layout, and private runner resolution checks passed.
Ollama and native runtime model discovery, agent loops, evaluation, and conversation checks passed.
Large-state persistence check passed: ...
Final response formatting, copy, and flat-export checks passed.
...
Version catalog ordering check passed.The command exits 0 on success and stops at the first failure because the package script uses &&.
| Script | Main coverage |
|---|---|
test-native-runtime-bundle.js | Platform target selection, stable-release coverage, credential scoping, private runner resolution, and model-directory precedence |
test-built-in-runtime.js | Ollama/native model discovery, local tool loop, semantic evaluation, simulated conversation, Runtime UI contracts |
test-state-persistence.js | Large report/workbook compaction, bounded diagnostics, context recovery, nonmutation |
test-update-state-preservation.js | In-place update preservation for default, custom, internal, and external state/model directories |
test-response-format.js | Final response extraction, evaluator evidence, copy formats, response-level export, dialog/layout contracts |
test-column-view.js | Pinned Execute column, ordering/hiding, visible snapshot semantics, CSV compatibility |
test-xlsx-export.js | Valid XLSX ZIP structure, worksheet values, and Excel autofilter |
test-search-filter.js | Literal/regex search, replacement, escaped delimiters, invalid-regex handling |
test-instruction-text.js | Markdown/newline preservation and Inspector/profile layout contracts |
test-i18n.js | Portuguese catalog and dynamic-pattern completeness plus loading/busy-state UI |
test-build-version-reset.js | Build increment/reset and explicit override rules |
test-timing-reporting.js | Agent-response timing excludes queue time and clamps invalid values |
test-thread-debug-reporting.js | Thread/request failure context, debugger compatibility, line-number rendering |
test-db-performance.js | Coalesced DB writes, artifact metadata cache, deletion, presence boundary |
test-presence-expiration.js | Team Activity event streams, reconnects, heartbeat reconciliation, expiration |
wxots-version/scripts/test-version-ordering.js | Suite-version-first then build-number catalog ordering |
Before functional scripts run, npm run check also runs node --check against the server, browser modules, native bundler, database service, and version service.
Use direct Node execution:
node scripts/test-search-filter.js
node scripts/test-xlsx-export.js
node scripts/test-built-in-runtime.js
node scripts/test-presence-expiration.jsThis is useful during development, but always run the aggregate command before handing off a change.
npm --prefix wxots-version run checkOn August 19, 2026, npm run check passed completely with the historical standalone copies and retired landing-page package absent.
The check includes the current wxots-version ordering test. There is no separate wxots-landingpage command in the current workspace. In a restricted sandbox, the root check can fail with listen EPERM because two tests bind ephemeral loopback servers; run it in a normal terminal or an environment that permits 127.0.0.1 binding.
The checks use Node's built-in assert; there is no Jest/Mocha runner. Most scripts are ordinary CommonJS programs that exit nonzero on a thrown assertion or rejected promise.
scripts/test-<feature>.js.'use strict';.assert and the smallest testable module.os.tmpdir() for filesystem cases.127.0.0.1 on port 0 so the OS chooses a free port.try/finally to close servers and remove temporary directories.node scripts/test-<feature>.js to the root check script in the right dependency order.npm run check.Minimal example:
'use strict';
const assert = require('assert');
const { functionUnderTest } = require('../path/to/module');
assert.strictEqual(functionUnderTest('input'), 'expected');
console.log('Feature checks passed.');Common patterns:
AssertionError: behavior or a source/UI contract changed. Read the assertion's message before updating the test.MODULE_NOT_FOUND: dependencies were not installed or the require path is wrong.EADDRINUSE: a test or app attempted a fixed occupied port. Tests should normally use port 0.EPERM ... listen 127.0.0.1: the execution environment forbids loopback servers; run in an allowed terminal/environment.node --check command failed.node scripts/... command directly to isolate it.Do not weaken a source-contract assertion merely because copy, markup, or a CSS selector changed. First decide whether the intended product behavior changed, then update implementation and test together.
The test scripts should use temporary locations and avoid rewriting tracked application data. Before and after a test run:
git status --shortInvestigate unexpected file changes rather than discarding them automatically.
npm install.``bash WXOTS_PORT=3040 npm start ``
WXOTS_BOUND_PORT.Use the version badge/update flow or hard-reload the browser. The app uses versioned immutable caching for static JS/CSS.
Check:
Select it and inspect Debugger → REST API. Common causes are an incomplete profile, selected agent ID no longer present, expired credential, malformed custom context, missing local model, or a directly callable evaluator model not being available.
Configure a directly callable evaluator model through the selected runtime/agent metadata. Capture mode itself can save responses without one; semantic testing later cannot.
.gguf..wxots-harness-state/models or WXOTS_NATIVE_MODEL_DIR.WXOTS_NATIVE_MODEL_PORT.Stress workloads always bypass it. Reset both counts to 1 and avoid testType=performance_scalability for a sandboxed functional test.
Confirm the evaluator:
intent and strict are exact contracts;contains accepts a substring alternative;Open Mapper, reset to auto-map defaults, then explicitly map ambiguous headers. Save As after mapping to preserve the new canonical round-trip schema.
This is expected for shared/sanitized workspaces. Open each restored profile and enter your own API key.
wxots-db controls are unavailableCheck WXOTS_DB_URL, start the service, and verify /health. Local execution, local workspace saving, and local recordings remain available.
Separate agent latency from harness overhead. Large CSV parsing, report aggregation, persistence, compression, and rendering can consume time without increasing agentResponseMs. Use pagination, hide unnecessary columns, filter rows, and save compact workspace/recording formats.
testObjective, risk, safety category, and readiness flags describe the test but do not automatically evaluate the answer..wxorec evidence before instruction, model, or tool changes..wxotsw preserves richer investigation context.npm run check is the authoritative regression command and includes the current version-service check.Use this repeatable workflow for a release-quality agent test.
npm run check./api/health and traffic-governor settings..wxotsw workspace.||..wxorec saved..wxotsw workspace.| Variable | Purpose | Default |
|---|---|---|
WXOTS_PORT or PORT | Preferred app port | 3038 |
WXOTS_PORT_MAX | Highest fallback port | preferred port + 20 |
WXOTS_HOST | Bind host | 127.0.0.1 |
WXO_STATE_DIR | Local state override | .wxots-harness-state beside the app/build |
WXOTS_JSON_BODY_LIMIT | JSON request limit | 512 MB |
WXO_TIMEOUT_MS | Default production request timeout | 90,000 ms |
WXOTS_USER_NAME, WXOTS_USER_EMAIL | Local identity labels | Local User / blank |
WXOTS_TEAM_ID, WXOTS_TEAM_NAME | Collaboration identity | local defaults |
| Variable | Purpose | Default |
|---|---|---|
WXOTS_OLLAMA_URL | Local Ollama server | http://127.0.0.1:11434 |
WXOTS_BUILTIN_REMOTE_URL | Managed OpenAI-compatible root | unset |
WXOTS_BUILTIN_REMOTE_API_KEY | Server-side managed provider key | unset |
WXOTS_NATIVE_MODEL_DIR | GGUF model directory | <state>/models |
WXOTS_LLAMA_SERVER_BIN | Advanced runner override | bundled/discovered runner |
WXOTS_NATIVE_MODEL_PORT | Native model loopback port | 11435 |
| Variable | Purpose | Default |
|---|---|---|
WXO_MAX_CONCURRENT_REQUESTS | Process-wide outbound concurrency | 4 |
WXO_MIN_REQUEST_INTERVAL_MS | Minimum request-start interval | 0 ms |
WXO_MAX_QUEUED_REQUESTS | Maximum queued outbound requests | 250 |
WXO_KEEP_ALIVE_MAX_SOCKETS | HTTP keep-alive socket limit | 16 |
WXO_ALLOW_PRODUCTION_AGENT_AUXILIARY_FALLBACK | Permit evaluator/simulator fallback through production agent | false |
Change traffic controls only with environment-owner/SRE approval.
| Variable | Purpose |
|---|---|
WXOTS_DB_URL | Optional wxots-db service URL |
WXOTS_DB_PORT | Local database service port, normally 3041 |
WXOTS_DB_DATA_DIR | Persistent shared-artifact directory |
WXOTS_DB_MAX_ARTIFACT_BYTES | Shared artifact size limit |
WXO_RECORDINGS_DIR | Explicit recording directory override |
execute,threadCount,requestsPerThread,input,subSegment,channel,watsonIntent,expectedResponses,expectedResponseType,maxTurns,evaluationMode,status
YES,1,1,What is the status of my claim?,group,chat,claims_request_claim_status,claims_request_claim_status,intents,1,intent,Pending
YES,1,1,I have a bill from my doctor.,group,chat,,claims_charge_details_inquiry||claims_claim_bill_validation,disambiguation,3,disambiguation,PendingFor complete round-tripping, let the suite export the CSV after configuring rows. Its canonical export includes expectedResponsesConfig, semantic flags, tool/trace/safety fields, results, execution context, and packed per-agent result data.
For implementation-level details, consult:
README.md for startup, runtimes, database, build, and deployment;app/docs/REST_API.md for REST concepts and request examples;app/docs/RECORDING_FORMAT.md for the binary recording container;app/docs/WXO_TRAFFIC_SAFETY_AUDIT.md for call amplification and governor design;app/docs/PERFORMANCE_AUDIT.md for persistence, recording, and UI performance behavior;package.json for the authoritative root check sequence.