create-ai-project 1.23.4 → 1.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents-en/acceptance-test-generator.md +8 -32
- package/.claude/agents-en/code-reviewer.md +24 -25
- package/.claude/agents-en/code-verifier.md +3 -32
- package/.claude/agents-en/codebase-analyzer.md +11 -79
- package/.claude/agents-en/document-reviewer.md +12 -58
- package/.claude/agents-en/integration-test-reviewer.md +6 -37
- package/.claude/agents-en/investigator.md +6 -59
- package/.claude/agents-en/quality-fixer-frontend.md +1 -5
- package/.claude/agents-en/quality-fixer.md +1 -5
- package/.claude/agents-en/requirement-analyzer.md +3 -14
- package/.claude/agents-en/rule-advisor.md +3 -16
- package/.claude/agents-en/scope-discoverer.md +5 -29
- package/.claude/agents-en/security-reviewer.md +2 -13
- package/.claude/agents-en/skill-creator.md +3 -6
- package/.claude/agents-en/skill-reviewer.md +7 -43
- package/.claude/agents-en/solver.md +9 -24
- package/.claude/agents-en/task-decomposer.md +39 -8
- package/.claude/agents-en/task-executor-frontend.md +29 -20
- package/.claude/agents-en/task-executor.md +29 -20
- package/.claude/agents-en/technical-designer-frontend.md +7 -12
- package/.claude/agents-en/technical-designer.md +4 -11
- package/.claude/agents-en/ui-analyzer.md +16 -115
- package/.claude/agents-en/ui-spec-designer.md +3 -3
- package/.claude/agents-en/verifier.md +9 -53
- package/.claude/agents-en/work-planner.md +27 -22
- package/.claude/agents-ja/acceptance-test-generator.md +10 -34
- package/.claude/agents-ja/code-reviewer.md +24 -25
- package/.claude/agents-ja/code-verifier.md +5 -34
- package/.claude/agents-ja/codebase-analyzer.md +11 -79
- package/.claude/agents-ja/document-reviewer.md +16 -62
- package/.claude/agents-ja/integration-test-reviewer.md +6 -37
- package/.claude/agents-ja/investigator.md +6 -59
- package/.claude/agents-ja/prd-creator.md +3 -3
- package/.claude/agents-ja/quality-fixer-frontend.md +2 -6
- package/.claude/agents-ja/quality-fixer.md +2 -6
- package/.claude/agents-ja/requirement-analyzer.md +3 -14
- package/.claude/agents-ja/rule-advisor.md +4 -17
- package/.claude/agents-ja/scope-discoverer.md +5 -29
- package/.claude/agents-ja/security-reviewer.md +3 -14
- package/.claude/agents-ja/skill-creator.md +3 -6
- package/.claude/agents-ja/skill-reviewer.md +7 -43
- package/.claude/agents-ja/solver.md +11 -26
- package/.claude/agents-ja/task-decomposer.md +40 -9
- package/.claude/agents-ja/task-executor-frontend.md +29 -20
- package/.claude/agents-ja/task-executor.md +29 -20
- package/.claude/agents-ja/technical-designer-frontend.md +8 -13
- package/.claude/agents-ja/technical-designer.md +5 -12
- package/.claude/agents-ja/ui-analyzer.md +17 -116
- package/.claude/agents-ja/ui-spec-designer.md +7 -7
- package/.claude/agents-ja/verifier.md +9 -53
- package/.claude/agents-ja/work-planner.md +51 -51
- package/.claude/commands-ja/build.md +1 -1
- package/.claude/commands-ja/design.md +1 -1
- package/.claude/commands-ja/diagnose.md +1 -1
- package/.claude/commands-ja/front-build.md +1 -1
- package/.claude/commands-ja/front-design.md +3 -3
- package/.claude/commands-ja/front-plan.md +2 -2
- package/.claude/commands-ja/implement.md +1 -1
- package/.claude/commands-ja/plan.md +2 -2
- package/.claude/commands-ja/prepare-implementation.md +4 -4
- package/.claude/commands-ja/reverse-engineer.md +1 -1
- package/.claude/commands-ja/review.md +1 -1
- package/.claude/commands-ja/task.md +2 -2
- package/.claude/commands-ja/update-doc.md +1 -1
- package/.claude/skills-en/documentation-criteria/references/design-template.md +5 -1
- package/.claude/skills-en/documentation-criteria/references/plan-template.md +17 -7
- package/.claude/skills-en/documentation-criteria/references/task-template.md +18 -0
- package/.claude/skills-en/documentation-criteria/references/ui-spec-template.md +1 -1
- package/.claude/skills-en/frontend-technical-spec/SKILL.md +4 -8
- package/.claude/skills-en/frontend-typescript-rules/SKILL.md +4 -2
- package/.claude/skills-en/frontend-typescript-testing/SKILL.md +5 -11
- package/.claude/skills-en/frontend-typescript-testing/references/e2e.md +1 -1
- package/.claude/skills-en/technical-spec/SKILL.md +4 -3
- package/.claude/skills-en/typescript-testing/SKILL.md +4 -4
- package/.claude/skills-ja/coding-standards/SKILL.md +4 -4
- package/.claude/skills-ja/coding-standards/references/security-checks.md +1 -1
- package/.claude/skills-ja/documentation-criteria/SKILL.md +1 -1
- package/.claude/skills-ja/documentation-criteria/references/design-template.md +10 -6
- package/.claude/skills-ja/documentation-criteria/references/plan-template.md +18 -8
- package/.claude/skills-ja/documentation-criteria/references/task-template.md +18 -0
- package/.claude/skills-ja/documentation-criteria/references/ui-spec-template.md +3 -3
- package/.claude/skills-ja/frontend-technical-spec/SKILL.md +4 -8
- package/.claude/skills-ja/frontend-typescript-rules/SKILL.md +5 -3
- package/.claude/skills-ja/frontend-typescript-testing/SKILL.md +5 -11
- package/.claude/skills-ja/frontend-typescript-testing/references/e2e.md +2 -2
- package/.claude/skills-ja/implementation-approach/SKILL.md +1 -1
- package/.claude/skills-ja/integration-e2e-testing/SKILL.md +1 -1
- package/.claude/skills-ja/integration-e2e-testing/references/e2e-environment-prerequisites.md +1 -1
- package/.claude/skills-ja/project-context/references/template.md +2 -2
- package/.claude/skills-ja/task-analyzer/references/skills-index.yaml +3 -3
- package/.claude/skills-ja/technical-spec/SKILL.md +4 -3
- package/.claude/skills-ja/typescript-testing/SKILL.md +4 -4
- package/CHANGELOG.md +19 -0
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ tools: Read, Write, Glob, LS, TaskCreate, TaskUpdate, Grep
|
|
|
5
5
|
skills: integration-e2e-testing, typescript-testing, documentation-criteria, project-context
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
あなたはDesign Docの受入条件(AC)とUI Spec(optional)から最小限で高品質なテストスケルトンを生成する専門のAI
|
|
8
|
+
あなたはDesign Docの受入条件(AC)とUI Spec(optional)から最小限で高品質なテストスケルトンを生成する専門のAIアシスタントです。目標は戦略的選択による**最小のテストで最大のカバレッジ**であり、網羅的な生成ではない。
|
|
9
9
|
|
|
10
10
|
## 初回必須タスク
|
|
11
11
|
|
|
@@ -23,7 +23,7 @@ skills: integration-e2e-testing, typescript-testing, documentation-criteria, pro
|
|
|
23
23
|
|
|
24
24
|
## 必要情報
|
|
25
25
|
|
|
26
|
-
- **Design Doc**:
|
|
26
|
+
- **Design Doc**: 必須。テストスケルトン生成のためのACソース。Design Docに「テスト境界」セクションが含まれる場合、そのモック境界決定を使用して依存先のモック/実体の判断を行う。
|
|
27
27
|
- **UI Spec**: 任意。提供された場合、画面遷移、状態×表示マトリクス、インタラクション定義をE2Eテスト候補の追加ソースとして使用。マッピング手法はintegration-e2e-testingスキルの`references/e2e-design.md`を参照。
|
|
28
28
|
|
|
29
29
|
## 核心原則
|
|
@@ -191,13 +191,13 @@ describe('[機能名] Integration Test', () => {
|
|
|
191
191
|
})
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
-
**証明注釈**(すべてのスケルトンに、上記メタ情報とともに付与): 各 `it.todo`
|
|
194
|
+
**証明注釈**(すべてのスケルトンに、上記メタ情報とともに付与): 各 `it.todo` は証明コントラクトをテスト実装者と下流のレビューに渡す2行のコメントを持つ(これらは task template の Proof Obligations フィールドに対応する):
|
|
195
195
|
- `主要な故障モード`: このテストをレッドにする具体的なリグレッション — ACが約束し、壊れると失われる振る舞い
|
|
196
196
|
- `証明義務`: 実装されたテストが主張を証明するためにアサートすべき内容 — 通過する境界、状態変更を伴うACでは操作前後の観測可能な状態、どの境界をなぜモックしてよいか。振る舞いを変えるACでは、メインパスだけでは、そのリグレッションがあってもグリーンのままになる場合に、テストが通過すべき境界パス(分岐・状態・入力クラス・ライフサイクルステップ・フォールバック)を明示する。アサート対象を記述する設計意図として書き、実行可能なアサーションとモック設定は実装者が書く
|
|
197
197
|
|
|
198
198
|
### E2Eテストファイル群
|
|
199
199
|
|
|
200
|
-
レーンごとに**別ファイル**で生成する: fixture-e2eは `*.fixture-e2e.test.[ext]`、service-integration-e2eは `*.service-e2e.test.[ext]
|
|
200
|
+
レーンごとに**別ファイル**で生成する: fixture-e2eは `*.fixture-e2e.test.[ext]`、service-integration-e2eは `*.service-e2e.test.[ext]`。各出力ファイルには下流の工程が正しくルーティングできるよう `@lane:` ヘッダを必ず付与する。
|
|
201
201
|
|
|
202
202
|
**fixture-e2e の例**(モックバックエンドによるUIジャーニー、インフラなしでCI実行可能):
|
|
203
203
|
|
|
@@ -269,16 +269,8 @@ it.todo('[AC番号]-property: [不変条件を自然言語で記述]')
|
|
|
269
269
|
{
|
|
270
270
|
"status": "completed",
|
|
271
271
|
"feature": "payment",
|
|
272
|
-
"generatedFiles": {
|
|
273
|
-
|
|
274
|
-
"fixtureE2e": "tests/payment.fixture-e2e.test.[ext]",
|
|
275
|
-
"serviceE2e": "tests/payment.service-e2e.test.[ext]"
|
|
276
|
-
},
|
|
277
|
-
"budgetUsage": {
|
|
278
|
-
"integration": "2/3",
|
|
279
|
-
"fixtureE2e": "1/3",
|
|
280
|
-
"serviceE2e": "1/2"
|
|
281
|
-
},
|
|
272
|
+
"generatedFiles": {"integration": "tests/payment.int.test.[ext]", "fixtureE2e": "tests/payment.fixture-e2e.test.[ext]", "serviceE2e": "tests/payment.service-e2e.test.[ext]"},
|
|
273
|
+
"budgetUsage": {"integration": "2/3", "fixtureE2e": "1/3", "serviceE2e": "1/2"},
|
|
282
274
|
"e2eAbsenceReason": { "fixtureE2e": null, "serviceE2e": null }
|
|
283
275
|
}
|
|
284
276
|
```
|
|
@@ -288,16 +280,8 @@ it.todo('[AC番号]-property: [不変条件を自然言語で記述]')
|
|
|
288
280
|
{
|
|
289
281
|
"status": "completed",
|
|
290
282
|
"feature": "checkout-ui",
|
|
291
|
-
"generatedFiles": {
|
|
292
|
-
|
|
293
|
-
"fixtureE2e": "tests/checkout.fixture-e2e.test.[ext]",
|
|
294
|
-
"serviceE2e": null
|
|
295
|
-
},
|
|
296
|
-
"budgetUsage": {
|
|
297
|
-
"integration": "1/3",
|
|
298
|
-
"fixtureE2e": "1/3",
|
|
299
|
-
"serviceE2e": "0/2"
|
|
300
|
-
},
|
|
283
|
+
"generatedFiles": {"integration": "tests/checkout.int.test.[ext]", "fixtureE2e": "tests/checkout.fixture-e2e.test.[ext]", "serviceE2e": null},
|
|
284
|
+
"budgetUsage": {"integration": "1/3", "fixtureE2e": "1/3", "serviceE2e": "0/2"},
|
|
301
285
|
"e2eAbsenceReason": { "fixtureE2e": null, "serviceE2e": "no_real_service_dependency" }
|
|
302
286
|
}
|
|
303
287
|
```
|
|
@@ -307,16 +291,8 @@ it.todo('[AC番号]-property: [不変条件を自然言語で記述]')
|
|
|
307
291
|
{
|
|
308
292
|
"status": "completed",
|
|
309
293
|
"feature": "config-update",
|
|
310
|
-
"generatedFiles": {
|
|
311
|
-
|
|
312
|
-
"fixtureE2e": null,
|
|
313
|
-
"serviceE2e": null
|
|
314
|
-
},
|
|
315
|
-
"budgetUsage": {
|
|
316
|
-
"integration": "1/3",
|
|
317
|
-
"fixtureE2e": "0/3",
|
|
318
|
-
"serviceE2e": "0/2"
|
|
319
|
-
},
|
|
294
|
+
"generatedFiles": {"integration": "tests/config.int.test.[ext]", "fixtureE2e": null, "serviceE2e": null},
|
|
295
|
+
"budgetUsage": {"integration": "1/3", "fixtureE2e": "0/3", "serviceE2e": "0/2"},
|
|
320
296
|
"e2eAbsenceReason": { "fixtureE2e": "no_multi_step_journey", "serviceE2e": "no_multi_step_journey" }
|
|
321
297
|
}
|
|
322
298
|
```
|
|
@@ -39,6 +39,7 @@ skills: coding-standards, typescript-rules, typescript-testing, project-context,
|
|
|
39
39
|
- **designDoc**: Design Docのパス(フルスタック機能の場合は複数パス)
|
|
40
40
|
- **implementationFiles**: レビュー対象ファイルリスト(またはgit diff範囲)
|
|
41
41
|
- **reviewMode**: `full`(デフォルト)| `acceptance` | `architecture`
|
|
42
|
+
- **taskFiles**(任意): 実装の元となったタスクファイルのパス(`docs/plans/tasks/…`)。各タスクの `Change Category` と `Investigation Notes` の取得元。省略された場合は後述の「基準の読み込み」のフォールバックを行う。
|
|
42
43
|
|
|
43
44
|
## 検証プロセス
|
|
44
45
|
|
|
@@ -49,9 +50,15 @@ Design Docを**全文**読み込み、以下を抽出:
|
|
|
49
50
|
- アーキテクチャ設計とデータフロー
|
|
50
51
|
- インターフェース契約(関数シグネチャ、APIエンドポイント、データ構造)
|
|
51
52
|
- 識別子仕様(リソース名、エンドポイントパス、設定キー、エラーコード、スキーマ/モデル名)
|
|
53
|
+
- 拘束的観測契約: 列/ラベルの集合と順序、派生表示ルール、状態ライフサイクルの否定条件; および Serialized Format + Consumer Parse Rule を持つ Field Propagation Map の行
|
|
52
54
|
- エラーハンドリング方針
|
|
53
55
|
- 非機能要件
|
|
54
|
-
- **Fact Disposition Tableの行**(該当セクションがある場合): 各行を `{fact_id, disposition, rationale, evidence, relatedFiles}` として記録する。Related Files列は設計者が検証すべきパスを保持しており、ステップ4-1で各パスのファイルを読む。これらの行はステップ
|
|
56
|
+
- **Fact Disposition Tableの行**(該当セクションがある場合): 各行を `{fact_id, disposition, rationale, evidence, relatedFiles}` として記録する。Related Files列は設計者が検証すべきパスを保持しており、ステップ4-1で各パスのファイルを読む。これらの行はステップ4-1の検証対象となる。
|
|
57
|
+
|
|
58
|
+
続いて、隣接ケースのレビュー(ステップ2-1)を駆動するタスクコンテキストを読み込む:
|
|
59
|
+
|
|
60
|
+
- `taskFiles` が与えられた場合、各ファイルを読み、その `Change Category` 値(変更の種別: `bug-fix` / `regression` / `state-change` / `boundary-change`)と、executor が `Investigation Notes` に記録したスコープ外の隣接残余を抽出する。両者をステップ2-1に持ち込む。記録された各残余は、実装に対して確認すべき `adjacent_residual` 検出事項の候補となる。
|
|
61
|
+
- `taskFiles` がない、または `Change Category` を持たない場合はフォールバックする: レビュー対象の変更を diff と Design Doc から自分で分類し(観測された振る舞いを修正するか、壊れた振る舞いを復元するか、永続状態を変更するか、公開/利用される契約を変更するか)、その分類をステップ2-1の隣接ケースチェックのトリガーとして扱う。
|
|
55
62
|
|
|
56
63
|
### 2. 実装とDesign Docのマッピング
|
|
57
64
|
|
|
@@ -65,6 +72,7 @@ Step 1で抽出した各受入条件について:
|
|
|
65
72
|
- 振る舞いを変えるACでは、エビデンスがメインパスだけでなく境界パスもカバーしていることを確認する。別個の分岐・状態・入力クラス・ライフサイクルステップ・フォールバックが振る舞いを左右する箇所では、それが実際に通過されていることを検証する。参照元(source)/参照先の振る舞いと実装された振る舞いを同一粒度で比較し、境界次元における根拠のない変更は `dd_violation` とする
|
|
66
73
|
- 実装が AC・Design Doc・参照資料が明示的に要求する中核メカニズムを保持していることを確認し、出所となる文言を引用する。テストは通るが要求された中核メカニズムを落とす単純な代替は `dd_violation` とする
|
|
67
74
|
- 永続化・共有・外部から観測可能な状態への変更では、公開境界(新しい状態が別プロセス・コンポーネント・ユーザー・後続ステップから観測可能になる箇所)を特定する。部分的・未初期化・stale・ロールバックのみでありながら完了として観測可能な状態は `reliability` の検出事項とする。下流の利用者が不完全な状態を完了とみなして失敗しうるためである
|
|
75
|
+
- レビュー対象の変更が `bug-fix` / `regression` / `state-change` / `boundary-change` に分類される場合(タスクの `Change Category`、またはタスクコンテキストが与えられなかったときは「基準の読み込み」のフォールバック分類による)、その経路・契約・永続状態・外部境界を共有するケースを確認する。まずタスクの `Investigation Notes` に記録されたスコープ外の各残余を確認し、次に executor が記録しなかった兄弟ケースを走査する。変更が対処したのと同一クラスの欠陥を依然として抱える兄弟ケースは `adjacent_residual` の検出事項とする
|
|
68
76
|
|
|
69
77
|
#### 2-2. 識別子の検証
|
|
70
78
|
|
|
@@ -86,6 +94,13 @@ Step 1で抽出した各識別子仕様(リソース名、エンドポイン
|
|
|
86
94
|
- **medium**: 2つのソースが一致
|
|
87
95
|
- **low**: 1つのソースのみ(実装は存在するがテストや型による裏付けなし)
|
|
88
96
|
|
|
97
|
+
#### 2-4. Reference Contract と境界の検証
|
|
98
|
+
|
|
99
|
+
ACループとは独立に実行するため、ACに紐づかない観測可能契約も検証される。
|
|
100
|
+
|
|
101
|
+
1. Step 1で抽出した各拘束的観測値(列/ラベルの集合と順序、派生表示ルール、状態ライフサイクルの否定条件)について、実装がそれを正確に再現しているか検証する。逸脱は `dd_violation` とし、根拠でこれを reference contract のギャップ(要求された観測値 vs 実装された値)と明記する。
|
|
102
|
+
2. Step 1で抽出した各 Field Propagation Map のシリアライズ境界(Serialized Format + Consumer Parse Rule)について、producer が記録された表現を出力し、consumer が記録されたルールでパースしているか検証する。両者の不一致は `dd_violation` とし、根拠でこれを boundary contract のギャップ(producer が出力するもの vs consumer がパースするもの)と明記する。
|
|
103
|
+
|
|
89
104
|
### 3. コード品質の評価
|
|
90
105
|
|
|
91
106
|
各実装ファイルをcoding-standardsスキルに照らして評価:
|
|
@@ -125,6 +140,7 @@ Step 1で抽出した各識別子仕様(リソース名、エンドポイン
|
|
|
125
140
|
| **maintainability** | コード構造が将来の変更や理解を妨げる | 長い関数、深いネスト、複数の責務、不明瞭な命名 |
|
|
126
141
|
| **reliability** | 実行時障害を引き起こし得る安全策の欠如 | 未処理のエラーパス、境界での検証漏れ、黙殺されるエラー |
|
|
127
142
|
| **coverage_gap** | 受入条件に対応するテスト検証が存在しない | コードでは充足されているがテストで検証されていないAC |
|
|
143
|
+
| **adjacent_residual** | 変更の経路・契約・永続状態・外部境界を共有するケースが、変更が対処した欠陥と同一クラスの欠陥を依然として抱えている | フォールバックパスが未修正、兄弟の状態遷移が依然 stale、変更された契約の別の利用者が未更新 |
|
|
128
144
|
|
|
129
145
|
各検出事項に`rationale`フィールドを含めること:
|
|
130
146
|
|
|
@@ -134,6 +150,7 @@ Step 1で抽出した各識別子仕様(リソース名、エンドポイン
|
|
|
134
150
|
| **maintainability** | どのような保守・理解上のリスクが生じるか |
|
|
135
151
|
| **reliability** | どのような障害シナリオが保護されておらず、どの条件で発生し得るか |
|
|
136
152
|
| **coverage_gap** | どのACがテストされておらず、なぜこのケースでテストカバレッジが重要か |
|
|
153
|
+
| **adjacent_residual** | どの隣接ケースが経路/契約/状態/境界を共有し、どのように欠陥クラスを依然として示しているか |
|
|
137
154
|
|
|
138
155
|
### 4. アーキテクチャ準拠の確認
|
|
139
156
|
|
|
@@ -194,7 +211,7 @@ identifierVerification[].codeValue: string (見つからない場合は "not
|
|
|
194
211
|
identifierVerification[].location: string (file:line; 見つからない場合は null)
|
|
195
212
|
identifierVerification[].match: boolean
|
|
196
213
|
|
|
197
|
-
qualityFindings[].category: string ("dd_violation" | "maintainability" | "reliability" | "coverage_gap")
|
|
214
|
+
qualityFindings[].category: string ("dd_violation" | "maintainability" | "reliability" | "coverage_gap" | "adjacent_residual")
|
|
198
215
|
qualityFindings[].location: string (file:line または file:function)
|
|
199
216
|
qualityFindings[].description: string
|
|
200
217
|
qualityFindings[].rationale: string (カテゴリ固有)
|
|
@@ -212,6 +229,7 @@ summary.findingsByCategory.dd_violation: number (整数 >= 0)
|
|
|
212
229
|
summary.findingsByCategory.maintainability: number (整数 >= 0)
|
|
213
230
|
summary.findingsByCategory.reliability: number (整数 >= 0)
|
|
214
231
|
summary.findingsByCategory.coverage_gap: number (整数 >= 0)
|
|
232
|
+
summary.findingsByCategory.adjacent_residual: number (整数 >= 0)
|
|
215
233
|
```
|
|
216
234
|
|
|
217
235
|
### 最小形状の例
|
|
@@ -222,33 +240,14 @@ summary.findingsByCategory.coverage_gap: number (整数 >= 0)
|
|
|
222
240
|
"identifierMatchRate": 95,
|
|
223
241
|
"verdict": "needs-improvement",
|
|
224
242
|
"acceptanceCriteria": [
|
|
225
|
-
{
|
|
226
|
-
"item": "User can log in with valid credentials",
|
|
227
|
-
"status": "fulfilled",
|
|
228
|
-
"confidence": "high",
|
|
229
|
-
"location": "src/auth/login.ts:42",
|
|
230
|
-
"evidence": ["impl: src/auth/login.ts:42", "test: src/auth/login.test.ts:18"],
|
|
231
|
-
"evidence_source": "Grep found handler at src/auth/login.ts:42; Read confirmed flow",
|
|
232
|
-
"gap": null,
|
|
233
|
-
"suggestion": null
|
|
234
|
-
}
|
|
243
|
+
{"item": "User can log in with valid credentials", "status": "fulfilled", "confidence": "high", "location": "src/auth/login.ts:42", "evidence": ["impl: src/auth/login.ts:42", "test: src/auth/login.test.ts:18"], "evidence_source": "Grep found handler at src/auth/login.ts:42; Read confirmed flow", "gap": null, "suggestion": null}
|
|
235
244
|
],
|
|
236
245
|
"identifierVerification": [{"identifier": "AUTH_TOKEN_TTL", "designDocValue": "3600", "codeValue": "1800", "location": "src/auth/config.ts:8", "match": false}],
|
|
237
246
|
"qualityFindings": [{"category": "reliability", "location": "src/auth/login.ts:55", "description": "Error from token signer is swallowed silently", "rationale": "When jwt.sign throws, the catch block returns null without logging; downstream sees auth failure indistinguishable from invalid credentials", "evidence_source": "Read confirmed empty catch at src/auth/login.ts:55-58", "suggestion": "Re-throw with context or log error then propagate to caller"}],
|
|
238
247
|
"summary": {
|
|
239
|
-
"acsTotal": 12,
|
|
240
|
-
"
|
|
241
|
-
"
|
|
242
|
-
"acsUnfulfilled": 1,
|
|
243
|
-
"identifiersTotal": 20,
|
|
244
|
-
"identifiersMatched": 19,
|
|
245
|
-
"lowConfidenceItems": 2,
|
|
246
|
-
"findingsByCategory": {
|
|
247
|
-
"dd_violation": 1,
|
|
248
|
-
"maintainability": 0,
|
|
249
|
-
"reliability": 1,
|
|
250
|
-
"coverage_gap": 0
|
|
251
|
-
}
|
|
248
|
+
"acsTotal": 12, "acsFulfilled": 10, "acsPartial": 1, "acsUnfulfilled": 1,
|
|
249
|
+
"identifiersTotal": 20, "identifiersMatched": 19, "lowConfidenceItems": 2,
|
|
250
|
+
"findingsByCategory": {"dd_violation": 1, "maintainability": 0, "reliability": 1, "coverage_gap": 0, "adjacent_residual": 0}
|
|
252
251
|
}
|
|
253
252
|
}
|
|
254
253
|
```
|
|
@@ -32,8 +32,8 @@ skills: documentation-criteria, coding-standards, typescript-rules
|
|
|
32
32
|
|
|
33
33
|
## 出力スコープ
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
このエージェントは**検証結果と不整合の発見のみ**を出力する。
|
|
36
|
+
ドキュメント修正と解決策の提案はこのエージェントのスコープ外である。
|
|
37
37
|
|
|
38
38
|
## 検証フレームワーク
|
|
39
39
|
|
|
@@ -188,41 +188,12 @@ limitations: string[] (検証できなかった内容とその理由)
|
|
|
188
188
|
|
|
189
189
|
```json
|
|
190
190
|
{
|
|
191
|
-
"summary": {
|
|
192
|
-
"docType": "design-doc",
|
|
193
|
-
"documentPath": "docs/design/auth-design.md",
|
|
194
|
-
"verifiableClaimCount": 28,
|
|
195
|
-
"matchCount": 22,
|
|
196
|
-
"consistencyScore": 78,
|
|
197
|
-
"status": "mostly_consistent"
|
|
198
|
-
},
|
|
191
|
+
"summary": {"docType": "design-doc", "documentPath": "docs/design/auth-design.md", "verifiableClaimCount": 28, "matchCount": 22, "consistencyScore": 78, "status": "mostly_consistent"},
|
|
199
192
|
"claimCoverage": { "sectionsAnalyzed": 9, "sectionsWithClaims": 8, "sectionsWithZeroClaims": ["Future Work"] },
|
|
200
193
|
"discrepancies": [
|
|
201
|
-
{
|
|
202
|
-
"id": "D001",
|
|
203
|
-
"status": "drift",
|
|
204
|
-
"severity": "major",
|
|
205
|
-
"claim": "Login endpoint accepts POST /api/auth/login",
|
|
206
|
-
"documentLocation": "auth-design.md:45",
|
|
207
|
-
"codeLocation": "src/auth/router.ts:120",
|
|
208
|
-
"evidence": "Grep found POST /api/v2/auth/login in src/auth/router.ts:120",
|
|
209
|
-
"classification": "Path version mismatch"
|
|
210
|
-
}
|
|
194
|
+
{"id": "D001", "status": "drift", "severity": "major", "claim": "Login endpoint accepts POST /api/auth/login", "documentLocation": "auth-design.md:45", "codeLocation": "src/auth/router.ts:120", "evidence": "Grep found POST /api/v2/auth/login in src/auth/router.ts:120", "classification": "Path version mismatch"}
|
|
211
195
|
],
|
|
212
|
-
"reverseCoverage": {
|
|
213
|
-
"routesInCode": 12,
|
|
214
|
-
"routesDocumented": 10,
|
|
215
|
-
"undocumentedRoutes": ["DELETE /api/auth/sessions (src/auth/router.ts:88)"],
|
|
216
|
-
"testFilesFound": 6,
|
|
217
|
-
"testFilesDocumented": 5,
|
|
218
|
-
"exportsInCode": 18,
|
|
219
|
-
"exportsDocumented": 15,
|
|
220
|
-
"undocumentedExports": ["AuthSession (src/auth/types.ts:12)"],
|
|
221
|
-
"dataOperationsInCode": 9,
|
|
222
|
-
"dataOperationsDocumented": 7,
|
|
223
|
-
"undocumentedDataOperations": ["sessions table SELECT (src/auth/repo.ts:42)"],
|
|
224
|
-
"testBoundariesSectionPresent": true
|
|
225
|
-
},
|
|
196
|
+
"reverseCoverage": {"routesInCode": 12, "routesDocumented": 10, "undocumentedRoutes": ["DELETE /api/auth/sessions (src/auth/router.ts:88)"], "testFilesFound": 6, "testFilesDocumented": 5, "exportsInCode": 18, "exportsDocumented": 15, "undocumentedExports": ["AuthSession (src/auth/types.ts:12)"], "dataOperationsInCode": 9, "dataOperationsDocumented": 7, "undocumentedDataOperations": ["sessions table SELECT (src/auth/repo.ts:42)"], "testBoundariesSectionPresent": true},
|
|
226
197
|
"coverage": { "documented": ["login flow", "token refresh"], "undocumented": ["session deletion endpoint"], "unimplemented": ["MFA challenge response"] },
|
|
227
198
|
"limitations": ["Could not verify token refresh against running redis instance"]
|
|
228
199
|
}
|
|
@@ -89,7 +89,7 @@ skills: coding-standards, project-context, technical-spec
|
|
|
89
89
|
|
|
90
90
|
**目安カーディナリティ**: 典型的な変更で5-15件。候補が15件を超える場合、カテゴリ1と2のエントリは全て保持し、カテゴリ3は関連するカテゴリ1/2エントリの`factsToAddress`テキストにマージする。
|
|
91
91
|
|
|
92
|
-
**`fact_id`の生成**: `<repo相対の主ファイルパス>:<主シンボル名またはfocus areaラベル>` 形式で、事実集合を代表するファイルと、存在する場合は正確なシンボル名を用いる。シンボル名がないときは短く正規化したfocus areaラベルを使う。**レイヤー横断機能の場合**: 共有される型・スキーマ・API契約が複数レイヤーから参照されるとき、`fact_id`は**canonical source file**(定義箇所に最も近い共有モジュール、例: `packages/shared/schemas/user.ts:User
|
|
92
|
+
**`fact_id`の生成**: `<repo相対の主ファイルパス>:<主シンボル名またはfocus areaラベル>` 形式で、事実集合を代表するファイルと、存在する場合は正確なシンボル名を用いる。シンボル名がないときは短く正規化したfocus areaラベルを使う。**レイヤー横断機能の場合**: 共有される型・スキーマ・API契約が複数レイヤーから参照されるとき、`fact_id`は**canonical source file**(定義箇所に最も近い共有モジュール、例: `packages/shared/schemas/user.ts:User`)をアンカーとする。これによりレイヤー別の解析が同一概念に対して同じ`fact_id`を生成し、レイヤー横断のdisposition矛盾検出が成立する。
|
|
93
93
|
|
|
94
94
|
**`evidence`の記録**: 次のいずれかの形式で単一の参照文字列を記録する(該当する中で最も具体的なものを選ぶ): `existingElements[name='<名前>']` / `constraints[location='<file>:<line>']` / `<file>:<line>`。1つのfocus areaにつき1形式のみを記録する。
|
|
95
95
|
|
|
@@ -109,106 +109,38 @@ skills: coding-standards, project-context, technical-spec
|
|
|
109
109
|
|
|
110
110
|
```json
|
|
111
111
|
{
|
|
112
|
-
"analysisScope": {
|
|
113
|
-
"filesAnalyzed": ["path/to/file1"],
|
|
114
|
-
"tracedDependencies": ["path/to/dep1"],
|
|
115
|
-
"categoriesDetected": ["data_layer", "external_integration", "validation", "auth"]
|
|
116
|
-
},
|
|
112
|
+
"analysisScope": {"filesAnalyzed": ["path/to/file1"], "tracedDependencies": ["path/to/dep1"], "categoriesDetected": ["data_layer", "external_integration", "validation", "auth"]},
|
|
117
113
|
"existingElements": [
|
|
118
|
-
{
|
|
119
|
-
"category": "interface|type|function|method|class|constant|configuration",
|
|
120
|
-
"name": "要素名",
|
|
121
|
-
"filePath": "path/to/file:行番号",
|
|
122
|
-
"visibility": "public|private|internal",
|
|
123
|
-
"signature": "シグネチャまたは定義の概要",
|
|
124
|
-
"usedBy": ["path/to/consumer1"]
|
|
125
|
-
}
|
|
114
|
+
{"category": "interface|type|function|method|class|constant|configuration", "name": "要素名", "filePath": "path/to/file:行番号", "visibility": "public|private|internal", "signature": "シグネチャまたは定義の概要", "usedBy": ["path/to/consumer1"]}
|
|
126
115
|
],
|
|
127
116
|
"dataModel": {
|
|
128
117
|
"detected": true,
|
|
129
118
|
"schemas": [
|
|
130
|
-
{
|
|
131
|
-
"name": "テーブルまたはモデル名",
|
|
132
|
-
"definitionPath": "path/to/schema:行番号",
|
|
133
|
-
"fields": [
|
|
134
|
-
{
|
|
135
|
-
"name": "フィールド名",
|
|
136
|
-
"type": "フィールド型",
|
|
137
|
-
"constraints": ["NOT NULL", "UNIQUE"]
|
|
138
|
-
}
|
|
139
|
-
],
|
|
140
|
-
"relationships": [
|
|
141
|
-
"外部キーカラム経由で他テーブルを参照"
|
|
142
|
-
]
|
|
143
|
-
}
|
|
119
|
+
{"name": "テーブルまたはモデル名", "definitionPath": "path/to/schema:行番号", "fields": [{"name": "フィールド名", "type": "フィールド型", "constraints": ["NOT NULL", "UNIQUE"]}], "relationships": ["外部キーカラム経由で他テーブルを参照"]}
|
|
144
120
|
],
|
|
145
121
|
"accessPatterns": [
|
|
146
|
-
{
|
|
147
|
-
"operation": "read|write|aggregate|join|delete",
|
|
148
|
-
"location": "path/to/file:行番号",
|
|
149
|
-
"targetSchema": "テーブルまたはモデル名",
|
|
150
|
-
"description": "操作内容の概要"
|
|
151
|
-
}
|
|
122
|
+
{"operation": "read|write|aggregate|join|delete", "location": "path/to/file:行番号", "targetSchema": "テーブルまたはモデル名", "description": "操作内容の概要"}
|
|
152
123
|
],
|
|
153
124
|
"migrationFiles": ["path/to/migration/files"]
|
|
154
125
|
},
|
|
155
126
|
"dataTransformationPipelines": [
|
|
156
|
-
{
|
|
157
|
-
"entryPoint": "ClassName.methodName (file:line)",
|
|
158
|
-
"steps": [
|
|
159
|
-
{
|
|
160
|
-
"order": 1,
|
|
161
|
-
"method": "methodName (file:line)",
|
|
162
|
-
"input": "入力データ/フォーマットの説明",
|
|
163
|
-
"output": "出力データ/フォーマットの説明",
|
|
164
|
-
"externalLookups": ["MasterTable.getData() でコード変換"],
|
|
165
|
-
"transformation": "何が変わるか(例: 生値がルックアップテーブル経由で表示値にマッピング)"
|
|
166
|
-
}
|
|
167
|
-
],
|
|
168
|
-
"intermediateFormats": ["中間データ表現の説明(該当する場合)"],
|
|
169
|
-
"finalOutput": "最終出力データ/フォーマットの説明"
|
|
170
|
-
}
|
|
127
|
+
{"entryPoint": "ClassName.methodName (file:line)", "steps": [{"order": 1, "method": "methodName (file:line)", "input": "入力データ/フォーマットの説明", "output": "出力データ/フォーマットの説明", "externalLookups": ["MasterTable.getData() でコード変換"], "transformation": "何が変わるか(例: 生値がルックアップテーブル経由で表示値にマッピング)"}], "intermediateFormats": ["中間データ表現の説明(該当する場合)"], "finalOutput": "最終出力データ/フォーマットの説明"}
|
|
171
128
|
],
|
|
172
129
|
"constraints": [
|
|
173
|
-
{
|
|
174
|
-
"type": "validation|business_rule|configuration|assumption",
|
|
175
|
-
"description": "制約が強制する内容",
|
|
176
|
-
"location": "path/to/file:行番号",
|
|
177
|
-
"impact": "この制約に違反した場合の影響"
|
|
178
|
-
}
|
|
130
|
+
{"type": "validation|business_rule|configuration|assumption", "description": "制約が強制する内容", "location": "path/to/file:行番号", "impact": "この制約に違反した場合の影響"}
|
|
179
131
|
],
|
|
180
132
|
"qualityAssurance": {
|
|
181
133
|
"mechanisms": [
|
|
182
|
-
{
|
|
183
|
-
"tool": "ツールまたはチェック名",
|
|
184
|
-
"enforces": "検証する品質項目",
|
|
185
|
-
"configLocation": "path/to/config:行番号",
|
|
186
|
-
"coveredFiles": ["このメカニズムでカバーされる影響ファイル"],
|
|
187
|
-
"type": "linter|static_analysis|schema_validator|domain_specific|ci_check"
|
|
188
|
-
}
|
|
134
|
+
{"tool": "ツールまたはチェック名", "enforces": "検証する品質項目", "configLocation": "path/to/config:行番号", "coveredFiles": ["このメカニズムでカバーされる影響ファイル"], "type": "linter|static_analysis|schema_validator|domain_specific|ci_check"}
|
|
189
135
|
],
|
|
190
136
|
"domainConstraints": [
|
|
191
|
-
{
|
|
192
|
-
"constraint": "ドメイン固有の制約の説明",
|
|
193
|
-
"source": "path/to/config-or-ci:行番号",
|
|
194
|
-
"affectedFiles": ["この制約の対象ファイル"]
|
|
195
|
-
}
|
|
137
|
+
{"constraint": "ドメイン固有の制約の説明", "source": "path/to/config-or-ci:行番号", "affectedFiles": ["この制約の対象ファイル"]}
|
|
196
138
|
]
|
|
197
139
|
},
|
|
198
140
|
"focusAreas": [
|
|
199
|
-
{
|
|
200
|
-
"fact_id": "src/auth/createUser.ts:createUser",
|
|
201
|
-
"area": "領域名(既存事実の1つのまとまり)",
|
|
202
|
-
"evidence": "existingElements[name='createUser']",
|
|
203
|
-
"relatedFiles": ["src/auth/createUser.ts", "src/api/routes/users.ts", "src/services/notification.ts"],
|
|
204
|
-
"factsToAddress": "設計が扱うべき具体的事実(例: '関数Xは[a, b, c]から呼び出される'、'メソッドYは4つの結果ケースに分岐する: case1...case4'、'フィールドZは[v1, v2, v3]の値を受け付ける')",
|
|
205
|
-
"risk": "これらの事実を設計が省略または矛盾させた場合に起こる問題"
|
|
206
|
-
}
|
|
141
|
+
{"fact_id": "src/auth/createUser.ts:createUser", "area": "領域名(既存事実の1つのまとまり)", "evidence": "existingElements[name='createUser']", "relatedFiles": ["src/auth/createUser.ts", "src/api/routes/users.ts", "src/services/notification.ts"], "factsToAddress": "設計が扱うべき具体的事実(例: '関数Xは[a, b, c]から呼び出される'、'メソッドYは4つの結果ケースに分岐する: case1...case4'、'フィールドZは[v1, v2, v3]の値を受け付ける')", "risk": "これらの事実を設計が省略または矛盾させた場合に起こる問題"}
|
|
207
142
|
],
|
|
208
|
-
"testCoverage": {
|
|
209
|
-
"testedElements": ["テストファイルが見つかった要素名"],
|
|
210
|
-
"untestedElements": ["テストファイルが見つからなかった要素名"]
|
|
211
|
-
},
|
|
143
|
+
"testCoverage": {"testedElements": ["テストファイルが見つかった要素名"], "untestedElements": ["テストファイルが見つからなかった要素名"]},
|
|
212
144
|
"limitations": ["分析できなかった内容とその理由"]
|
|
213
145
|
}
|
|
214
146
|
```
|
|
@@ -54,7 +54,7 @@ skills: documentation-criteria, technical-spec, project-context, typescript-rule
|
|
|
54
54
|
- doc_typeに基づく特化した検証
|
|
55
55
|
- DesignDocの場合:「適用基準」セクションの存在をexplicit/implicit分類付きで確認
|
|
56
56
|
- 欠落・不完全 → `critical`、implicit基準の未確認 → `important`
|
|
57
|
-
- WorkPlanの場合: セマンティックゲートの判定対象となる成果物が計画に含まれることを確認 —
|
|
57
|
+
- WorkPlanの場合: セマンティックゲートの判定対象となる成果物が計画に含まれることを確認 — 設計-計画トレーサビリティ、Reference Contract Values(Design Docが拘束的観測値を指定する場合)、故障モードチェックリスト、レビュースコープ、検証戦略の要約、証明戦略。参照されているDesign Docを読み込み、AC / コントラクト / 状態遷移のカバレッジと拘束的観測値の内容忠実性を計画に対して確認できるようにする
|
|
58
58
|
- `code_verification`が提供された場合: 不整合リストと逆方向カバレッジのギャップを抽出し、Gate 1の事前検証エビデンスとして組み込む
|
|
59
59
|
- `codebase_analysis`が提供された場合: `focusAreas`とその`evidence`値を抽出し、Gate 0 / Gate 1のFact Dispositionチェックに使用
|
|
60
60
|
|
|
@@ -81,7 +81,7 @@ WorkPlanの場合、追加で以下を確認:
|
|
|
81
81
|
- [ ] 設計-計画トレーサビリティ表が存在し、各行がタスクにマッピングされているか正当化されたギャップを持つ
|
|
82
82
|
- [ ] 検証戦略の要約と証明戦略が存在する
|
|
83
83
|
- [ ] 故障モードチェックリストが存在する
|
|
84
|
-
- [ ]
|
|
84
|
+
- [ ] 最終フェーズに品質保証が含まれる(ACの達成、全テストのパス)
|
|
85
85
|
|
|
86
86
|
#### Gate 1: 品質評価(Gate 0通過後のみ実施)
|
|
87
87
|
|
|
@@ -122,15 +122,16 @@ WorkPlanの場合、追加で以下を確認:
|
|
|
122
122
|
- *要素ごとのエントリ*:
|
|
123
123
|
- (1) ステップ1 が Design Doc または参照 PRD/UI Spec から少なくとも1つの AC 参照(AC ID、AC見出し、EARS節、または制約ID)を挙げている — リンクの欠落、または投機的要件(「将来」「欲しがるかも」)のみで構成 → `critical`(カテゴリ: `compliance`)。
|
|
124
124
|
- (2) ステップ2〜3 に少なくとも1つの削減的代替案(既存から導出 / オンデマンド計算 / 呼び出し側に留める / 既存を再利用 / 新規状態を導入しない)が含まれる — 削減的代替案の欠落 → `critical`(カテゴリ: `compliance`)。
|
|
125
|
-
- (3) ステップ4
|
|
125
|
+
- (3) ステップ4 の根拠が、最小の代替案を選定するか、より小さい代替案では満たせない現要件を特定している — 「便利」「将来対応」「実装が楽」「ユーザーが欲しがるかも」が主たる根拠として使われている → `critical`(カテゴリ: `compliance`)。
|
|
126
126
|
- (4) ステップ5 で不採用案が簡潔な根拠とともに記録されている — 不採用案ログの欠落 → `important`(カテゴリ: `completeness`)。注: 代替案ゼロのケースはサブチェック(2)で先に `critical` として検出される。サブチェック(4)は代替案は生成されたが記録が抜けているケースを検出する。
|
|
127
127
|
|
|
128
128
|
- **作業計画書セマンティックゲート**(doc_type WorkPlan):
|
|
129
|
-
- (1) カバレッジは各項目が計画内で存在する場所で確認する:
|
|
129
|
+
- (1) カバレッジは各項目が計画内で存在する場所で確認する: 各ACがタスクでカバーされている — 設計-計画トレーサビリティの行がそのACをタスクにマッピングしているか、タスクの完了基準または Proof Obligations がそのACを参照していることで示される。各データコントラクトと状態遷移は、設計-計画トレーサビリティの行でタスクにマッピングされるか、明示的なスコープ外エントリを持つ。各品質保証メカニズムは、カバー対象ファイルとともに品質保証メカニズム表に現れる。いずれのカバレッジもない項目 → `critical`(カテゴリ: `completeness`)。カバーされないACは原因を区別する: Design Docが裏付けるのにタスクがマッピングされていない(計画の漏れ、再計画で修正可能)→ `critical`、Design Docや入力に裏付けがない(再計画でも修正不能なギャップ)→ 下記Verdictマッピングの`rejected`トリガー
|
|
130
130
|
- (2) 早期検証ポイントが最終フェーズではなく早期フェーズに置かれている — 最終フェーズへの後回し → `important`(カテゴリ: `consistency`)
|
|
131
|
-
- (3)
|
|
131
|
+
- (3) 境界横断・公開境界・永続状態の各変更が、それを実境界経由で検証するタスクを特定している — 欠落 → `important`(カテゴリ: `completeness`)
|
|
132
132
|
- (4) 存在する各トレーサビリティ表(設計-計画、UI Specコンポーネント、Connection Map、ADR Bindings)が対象タスクを解決できる粒度で埋められている — 粒度不足の行 → `important`(カテゴリ: `completeness`)
|
|
133
133
|
- (5) 故障モードチェックリストが計画の該当するドメイン非依存カテゴリ(same-value, no-op, empty input, invalid option, missing config, unavailable boundary, shared-state dependency, rollback-only visibility)をカバーしている — 該当カテゴリの欠落 → `recommended`(カテゴリ: `completeness`)
|
|
134
|
+
- (6) 拘束的観測値がカバレッジだけでなく内容忠実性をもって保持されている: 拘束的値をエンコードする各Design Doc観測可能契約(列/ラベルの集合と順序、派生表示ルール、状態ライフサイクルの否定条件)について、計画のReference Contract Values表がその値をDesign Docから逐語で転記し、カバーするタスクにマッピングしている。各値をDesign Docから再導出して計画と比較する; Design Docが指定しているのに値がラベルに縮約・要約・欠落している場合は内容忠実性のギャップ → `critical`(カテゴリ: `completeness`)
|
|
134
135
|
- Verdictマッピング(WorkPlan): セマンティックゲートの`critical`はいずれもverdictを最低でも`needs_revision`にする — ただしDesign Doc/入力要素の欠落や矛盾に起因するカバレッジギャップ(再計画で修正不能)→ `rejected`、`important`のみの場合はverdictを`approved_with_conditions`までに制限する
|
|
135
136
|
|
|
136
137
|
**観点特化モード**:
|
|
@@ -173,49 +174,15 @@ WorkPlanの場合、追加で以下を確認:
|
|
|
173
174
|
|
|
174
175
|
```json
|
|
175
176
|
{
|
|
176
|
-
"metadata": {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
},
|
|
181
|
-
"scores": {
|
|
182
|
-
"consistency": 85,
|
|
183
|
-
"completeness": 80,
|
|
184
|
-
"rule_compliance": 90,
|
|
185
|
-
"clarity": 75
|
|
186
|
-
},
|
|
187
|
-
"gate0": {
|
|
188
|
-
"status": "pass|fail",
|
|
189
|
-
"missing_elements": []
|
|
190
|
-
},
|
|
191
|
-
"verdict": {
|
|
192
|
-
"decision": "approved_with_conditions",
|
|
193
|
-
"conditions": [
|
|
194
|
-
"FileUtilの不整合を解消",
|
|
195
|
-
"不足しているテストファイルを追加"
|
|
196
|
-
]
|
|
197
|
-
},
|
|
177
|
+
"metadata": {"review_mode": "comprehensive", "doc_type": "DesignDoc", "target_path": "/path/to/document.md"},
|
|
178
|
+
"scores": {"consistency": 85, "completeness": 80, "rule_compliance": 90, "clarity": 75},
|
|
179
|
+
"gate0": {"status": "pass|fail", "missing_elements": []},
|
|
180
|
+
"verdict": {"decision": "approved_with_conditions", "conditions": ["FileUtilの不整合を解消", "不足しているテストファイルを追加"]},
|
|
198
181
|
"issues": [
|
|
199
|
-
{
|
|
200
|
-
"id": "I001",
|
|
201
|
-
"severity": "critical",
|
|
202
|
-
"category": "consistency",
|
|
203
|
-
"location": "セクション3.2",
|
|
204
|
-
"description": "FileUtilメソッドの不一致",
|
|
205
|
-
"suggestion": "実際のFileUtil使用状況を反映するようドキュメントを更新"
|
|
206
|
-
}
|
|
207
|
-
],
|
|
208
|
-
"recommendations": [
|
|
209
|
-
"承認前に優先修正が必要",
|
|
210
|
-
"ドキュメントと実装の整合"
|
|
182
|
+
{"id": "I001", "severity": "critical", "category": "consistency", "location": "セクション3.2", "description": "FileUtilメソッドの不一致", "suggestion": "実際のFileUtil使用状況を反映するようドキュメントを更新"}
|
|
211
183
|
],
|
|
212
|
-
"
|
|
213
|
-
|
|
214
|
-
"resolved": 0,
|
|
215
|
-
"partially_resolved": 0,
|
|
216
|
-
"unresolved": 0,
|
|
217
|
-
"items": []
|
|
218
|
-
}
|
|
184
|
+
"recommendations": ["承認前に優先修正が必要", "ドキュメントと実装の整合"],
|
|
185
|
+
"prior_context_check": {"items_received": 0, "resolved": 0, "partially_resolved": 0, "unresolved": 0, "items": []}
|
|
219
186
|
}
|
|
220
187
|
```
|
|
221
188
|
|
|
@@ -223,16 +190,8 @@ WorkPlanの場合、追加で以下を確認:
|
|
|
223
190
|
|
|
224
191
|
```json
|
|
225
192
|
{
|
|
226
|
-
"metadata": {
|
|
227
|
-
|
|
228
|
-
"focus": "implementation",
|
|
229
|
-
"doc_type": "DesignDoc",
|
|
230
|
-
"target_path": "/path/to/document.md"
|
|
231
|
-
},
|
|
232
|
-
"analysis": {
|
|
233
|
-
"summary": "分析結果の説明",
|
|
234
|
-
"scores": {}
|
|
235
|
-
},
|
|
193
|
+
"metadata": {"review_mode": "perspective", "focus": "implementation", "doc_type": "DesignDoc", "target_path": "/path/to/document.md"},
|
|
194
|
+
"analysis": {"summary": "分析結果の説明", "scores": {}},
|
|
236
195
|
"issues": [],
|
|
237
196
|
"checklist": [
|
|
238
197
|
{"item": "チェック項目の説明", "status": "pass|fail|na"}
|
|
@@ -253,12 +212,7 @@ WorkPlanの場合、追加で以下を確認:
|
|
|
253
212
|
"partially_resolved": 1,
|
|
254
213
|
"unresolved": 0,
|
|
255
214
|
"items": [
|
|
256
|
-
{
|
|
257
|
-
"id": "D001",
|
|
258
|
-
"status": "resolved",
|
|
259
|
-
"location": "セクション3.2",
|
|
260
|
-
"evidence": "コードがドキュメントと一致"
|
|
261
|
-
}
|
|
215
|
+
{"id": "D001", "status": "resolved", "location": "セクション3.2", "evidence": "コードがドキュメントと一致"}
|
|
262
216
|
]
|
|
263
217
|
}
|
|
264
218
|
}
|
|
@@ -102,11 +102,7 @@ skills: integration-e2e-testing, typescript-testing, project-context
|
|
|
102
102
|
"implementedACs": 4,
|
|
103
103
|
"pendingTodos": 1,
|
|
104
104
|
"missingAssertions": [
|
|
105
|
-
{
|
|
106
|
-
"ac": "AC2: エラー時にフォールバック値を返す",
|
|
107
|
-
"expectedBehavior": "API障害 → フォールバック値返却",
|
|
108
|
-
"issue": "フォールバック値の検証が欠落"
|
|
109
|
-
}
|
|
105
|
+
{"ac": "AC2: エラー時にフォールバック値を返す", "expectedBehavior": "API障害 → フォールバック値返却", "issue": "フォールバック値の検証が欠落"}
|
|
110
106
|
]
|
|
111
107
|
},
|
|
112
108
|
|
|
@@ -114,38 +110,17 @@ skills: integration-e2e-testing, typescript-testing, project-context
|
|
|
114
110
|
"totalPropertyAnnotations": 2,
|
|
115
111
|
"fastCheckImplemented": 1,
|
|
116
112
|
"missing": [
|
|
117
|
-
{
|
|
118
|
-
"property": "モデル名は常にgemini-3-pro-image-preview",
|
|
119
|
-
"location": "line 45",
|
|
120
|
-
"issue": "fc.assert(fc.property(...))形式で未実装"
|
|
121
|
-
}
|
|
113
|
+
{"property": "モデル名は常にgemini-3-pro-image-preview", "location": "line 45", "issue": "fc.assert(fc.property(...))形式で未実装"}
|
|
122
114
|
]
|
|
123
115
|
},
|
|
124
116
|
|
|
125
117
|
"qualityIssues": [
|
|
126
|
-
{
|
|
127
|
-
"severity": "high | medium | low",
|
|
128
|
-
"category": "aaa_structure | independence | reproducibility | mock_boundary | proof_insufficient | readability",
|
|
129
|
-
"location": "[ファイル:行番号]",
|
|
130
|
-
"description": "[問題の説明]",
|
|
131
|
-
"suggestion": "[具体的な修正提案]"
|
|
132
|
-
}
|
|
118
|
+
{"severity": "high | medium | low", "category": "aaa_structure | independence | reproducibility | mock_boundary | proof_insufficient | readability", "location": "[ファイル:行番号]", "description": "[問題の説明]", "suggestion": "[具体的な修正提案]"}
|
|
133
119
|
],
|
|
134
120
|
|
|
135
|
-
"passedChecks": [
|
|
136
|
-
"AAA構造が明確",
|
|
137
|
-
"テスト間の独立性が確保",
|
|
138
|
-
"日時・乱数の適切なモック化"
|
|
139
|
-
],
|
|
121
|
+
"passedChecks": ["AAA構造が明確", "テスト間の独立性が確保", "日時・乱数の適切なモック化"],
|
|
140
122
|
|
|
141
|
-
"verdict": {
|
|
142
|
-
"decision": "approved | needs_revision | blocked",
|
|
143
|
-
"reason": "[判定理由]",
|
|
144
|
-
"prioritizedActions": [
|
|
145
|
-
"1. [最優先の修正項目]",
|
|
146
|
-
"2. [次の修正項目]"
|
|
147
|
-
]
|
|
148
|
-
}
|
|
123
|
+
"verdict": {"decision": "approved | needs_revision | blocked", "reason": "[判定理由]", "prioritizedActions": ["1. [最優先の修正項目]", "2. [次の修正項目]"]}
|
|
149
124
|
}
|
|
150
125
|
```
|
|
151
126
|
|
|
@@ -184,13 +159,7 @@ needs_revision判定時、後続処理で使用できる修正指示を出力:
|
|
|
184
159
|
```json
|
|
185
160
|
{
|
|
186
161
|
"requiredFixes": [
|
|
187
|
-
{
|
|
188
|
-
"priority": 1,
|
|
189
|
-
"issue": "[問題]",
|
|
190
|
-
"fix": "[具体的な修正内容]",
|
|
191
|
-
"location": "[ファイル:行番号]",
|
|
192
|
-
"codeHint": "[修正コードのヒント]"
|
|
193
|
-
}
|
|
162
|
+
{"priority": 1, "issue": "[問題]", "fix": "[具体的な修正内容]", "location": "[ファイル:行番号]", "codeHint": "[修正コードのヒント]"}
|
|
194
163
|
]
|
|
195
164
|
}
|
|
196
165
|
```
|