Build: CMake with Conan for dependencies; a Debug build with sanitizers for development and
tests, a Release build for delivery.
Unit tests: Catch2, structured by GIVEN, WHEN, THEN.
Acceptance tests: pytest-bdd reads the scenarios from test/bdd/features/ and drives the
built binary. C++ has no maintained Gherkin runner of its own, and Behave cannot separate the
feature files from the step definitions.
Lint: clang-format and clang-tidy, whose naming and const-correctness checks fail the build.
Rationale: tests run against the Debug build, so sanitizers catch memory and undefined
behavior errors early; the Release build is tested again at merge to main.
Structure: a thin command-line entry point over the application code.
Acceptance tests: scenarios drive the built binary and check exit code, standard output, and
standard error.
Container image: also published as an image, so the tool runs as a Kubernetes job or from
another pipeline without installing its toolchain; the debug image is built on demand only.
Debug and Release are built and tested against glibc and musl, catching libc incompatibilities
before they reach production; release jobs use the musl image.