# Architecture Diagram
How dsh-stage-gate works: the agent calls four model tools; gate state lives
in an in-memory GateStore scoped per agent session; **no custom session events
are written** (see the [bug report](BUG-2026-08-17-session-log-pollution.md)
for why).
```mermaid
graph TD
A[Agent / LLM] -->|调用| B[gate_open]
A -->|调用| C[gate_check]
A -->|调用| D[gate_list]
A -->|调用| E[gate_close]
B --> F[GateStore
in-memory · per-session]
C --> F
D --> F
E --> F
F --> G[状态机
open → in_review → passed/blocked → closed]
B -.✗ 不写入.-> H[(Session log)]
C -.✗ 不写入.-> H
D -.✗ 不写入.-> H
E -.✗ 不写入.-> H
style F fill:#eef2ff,stroke:#4f46e5
style G fill:#f0fdf4,stroke:#16a34a
style H fill:#fef2f2,stroke:#dc2626
```
## Key points
- **Four model-facing tools**: `gate_open`, `gate_check`, `gate_list`, `gate_close`.
- **In-memory, per-session** state: `GateStore` keyed by agent session id, then gate id.
- **No session-log pollution**: the plugin writes no custom `gate/*` events, so
sessions always reload cleanly after a harness restart.
- **Lifecycle**: `open → in_review → passed/blocked → closed` derived from the
full acceptance item list on each check.