@ngocsangairvds/vsaf 4.1.24 → 4.1.26
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/package.json +1 -1
- package/packages/cli/dist/commands/install.d.ts +1 -0
- package/packages/cli/dist/commands/install.d.ts.map +1 -1
- package/packages/cli/dist/commands/install.js +32 -6
- package/packages/cli/dist/commands/install.js.map +1 -1
- package/packages/core/dist/engine/node-runner.d.ts +1 -0
- package/packages/core/dist/engine/node-runner.d.ts.map +1 -1
- package/packages/core/dist/engine/node-runner.js +33 -6
- package/packages/core/dist/engine/node-runner.js.map +1 -1
- package/skills/sdlc/ba-validate-srs/SKILL.md +8 -0
- package/skills/sdlc/ba-validate-srs/data/domain-checklists/insurance.yaml +110 -0
- package/skills/sdlc/ba-validate-srs/data/grep-patterns-srs.yaml +158 -0
- package/skills/sdlc/ba-validate-srs/data/srs-review-glossary.md +237 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-01-discovery.md +280 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-02-business-alignment.md +351 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-03-completeness.md +353 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-04-consistency.md +352 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-05-quality.md +347 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-06-system-nfr.md +217 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-07-delivery-readiness.md +288 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-08-risk-analysis.md +283 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-09-user-impact.md +262 -0
- package/skills/sdlc/ba-validate-srs/steps-v/step-v-10-report.md +308 -0
- package/skills/sdlc/ba-validate-srs/workflow.md +269 -0
- package/skills/sdlc/ba-write-srs/SKILL.md +8 -0
- package/skills/sdlc/ba-write-srs/srs-feature-template.md +669 -0
- package/skills/sdlc/ba-write-srs/srs-system-template.md +430 -0
- package/skills/sdlc/ba-write-srs/workflow.md +139 -0
- package/skills/sdlc/pack.yaml +4 -0
- package/skills/sdlc/srs/SKILL.md +44 -55
- package/skills/vds-skill/install-deps.mjs +21 -3
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
---
|
|
2
|
+
# model: sonnet
|
|
3
|
+
# findingsOutput: '{output_folder}/_validation_temp/findings-risk-analysis.yaml'
|
|
4
|
+
# contextFile: '{output_folder}/_validation_temp/context.yaml'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Step V-08: Risk Analysis — Phân tích rủi ro
|
|
8
|
+
|
|
9
|
+
Weight: **0.8**
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 0. Load Context
|
|
14
|
+
Read `{contextFile}` → get `srs_path`, `kg.prd_key_sections`, `kg.brd_key_sections`. Use KG line ranges for all upstream document reads — do NOT read full PRD/BRD.
|
|
15
|
+
|
|
16
|
+
## 1. Flow completeness (flow-gap)
|
|
17
|
+
|
|
18
|
+
Kiểm tra mỗi SRS file có đủ luồng đối xứng:
|
|
19
|
+
|
|
20
|
+
| Create flow | Cần có | Check |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| Create order/policy | Cancel/Refund | |
|
|
23
|
+
| Payment initiate | Payment failure/timeout/refund | |
|
|
24
|
+
| Submit claim | Withdraw claim / Appeal rejected | |
|
|
25
|
+
| Grant permission | Revoke permission | |
|
|
26
|
+
| Subscribe | Unsubscribe | |
|
|
27
|
+
| Reserve (voucher) | Release/Expire | |
|
|
28
|
+
|
|
29
|
+
**Nếu thiếu luồng đối xứng → finding flow-gap**
|
|
30
|
+
|
|
31
|
+
Item ID: `exception_flows_handled`
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. External dependencies
|
|
36
|
+
|
|
37
|
+
- External APIs/services đã liệt kê?
|
|
38
|
+
- Có fallback strategy nếu external service down?
|
|
39
|
+
- Circuit breaker / retry logic defined?
|
|
40
|
+
- Timeout SLA defined?
|
|
41
|
+
|
|
42
|
+
Item ID: `external_deps_fallback`
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 3. Integration gaps
|
|
47
|
+
|
|
48
|
+
- Flow A → Flow B transition rõ ràng?
|
|
49
|
+
- VD: FR-8 Purchase → FR-9 Payment trigger mechanism?
|
|
50
|
+
- VD: FR-9 Payment → FR-10 Policy creation trigger?
|
|
51
|
+
- Event vs API call: architecture decision documented?
|
|
52
|
+
|
|
53
|
+
Item ID: `integration_gaps`
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 4. Data inconsistency risks
|
|
58
|
+
|
|
59
|
+
- Distributed transaction risks: nếu step A thành công nhưng step B thất bại?
|
|
60
|
+
- Eventual consistency windows: khi nào data nhất quán?
|
|
61
|
+
- Orphan records: payment success nhưng order không được tạo?
|
|
62
|
+
- Duplicate processing: nếu message consumed twice?
|
|
63
|
+
|
|
64
|
+
Item ID: `data_consistency_risks`
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 5. Scope creep
|
|
69
|
+
|
|
70
|
+
- Requirements trong SRS có vượt PRD scope không?
|
|
71
|
+
- Features mention nhưng không trong MVP?
|
|
72
|
+
- VD: FR-5 precondition yêu cầu Viettel data nhưng MVP không dùng
|
|
73
|
+
|
|
74
|
+
Item ID: `scope_creep`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 6. Assumptions & Concurrency
|
|
79
|
+
|
|
80
|
+
- Assumptions rõ ràng, đánh dấu cần confirm?
|
|
81
|
+
- Race condition scenarios:
|
|
82
|
+
- Concurrent payment for same order?
|
|
83
|
+
- Concurrent policy update?
|
|
84
|
+
- Session TTL vs async processing time?
|
|
85
|
+
|
|
86
|
+
Item IDs: `assumptions_listed`, `concurrency_considered`
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 6b. Insurer rejection rollback
|
|
91
|
+
|
|
92
|
+
Kiểm tra mỗi flow có call external insurer (issue policy, renew, cancel, endorse):
|
|
93
|
+
|
|
94
|
+
- Có nhánh xử lý khi insurer từ chối không?
|
|
95
|
+
- Issue: insurer từ chối phát hành → tiền KH đâu? hoàn tự động hay manual?
|
|
96
|
+
- Renewal: insurer từ chối gia hạn → tiền đã trừ → rollback?
|
|
97
|
+
- Cancel: insurer từ chối huỷ (VD: CTPL có quy trình riêng) → platform handle thế nào?
|
|
98
|
+
- Endorse: insurer không phản hồi → endorsement treo mãi?
|
|
99
|
+
- **CRITICAL**: flow assume insurer luôn accept mà không có rejection/timeout path
|
|
100
|
+
|
|
101
|
+
Item ID: `insurer_rejection_rollback`
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 6c. Platform-Insurer sync gap risk
|
|
106
|
+
|
|
107
|
+
Kiểm tra nguyên tắc "async sync với insurer — failure không chặn KH":
|
|
108
|
+
|
|
109
|
+
- Nếu platform confirm thành công với KH trước khi insurer sync, phải định nghĩa:
|
|
110
|
+
- Trong khoảng thời gian chờ sync, platform có đảm bảo quyền lợi cho KH không?
|
|
111
|
+
- Nếu KH cần claim trong khoảng đó và insurer nói "không thấy HĐ" → ai chịu trách nhiệm?
|
|
112
|
+
- Khi sync thất bại (insurer reject sau khi KH đã nhận confirm) → rollback strategy?
|
|
113
|
+
- **HIGH**: thiếu định nghĩa trách nhiệm trong sync gap → legal/claim dispute risk
|
|
114
|
+
|
|
115
|
+
Item ID: `platform_insurer_sync_gap_risk`
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 6d. Concurrent operation conflict
|
|
120
|
+
|
|
121
|
+
Kiểm tra các scenarios cho phép concurrent operations:
|
|
122
|
+
|
|
123
|
+
- Nếu nhiều endorsements được submit đồng thời cho cùng 1 HĐ:
|
|
124
|
+
- Cho phép hay block? Rule rõ ràng?
|
|
125
|
+
- Nếu đều approved, delta premium tính thế nào?
|
|
126
|
+
- Nếu endorsement đang pending mà HĐ sắp hết hạn:
|
|
127
|
+
- Endorsement có bị auto-reject? Hay treo?
|
|
128
|
+
- KH có thể withdraw endorsement đang pending không? Endpoint nào?
|
|
129
|
+
- **MEDIUM**: thiếu conflict resolution rules → dev tự quyết định behavior → inconsistent
|
|
130
|
+
|
|
131
|
+
Item ID: `concurrent_operation_conflict`
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 6e. DLQ and alert action plan
|
|
136
|
+
|
|
137
|
+
Kiểm tra các DLQ và alert scenarios:
|
|
138
|
+
|
|
139
|
+
- Nếu message vào DLQ (data format sai, processing failed): có notify sender không? Cách nào?
|
|
140
|
+
- Không notify → sender nghĩ thành công nhưng data bị lost
|
|
141
|
+
- Nếu webhook gửi thất bại N lần → EXPIRED → "alert Admin":
|
|
142
|
+
- Admin nhận alert bằng cách nào? Bấm retry ở đâu? Quy trình xử lý cụ thể?
|
|
143
|
+
- Nếu event bị mất là `policy.issued` → partner không biết → KH thắc mắc
|
|
144
|
+
- **HIGH**: alert không đi kèm action plan → incident kéo dài không cần thiết
|
|
145
|
+
|
|
146
|
+
Item ID: `dlq_alert_action_defined`
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 6f. Timeline & Effort Feasibility
|
|
151
|
+
|
|
152
|
+
Kiểm tra các yếu tố khiến SRS không khả thi về mặt timeline/effort:
|
|
153
|
+
|
|
154
|
+
- **Scope quá lớn cho 1 sprint**: UC nào có > 5 sub-flows hoặc > 10 business rules mà không được phân rã thành stories nhỏ hơn?
|
|
155
|
+
- **External dependency chưa confirmed**: Feature phụ thuộc API / contract bên ngoài (insurer, payment gateway, 3rd party) mà contract chưa ký hoặc API chưa stable → nếu SRS assume sẵn sàng → rủi ro
|
|
156
|
+
- **Dependency giữa FRs chưa chốt**: FR-X phụ thuộc FR-Y nhưng FR-Y không có SRS hoặc đang TBD → FR-X không thể implement đúng hạn
|
|
157
|
+
- **Assumption kỹ thuật quá rủi ro**: SRS assume sẵn có infrastructure (VD: Kafka cluster, 3rd party OAuth) mà thực tế chưa provision
|
|
158
|
+
|
|
159
|
+
**Không đánh giá absolute effort** (BA không phải PM). Chỉ flag khi:
|
|
160
|
+
- Có explicit blocker (dependency chưa sẵn sàng, contract chưa ký)
|
|
161
|
+
- Scope của 1 UC vượt quá giới hạn "có thể done in 1 sprint" rõ ràng
|
|
162
|
+
|
|
163
|
+
**Scoring:**
|
|
164
|
+
- Không có blocker dependency, scope hợp lý → 1.0
|
|
165
|
+
- 1 external dependency chưa confirmed nhưng low risk → 0.75
|
|
166
|
+
- Dependency quan trọng chưa chốt hoặc scope quá lớn → 0.5
|
|
167
|
+
- Blockers rõ ràng: contract chưa ký, FR phụ thuộc chưa có SRS → 0.25 (HIGH)
|
|
168
|
+
|
|
169
|
+
Item ID: `timeline_effort_feasible`
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 7. Edge-case failure risks
|
|
174
|
+
|
|
175
|
+
- Network timeout mid-transaction?
|
|
176
|
+
- Partial payment scenarios?
|
|
177
|
+
- User abandons flow mid-step — cleanup?
|
|
178
|
+
- System restart mid-processing?
|
|
179
|
+
|
|
180
|
+
Item ID: `edge_case_failure_risks`
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 8. Ghi Unresolved Questions
|
|
185
|
+
|
|
186
|
+
Trong quá trình review Risk, các câu hỏi cần PO/stakeholder quyết định → ghi vào section "7. Unresolved Questions" với format:
|
|
187
|
+
|
|
188
|
+
```markdown
|
|
189
|
+
| # | Severity | Dimension | Category | Question | Context | Related Files | Impact | Suggested Clarification |
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Categories: flow-gap, ambiguity, cross-doc-conflict, domain-inference, missing-spec
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 9. Tính Risk dimension score
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
risk_score = round(sum(item_scores.values()) / 13 × 100, 1)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Canonical item IDs (N = 13, fixed):
|
|
203
|
+
`exception_flows_handled`, `external_deps_fallback`, `integration_gaps`, `data_consistency_risks`, `scope_creep`, `assumptions_listed`, `concurrency_considered`, `insurer_rejection_rollback`, `platform_insurer_sync_gap_risk`, `concurrent_operation_conflict`, `dlq_alert_action_defined`, `timeline_effort_feasible`, `edge_case_failure_risks`
|
|
204
|
+
|
|
205
|
+
⚠️ MANDATORY: N = 13 (fixed). N/A items → score = 1.0 (do not skip from denominator). No post-hoc calibration. dimension_score in YAML = formula result only.
|
|
206
|
+
|
|
207
|
+
Weight: **0.8**
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 10. Append findings vào report
|
|
212
|
+
|
|
213
|
+
Append CRITICAL/HIGH → section "4. Critical & High Findings".
|
|
214
|
+
Append MEDIUM/LOW → section "5. Medium & Low Findings".
|
|
215
|
+
Append unresolved questions → section "7. Unresolved Questions".
|
|
216
|
+
|
|
217
|
+
Update frontmatter: thêm `step-v-08-risk-analysis` vào `stepsCompleted`.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 9b. Domain Pattern Check
|
|
222
|
+
|
|
223
|
+
Read domain checklist if configured:
|
|
224
|
+
1. Check `CONTEXT.md` or `.vsaf/config.yaml` for `domain` field
|
|
225
|
+
2. If `domain` is set (e.g., `insurance`): read `../data/domain-checklists/{domain}.yaml`
|
|
226
|
+
3. If no `domain` field or file not found: skip domain-specific checks entirely
|
|
227
|
+
|
|
228
|
+
For each checklist item where `applies_to` includes any FR in scope:
|
|
229
|
+
1. Grep the SRS file(s) for keywords related to the check
|
|
230
|
+
2. If NOT found or insufficiently specified → create finding with:
|
|
231
|
+
- item_id: checklist item `id` (e.g., `INS-CL-02`)
|
|
232
|
+
- severity: from checklist
|
|
233
|
+
- category: `domain-inference`
|
|
234
|
+
- evidence: what was searched and not found
|
|
235
|
+
- suggestion: what needs to be added
|
|
236
|
+
- business_impact: derive from `regulation` field if present (WHO: Compliance/Legal, WHAT: Compliance risk, WHEN: Before Release)
|
|
237
|
+
3. Skip items where `applies_to` FRs are not in validation scope
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## [NEW] Write Structured Findings
|
|
242
|
+
Write `{findingsOutput}`:
|
|
243
|
+
```yaml
|
|
244
|
+
dimension: risk_analysis
|
|
245
|
+
weight: 0.8
|
|
246
|
+
dimension_score: 0 # = round(sum(item_scores.values()) / 13 × 100, 1)
|
|
247
|
+
status: OK
|
|
248
|
+
findings: []
|
|
249
|
+
summary: {total: 0, critical: 0, high: 0, medium: 0, low: 0}
|
|
250
|
+
item_scores:
|
|
251
|
+
exception_flows_handled: 0.0
|
|
252
|
+
external_deps_fallback: 0.0
|
|
253
|
+
integration_gaps: 0.0
|
|
254
|
+
data_consistency_risks: 0.0
|
|
255
|
+
scope_creep: 0.0
|
|
256
|
+
assumptions_listed: 0.0
|
|
257
|
+
concurrency_considered: 0.0
|
|
258
|
+
insurer_rejection_rollback: 0.0
|
|
259
|
+
platform_insurer_sync_gap_risk: 0.0
|
|
260
|
+
concurrent_operation_conflict: 0.0
|
|
261
|
+
dlq_alert_action_defined: 0.0
|
|
262
|
+
timeline_effort_feasible: 0.0
|
|
263
|
+
edge_case_failure_risks: 0.0
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## 11. Menu
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
Risk Analysis Score: {X}% ({status}) [weight 0.8]
|
|
270
|
+
- CRITICAL: {count}
|
|
271
|
+
- HIGH: {count}
|
|
272
|
+
- MEDIUM: {count}
|
|
273
|
+
- LOW: {count}
|
|
274
|
+
Unresolved Questions: {count}
|
|
275
|
+
|
|
276
|
+
[C] Continue — Sang User Impact (Step V-09)
|
|
277
|
+
[D] Detail — Xem chi tiết findings
|
|
278
|
+
[X] Cancel
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Chờ user chọn.**
|
|
282
|
+
|
|
283
|
+
Khi user chọn **C**: đọc fully và follow `./step-v-09-user-impact.md`
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
---
|
|
2
|
+
# model: haiku
|
|
3
|
+
# findingsOutput: '{output_folder}/_validation_temp/findings-user-impact.yaml'
|
|
4
|
+
# contextFile: '{output_folder}/_validation_temp/context.yaml'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Step V-09: User Impact — Đánh giá tác động người dùng
|
|
8
|
+
|
|
9
|
+
Weight: **0.7**
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 0. Load Context
|
|
14
|
+
Read `{contextFile}` → get `srs_path`, `kg.prd_key_sections`, `kg.brd_key_sections`. Use KG line ranges for all upstream document reads — do NOT read full PRD/BRD.
|
|
15
|
+
|
|
16
|
+
## 1. Persona coverage
|
|
17
|
+
|
|
18
|
+
- Tất cả actors/personas trong PRD đã có UC tương ứng?
|
|
19
|
+
- Khách hàng (end user)
|
|
20
|
+
- Business Manager / Admin
|
|
21
|
+
- Insurer Partner
|
|
22
|
+
- System (background jobs)
|
|
23
|
+
- Không có persona nào bị thiếu UC coverage?
|
|
24
|
+
|
|
25
|
+
Item ID: `persona_coverage`
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. User journey completeness
|
|
30
|
+
|
|
31
|
+
- Entry point → completion journey rõ ràng?
|
|
32
|
+
- Happy path + unhappy path đều có?
|
|
33
|
+
- Post-action: KH biết bước tiếp theo?
|
|
34
|
+
- VD: Đăng ký xong → rồi sao? Welcome screen? CTA?
|
|
35
|
+
- Multi-session journey: user có thể resume không?
|
|
36
|
+
|
|
37
|
+
Item ID: `journey_complete`
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 3. Error UX
|
|
42
|
+
|
|
43
|
+
- Error messages user-friendly (không raw technical)?
|
|
44
|
+
- Có hướng dẫn xử lý khi lỗi?
|
|
45
|
+
- Retry guidance?
|
|
46
|
+
- Gateway error → user-friendly mapping?
|
|
47
|
+
- Timeout → user thấy gì?
|
|
48
|
+
|
|
49
|
+
Item ID: `error_ux`
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 4. Loading & Empty states
|
|
54
|
+
|
|
55
|
+
- Loading states đã mô tả?
|
|
56
|
+
- Empty states (danh sách trống) đã mô tả?
|
|
57
|
+
- Skeleton/placeholder UI?
|
|
58
|
+
|
|
59
|
+
Item ID: `loading_empty_states`
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 5. Navigation & Recovery
|
|
64
|
+
|
|
65
|
+
- Back/Cancel/Undo đã xử lý?
|
|
66
|
+
- Confirmation dialogs cho destructive actions (hủy HĐ, xóa)?
|
|
67
|
+
- Session recovery (browser refresh, app crash)?
|
|
68
|
+
- Deep link / direct URL handling?
|
|
69
|
+
|
|
70
|
+
Item IDs: `back_cancel_undo`, `destructive_confirmation`
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 6. Edge-case UX
|
|
75
|
+
|
|
76
|
+
- What if user submits form twice?
|
|
77
|
+
- What if user leaves mid-checkout?
|
|
78
|
+
- What if payment succeeds but network drops before confirmation?
|
|
79
|
+
- What if user has multiple tabs open?
|
|
80
|
+
|
|
81
|
+
Item ID: `edge_case_ux`
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 6b. Pre-payment benefit disclosure
|
|
86
|
+
|
|
87
|
+
Kiểm tra mỗi flow có KH thanh toán cho quyền lợi chưa có hiệu lực ngay:
|
|
88
|
+
|
|
89
|
+
- Waiting period: nếu KH trả tiền hôm nay nhưng coverage chỉ có hiệu lực từ ngày X:
|
|
90
|
+
- Có màn hình/step yêu cầu KH acknowledge (đọc và đồng ý) trước khi confirm payment không?
|
|
91
|
+
- Ngày bắt đầu có hiệu lực có hiển thị rõ không?
|
|
92
|
+
- Late renewal coverage gap: KH gia hạn trễ → N ngày không được bảo vệ:
|
|
93
|
+
- Có hiển thị gap period rõ ràng trước khi KH confirm không?
|
|
94
|
+
- Có nói rõ hậu quả (không được claim trong gap) không?
|
|
95
|
+
- **HIGH**: KH trả tiền mà không biết quyền lợi bị delay/gap → khiếu nại sau này
|
|
96
|
+
|
|
97
|
+
Item ID: `pre_payment_benefit_disclosure`
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 6c. Auto financial action advance notice
|
|
102
|
+
|
|
103
|
+
Kiểm tra mọi hành động tài chính tự động (không cần KH click confirm):
|
|
104
|
+
|
|
105
|
+
- Auto-renewal: KH bật auto-renewal → khi gia hạn, KH có nhận thông báo trước không?
|
|
106
|
+
- VD: "HĐ sẽ tự động gia hạn vào ngày X, phí Y sẽ trừ từ PTTT Z"
|
|
107
|
+
- Không chấp nhận: auto-trừ tiền mà KH không nhận được bất kỳ thông báo advance nào
|
|
108
|
+
- Auto-charge delta endorsement: KH eSign endorsement → hệ thống tự trừ delta premium:
|
|
109
|
+
- eSign là đồng ý thay đổi điều khoản, không phải đồng ý bị trừ tiền
|
|
110
|
+
- Cần bước riêng: notify KH số tiền cần trả + KH xác nhận payment
|
|
111
|
+
- Kiểm tra cross-reference với PRD/AC: nếu PRD có AC yêu cầu gửi thông báo nhưng UC không thực hiện → CRITICAL
|
|
112
|
+
|
|
113
|
+
Item ID: `auto_financial_action_advance_notice`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 6d. Async wait UX
|
|
118
|
+
|
|
119
|
+
Kiểm tra mỗi flow KH phải chờ async processing (UW decision, insurer sync, endorsement approval):
|
|
120
|
+
|
|
121
|
+
- KH thấy gì khi đang chờ? Loading screen? Status screen?
|
|
122
|
+
- KH có thể làm gì trong lúc chờ? Có nút Huỷ không?
|
|
123
|
+
- Nếu timeout: KH nhận thông báo gì? Có thể retry không?
|
|
124
|
+
- Có thể chọn option khác (insurer khác, sản phẩm khác) không?
|
|
125
|
+
- **HIGH**: KH bị kẹt ở màn hình "đang xử lý" không biết bao lâu, không có escape
|
|
126
|
+
|
|
127
|
+
Item ID: `async_wait_ux`
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 7. Onboarding & Accessibility
|
|
132
|
+
|
|
133
|
+
- First-time user experience?
|
|
134
|
+
- Tooltip / help text cho complex fields?
|
|
135
|
+
- Accessibility requirements (WCAG 2.1 AA)?
|
|
136
|
+
- Multi-language / locale handling?
|
|
137
|
+
|
|
138
|
+
Item IDs: `onboarding`, `accessibility`
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 8. Figma Platform Coverage (via figma-cache manifests)
|
|
143
|
+
|
|
144
|
+
1. Read ALL figma-cache manifests → filter screens for this FR
|
|
145
|
+
2. Group by platform: Mobile App vs Web Mobile
|
|
146
|
+
3. Check:
|
|
147
|
+
- Customer-facing flows: both platforms have designs?
|
|
148
|
+
- If SRS specifies dual-platform (Mobile + Web): both covered in Figma?
|
|
149
|
+
- Admin flows: at least one platform has design?
|
|
150
|
+
4. Cross-reference with upstream PRD/ADR for platform coverage requirements
|
|
151
|
+
|
|
152
|
+
**Scoring:**
|
|
153
|
+
- Both platforms covered for all customer flows → 1.0
|
|
154
|
+
- One platform covered, other partial → 0.75
|
|
155
|
+
- Only one platform → 0.5
|
|
156
|
+
- No Figma designs for this FR → 0.25 (if customer-facing) or 1.0 (if backend-only)
|
|
157
|
+
|
|
158
|
+
Item ID: `figma_platform_coverage`
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 9. Ghi Unresolved Questions
|
|
163
|
+
|
|
164
|
+
Câu hỏi cần PO/stakeholder quyết định → ghi vào section "7. Unresolved Questions":
|
|
165
|
+
|
|
166
|
+
```markdown
|
|
167
|
+
| # | Severity | Dimension | Category | Question | Context | Related Files | Impact | Suggested Clarification |
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 10. Tính User Impact dimension score
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
user_impact_score = round(sum(item_scores.values()) / 13 × 100, 1)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Canonical item IDs (N = 13, fixed):
|
|
179
|
+
`persona_coverage`, `journey_complete`, `error_ux`, `loading_empty_states`, `back_cancel_undo`, `destructive_confirmation`, `edge_case_ux`, `pre_payment_benefit_disclosure`, `auto_financial_action_advance_notice`, `async_wait_ux`, `onboarding`, `accessibility`, `figma_platform_coverage`
|
|
180
|
+
|
|
181
|
+
⚠️ MANDATORY: N = 13 (fixed). N/A items → score = 1.0 (do not skip from denominator). No post-hoc calibration. dimension_score in YAML = formula result only.
|
|
182
|
+
|
|
183
|
+
Weight: **0.7**
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 11. Append findings vào report
|
|
188
|
+
|
|
189
|
+
Append CRITICAL/HIGH → section "4. Critical & High Findings".
|
|
190
|
+
Append MEDIUM/LOW → section "5. Medium & Low Findings".
|
|
191
|
+
Append unresolved questions → section "7. Unresolved Questions".
|
|
192
|
+
|
|
193
|
+
Update frontmatter: thêm `step-v-09-user-impact` vào `stepsCompleted`.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 8b. Deep Figma Cross-Validation (if page images available)
|
|
198
|
+
|
|
199
|
+
If `kg.figma_screens` in context.yaml has entries with `file` paths:
|
|
200
|
+
|
|
201
|
+
For each screen where `maps_to_uc` is not empty:
|
|
202
|
+
1. Check if the page image file exists on disk (Read tool — multimodal, ~1,500 tokens per image)
|
|
203
|
+
2. If image exists:
|
|
204
|
+
- Extract visible UI elements: input fields, buttons, labels, error states
|
|
205
|
+
- Compare with SRS UC spec for the mapped UC (use `uc_cache` line ranges for targeted read)
|
|
206
|
+
- Check: do SRS screen controls match visible UI elements in Figma?
|
|
207
|
+
- Check: are button labels consistent (SRS text vs Figma text)?
|
|
208
|
+
- Check: are there Figma elements not specified in SRS (or vice versa)?
|
|
209
|
+
3. If mismatch found → create finding:
|
|
210
|
+
- item_id: `figma_ux_mismatch`
|
|
211
|
+
- severity: HIGH if functional difference (missing field/button), MEDIUM if label/text difference
|
|
212
|
+
- evidence: "SRS UC-CA-01 lists 5 fields but Figma shows 7 fields (extra: avatar, address)"
|
|
213
|
+
- business_impact: "WHO: Dev. WHAT: Must decide which spec to follow — Figma or SRS. WHEN: During Sprint."
|
|
214
|
+
|
|
215
|
+
If page images not on disk (gitignored or not yet generated):
|
|
216
|
+
- Skip deep check, log: "Figma deep check skipped — page images not available. Run /bmad-index-figma to generate."
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## [NEW] Write Structured Findings
|
|
221
|
+
Write `{findingsOutput}`:
|
|
222
|
+
```yaml
|
|
223
|
+
dimension: user_impact
|
|
224
|
+
weight: 0.7
|
|
225
|
+
dimension_score: 0 # = round(sum(item_scores.values()) / 13 × 100, 1)
|
|
226
|
+
status: OK
|
|
227
|
+
findings: []
|
|
228
|
+
summary: {total: 0, critical: 0, high: 0, medium: 0, low: 0}
|
|
229
|
+
item_scores:
|
|
230
|
+
persona_coverage: 0.0
|
|
231
|
+
journey_complete: 0.0
|
|
232
|
+
error_ux: 0.0
|
|
233
|
+
loading_empty_states: 0.0
|
|
234
|
+
back_cancel_undo: 0.0
|
|
235
|
+
destructive_confirmation: 0.0
|
|
236
|
+
edge_case_ux: 0.0
|
|
237
|
+
pre_payment_benefit_disclosure: 0.0
|
|
238
|
+
auto_financial_action_advance_notice: 0.0
|
|
239
|
+
async_wait_ux: 0.0
|
|
240
|
+
onboarding: 0.0
|
|
241
|
+
accessibility: 0.0
|
|
242
|
+
figma_platform_coverage: 0.0
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## 12. Menu
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
User Impact Score: {X}% ({status}) [weight 0.7]
|
|
249
|
+
- CRITICAL: {count}
|
|
250
|
+
- HIGH: {count}
|
|
251
|
+
- MEDIUM: {count}
|
|
252
|
+
- LOW: {count}
|
|
253
|
+
Unresolved Questions: {count}
|
|
254
|
+
|
|
255
|
+
[C] Continue — Sang Tổng hợp Report (Step V-10)
|
|
256
|
+
[D] Detail — Xem chi tiết findings
|
|
257
|
+
[X] Cancel
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Chờ user chọn.**
|
|
261
|
+
|
|
262
|
+
Khi user chọn **C**: đọc fully và follow `./step-v-10-report.md`
|