Skip to content

vouchfx v1.0.0-rc.1: First Release Candidate

v1.0.0-rc.1 is released. This is the first release candidate for v1.0, following v1.0.0-alpha.10. I ran the whole fleet locally against the release commit before tagging: all four sample applications pass end-to-end on real Docker topologies, the community provider conformance suite runs clean, and the engine examples and MCP server are stable.

What changed

Six user-facing changes landed between alpha.10 and rc.1. None of them touch the language schema, the provider SDK surface, or the event-wire contract — those are frozen for v1 and enforced by golden-file CI gates, so "unchanged" is checked, not claimed.

--events-stream now emits in real time (#262). Before, lines were flushed only when a scenario finished, so a test run looked frozen until the end. Now each step and step-attempt event writes as it completes. For RETRY steps, every polling attempt is visible immediately. In parallel runs, events from concurrent scenarios interleave by arrival but stay disambiguated by (runId, stepId); the --events archive is still declaration-ordered and unchanged.

Unknown step type is now a validation error (#265). Before, a typo in a step type was vacuously valid at schema level (the composed schema has no else branch), so it blew up later at provider binding with worse context. Now it is caught at validation with a line number and a readable message. The composed JSON Schema stays unchanged; this is a post-schema cross-check against the registered provider keys.

All-unparseable suite exits 4 instead of 0 (#278). Running a suite — a single file or a whole directory — where every discovered scenario fails to parse now exits 4 (Inconclusive) rather than 0. Before, a completely broken suite looked green to CI. Now an all-parse-failure run is Inconclusive unconditionally — no --fail-on-inconclusive needed — closing the gap with vouchfx validate.

Unrecognised options now exit 2 (#269). A CLI flag typo now exits 2 (UsageError) instead of 1, so CI can distinguish a CLI mistake from a test failure. Exit 1 stays reserved for Fail verdicts.

Resource bounds and output scrubbing (#266). I added a 64 KiB cap on each script.csharp body and a 1 MiB cap on each .e2e.yaml document, as sanity limits for mistakes a person might actually make. Script compilation also picked up a 30-second budget, which bounds a slow emit — it does not, and cannot, stop the parse-phase hangs and stack overflows that remain uncatchable in-process. Terminal diagnostic output is also scrubbed of control characters and ANSI escapes at every known diagnostic output path, so a crafted string cannot inject terminal escapes through those paths into a human-viewed report. These are practical guard rails, not a defence against deliberately hostile input — real isolation for untrusted code needs out-of-process execution, which is what the MCP server does.

Relative script.csharp file: references resolve per-scenario (#268). Before, they resolved against the first discovered scenario's directory. Now each scenario resolves its own references, which is the sensible behaviour.

Release shape

The release carries CycloneDX SBOM, SLSA build provenance, and cosign keyless signatures so you can verify what you downloaded. Per-platform packages are published — .deb for Linux x64, .pkg for macOS arm64, .msi for Windows x64 — alongside tar.gz archives for all four platforms. The six NuGet packages go through OIDC Trusted Publishing so there is no long-lived API key stored anywhere.

Install it:

dotnet tool install --global vouchfx --version 1.0.0-rc.1

An explicit --version installs the pre-release directly; --prerelease is only needed when asking for the latest without naming a version.

What is rc.1, honestly

This release is a candidate for v1.0, not v1.0 itself. Before GA, I need real-world use in the open — the samples proving out beyond local Docker, the migration guide proving its worth, the community provider hub hosting working integrations. The Provider SDK ships as 1.0.0-rc.1 now but still needs to stabilise at 1.0.0 final before GA.

I am inviting people to try it and report what breaks. If you have a test suite for a distributed .NET system, run it through vouchfx and tell me what you find.