| name | bp-go |
| description | Alt の Go 規約を適用する。エラーラップ、context 第一引数、slog、テーブル駆動テスト、http.Server の 4 タイムアウト、Redis Streams の XACK/XAUTOCLAIM 対、fail-fast 設定を扱う。Go のコードを書く・直す・レビューするときに使う。ユーザが「Go」や規約名に触れなくても、Go サービス(alt-backend, auth-hub, pre-processor, search-indexer, mq-hub, rag-orchestrator, altctl)の実装・修正に入るなら使う。 |
| paths | ["**/*.go"] |
Go Best Practices
以下はタスク全体を通じて有効な規約であり、一度読んで終わる手順ではない。Go コードを書くたびに適用する。
詳細な根拠とコード例が必要になった時点で docs/best_practices/go.md の該当セクションだけを Read する
(全 17 セクション・725 行あるため全文読み込みはしない)。
重要原則
- エラーラップ必須:
fmt.Errorf("action: %w", err) でコンテキスト付きラップ。裸の return nil, err 禁止
- main.go は薄く: config 読込 → deps 接続 → handler 配線 → server 起動 → signal 待機。ビジネスロジック禁止
- context.Context は第一引数: I/O を行う全関数で
ctx context.Context を第一引数に。構造体フィールドに保持しない
- slog 構造化ログ:
log パッケージ不可。slog.With("key", value) でキー付きログ
- テーブル駆動テスト:
[]struct{ name string; ... } + t.Run(tt.name, ...) パターン。testify/assert 使用
- defer で解放:
Close(), Unlock(), cancel() は取得直後に defer
- internal/ パッケージ: 公開 API でないものは
internal/ に配置
- エラー分岐は errors.Is/As:
err.Error() の文字列比較禁止
- http.Server は 4 タイムアウト明示:
ReadHeaderTimeout/ReadTimeout/WriteTimeout/IdleTimeout。裸の ListenAndServe 禁止
- Redis Streams: XACK は durable 書き込み後のみ。XREADGROUP には XAUTOCLAIM 回収ループが必須ペア(→
.claude/rules/event-stream-consumer.md)
- retry 中の裸 time.Sleep 禁止:
select + ctx.Done() + jitter 付き backoff
- fail-fast 設定: 必須 config 欠落は起動失敗。無言 no-op / nil-guard フォールバック禁止(→
.claude/rules/di-wiring.md)
- DB 書き込みの silent success 禁止: トランザクションは無条件
defer tx.Rollback(ctx)。行の存在を前提とする UPDATE は rows_affected == 0 をエラーに
- time.Duration に untyped int 禁止:
15 * 1000 は 15µs(ナノ秒解釈)。必ず 15 * time.Second の単位定数を掛ける
- streaming はタイムアウト例外 + Accept-Encoding 手動設定禁止: streaming server は
WriteTimeout: 0、streaming client は http.Client.Timeout: 0 + context deadline。Accept-Encoding を手動設定すると透過 gzip 解凍が無効化される
参照
完全なベストプラクティスは docs/best_practices/go.md を参照。
セクション: Project Structure, Error Handling, Concurrency, Context, Logging, Testing, Database, HTTP/API, Configuration