# E004: 終端ノードの戻り値エラー

## 概要

終端ノード（`exit.*`）が `ExitContract` サブクラスではない値を返した場合に発生します。
v0.12.3 で型安全性が強制され、`dict` や `None` などを返すとこのエラーになります。

## エラーメッセージ

```
Error [E004]: 終端ノードの戻り値エラー

終端ノード 'exit.success.done' は ExitContract を返す必要があります。

Hint:
  return DoneResult(...) のように ExitContract サブクラスを返してください。
```

実行時には `ExitNodeTypeError` として発生します:

```
ExitNodeTypeError: 終端ノード 'exit.success.done' は ExitContract を返す必要があります。
 戻り値の型: dict

ヒント: `railway sync transition` を実行してスケルトンを生成してください。
```

## 原因

v0.12.3 以降、終端ノードは `ExitContract` サブクラスを返すことが必須です。

```python
# NG: dict を返している
@node(name="exit.success.done")
def done(ctx):
    return {"status": "ok"}  # ExitNodeTypeError!

# NG: None を返している
@node(name="exit.success.done")
def done(ctx):
    return None  # ExitNodeTypeError!

# NG: 通常の Contract を返している
@node(name="exit.success.done")
def done(ctx) -> MyContext:
    return ctx  # ExitNodeTypeError!
```

## 解決方法

### 手順1: ExitContract サブクラスを定義する

```python
from railway import ExitContract

class DoneResult(ExitContract):
    """正常終了時の結果。"""
    status: str
    processed_count: int = 0
    exit_state: str = "success.done"  # exit_code は自動導出（0）
```

### 手順2: 終端ノードで返す

```python
from railway import node

@node(name="exit.success.done")
def done(ctx) -> DoneResult:
    """終端ノードは ExitContract を返す（Outcome は不要）。"""
    return DoneResult(
        status="completed",
        processed_count=ctx.count,
    )
```

### スケルトン自動生成

`railway sync transition` を実行すると、終端ノードのスケルトンが自動生成されます:

```bash
railway sync transition --entry my_workflow
```

### exit_state と exit_code の関係

| exit_state パターン | exit_code（自動導出） |
|---------------------|----------------------|
| `success.*` | 0 |
| `failure.*` | 1 |
| その他 | 1 |

`exit_code` は明示的に指定することも可能です:

```python
class WarningResult(ExitContract):
    exit_state: str = "warning.low_disk"
    exit_code: int = 2  # カスタム終了コード
```

## 発生箇所

- `dag_runner()` 実行時（`ExitNodeTypeError` として raise）

## 関連

- [docs/adr/005_exit_contract_simplification.md](../adr/005_exit_contract_simplification.md) - ExitContract の設計
- [docs/adr/004_exit_node_design.md](../adr/004_exit_node_design.md) - 終端ノードの設計
- [docs/transition_graph_reference.md](../transition_graph_reference.md) - 終端ノードの YAML 定義
