Current Architecture & Design Baseline

Local AI Foundry

契約駆動型マルチエージェント・コンテンツ生産基盤
現状設計書 — 2026年7月15日時点

入力正規化:実装済み Planning / Research契約:実装済み Writing成果物検査:検証中 Writing DTO:次フェーズ

1. エグゼクティブサマリー

本システムは、Dify上の複数AIエージェント、n8n、ComfyUIを連携させ、記事・X投稿・タグ・画像を一体の成果物パッケージとして生成するローカルAI基盤である。

本日の最大の到達点:「AIの出力内容は自由でも、工程間の搬送形式は契約で固定する」という方針を、入力正規化・DTO・契約整形・契約ゲートとして実装へ落とし始めた。
7役割ベースのAI工程
19現時点のWorkflowノード数
18現時点のエッジ数
2固定回帰テストケース A/B

従来は「Workflowが正常終了したか」が成功判定の中心だった。しかし、Planning / Researchが部分スキーマしか返さなくてもWritingが偶然本文を作り、空のX投稿や無関係な固定タグを含む成果物が成功扱いされる事象が発生した。これを契機に、工程成功・契約成功・成果物成功を分離して扱う設計へ移行している。

2. 目的・スコープ

目的

ローカル環境で、複数のAIエージェントが担当工程を分担し、再現性・監査性・拡張性を備えたコンテンツ生産ラインを構築する。

現在の主な成果物

テキスト成果物

記事本文、X投稿、タグ、画像生成プロンプト、メタデータ。

証跡成果物

handoff trace、artifact、logs、各工程DTO、契約状態、正規化履歴。

外部連携

Dify → n8n → ファイル保存 / ComfyUI画像生成。

将来拡張

SEO、動画、翻訳、YouTube、SNS展開などの追加Agent。

3. 設計原則

意味は自由、構造は厳格

Agentが何を主張するかは役割の範囲内で自由。ただし、機械が読むキー・型・階層はIF契約に従う。

生LLM出力を直結しない

後続工程はraw textではなく、契約整形済みDTOだけを参照する。

整形と意味生成を分離

Normalizeは階層・型・既定の空値を整える。欠けた調査結果や成功条件を勝手に作文しない。

失敗を成功に見せない

固定タグ、別項目からの意味転用、過剰な救済パースで異常を隠さない。

工程ごとの品質ゲート

PlanningがfailedならResearchへ進めず、ResearchがfailedならWritingへ進めない。

Workflow成功 ≠ 成果物成功

記事・X投稿・タグ等の最低限成果物が揃って初めてパッケージ成功とする。

4. 全体アーキテクチャ

Startユーザー入力 入力正規化明示デフォルト 01 Planning企画 Planning DTONormalizeraw / normalized / contract PlanningContract Gate 02 Research調査 Research DTONormalizeraw / normalized / contract ResearchContract Gate 03 Writing記事 / X / Tags 04 Reviewレビュー判定 05–06修正 / 画像系工程 07 Audit最終監査 Package Output成果物最低限チェック n8n保存・実行連携 ComfyUI画像生成 Fail / Human Check契約違反・空成果物
AI AgentNormalize / DTOContract Gate成果物停止・要確認

5. 役割・責務

工程主責務やってはいけないこと現状
入力正規化Start入力をWorkflow内部の確定値へ変換topicを勝手に生成する実装済み
01 Planning企画、成功条件、構成、Researchへの問いを作るhandoffだけを返して外側DTOを省略する契約化済み
02 Research調査結果、確認事項、リスク、Writing材料を作る企画情報を確認済み事実として転用する契約化済み
03 Writing記事・X投稿・タグ・画像プロンプトを生成本文だけ出して成果物一式を空で通す安定化中
04 Review成果物を評価し、修正要否を判定本文や付随成果物を勝手に上書きする専用DTO導入済み
05–06必要な修正・画像関連の中間処理前工程の契約違反を隠す既存実装
07 Audit最終品質・禁止事項・証跡を監査成果物を上書きして辻褄を合わせる専用DTO導入済み
Package Output成果物と証跡を組み立て、最低条件を検査固定タグや意味フォールバックで空を埋める最終防波堤を追加中

6. 入力正規化設計

UI入力は任意欄を含むが、Workflow内部ではStart直後の入力正規化ノードで確定値にする。後続はStart Nodeを直接読まず、正規化済み値を参照する。

項目ユーザー未指定時空許容備考
topicデフォルトなし不可空ならPlanning前にfailed
target_reader一般層内部では不可明示デフォルト
tone標準内部では不可ユーザー指定優先
article_length2000字前後内部では不可ユーザー指定優先
{
  "original": {"target_reader": "", "tone": "", "article_length": ""},
  "normalized": {
    "target_reader": "一般層",
    "tone": "標準",
    "article_length": "2000字前後"
  },
  "defaults_applied": ["target_reader", "tone", "article_length"]
}

7. DTO / IF設計

DTO(Data Transfer Object)は、Agent間の受け渡し専用データ構造であり、内部API仕様に相当する。

required と empty_allowed は別概念。
キーが存在していても、必須文字列が空、必須配列が空なら契約違反になり得る。
属性意味
typestring / array[string] / object など、機械処理上の型
requiredキーまたは項目の存在が必須か
empty_allowed空文字・空配列・空objectを許すか
used_by実際に参照する後続ノード
violation_action正規化、警告、failedのどれにするか

整形ノードの論理出力

{
  "raw": { "...": "LLMが実際に返した内容" },
  "normalized": { "...": "規格化されたDTO" },
  "contract": {
    "status": "ok | normalized | failed",
    "schema_valid_before_normalization": false,
    "missing_required": [],
    "defaulted_optional": [],
    "fallback_from_start": [],
    "moved_fields": [],
    "invalid_types": [],
    "notes": []
  }
}

8. Planning DTO契約

fieldtype必須空可違反時
stagestringYesNo欠落はnormalized、異なる値はfailed
task_summarystringYesNostart.topicから補完可
target_readerstringYesNo入力正規化値から補完
tonestringYesNo入力正規化値から補完
article_lengthstringYesNo入力正規化値から補完
success_criteriaarray[string]NoYes[]へ正規化。意味生成禁止
sectionsarray[string]NoYes[]へ正規化
assumptionsarray[string]NoYes[]へ正規化
handoffobjectYesNo子項目を取得不能ならfailed
handoff.research_questionsarray[string]YesNoトップレベルから移動可。空ならfailed
handoff.writing_requirementsarray[string]YesNoトップレベルから移動可。空ならfailed
handoff.image_directionstringNoYes""へ正規化

9. Research DTO契約

fieldtype必須空可違反時
stagestringYesNo欠落はnormalized、異なる値はfailed
research_summarystringYesNo他項目からの転用禁止。空ならfailed
confirmed_pointsarray[string]NoYes[]へ正規化
local_or_general_knowledgearray[string]NoYes[]へ正規化
needs_external_verificationarray[string]NoYes[]へ正規化
source_notesarray[string]NoYes[]へ正規化
risksarray[string]NoYes[]へ正規化
handoffobjectYesNo主要材料なしならfailed
handoff.usable_materialarray[string]YesNoトップレベルから移動可。空ならfailed
handoff.claims_to_avoidarray[string]NoYes[]へ正規化
禁止された意味転用:
research_summary = planning.task_summary
confirmed_points = planning.success_criteria
どちらも意味が異なり、調査結果を捏造するため削除対象となった。

10. 契約整形・契約ゲート

契約状態

status条件後続
okrawが最初から期待スキーマ・型・階層を満たす進行
normalizedstage欠落、handoff階層移動、任意項目空値化、確定入力値による補完進行可能。証跡・警告を残す
failedJSON解釈不能、異なるstage、必須項目空、必須配列空、修復不能な型異常次のAgentへ進ませない

ゲート配置

Planning Agent
  → Planning Normalize
  → Planning Contract Gate
  → Research Agent
  → Research Normalize
  → Research Contract Gate
  → Writing Agent

Planning failed時にResearchを走らせない。Research failed時にWritingを走らせない。これにより、壊れた部分情報を後続が「それっぽく」利用して成果物を作るサイレントフェイルを防ぐ。

11. Writing / Package Output

Planning / Research契約が正常でも、Writingが空成果物を返すケースが確認された。Package Outputに最低限チェックを置き、空の正常成果物を禁止する。

成果物最低条件不正例
article_markdownstring、trim後に空不可""
x_postsarray[string]、1件以上、空要素不可[], ["x_posts"]
tagsarray[string]、1件以上、空要素不可[], ["tags"], 別テーマ固定タグ
現在の位置づけ:Package Output検査は最終防波堤。恒久的にはWriting直後にWriting DTO Normalize / Contract Gateを追加し、Review前に止める。

Writingで確認された問題

  • 長い記事本文を先に出すJSONでは、後半のX投稿・タグが崩れやすい。
  • 救済パースが配列の値ではなく、"x_posts" / "tags"というキー名を拾った。
  • Package Outputの固定レトロゲームタグが、欠落を隠して正常に見せた。

採用した暫定対策

  • Writing出力順を短い配列(X投稿・タグ)先、長文記事最後へ変更。
  • 救済配列抽出のキー名混入バグを修正。
  • 固定タグフォールバックを削除。
  • 記事・X投稿・タグが空ならPackageでfailed。

12. 証跡・監査

契約整形により、元のAgent出力と後続が参照したデータを区別して残す。

情報目的
rawLLMが実際に返した内容。原因追跡とモデル挙動確認。
normalized後続が参照した規格DTO。
contract.statusok / normalized / failedの判定。
raw_keys元出力に存在したキー一覧。
moved_fieldsトップレベルからhandoffへ移動した項目。
fallback_from_start確定入力値から補完した項目。
defaulted_optional任意欠落を空値へ正規化した項目。
missing_required / invalid_types契約違反の原因。

証跡はhandoff_trace / artifact / logs / Audit DTO / Package Outputへ渡し、後から「Agentが自力で契約を守ったか、構造整形が発動したか」を確認可能にする。

13. サイレントフェイル

サイレントフェイル:処理はエラーなく完走し、出力も自然に見えるが、内部工程や成果物の一部が壊れている状態。

今回の代表例

Planning:handoffだけ返却(外側スキーマ欠落)
Research:handoffだけ返却(外側スキーマ欠落)
Writing:部分情報だけで本文を生成
Review / Audit:通過
Package:成功
結果:本文は良いが、X投稿は ["x_posts"]、タグは別テーマ固定値

構文上正しいJSONや自然な本文が生成されるため、クラッシュより発見が難しい。契約ゲートと成果物最低条件の両方が必要である。

14. テスト戦略

固定回帰ケース

ケース入力特性主目的
A:メトロイド具体的・レトロゲーム・明示指定あり従来正常系の回帰、Research完全DTO、成果物一式
B:AIの素晴らしさ抽象的・任意入力空入力デフォルト、JSON遵守揺れ、タグ/X投稿の誤救済

構造テスト

  • YAML構文、ノード数、エッジ数、接続経路。
  • Start直読みの残存検索。
  • raw Agent textを読むノードの限定。
  • 固定意味フォールバックの残存検索。

実行テストの合格条件

  • Planning / Research contractが期待値。
  • metadata.topicがStartのtopic原文。
  • article / x_posts / tagsが非空かつ型正常。
  • ["x_posts"]["tags"]を拒否。
  • 別テーマの固定タグが存在しない。
  • failedを正常パッケージとして送信しない。

15. 2026年7月15日時点の現在地

確定・実装済み

  • 入力正規化ノード
  • Planning DTO整形・契約
  • Research DTO整形・契約
  • 工程別契約ゲート
  • 04 Review / 07 Audit専用DTO
  • 固定レトロタグ削除
  • DTO契約資料の初版

検証中

  • WritingのJSON安定化
  • 救済パースの限定化
  • Package Output最低条件
  • A/B最終回帰テスト
  • 空成果物の停止動作

次フェーズ

  • Writing DTO仕様
  • Writing Contract Gate
  • Package DTO仕様
  • Review / Audit契約の文書化
  • 自動回帰テスト

既知リスク

  • LLMのスキーマ遵守はプロンプトだけでは保証できない
  • 救済パースが異常を正常化する危険
  • 出力順変更は確率改善であり契約保証ではない
  • 最終テスト結果により本書の状態更新が必要

16. 推奨ロードマップ

Phase 1 — 現断面を安定化

A/Bを再実行し、契約と成果物最低条件が連続して通ることを確認。チェックポイントコミットを作る。

Phase 2 — Writing契約化

article_markdown / x_posts / tags / image_promptの型・必須・空許容・救済範囲を定義。Writing直後にNormalize / Gateを配置。

Phase 3 — Package / Review / Audit契約の完成

成果物パッケージのIF、Review判定、Audit判定を仕様書として統一。

Phase 4 — エラー・運用設計

error_code、retry戦略、timeout、needs_human_check、trace_id、DTO versionを導入。

Phase 5 — 自動回帰と拡張

固定テストデータと期待契約をリポジトリ管理し、新Agent追加時も既存ラインを保護。

17. 主要設計判断と理由

判断理由
入力デフォルトはStart直後に確定契約整形ノードが場当たり的に意味を作ることを防ぐ。
生LLM出力を後続が直接読まない入力形状の揺れを1か所で吸収し、責務を限定する。
任意欠落は空値へ、必須空はfailed構造の安定と意味不足の検出を両立する。
Planning情報をResearch結果へ転用しない企画条件と確認済み事実は意味が異なる。
プロンプト補強と機械ゲートを併用プロンプトは遵守確率を上げるだけで、保証にはならない。
固定タグフォールバックを削除欠落を隠し、別テーマ情報を混入させるサイレントフェイルになる。
Packageを最終防波堤にする上流契約が正常でも、最終成果物が空になる可能性がある。
将来はWriting直後へゲートを前倒しReview / Auditへ空成果物を渡さず、障害点の近くで止める。
設計の核心:AIを「正しく返すはずの部品」として信頼するのではなく、「出力が揺れる外部サービス」として扱い、各境界で契約を検査する。