# gRPC platform support matrix What the Stable gRPC platform (`:grpc:*`) is certified against, what it is only checked against, and what is merely watched. The distinction is the point: "works with Spring Boot" is not a statement anyone can act on. `GrpcCompatibilityMatrix.caSkeleton()` is the machine-readable form of this table, and `GrpcStableReleaseGate` blocks a release when a certified lane has no result or a failing one. ## Lanes | Lane | Grade | Failure blocks a release | | --- | --- | --- | | Boot-managed platform (Spring Boot 4.0.8 BOM) | Certified | Yes | | proto3 with explicit `optional` | Certified | Yes | | `grpc-netty-shaded` | Certified | Yes | | `grpc-netty` (unshaded) | Compatibility | No | | Upstream gRPC Java version override | Compatibility | No | | Protobuf Edition 2024 | Watch | No | | Protobuf Edition 2026 | Watch | No | ## Runtime baseline | | | | --- | --- | | Java | 21 | | Spring Boot | 4.0.8 (the repository baseline; the plans assume 4.1) | | io.grpc | `ext.grpcVersion` in `src/build.gradle` | | Protobuf | `ext.protobufVersion` in `src/build.gradle` | | Stable transport | Netty (shaded) | | Stable RPC shapes | Unary, Server Streaming | | Stable resolvers | Static, DNS, Unix domain socket | | Stable load balancing | `pick_first`, `round_robin` | ## Evidence grades A capability may only be advertised on evidence of a grade that can establish it. `GrpcEvidenceGrade.requireCertifies` enforces this, and `GrpcReleaseEvidence.supports` refuses a claim backed by the wrong lane. | Grade | Lane | Establishes | | --- | --- | --- | | `CONTRACT` | `grpcInProcessContractTest` | adapter, interceptor order, status mapping, validation, idempotency replay, context propagation | | `TRANSPORT` | `grpcNettyContractTest` | HTTP/2, TLS, mTLS, metadata limit, message limit, GOAWAY, keepalive, graceful shutdown | | `FAULT` | `grpcFaultTest` | connection loss, completion unknown, partial stream, evidence classifier | | `PERFORMANCE` | `grpcPerformanceTest` | latency, stream saturation, executor saturation, drain budget | In-process results are never transport evidence. The in-process transport does not negotiate TLS, does not frame HTTP/2 and does not enforce transport-level limits, so a suite that passes there has tested the adapter and not the transport. ## What is not supported | | Where it lives | | --- | --- | | Client streaming, bidirectional streaming | `grpc-advanced-streaming` | | Manual flow control | `grpc-advanced-streaming` | | Hedging | `grpc-advanced-resilience` | | Custom name resolver, custom load balancer | `grpc-advanced-resilience` | | xDS | `grpc-advanced-resilience` | | gRPC-Web, Servlet HTTP/2, Spring Integration, Reactor, Kotlin | `grpc-advanced-compat` | | Channelz / CSDS diagnostics | `grpc-advanced-diagnostics` | ## Current release status Not released. Every `:grpc:*` leaf is `runtime_memberships: []` in the module registry, so the platform is build-only: it compiles, its lanes run, and no deployed artifact carries it. Two release gate inputs are outstanding and are the work between here and a release: - **Performance baseline.** The performance lane runs and asserts shape — ordered percentiles, a gate that reads them — rather than absolute numbers. A recorded baseline on a known runner is what turns it into a regression gate. - **Schema codegen.** No `protoc` runs in this build (ADR-GRPC-002), so the descriptor artifact and the consumer-compile fixture are governed as policy rather than produced from a compiled schema.