@relipa/ai-flow-kit 0.2.0-beta.1 → 0.2.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/bin/aiflow.js CHANGED
@@ -212,7 +212,8 @@ program
212
212
  Examples:
213
213
  $ ak fetch-links "https://company.backlog.com/view/PROJ-10"
214
214
  $ ak fetch-links "https://company.backlog.com/view/PROJ-10#comment-456"
215
- $ ak fetch-links "https://company.backlog.com/document/98765" Backlog Document (ingest-data)
215
+ $ ak fetch-links "https://company.backlog.com/document/0193b335c62173de9547bab5dd0b5324" Backlog Document (ingest-data)
216
+ $ ak fetch-links "https://company.backlog.com/document/PROJ/e/0193b335c62173de9547bab5dd0b5324" Backlog Document share link (newer format)
216
217
  $ ak fetch-links "https://company.backlog.com/alias/wiki/1234" Backlog Wiki (ingest-data)
217
218
  $ ak fetch-links "https://company.atlassian.net/browse/PROJ-10"
218
219
  $ ak fetch-links "https://company.atlassian.net/browse/PROJ-10?focusedCommentId=789"
@@ -584,13 +585,14 @@ function checkAndInstallAiflowGlobal() {
584
585
  // ── gate (telemetry for gate workflow events) ─────────────────
585
586
  program
586
587
  .command('gate <number> <action>')
587
- .description('Log a gate workflow event (start|approved) — called by AI during gate workflow')
588
+ .description('Log a gate workflow event (start|approved|skip) — called by AI during gate workflow')
588
589
  .option('--ticket <id>', 'ticket ID')
589
590
  .option('--ai-tool <tool>', 'AI tool name')
591
+ .option('--reason <text>', 'why this gate was skipped (only used with action=skip)')
590
592
  .action((number, action, options) => {
591
593
  const gateNum = parseInt(number);
592
594
  if (isNaN(gateNum) || gateNum < 1 || gateNum > 5) return;
593
- if (!['start', 'approved'].includes(action)) return;
595
+ if (!['start', 'approved', 'skip'].includes(action)) return;
594
596
 
595
597
  if (action === 'start') {
596
598
  console.log(chalk.cyan(`\n [aiflow] Gate ${gateNum} environment check:`));
@@ -610,7 +612,7 @@ program
610
612
 
611
613
  // Keep task-state.json currentGate in sync (silent — never blocks the AI)
612
614
  if (ticketId) {
613
- updateTaskGateState(ticketId, gateNum, action).catch(() => {});
615
+ updateTaskGateState(ticketId, gateNum, action, { reason: options.reason }).catch(() => {});
614
616
  }
615
617
 
616
618
  if (action === 'approved') {
@@ -618,6 +620,8 @@ program
618
620
  console.log(chalk.yellow(` Pro-Tip: To avoid context pollution, it's recommended to start a fresh chat session.`));
619
621
  console.log(chalk.gray(` Run: aiflow task next${ticketId ? ` --ticket ${ticketId}` : ''} to save progress,`));
620
622
  console.log(chalk.gray(` then open a NEW chatbox and type "continue".\n`));
623
+ } else if (action === 'skip') {
624
+ console.log(chalk.cyan(`\n Gate ${gateNum} skipped${options.reason ? `: ${options.reason}` : ''}`));
621
625
  }
622
626
  });
623
627
 
@@ -22,9 +22,11 @@ Mẫu tài liệu này được sử dụng để trình bày kết quả phân
22
22
 
23
23
  ## 5. Bảng Phân Tích Khoảng Trống & Giả Định (Gap & Assumption Analysis)
24
24
 
25
- | # | Tính năng/Luồng nghiệp vụ | Hiện trạng tả thô | Khoảng trống (Gap) / Sự hồ phát hiện | Giả định của BA (Assumption) | Đề xuất giải pháp / Q&A ID tương ứng |
26
- | :-: | :--- | :--- | :--- | :--- | :--- |
27
- | 1 | *Ví dụ: Nhập Password* | *Mật khẩu được che giấu* | *Có nút show/hide mật khẩu hay không? Đăng nhập sai bao nhiêu lần thì khóa?* | *Mặc định không hiển thị nút show/hide. Cho phép nhập sai tối đa 5 lần.* | *Xem Q&A_01* |
28
- | 2 | | | | | |
25
+ *Chỉ liệt các Gap còn **Open** (chưa Confirmed) Gap đã Confirmed được tích hợp thẳng vào mục 1-4 phía trên, không giữ lại bảng này. Cột Mức độ ảnh hưởng: 🔴 Blocking (chặn gate tiếp theo) / 🟡 Non-blocking (được phép defer, marker `[PENDING - QA-ID]`).*
29
26
 
30
- *Lưu ý: Bảng này sở quan trọng nhất để tạo ra danh sách câu hỏi Q&A chuẩn xác cho khách hàng.*
27
+ | # | Tính năng/Luồng nghiệp vụ | Hiện trạng tả thô | Khoảng trống (Gap) / Sự mơ hồ phát hiện | Giả định của BA (Assumption) | Mức độ ảnh hưởng | Đề xuất giải pháp / Q&A ID tương ứng |
28
+ | :-: | :--- | :--- | :--- | :--- | :-: | :--- |
29
+ | 1 | *Ví dụ: Nhập Password* | *Mật khẩu được che giấu* | *Có nút show/hide mật khẩu hay không? Đăng nhập sai bao nhiêu lần thì khóa?* | *Chưa có giả định — cần khách hàng xác nhận số lần khóa vì ảnh hưởng luồng chính* | 🔴 Blocking | *Xem [PENDING - QA-01]* |
30
+ | 2 | *Ví dụ: Thông báo lỗi* | *Không nêu rõ text lỗi* | *Text thông báo lỗi cụ thể là gì?* | *Tạm dùng text mặc định, có thể đổi sau* | 🟡 Non-blocking | *Xem [PENDING - QA-02]* |
31
+
32
+ *Lưu ý: Bảng này là cơ sở quan trọng nhất để tạo ra danh sách câu hỏi Q&A chuẩn xác cho khách hàng. Số dòng phải phản ánh đúng số Gap thực tế tìm được — không rút gọn cho "gọn tài liệu" nếu vẫn còn Gap chưa được hỏi.*
@@ -32,14 +32,19 @@ Ngôn ngữ output: auto-detect theo ngôn ngữ của ticket/task input — xem
32
32
  - Nếu để trống thì hệ thống xử lý thế nào? Có thông báo lỗi gì không?
33
33
  - Có quy tắc nghiệp vụ (Business rules) ngầm định nào không?
34
34
  - Luồng thay thế (Alternative flows) hoặc luồng lỗi (Exception flows) là gì?
35
+
36
+ Số lượng Gap tìm được phải tăng theo độ phức tạp thực tế của yêu cầu — KHÔNG dừng lại khi "cảm thấy đủ" hoặc đã đạt một số lượng quen thuộc (ví dụ 5-6 điểm) nếu còn trường/luồng/actor chưa được đối chiếu hết qua 4 câu hỏi trên. Với yêu cầu nhiều màn hình/nhiều actor/tích hợp hệ thống khác, quét từng màn hình/actor riêng biệt rồi tổng hợp, không gộp tắt.
37
+ Với mỗi Gap, gắn nhãn mức độ ảnh hưởng ngay: 🔴 **Blocking** (ảnh hưởng cấu trúc dữ liệu, luồng chính, phân quyền/bảo mật, hoặc quyết định khó đảo ngược) hoặc 🟡 **Non-blocking** (chi tiết UI/text, giá trị mặc định có thể đổi sau, luồng hiếm gặp).
35
38
  - **Bước 4: Soạn dự thảo Kết quả phân tích ban đầu:**
36
- Áp dụng template phân tích ban đầu (`skill-ba-initial-analysis-template-v1.md`) để điền thông tin và lập bảng Gap/Assumption.
39
+ Áp dụng template phân tích ban đầu (`skill-ba-initial-analysis-template-v1.md`) để điền thông tin và lập bảng Gap/Assumption, kèm cột Mức độ ảnh hưởng cho mỗi Gap.
37
40
 
38
41
  ## 4. Checklist kiểm tra (Checklist for Verification)
39
42
  - [ ] Đã xác định rõ Mục tiêu hệ thống/chức năng chưa? (Hệ thống giải quyết bài toán gì?)
40
43
  - [ ] Đã làm rõ tất cả các Tác nhân (Actors) tham gia chưa?
41
44
  - [ ] Đã bóc tách hết các trường thông tin (Inputs) được liệt kê trong tài liệu thô chưa?
42
45
  - [ ] Đã ghi nhận rõ ràng danh sách các điểm mơ hồ hoặc thiếu thông tin dưới dạng **Gap/Assumption** chưa?
46
+ - [ ] Số lượng Gap tìm được có phản ánh đúng độ phức tạp thực tế (nhiều màn hình/actor/luồng → nhiều Gap hơn), không bị gò về một số cố định không?
47
+ - [ ] Mỗi Gap đã có nhãn Mức độ ảnh hưởng (🔴 Blocking / 🟡 Non-blocking) chưa?
43
48
  - [ ] Không tự tiện bổ sung các tính năng ngoài phạm vi yêu cầu của khách hàng khi chưa có thảo luận/Q&A.
44
49
 
45
50
  ## 5. Output mong đợi (Expected Output)
@@ -6,16 +6,17 @@ Mẫu tài liệu dùng để trình bày danh sách câu hỏi Q&A và theo dõ
6
6
 
7
7
  # Tài liệu Q&A: [Tên Chức Năng]
8
8
 
9
- *Tài liệu này dùng để theo dõi các vấn đề nghiệp vụ cần làm rõ giữa đội ngũ dự án và khách hàng. Trạng thái bao gồm: **Open** (Đang chờ phản hồi), **Confirmed** (Đã thống nhất).*
9
+ *Tài liệu này dùng để theo dõi các vấn đề nghiệp vụ cần làm rõ giữa đội ngũ dự án và khách hàng. Trạng thái bao gồm: **Open** (Đang chờ phản hồi), **Confirmed** (Đã thống nhất). Mức độ ảnh hưởng: 🔴 **Blocking** (chưa trả lời thì không thể tiến gate tiếp theo), 🟡 **Non-blocking** (có thể defer, output sẽ giữ marker `[PENDING - QA-ID]` tại vị trí liên quan).*
10
10
 
11
11
  ## Danh sách câu hỏi Q&A
12
12
 
13
- | ID | Chức năng / Màn hình | Nội dung yêu cầu hiện tại | Câu hỏi / Điểm chưa rõ | Đề xuất giải pháp (Options) | Câu trả lời của Khách hàng | Trạng thái |
14
- | :-: | :--- | :--- | :--- | :--- | :--- | :-: |
15
- | **QA-01** | *Đăng nhập* | *Có text link đổi mật khẩu* | *Text link này sẽ dẫn sang URL cụ thể nào? Hệ thống tự sinh OTP gửi mail hay chuyển sang màn nhập email?* | *- Option A: Chuyển sang URL `/forgot-password` để nhập Email nhận link reset.<br>- Option B: Hiển thị popup nhập SĐT nhận OTP.* | *Khách hàng phản hồi: Chọn Option A, link URL là `/forgot-password`* | **Confirmed** |
16
- | **QA-02** | | | | | | **Open** |
13
+ | ID | Chức năng / Màn hình | Nội dung yêu cầu hiện tại | Câu hỏi / Điểm chưa rõ | Đề xuất giải pháp (Options) | Mức độ ảnh hưởng | Câu trả lời của Khách hàng | Trạng thái |
14
+ | :-: | :--- | :--- | :--- | :--- | :-: | :--- | :-: |
15
+ | **QA-01** | *Đăng nhập* | *Có text link đổi mật khẩu* | *Text link này sẽ dẫn sang URL cụ thể nào? Hệ thống tự sinh OTP gửi mail hay chuyển sang màn nhập email?* | *- Option A: Chuyển sang URL `/forgot-password` để nhập Email nhận link reset.<br>- Option B: Hiển thị popup nhập SĐT nhận OTP.* | 🔴 Blocking | *Khách hàng phản hồi: Chọn Option A, link URL là `/forgot-password`* | **Confirmed** |
16
+ | **QA-02** | *Đăng nhập* | *Thông báo lỗi khi sai mật khẩu* | *Câu chữ thông báo lỗi cụ thể là gì?* | *- Option A: "Email hoặc mật khẩu không đúng."<br>- Option B: Ý kiến khác...* | 🟡 Non-blocking | *Chưa trả lời — khách hàng cần hỏi lại team Marketing* | **Open** |
17
17
 
18
18
  ---
19
19
  ## Lịch sử cập nhật tài liệu
20
20
  *Sau mỗi lần nhận phản hồi, BA cập nhật bảng trên và ghi nhận lịch sử tại đây:*
21
21
  - **Ngày [dd/mm/yyyy]:** Nhận phản hồi lần 1 từ khách hàng cho câu hỏi QA-01. Cập nhật trạng thái sang **Confirmed** và chỉnh sửa tài liệu Phân tích bản đầu tương ứng.
22
+ - **Ngày [dd/mm/yyyy]:** QA-02 (🟡 Non-blocking) vẫn **Open** — BA đã xác nhận tiếp tục sang gate kế tiếp, đánh dấu `[PENDING - QA-02]` trong Analysis tại mục thông báo lỗi đăng nhập.
@@ -14,15 +14,24 @@ Ngôn ngữ output: auto-detect theo ngôn ngữ của ticket/task input — xem
14
14
 
15
15
  ## 3. Quy trình thực hiện (Step-by-step Process)
16
16
  - **Bước 1: Chuyển đổi Gap thành câu hỏi Q&A:**
17
- Từ danh sách khoảng trống phát hiện ở bước Phân tích ban đầu, chuyển mỗi dòng thành một câu hỏi Q&A cụ thể.
18
- - **Bước 2: Chuẩn hóa câu hỏi theo mẫu `@skill-ba-qna-template-v1.md`:**
17
+ Từ danh sách khoảng trống phát hiện ở bước Phân tích ban đầu, chuyển mỗi dòng thành một câu hỏi Q&A cụ thể. Số lượng câu hỏi phải phản ánh đúng số Gap thực tế — không tự giới hạn theo một số cố định (ví dụ luôn dừng ở 5-6 câu) bất kể yêu cầu đơn giản hay phức tạp. Nếu phát sinh Gap mới trong lúc soạn câu hỏi (đọc kỹ hơn thấy còn điểm mơ hồ), bổ sung ngay câu hỏi mới, không bỏ qua để "gọn danh sách".
18
+ - **Bước 2: Gắn nhãn mức độ ảnh hưởng (Blocking/Non-blocking):**
19
+ Trước khi chuẩn hóa câu hỏi, gắn nhãn:
20
+ - 🔴 **Blocking** — ảnh hưởng cấu trúc dữ liệu, luồng chính (happy path), phân quyền/bảo mật, hoặc quyết định kiến trúc khó đảo ngược sau khi code.
21
+ - 🟡 **Non-blocking** — chi tiết UI/text, giá trị mặc định có thể đổi sau, alternative/exception flow hiếm gặp.
22
+ Nhãn này quyết định câu hỏi có bắt buộc phải Confirmed trước khi qua gate tiếp theo hay được phép defer.
23
+ - **Bước 3: Chuẩn hóa câu hỏi theo mẫu `@skill-ba-qna-template-v1.md`:**
19
24
  - Xác định phân vùng nghiệp vụ (Module/Screen).
20
25
  - Trích dẫn yêu cầu hiện tại (Current Status/Requirement).
21
26
  - Nêu rõ vấn đề mơ hồ.
22
27
  - Đưa ra các giải pháp đề xuất (Options) cùng giả định của BA.
23
- - **Bước 3: Nhận phản hồi Cập nhật (Process Responses):**
24
- - Khi nhận được câu trả lời từ khách hàng: Đọc kỹ để đảm bảo câu trả lời đã giải quyết triệt để câu hỏi. Nếu câu trả lời vẫn chưa rõ ràng, tiếp tục duy trì trạng thái "Open" hỏi lại version tiếp theo.
25
- - Nếu đã ràng: Đánh dấu "Resolved" cập nhật thông tin đó trực tiếp vào tài liệu phân tích hiện tại (`Kết quả phân tích(n).md`).
28
+ - Điền cột Mức độ ảnh hưởng (🔴 Blocking / 🟡 Non-blocking) đã gắn ở Bước 2.
29
+ - **Bước 4: Nhận phản hồiCập nhật (Process Responses):**
30
+ - Khi nhận được câu trả lời: Đọc kỹ để đảm bảo câu trả lời đã giải quyết triệt để câu hỏi.
31
+ - Đã rõ ràng → đánh dấu **Confirmed**, cập nhật thông tin đó trực tiếp vào tài liệu phân tích hiện tại, xóa marker `[PENDING - QA-ID]` liên quan nếu có.
32
+ - Chưa rõ ràng / khách hàng chưa trả lời được ngay:
33
+ - 🟡 Non-blocking → giữ **Open** (deferred), tiếp tục các câu khác/gate tiếp theo bình thường, ghi marker `[PENDING - QA-ID]` tại vị trí nội dung liên quan trong tài liệu.
34
+ - 🔴 Blocking → giữ **Open** nhưng cảnh báo rõ cho BA lý do đây là blocking và hệ quả nếu bỏ qua trước khi cho phép gate tiếp theo tiến hành; không tự hạ nhãn xuống Non-blocking để né cảnh báo.
26
35
  - Ghi nhận lịch sử thay đổi để Dev/Test nắm được lý do thay đổi logic.
27
36
 
28
37
  ## 4. Checklist kiểm tra (Checklist for Verification)
@@ -30,7 +39,10 @@ Ngôn ngữ output: auto-detect theo ngôn ngữ của ticket/task input — xem
30
39
  - [ ] Câu hỏi có sử dụng từ ngữ trung lập, không mang tính áp đặt ý kiến chủ quan của BA không?
31
40
  - [ ] Có đưa ra các phương án gợi ý (Option A, Option B...) cho các vấn đề phức tạp để khách hàng dễ lựa chọn không?
32
41
  - [ ] Các thuật ngữ viết tắt trong câu hỏi có được giải thích rõ không?
42
+ - [ ] Mỗi câu hỏi đã có nhãn Mức độ ảnh hưởng (🔴 Blocking / 🟡 Non-blocking) chưa?
43
+ - [ ] Số lượng câu hỏi có phản ánh đúng độ phức tạp thực tế của yêu cầu, không bị gò về một số cố định không?
33
44
  - [ ] Đã cập nhật đúng và đầy đủ tất cả câu trả lời của khách hàng vào tài liệu phân tích chưa? (Không bỏ sót bất kỳ điểm chốt nào).
45
+ - [ ] Mọi nội dung phụ thuộc câu hỏi còn Open đã có marker `[PENDING - QA-ID]` tại đúng vị trí, chưa bị tự suy diễn để lấp đầy?
34
46
 
35
47
  ## 5. Output mong đợi (Expected Output)
36
48
  - File danh sách câu hỏi Q&A định dạng markdown, cấu trúc thống nhất dựa theo `@skill-ba-qna-template-v1.md`, đặt tên theo chuẩn: `QnA-Log_v(m).md` trong thư mục `02.BA-Specs/02.QnA/[functionId]/`.
@@ -59,7 +59,8 @@ Same methodology as `read-study-requirement` Step 1 (steps 4–5), reused here:
59
59
  - Find modules/files that implement or would implement this UC's Main Flow (existing feature being extended, or nearest analogous feature for a new one).
60
60
  - **If GitNexus MCP available:** `gitnexus: query()` / `gitnexus: context()` for the relevant area — same token-saving shortcut as `read-study-requirement`.
61
61
  - Identify **existing error-handling conventions** (error code format, message structure, exception class hierarchy) — the Exception & Error Handling section (Step 4 below) must reuse these, not invent a new convention.
62
- - Identify **existing data model / API surface** touched by this UC (tables, DTOs, endpoints) — feeds Section 6 of the output.
62
+ - Identify **existing data model / API surface** touched by this UC (tables, DTOs, endpoints) — feeds Section 6.1 of the output.
63
+ - Identify whether this UC integrates with any system **outside** the app's own UI/DB (third-party API, webhook, message queue, etc.) — the UC Spec won't describe this since it's UI/flow-focused; if found, feeds Section 6.3. If there's none, skip Section 6.3 entirely rather than leaving it as empty boilerplate.
63
64
 
64
65
  This step exists so System Requirement reflects what the system *can actually do today*, not just what the UC Spec says in the abstract.
65
66
 
@@ -73,18 +74,32 @@ For every row in the UC Spec's Main Flow, Alternative/Exception Flows, and Busin
73
74
  - **Non-Functional Requirements** — from BR3-type rules (security, authz) or explicit constraints in the UC Spec / ticket context; do not invent performance/scale numbers that aren't stated anywhere — mark as Gap and ask instead.
74
75
  - **Business Rules → Validation Rules** — translate each BR into a concrete system-level rule, cross-referenced with the existing pattern found in Step 2 (or flagged if no existing pattern applies).
75
76
  - **Exception & Error Handling** — one per Exception Flow, using the error-handling convention found in Step 2.
76
- - **Acceptance Test Scenarios** — Given/When/Then, at least one per Main Flow outcome + one per Alternative/Exception Flow. This is the concrete deliverable requested by proposal #1 (acceptance tests generated from the spec, not copied from the ticket).
77
+ - **Acceptance Test Scenarios** — Given/When/Then, at least one per Main Flow outcome + one per Alternative/Exception Flow. This is the concrete deliverable requested by proposal #1 (acceptance tests generated from the spec, not copied from the ticket). Tag each scenario with the Requirement IDs it exercises (**Requirement Coverage**) so QA can trace AT → FR/VR/ER without re-reading the whole document.
77
78
 
78
79
  **`RESYNC` mode:** diff the new UC Spec version against the previous one section by section; carry forward unchanged items, mark changed/removed items, draft new items only for the delta. Never silently drop an item without noting why in the Change Log.
79
80
 
80
- Classify every item as **Fact** (explicit in UC Spec or confirmed in code) / **Assumption** (inferred, unconfirmed) / **Gap** (missing entirely) — same convention as `read-study-requirement` Step 1.75.
81
+ #### Writing style & layering (applies to every item in Sections 1–4)
82
+
83
+ Every item is a stack of layers, each aimed at a different reader — write each layer, don't blend them:
84
+
85
+ 1. **Requirement** — the system behavior in plain business language. No framework names, class names, method names, or library calls (`Rule::unique`, `FormRequest`, `Middleware`, `permission_handle()`, enum class names, etc.). PM/BA must be able to read this layer alone and understand what the system does.
86
+ - ❌ `Rule::unique(...)` → ✅ "The system validates that the Tag name is unique among active Tags."
87
+ - ❌ `permission_handle()` → ✅ "Only users with CREATE permission can create Tags."
88
+ - When a technical concept (e.g. an enum) has a business meaning, state the business impact first (e.g. "Newly created Tags are assigned the default status PENDING") and put the raw technical value in Implementation Reference as a `Tech Reference:` line — **never invent or assume what an enum/status value means in business terms unless the BA has confirmed it**; if unconfirmed, ask in Step 4 or leave it as the raw value with a Gap/Assumption tag. Every `Tech Reference:` line also gets a row in Section 6.2 (Glossary / Term Mapping) — write it once there, don't leave it scattered only inside individual items.
89
+ 2. **System Behavior** — how the system processes it, still in plain language (conditions, order of checks, what triggers what). This is what BA/Tester use to write test cases.
90
+ 3. **Error Response** (Validation Rules and Exception & Error Handling only) — the expected result for Tester: keep the HTTP status code (never drop it — Tester needs it), paired with a friendly label and the user-facing message, e.g. `HTTP 422 (Validation Error) — "..."`.
91
+ 4. **Implementation Reference** — file/class/method/framework rule, for Developer cross-check only. This is where all the technical detail from Step 2 belongs — it never appears in layers 1–2.
92
+
93
+ Keep each layer short — one requirement, one behavior, one result. If a sentence needs 2–3 clauses to say, split it into separate `Requirement` / `System Behavior` / `Result` lines instead of one long sentence.
94
+
95
+ Classify every item as **Gap** (missing entirely) / **Assumption** (inferred, unconfirmed) / **Decision** (a choice made and confirmed during Q&A) / **Deviation** (implementation differs from what the UC Spec states) — only when one of these applies. A plain fact (explicit in UC Spec or confirmed in code) needs no tag; do not mark every item "Fact" by default, since a Requirement is a fact unless flagged otherwise. This replaces the old Fact/Assumption/Gap convention from `read-study-requirement` Step 1.75 for this skill's output — `read-study-requirement` itself is unaffected.
81
96
 
82
97
  ---
83
98
 
84
99
  ### Step 4: Clarify via Q&A (ask until Confirmed) [Gate 1]
85
100
 
86
101
  - Ask **one question at a time**, prioritizing unresolved Assumptions/Gaps from Step 3.
87
- - **Do not run `aiflow task next` into Gate 2 while any Gap remains unresolved.** This is the hard rule from proposal #7 — no fabrication, no "reasonable default" for missing UC content. If DEV genuinely cannot answer (needs BA), stop and record it as an open item in Section 8 rather than guessing.
102
+ - **Do not run `aiflow task next` into Gate 2 while any Gap remains unresolved.** This is the hard rule from proposal #7 — no fabrication, no "reasonable default" for missing UC content. If DEV genuinely cannot answer (needs BA), stop and record it as an unresolved Gap in Section 7 rather than guessing.
88
103
  - Do NOT invoke `superpowers:brainstorming` (same reason as `read-study-requirement`: its terminal state bypasses this gate's approval).
89
104
  - All Gaps Confirmed → present a short Gate 1 summary, wait for DEV to run `aiflow task next` before continuing to Step 5.
90
105
 
@@ -122,6 +137,16 @@ Save to `AK-Docs/02.BA-Specs/00.Requirements/[functionId]/System-Requirement_v{N
122
137
 
123
138
  ---
124
139
 
140
+ ## Executive Summary
141
+ - **Purpose:** [1 sentence — what this document covers and why it exists]
142
+ - **Implementation status:** [e.g. Not started / In progress / Matches UC Spec v{N}]
143
+ - **Key deviations from UC Spec:** [bullet list of Deviation-tagged items, or "None identified"]
144
+ - **Action needed from BA:** [bullet list of unresolved Gaps/Assumptions needing BA input, or "None — ready for Dev handoff"]
145
+
146
+ > This section alone should give PM/BA the full picture in about 30 seconds — everything below is supporting detail for BA/Tester/Dev.
147
+
148
+ ---
149
+
125
150
  ## 0. Traceability Matrix
126
151
  | UC Reference (Flow / BR) | System Requirement Item(s) |
127
152
  |---|---|
@@ -130,49 +155,95 @@ Save to `AK-Docs/02.BA-Specs/00.Requirements/[functionId]/System-Requirement_v{N
130
155
  | BR1.1 | VR-01 |
131
156
 
132
157
  ## 1. Functional Requirements
133
- | ID | Requirement | Traced UC Ref | Type |
134
- |---|---|---|---|
135
- | FR-01 | ... | Main Flow #3 | Fact |
158
+
159
+ Each item below is layered: **Requirement** (business language, for PM/BA) → **System Behavior** (for BA/Tester) → **Implementation Reference** (for Dev, technical detail only — never appears in the layers above it).
160
+
161
+ ### FR-01: [short business-behavior title]
162
+ - **Requirement:** [system behavior in business language, no framework/class/method names]
163
+ - **System Behavior:** [how the system processes it — conditions, order of checks]
164
+ - **Traced UC Ref:** Main Flow #3
165
+ - **Classification:** [Gap | Assumption | Decision | Deviation — omit this line if it's a plain fact]
166
+ - **Implementation Reference:** [file:line / class / method]
167
+
168
+ <!-- repeat FR-02, FR-03, ... in the same block format -->
136
169
 
137
170
  ## 2. Non-Functional Requirements
138
- | ID | Requirement | Traced UC Ref | Type |
139
- |---|---|---|---|
140
- | NFR-01 | ... | BR3.1 | Fact |
171
+
172
+ ### NFR-01: [short title]
173
+ - **Requirement:** [business language — e.g. performance/security expectation]
174
+ - **System Behavior:** [how it's enforced, in plain language]
175
+ - **Traced UC Ref:** BR3.1
176
+ - **Classification:** [Gap | Assumption | Decision | Deviation — omit if plain fact]
177
+ - **Implementation Reference:** [file:line / class / method]
141
178
 
142
179
  ## 3. Business Rules → Validation Rules
143
- | ID | System-level Rule | Traced UC BR | Existing Code Pattern |
144
- |---|---|---|---|
145
- | VR-01 | ... | BR1.1 | [file:line] |
180
+
181
+ ### VR-01: [short title]
182
+ - **Requirement:** [e.g. "Tag name must be unique among active Tags."]
183
+ - **System Behavior:** [e.g. "The system checks the Tag name against all active Tags before saving."]
184
+ - **Error Response:** HTTP 422 (Validation Error) — "[user-facing message]"
185
+ - **Traced UC BR:** BR1.1
186
+ - **Classification:** [Gap | Assumption | Decision | Deviation — omit if plain fact]
187
+ - **Implementation Reference:** [e.g. `Rule::unique(...)` in `StoreTagRequest`]
146
188
 
147
189
  ## 4. Exception & Error Handling
148
- | ID | Trigger Condition | System Behavior | Traced Exception Flow | Error Convention Used |
149
- |---|---|---|---|---|
150
- | ER-01 | ... | ... | Exception Flow B | [existing error code/class] |
190
+
191
+ ### ER-01: [trigger condition, in business language]
192
+ - **Requirement:** [e.g. "Only users with CREATE permission can create Tags."]
193
+ - **System Behavior:** [e.g. "The request is rejected because the caller lacks the required permission."]
194
+ - **Error Response:** HTTP 403 (Forbidden) — "[user-facing message]"
195
+ - **Traced Exception Flow:** Exception Flow B
196
+ - **Classification:** [Gap | Assumption | Decision | Deviation — omit if plain fact]
197
+ - **Implementation Reference:** [existing error code/class/middleware]
151
198
 
152
199
  ## 5. Acceptance Test Scenarios
153
200
  ### AT-01: [Scenario] (Main Flow)
154
201
  - **Given** ...
155
202
  - **When** ...
156
203
  - **Then** ...
204
+ - **Requirement Coverage:** FR-01, FR-03
157
205
 
158
206
  ### AT-02: [Scenario] (Exception Flow B)
159
- ...
207
+ - **Given** ...
208
+ - **When** ...
209
+ - **Then** ...
210
+ - **Requirement Coverage:** VR-01, ER-01
160
211
 
161
212
  ## 6. Existing System Context
162
- ### Related Modules / Files
163
- | File | Role | Current Behavior |
164
- |---|---|---|
165
213
 
166
- ### Data / API Impact
167
- | Entity / Endpoint | Change Type | Note |
214
+ ### 6.1 System Areas Summary
215
+ Summary only deeper implementation detail belongs in each item's **Implementation Reference** above, not here.
216
+
217
+ | Area | Summary |
218
+ |---|---|
219
+ | API | ... |
220
+ | Model | ... |
221
+ | Validation | ... |
222
+ | Migration | ... |
223
+ | Test | ... |
224
+
225
+ ### 6.2 Glossary / Term Mapping
226
+ Every `Tech Reference:` used in Sections 1–4 gets one row here — a single place to look up what a business term maps to in code, instead of hunting through every item. Only include terms with a BA-confirmed business meaning (Decision) or the BA-unconfirmed raw value tagged accordingly — never a guessed meaning.
227
+
228
+ | Business Term | Technical Reference | Classification |
168
229
  |---|---|---|
230
+ | [e.g. "default status PENDING"] | `TagStatusEnum::PENDING` | Decision (BA-confirmed [date]) / Assumption (unconfirmed) |
231
+
232
+ ### 6.3 External System Interfaces *(optional — include only if this UC integrates with a system outside the app's own UI/DB, e.g. third-party API, webhook, message queue)*
233
+ The UC Spec describes UI/business flow, not external integration contracts — capture those here when they exist. Omit this subsection entirely if the UC has no external interface.
234
+
235
+ | Interface | Direction | Protocol/Format | Note |
236
+ |---|---|---|---|
237
+ | [e.g. Payment Gateway API] | Outbound | REST/JSON | ... |
238
+
239
+ ## 7. Assumptions / Gaps / Decisions / Deviations
240
+ Only items tagged Gap / Assumption / Decision / Deviation land here — a plain fact is the default, unmarked state of every item above and is not repeated in this table.
169
241
 
170
- ## 7. Facts / Assumptions / Gaps
171
242
  | Type | Item | Resolution |
172
243
  |---|---|---|
173
244
 
174
- ## 8. Open Questions Log
175
- [Question asked → answer received → date. Unresolved Gaps stay listed here, never silently dropped.]
245
+ ## 8. Decision Log
246
+ [Question asked → decision/answer received → date. Unresolved Gaps stay listed here, never silently dropped. (Renamed from "Open Questions Log" — every entry here already has an answer; unresolved items are Gaps, tracked in Section 7.)]
176
247
 
177
248
  ## 9. Change Log
178
249
  | Date | Ticket | Change | Note |
@@ -229,7 +300,7 @@ This does not bump `System-Requirement-Version` — the version stays tied to th
229
300
  | Concern | Handled by |
230
301
  |---|---|
231
302
  | Source code investigation methodology | `read-study-requirement` Step 1 pattern (reused inline) / GitNexus MCP |
232
- | Fact/Assumption/Gap classification | This skill (inline, same convention as `read-study-requirement` Step 1.75) |
303
+ | Gap/Assumption/Decision/Deviation classification | This skill (inline, Step 3 — output-only convention, distinct from `read-study-requirement` Step 1.75's Fact/Assumption/Gap) |
233
304
  | Q&A loop (one question at a time, no fabrication) | This skill (inline) |
234
305
  | UC Spec structure/content | `skill-ba-uc-template-v1.md` (read-only reference, never edited by this skill) |
235
306
  | Split decision | This skill (Step 5) |
@@ -250,3 +321,10 @@ This does not bump `System-Requirement-Version` — the version stays tied to th
250
321
  - ✅ **MUST** investigate source code (Step 2) before drafting Exception/Error Handling or Existing System Context.
251
322
  - ✅ **MUST** carry the mandatory `UC-Spec-Version` header on the master file.
252
323
  - ✅ **MUST** surface a ⚠️ non-blocking warning (never a cancel) from the Gate 1 Pre-flight check until this skill reaches APPROVED.
324
+ - ✅ **MUST** write the `Requirement` and `System Behavior` layer of every FR/NFR/VR/ER item in business language — no framework, class, or method names (those belong only in `Implementation Reference`).
325
+ - ✅ **MUST** keep the HTTP status code in every `Error Response` line, paired with a friendly label and the user-facing message (e.g. `HTTP 422 (Validation Error) — "..."`) — never drop the code for readability.
326
+ - ✅ **MUST** tag each Acceptance Test with its `Requirement Coverage` (the FR/VR/ER IDs it exercises).
327
+ - ❌ **DO NOT** tag every item "Fact" — a plain fact is the unmarked default; only tag `Gap`, `Assumption`, `Decision`, or `Deviation` when one applies.
328
+ - ❌ **DO NOT** state or assume the business meaning of an enum/status value (e.g. what `PENDING` "means" for the business) unless the BA has confirmed it — reference the raw technical value in `Implementation Reference` and tag it `Assumption` or `Gap` until confirmed.
329
+ - ✅ **MUST** mirror every `Tech Reference:` used in Sections 1–4 as a row in Section 6.2 (Glossary / Term Mapping) — don't leave the mapping only inside individual items.
330
+ - ❌ **DO NOT** include Section 6.3 (External System Interfaces) when the UC has no integration outside the app's own UI/DB — omit the subsection entirely rather than leaving an empty table.
@@ -16,7 +16,7 @@ keywords: ingest data, comtor, brse, pm workflow, meeting minutes, qna log, conf
16
16
  | Input | Cách xử lý |
17
17
  |---|---|
18
18
  | Backlog ticket link (`/view/PROJ-N`) hoặc comment (`#comment-N`) | `ak fetch-links "<url>"` → JSON `{ sourceType: "ticket" \| "comment", ... }` |
19
- | Backlog Document link (`/document/{id}` hoặc `/alias/document/{id}`) | `ak fetch-links "<url>"` → JSON `{ sourceType: "document" \| "document-comment", ... }`. ⚠️ API Document của Nulab còn mới (2026) — nếu lệnh trả lỗi HTTP 404, báo lại cho người dùng, đây là dấu hiệu endpoint cần điều chỉnh, không phải lỗi ở phía bạn. |
19
+ | Backlog Document link (`/document/{id}`, `/alias/document/{id}`, hoặc share link mới `/document/{PROJECT_KEY}/e/{id}`) | `ak fetch-links "<url>"` → JSON `{ sourceType: "document" \| "document-comment", ... }`. Đã xác nhận hoạt động live (2026-08-06) cho document body (`title`/`content`). ⚠️ Fetch comment trên Document (`document-comment`) vẫn chưa xác minh trên space thật — nếu lệnh trả lỗi HTTP 404 hoặc `content` rỗng, báo lại cho người dùng, đây là dấu hiệu endpoint/field cần điều chỉnh, không phải lỗi ở phía bạn. |
20
20
  | Backlog Wiki link (`/alias/wiki/{id}`) | `ak fetch-links "<url>"` → JSON `{ sourceType: "wiki", ... }` |
21
21
  | Jira ticket/comment link | `ak fetch-links "<url>"` → JSON `{ sourceType: "ticket" \| "comment", ... }` |
22
22
  | SharePoint link (`*.sharepoint.com`) | `ak fetch-links "<url>"` → `{ sourceType: "unsupported", reason: "sharepoint-not-configured" }`. **Không có connector** (cần Microsoft Graph API + OAuth, xem PM Workflow doc "Vấn đề 4" — chưa làm POC). Hiển thị `message` trong JSON cho người dùng, và đề nghị: "Paste trực tiếp nội dung comment/tài liệu vào chat, mình sẽ dùng luôn." |
@@ -130,20 +130,44 @@ Nếu người dùng yêu cầu sửa (thêm/bớt ý, đổi log đích, sửa
130
130
 
131
131
  **Không phải mọi entry đều sinh ra task.** Trước khi đề xuất bất kỳ task nào, tự hỏi: nội dung này có yêu cầu một hành động cụ thể (thay đổi spec, code, test, tài liệu...) hay chỉ là thông tin tham khảo/FYI (cập nhật tiến độ, thông tin không đổi hành vi hệ thống, trả lời một câu hỏi đã đóng)?
132
132
 
133
- - **Chỉ là tham khảo** → hiển thị: `ℹ️ Nội dung này không phát sinh task — chỉ lưu làm tài liệu tham khảo. Gate 3 kết thúc.` rồi dừng, không hỏi thêm, không chạy `ak gate 3 start`.
133
+ - **Chỉ là tham khảo** → hiển thị: `ℹ️ Nội dung này không phát sinh task — chỉ lưu làm tài liệu tham khảo. Gate 3 kết thúc.` rồi chạy `ak gate 3 skip --ticket [ticket-id] --reason "<1 câu lý do>"` (không cần `ak gate 3 start` trước) và dừng, không hỏi thêm. Việc này đóng gate đúng cách — dashboard (ai-flow-ex) hiển thị "⏭ Gate 3 skipped — \<lý do\>" thay vì để task treo mãi ở trạng thái "sẵn sàng chạy Gate 3".
134
134
  - **Có hành động cụ thể** → tiếp tục Bước 3. Khi không chắc (ví dụ nội dung vừa có FYI vừa có 1 ý cần sửa code) — nghiêng về đề xuất task cho phần cần hành động, bỏ qua phần FYI, không tự bịa task cho phần không rõ.
135
135
 
136
+ **Riêng khi nguồn là `Confirmations-Log`** (khách hàng CHỐT chính thức 1 thay đổi requirement) — đây là trường hợp dễ đề xuất thiếu task nhất nếu chỉ dựa vào Action items viết sẵn trong nội dung (vd chỉ thấy 1 bug fix được nêu tên, bỏ sót toàn bộ phần spec/testcase phát sinh từ chính rule vừa chốt). Trước khi sang Bước 3, tự chạy qua đủ checklist tối thiểu sau — không hiển thị checklist này cho PM, chỉ dùng để tự rà soát không bỏ sót:
137
+
138
+ 1. **UC Spec** — functionId này đã có UC Spec chưa, và rule vừa chốt đã phản ánh trong Spec chưa? Chưa → task `spec`.
139
+ 2. **System Requirement** — chỉ cần nếu có task `coding` theo sau (Gate 1 coding sẽ tự chặn nếu System Requirement thiếu/lệch version, xem `CLAUDE.md` pre-check) → task `system-requirement`.
140
+ 3. **Impact analysis** — thay đổi có đủ phức tạp/rủi ro (ảnh hưởng nhiều module/feature khác, hoặc PM cần thấy effort/scope trước khi giao việc) để cần 1 tài liệu đánh giá riêng, tách khỏi Gate 1 coding không? Cần → task `impact-analysis`.
141
+ 4. **Coding** — có thay đổi hành vi hệ thống cần code không? Cần → task `coding` (tách thành nhiều task nhỏ nếu phạm vi lớn, mỗi task 1 title riêng).
142
+ 5. **Data migration/backfill** — rule mới có áp dụng hồi tố lên dữ liệu đã tồn tại không (khác với chỉ áp dụng từ nay về sau)? Có → thêm 1 task `coding` **riêng** cho việc migration/backfill, không gộp chung với task coding chính (2 rủi ro/effort khác nhau, cần review riêng).
143
+ 6. **Create/Update testcase** — cần → task `test`.
144
+ 7. **Execute test** — cần → task `execute-test`.
145
+
146
+ Không phải mục nào cũng luôn có (case rule chỉ áp dụng tương lai thì mục 5 = không cần) — nhưng phải đi qua đủ 7 mục và có lý do trước khi kết luận không cần, không bỏ qua mục nào chỉ vì nội dung entry không viết thành Action item rõ ràng.
147
+
136
148
  ### 5.3 Bước 3 — Đề xuất danh sách task
137
149
 
138
150
  Mỗi task gồm:
139
151
 
140
152
  | Trường | Ghi chú |
141
153
  |---|---|
142
- | `type` | `spec` (tạo/update UC Spec) · `coding` · `test` · `other` (update tài liệu không thuộc BA/QA/Dev, vd Rules) |
154
+ | `type` | `spec` (tạo/update UC Spec) · `system-requirement` (tạo/update System Requirement) · `impact-analysis` (đánh giá phạm vi ảnh hưởng, tách riêng khỏi Gate 1 coding) · `coding` (bao gồm cả migration/backfill, tách task riêng nếu cần) · `test` (tạo/update testcase) · `execute-test` (thực thi testcase có sẵn) · `other` (update tài liệu không thuộc BA/QA/Dev, vd Rules) |
143
155
  | `title` | Ngắn, hành động rõ (vd "Cập nhật flow OTP theo feedback khách — tăng thời hạn 30s → 90s") |
144
- | `track` | BA / Dev / QA — để PM biết ai sẽ nhận task này |
156
+ | `track` | BA / Dev / QA / Analyst — để PM biết ai sẽ nhận task này |
145
157
  | `description` | Theo đúng template mục 6.1 `PM Workflow_v1.0.md`: |
146
158
 
159
+ Mỗi `type` map thẳng vào 1 task type có sẵn khi người nhận chạy `ak use TICKET-XXX` (không cần Gate workflow mới — xem `scripts/use.js` cho danh sách đầy đủ):
160
+
161
+ | `type` task | Task type chọn ở `ak use` |
162
+ |---|---|
163
+ | `spec` | 📋 Create Spec |
164
+ | `system-requirement` | 📐 Create System Requirement |
165
+ | `impact-analysis` | 📊 Impact Analysis |
166
+ | `coding` | 🐛 Bug Fix / ✨ Feature / 🔄 Refactor (tuỳ nội dung task) |
167
+ | `test` | ✅ Create TestCase |
168
+ | `execute-test` | ▶️ Execute Test |
169
+ | `other` | Không map task type nào — tuỳ nội dung, người nhận tự xử lý ngoài Gate workflow |
170
+
147
171
  ```text
148
172
  ## Nội dung task
149
173
  [Mô tả task do AI đề xuất]
@@ -190,37 +214,61 @@ Check LOCAL trước, chỉ hỏi khi thật sự chưa biết (Vấn đề 5.1)
190
214
  2. Đã có → dùng luôn, hiển thị rõ cho PM biết đang dùng project nào + nguồn (đã lưu từ lần trước).
191
215
  3. Chưa có → hiển thị danh sách project vừa fetch được, PM chọn 1 → lưu lại bằng `ak backlog-set-default-project <id> <key>` hoặc `ak jira-set-default-project <key>` — để lần sau không hỏi lại.
192
216
 
217
+ ### 5.6b Bước 6b — Ticket cha (chỉ hỏi khi danh sách có ≥ 2 task)
218
+
219
+ Nếu danh sách chỉ có 1 task, không có gì để gộp — coi `parentTicket.mode = "none"` và bỏ qua bước này.
220
+
221
+ Nếu ≥ 2 task, hỏi đúng 1 câu:
222
+
223
+ ```text
224
+ Gộp N task này dưới 1 ticket cha?
225
+ 1. Tạo mới ticket cha
226
+ 2. Dùng ticket cha có sẵn — cho biết ticket ID
227
+ 3. Không cần ticket cha
228
+ ```
229
+
230
+ - **(1)** → hỏi PM 1 tiêu đề ngắn cho ticket cha (gợi ý: dùng lại "Tổng quan nội dung thay đổi" đã soạn cho task `spec` ở Bước 3, nếu có; không có thì tự tóm tắt 1 câu). `parentTicket = { "mode": "create", "title": "...", "description": "..." }`.
231
+ - **(2)** → PM nhập ticket ID có sẵn. `parentTicket = { "mode": "existing", "existingId": "<ID do PM nhập>" }`. Việc xác minh ticket đó có tồn tại thật diễn ra ở Bước 7 (khi gọi `ak tasks create-tickets`) — không tự coi là đúng trước khi có kết quả lệnh.
232
+ - **(3)** → `parentTicket = { "mode": "none" }`.
233
+
234
+ ⚠️ **Chưa xác minh trên instance thật:** liên kết cha-con cần Backlog project đã bật tính năng phân cấp issue (Subtasking), hoặc Jira project hỗ trợ field `parent` trực tiếp (rõ nhất với project dạng team-managed; company-managed có thể cần issue type `Subtask` riêng — chưa test). Nếu Bước 7 báo lỗi `parent-create-failed`/`parent-not-found`, hoặc 1 task con lỗi do gán parent thất bại — hiển thị nguyên lỗi cho PM, hỏi PM muốn: thử lại với ticket cha khác, tiếp tục tạo các ticket con không gắn parent (`mode: "none"`), hay dừng lại để PM xử lý cấu hình Backlog/Jira trước.
235
+
193
236
  ### 5.7 Bước 7 — Tạo ticket
194
237
 
195
238
  1. Ghi danh sách task đã duyệt ra 1 file JSON tạm (vd `.aiflow/tmp/tasks-[ticketId].json`), đúng shape mà `ak tasks create-tickets` đọc (xem `scripts/ticket-writer.js`):
196
239
  ```json
197
240
  {
198
241
  "target": "backlog",
242
+ "parentTicket": { "mode": "create", "title": "...", "description": "..." },
199
243
  "tasks": [
200
244
  { "type": "coding", "title": "...", "description": "..." }
201
245
  ]
202
246
  }
203
247
  ```
248
+ `parentTicket` lấy nguyên từ kết quả Bước 6b (bỏ field này hoặc `{"mode": "none"}` nếu không gộp ticket cha).
204
249
  2. Chạy `ak tasks create-tickets <file> --json`.
205
250
  3. Đọc kết quả JSON trả về:
206
251
  - `{"error":"missing-write-credentials", "field": "...", "message": "..."}` → **đây không phải lỗi hệ thống** — hiển thị đúng `message` cho PM, hỏi PM nhập giá trị key ngay trong hội thoại (dùng luôn khung chat làm nơi PM "nhập & submit"), nhận giá trị → chạy `ak credentials set <field> "<giá trị PM vừa nhập>"` → chạy lại bước 2 (retry đúng 1 lần; nếu vẫn lỗi, báo PM key có thể sai/chưa đủ quyền, không tự thử lại vô hạn).
207
252
  - `{"error":"missing-project", ...}` → quay lại Bước 6 (chưa xác định được project).
208
- - Thành công (`ok: true`)mỗi task `ticketId` + `url` riêng; task nào `ok: false` (lỗi phía Backlog/Jira, vd thiếu field) báo cho PM, các task khác đã tạo vẫn giữ nguyên (không rollback).
253
+ - `{"error":"parent-not-found", "message": "..."}` → ticket cha PM cung cấp Bước 6b (2) không tồn tại/không đọc được báo PM, quay lại Bước 6b để nhập ID khác hoặc chọn phương án khác.
254
+ - `{"error":"parent-create-failed", "message": "..."}` → tạo ticket cha thất bại (thường do project chưa hỗ trợ phân cấp issue) — hiển thị nguyên lỗi, hỏi PM có muốn tạo lại không gắn ticket cha (`mode: "none"`) hay dừng lại.
255
+ - Thành công (`ok: true`) → mỗi task có `ticketId` + `url` riêng, có thêm `parent` (ticket cha vừa tạo/dùng, nếu có); task nào `ok: false` (lỗi phía Backlog/Jira, vd thiếu field) → báo rõ cho PM, các task khác đã tạo vẫn giữ nguyên (không rollback).
209
256
 
210
257
  ### 5.8 Bước 8 — Ghi ngược liên kết + đóng Gate
211
258
 
212
- 1. Append vào cuối đúng entry gốc (Meetings-Log/QnA-Log/Confirmations-Log) 1 dòng:
259
+ 1. Append vào cuối đúng entry gốc (Meetings-Log/QnA-Log/Confirmations-Log) 1 dòng, kèm ticket cha nếu có:
213
260
  ```text
214
- → Tasks created: TICKET-101 (coding), TICKET-102 (test)
261
+ → Tasks created: TICKET-100 (parent), TICKET-101 (coding), TICKET-102 (test)
215
262
  ```
216
263
  Việc sửa file này đi qua đúng branch đang dùng ở Gate 2 (không tạo MR riêng — gộp vào cùng thay đổi, hoặc nếu MR đã mở/merge thì tạo 1 commit nhỏ tiếp theo trên cùng branch/1 MR mới tuỳ trạng thái branch lúc đó).
217
264
  2. Hiển thị tổng kết:
218
265
  ```text
219
266
  ✅ GATE 3 DONE — Đã tạo N/N ticket trên [Backlog/Jira]:
267
+ - Ticket cha: TICKET-100 — <url> (bỏ dòng này nếu không gộp ticket cha)
220
268
  - TICKET-101 (coding) — <url>
221
269
  - TICKET-102 (test) — <url>
222
270
  → Dev/QA chạy `ak use TICKET-XXX` trên từng ticket để bắt đầu Gate tương ứng (Coding/QA workflow hiện có).
223
271
  ```
224
272
  3. Run: `ak gate 3 approved --ticket [ticket-id]`.
225
273
 
226
- > **Telemetry:** Run `ak gate 3 start --ticket [ticket-id]` khi bắt đầu Bước 1 (bỏ qua nếu Bước 2 kết luận không cần task — không start gate cho trường hợp "chỉ tham khảo"). Run `ak gate 3 approved --ticket [ticket-id]` khi Bước 8 xong.
274
+ > **Telemetry:** Run `ak gate 3 start --ticket [ticket-id]` khi bắt đầu Bước 1 (bỏ qua nếu Bước 2 kết luận không cần task — không start gate cho trường hợp "chỉ tham khảo"). Run `ak gate 3 approved --ticket [ticket-id]` khi Bước 8 xong, HOẶC `ak gate 3 skip --ticket [ticket-id] --reason "..."` khi Bước 2 kết luận không cần task (thay cho việc không đóng gate — xem Bước 2).