# proto: required field "pb.User.id" not set

- **ID:** `go/proto-required-not-set`
- **Domain:** go
- **Category:** data_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

A proto2 message with required fields was marshalled or unmarshalled without setting all required fields. Proto3 does not have required fields, so this is proto2-specific.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| google.golang.org/protobuf 1.29+ | active | — | — |

## Workarounds

1. **** (95% success)
   ```
   Set all required fields before marshalling:
msg := &pb.User{Id: "123", Name: "alice"} // all required fields populated
b, err := proto.Marshal(msg)
   ```
2. **** (90% success)
   ```
   Use proto.CheckInitialized to validate before sending:
if err := proto.CheckInitialized(msg); err != nil { return status.Error(codes.InvalidArgument, err.Error()) }
   ```

## Dead Ends

- **** — DiscardUnknown only affects unknown fields; missing required fields are still validated and rejected. (90% fail)
- **** — Changing syntax changes field presence semantics; existing callers relying on required-field enforcement silently accept partial messages. (75% fail)
