Summary
The OpenAPI contract tests only ever run against a gateway with every feature gate enabled, so the document served by a default gateway is never checked.
src/ros2_medkit_integration_tests/test/features/test_openapi_contract.test.py launches with full_feature_gateway_params(...). test_openapi_error_coverage.test.py does the same. test_openapi_callability.test.py and test_openapi_response_drift.test.py pass their own gateway_params dict, also with features turned on.
A default gateway serves a different document: gated routes answer 501, some collections are absent, and some schemas are unreachable. None of the invariants these tests check are checked for that document. A defect that only appears with default settings passes CI.
This matters because the default configuration is what a new user runs first.
Proposed solution (optional)
Add one contract test that launches with default parameters and asserts the invariants that must hold in any configuration:
- every
$ref resolves
- no operation declares a 2xx it cannot return
- every gated route declares its 501
- every advertised collection is served
The full-feature suite stays as it is. The new one does not need to repeat what is configuration specific, only what must be true everywhere.
Additional context (optional)
There is a separate follow-up for the status recorder sweep, which has the same shape of gap.
Summary
The OpenAPI contract tests only ever run against a gateway with every feature gate enabled, so the document served by a default gateway is never checked.
src/ros2_medkit_integration_tests/test/features/test_openapi_contract.test.pylaunches withfull_feature_gateway_params(...).test_openapi_error_coverage.test.pydoes the same.test_openapi_callability.test.pyandtest_openapi_response_drift.test.pypass their owngateway_paramsdict, also with features turned on.A default gateway serves a different document: gated routes answer 501, some collections are absent, and some schemas are unreachable. None of the invariants these tests check are checked for that document. A defect that only appears with default settings passes CI.
This matters because the default configuration is what a new user runs first.
Proposed solution (optional)
Add one contract test that launches with default parameters and asserts the invariants that must hold in any configuration:
$refresolvesThe full-feature suite stays as it is. The new one does not need to repeat what is configuration specific, only what must be true everywhere.
Additional context (optional)
There is a separate follow-up for the status recorder sweep, which has the same shape of gap.