# 通知設計書 2-リアクティビティ警告

## 概要

本ドキュメントは、Vue.jsリアクティビティパッケージ専用の軽量な警告通知機構の設計仕様を記述する。`packages/reactivity/src/warning.ts`に実装されており、ランタイム警告（No.1）とは独立した簡易な`warn`関数として提供される。

### 本通知の処理概要

この通知は、リアクティビティシステム内部で発生する警告を`console.warn`で開発者に通知する機構である。ランタイム警告とは異なり、コンポーネントトレースやカスタムハンドラへの委譲機能を持たない軽量な実装となっている。

**業務上の目的・背景**：Vue.jsのリアクティビティシステム（`@vue/reactivity`パッケージ）は、ランタイムコア（`@vue/runtime-core`）から独立して使用可能なパッケージである。そのため、ランタイムコアに依存しない独自の警告関数が必要となる。リアクティブエフェクトの不正な状態復元、`onEffectCleanup`のアクティブエフェクト外での呼び出しなど、リアクティビティ固有の問題を開発者に通知する。

**通知の送信タイミング**：リアクティビティシステム内部でのバリデーションチェック失敗時に即座に発火する。具体的にはReactiveEffect.run()実行時のアクティブエフェクト不整合検出時、onEffectCleanup()がアクティブエフェクト外で呼ばれた場合などに発火する。

**通知の受信者**：アプリケーション開発者。ブラウザの開発者コンソール（DevTools）を通じて警告メッセージを確認する。

**通知内容の概要**：`[Vue warn] `プレフィックス付きの警告メッセージが出力される。ランタイム警告と異なりコンポーネントトレース情報は付与されない。

**期待されるアクション**：開発者がリアクティビティシステムの使用方法を見直し、コードを修正する。

## 通知種別

コンソール警告（`console.warn`）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 中（開発時のみ動作） |
| リトライ | なし |

### 送信先決定ロジック

`console.warn`のみに出力する。カスタムハンドラへの委譲機能はない。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| 送信元アドレス | N/A（コンソール出力） |
| 送信元名称 | `[Vue warn]` |
| 件名 | N/A |
| 形式 | テキスト |

### 本文テンプレート

```
[Vue warn] {警告メッセージ} {追加引数}
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| N/A | N/A | N/A | コンソール出力のため添付ファイルなし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| msg | 警告メッセージ本文 | 呼び出し元から渡される文字列引数 | Yes |
| args | 追加情報 | 呼び出し元から渡される可変長引数 | No |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | ReactiveEffect.run()内の不整合検出 | `__DEV__`がtrue | アクティブエフェクトが正しく復元されなかった場合（effect.ts L170-175） |
| API呼び出し | onEffectCleanup()の不正呼び出し | `__DEV__`がtrueかつfailSilentlyがfalse | アクティブエフェクト外で呼び出された場合（effect.ts L550-555） |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| `__DEV__` がfalse | 本番ビルドでは全ての警告が除去される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[リアクティビティ内部でのバリデーション失敗] --> B{__DEV__チェック}
    B -->|true| C[warn関数呼び出し]
    B -->|false| D[何もしない]
    C --> E["console.warn('[Vue warn] ' + msg, ...args)"]
    E --> F[終了]
    D --> F
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| N/A | N/A | データベースは使用しない |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| N/A | N/A | データベースの更新は行わない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | N/A | 単純なconsole.warn呼び出しのためエラー処理は不要 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

制限なし。

## セキュリティ考慮事項

- 本番ビルドではツリーシェイキングにより完全に除去される
- リアクティビティ内部の状態情報が含まれるが、セキュリティ上の懸念はない

## 備考

- ランタイム警告（No.1）の`warn`関数とは完全に独立した関数である
- `@vue/reactivity`パッケージ内でのみ使用され、パッケージ外からは呼び出されない
- コンポーネントトレース情報は付与されない（リアクティビティパッケージはコンポーネントの概念を持たないため）
- ランタイム警告のwarn関数と比較して非常にシンプルな実装（3行）

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

リアクティビティ警告は非常にシンプルなため、特別なデータ構造の理解は不要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | warning.ts | `packages/reactivity/src/warning.ts` | L1-3: warn関数の全体。文字列引数と可変長引数のみ |

**読解のコツ**: ランタイムコアのwarn関数（No.1）との違いに注目する。こちらはコンポーネントコンテキストを持たない。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | warning.ts | `packages/reactivity/src/warning.ts` | L1-3: warn関数。console.warnに`[Vue warn] `プレフィックスを付けて出力するだけの簡易実装 |

**主要処理フロー**:
1. **L1**: `warn(msg: string, ...args: any[]): void` - 文字列メッセージと可変長引数を受け取る
2. **L2**: `` console.warn(`[Vue warn] ${msg}`, ...args) `` - プレフィックス付きで出力

#### Step 3: 呼び出し元を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | effect.ts | `packages/reactivity/src/effect.ts` | L170-175: ReactiveEffect.run()内でのアクティブエフェクト不整合検出 |
| 3-2 | effect.ts | `packages/reactivity/src/effect.ts` | L550-555: onEffectCleanup()でのアクティブエフェクト外呼び出し検出 |

**主要処理フロー**:
- **L170-175**: `activeSub !== this`の場合に内部バグの可能性を警告
- **L550-555**: `activeSub`がReactiveEffectのインスタンスでない場合に警告

### プログラム呼び出し階層図

```
[呼び出し元1] ReactiveEffect.run()   [effect.ts:170]
    |
    +-- warn(msg, ...args)            [warning.ts:1]
            |
            +-- console.warn()

[呼び出し元2] onEffectCleanup()       [effect.ts:550]
    |
    +-- warn(msg, ...args)            [warning.ts:1]
            |
            +-- console.warn()
```

### データフロー図

```
[入力]                      [処理]                           [出力]

msg (string)          +-- warn()                        +-- console.warn()
  |                   |     |                           |     "[Vue warn] ..."
args (...any[])  ---->|     +-- console.warn()     ---->|
                      +--                               +--
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| warning.ts | `packages/reactivity/src/warning.ts` | ソース | warn関数本体（3行） |
| effect.ts | `packages/reactivity/src/effect.ts` | ソース | warn関数の主要な呼び出し元 |
