qfai 0.8.1 → 0.9.2
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/README.md +44 -5
- package/assets/init/.qfai/README.md +9 -1
- package/assets/init/.qfai/prompts/README.md +6 -1
- package/assets/init/.qfai/prompts/analyze/README.md +21 -0
- package/assets/init/.qfai/prompts/analyze/scenario_test_consistency.md +8 -0
- package/assets/init/.qfai/prompts/analyze/scenario_to_test.md +56 -0
- package/assets/init/.qfai/prompts/analyze/spec_contract_consistency.md +8 -0
- package/assets/init/.qfai/prompts/analyze/spec_scenario_consistency.md +8 -0
- package/assets/init/.qfai/prompts/analyze/spec_to_contract.md +54 -0
- package/assets/init/.qfai/prompts/analyze/spec_to_scenario.md +56 -0
- package/assets/init/.qfai/prompts.local/README.md +2 -1
- package/assets/init/.qfai/samples/analyze/analysis.md +38 -0
- package/assets/init/.qfai/samples/analyze/input_bundle.md +54 -0
- package/dist/cli/index.cjs +421 -243
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.mjs +405 -227
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
- [Quick Start](#quick-start最短成功)
|
|
13
13
|
- [機能](#できること)
|
|
14
14
|
- [CLI リファレンス](#使い方cli)
|
|
15
|
+
- [analyze(意味矛盾のレビュー補助)](#analyze意味矛盾のレビュー補助)
|
|
15
16
|
- [設定](#設定)
|
|
16
17
|
- [契約](#契約contracts)
|
|
17
18
|
- [Monorepo 対応](#monorepo--サブディレクトリ)
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
## インストール
|
|
24
25
|
|
|
25
26
|
```sh
|
|
26
|
-
npm install qfai
|
|
27
|
+
npm install -D qfai
|
|
27
28
|
```
|
|
28
29
|
|
|
29
30
|
または
|
|
@@ -32,6 +33,12 @@ npm install qfai
|
|
|
32
33
|
npx qfai init
|
|
33
34
|
```
|
|
34
35
|
|
|
36
|
+
pnpm の場合(推奨):
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
pnpm add -D qfai
|
|
40
|
+
```
|
|
41
|
+
|
|
35
42
|
**必要環境**: Node.js >= 18
|
|
36
43
|
|
|
37
44
|
## パッケージ
|
|
@@ -42,13 +49,14 @@ npx qfai init
|
|
|
42
49
|
|
|
43
50
|
```sh
|
|
44
51
|
npx qfai init
|
|
52
|
+
npx qfai doctor --fail-on error
|
|
45
53
|
npx qfai validate --fail-on error --format github
|
|
46
54
|
npx qfai report
|
|
47
55
|
```
|
|
48
56
|
|
|
49
57
|
## できること
|
|
50
58
|
|
|
51
|
-
- `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/**`、`.qfai/prompts.local/README.md`、`.qfai/promptpack/` を含む)
|
|
59
|
+
- `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/**`、`.qfai/prompts.local/README.md`、`.qfai/prompts/analyze/**`、`.qfai/samples/**`、`.qfai/promptpack/` を含む)
|
|
52
60
|
- `npx qfai validate` による `.qfai/` 内ドキュメントの整合性・トレーサビリティ検査
|
|
53
61
|
- `npx qfai validate` による SC→Test 参照の検証(`validation.traceability.testFileGlobs` に一致するテストファイルから `QFAI:SC-xxxx` を抽出)
|
|
54
62
|
- `npx qfai doctor` による設定/探索/パス/glob/validate.json の事前診断
|
|
@@ -107,12 +115,41 @@ doctor の JSON も非契約(内部形式。将来予告なく変更あり)
|
|
|
107
115
|
}
|
|
108
116
|
```
|
|
109
117
|
|
|
110
|
-
`init --yes` は予約フラグです(現行の init
|
|
118
|
+
`init --yes` は予約フラグです(現行の init は非対話のため挙動差はありません)。
|
|
119
|
+
|
|
120
|
+
- `--force` は `.qfai/prompts/**` のみ上書きします(それ以外は既存があればスキップします)
|
|
121
|
+
- `specs/` `contracts/` は初回にサンプルが生成されますが、再実行(force の有無に関わらず)で上書きしません
|
|
122
|
+
- それ以外を再生成したい場合は、対象を手動で削除してから `qfai init` を実行してください(運用中成果物の破壊を避けるため)
|
|
123
|
+
|
|
124
|
+
## analyze(意味矛盾のレビュー補助)
|
|
125
|
+
|
|
126
|
+
`validate` は deterministic な構造矛盾(参照/フォーマット/トレーサビリティ)を検査し、CI Hard Gate にできます。一方で、**意味矛盾(解釈/前提/用語/例外/受入条件の齟齬)**は deterministic に検出できないため、v0.9 では **手動プロンプト**として導線を提供します。
|
|
127
|
+
|
|
128
|
+
重要:
|
|
129
|
+
|
|
130
|
+
- analyze は **Hard Gate ではありません**(CI を落とさない想定)
|
|
131
|
+
- 出力は **候補**です。根拠(引用)を確認し、最終判断はレビューで行ってください
|
|
132
|
+
|
|
133
|
+
### 使い方(最短)
|
|
134
|
+
|
|
135
|
+
1. `npx qfai analyze --list` でプロンプト一覧を確認する
|
|
136
|
+
2. `npx qfai analyze --prompt spec_to_scenario` のようにプロンプトを出力し、AI に貼り付ける
|
|
137
|
+
3. 推奨入力(Spec/Scenario/Test/Contract の抜粋 + validate/report 要約 + 差分)を揃えて検討する
|
|
138
|
+
|
|
139
|
+
入力の用意に迷う場合は、`npx qfai init` が同梱する `.qfai/samples/analyze/input_bundle.md`(完成例)をコピーして編集してください。
|
|
140
|
+
成果物を残す場合は `.qfai/samples/analyze/analysis.md`(テンプレ)を使う運用を推奨します。
|
|
141
|
+
|
|
142
|
+
### カスタマイズ(Overlay)
|
|
143
|
+
|
|
144
|
+
analyze も `.qfai/prompts.local/**` の overlay 運用に従います。
|
|
145
|
+
同じ相対パスのファイルがある場合は `.qfai/prompts.local` を優先して参照してください。
|
|
146
|
+
|
|
147
|
+
例: `.qfai/prompts.local/analyze/` に `spec_to_scenario.md` を置くと標準を上書きできます。
|
|
111
148
|
|
|
112
149
|
## 設定
|
|
113
150
|
|
|
114
151
|
設定はリポジトリ直下の `qfai.config.yaml` で行います。
|
|
115
|
-
命名規約は
|
|
152
|
+
命名規約は GitHub の[命名規約ドキュメント](https://github.com/aganesy/QFAI/blob/main/docs/rules/naming.md)を参照してください。
|
|
116
153
|
|
|
117
154
|
## 契約(Contracts)
|
|
118
155
|
|
|
@@ -183,7 +220,9 @@ jobs:
|
|
|
183
220
|
path: .qfai/out/report.md
|
|
184
221
|
```
|
|
185
222
|
|
|
186
|
-
validate.json のスキーマと例は
|
|
223
|
+
validate.json のスキーマと例は GitHub の
|
|
224
|
+
[schema](https://github.com/aganesy/QFAI/tree/main/docs/schema) /
|
|
225
|
+
[examples](https://github.com/aganesy/QFAI/tree/main/docs/examples) を参照してください。
|
|
187
226
|
PromptPack は非契約(互換保証なし)です。編集する場合はラップ運用を推奨します。
|
|
188
227
|
|
|
189
228
|
## 生成される構成(例)
|
|
@@ -26,6 +26,7 @@ npx qfai report
|
|
|
26
26
|
- `require/` : 既存要件の集約(validate 対象外)
|
|
27
27
|
- `rules/` : 規約・運用ルール
|
|
28
28
|
- `prompts/` : QFAI 標準のプロンプト資産(自動読取はしない。更新や再 init で上書きされ得る)
|
|
29
|
+
- `samples/` : analyze 等の手動運用で使う成果物テンプレ(create-only)
|
|
29
30
|
- `prompts.local/` : 利用者カスタムのプロンプト資産(存在する場合は overlay でこちらを優先して読む運用)
|
|
30
31
|
- `promptpack/` : PromptPack(SSOT、運用ルール/観点の正本)
|
|
31
32
|
- `out/` : `validate` / `report` の出力先(gitignore 推奨)
|
|
@@ -38,12 +39,18 @@ npx qfai report
|
|
|
38
39
|
- `rules/conventions.md`
|
|
39
40
|
- `rules/pnpm.md`
|
|
40
41
|
- `prompts/README.md`
|
|
42
|
+
- `prompts/analyze/README.md`
|
|
41
43
|
- `prompts.local/README.md`
|
|
42
44
|
- `prompts/require-to-spec.md`
|
|
43
45
|
- `prompts/qfai-generate-test-globs.md`
|
|
44
46
|
- `prompts/qfai-maintain-traceability.md`
|
|
45
47
|
- `prompts/qfai-maintain-contracts.md`
|
|
46
48
|
- `prompts/qfai-classify-change.md`
|
|
49
|
+
- `samples/analyze/analysis.md`
|
|
50
|
+
- `samples/analyze/input_bundle.md`
|
|
51
|
+
- `prompts/analyze/spec_to_scenario.md`
|
|
52
|
+
- `prompts/analyze/spec_to_contract.md`
|
|
53
|
+
- `prompts/analyze/scenario_to_test.md`
|
|
47
54
|
- `promptpack/constitution.md`
|
|
48
55
|
- `out/README.md`
|
|
49
56
|
|
|
@@ -63,7 +70,8 @@ v0.7 以降、プロンプト資産のカスタマイズは `.qfai/prompts.local
|
|
|
63
70
|
- 利用者が `.qfai/prompts/**` を直接編集することは非推奨・非サポートです
|
|
64
71
|
- 変更したい場合は同一相対パスで `.qfai/prompts.local/**` に置いて上書きしてください
|
|
65
72
|
- `qfai init` は `.qfai/prompts.local/**` を **保護**します(`--force` でも上書きしません)
|
|
66
|
-
-
|
|
73
|
+
- `qfai init` は `root/` と `.qfai/` を create-only(既存があればスキップ)で運用します
|
|
74
|
+
- `--force` は `.qfai/prompts/**` のみ上書きします(`specs/` `contracts/` を含め、その他は上書きしません)
|
|
67
75
|
|
|
68
76
|
例:
|
|
69
77
|
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
- Spec から overview / Business Flow を生成するための素材
|
|
11
11
|
- トレーサビリティ/契約/変更区分の運用支援(CIで止めない領域)
|
|
12
|
-
-
|
|
12
|
+
- 意味矛盾(解釈/前提/用語/受入条件の齟齬)のレビュー補助(analyze)
|
|
13
|
+
- 将来の CLI 連携に備えた配布物(現時点では手動利用のみ)
|
|
13
14
|
|
|
14
15
|
## Overlay(prompts.local)
|
|
15
16
|
|
|
@@ -27,6 +28,10 @@
|
|
|
27
28
|
- `qfai-maintain-traceability.md`: 参照切れの修復(Spec/Scenario/Test)
|
|
28
29
|
- `qfai-maintain-contracts.md`: 契約 ID と参照の整合
|
|
29
30
|
- `qfai-classify-change.md`: Compatibility / Change 分類支援
|
|
31
|
+
- `analyze/README.md`: analyze の目的/入力/出力フォーマット
|
|
32
|
+
- `analyze/spec_to_scenario.md`: Spec ↔ Scenario の意味整合
|
|
33
|
+
- `analyze/spec_to_contract.md`: Spec ↔ Contract の対応漏れ/参照不整合
|
|
34
|
+
- `analyze/scenario_to_test.md`: Scenario ↔ Test の網羅/抜け/誤差
|
|
30
35
|
|
|
31
36
|
## 使い分け表
|
|
32
37
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# analyze(手動利用)
|
|
2
|
+
|
|
3
|
+
このディレクトリは QFAI の `validate` が扱わない **意味レベル** の矛盾/抜け/リスクを、レビューのために洗い出すための **手動プロンプト集**です。
|
|
4
|
+
|
|
5
|
+
重要:
|
|
6
|
+
|
|
7
|
+
- analyze は **Hard Gate ではありません**(CI を落とさない想定)
|
|
8
|
+
- 出力は **候補**です。根拠(引用)を必ず確認し、最終判断はレビューで行ってください
|
|
9
|
+
- `validate` が扱う **構造矛盾(参照/フォーマット/トレーサビリティ)** は対象外です
|
|
10
|
+
|
|
11
|
+
## 推奨入力(最小セット)
|
|
12
|
+
|
|
13
|
+
- Project Context / Spec / Scenario / Test / Contract のうち、今回関係する箇所を **抜粋**で用意する
|
|
14
|
+
- `validate` / `report` の結果(必要なら要約)
|
|
15
|
+
- 変更差分(PR diff / 変更ファイル一覧)
|
|
16
|
+
|
|
17
|
+
## プロンプト一覧(v0.9.x)
|
|
18
|
+
|
|
19
|
+
- `spec_to_scenario.md`: Spec ↔ Scenario の意味整合
|
|
20
|
+
- `spec_to_contract.md`: Spec ↔ Contract の参照整合(紐付け漏れ/根拠薄弱)
|
|
21
|
+
- `scenario_to_test.md`: Scenario ↔ Test の網羅性/ズレ
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# analyze: Scenario ↔ Test 網羅性/ズレチェック
|
|
2
|
+
|
|
3
|
+
## 目的
|
|
4
|
+
|
|
5
|
+
- Scenario(受入条件)が Test で担保されているかを確認する
|
|
6
|
+
- Test が Scenario の意図を誤解していないかを確認する
|
|
7
|
+
|
|
8
|
+
## 入力の前提(貼り付けて埋める)
|
|
9
|
+
|
|
10
|
+
入力が多すぎる場合は「抜粋にする」「代表ケースだけに絞る」を優先してください。
|
|
11
|
+
|
|
12
|
+
### Project Context(任意)
|
|
13
|
+
|
|
14
|
+
- 対象機能:
|
|
15
|
+
- 前提/制約:
|
|
16
|
+
- 対象外(Non-goals):
|
|
17
|
+
|
|
18
|
+
### Scenario Excerpts
|
|
19
|
+
|
|
20
|
+
- ...
|
|
21
|
+
|
|
22
|
+
### Test Excerpts
|
|
23
|
+
|
|
24
|
+
- ...
|
|
25
|
+
|
|
26
|
+
### Spec Excerpts(任意)
|
|
27
|
+
|
|
28
|
+
- ...
|
|
29
|
+
|
|
30
|
+
### Contract / Trace Links(任意)
|
|
31
|
+
|
|
32
|
+
- (Scenario ID)→(Test名/ファイル など)
|
|
33
|
+
- ...
|
|
34
|
+
|
|
35
|
+
### Open Concerns(任意)
|
|
36
|
+
|
|
37
|
+
- ...
|
|
38
|
+
|
|
39
|
+
## チェック観点
|
|
40
|
+
|
|
41
|
+
- シナリオの各条件がテストに対応しているか(対応表を作る)
|
|
42
|
+
- 例外系・境界条件がテストされているか
|
|
43
|
+
- テスト名/説明がシナリオ用語と一致しているか
|
|
44
|
+
- テストが多すぎる/少なすぎることによるリスク
|
|
45
|
+
|
|
46
|
+
## 期待する出力形式
|
|
47
|
+
|
|
48
|
+
- 対応表(Scenario項目 → Test名/箇所)
|
|
49
|
+
- 漏れ(未テスト)とズレ(誤解)のリスト
|
|
50
|
+
- 優先度(高/中/低)を付ける
|
|
51
|
+
|
|
52
|
+
## 次アクション
|
|
53
|
+
|
|
54
|
+
- Test追加/修正案:
|
|
55
|
+
- Scenario追加/修正案:
|
|
56
|
+
- 追加で確認すべき質問:
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# analyze: Spec ↔ Contract トレーサビリティチェック
|
|
2
|
+
|
|
3
|
+
## 目的
|
|
4
|
+
|
|
5
|
+
- Spec と Contract(参照関係)が噛み合っているかを確認する
|
|
6
|
+
- 紐付け漏れ・参照の根拠薄弱を抽出する
|
|
7
|
+
|
|
8
|
+
## 入力の前提(貼り付けて埋める)
|
|
9
|
+
|
|
10
|
+
入力が多すぎる場合は「抜粋にする」「代表ケースだけに絞る」を優先してください。
|
|
11
|
+
|
|
12
|
+
### Project Context
|
|
13
|
+
|
|
14
|
+
- 対象機能:
|
|
15
|
+
- 前提/制約:
|
|
16
|
+
- 対象外(Non-goals):
|
|
17
|
+
|
|
18
|
+
### Spec Excerpts
|
|
19
|
+
|
|
20
|
+
- ...
|
|
21
|
+
|
|
22
|
+
### Contract / Trace Links
|
|
23
|
+
|
|
24
|
+
- (Spec ID)→(Scenario ID / Test ID など)
|
|
25
|
+
- ...
|
|
26
|
+
|
|
27
|
+
### Scenario Excerpts(任意)
|
|
28
|
+
|
|
29
|
+
- ...
|
|
30
|
+
|
|
31
|
+
### Test Excerpts(任意)
|
|
32
|
+
|
|
33
|
+
- ...
|
|
34
|
+
|
|
35
|
+
### Open Concerns(任意)
|
|
36
|
+
|
|
37
|
+
- ...
|
|
38
|
+
|
|
39
|
+
## チェック観点
|
|
40
|
+
|
|
41
|
+
- Spec に対してリンクが存在しない箇所(紐付け漏れ)
|
|
42
|
+
- Contract で参照しているが、Spec 側に根拠が見当たらない箇所
|
|
43
|
+
- 参照の向きが不自然な箇所(誤ったID、転記ミスの疑い)
|
|
44
|
+
|
|
45
|
+
## 期待する出力形式
|
|
46
|
+
|
|
47
|
+
- 「紐付け漏れ」「根拠薄弱」「参照ミス疑い」に分類
|
|
48
|
+
- それぞれに修正案(Contract修正 / Spec補強 / Scenario追加)を付ける
|
|
49
|
+
|
|
50
|
+
## 次アクション
|
|
51
|
+
|
|
52
|
+
- Contract修正案:
|
|
53
|
+
- Spec補強案:
|
|
54
|
+
- 追加で確認すべき質問:
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# analyze: Spec ↔ Scenario 整合性チェック
|
|
2
|
+
|
|
3
|
+
## 目的
|
|
4
|
+
|
|
5
|
+
- Spec(仕様)の主張が Scenario(受入シナリオ)に反映されているかを確認する
|
|
6
|
+
- Scenario が Spec を逸脱していないかを確認する
|
|
7
|
+
|
|
8
|
+
## 入力の前提(貼り付けて埋める)
|
|
9
|
+
|
|
10
|
+
入力が多すぎる場合は「抜粋にする」「代表ケースだけに絞る」を優先してください。
|
|
11
|
+
|
|
12
|
+
### Project Context
|
|
13
|
+
|
|
14
|
+
- 対象機能:
|
|
15
|
+
- 前提/制約:
|
|
16
|
+
- 対象外(Non-goals):
|
|
17
|
+
|
|
18
|
+
### Spec Excerpts
|
|
19
|
+
|
|
20
|
+
- ...
|
|
21
|
+
|
|
22
|
+
### Scenario Excerpts
|
|
23
|
+
|
|
24
|
+
- ...
|
|
25
|
+
|
|
26
|
+
### Test Excerpts(任意)
|
|
27
|
+
|
|
28
|
+
- ...
|
|
29
|
+
|
|
30
|
+
### Contract / Trace Links(任意)
|
|
31
|
+
|
|
32
|
+
- (Spec ID)→(Scenario ID / Test ID など)
|
|
33
|
+
- ...
|
|
34
|
+
|
|
35
|
+
### Open Concerns(任意)
|
|
36
|
+
|
|
37
|
+
- ...
|
|
38
|
+
|
|
39
|
+
## チェック観点
|
|
40
|
+
|
|
41
|
+
- 用語定義の不一致(同じ言葉で別の意味)
|
|
42
|
+
- 例外条件/境界条件の不足
|
|
43
|
+
- 受入条件(Given/When/Then 等)が仕様の制約を満たすか
|
|
44
|
+
- 仕様にあるのにシナリオがない項目(漏れ)
|
|
45
|
+
- シナリオにあるのに仕様に根拠がない項目(逸脱)
|
|
46
|
+
|
|
47
|
+
## 期待する出力形式
|
|
48
|
+
|
|
49
|
+
- 矛盾 / 不明点 / 漏れ をそれぞれ箇条書き
|
|
50
|
+
- それぞれに「根拠(Spec/Scenario抜粋の引用)」と「提案(修正案)」を付ける
|
|
51
|
+
|
|
52
|
+
## 次アクション
|
|
53
|
+
|
|
54
|
+
- Spec修正案:
|
|
55
|
+
- Scenario追加/修正案:
|
|
56
|
+
- 追加で確認すべき質問:
|
|
@@ -27,4 +27,5 @@ QFAI v0.7 以降は、プロンプト資産のカスタマイズ手段を **over
|
|
|
27
27
|
## init 再実行時の保護(契約)
|
|
28
28
|
|
|
29
29
|
- `qfai init` は `.qfai/prompts.local/**` を **保護**します(`--force` を付けても上書きしません)。
|
|
30
|
-
-
|
|
30
|
+
- `--force` は `.qfai/prompts/**` のみ上書きします。
|
|
31
|
+
- `specs/` `contracts/` を含め、その他の領域は既存があればスキップします(上書きしません)。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# analyze 実施ログ(テンプレート)
|
|
2
|
+
|
|
3
|
+
> 目的: analyze は `validate` が扱わない「意味矛盾」の候補を抽出するための **レビュー補助**です。
|
|
4
|
+
> 結果は正解判定ではありません。根拠(引用)を確認し、レビューで判断してください。
|
|
5
|
+
|
|
6
|
+
## メタ
|
|
7
|
+
|
|
8
|
+
- 実施日: YYYY-MM-DD
|
|
9
|
+
- 対象: <PR番号 / ブランチ / 変更スコープ>
|
|
10
|
+
- 利用モデル/環境: <任意>
|
|
11
|
+
|
|
12
|
+
## 入力(貼り付けたもの)
|
|
13
|
+
|
|
14
|
+
- Spec: <spec.md / delta.md の該当範囲>
|
|
15
|
+
- Scenario: <scenario.md の該当範囲>
|
|
16
|
+
- Contract(任意): <該当契約>
|
|
17
|
+
- validate/report 要約: <report.md または validate.json の要約>
|
|
18
|
+
- 差分: <PR diff / 変更ファイル一覧>
|
|
19
|
+
|
|
20
|
+
## 実行したプロンプト
|
|
21
|
+
|
|
22
|
+
- `.qfai/prompts/analyze/spec_to_scenario.md`
|
|
23
|
+
- `.qfai/prompts/analyze/spec_to_contract.md`
|
|
24
|
+
- `.qfai/prompts/analyze/scenario_to_test.md`
|
|
25
|
+
|
|
26
|
+
## 結果(候補)
|
|
27
|
+
|
|
28
|
+
- <貼り付け>
|
|
29
|
+
|
|
30
|
+
## レビュー判断
|
|
31
|
+
|
|
32
|
+
- 採用(修正する): <項目>
|
|
33
|
+
- 却下(問題なし/誤検知): <項目>
|
|
34
|
+
- 保留(追加調査/議論): <項目>
|
|
35
|
+
|
|
36
|
+
## 次アクション
|
|
37
|
+
|
|
38
|
+
- <誰が/何を/いつまでに>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# analyze 入力バンドル(サンプル)
|
|
2
|
+
|
|
3
|
+
> 目的: `analyze` 用の入力をブレなく用意するための完成例です。
|
|
4
|
+
> 本ファイルは架空の小規模機能を題材にしています。自プロジェクトではコピーして編集してください。
|
|
5
|
+
|
|
6
|
+
## Project Context
|
|
7
|
+
|
|
8
|
+
- 対象機能: パスワードリセット(メールでワンタイムリンクを送る)
|
|
9
|
+
- 前提/制約:
|
|
10
|
+
- リンクは 15 分で失効
|
|
11
|
+
- 送信頻度制限(IP + アカウント単位)
|
|
12
|
+
- 失効後は再送が必要
|
|
13
|
+
- 対象外(Non-goals):
|
|
14
|
+
- 多要素認証
|
|
15
|
+
- 端末認証
|
|
16
|
+
|
|
17
|
+
## Spec Excerpts
|
|
18
|
+
|
|
19
|
+
- ユーザーがメールアドレスを入力すると、登録済みならリセットリンクを送る
|
|
20
|
+
- 未登録メールでも挙動は同じに見せる(ユーザー列挙防止)
|
|
21
|
+
- リンクは 15 分で失効し、失効後はエラーを表示する
|
|
22
|
+
|
|
23
|
+
## Scenario Excerpts
|
|
24
|
+
|
|
25
|
+
- Given 登録済みユーザーがいる
|
|
26
|
+
When パスワードリセットを要求する
|
|
27
|
+
Then リセットメールが送信される
|
|
28
|
+
- Given 未登録のメールアドレス
|
|
29
|
+
When パスワードリセットを要求する
|
|
30
|
+
Then 同じメッセージが表示される(送信の有無は漏らさない)
|
|
31
|
+
- Given 期限切れのリセットリンク
|
|
32
|
+
When リセットリンクを開く
|
|
33
|
+
Then 期限切れとして扱われ、再送導線が提示される
|
|
34
|
+
|
|
35
|
+
## Test Excerpts
|
|
36
|
+
|
|
37
|
+
- unit: `requestPasswordReset` は常に成功レスポンスを返す(登録有無を分岐しない)
|
|
38
|
+
- unit: `verifyResetToken` は失効時に `TokenExpired` を返す
|
|
39
|
+
- integration: 送信頻度制限が発動した場合でも同じメッセージを返す
|
|
40
|
+
|
|
41
|
+
## Contract / Trace Links
|
|
42
|
+
|
|
43
|
+
- Spec: SPEC-RESET-001 → Scenario: SC-RESET-001, SC-RESET-002, SC-RESET-003
|
|
44
|
+
- Scenario: SC-RESET-003 → Test: tests/auth/reset.test.ts#expired
|
|
45
|
+
|
|
46
|
+
## Open Concerns
|
|
47
|
+
|
|
48
|
+
- 送信頻度制限のしきい値(運用で調整するか、固定か)
|
|
49
|
+
- 期限切れ時のUX(単に失敗か、再送導線を必須にするか)
|
|
50
|
+
|
|
51
|
+
## Non-goals
|
|
52
|
+
|
|
53
|
+
- メール配信基盤の冗長化
|
|
54
|
+
- 監査ログの永続化
|