Repository navigation
v0.48.0
This release lets a server host several application protocols at once, gives every error a gRPC-shaped status, and adds a second conformance protocol that pins both down across every port.
Hosting several protocols. RpcServer(..., extra_protocols=[...]) is now normative (WIRE_PROTOCOL §3.1). The set is sealed by first serve, identical on every transport, and listed by list_protocols in registration order. The reserved vgi_rpc. prefix applies to every registered protocol. Reflection features is reserved and always emitted empty.
gRPC-shaped errors (§8):
- Code: every error batch carries
vgi_rpc.error_code, one of gRPC's 16 codes minus OK. - Reason: the existing open
vgi_rpc.error_kind. - Details:
vgi_rpc.error_details, a typed catalog (ErrorInfo,RetryInfo,BadRequest,PreconditionFailure,QuotaFailure,ResourceInfo,Help,LocalizedMessage), capped at 4 KiB and dropped whole if larger. - Unclassified errors are
UNKNOWN. RpcErrornow exposeserror_code,error_kind,error_details, typed accessors andis_retryable()on every decode path. RPC errors are never retried automatically.- Tracebacks are included by default on every transport.
RpcServer(include_tracebacks=False)omits them everywhere. - Access-log records gain
error_code.
Identity (§16). identity_unavailable carries RetryInfo. An AuthUnavailableError raised from either identity hook is now translated to it instead of reaching the client unclassified.
Conformance:
conformance.Secondary.v1: a second protocol hosted by every conformance worker, with pinned hash58557cf1….- New test groups: secondary-protocol, error-model and traceback.
vgi-rpc-test-hosted: checks any worker (including VGI SDK workers) over stdio, unix and HTTP. It includes a reverse-ordered worker that catches a server sorting its listing.- Client-driver error object: now carries
error_code/error_kind/error_details. It never carriederror_kindbefore, which is why three clients dropped it unnoticed.
Fixes:
- A quoted worker command (
--cmd "C:\…\python.exe" …) now starts on Windows. ClientDriverProxy.describeno longer shadows Reflection'sdescribe(protocol=...).
The normative cross-port contract is tools/cross-port/specs/MULTI_PROTOCOL_HOSTING.md.