grpc-mojo · differential compliance run

Every layer, checked against the reference implementation

316/316checks passed2026-08-25 23:27 UTC

No self-grading: protobuf binary and JSON behavior is judged by Python protobuf and Google’s official conformance runner, header compression by python-hpack, HTTP/2 by hyper-h2 (which rejects any protocol violation), sockets by CPython, and gRPC behavior by grpcio in both directions. The proto, hpack, h2, and net sections run in each package’s own compliance suite and are aggregated here.

proto vs Python protobuf and Google's official suite

Randomized binary and proto3 JSON checks compare against Python protobuf. Google's conformance runner executes the supported proto3 binary and JSON groups. Malformed inputs must be accepted or rejected in agreement with those references.

CheckResult
differential decode/re-encode scalars (n=300)PASS
byte-identical re-encoding scalars (300/300)PASS
differential decode/re-encode nested (n=150)PASS
recursion depth limit agrees with protobuf (60 ok, 150 rejected)PASS
malformed-input agreement with protobuf (6/6)PASS
proto3 JSON parse differential, flat primitives (n=300)PASS
proto3 JSON print differential, flat primitives (n=300)PASS
proto3 JSON parse differential, singular nested messages (n=200)PASS
proto3 JSON print differential, singular nested messages (n=200)PASS
proto3 JSON parse differential, repeated primitives and enums (n=200, seed=20260825)PASS
proto3 JSON print differential, repeated primitives and enums (n=200, seed=20260825)PASS
proto3 JSON repeated accepted-edge agreement (10/10)PASS
proto3 JSON repeated rejection agreement (10/10)PASS
proto3 JSON repeated unknown enum name handlingPASS
proto3 JSON parse differential, repeated messages (n=200, seed=20260825)PASS
proto3 JSON print differential, repeated messages (n=200, seed=20260825)PASS
proto3 JSON repeated message accepted-edge agreement (6/6)PASS
proto3 JSON repeated message rejection agreement (6/6)PASS
proto3 JSON repeated message unknown field handlingPASS
proto3 JSON parse differential, string-key maps (n=200, seed=20260825)PASS
proto3 JSON print differential, string-key maps (n=200, seed=20260825)PASS
proto3 JSON string-key map accepted-edge agreement (8/8)PASS
proto3 JSON string-key map rejection agreement (8/8)PASS
proto3 JSON string-key map unknown enum name handlingPASS
proto3 JSON parse differential, integer and boolean map keys (n=200, seed=20260825)PASS
proto3 JSON print differential, integer and boolean map keys (n=200, seed=20260825)PASS
proto3 JSON integer and boolean map key accepted-edge agreement (8/8)PASS
proto3 JSON integer and boolean map key rejection agreement (8/8)PASS
proto3 JSON parse differential, message-valued maps (n=200, seed=20260825)PASS
proto3 JSON print differential, message-valued maps (n=200, seed=20260825)PASS
proto3 JSON message-valued map accepted-edge agreement (6/6)PASS
proto3 JSON message-valued map rejection agreement (6/6)PASS
proto3 JSON message-valued map unknown field handlingPASS
proto3 JSON parse differential, oneof fields (n=200, seed=20260825)PASS
proto3 JSON print differential, oneof fields (n=200, seed=20260825)PASS
proto3 JSON oneof accepted-edge agreement (10/10)PASS
proto3 JSON oneof rejection agreement (8/8)PASS
proto3 JSON oneof unknown enum name handlingPASS
proto3 JSON parse differential, optional fields (n=200, seed=20260825)PASS
proto3 JSON print differential, optional fields (n=200, seed=20260825)PASS
proto3 JSON optional accepted-edge agreement (10/10)PASS
proto3 JSON optional rejection agreement (8/8)PASS
proto3 JSON optional unknown enum name handlingPASS
proto3 JSON google.protobuf.Empty direct agreement (4/4)PASS
proto3 JSON google.protobuf.Empty field parse agreement (3/3)PASS
proto3 JSON google.protobuf.Empty field print agreement (2/2)PASS
proto3 JSON google.protobuf.Empty rejection agreement (4/4)PASS
proto3 JSON wrapper direct agreement (6/6)PASS
proto3 JSON parse differential, wrapper fields (n=200, seed=20260825)PASS
proto3 JSON print differential, wrapper fields (n=200, seed=20260825)PASS
proto3 JSON wrapper accepted-edge agreement (12/12)PASS
proto3 JSON wrapper rejection agreement (10/10)PASS
proto3 JSON Timestamp direct agreement (10/10)PASS
proto3 JSON parse differential, Timestamp fields (n=200, seed=20260825)PASS
proto3 JSON print differential, Timestamp fields (n=200, seed=20260825)PASS
proto3 JSON Timestamp accepted-edge agreement (15/15)PASS
proto3 JSON Timestamp rejection agreement (14/14)PASS
proto3 JSON Duration direct agreement (12/12)PASS
proto3 JSON parse differential, Duration fields (n=200, seed=20260825)PASS
proto3 JSON print differential, Duration fields (n=200, seed=20260825)PASS
proto3 JSON Duration accepted-edge agreement (12/12)PASS
proto3 JSON Duration rejection agreement (10/10)PASS
proto3 JSON FieldMask direct agreement (11/11)PASS
proto3 JSON parse differential, FieldMask fields (n=200, seed=20260825)PASS
proto3 JSON print differential, FieldMask fields (n=200, seed=20260825)PASS
proto3 JSON FieldMask accepted-edge agreement (12/12)PASS
proto3 JSON FieldMask rejection agreement (10/10)PASS
proto3 JSON parse differential, recursive messages (n=200, seed=20260825)PASS
proto3 JSON print differential, recursive messages (n=200, seed=20260825)PASS
proto3 JSON recursive accepted-edge agreement (8/8)PASS
proto3 JSON recursive rejection and depth-limit agreement (10/10)PASS
proto3 JSON parse differential, Struct family fields (n=200, seed=20260825)PASS
proto3 JSON print differential, Struct family fields (n=200, seed=20260825)PASS
proto3 JSON Struct, Value, and ListValue direct agreement (18/18)PASS
proto3 JSON Struct family accepted-edge agreement (17/17)PASS
proto3 JSON Struct family rejection agreement (18/18)PASS
proto3 JSON parse differential, descriptor message fields (n=200, seed=20260825)PASS
proto3 JSON print differential, descriptor message fields (n=200, seed=20260825)PASS
proto3 JSON descriptor message accepted-edge agreement (10/10)PASS
proto3 JSON descriptor message rejection agreement (10/10)PASS
proto3 JSON parse differential, Any messages (n=200, seed=20260825)PASS
proto3 JSON print differential, Any messages (n=200, seed=20260825)PASS
proto3 JSON Any accepted-edge agreement (12/12)PASS
proto3 JSON Any rejection agreement (9/9)PASS
proto3 JSON accepted-edge agreement (20/20)PASS
proto3 JSON rejection agreement (31/31)PASS
proto3 JSON parse differential, singular enums (n=200, seed=20260824)PASS
proto3 JSON print differential, singular enums (n=200, seed=20260824)PASS
proto3 JSON enum accepted-edge agreement (7/7)PASS
proto3 JSON enum rejection agreement (6/6)PASS
proto3 JSON unknown enum name handlingPASS
Google conformance, proto3 binary wire format and JSON (1476 passed, 0 failed; 1303 proto2 cases skipped, declared unsupported)PASS

hpack vs python-hpack

Sequential header blocks encoded by one implementation and decoded by the other, in both directions, with dynamic-table state carried across blocks. Plus RFC 7541 Appendix C unit vectors (see `units`).

CheckResult
python-hpack encode -> mojo decode (46 blocks, shared dynamic table)PASS
mojo encode -> python-hpack decode (46 blocks)PASS
compression ratio sanity (mojo 2821B vs python 2823B, within 25%)PASS
dynamic table size updates mid-stream (python-hpack -> mojo)PASS
multibyte UTF-8 header values roundtrip (python -> mojo)PASS

h2 vs hyper-h2 / hyperframe / h2spec

Frame codec cross-checked byte-for-byte against hyperframe in both directions. Live connections run against hyper-h2, which raises ProtocolError on any protocol violation by the peer. h2spec (the standard RFC 9113/7541 conformance tool) runs its full suite against our server.

CheckResult
parse hyperframe-built frames (all 10 types, 12 cases)PASS
byte-identical frame serialization vs hyperframe (12 cases)PASS
incremental decode at every split point (15 plans)PASS
one-byte chunks preserve 7 hyperframe framesPASS
coalesced input preserves 7 hyperframe framesPASS
seeded fragmentation of a 16 KiB hyperframe DATA framePASS
incomplete hyperframe suffix is retained without early outputPASS
connection startup accepts hyper-h2 bytes at every split point (76 plans)PASS
one-byte startup feeds preserve all 75 hyper-h2 bytesPASS
one-frame dispatch budget preserves hyperframe wire order and hyper-h2 outputPASS
process_frame reassembles hyper-h2 header blocks across one or more CONTINUATION framesPASS
process_frame preserves HPACK state and bounds live state across 4096 retired hyper-h2 streamsPASS
process_frame queues SETTINGS and PING acknowledgements matching hyper-h2PASS
process_frame matches hyper-h2 rejection of illegal CONTINUATION sequencesPASS
queued HEADERS and flow-controlled DATA are accepted by hyper-h2PASS
hyperframe decodes client startup with SETTINGS_ENABLE_PUSH=0PASS
hyperframe-built ENABLE_PUSH frames obey endpoint role rulesPASS
mojo client vs hyper-h2 server (200KB echo, strict validation)PASS
mojo client reassembles HEADERS+CONTINUATION (32KB header block) and padded DATAPASS
hyper-h2 client vs mojo server (50KB echo, strict validation)PASS
h2spec cleartext full run (146 tests, 146 passed, 0 skipped, 0 failed)PASS

net vs CPython sockets

1 MiB echo in both directions between grpc-mojo TCP and CPython sockets, including half-close (shutdown) and clean-EOF semantics.

CheckResult
mojo TCP server echoes 1MiB to python client + EOF semanticsPASS
mojo TCP client 1MiB roundtrip vs python server + EOF checkPASS
resolve() agrees with CPython getaddrinfo for localhostPASS
mojo UDP exchange vs CPython socket (send, recv, sender addr)PASS
mojo IPv6 TCP client 100KB roundtrip vs python ::1 serverPASS
mojo unix-socket server echoes 1MiB to CPython AF_UNIX clientPASS
mojo unix-socket client 1MiB roundtrip vs CPython serverPASS
one Poller event loop drains and echoes a burst of 20 CPython clientsPASS
Poller readiness sequence matches CPython selectorsPASS
ReadinessStream TCP partial I/O matches CPython socketsPASS
ReadinessStream Unix partial I/O matches CPython AF_UNIXPASS

tls vs CPython ssl

Live TLS connections with CPython on the other end in both roles: version negotiation, ALPN agreement and no-overlap behavior, chain and hostname verification, bulk transfer, and a bad-certificate corpus both implementations must reject.

CheckResult
mojo client vs CPython server: TLSv1.3, ALPN h2, 256KB echoPASS
Mojo client copies the verified CPython server leaf and typed SANs under TLS 1.3PASS
Mojo client copies the verified CPython server leaf and typed SANs under TLS 1.2PASS
Mojo server copies the verified CPython client leaf and typed SANs under TLS 1.3PASS
Mojo server copies the verified CPython client leaf and typed SANs under TLS 1.2PASS
Mojo server reports no peer certificate when CPython sends nonePASS
Mojo does not mark a CPython certificate verified when verification is disabledPASS
nonblocking Mojo client presents a trusted certificate chain to CPythonPASS
CPython rejects a Mojo client without a required certificatePASS
CPython rejects an untrusted Mojo client certificatePASS
CPython rejects a Mojo client certificate with server-only usagePASS
both reject a mismatched client certificate and key before connectPASS
encrypted client keys are rejected without an interactive promptPASS
Mojo server accepts a trusted CPython client certificate chain under TLS 1.3PASS
Mojo server rejects a CPython client without a required certificate under TLS 1.3PASS
Mojo server rejects an untrusted CPython client certificate under TLS 1.3PASS
Mojo server rejects a CPython client certificate with server-only usage under TLS 1.3PASS
Mojo server accepts a trusted CPython client certificate chain under TLS 1.2PASS
Mojo server rejects a CPython client without a required certificate under TLS 1.2PASS
mojo client negotiates TLSv1.2 with a 1.2-capped serverPASS
CPython verifying client vs mojo server: chain, hostname, ALPN, echoPASS
both reject an untrusted (self-signed) certificatePASS
both reject a hostname mismatch on a CA-signed certificatePASS
ALPN no overlap: our server alerts fatally, our client tolerates a server that proceeds withoutPASS
nonblocking Mojo handshake matches CPython TLS and ALPNPASS
partial Mojo TLS writes match CPythonPASS
partial Mojo TLS reads preserve WANT_READ against CPythonPASS
Mojo TLS write preserves WANT_WRITE under CPython backpressurePASS
clean close_notify returns EOF in Mojo and CPythonPASS
truncated TLS transport is rejected by Mojo and CPythonPASS
fatal session teardown does not contaminate the next nonblocking TLS sessionPASS
reset peers with rejected ALPN do not terminate the serverPASS

grpc vs grpcio

Behavioral compliance against the reference gRPC implementation in both directions: status-code mapping (all 16 codes), unicode/percent status details, ascii and binary (-bin) metadata in requests, initial response metadata and trailers, deadline (grpc-timeout) propagation, empty and 1 MB messages, sequential calls.

CheckResult
status-code mapping, all 16 codes + unicode/percent detailsPASS
request ascii metadata deliveredPASS
request binary metadata (-bin) deliveredPASS
initial response metadata receivedPASS
trailing metadata receivedPASS
trailing binary metadata decodedPASS
grpc-timeout propagated to grpcio deadline (2500ms sent)PASS
1MB unary echo via grpcio serverPASS
empty message echo via grpcio serverPASS
unicode payload echo via grpcio serverPASS
rich error model: grpc-status-details-bin decoded from grpcioPASS
client deadline enforced vs sleeping server (300ms -> DEADLINE_EXCEEDED)PASS
grpcio client: 1MB echo through mojo serverPASS
grpcio client: empty message through mojo serverPASS
blocking h2c handler receives no peer certificatePASS
grpcio deadline decoded by mojo server (3s sent)PASS
grpcio client metadata (ascii + -bin) visible in mojo handlerPASS
mojo server initial response metadataPASS
mojo server trailing metadataPASS
mojo server binary trailing metadata (-bin, unpadded emit)PASS
mojo handler error -> grpcio UNKNOWN + unicode detailsPASS
mojo server rich error (grpc-status-details-bin)PASS
unknown method -> UNIMPLEMENTED trailers-onlyPASS
10 sequential calls on one connectionPASS

grpc over TLS vs grpcio

TLS connections run in both directions with strict certificate verification and h2 ALPN negotiation. Client and server identity checks cover a trusted chain, no client certificate, and an untrusted certificate. Payloads cross the reference boundary through grpcio and grpc-mojo.

CheckResult
Mojo polling TLS server: trusted grpcio identity completes a 64 KiB echoPASS
Mojo polling TLS server: handler receives the verified grpcio client leaf and typed subject alternative namesPASS
Mojo polling TLS server: missing grpcio identity is rejected before handler dispatchPASS
Mojo polling TLS server: untrusted grpcio identity is rejected before handler dispatchPASS
Mojo polling TLS server: trusted identity recovers after rejected handshakesPASS
Mojo TLS client: 64 KiB unary echo via grpcio serverPASS
Mojo TLS client rejects a grpcio certificate hostname mismatchPASS
Mojo client certificate: trusted identity completes a 64 KiB grpcio echoPASS
Mojo client certificate: missing identity is rejected before handler dispatchPASS
Mojo client certificate: untrusted identity is rejected before handler dispatchPASS
grpcio TLS client: unary echo via Mojo serverPASS
Mojo TLS server: trusted grpcio identity completes a 64 KiB echoPASS
Mojo TLS server: handler receives the verified grpcio client leaf and typed subject alternative namesPASS
Mojo TLS server: missing grpcio identity is rejected before handler dispatchPASS
Mojo TLS server: untrusted grpcio identity is rejected before handler dispatchPASS
Mojo TLS server: trusted identity recovers after rejected handshakesPASS

GrpcTransport vs CPython sockets and ssl

The readiness wrapper transfers a large payload through CPython TCP and TLS peers with partial reads, partial writes, and would-block handling. TLS retries preserve the direction reported by OpenSSL across same-operation retries.

CheckResult
h2c partial I/O and would-block match CPython socketsPASS
TLS partial I/O preserves OpenSSL-reported retry directionPASS

PollingServer with grpcio and hyper-h2 external peers

Independent grpcio processes exercise supported unary behavior, while hyper-h2 drives edge cases and stricter policy grounded in the gRPC HTTP/2 wire grammar. The checks cover configured output limits, fairness, deadlines, rejected-request isolation, connection-cap recovery, half-close ordering, and retired stream ids.

CheckResult
16 grpcio processes complete 25 unary calls each while a partial preface stallsPASS
1 MiB grpcio unary response completes with a 64 KiB configured output limitPASS
grpcio observes empty unary, metadata, trailers, and handler UNKNOWNPASS
polling h2c handler receives no peer certificatePASS
an expired large response with a stalled reader does not spin the loopPASS
all four internal gRPC prefix split boundaries completePASS
wire grammar rejects compressed, multiple, and truncated unary inputPASS
protocol grammar enforces POST, content type, and registered routesPASS
idle grpc-timeout wakes the poller before invoking the handlerPASS
readable final bytes beat FIN and truncated FIN skips the handlerPASS
idle and incomplete peers leave a full cap, and 1 KiB emits both statusesPASS
oversized input recovers with one-frame turns and retired ids stay closedPASS

PollingServer TLS with grpcio and CPython ssl peers

Independent grpcio processes and CPython ssl exercise non-blocking TLS handshakes, strict h2 ALPN, certificate verification, handshake-cap recovery, large responses, and output backpressure.

CheckResult
8 grpcio TLS processes and a 1 MiB unary call complete beside a stalled handshakePASS
idle TLS grpc-timeout writes a deadline response without more peer inputPASS
TLS output backpressure does not spin or starve a healthy grpcio callPASS
ALPN, hostname, and trust failures are isolated from later TLS RPCsPASS
absolute handshake timeout frees a full connection cap without attacker closesPASS

Official gRPC interoperability vs grpcio

All 14 canonical interoperability cases run with grpc-mojo in both client and server roles over h2c, verified TLS, and Unix domain sockets. These rows and the published badge come from the same machine-readable result document.

CheckResult
grpc-mojo client vs grpcio server (h2c): empty_unaryPASS
grpc-mojo client vs grpcio server (h2c): large_unaryPASS
grpc-mojo client vs grpcio server (h2c): client_streamingPASS
grpc-mojo client vs grpcio server (h2c): server_streamingPASS
grpc-mojo client vs grpcio server (h2c): ping_pongPASS
grpc-mojo client vs grpcio server (h2c): empty_streamPASS
grpc-mojo client vs grpcio server (h2c): custom_metadataPASS
grpc-mojo client vs grpcio server (h2c): status_code_and_messagePASS
grpc-mojo client vs grpcio server (h2c): special_status_messagePASS
grpc-mojo client vs grpcio server (h2c): unimplemented_methodPASS
grpc-mojo client vs grpcio server (h2c): timeout_on_sleeping_serverPASS
grpc-mojo client vs grpcio server (h2c): cancel_after_beginPASS
grpc-mojo client vs grpcio server (h2c): client_compressed_unaryPASS
grpc-mojo client vs grpcio server (h2c): server_compressed_unaryPASS
grpc-mojo client vs grpcio server (TLS): empty_unaryPASS
grpc-mojo client vs grpcio server (TLS): large_unaryPASS
grpc-mojo client vs grpcio server (TLS): client_streamingPASS
grpc-mojo client vs grpcio server (TLS): server_streamingPASS
grpc-mojo client vs grpcio server (TLS): ping_pongPASS
grpc-mojo client vs grpcio server (TLS): empty_streamPASS
grpc-mojo client vs grpcio server (TLS): custom_metadataPASS
grpc-mojo client vs grpcio server (TLS): status_code_and_messagePASS
grpc-mojo client vs grpcio server (TLS): special_status_messagePASS
grpc-mojo client vs grpcio server (TLS): unimplemented_methodPASS
grpc-mojo client vs grpcio server (TLS): timeout_on_sleeping_serverPASS
grpc-mojo client vs grpcio server (TLS): cancel_after_beginPASS
grpc-mojo client vs grpcio server (TLS): client_compressed_unaryPASS
grpc-mojo client vs grpcio server (TLS): server_compressed_unaryPASS
grpc-mojo client vs grpcio server (Unix): empty_unaryPASS
grpc-mojo client vs grpcio server (Unix): large_unaryPASS
grpc-mojo client vs grpcio server (Unix): client_streamingPASS
grpc-mojo client vs grpcio server (Unix): server_streamingPASS
grpc-mojo client vs grpcio server (Unix): ping_pongPASS
grpc-mojo client vs grpcio server (Unix): empty_streamPASS
grpc-mojo client vs grpcio server (Unix): custom_metadataPASS
grpc-mojo client vs grpcio server (Unix): status_code_and_messagePASS
grpc-mojo client vs grpcio server (Unix): special_status_messagePASS
grpc-mojo client vs grpcio server (Unix): unimplemented_methodPASS
grpc-mojo client vs grpcio server (Unix): timeout_on_sleeping_serverPASS
grpc-mojo client vs grpcio server (Unix): cancel_after_beginPASS
grpc-mojo client vs grpcio server (Unix): client_compressed_unaryPASS
grpc-mojo client vs grpcio server (Unix): server_compressed_unaryPASS
grpcio client vs grpc-mojo server (h2c): empty_unaryPASS
grpcio client vs grpc-mojo server (h2c): large_unaryPASS
grpcio client vs grpc-mojo server (h2c): client_streamingPASS
grpcio client vs grpc-mojo server (h2c): server_streamingPASS
grpcio client vs grpc-mojo server (h2c): ping_pongPASS
grpcio client vs grpc-mojo server (h2c): empty_streamPASS
grpcio client vs grpc-mojo server (h2c): custom_metadataPASS
grpcio client vs grpc-mojo server (h2c): status_code_and_messagePASS
grpcio client vs grpc-mojo server (h2c): special_status_messagePASS
grpcio client vs grpc-mojo server (h2c): unimplemented_methodPASS
grpcio client vs grpc-mojo server (h2c): timeout_on_sleeping_serverPASS
grpcio client vs grpc-mojo server (h2c): cancel_after_beginPASS
grpcio client vs grpc-mojo server (h2c): client_compressed_unaryPASS
grpcio client vs grpc-mojo server (h2c): server_compressed_unaryPASS
grpcio client vs grpc-mojo server (TLS): empty_unaryPASS
grpcio client vs grpc-mojo server (TLS): large_unaryPASS
grpcio client vs grpc-mojo server (TLS): client_streamingPASS
grpcio client vs grpc-mojo server (TLS): server_streamingPASS
grpcio client vs grpc-mojo server (TLS): ping_pongPASS
grpcio client vs grpc-mojo server (TLS): empty_streamPASS
grpcio client vs grpc-mojo server (TLS): custom_metadataPASS
grpcio client vs grpc-mojo server (TLS): status_code_and_messagePASS
grpcio client vs grpc-mojo server (TLS): special_status_messagePASS
grpcio client vs grpc-mojo server (TLS): unimplemented_methodPASS
grpcio client vs grpc-mojo server (TLS): timeout_on_sleeping_serverPASS
grpcio client vs grpc-mojo server (TLS): cancel_after_beginPASS
grpcio client vs grpc-mojo server (TLS): client_compressed_unaryPASS
grpcio client vs grpc-mojo server (TLS): server_compressed_unaryPASS
grpcio client vs grpc-mojo server (Unix): empty_unaryPASS
grpcio client vs grpc-mojo server (Unix): large_unaryPASS
grpcio client vs grpc-mojo server (Unix): client_streamingPASS
grpcio client vs grpc-mojo server (Unix): server_streamingPASS
grpcio client vs grpc-mojo server (Unix): ping_pongPASS
grpcio client vs grpc-mojo server (Unix): empty_streamPASS
grpcio client vs grpc-mojo server (Unix): custom_metadataPASS
grpcio client vs grpc-mojo server (Unix): status_code_and_messagePASS
grpcio client vs grpc-mojo server (Unix): special_status_messagePASS
grpcio client vs grpc-mojo server (Unix): unimplemented_methodPASS
grpcio client vs grpc-mojo server (Unix): timeout_on_sleeping_serverPASS
grpcio client vs grpc-mojo server (Unix): cancel_after_beginPASS
grpcio client vs grpc-mojo server (Unix): client_compressed_unaryPASS
grpcio client vs grpc-mojo server (Unix): server_compressed_unaryPASS

Extraction isolation

Each package is staged into a scratch directory with only its declared dependencies (docs/ARCHITECTURE.md), then compiled and executed there. A package that reaches outside its dependency set fails this check. This is the mechanical proof behind independent open-sourcing.

CheckResult
`net` builds and runs staged with stdlib onlyPASS
`hpack` builds and runs staged with stdlib onlyPASS
`proto` builds and runs staged with stdlib onlyPASS
`tls` builds and runs staged with netPASS
`h2` builds and runs staged with hpack + net + tlsPASS
`grpc` builds and runs staged with h2 + hpack + net + proto + tlsPASS

Spec-vector unit suites

The repo's unit tests are themselves reference-anchored: protobuf goldens generated by Python protobuf, all RFC 7541 Appendix C vectors, and the grpcio interop suite.

CheckResult
unit test files (30/30 test files passed)PASS
interop suite (interop: 7 passed, 0 failed)PASS

h2_tls

CheckResult
mojo client vs CPython ssl + hyper-h2 server (80KB echo, ALPN h2)PASS
CPython ssl + hyper-h2 client vs mojo server (verified TLS, ALPN h2)PASS
both HTTP/2 roles reject TLS connections without negotiated h2 ALPNPASS
h2spec TLS full run (146 tests, 146 passed, 0 skipped, 0 failed)PASS

Environment

mojoMojo 1.0.0 (ed45d567)
python3.14.6
protobuf (reference for proto)7.35.1
grpcio (reference for grpc)1.83.0
hpack (reference for hpack)4.2.0
h2/hyper-h2 (reference for h2)4.4.1
hyperframe (reference for h2 frames)6.1.0
platformDarwin 27.0.0 arm64

Known gaps (tracked, not silent)