Protobuf Grpc API Review
GitHubOfficialFirst committed by MnilaxDistributed by GitHub
- Skill
- Review and audit
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured methodology for reviewing .proto and gRPC changes to ensure long-term API stability. It guides users through evaluating changes across binary wire formats, JSON/text representations, generated source code, and runtime RPC behavior. By emphasizing mixed-version scenarios and rollout safety, it helps prevent production failures caused by schema evolution, field number reuse, or breaking changes in service contracts.
What it does
- Analyzes .proto diffs for binary, JSON, and source-level compatibility.
- Evaluates gRPC service changes including method identity, streaming, and status codes.
- Traces risks in mixed-version deployments and rollback scenarios.
- Provides a standardized format for reporting findings with severity levels.
- Enforces best practices like field reservation and additive evolution.
- Validates retry policies, deadline propagation, and idempotency requirements.
When to use it
- When reviewing pull requests that modify .proto files or gRPC service definitions.
- When planning schema migrations or deprecating fields and methods.
- When diagnosing cross-version failures or data corruption in distributed systems.
- When assessing the impact of changing field types, cardinality, or presence rules.
Advantages
- Reduces the risk of production outages caused by breaking API changes.
- Ensures consistent handling of wire-format and JSON-transcoded data.
- Provides clear, evidence-based findings for complex schema evolutions.
- Promotes safe, staged rollout patterns for distributed services.
Usage examples
- “Review this proto diff where a field was moved into a oneof block.”
- The agent identifies the potential for data loss during read-modify-write cycles and recommends a safe migration path using a new field instead.
- “Is it safe to change this int32 field to an int64?”
- The agent flags the change as rollout-dependent, explaining the risks of value truncation for old readers and suggesting a staged migration strategy.
- “Review this new gRPC method for retry safety.”
- The agent evaluates the method's idempotency, checks for proper deadline propagation, and verifies that status codes are used correctly.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/github/protobuf-grpc-api-review/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip protobuf-grpc-api-review.zip -d .agents/skills
Documentation by Mnilax
Protobuf and gRPC API Review
Review .proto and related gRPC changes as long-lived contracts. Distinguish what the wire format permits from what generated clients, JSON users, stored data, and mixed-version deployments can safely tolerate.
Start With the Compatibility Envelope
Before deciding whether a change is safe, determine:
the old and new schema, not only the final file
whether payloads use binary protobuf, ProtoJSON, text format, or more than one encoding
whether messages persist in databases, queues, logs, caches, or events
whether clients exist outside the repository or release independently
the protobuf syntax or edition and the generated languages/runtime versions
whether HTTP/JSON transcoding, reflection, service config, or schema registries expose the contract
the deployment order, rollback window, and duration of mixed-version operation
If context is missing, state the assumption and lower confidence. Do not call a change backward-compatible from the new schema alone.
Review Workflow
1. Inventory Contract Changes
Compare the old and new definitions by fully qualified symbol. Record:
message fields: number, name, type, cardinality, presence,
oneof, defaults, and relevant optionsenums: value name, number, aliases, reservations, and zero value
services: package, service, method, request and response types, and streaming mode
generated API inputs: package options, outer class names, namespaces, and custom options
Ignore formatting-only changes after confirming they do not alter descriptors or generated APIs.
2. Evaluate Four Compatibility Dimensions
Assess each affected symbol independently:
Binary wire — can old and new readers parse both old and new bytes without corruption or loss?
Named formats — do ProtoJSON, text-format, REST-transcoded, or name-based consumers still work?
Source and generated API — will regenerated clients compile and preserve presence, enum, and accessor behavior?
Behavior and operations — do status codes, retry safety, deadlines, authorization, streaming, and resource bounds preserve the RPC contract?
Read protobuf compatibility rules for field, enum, presence, oneof, and serialization changes. Read gRPC contract review when services, methods, or runtime behavior change.
3. Trace Mixed-Version Scenarios
For every non-trivial change, reason through these paths:
old writer -> new reader
new writer -> old reader
old reader modifies and reserializes a new message
rollback after new writers have emitted new values
persisted old data read after the migration
For conditionally compatible changes, identify the exact writer constraint and the point at which it may be relaxed. A safe rollout commonly requires deploying readers before writers and retaining the old field or method until rollback is no longer needed.
4. Review Repository Evidence
Use the repository's own tooling when available:
compile descriptors with the project's
protoc, Buf, Gradle, Maven, Bazel, or language-specific taskrun configured breaking-change or lint checks
inspect generated-code diffs only when they are committed by repository convention
search call sites for exhaustive enum switches, presence assumptions, JSON field names, method paths, status handling, and retry configuration
look for compatibility fixtures or descriptor baselines before proposing a new mechanism
Do not claim a check passed unless you ran it. If a required tool or baseline is unavailable, name the unverified risk.
5. Produce an Actionable Review
Lead with one verdict:
Compatible — safe within the stated compatibility envelope
Rollout-dependent — parseable, but safe only with explicit sequencing or value constraints
Breaking — causes wire, named-format, source, or behavioral incompatibility
Insufficient context — the old schema, encoding, consumers, or deployment model is unknown
Then provide only evidence-backed findings. For each finding include:
[severity] Short title
Location: file and symbol or changed lines
Dimension: binary | JSON/text | source | behavior/operations
Change: old contract -> new contract
Impact: concrete failing mixed-version scenario
Remediation: smallest safe schema change or staged migrationUse blocker for corruption, unparsable data, tag reuse, or an unavoidable production break; high for likely cross-version data loss or unsafe RPC behavior; medium for bounded compatibility or operability risks; and low for maintainability issues that do not break the contract. Do not inflate style preferences into compatibility findings.
Conclude with:
a compact compatibility matrix for changed symbols
the rollout/rollback sequence if migration is required
targeted tests that would prove the remaining assumptions
Default Safety Principles
Never reuse a field or enum number, even after deletion; reserve deleted numbers and usually names.
Treat field-number changes and moving fields into an existing
oneofas breaking.Treat type and cardinality changes as migrations, even when their binary wire types are compatible.
Remember that adding a field or enum value can still break generated code or exhaustive consumers.
Review ProtoJSON separately: names and unknown-field behavior make its compatibility envelope narrower than binary protobuf.
Preserve unknown fields through read-modify-write paths when forward compatibility depends on them.
Prefer additive evolution: add a new field or RPC, migrate readers and writers, deprecate the old contract, then remove it only after the compatibility window closes.
Never recommend retries for a state-changing RPC without establishing idempotency or a deduplication mechanism.
Require realistic client deadlines and cancellation-aware server work for production RPCs.
Avoid False Positives
Do not require every service to use streaming, retries, health checks, or HTTP transcoding.
Do not flag a new optional field as breaking solely because old clients ignore it.
Do not call a wire-compatible type change safe without checking value ranges and rollout order.
Do not assume a renamed field is harmless when JSON, text format, reflection, or generated source APIs are consumers.
Do not demand reservations for fields that never shipped; ask for release history when that distinction matters.
Files
- ATTRIBUTION.mdAdded by AutoGineer877 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md6.7 KiB
- references/grpc-contract-review.md5.6 KiB
- references/protobuf-compatibility.md6.4 KiB
references/grpc-contract-review.md
gRPC Contract Review
Use this reference when a change affects a service, method, request/response behavior, or client/server policy. Apply only the checks relevant to the change.
Method Identity and Shape
The fully qualified package, service, and method form the RPC identity. Renaming or moving any of them changes the method path and breaks existing clients, routing, authorization policies, observability, and service configuration.
Treat these as breaking contract changes:
removing or renaming a service or method
changing request or response message type
changing unary, client-streaming, server-streaming, or bidirectional-streaming mode
moving a service to another protobuf package
Prefer adding a new method, migrating callers, deprecating the old method, and removing it only after the compatibility window closes. Review request and response message changes with the protobuf compatibility rules.
Deadlines and Cancellation
Clients should set a realistic deadline; gRPC does not set one by default.
The deadline must cover expected network and processing latency and be validated against production or load-test evidence.
Servers must stop spawned work when the call is cancelled or its deadline expires.
Downstream calls should receive the remaining deadline rather than starting a fresh full timeout. Confirm whether propagation is automatic or must be enabled in the implementation language.
Do not convert a deadline or cancellation into a misleading application status.
Flag new unbounded calls, swallowed cancellation, or downstream work that can outlive the originating request when they create resource or correctness risk.
Retries and Idempotency
Before recommending or approving a retry policy, answer:
Can the operation be repeated without duplicating a state change?
If the result is ambiguous, is there an idempotency key or server-side deduplication window?
Which status codes are retryable for this method?
Are attempts bounded by max attempts, exponential backoff, jitter, throttling, and the overall deadline?
Are retry attempts and final call outcomes observable?
Retries are enabled in gRPC implementations, but there is no default general retry policy; transparent retries can still occur in limited cases. A response header commits the RPC and ends gRPC retry attempts. Never treat a mutating RPC as retry-safe merely because it returns UNAVAILABLE or DEADLINE_EXCEEDED: the server may already have applied the change.
Status Codes Are Part of the API
Review status changes as observable behavior. Prefer the most specific stable code and keep error details free of secrets.
INVALID_ARGUMENT: invalid regardless of system stateFAILED_PRECONDITION: retry only after state is explicitly fixedABORTED: retry the larger transaction or read-modify-write sequenceUNAVAILABLE: transient failure where retrying this call may be appropriateRESOURCE_EXHAUSTED: quota or capacity exhaustedUNAUTHENTICATED: credentials are missing or invalidPERMISSION_DENIED: authenticated caller lacks permissionNOT_FOUND: resource does not exist, or deliberate existence hiding is part of the authorization contract
Avoid replacing domain failures with UNKNOWN or INTERNAL. Check client logic, retry policies, metrics, and alerts before changing an established code.
Streaming Contracts
For streaming methods, establish and test:
message ordering and whether duplicates are possible
half-close and completion semantics
backpressure and bounded buffering
per-message and total stream size limits
cancellation and cleanup on both peers
authentication lifetime for long-lived streams
resume, replay, or checkpoint behavior after interruption
Do not add streaming as a default improvement; require a concrete need and an explicit lifecycle contract.
Security and Resource Boundaries
Enforce authentication and authorization per method; update policy maps that enumerate paths whenever a method is added.
Use transport security appropriate to the deployment, and avoid logging credentials or sensitive metadata.
Bound request size, response size, concurrency, fan-out, and expensive repeated fields where input is untrusted.
Validate before starting irreversible or costly work.
Check that reflection, health services, and debug endpoints are exposed only as intended.
Behavioral Evolution
Schema compatibility does not protect semantic contracts. Review changes to:
required business fields represented as optional protobuf fields
pagination tokens, ordering, filters, and consistency guarantees
idempotency and deduplication keys
partial success and batch error semantics
default limits, quotas, and server-side timeouts
error details and redaction
For a behavioral change, require documentation and tests that cover old clients during rollout and rollback.
Targeted Verification
invoke old generated clients against the new server and new clients against the old server when mixed versions are supported
test the exact method path through proxies, gateways, and authorization middleware
exercise deadlines, cancellation, and downstream propagation
inject retryable and non-retryable failures, including an ambiguous failure after a state change
test streaming cancellation, slow consumers, large messages, and interrupted streams where applicable
verify metrics distinguish attempts from logical calls
Primary References
Requirements and compatibility
Written for: GitHub Copilot
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- First committed by
Mnilax
- Publisher
- GitHub (Official)
- Distributed by
- GitHub
- Source
- github/awesome-copilot · skills/protobuf-grpc-api-review · commit 797337f
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- Mnilax
AutoGineer is not affiliated with or endorsed by Mnilax or GitHub.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download protobuf-grpc-api-review.zip