core/docs/proto-requests-conformance-cmake.md: the runner's header comment said it links libveloxproto, but it actually compiled core/generated/velox_proto.cpp straight into the executable and found nlohmann_json itself — the only option while ADR 0009's target didn't exist. It exists now on main as velox::proto (core/CMakeLists.txt, PUBLIC generated include dir, PUBLIC nlohmann_json). if(TARGET velox::proto): link it. else: fall back to compiling the generated .cpp directly, for a configure with no core/ in the tree. Both paths verified — full tree links libveloxproto.a (compiled once, by veloxproto's own target); with core/CMakeLists.txt hidden the fallback compiles the .cpp and finds nlohmann itself. conformance_cpp passes either way. Beyond tidiness: once GUI links velox::proto too, the conformance runner linking the same target is what guarantees the suite and the clients exercise byte-identical generated code, rather than two compiles of one .cpp under two warning configs — the exact skew a conformance suite exists to catch. run.sh's own direct g++ compile is unaffected and stays independent by design; this only changes the ctest-driven path CI and lanes use. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012fgjnqFCS5h5L7gZTZo3rV
tests/conformance — one suite, three runners
This is a required check on every lane's PR. It is the mechanism that makes four parallel lanes safe: the C++ daemon and the TypeScript extension are proved compatible without either having run against the other.
./tests/conformance/run.sh # starts its own mockd
./tests/conformance/run.sh --uds /run/user/1000/velox/velox.sock --ws-port 52000
The runners
| Runner | Needs | Asserts |
|---|---|---|
check_contract.py |
python3, jsonschema | schemas parse and resolve; the documented surface matches the schema surface both ways; every method has a success fixture; every fixture validates; SettingKey and Settings agree; committed generated code is not stale |
cpp/ |
a C++23 compiler, nlohmann | every golden payload parses into the generated structs, serialises back stably, and goes through the real dispatch(); privileged methods are refused -32003 over the WebSocket |
ts/replay.ts |
node ≥ 20 | a live server answers every fixture over every transport the contract allows, and the reply passes the generated validator |
run.sh also runs one scenario that cannot be shown against a healthy server: with the
daemon answering slower than capture.offer's 750 ms deadline, the client must give up and
let Firefox take the download. That is the fail-open guarantee, and it is checked here.
What "passing" means
The runners check the contract, not the implementation's opinions. Results are compared by
shape and validated against the generated validators; error codes are compared exactly.
Byte-equality with a golden file is deliberately not asserted, because a live daemon
returns its own ids and its own clock — see contracts/fixtures/README.md.
Adding a method without a fixture fails check_contract.py. Regenerating and forgetting to
commit the output fails it too.
Request to lane PKG/QA
.github/ belongs to PKG/QA, so this suite is not wired into CI by lane PROTO. Please add
it as a required status check on every branch, roughly:
conformance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '22' }
- run: sudo apt-get update && sudo apt-get install -y nlohmann-json3-dev
- run: pip install jsonschema referencing
- run: ./tests/conformance/run.sh
The suite needs: python3 with jsonschema, a C++23 compiler, nlohmann-json, and Node
≥ 20. It starts and stops its own mockd; nothing else needs to be running.