# rpc error: code = Internal desc = grpc: failed to send message on stream: stream closed

- **ID:** `go/grpc-stream-send-on-closed`
- **Domain:** go
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

The client or server called Send on a stream after it was closed (CloseSend called, server returned, or context canceled). Writes to a terminal stream are rejected.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| google.golang.org/grpc v1.42+ | active | — | — |

## Workarounds

1. **** (80% success)
   ```
   stream, err := client.Upload(ctx)
if err != nil { return err }
for _, m := range msgs {
    if err := stream.Send(m); err != nil {
        stream, err = client.Upload(ctx) // reopen
        if err != nil { return err }
    }
}
   ```
2. **** (85% success)
   ```
   defer stream.CloseSend()
// ensure all Send calls complete before CloseSend runs
   ```

## Dead Ends

- **** — A closed stream cannot be reopened; the same stream handle remains terminal. (90% fail)
- **** — Closure is a state, not a timing race; sleeping does not reopen the stream. (85% fail)
