//! The gRPC-client mechanical arc shared by the Ppoppo gRPC SDK family
//! (`pas-plims`, `pcs-external`).
//!
//! sdk-core already owns three legs of "make an authenticated gRPC call to a
//! GKE path-prefixed ops face and classify the result" — the [`token_cache`],
//! the [`interceptor`], and the [`retry`] hint. This module adds the two
//! remaining legs so each SDK stops re-deriving them:
//!
//! - [`PathPrefixChannel`] — the transport leg (GKE Ingress path-prefix
//! channel).
//! - [`Error`] + [`classify_status`] — the classification leg. Both SDKs
//! re-export [`Error`] as their public error type and route every RPC
//! failure through [`classify_status`], so the family's retry taxonomy
//! (which `tonic::Code` is retryable vs terminal vs rate-limited) lives in
//! exactly one place with one test suite.
//!
//! Gated on `grpc-client`. Reached via `ppoppo_sdk_core::grpc::*`; the gRPC
//! [`Error`] is intentionally **not** flat-re-exported at the crate root. A
//! bare root-level `Error` would read as sdk-core's *own* primitive error —
//! which is [`crate::error::SdkCoreError`] — so the `grpc::` path keeps the
//! "this is the gRPC client error, not sdk-core's primitive error" semantic
//! visible at the import site. Same module-path convention as the crate's
//! bearer/verifier split — though there the driver is a genuine same-name
//! clash (`bearer::VerifyError` vs `verifier::VerifyError`); here it is purely
//! that a root `Error` would misread (the names `Error`/`SdkCoreError` differ,
//! so there is no actual collision).
//!
//! [`token_cache`]: crate::token_cache
//! [`interceptor`]: crate::interceptor
//! [`retry`]: crate::retry
pub use PathPrefixChannel;
pub use ;