Runtime (Framework 7 RequestPredicates.version(...), routing is correct): GET /widgets/7, API-Version: 1 -> 200 {"apiVersion":"1","id":"7"} GET /widgets/7, API-Version: 2 -> 200 {"apiVersion":"2","widgetId":"7"} springdoc documentation for the SAME path (2 @RouterOperation entries registered, one per version, via @RouterOperations on the RouterFunction bean): { "tags" : [ "widget-handler" ], "operationId" : "getWidgetV1", "responses" : { "200" : { "description" : "OK", "content" : { "*/*" : { "schema" : { "$ref" : "#/components/schemas/ServerResponse" } } } } } } Only ONE @RouterOperation survived (operationId=getWidgetV1) — the second is silently absent, not merged into a oneOf the way the annotated @GetMapping handlers were in 02-what-springdoc-actually-generates.txt. The response schema also did not resolve to either AccountV1-style record — it fell back to "#/components/schemas/ServerResponse" (springdoc introspecting the handler method's own ServerResponse return type, since @RouterOperation has no version attribute and I added no explicit operation() override).