agent-gateway 全レイヤーリファクタリング — Clean Architecture 適用と Conflict 解消
agent-gateway の全レイヤー(knowledge / llm / obsidian / pipeline domain、infra、transport)を Clean Architecture に沿ってリファクタした記録。ctree rev 0007-0032 の25リビジョン、5セッションにわたる作業。
結論
v3 リデザインでドメイン分割が完了した agent-gateway に対し、全レイヤーの Clean Architecture 適用リファクタを実施した。3月17日から23日にかけて5セッション、ctree rev 0007 から 0032 の約25リビジョンで完了。knowledge / llm / obsidian / pipeline の4ドメイン、infra 層、transport 層を一括で整理した。
前提
- v3 リデザインで
pipeline.knowledge.*をllm/obsidian/mlflowの3ドメインに分割済み
フェーズ1: knowledge domain リファクタ後の llm domain リファクタ
3月17日、前セッションで knowledge domain のリファクタが完了した後、llm domain のリファクタに着手した。
ctree check で Go の最新リビジョンが 0007 であることを確認してから作業を開始。serena のオンボーディング情報(5つのプロジェクトメモリ)を読み込み、プロジェクトの設計方針を把握した上で実装に入った。
llm domain のリファクタは knowledge domain で確立したパターンに合わせる形で進めた。domain 層はビジネスロジックのみを持ち、外部依存は infra 層に押し込む Clean Architecture の依存ルールに従った整理が目標だった。
フェーズ2: obsidian domain リファクタと重複イベント名の修正
同日 15:05、obsidian domain のリファクタを進めた。
このセッションで指摘が入ったのは2点。
obsidian domain の設計
Obsidian vault は複数運用しており、差し替え可能な repo 構成を前提にするべきという方針を確認した。internal/domain/obsidian/service.go の振る舞い(L18-25)が正しい設計になっているかを ctree の依存情報を使って確認した。
重複イベント名の問題
internal/domain/knowledge/service.go(L42-44)にイベント名の重複が存在していた。NATS トピックへの publish で使うイベント名が同一になっているため、Dagster 側でのメッセージ振り分けが不明確になる問題だった。
ctree rev 0018 から 0019 の変更差分を確認すると RerankRequest、RerankItem、RerankResult の3つの型が context_enricher.go に新規追加されていた。
obsidian domain を「複数 vault を差し替え可能なリポジトリ構成」として再設計し、イベント名重複を解消した。
フェーズ3: pipeline entity の削除と infra リファクタ
同日 15:38 に ctree check を実行。Go の rev 0020 から 0021 で以下の変更を検出した。
internal/domain/pipeline/entity.goからtype Task、type JobStatus、type Jobの3シンボルが削除
これらの型は pipeline domain から削除されており、infra 層の実装に影響する変更だった。削除の意図は domain 層を薄くし、pipeline の状態管理を外部サービス(NATS JetStream / Dagster)に委譲する設計変更。
その後 @infra ディレクトリを対象として infra 層の確認と整理を進めた。
フェーズ4: transport layer リファクタ
同日 17:07、domain と infra のリファクタが rev 10 から一通り完了した時点で、transport layer のリファクタに移行した。
ctree check で Go が 0032(変更なし)であることを確認してから開始。transport layer は internal/transport/http/ 以下に位置し、Gin ルーティング、ハンドラー、ミドルウェアを含む。
pkg/anthropic/ の型定義(ContentBlock、ImageSource、Tool、ToolChoice、Usage、Metadata 構造体)をベースラインとして確認した上で、transport layer のハンドラーが domain 層のインターフェースを正しく呼び出しているかを整理した。
transport layer のリファクタでは以下を実施した。
- ハンドラーが domain サービスのインターフェースに対して依存するよう修正
- リクエスト / レスポンスの DTO 変換を transport 層に閉じ込める
- ミドルウェアのコンテキスト伝播(CorrelationID)が domain 層まで届かないよう境界を明確化
フェーズ5: conflict によるテスト不一致の修正
3月23日、複数のセッションをまたいだリファクタの結果として conflict が発生し、テストケースとコードが不一致になった。
ドメイン型やインターフェースの変更がテストファイルに反映されておらず、コンパイルエラーまたはテスト失敗が複数箇所に発生していた。
serena の find_symbol / find_referencing_symbols を使って不一致箇所を特定し、修正を進めた。
- 削除 / 改名されたシンボルへの参照をテストファイルで更新
- リファクタで変わったインターフェースシグネチャにテストのモックを合わせる
- infra 層の変更に追随していなかった統合テストの修正
結果
3月17日から23日の5セッションで agent-gateway の全レイヤーリファクタを完了した。
| レイヤー | 変更内容 |
|---|---|
| knowledge domain | リランク型の整理(RerankRequest / RerankItem / RerankResult) |
| llm domain | Clean Architecture に沿った依存整理 |
| obsidian domain | 複数 vault 差し替え可能な設計に再構成 |
| pipeline domain | Task / JobStatus / Job 型の削除(外部サービスへの委譲) |
| infra | domain 変更に追随した adapter 更新 |
| transport | ハンドラーの domain インターフェース依存への整理 |
ctree の rev 追跡により、各セッションで何が変更されたかを明確に把握しながらリファクタを進めることができた。rev 0007 から 0032 の約25リビジョンがこのリファクタシリーズに対応している。
