|
| 1 | +# Requirements Document |
| 2 | + |
| 3 | +## Introduction |
| 4 | + |
| 5 | +AnalysisDesign の `explanatory`、`metrics`、`chart` フィールドは現在 `dict` / `list[dict]` で定義されており、スキーマ検証がない。分析設計の「検証手段」を構造化するため、これらのフィールドに Pydantic BaseModel + StrEnum による型付けを導入する。加えて、analysis-journal の `decide` イベントで記録される手法・パッケージ情報を AnalysisDesign モデルに `methodology` フィールドとして昇格させる。 |
| 6 | + |
| 7 | +## Alignment with Product Vision |
| 8 | + |
| 9 | +- **分析の再現性向上**: 検証手段(変数の役割、指標の優先度、可視化の意図、手法)を構造化することで、分析設計の再現性を高める |
| 10 | +- **知見の蓄積と再利用**: 型付けにより、変数の因果的役割や指標の重要度が検索・フィルタリング可能になる |
| 11 | +- **Claude Code First**: MCP ツールの入力スキーマが型で導かれ、SKILL が生成するデータの品質が向上する |
| 12 | +- **YAML as Source of Truth**: Pydantic モデルから YAML へのシリアライズは既存パターン(StrEnum + BaseModel)と一致する |
| 13 | +- **後方互換の優先**: 既存 YAML データは Pydantic の coercion と model_validator で自動変換。デフォルト値によりフィールド未指定でも読み込み可能 |
| 14 | + |
| 15 | +## Requirements |
| 16 | + |
| 17 | +### REQ-1: Explanatory Variable の型付け |
| 18 | + |
| 19 | +**User Story:** As a データアナリスト, I want 説明変数に因果的役割(treatment/confounder/covariate/instrumental/mediator)を指定できること, so that 分析設計の変数構成が明示的になり、レビュー時に検証戦略の妥当性を判断できる |
| 20 | + |
| 21 | +#### Functional Requirements |
| 22 | + |
| 23 | +- FR-1.1: `VariableRole` StrEnum を定義する(値: treatment, confounder, covariate, instrumental, mediator) |
| 24 | +- FR-1.2: `ExplanatoryVariable` Pydantic BaseModel を定義する(フィールド: name, description, role, data_source, time_points) |
| 25 | +- FR-1.3: `AnalysisDesign.explanatory` の型を `list[dict]` から `list[ExplanatoryVariable]` に変更する |
| 26 | +- FR-1.4: `role` フィールドのデフォルト値は `VariableRole.covariate` とし、既存データとの後方互換を保つ |
| 27 | + |
| 28 | +#### Acceptance Criteria |
| 29 | + |
| 30 | +- AC-1.1: WHEN `role` フィールドなしの dict を含む YAML を読み込む THEN システムは `role: covariate` をデフォルトで適用し、正常に `ExplanatoryVariable` オブジェクトを生成する SHALL |
| 31 | +- AC-1.2: WHEN `role` に `VariableRole` に存在しない値を指定する THEN システムは Pydantic ValidationError を送出する SHALL |
| 32 | +- AC-1.3: WHEN 有効な `ExplanatoryVariable` オブジェクトを YAML にシリアライズする THEN `role` フィールドが文字列として正しく保存される SHALL |
| 33 | +- AC-1.4: WHEN MCP ツール `create_design` / `update_design` で `explanatory` を指定する THEN dict のリストと `ExplanatoryVariable` のリストの両方を受け付ける SHALL |
| 34 | + |
| 35 | +### REQ-2: Metrics の型付けとリスト化 |
| 36 | + |
| 37 | +**User Story:** As a データアナリスト, I want 検証指標に優先度(primary/secondary/guardrail)を付与し、複数指標を管理できること, so that 主要な検証指標とガードレール指標を区別し、分析結果の判定基準を明確にできる |
| 38 | + |
| 39 | +#### Functional Requirements |
| 40 | + |
| 41 | +- FR-2.1: `MetricTier` StrEnum を定義する(値: primary, secondary, guardrail) |
| 42 | +- FR-2.2: `Metric` Pydantic BaseModel を定義する(フィールド: target, tier, data_source, grouping, filter, aggregation, comparison) |
| 43 | +- FR-2.3: `AnalysisDesign.metrics` の型を `dict` から `list[Metric]` に変更する |
| 44 | +- FR-2.4: 既存の単一 dict 形式の `metrics` を `list[Metric]` に自動変換する model_validator を実装する |
| 45 | +- FR-2.5: `tier` フィールドのデフォルト値は `MetricTier.primary` とする |
| 46 | + |
| 47 | +#### Acceptance Criteria |
| 48 | + |
| 49 | +- AC-2.1: WHEN `metrics` が単一 dict(`{"target": "...", ...}` 形式)の YAML を読み込む THEN システムは自動的に `[Metric(**dict)]` に変換する SHALL |
| 50 | +- AC-2.2: WHEN `metrics` が list 形式の YAML を読み込む THEN 各要素を `Metric` オブジェクトに変換する SHALL |
| 51 | +- AC-2.3: WHEN `metrics` が空 dict `{}` の YAML を読み込む THEN 空リスト `[]` として扱う SHALL |
| 52 | +- AC-2.4: WHEN `tier` フィールドなしの dict を含む YAML を読み込む THEN `tier: primary` をデフォルトで適用する SHALL |
| 53 | +- AC-2.5: WHEN MCP ツールで `metrics` を dict 形式で指定する THEN 自動的に `list[Metric]` に変換して保存する SHALL |
| 54 | + |
| 55 | +### REQ-3: Chart の Intent 駆動化 |
| 56 | + |
| 57 | +**User Story:** As a データアナリスト, I want 可視化に分析意図(distribution/correlation/trend/comparison)を指定できること, so that チャートの目的が明示的になり、出力形式(scatter/bar/line 等)の選択根拠が記録される |
| 58 | + |
| 59 | +#### Functional Requirements |
| 60 | + |
| 61 | +- FR-3.1: `ChartIntent` StrEnum を定義する(値: distribution, correlation, trend, comparison) |
| 62 | +- FR-3.2: `ChartSpec` Pydantic BaseModel を定義する(フィールド: intent, type, description, x, y) |
| 63 | +- FR-3.3: `AnalysisDesign.chart` の型を `list[dict]` から `list[ChartSpec]` に変更する |
| 64 | +- FR-3.4: 既存の `intent` フィールドなし dict に対して、`type` フィールドの値から intent を推定する後方互換ロジックを実装する |
| 65 | + |
| 66 | +#### Acceptance Criteria |
| 67 | + |
| 68 | +- AC-3.1: WHEN `intent` フィールドなしで `type: scatter` の dict を読み込む THEN システムは `intent: correlation` を推定して適用する SHALL |
| 69 | +- AC-3.2: WHEN `intent` フィールドなしで `type: table` の dict を読み込む THEN システムは `intent: comparison` を推定して適用する SHALL |
| 70 | +- AC-3.3: WHEN `intent` フィールドなしで推定不可能な `type` の dict を読み込む THEN システムは `intent: distribution` をデフォルトとして適用する SHALL |
| 71 | +- AC-3.4: WHEN 有効な `ChartSpec` オブジェクトを YAML にシリアライズする THEN `intent` と `type` の両方が保存される SHALL |
| 72 | + |
| 73 | +### REQ-4: Methodology フィールドの追加 |
| 74 | + |
| 75 | +**User Story:** As a データアナリスト, I want 分析設計に使用する手法・パッケージを記録できること, so that 分析の再現性が向上し、レビュー時に手法の妥当性を判断できる |
| 76 | + |
| 77 | +#### Functional Requirements |
| 78 | + |
| 79 | +- FR-4.1: `Methodology` Pydantic BaseModel を定義する(フィールド: method, package, reason) |
| 80 | +- FR-4.2: `AnalysisDesign` に `methodology: Methodology | None = None` フィールドを追加する |
| 81 | +- FR-4.3: `methodology` は任意フィールドとし、既存データに影響を与えない |
| 82 | + |
| 83 | +#### Acceptance Criteria |
| 84 | + |
| 85 | +- AC-4.1: WHEN `methodology` フィールドなしの YAML を読み込む THEN `methodology` は `None` として扱う SHALL |
| 86 | +- AC-4.2: WHEN `methodology` を dict 形式で指定する THEN `Methodology` オブジェクトに自動変換する SHALL |
| 87 | +- AC-4.3: WHEN `methodology` の `method` フィールドが空文字列 THEN Pydantic ValidationError を送出する SHALL |
| 88 | +- AC-4.4: WHEN MCP ツール `update_design` で `methodology` を指定する THEN 設計書に手法情報が保存される SHALL |
| 89 | + |
| 90 | +### REQ-5: Frontend 型定義の同期 |
| 91 | + |
| 92 | +**User Story:** As a 開発者, I want フロントエンドの TypeScript 型定義が Python モデルと同期していること, so that 型の不整合による実行時エラーを防止できる |
| 93 | + |
| 94 | +#### Functional Requirements |
| 95 | + |
| 96 | +- FR-5.1: `frontend/src/types/api.ts` に `ExplanatoryVariable`, `Metric`, `ChartSpec`, `Methodology` の TypeScript 型を追加する |
| 97 | +- FR-5.2: `AnalysisDesign` 型の `explanatory`, `metrics`, `chart` フィールドを型付き定義に更新する |
| 98 | +- FR-5.3: `VariableRole`, `MetricTier`, `ChartIntent` の TypeScript enum / union 型を追加する |
| 99 | + |
| 100 | +#### Acceptance Criteria |
| 101 | + |
| 102 | +- AC-5.1: WHEN フロントエンドをビルドする THEN TypeScript コンパイルエラーが発生しない SHALL |
| 103 | +- AC-5.2: WHEN REST API から `AnalysisDesign` を取得する THEN レスポンスが TypeScript 型定義と一致する SHALL |
| 104 | + |
| 105 | +### REQ-6: SKILL ドキュメントの更新 |
| 106 | + |
| 107 | +**User Story:** As a Claude Code, I want analysis-design スキルのフィールド例が型付きモデルに更新されていること, so that SKILL 実行時に正しい構造のデータを生成できる |
| 108 | + |
| 109 | +#### Functional Requirements |
| 110 | + |
| 111 | +- FR-6.1: `analysis-design/SKILL.md` の `explanatory`, `metrics`, `chart` フィールド例を型付きモデルの構造に更新する |
| 112 | +- FR-6.2: `analysis-design/SKILL.md` に `methodology` フィールドの使用例を追加する |
| 113 | +- FR-6.3: `analysis-journal/SKILL.md` の `decide` イベントに、`methodology` フィールドへの昇格導線を記載する |
| 114 | + |
| 115 | +#### Acceptance Criteria |
| 116 | + |
| 117 | +- AC-6.1: WHEN analysis-design スキルのフィールド例を参照する THEN `role`, `tier`, `intent` フィールドが含まれている SHALL |
| 118 | +- AC-6.2: WHEN analysis-journal の decide イベントを記録した後 THEN methodology フィールドへの昇格手順が SKILL.md に記載されている SHALL |
| 119 | + |
| 120 | +## Non-Functional Requirements |
| 121 | + |
| 122 | +### Code Architecture and Modularity |
| 123 | + |
| 124 | +- 新規モデル(`ExplanatoryVariable`, `Metric`, `ChartSpec`, `Methodology`)は既存の `models/design.py` に追加する(1ファイル = 1ドメイン領域の原則に従う) |
| 125 | +- StrEnum は既存パターン(`DesignStatus`, `AnalysisIntent`, `KnowledgeCategory`)と一貫した定義方法を使う |
| 126 | +- model_validator は `AnalysisDesign` クラス内に定義し、外部関数に切り出さない |
| 127 | + |
| 128 | +### Performance |
| 129 | + |
| 130 | +- モデルのバリデーション処理が既存の MCP ツールレスポンス時間(500ms 以内)に影響を与えないこと |
| 131 | +- Pydantic の coercion / validator は初回 YAML 読み込み時のみ実行される |
| 132 | + |
| 133 | +### Security |
| 134 | + |
| 135 | +- 新規フィールドに外部入力が直接渡される箇所がないこと(MCP ツール経由のみ) |
| 136 | + |
| 137 | +### Reliability |
| 138 | + |
| 139 | +- 既存の 624 テストが全て通ること(後方互換の検証) |
| 140 | +- 新規モデルに対するテストカバレッジ 80% 以上 |
| 141 | + |
| 142 | +### Maintainability |
| 143 | + |
| 144 | +- 全モデルに型ヒントを付与すること |
| 145 | +- StrEnum の値追加は後方互換を保つ(デフォルト値の設定) |
| 146 | + |
| 147 | +## Out of Scope |
| 148 | + |
| 149 | +- **analysis-journal の decide イベントから methodology への自動昇格機能**: 本スペックでは methodology フィールドの追加と SKILL ドキュメントの導線記載のみ。自動昇格のロジック実装は対象外 |
| 150 | +- **WebUI での新規フィールドの表示変更**: extension-policy により WebUI は Fixed Scope。型定義の同期のみ実施し、UI コンポーネントの変更は行わない |
| 151 | +- **MCP ツールの追加**: extension-policy により MCP 17個の soft cap を維持。既存ツールのスキーマ変更のみ |
| 152 | +- **VariableRole / MetricTier / ChartIntent に基づくバリデーションロジック**: 例えば「treatment は1つだけ」等の制約は本スペック対象外 |
| 153 | +- **Metric の統計的検定パラメータ**: 検定手法(t検定、カイ二乗等)の詳細パラメータは methodology に委ね、Metric には含めない |
0 commit comments