---
name: go-backend-review
description: Go backend (net/http / gRPC / chi / gin / cobra) review — concurrency, error, interface, perf, test.
---

# Go Backend Review

## Ortak Doktrin

`agents/shared/severity-rubric.md` ve `agents/shared/escalation-matrix.md` default-load
sayılır (`agents/coordination.md` §11). Bu skill'in çıktısı **Critical / High / Medium /
Low + kanıt** formatında olmak zorunda — spekülatif Critical yasak. Sahiplik dışı bulgu
ilgili agent'a delege; karar yetkisi eşiği aşılırsa **kullanıcı onayı zorunlu**.

## Ne Zaman Kullanılır
- PR review öncesi self-check
- Yeni handler veya RPC service
- Race/leak şüphesi
- Performans regresyonu

## Workflow
1. **Statik tara**
   - `gofmt -l` boş
   - `go vet ./...`
   - `golangci-lint run` (varsa)
   - `go mod tidy` diff yok
   - `govulncheck ./...`
2. **Concurrency**
   - Goroutine leak: `wg.Wait()` + `ctx.Done()` + cancel zinciri
   - `context.Context` ilk parametre, "ctx" isim
   - Channel sahipliği: closer = sender; "double close" yok
   - `sync.Mutex` copy lint (`go vet -copylocks`)
   - `go test -race` paralel kod için zorunlu
3. **Error**
   - `_` ile error swallow yok
   - `fmt.Errorf("...: %w", err)` zincir
   - `errors.Is`/`errors.As`; string match (`strings.Contains(err.Error(), "...")`) yasak
   - Sentinel: `var ErrNotFound = errors.New("...")` export
   - `panic`/`log.Fatal` library kodunda yasak
4. **Interface**
   - Consumer-side tanım
   - Tek metod ise `-er` adı
   - "Just in case" interface yok (gerçek 2. impl yoksa açma)
   - `any` sadece generic uygun değilse
5. **HTTP/I/O**
   - `http.Server` timeout'ları (Read/Write/Idle) set
   - `http.DefaultClient` yasak; reuse'd client + `context.WithTimeout`
   - Middleware: recover + request id + structured log
   - JSON: stdlib OK; performans hassas yerde `easyjson`/`goccy`
6. **gRPC** (varsa)
   - Unary + stream interceptor: auth, log, recover, deadline
   - `codes.*` doğru semantik
   - Stream backpressure + `Recv`/`Send` error propagation
7. **DB**
   - `pgx`/`database/sql`: `*Context` variant'ları; `Tx.Rollback` defer
   - sqlc generated code commit + diff CI
   - Pool: `MaxOpenConns`, `MaxIdleConns`, `ConnMaxLifetime`
   - Migration: pressure-free (örn. concurrent index)
8. **Logging**
   - `log/slog` (Go 1.21+) structured; level kuralı
   - PII redact
   - `slog.ErrorContext(ctx, ...)` request id taşır
9. **Config / Bootstrap**
   - `init()` side-effect yok; explicit `New(...)`
   - Global mutable state yok
   - 12-factor: ENV → struct → validator (`go-playground/validator`)
10. **Test**
    - Table-driven, `t.Run`, `t.Parallel()`, `t.Helper()`
    - `testcontainers-go` integration
    - `httptest.Server` + `httptest.ResponseRecorder` handler test
    - Fuzz (`FuzzXxx`) parser/decoder yerlerinde

## Checklist
- [ ] gofmt + vet + lint yeşil
- [ ] go.mod tidy
- [ ] ctx ilk parametre
- [ ] Goroutine'in cancel + wait yolu var
- [ ] Error wrap (`%w`) + `errors.Is/As`
- [ ] HTTP server timeout'ları set
- [ ] DB pool tuned + ctx-aware
- [ ] slog structured + PII redact
- [ ] Race-test çalışır
- [ ] Coverage staged scope ≥ %70

## Antipattern
- `http.Get`/`http.DefaultClient` (timeout yok)
- `init()` içinde DB connect / config load
- Global mutable singleton
- `panic` library kodunda
- `fmt.Println` server kodunda
- `time.Sleep` retry için (jittered backoff yerine)
- `interface{}`/`any` her yere
- Receiver karışık (`func (s Server)` + `func (s *Server)` aynı tip)
- `context.Background()` request handler içinde (req.Context() varken)
- SQL string concat (`"WHERE id=" + userInput`)
- Goroutine ateşle-unut (`go fn()` cancel/wait yok)

## Örnek Agent Davranışı
```
User: /go-review internal/api/orders
Agent:
1. Read package
2. Detect: handler ctx-less, http.DefaultClient kullanım, goroutine leak
3. Detect: error string match (`if strings.Contains(err.Error(), ...)`)
4. Detect: orders_test.go t.Parallel() yok, single case
5. Output rapor + diff (errors.Is, ctx propagation, errgroup, table-driven test)
```

## Çıktı Formatı
```markdown
# Go Review: <path>

## Critical/High/Medium/Low
## Diff (özet)
## Test eksiği
```
