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. Before tagging, I validated the whole fleet against the exact commit: 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 issues 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 over a directory where every scenario fails to parse now exits 4 (Inconclusive) rather than 0. Before, a completely broken suite looked green to CI. Now it matches the validate command behaviour, unconditionally — no need for --fail-on-inconclusive.

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 64 KiB per script.csharp body and 1 MiB per .e2e.yaml document as sanity limits for mistakes a person might actually make. Terminal diagnostic output is also scrubbed of control characters and ANSI escapes now, so a crafted string cannot inject terminal escapes into a human-viewed report. These are practical safety railings, 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-OS packages are published (.deb, .pkg, .msi) alongside tarballs. 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

The command above pins the explicit version, so it installs fine. You need --prerelease only if 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 working end-to-end across environments, 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.