Local Verification
Use this workflow before lab sessions, branch handoff, or config-contract work. It is intentionally narrower than full CI and focused on the checks most likely to catch local drift quickly.
Fast Path
From the repo root:
bash tools/verify-local.shThis runs:
- runtime config contract validation (schema +
anolis-runtime --check-config) when a local runtime binary is present - machine profile contract validation
- docs local-link validation (
docs/**/*.md+ rootREADME.md) - runtime HTTP OpenAPI structural validation
- runtime HTTP example payload validation
- runtime HTTP live conformance smoke validation when both local runtime and provider-sim binaries are present
- Operator UI fixture contract tests when
nodeis available, directly or viacmd.exe /c nodefallback - focused C++ tests for runtime config parsing and ownership validation when a local CMake build directory is present
Note: System Composer, Workbench, and handoff package validation tests have moved to the anolis-workbench repository.
What the Script Checks
Operator UI fixture contract coverage
The Operator UI has been extracted to its own repository (anolis-hq/anolis-operator-ui). Contract tests now run in that repo's CI. This step is skipped in verify-local.sh.
Runtime config contract coverage
If a local runtime binary is present (build/dev-release/core/anolis-runtime or build/dev-windows-release/core/Release/anolis-runtime.exe), the script runs:
python3 tests/contracts/runtime-config/validate-runtime-configs.py --runtime-bin <local-runtime-binary>This enforces the runtime config contract across:
- tracked runtime YAML profiles
- contract fixture sets (
valid,invalid/schema,invalid/runtime)
Machine profile contract coverage
The script always runs:
python3 tests/contracts/machine-profile/validate-machine-profiles.pyThis validates:
- machine profile schema conformance
- referenced file existence
- referenced runtime profile compatibility checks
Telemetry timeseries contract coverage
The script always runs:
python3 tests/contracts/telemetry-timeseries/validate-telemetry-timeseries.pyThis validates:
anolis_signaltelemetry row schema conformance- fixture coverage for typed value fields and quality-only rows
- contract-invalid fixture rejection (missing quality, bad measurement, invalid typed-value combinations)
Docs local-link coverage
The script always runs:
python3 tools/validate-doc-links.pyThis validates:
- local markdown links under
docs/ - local markdown links in root
README.md
Runtime HTTP contract coverage (structural + examples)
The script always runs:
python3 tests/contracts/runtime-http/validate-runtime-http-openapi.py
python3 tests/contracts/runtime-http/validate-runtime-http-examples.pyThis checks:
- OpenAPI document shape and metadata
- Required
/v0endpoint/method coverage - Internal
$refresolution - SSE media type contract on
/v0/events - Example payload schema conformance from
tests/contracts/runtime-http/examples/manifest.yaml
Runtime HTTP conformance smoke coverage (live fixture)
If both a runtime binary and provider-sim binary are present, the script also runs:
python3 tests/contracts/runtime-http/validate-runtime-http-conformance.py \
--runtime-bin <local-runtime-binary> \
--provider-bin <local-provider-sim-binary>This starts a runtime fixture and validates live endpoint responses against the OpenAPI schema declared for each observed status code.
The conformance run also includes deterministic negative checks for:
400(POST /v0/callinvalid payload)404(missing device capabilities path)503(automation endpoints with automation disabled)
Focused runtime coverage
If a build directory exists, the script also runs:
ctest --test-dir build/dev-release --output-on-failure -R "ConfigTest|RuntimeOwnershipValidationTest"or, on Windows builds:
ctest --test-dir build/dev-windows-release --output-on-failure -R "ConfigTest|RuntimeOwnershipValidationTest"These tests cover runtime YAML parsing, restart-policy validation, automation config handling, and I2C ownership invariants.
When to Run Full CI-Style Coverage Instead
Use the broader build and test flows when:
- changing core runtime execution behavior beyond config/restart hardening
- touching integration or scenario suites
- modifying platform build logic or dependencies
See CONTRIBUTING.md for the full build and test flow.
