Skip to content

Commit ca3dc9c

Browse files
etoyamaclaude
andcommitted
feat: add typed verification models for AnalysisDesign fields
Type explanatory (ExplanatoryVariable with VariableRole), metrics (list[Metric] with MetricTier), chart (list[ChartSpec] with ChartIntent), and add methodology field. Backward-compatible via Pydantic coercion, model_validator, and before_validator. 57 new tests, 681 total passing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 26fb699 commit ca3dc9c

16 files changed

Lines changed: 2532 additions & 39 deletions

File tree

.spec-workflow/specs/verification-design/design.md

Lines changed: 476 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
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

Comments
 (0)