Repository navigation
Releases
Lifecase 0.1.3: reject aliased reports before running
Lifecase 0.1.3 rejects aliased report destinations before any fixture starts.
- Exclusively reserve every report path using the destination filesystem's own rules. Symlinked parents and case aliases can no longer run the suite and leave only the first report.
- A rejected reservation cleans up its empty files and newly created empty parent directories, including ancestor/descendant collisions. Existing files, existing directories and newly added contents are preserved. Kept handles are used for writing.
- Empty reservations can be visible while running. A hard kill can leave an empty file; choose new paths for a retry. Publishing two reports remains non-atomic if a later write fails.
- Native fixture behavior and protocol v1 are unchanged. Each archive includes both the fixture and optional verifier, with no Go/.NET runtime needed for that verifier.
Extract the matching archive, verify its SHA-256 sidecar, then run:
./lifecase version
./lifecase run --fixture ./lifecase-fixture --scenario exit --scenario flood --json reports/first.json --junit reports/first.xmlExpect version 0.1.3, exit 0 and two passing results. Windows uses .\lifecase.exe and .\lifecase-fixture.exe. Windows POSIX signal scenarios remain unsupported/skipped.
The exact CI artifacts passed native, Go/race/vet, .NET/CliWrap and extracted-archive checks on Linux x64, macOS arm64 and Windows x64. The targeted local repro also confirms symlink and case collisions leave no report. This does not prove cleanup of arbitrary application process trees. Binaries are not claimed to be publisher-signed or notarized.
Source: a28c9532293dad071766d06c1c15d1805b1d3332
Verification: https://github.com/rad1092/lifecase/actions/runs/38253403655
Fixes: #2 and #3
Lifecase 0.1.2: safe reports and a portable verifier
Lifecase 0.1.2 protects your report outputs and includes the optional verifier in each portable archive.
- Existing output paths, including executable and symlink paths, are rejected before scenarios run. Publication uses exclusive file creation, so report writes cannot truncate existing files.
- JSON and JUnit must use distinct, fresh names. For another run, choose a new report directory. A write error is exit 2; publication of two reports is not atomic.
- Every archive now contains both
lifecase-fixtureandlifecase(.exeon Windows). No Go or .NET runtime is needed for the packaged verifier. The separate CliWrap integration suite still requires .NET 8. - Native fixture behavior and protocol v1 are unchanged. Previous releases remain available.
Extract the matching archive, verify its .sha256 sidecar, and run on macOS/Linux:
./lifecase version
./lifecase run --fixture ./lifecase-fixture --scenario exit --scenario flood --json reports/first.json --junit reports/first.xmlExpect version 0.1.2, exit 0 and two passing scenarios. PowerShell uses .\lifecase.exe and .\lifecase-fixture.exe. Remove the scenario flags to run the full suite; Windows marks POSIX signal behavior unsupported/skipped.
These exact assets passed native fixture, Go/race/vet, .NET/CliWrap and extracted-archive checks on Linux x64, macOS arm64 and Windows x64, including a report-overwrite attempt that must leave the fixture unchanged. The evidence uses synthetic processes; it does not prove arbitrary application process-tree cleanup. Binaries are not claimed to be signed or notarized; follow your local execution policy.
Source: dfe21cbe60b397edecc3beeb4cc658e3097b95b5
Verification: https://github.com/rad1092/lifecase/actions/runs/38242668548
Lifecase 0.1.1: bound diagnostic output by watchdog
Lifecase 0.1.1 fixes a fixture watchdog escape in 0.1.0. Upgrade the native fixture when using bounded process leases.
In 0.1.0, an exception could destroy the scenario watchdog before writing an error diagnostic. If inherited stderr was full and unread, that diagnostic could block beyond the configured lease. The controlled reproduction remained alive at 2005 ms with a 1000 ms lease and was reaped by the test harness's independent timeout.
The watchdog now remains active across argument conversion, parsing, diagnostics, help/version output, explicit flushing, and immediate process exit. A validated lease of 1000–10000 ms is measured from the original entry time; argument conversion, invalid arguments, help, and version use a 5000 ms bootstrap lease. This is a best-effort process watchdog under normal OS scheduling, not a hard real-time guarantee. Protocol 1 is unchanged.
Verified source: 69101b0f88e10208d1b72610ffe34239500a0c92. Exact-commit multi-OS CI passed all six jobs, including the release gate. Archives and their embedded commit metadata and checksums were verified against this run.
| Target | Native tests, each of 2 runs | Go lifecycle policies | Official CliWrap 3.10.5 tests | Installed/extracted archive |
|---|---|---|---|---|
| Linux x64 | 19 pass, 2 platform skips | 11 pass | 9 pass | pass |
| macOS ARM64 | 19 pass, 2 platform skips | 11 pass | 9 pass | pass |
| Windows x64 | 20 pass, 1 platform skip | 10 pass, 1 unsupported signal | 9 pass | pass |
Regressions cover blocked runtime-error stderr, blocked parse-error stderr, blocked help/version stdout, preserved normal help/version output, and Windows invalid-Unicode diagnostics. Go test/race/vet, GCC/Clang/MSVC builds, source checks, locked NuGet audit, repeated scenarios, and binary installation checks passed. Attached verification.json records archive hashes, results, and observed lifecycle timings. The unauthenticated public macOS download was checksum/source-verified and passed 19 native tests (2 Windows-only skips), all 11 policies with the existing 0.1.0 Go verifier, and the blocked-error regression: exit 124 after 1008 ms for a 1000 ms lease, without the harness timeout.
The v0.1.0 tag and its assets are preserved. This patch does not expand the supported surface: Windows console signals, CliWrap graceful cancellation tokens, Job Object/deep-tree containment, Intel macOS, Windows ARM64, and other archive baselines remain unsupported or unrun. macOS assets are unsigned and not notarized; no security-setting changes are recommended. Cooperative token-file stop is not an OS console signal.
Download the ZIP matching your target plus its .sha256 sidecar. Archives contain the native fixture, MIT license, protocol, checksums, and source metadata. The .NET usage example needs .NET 8 SDK and this fixture; C++/Go build tools are optional. See the Korean quickstart and repository README for usage.
Lifecase 0.1.0: controlled subprocess fixtures
Lifecase 0.1.0 is a small testing asset for application teams that add their own subprocess completion or cancellation policy. It provides a prebuilt native child fixture and direct tests against official CliWrap 3.10.5. It is not another production process wrapper.
The fixture separates parent exit, inherited-pipe drain, descendant cleanup, cooperative stop, and forced shutdown. The optional Go developer verifier produces JSON/JUnit evidence and accepts external JSONL adapters. Consumers of the .NET fixture example need only the fixture binary and .NET 8 SDK; C++/Go build tools are optional.
Verified source: 9d749754b6f8bba093aa49e306e705d612a60d71. Full multi-OS CI run passed all six jobs, including the release gate.
| Target | Go lifecycle policies | Official CliWrap tests | Installed/extracted archive |
|---|---|---|---|
| Linux x64 | 11 pass | 9 pass | pass |
| macOS ARM64 | 11 pass | 9 pass | pass |
| Windows x64 | 10 pass, 1 unsupported signal | 9 pass | pass |
Native fixture tests ran twice per target, plus Linux Clang. Go test/race/vet, source checks, locked NuGet vulnerability audit, and repeat runs passed. The attached verification.json records timings and archive hashes. The unauthenticated public macOS download was checksum/source-verified and passed all 11 lifecycle smoke scenarios after publication.
Unsupported/unrun: Windows console signals, CliWrap graceful cancellation token, Job Object/deep-tree containment, Intel macOS, Windows ARM64, and platforms outside the documented archive baselines. Cooperative token-file stop is not claimed to be an OS console signal. macOS assets are unsigned and not notarized; no security setting changes are recommended. Adoption has not been established, and existing CliWrap tests remain the first choice when upstream defaults cover the application's policy.
Archives contain the native executable, MIT license, versioned protocol, checksums, and source commit metadata. Each archive has an external SHA-256 sidecar. See the Korean quickstart and .NET guide in the repository.