@ngocsangairvds/vsaf 4.1.25 → 4.1.27

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.
Files changed (22) hide show
  1. package/package.json +1 -1
  2. package/skills/sdlc/pack.yaml +4 -0
  3. package/skills/sdlc/sdlc-validate-srs/SKILL.md +8 -0
  4. package/skills/sdlc/sdlc-validate-srs/data/domain-checklists/insurance.yaml +110 -0
  5. package/skills/sdlc/sdlc-validate-srs/data/grep-patterns-srs.yaml +158 -0
  6. package/skills/sdlc/sdlc-validate-srs/data/srs-review-glossary.md +237 -0
  7. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-01-discovery.md +280 -0
  8. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-02-business-alignment.md +351 -0
  9. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-03-completeness.md +353 -0
  10. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-04-consistency.md +352 -0
  11. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-05-quality.md +347 -0
  12. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-06-system-nfr.md +217 -0
  13. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-07-delivery-readiness.md +288 -0
  14. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-08-risk-analysis.md +283 -0
  15. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-09-user-impact.md +262 -0
  16. package/skills/sdlc/sdlc-validate-srs/steps-v/step-v-10-report.md +308 -0
  17. package/skills/sdlc/sdlc-validate-srs/workflow.md +269 -0
  18. package/skills/sdlc/sdlc-write-srs/SKILL.md +8 -0
  19. package/skills/sdlc/sdlc-write-srs/srs-feature-template.md +669 -0
  20. package/skills/sdlc/sdlc-write-srs/srs-system-template.md +430 -0
  21. package/skills/sdlc/sdlc-write-srs/workflow.md +139 -0
  22. package/skills/sdlc/srs/SKILL.md +44 -55
@@ -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`