# rpc error: code = InvalidArgument desc = proto: User: field "email" is required

- **ID:** `go/grpc-failed-precondition-required-field`
- **Domain:** go
- **Category:** data_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

protoc-gen-validate (PGV) or the newer protovalidate rules rejected the message because a required field was empty. The server returns InvalidArgument with the validation message.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| github.com/envoyproxy/protoc-gen-validate 1.x | active | — | — |

## Workarounds

1. **** (90% success)
   ```
   if err := user.Validate(); err != nil {
    return fmt.Errorf("invalid user: %w", err)
}
resp, err := client.Create(ctx, user)
   ```
2. **** (85% success)
   ```
   st := status.New(codes.InvalidArgument, "validation failed")
br := &errdetails.BadRequest{FieldViolations: []*errdetails.BadRequest_FieldViolation{
    {Field: "email", Description: "required"},
}}
st, _ = st.WithDetails(br)
return nil, st.Err()
   ```

## Dead Ends

- **** — Removes all input safety checks and allows malformed data into downstream systems. (90% fail)
- **** — PGV rules like min_len:1 still reject empty strings; only non-empty values pass. (85% fail)
