Why
Found while shipping D57. services/metabase.yaml carried response_type: binary on export_query for months. It did nothing.
response_type is not in OPERATION_ALIASES (crates/overslash-core/src/openapi/alias.rs), and extract_http_action only ever derives a response type from a responses: block via detect_response_type — it never reads the key off an operation. metabase.yaml declared no responses:, so export_query.response_type compiled to None, the "use prefer_stream" hint documented on ServiceAction never fired, and a large xlsx export was buffered against max_response_body_bytes instead. D57 fixed that one instance by writing a real responses: block.
Nothing caught it, and nothing would catch the next one. A stray x-overslash-foo, a typo'd x-overslash-disclsoe, or a valid key in a position nothing reads is silently ignored at compile time. D55's rationale records the same failure mode from a different angle: a resolve: block sat next to an already-unprefixed risk: in services/whatsapp.yaml and did nothing, and the only symptom was an approval still quoting a raw ID.
Suggested direction
Lint unknown x-overslash-* keys, and known keys in positions that are never read, at template compile — reported through template_validation::validate_service_definition so it reaches both the shipped-template test and the user/org template authoring path.
Two things to get right:
- Position matters, not just spelling.
response_type: was a real concept in the wrong place. The lint has to know where each extension is read from, not merely that the name exists somewhere.
- Expect an initial sweep. This was deliberately kept out of the D57 PR because turning it on will surface unrelated findings across every shipped template at once, and mixing that into a feature PR would bury both. Land the lint and the sweep together, on their own.
Note the failure mode this guards: registry.rs logs and skips a template that fails to load, rather than failing hard. shipped_services_have_no_silent_skips is the test that keeps a skip from hiding — an unknown-extension lint is the same idea one level down, for a template that loads fine and just quietly does less than it says.
Why
Found while shipping D57.
services/metabase.yamlcarriedresponse_type: binaryonexport_queryfor months. It did nothing.response_typeis not inOPERATION_ALIASES(crates/overslash-core/src/openapi/alias.rs), andextract_http_actiononly ever derives a response type from aresponses:block viadetect_response_type— it never reads the key off an operation. metabase.yaml declared noresponses:, soexport_query.response_typecompiled toNone, the "useprefer_stream" hint documented onServiceActionnever fired, and a large xlsx export was buffered againstmax_response_body_bytesinstead. D57 fixed that one instance by writing a realresponses:block.Nothing caught it, and nothing would catch the next one. A stray
x-overslash-foo, a typo'dx-overslash-disclsoe, or a valid key in a position nothing reads is silently ignored at compile time. D55's rationale records the same failure mode from a different angle: aresolve:block sat next to an already-unprefixedrisk:inservices/whatsapp.yamland did nothing, and the only symptom was an approval still quoting a raw ID.Suggested direction
Lint unknown
x-overslash-*keys, and known keys in positions that are never read, at template compile — reported throughtemplate_validation::validate_service_definitionso it reaches both the shipped-template test and the user/org template authoring path.Two things to get right:
response_type:was a real concept in the wrong place. The lint has to know where each extension is read from, not merely that the name exists somewhere.Note the failure mode this guards:
registry.rslogs and skips a template that fails to load, rather than failing hard.shipped_services_have_no_silent_skipsis the test that keeps a skip from hiding — an unknown-extension lint is the same idea one level down, for a template that loads fine and just quietly does less than it says.