| name | eld-spec-discover |
| description | コードベースや要件からVocabulary(語彙)とLaw(守るべき条件)を自動発見するスキル。名辞抽象(Term/Type)と関係抽象(Law/制約)の両方を抽出し、/eld-spec-card term および /eld-spec-card law への入力を生成する。使用タイミング: 新規プロジェクトでVocabulary/Lawを洗い出す時、既存コードからLaw/Termを抽出する時、「Lawを発見して」「語彙を抽出して」、ELD Specをレトロフィットする時、初期Catalogを作る時。 |
ELD Spec Discovery
コードベースや要件からVocabulary候補とLaw候補を自動発見する。
発見の二軸
| 抽象 | 発見対象 | 成果物 |
|---|
| 名辞抽象 | Term/Type/Value/Context | Vocabulary Catalog → Term Card |
| 関係抽象 | Law/制約/写像 | Law Catalog → Law Card |
Vocabulary発見(名辞抽象)
発見ソース
| ソース | 発見対象 | 抽出方法 |
|---|
| 型定義 | Entity/Value Object | interface/type/classを検索 |
| Zodスキーマ | 値制約 | z.object/z.string等を解析 |
| Brand型 | 意味的区別 | Brand/Newtype定義を検索 |
| ドメインモデル | 概念 | domain/models配下を分析 |
| API定義 | I/O境界の語彙 | Request/Response型を解析 |
発見プロセス
Step 1: 型・語彙の収集
grep -r "interface\|type\|class\|Brand" src/
grep -r "z\.object\|z\.string\|z\.number" src/
Step 2: Term候補生成
term_candidate:
id: TERM-<domain>-<name>
source:
file: <発見元ファイル>
line: <行番号>
meaning: <推定される意味>
type_shape: <型表現>
context: <使用文脈>
io_boundaries: <I/O境界>
confidence: high | medium | low
needs_review: <確認が必要な点>
Law発見(関係抽象)
発見ソース
| ソース | 発見対象 | 抽出方法 |
|---|
| Zodスキーマ | 入力制約 | スキーマ定義を解析 |
| アサーション | 不変条件 | assert/invariant文を検索 |
| テスト期待値 | 事後条件 | expect/assertを解析 |
| catch節 | 例外ポリシー | エラーハンドリングを抽出 |
| ビジネスロジック | ドメインルール | 条件分岐を分析 |
| 障害履歴 | 防御すべき条件 | 過去のバグから抽出 |
発見プロセス
Step 1: 制約の収集
grep -r "assert\|invariant\|validate" src/
grep -r "throw new.*Error\|reject\|fail" src/
Step 2: Law候補生成
law_candidate:
id: LAW-<domain>-<name>
type: Pre | Post | Invariant | Policy
source:
file: <発見元ファイル>
line: <行番号>
pattern: <検出パターン>
statement: <自然言語での記述>
formal_ish: <疑似式>
terms: [<関連するTerm候補>]
confidence: high | medium | low
needs_review: <確認が必要な点>
パターン分類
Vocabulary(名辞)パターン
| パターン | Term種別 | 例 |
|---|
interface Entity | Term(エンティティ) | interface Order |
type Brand<T> | Type(ブランド型) | type OrderId = Brand<string> |
z.number().min().max() | Value(値制約) | z.number().min(1).max(100) |
// Context: XXX | Context(文脈) | コメントから抽出 |
Law(関係)パターン
| パターン | Law Type | 例 |
|---|
if (!condition) throw | Pre | 入力検証 |
assert(a === b) | Invariant | 状態整合性 |
expect(result).toBe(x) | Post | 出力保証 |
if (role === 'admin') | Policy | 権限判断 |
発見例
アサーションからの抽出
class Inventory {
reserve(qty: number) {
assert(this.available >= qty, 'Insufficient stock');
assert(this.available === this.total - this.reserved);
}
}
出力形式
Discovery Report
# ELD Spec Discovery Report
## Summary
- Vocabulary候補: 12件 (High: 8, Medium: 3, Low: 1)
- Law候補: 15件 (High: 9, Medium: 4, Low: 2)
---
## Vocabulary候補(名辞抽象)
### High Confidence (即座にTerm Card化可能)
#### TERM-order-quantity
- **Source**: src/orders/schema.ts:12
- **Meaning**: 注文数量
- **Type/Shape**: `z.number().min(1).max(100)`
- **Context**: 注文処理
- **Action**: → `/eld-spec-card term` でカード化
### Medium Confidence (確認推奨)
#### TERM-user-balance (要確認)
- **Source**: src/users/account.ts:45
- **Meaning**: ユーザー残高(推定)
- **Needs Review**: 一時的なマイナスを許可するか確認
---
## Law候補(関係抽象)
### High Confidence (即座にLaw Card化可能)
#### LAW-pre-order-quantity
- **Type**: Pre
- **Source**: src/orders/schema.ts:12
- **Statement**: 注文数量は1以上100以下
- **Formal**: 1 ≤ orderQty ≤ 100
- **Terms**: [TERM-order-quantity]
- **Action**: → `/eld-spec-card law` で正式化
### Medium Confidence (確認推奨)
#### LAW-inv-user-balance (要確認)
- **Type**: Invariant
- **Source**: src/users/account.ts:120
- **Statement**: ユーザー残高は非負
- **Terms**: [TERM-user-balance]
- **Needs Review**: 一時的なマイナス残高を許可するケースがあるか確認
---
## 相互拘束チェック
### 孤立リスク
- Law候補で参照Termが不明確: 2件
- Term候補で関連Lawがなし: 3件
### 推奨アクション
1. LAW-policy-discount: 参照するTermを明確化
2. TERM-customer-tier: 関連するLawを検討
既存Catalogとの照合
| チェック | 内容 |
|---|
| 重複検出 | 既存TermやLawと重複していないか |
| 類似統合 | 類似した定義の統合を提案 |
| 矛盾検出 | 既存定義と矛盾していないか |