# Issue #01: コンテキスト変数基本設計

## 概要
nodeの実行結果を一元管理するコンテキスト変数の基本設計を策定する。

## 背景・問題点

### 現在の設計の問題
```python
result = pipeline(
    fetch_data(user_id),
    process_data,    # fetch_dataの出力形式に依存
    save_data,       # process_dataの出力形式に依存
)
```

- 各nodeが前段のnodeの出力形式に依存
- 遷移順序を変更するとnodeの実装も変更が必要
- nodeが密結合になり、再利用性が低下

### 目指す設計
- nodeはステートレスを維持（内部状態を持たない）
- 状態（ステート）はコンテキスト変数に外出し
- nodeはtransition（遷移順序）に依存しない
- コンテキスト変数から必要な値を取得し、結果を書き込む

**注意**: nodeは他nodeの「データ構造（スキーマ）」には依存する。これは避けられないが、「遷移順序」からは解放される。

## コンテキスト変数のデータ構造

```python
{
    # メタデータ（内部管理用、直接アクセス非推奨）
    "_meta": {
        "entry_point": "my_entry",
        "started_at": "2026-01-19T10:00:00",
        "nodes": ["fetch_data", "process_data", "save_data"],
        "params": {           # 初期パラメータ
            "user_id": 1,
            "options": {"verbose": True},
        },
    },

    # 各nodeの結果（node名がキー）
    "fetch_data": {
        "user_id": 1,
        "name": "Alice",
        "email": "alice@example.com",
    },
    "process_data": {
        "validated": True,
        "transformed_data": {...},
    },
    "save_data": {
        "saved": True,
        "record_id": 12345,
    },
}
```

## 設計原則

### 1. パラメータと結果のアクセスを分離
```python
@node
def fetch_data(ctx: Context) -> None:
    # パラメータは専用メソッドでアクセス
    user_id = ctx.get_param("user_id")

    # 処理実行
    user = get_user(user_id)

    # 結果は自身のキーに書き込み
    ctx["fetch_data"] = {"user": user}
```

### 2. nodeは他nodeの結果を参照可能
```python
@node
def process_data(ctx: Context) -> None:
    # 他nodeの結果を参照（データスキーマへの依存）
    user = ctx["fetch_data"]["user"]
    ctx["process_data"] = {"processed": transform(user)}
```

### 3. 依存関係の明確化
- **遷移依存**: なし（nodeの実行順序を変えてもnodeの実装変更は不要）
- **データ依存**: あり（他nodeの出力スキーマには依存）
- データ依存はドキュメントまたは型ヒントで明示する

## アクセスパターン

| 用途 | 方法 | 例 |
|------|------|-----|
| 初期パラメータ取得 | `ctx.get_param()` | `ctx.get_param("user_id")` |
| 他nodeの結果取得 | `ctx[node_name]` | `ctx["fetch_data"]["user"]` |
| 自nodeの結果書き込み | `ctx[node_name] = {}` | `ctx["fetch_data"] = {...}` |
| node存在確認 | `node_name in ctx` | `"fetch_data" in ctx` |
| 結果取得（デフォルト付き） | `ctx.get()` | `ctx.get("fetch_data", {})` |

## 関連Issue
- Issue #02: Contextクラス実装
- Issue #03: nodeデコレータ改修
- Issue #04: CLIコマンド拡張
- Issue #05: pipeline改修

## 優先度
最高（他のすべてのissueに影響）
