One binary
npm install -g syzs-cli — runs anywhere Node.js 20 runs. No server, no database, no central service.
CLI to ALIGN test artefacts for any level of testing
SYZYGY is a CLI tool that standardizes how your integration knowledge is captured, versioned, and shared — turning scattered API specs, test scenarios, test data, and environment configs into a single, portable plugin.
Test at any level — component, integration, or E2E — using the same artefacts. No duplication. No drift. Every team, every environment, every test phase works from the same source of truth.
Start in plain English. Capture how each system should behave as a structured spec, and the AI assistants syz init configures turn it into runnable plugins, scenarios, and an always-current traceability matrix — from day one.
npm install -g syzs-cli
Requires Node.js 20+
01 The problem
Most organisations carry their integration knowledge in five places at once: a Postman collection on one engineer's laptop, a Confluence page two years out of date, a custom test framework someone built and left behind, a folder of CI scripts no one owns, and the head of the senior engineer who is about to take a different job. None of those things are wrong. None of them are aligned.
Every team automates testing the same way: they build a framework first. Then the people who knew how the systems integrated leave, and the knowledge leaves with them. What follows is always the same pattern — a custom runner no one fully understands, a folder of "helpers" that grew organically, credentials stored in places they shouldn't be, a Confluence page two years out of date, and one engineer everyone defers to about which endpoint to call in what order. That engineer becomes a bottleneck. When that engineer leaves, so does the knowledge.
The hard part of testing modern software has never been writing assertions. The hard part is where your integration knowledge lives: the endpoints, the request shapes, the order of operations, the negative-path expectations, the rules a manager calls "how we actually work." Frameworks let you write tests. They don't help you keep the knowledge that makes those tests worth writing.
SYZYGY treats integration knowledge as the artefact. It packages that knowledge into one durable, versioned form — a plugin — and gives every developer, every test phase, and every environment the same source of truth. You version it (a git tag). You install it (syz install). You reuse it across every level of testing your team does, against every environment, by every developer. When the engineer leaves, the plugin stays.
PLUGIN-GUIDE.yaml / DOMAIN.yaml, in plain language, before a plugin exists..syz/. Convention over config.syz install.syz init lays down the framework. The AI assistant they already use is configured automatically.02 The shift
One binary. Nothing else to operate.
SYZYGY runs the whole testing lifecycle from one place — and it starts with knowledge, not code. The people who know what a system must do capture it in plain domain language as a concrete, schema-validated spec, before a single plugin exists. syz generate turns an API spec into a runnable plugin. Scenarios wire those plugins into tests. The runtime executes them deterministically and writes a report anyone can read. syz rtm ties every result back to the requirement it proves. The lifecycle below renders that path, stage by stage.
And it never drops you onto a blank page. syz init lays down a versioned knowledge layer under .syz/dossier/ — a directive router (SYZ-INDEX.md), a full CLI manual, a testing how-to, design guidelines, and guided DOMAIN.yaml / TEST-STRATEGY.md stubs — so the AI assistants you already use can help capture requirements and author scenarios from the very first command.
Underneath that lifecycle is a single Node.js CLI (syz, package syzs-cli) that runs declarative scenarios written in YAML against a set of versioned plugins that encode how your systems integrate. Scenarios, plugins, test data, and environment configurations all live in your git repo as YAML files. No server to operate, no database to provision, no central registry to publish to — everything runs locally or in any CI runner with Node.js 20+.
A scenario is a flow of step agents — craft, send, validate — and workflow agents that compose them, chaining into anything from a single-endpoint smoke check to a full end-to-end choreography. Each scenario writes an isolated, immutable execution ledger; every run produces a structured index.html report, a per-scenario debug.log, and an optional JUnit XML for CI. AI is pushed to its full potential exactly where authoring benefits from reasoning — drafting specs, payloads, and semantic checks — while execution, assertions, and the ledger stay fully deterministic, so verdicts never drift with model variability. The CLI is the only piece you install; everything else is plain text you commit to git.
The SYZYGY lifecycle, from requirement capture to requirements traceability
Day one, .syz/dossier/ already ships the knowledge layer that supports the first three stages — so capturing requirements and authoring scenarios in plain language works from the very first command.
npm install -g syzs-cli — runs anywhere Node.js 20 runs. No server, no database, no central service.
Share integration knowledge the way you share libraries. Versioned by tag, installed with syz install, pinned in dependency.json.
Declarative, diffable, reviewable in code review. Same scenario across every test phase — switch the environment file.
Deterministic runtime; bring any OpenAI-compatible provider for the parts that genuinely benefit from reasoning.
03 How it works
The Execute and Report stages of the lifecycle, up close. Plugins hold the knowledge — agents, templates, models, fixed test data, and a guide that explains it all. Scenarios describe the flow. Environments name the infrastructure under test. The CLI runs them, deterministically.
A versioned bundle of integration knowledge for one system — its step agents (which craft payloads, send requests, and validate responses), templates (for request bodies, attachments, and other outbound artefacts), models (input contracts that document and validate every step agent's inputs), fixed test data, and README that depicts all the business, technical, logical or any other knowledge of the system required for testing. Owned by the team that owns the integration, kept in git, tagged like a library, and installed with syz install.
A YAML file that names a flow — a sequence of step agents a plugin exposes. The same scenario can be reused across test levels (a mock during component testing, staging during integration, a production-like environment during UAT), or new scenarios can be authored for a new scope, pulling in whichever plugins are needed with syz install.
A YAML file that names the infrastructure involved — base URLs, credentials (via env vars or secret-manager-rendered files), and any per-system config or environment specific test data. Switching environments is switching one CLI flag.
Plugins from .syz/plugins/ (local) and .syz/plugins.installed/ (git-installed), the scenario(s), the environment, and the optional AI API config — Zod-validated, every file.
plugins/
plugins.installed/
scenario
env.yaml
ai-api.yaml
The pre-flight checker walks the scenario's flow and confirms every step or workflow agent referenced (including those nested inside workflow agents) exists in a loaded plugin. No execution begins until every name resolves.
step agent names
workflow agent names
nested references
The flow runner iterates step by step. Every step agent — regardless of type — runs the same outer lifecycle: input resolution, then the agent's specific execution, then a ledger write. What changes is the middle phase. A craft step agent resolves its inputs, renders the payload via a Nunjucks template or an AI crafter, and optionally writes the artifact to disk for a downstream send. A send step agent resolves its inputs, constructs the full request payload from its Nunjucks template, and dispatches it to the target system via the executor — the response envelope is what downstream steps reference. A validate step agent resolves its inputs (including the response passed from the ledger), runs every declared check through the assertion engine, and writes each verdict to the ledger.
Every step writes an immutable, indexed entry to the scenario's ledger. Sensitive fields declared in the agent YAML are masked on write. Output shortcuts resolve via JSONPath against the response and become {{ ledger.<agent>.outputs.<field> }} references for downstream steps.
ledger entry
masked fields
{{ ledger.x }}
The reporter writes index.html (clickable, embedded, opens with file://), per-scenario debug.log (plain-text phase trace), per-scenario ledger.json (the audit artefact), execution.json (run-level index), and optionally a JUnit XML.
index.html
debug.log
ledger.json
execution.json
junit.xml?
04 Core capabilities
Every capability below is shipped today.
Document what each system must do. Link tests to it. Get a matrix that's always current.
The people who know what "correct" means — product owners, business analysts, integration owners — capture it as schema-validated YAML: PLUGIN-GUIDE.yaml per integration, DOMAIN.yaml for the cross-service journeys. It's written in plain domain language with any AI assistant out of the box, before a single plugin exists — a concrete, structured spec with required fields and a known vocabulary, not free prose, so it stays consistent across people and sessions and is validated by syz lint. Every requirement carries a stable ID. Link any scenario, outline, row, or step to the requirements it exercises with covers:, and syz rtm generates a Requirements Traceability Matrix on demand — a derived report, like the run report, never maintained by hand. --strict fails CI on any uncovered requirement or dangling link; --lastrun annotates each requirement with its latest execution outcome.
Author once, run against a mock during component testing, staging during integration, and a production-like environment during UAT.
--env <name> selects the environment file. Plugins read system config from env[pluginName] — base URLs, tokens, timeouts — so switching environments is switching a flag. Cross-references between systems ({{ env.shared.api_key }}) are resolved at load time with cycle detection, so a misconfigured env fails before any execution begins. {{ os-env-var:NAME }} is the inline resolver for OS environment variables — commit env files safely and inject secrets from a vault or CI secret store. Every resolved value is automatically registered and masked across all artefacts (stdout, debug log, ledger, HTML), composing with path-based sensitive_fields masking.
The environment file's counterpart is the plugin's data.yaml — the test data that stays fixed across environments (canonical payloads, reference IDs, sample inputs), addressed in templates as {{ <plugin>.data.x }}. Environment files hold what changes per environment; data.yaml holds what doesn't. Together they form the full test-data substrate, split along the only line that matters: does the value vary with where you run, or with what you test.
Versioned in git. Installed by tag. Pinned in a manifest. The same workflow your team already uses for code.
syz install performs a shallow, sparse checkout — git clone --no-checkout --depth 1 --branch <tag> then git sparse-checkout set — and copies only the plugin's folder into .syz/plugins.installed/. No central registry, no publish workflow, no proprietary lock-in. .syz/dependency.json records every dependency by name, URL, and version — committed to source control so every team member and CI runner reproduces the same set. Monorepos with many plugins install efficiently because only the named plugin folder is transferred.
Open the report. Click into a failing step. See exactly what was resolved, what was sent, what came back, and what the assertion concluded.
Every step's four-phase trace is written to debug.log as plain text (identical to what streamed to the terminal) and embedded into index.html as structured data. The HTML report opens via file:// double-click — no server, no network. Two masking mechanisms compose: path-based sensitive_fields declared on the agent, and a run-scoped secret registry that automatically masks every value resolved from {{ os-env-var:... }} — both apply everywhere (stdout, debug log, ledger, HTML). Each scenario gets its own isolated ledger, so {{ ledger.x }} references never cross scenario boundaries and a failing scenario never corrupts a passing one.
Equality, regex, schema, range, count, deep array predicates, expression — and an ai operator for semantic rules a deterministic check can't express.
The assertion engine supports json, text, and http assertion types, each with its own valid operators (full list in the technical depth section). Every assertion result records what rule produced the verdict — type, operator, and path? are first-class fields on AssertionResult — so the ledger answers "did this pass because of equals or contains?" without re-running the test. The expression operator runs in a sandboxed VM context for JS-power escape-hatch checks across multiple response fields. The ai operator delegates to your configured provider with a structured-output prompt and records the model's reasoning in the assertion result.
Outline scenarios — same flow, an array of examples, one isolated execution per row. Then select what runs.
examples: makes a scenario file an outline. Each row becomes an independent execution with its own ledger and results folder. Failing rows do not halt other rows — you see which inputs fail and which pass in a single run. Outline values support every other resolver ({{ env.x }}, {{ <plugin>.data.x }}, {{ ai: ... }}) so example rows can themselves be generated. Tag scenarios and rows with tags: and select with --tag; pick named outline rows with --example; or curate a release playlist as a suite manifest (.syz/suites/<name>.suite.yaml) and pass it to --suite. The same selectors run on syz run and syz lint, so a lint previews the exact set a run would execute.
Point syz generate at an OpenAPI spec or a Postman collection — or answer a short interactive prompt. Get a complete, runnable plugin.
The generator is deterministic — no AI in the path, no network call required, always reproducible. It parses the source, builds a normalised SourceModel, and emits the full plugin: every send step agent, every validate step agent, every input model, every Nunjucks template, the plugin's data.yaml, a scaffolded PLUGIN-GUIDE.yaml, and a happy-path sample scenario. Multipart endpoints with text content types are scaffolded as craft → send → validate; binary multipart endpoints get a filePath send step agent and validate step agent. OpenAPI and Postman ship today; the same --from interface is built to take more formats (see Roadmap).
Plug in any OpenAI-compatible model. The runtime never drifts.
AI is opt-in and provider-agnostic. .syz/ai-api.yaml configures a base_url, a model, and an api_key (use {{ os-env-var:NAME }} for env-backed keys — resolved at load time, auto-masked in all artefacts). It works against Anthropic, OpenAI, Azure, vLLM, or any compatible gateway. The resolver, executor, assertion engine, and ledger remain deterministic — model variability never propagates into test verdicts. If AI isn't configured, only the features that use it ({{ ai: }} resolver, crafter: ai, operator: ai) fail — and they fail with a single AI_CONFIG_INCOMPLETE error that names every missing field at once.
A note on AI output. AI-generated artefacts — drafted payloads, resolved inputs, and AI-evaluated verdicts — are non-deterministic. Treat them as a starting point and review them before you rely on them.
syz init writes a framework-aware context file for every major AI tool. Open the project; the assistant already knows.
Claude Code, Cursor, GitHub Copilot, Windsurf, Continue.dev, Amazon Q, JetBrains AI, Gemini Code Assist, and Aider all receive a pointer file at the path each tool auto-discovers. Behind those pointers is a versioned knowledge layer under .syz/dossier/ — a lean directive router (SYZ-INDEX.md) plus a full CLI manual, design guidelines, a testing how-to, and an AI-risk notice — all owned and overwritten by the framework on update, so every assistant authors against the current contract. No prompt engineering, no copy-pasted docs, no drift.
JUnit XML on demand, deterministic exit codes, no browser opened unless asked.
syz run --reporter junit writes a JUnit XML at the default path or to any path with --output. The format is consumed natively by GitHub Actions, GitLab CI, Jenkins, CircleCI, Buildkite, and Azure DevOps — inline PR test panels and trend tracking work without further configuration. Exit code is 0 only when every scenario succeeded; 1 on any failure; 130 on SIGINT. --continue-scenario-on-failure runs every step past a failed assertion (the verdict still fails the run) for full-picture CI reports. The live progress panel is opt-in (--live-stats) — CI never opens windows.
A fixed wait when you need one. A bounded retry when the system is eventually consistent.
syz.wait is a built-in step that pauses a flow for a fixed number of milliseconds — deterministic, never an AI call. For asynchronous systems, add a poll: block to a workflow step: it re-runs the workflow until its validations pass or a bound trips (max_attempts, optional interval_ms, linear backoff_ms, timeout_ms). Only a failed verdict retries; a real fault breaks out immediately. Convergence is testable without flaky sleeps.
05 Quickstart
Real commands, real flags, real file paths. Nothing reads # placeholder.
You need Node.js 20+ and a git repo (any). Paste everything below.
npm install -g syzs-cli
syz init
Creates the .syz/ directory, the dossier/ knowledge layer, and a context file for every supported AI tool. It's explicit and idempotent — safe to re-run, and re-running after a CLI upgrade refreshes the framework rules in place. It never overwrites files that are yours: .syz/README.md, dossier/DOMAIN.yaml, dossier/TEST-STRATEGY.md, and each plugin's PLUGIN-GUIDE.yaml.
Three ways. Pick the one that fits your situation.
syz install https://github.com/syzs-code/payments-plugin.git@v1.2.0 \
--plugin payments
syz generate plugin --name payments \
--from openapi:./payment-api.yaml
syz generate plugin --name payments \
--from postman:./payments.json
For an OpenAPI spec with more than ten operations you'll be prompted to confirm before any files are written. Use --dry-run to preview the file list without writing.
Now write the environment file that points the plugin at your system, and the scenario that describes what to test:
.syz/environments/local.yaml
name: local
production: false
payments:
base_url: "http://localhost:3000"
token: "{{ os-env-var:PAYMENTS_TOKEN }}" # resolved at load time; value auto-masked everywhere
timeout_ms: 5000 # optional — default 30000
Export the token in your shell or your CI's secret store:
export PAYMENTS_TOKEN="dev-token"
.syz/scenarios/e2e/checkout.yaml
name: "Checkout — successful order"
level: e2e
environment: local
plugins:
- name: payments
version: "1.0.0"
flow:
- type: send
agent: payments.step_send_order
inputs:
userId: "u-001"
amount: 100
currency: "GBP"
- type: validate
agent: payments.validate_order_response
inputs:
response: "{{ ledger.payments.step_send_order.response }}"
expected_status: 201
Pre-flight: confirm the scenario has everything it needs before running.
syz lint --env local
syz run --suite .syz/scenarios/e2e/checkout.yaml --env local
You'll see each step stream to the terminal phase-by-phase, then a one-line summary. Open the report:
open .syz/results/run-2026-04-25T09-12-34-567Z/index.html
Self-contained index.html — opens via file://, no server.
…or use --run-name to name the run yourself:
syz run --suite .syz/scenarios/e2e/ --env staging --run-name sprint-42-regression
That's it. The same scenario runs against staging, UAT, or production by changing the --env flag and the matching environment file.
06 Anatomy of a plugin
A folder — step agents, workflow agents, templates, models, test data, and a schema-validated integration guide. All YAML and Nunjucks. No code generation, no DSL, no surprises.
A plugin is a directory under .syz/plugins/<name>/ (if you authored it locally) or .syz/plugins.installed/<name>/ (if syz install fetched it for you). Both shapes are identical.
send step agent.http), an input contract, a payload template, optional named outputs, and a list of sensitive fields.ai.input_model: in craft, send, and workflow agents; consumed at runtime for validation and by AI agents writing scenarios against the plugin..njk files that render the full request — method, URL, headers, body — with access to resolved inputs, environment values, and plugin data. Referenced by template: in craft and send agents.{{ <plugin>.data.x }}.syz install, and read by AI agents authoring scenarios..syz/plugins/payments/
├── plugin.yaml # name + version, two fields
├── PLUGIN-GUIDE.yaml # integration knowledge — schema'd YAML, ships via syz install
├── CLAUDE.md # one-line pointer to PLUGIN-GUIDE.yaml
├── agents/
│ ├── step_send_order.yaml # a send step agent
│ ├── validate_order_response.yaml
│ └── workflow_checkout.yaml # a workflow agent that composes the two
├── models/
│ └── order_request.yaml # input contract for the send step agent
├── templates/
│ └── create_order.njk # full Nunjucks runtime
└── data.yaml # static test data, shared across environments
plugin: payments
version: 1.0.0
summary: >
Charges, captures, and refunds customer payments for orders.
requirements:
- id: REQ-PAYMENTS-PG-001 # stable traceability ID
behaviour:
given: a valid card and a supported currency
when: a payment is made for a positive amount
then: the payment is captured and a reference is returned
inputs:
- { field: amount, type: integer, min: 1, max: 1000000, required: true }
- { field: currency, type: string, values: [USD, EUR, GBP], required: true }
rules:
- amount must be between 1 and 1,000,000
- a declined card is refused and nothing is charged
errors:
- { code: DECLINED, meaning: the issuer refused the charge }
- { code: INVALID_CURRENCY, meaning: currency not in the supported set }
notes: >
The maximum is a business limit. A declined card is a normal,
expected outcome — the charge simply does not happen.
name: payments.craft_order_payload
type: craft
crafter: nunjucks
description: "Render an order payload to a temp file for the downstream send agent"
input_model: models/order_request.yaml
template: templates/create_order.njk
output_to_file: "{{ env.shared.tmp_dir }}/order_{{ inputs.userId }}.json"
name: payments.step_send_order
type: send
execution_library: http
description: "POST a new order to the payments service"
sensitive_fields:
- request.headers.Authorization
defaults:
baseUrl: "{{ env.payments.base_url }}"
headers: "{{ payments.data.step_send_order.headers }}"
body: "{{ payments.data.step_send_order.body }}"
outputs:
orderId: { path: "$.body.data.orderId", description: "Created order ID" }
httpStatus: { path: "$.metadata.http_status", description: "HTTP status" }
input_model: models/order_request.yaml
template: templates/create_order.njk
name: payments.validate_order_response
type: validate
checks:
- type: http
description: "Response status matches expected"
path: "$.metadata.http_status"
operator: equals
value_from_input: expected_status
- type: json
description: "Order ID is present"
path: "$.body.orderId"
operator: exists
- type: json
description: "Total equals subtotal plus tax"
operator: expression
expression: "response.body.total === response.body.subtotal + response.body.tax"
- type: json
description: "Batch routing follows time-based rules"
path: "$.body.batchId"
operator: ai
instruction: "The value must be A if UTC time is 08:00–13:00, B if 13:00–17:00, else C"
name: payments.workflow_checkout
type: workflow
description: "End-to-end checkout — send and validate an order"
input_model: models/checkout_inputs.yaml
steps:
- type: send
agent: payments.step_send_order
inputs:
userId: "{{ inputs.userId }}"
amount: "{{ inputs.amount }}"
currency: "{{ inputs.currency }}"
- type: validate
agent: payments.validate_order_response
inputs:
response: "{{ ledger.payments.step_send_order.response }}"
expected_status: "{{ inputs.expected_status }}"
{
"method": "POST",
"url": "{{ baseUrl }}/orders",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{ token }}"
},
"body": {
"userId": "{{ userId }}",
"amount": {{ amount }}{% if currency %},
"currency": "{{ currency }}"{% endif %}{% if items %},
"items": [
{% for item in items %}
{ "sku": "{{ item.sku }}", "quantity": {{ item.quantity }} }{% if not loop.last %},{% endif %}
{% endfor %}
]{% endif %}
}
}
name: order_request
fields:
userId: { type: string, description: "ID of the user placing the order" }
amount: { type: number, description: "Order amount in minor units" }
currency: { type: string, description: "ISO 4217 currency code" }
step_send_order:
headers:
Content-Type: "application/json"
body:
userId: "u-001"
amount: 100
currency: "GBP"
validate_order_response:
expected_status: 201
07 Technical depth
You never have to learn how to code to use SYZYGY. The CLI ships all its knowledge directly to the AI code assistants you already use — they have everything they need to author, generate, and maintain your scenarios and plugins on your behalf. The technical detail below serves a different purpose: it equips you to read what runs, understand why a test failed, monitor what the runtime produces, and customise or improve generated output when the need arises. That context keeps you in control without requiring you to build from scratch.
If you're new to the tool, the step-by-step Tutorial is a better starting point — it walks through everything hands-on, from cli setup to a working plugin.
08 Who it's for
It starts with the people who own what "correct" means — and reaches every team that has to prove it. Four shapes of team; if yours rhymes with any, this is the tool.
01 / Product owner · BA · SME
Document each integration's behaviour and the cross-service journeys as a concrete, schema-validated spec — PLUGIN-GUIDE.yaml and DOMAIN.yaml — in plain domain language, drafted with any AI assistant out of the box, before a single plugin exists. Every requirement gets a stable ID; covers: links the tests to it; syz rtm proves the coverage. The knowledge that used to live in one person's head becomes a reviewed, versioned, traceable artefact.
02 / Platform team
You own a payments API (or an orders API, or an auth API). Twelve other teams call it. You spend a non-trivial fraction of every sprint answering "what's the right payload for endpoint X" and "we got a 400, what does that mean". Today, every consumer team has their own ad-hoc test setup. With SYZYGY, you publish a payments plugin — one git repo, one syz install line for every consumer. Endpoints, payloads, validators, negative-test expectations, common workflows — all versioned, all in one place, all reused. New consumers onboard in an afternoon. Breaking changes propagate via a version bump.
03 / Integration team
You have component tests against mocks, integration tests against a shared staging instance, end-to-end tests against a production-like environment, and UAT against a stakeholder-facing slice. Today, you maintain four different test suites. With SYZYGY, you maintain one set of scenarios and four environment files. Same plugins, same scenarios, different --env flag. When the API changes, you update the plugin in one place, bump the version, and re-pin in every consumer's dependency.json.
04 / QA lead
You need exit codes that mean something, JUnit XML that GitHub Actions and Jenkins read natively, deterministic verdicts, and audit artefacts you can hand to compliance. With SYZYGY, every run produces an immutable ledger, a phase-by-phase debug log, a JUnit XML (--reporter junit), and a requirements-traceability matrix (syz rtm, with --strict as a CI gate). Live progress panels are opt-in (--live-stats) for your local executions. Sensitive fields are masked everywhere, including the report. The exit code is 0, 1, or 130 — and you can rely on it.
09 Roadmap
What ships today runs over HTTP. The architecture was built so new protocols, sources, and surfaces drop into the same registry without changing the runtime, the ledger, or how you author a scenario. The items below are planned, not yet shipped — everything in Sections 01–08 is.
More executors. The executor registry takes new protocols behind one native-outcome contract: every executor captures its system's real response, and your validate steps decide pass or fail — so the way you author and assert a test never changes as the protocol does. Planned executors: Kafka (producer + consumer), message queues (publish + consume), SFTP (upload + download), SSH, SQL databases, NoSQL databases, key-value stores, gRPC, WebSocket, cloud services (object storage, queues, pub/sub), and a browser executor — with the priority order driven by what teams actually ask for. Stateful executors use named connection handles — open once, reuse across steps, torn down at scenario end; eventual-consistency systems are already served by the shipped poll: and syz.wait primitives.
More generation sources. syz generate reads OpenAPI and Postman today. The same --from interface and source registry are built to extend — each new format is just a new parser, with no change to the deterministic builder. On the list: AsyncAPI, WSDL, XSD, cURL, RAML, API Blueprint, GraphQL SDL, GraphQL Introspection Schema — and more on demand.
The point of the roadmap is the inverse of a feature list: the surfaces grow, the model doesn't. A team that learns to author one HTTP scenario today authors a Kafka or SQL scenario the same way tomorrow — same agents, same resolvers, same ledger, same report.
Aligned
One command. Node.js 20+. No infrastructure to stand up.
The first green run is five commands away.