# rpc error: code = Aborted desc = SendMsg called after CloseSend

- **ID:** `go/grpc-aborted-streaming-write`
- **Domain:** go
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

Client streaming code calls stream.Send after stream.CloseSend() or after the server already sent a terminal status, violating the client-stream state machine.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| 1.x | active | — | — |

## Workarounds

1. **** (92% success)
   ```
   for _, item := range items {
  if err := stream.Send(item); err != nil {
    return fmt.Errorf("send: %w", err)
  }
}
if err := stream.CloseSend(); err != nil { return err }
resp, err := stream.CloseAndRecv()
   ```
2. **** (85% success)
   ```
   if err := stream.Context().Err(); err != nil {
  return err
}
stream.Send(item)
   ```

## Dead Ends

- **** — Stream is already closed; subsequent sends keep returning Aborted. (90% fail)
- **** — Streams are single-use; a new client.Upload(ctx) call is required. (85% fail)
