Reyn — Architecture Diagrams
1. 全体レイヤー構造
flowchart TB
U(["User / External System"])
subgraph I01["01 · Interface"]
direction LR
CLI["CLI"] ~~~ TUI["TUI (Textual)"] ~~~ WEB["Web UI (FastAPI + WebSocket)"]
end
subgraph I02["02 · Agent Registry"]
direction LR
AM["manages named agents"] ~~~ TG["Topology gate — network · team · pipeline"]
end
subgraph I03["03 · Agent = ChatSession"]
direction LR
RL["RouterLoop (LLM-driven dispatch)"] ~~~ PL["Planner (optional · plan mode)"] ~~~ MEM["memory scope · skill allowlist"]
end
subgraph I04["04 · OS — the constant"]
direction LR
CB["Context Build"] ~~~ LC["LLM Call"] ~~~ VA["Output Validation"] ~~~ EE["Event Emit"]
end
subgraph I05["05 · Skill"]
direction LR
PG["Phase Graph + Transitions"] ~~~ FO["final_output_schema"] ~~~ PP["Postprocessor"]
end
subgraph I06["06 · Phase"]
direction LR
PRE["Preprocessor"] ~~~ LO["LLM + Control IR ops"] ~~~ LP["↺ loops until transition/finish"]
end
subgraph I07["07 · Persistence"]
direction LR
WS["Workspace (artifacts · files)"] ~~~ EV["Events (append-only log)"]
end
U --> I01 --> I02 --> I03 --> I04 --> I05 --> I06 --> I07
2. Phase 実行シーケンス
sequenceDiagram
participant OS as OS / Engine
participant PRE as Preprocessor
participant LLM as LLM
participant OPS as Control IR ops
participant WS as Workspace + Events
OS->>PRE: run preprocessor steps
PRE-->>OS: enriched input artifact
loop act turns (max_act_turns)
OS->>LLM: context + artifact + allowed_ops + candidate_outputs
LLM-->>OS: { control, artifact, control_ir[] }
OS->>OPS: execute control_ir ops
OPS->>WS: write results (P5)
OPS-->>OS: op results
alt decision = continue (act)
Note over OS,LLM: updated context → loop
else decision = transition
OS->>WS: emit phase_completed event (P6)
Note over OS: enter next phase
else decision = finish
OS->>WS: emit skill_finished event (P6)
Note over OS: Postprocessor (Skill level)
end
end
3. Skill グラフ構造
flowchart LR
EP(["entry_phase"])
subgraph SK["Skill — directed phase graph"]
PA["Phase A\ninput_schema · preprocessor\ninstructions · allowed_ops"]
PB["Phase B"]
PC["Phase C (can_finish)"]
SUB["@sub_skill node\n(embedded skill)"]
end
FO["final_output_schema"]
POSTP["Postprocessor (optional)"]
OUT(["Output to caller"])
EP --> PA
PA -->|"transition: proceed"| PB
PA -->|"transition: delegate"| SUB
SUB -->|"result"| PB
PB -->|"transition: revise"| PA
PB -->|"transition: proceed"| PC
PC -->|"finish"| FO
FO --> POSTP
POSTP --> OUT
4. Control IR ops フロー
flowchart TB
subgraph FRONT["Two frontends — one shared backend"]
direction LR
subgraph STATIC["Preprocessor (static · before LLM)"]
PS["PreprocessorExecutor"]
end
subgraph DYNAMIC["Control IR (dynamic · LLM-driven)"]
CD["ControlIRExecutor"]
end
end
GATE["Permission Gate (PermissionResolver)"]
EX["execute_op()"]
subgraph HANDLERS["Handler Registry"]
direction LR
FILE["file\nread·write·edit·grep·glob·delete"]
WEB["web_search\nweb_fetch"]
SHELL["shell"]
ASK["ask_user\n※ControlIR only"]
RS["run_skill"]
LINT["lint"]
MCP["mcp"]
end
PS --> GATE
CD --> GATE
GATE --> EX
EX --> FILE & WEB & SHELL & ASK & RS & LINT & MCP
5. Preprocessor / Postprocessor 対称図
flowchart LR
subgraph PRE["PREPROCESSOR · Phase level · fires before LLM"]
direction TB
PI["Phase input artifact"]
PSTEPS["run_op / iterate\nvalidate / lint_plan / python"]
PO["Enriched artifact → LLM"]
PI --> PSTEPS --> PO
end
subgraph POST["POSTPROCESSOR · Skill level · fires after finish"]
direction TB
QI["final_output artifact"]
QSTEPS["run_op / iterate\nvalidate / lint_plan / python\n+ WAL memoization"]
QO["Caller-facing artifact\n(postprocessor.output_schema)"]
QI --> QSTEPS --> QO
end
6. マルチエージェント 4 層構造
flowchart TB
TITLE["Reyn multi-agent mechanisms"]
subgraph L1["Layer 1 · @sub_skill — static"]
S1["Skill graph に埋め込まれた sub-skill ノード\nコンパイル時に解決 · 親 Skill グラフの一部"]
end
subgraph L2["Layer 2 · run_skill op — dynamic"]
S2["Phase の control_ir から動的にサブスキルを呼び出す\nparent_run_id で系譜追跡"]
end
subgraph L3["Layer 3 · delegate_to_agent — A2A"]
S3["RouterLoop が delegate_to_agent を発行\nTopology gate でルーティング · hop depth ≤ 3"]
end
subgraph L4["Layer 4 · reyn mcp serve — external MCP server"]
S4["外部 LLM クライアント (Claude Code · Cursor · OpenAI SDK)\nが stdio/JSON-RPC で Reyn を呼ぶ"]
end
TITLE --> L1 & L2 & L3 & L4
7. A2A 委譲チェーン
sequenceDiagram
participant U as User (depth=0)
participant A as Agent A (depth=1)
participant B as Agent B (depth=2)
participant C as Agent C (depth=3=limit)
U->>A: message
Note over A: RouterLoop → delegate_to_agent
A->>B: send(to=B, depth=1, chain_id=xyz)
Note over B: RouterLoop → delegate_to_agent
B->>C: send(to=C, depth=2, chain_id=xyz)
Note over C: depth=3 = max_hop_depth
C-->>B: result (chain_id=xyz)
B-->>A: result (chain_id=xyz)
A-->>U: final reply
Note over A,C: chain timeout = 60s
8. MCP server / client 対称図
flowchart LR
subgraph SRV["MCP Server — 実装済み (reyn mcp serve)"]
direction TB
EXT["External LLM Client\nClaude Code · Cursor · OpenAI SDK"]
STDIO["stdio / JSON-RPC 2.0"]
TOOLS["list_agents() · send_to_agent()"]
AR["AgentRegistry → ChatSession"]
EXT --> STDIO --> TOOLS --> AR
end
subgraph CLI2["MCP Client — implemented (stdio · HTTP)"]
direction TB
PHASE["Reyn Phase (control_ir)"]
MCIROP["MCPIROp kind: mcp"]
MCLIENT["MCPClient\nstdio / HTTP transport"]
EXTMCP["External MCP Server"]
PHASE --> MCIROP --> MCLIENT --> EXTMCP
end
9. Memory スコープ
flowchart TB
subgraph ROOT[".reyn/ (project root)"]
direction TB
subgraph SHARED[".reyn/memory/ — プロジェクト共有"]
SM["MEMORY.md (index)\n+ slug.md × n\n(type: user / feedback / project / reference)"]
end
subgraph AGENTS[".reyn/agents/"]
subgraph A1["agents/alice/memory/"]
AM1["MEMORY.md + slug.md"]
end
subgraph A2["agents/bob/memory/"]
AM2["MEMORY.md + slug.md"]
end
end
subgraph WSP[".reyn/artifacts/ — Workspace (≠ Memory)"]
WSN["per-run artifacts · skill-scoped · ephemeral"]
end
end
LLM["LLM (Phase 実行中)"]
LLM -->|"file/write Control IR"| SHARED
LLM -->|"file/write Control IR"| A1
LLM -->|"file/write Control IR"| A2
10. Planner フロー
sequenceDiagram
participant U as User
participant RL as RouterLoop
participant RLLLM as Router LLM
participant PL as Planner
participant SLLM as Step LLM (narrow context)
U->>RL: 複雑な複数ステップのリクエスト
RL->>RLLLM: tools (including plan_task)
RLLLM-->>RL: tool_call: plan_task(goal, steps[])
RL->>PL: parse_and_validate_plan()
PL-->>RL: Plan { goal, steps: [S1, S2, S3] }
loop 各ステップ (依存関係順)
RL->>SLLM: step description + narrow tool catalog
SLLM-->>RL: step result
end
RL->>RLLLM: 全ステップ結果を集約
RLLLM-->>U: final reply
Note over PL: chat-scoped · transient
11. Request end-to-end (architecture page S03 用)
sequenceDiagram
participant U as User
participant A as Agent (ChatSession)
participant PL as Planner (optional)
participant SK as Skill graph
participant PH as Phase loop
participant WS as Workspace + Events
U->>A: message
alt Complex multi-step request
A->>PL: plan_task(goal)
PL-->>A: Plan { steps: [S1, S2, ...] }
Note over A: each step → skill invocation
else Simple request
Note over A: RouterLoop picks Skill directly
end
A->>SK: invoke skill
SK->>PH: enter entry phase
loop Until transition or finish
PH->>PH: preprocessor (deterministic)
PH->>PH: LLM call (closed candidate set)
PH->>PH: validate output against schema
PH->>WS: execute Control IR ops · emit events
PH-->>SK: result + control decision
alt decision = transition
Note over SK: validate against next.input_schema
SK->>PH: enter next phase
else decision = finish
Note over SK: validate against final_output_schema
SK-->>A: final output
end
end
A-->>U: reply