📘 Guide vận hành

PHẦN 3 — QUY TRÌNH BẢY GIAI ĐOẠN

G0 Tiếp nhận → G1 Làm rõ → G2 Chốt yêu cầu → G3 Đặc tả → G4 Thực thi → G5 Nghiệm thu → G6 Đo lường
   (BA+PM)      (BA+AI)      (BA+PM+KH)      (DEV→BA)     (DEV+AI)      (PM+AI)        (PM+AI)
Sơ đồ 1 — Tổng quan bảy giai đoạn
Sơ đồ 1 — Tổng quan bảy giai đoạn

Chú giải màu:

  • xám = hai vai trò cùng làm
  • tím = BA chủ trì
  • xanh lá = DEV chủ trì
  • cam đất = PM chủ trì

G3 màu xám vì đây là giai đoạn duy nhất DEV và BA phải cùng ngồi xuống chốt một tài liệu. Ba đường nét đứt là vòng lặp ngược; đường G3 → G1 đáng giá nhất — nó bắt lỗi yêu cầu khi chi phí sửa còn là năm phút.

G0 — TIẾP NHẬN YÊU CẦU (BA + PM)

BướcNgườiHành động
G0.1BA + PMHọp khách hàng. Người không dẫn dắt sẽ ghi chép.
G0.2BATrong 24h: đổ nguyên liệu thô vào 00-inbox/meetings/YYYY-MM-DD-<chủ đề>.md. Không diễn giải, không làm đẹp.
G0.3BAĐính kèm file khách hàng gửi vào 00-inbox/attachments/.
G0.4PMGhi các cam kết về thời gian và phạm vi vào cuối biên bản.

Đầu ra: biên bản thô. Commit ngay. Không cho AI xử lý ở bước này — nguyên liệu thô là bằng chứng, khi hai tháng sau có tranh cãi "khách hàng có nói vậy không" thì cần bản gốc chưa qua diễn giải.

G1 — LÀM RÕ YÊU CẦU (BA + AI)

BướcNgườiHành động
G1.1BA + AI/clarify — AI đọc 00-inbox/, sinh câu hỏi làm rõ, phân mức P1/P2/P3.
G1.2BADuyệt và cắt gọt. Giữ tối đa 5–7 câu mỗi lượt gửi khách hàng.
G1.3BAGhi 01-analysis/open-questions.md, trạng thái open. Gửi khách hàng.
G1.4BAKhách hàng trả lời → ghi clarification-log.md → chuyển resolved.
G1.5BA + AIDựng as-is / to-be, vẽ flowchart. BA kiểm chứng lại với khách hàng.
G1.6BA + AIBổ sung glossary.md.

Điều kiện thoát: không còn open question mức P1.

Ba mức Open Question dùng xuyên suốt quy trình:

MứcĐịnh nghĩaXử lý
P1Không trả lời thì không code đượcChặn
P2Ảnh hưởng thiết kếMang theo kèm giả định ghi rõ ở PRD mục 10
P3Chi tiết nhỏHỏi sau

G2 — CHỐT YÊU CẦU (BA + PM + khách hàng)

BướcNgườiHành động
G2.1BA + AIViết PRD vào 02-requirements/prd/FE-XXX-<slug>.md. Mỗi AC phải có mã `FE-XXX-AC-YY`.
G2.2BAChạy self-review checklist (Phần 5).
G2.3PMReview ở góc độ: đo lường được không, ước lượng được không, có trong hợp đồng không.
G2.4BA + PMTrình khách hàng. Duyệt → status: baselined, gắn tag git FE-001-v1.0.
G2.5BATạo GitLab issue, link PRD tại tag baseline, dán checklist AC ID.
G2.6PMXếp Milestone, gán prio::, assignee. Chuyển status::spec.

Đầu ra: PRD baseline + issue có checklist AC. Chưa ước lượng ở giai đoạn này — ước lượng trước khi có spec là đoán mò, DEV chưa biết mình phải xử lý bao nhiêu trường hợp biên.

Toàn bộ luồng yêu cầu G0 → G2:

Sơ đồ 2 — Luồng yêu cầu (G0 → G2)
Sơ đồ 2 — Luồng yêu cầu (G0 → G2)

Luồng này không còn kết thúc ở `ready-for-dev` như v1.0 — nó dừng ở status::spec và bàn giao sang G3. Điều kiện thoát vòng lặp làm rõ vẫn là hết câu hỏi mức P1, không phải hết mọi câu hỏi.

G3 — ĐẶC TẢ (DEV sinh → BA duyệt)

Đây là bản dịch từ ngôn ngữ nghiệp vụ sang ngôn ngữ kiểm chứng được. Là hợp đồng giữa BA và DEV, và là artifact duy nhất cả hai con AI cùng đọc trước khi làm việc.

BướcNgườiHành động
G3.1DEV + AI/spec — AI đọc PRD tại tag baseline + business-rules.md + glossary.md, sinh spec draft cho từng AC.
G3.2DEVRà từng mục: đủ Given / When / Then chưa? có dữ liệu mẫu cụ thể chưa? có liệt kê trường hợp biên chưa?
G3.3DEVGhi lại mọi chỗ phải đoán vào mục "Câu hỏi phát sinh" cuối file spec. Đây là sản phẩm giá trị nhất của giai đoạn này.
G3.4DEVMở MR đưa spec vào 02-requirements/spec/FE-XXX-spec.md, tag BA review.
G3.5BADuyệt từng AC. Ba khả năng: đúng ý → approve · DEV hiểu sai → comment sửa · PRD thật sự thiếu → quay lại G1, hỏi khách hàng.
G3.6BA + DEVChốt. Merge MR, đặt status: approved, gắn tag git FE-001-spec-v1.0.
G3.7DEVƯớc lượng /estimate, thống nhất weight với BA.
G3.8PMChạy /dor-check. Đạt → status::ready-for-dev.

Đầu ra: spec đã duyệt + ước lượng đáng tin.

Sơ đồ 3 — Luồng đặc tả (G3)
Sơ đồ 3 — Luồng đặc tả (G3)

Vì sao DEV viết spec chứ không phải BA. Nghe ngược, nhưng lý do rất thực tế. Bắt DEV viết lại yêu cầu dưới dạng kiểm chứng được sẽ ép DEV đọc kỹ PRD, và mọi chỗ hiểu sai lộ ra ngay tại đây. Nếu BA viết cả spec, DEV vẫn có thể đọc lướt rồi code theo cách hiểu riêng — và không ai biết cho tới lúc UAT. Bước BA duyệt spec là lần duy nhất trong cả quy trình có hai người cùng đọc một mô tả và xác nhận "tôi hiểu giống anh".

Ba nhánh khi BA đọc spec:

Tình huốngXử lý
Đúng ý BAApprove, merge, gắn tag
DEV hiểu sai PRDComment, DEV sửa spec, lặp lại — PRD giữ nguyên
PRD thật sự thiếuQuay về G1 hỏi khách hàng, sau đó PRD lên version mới

Phân biệt hai trường hợp cuối rất quan trọng. Nhầm "PRD thiếu" thành "DEV hiểu sai" sẽ khiến cùng một lỗ hổng tài liệu lặp lại ở mọi feature sau.

Definition of Ready — điều kiện gắn status::ready-for-dev:

  • Issue link tới PRD tại tag baseline cụ thể
  • Spec đã `approved`, tag `FE-XXX-spec-vX.Y`
  • Mọi AC trong PRD đều có mục tương ứng trong spec, không sót
  • Mục "Câu hỏi phát sinh" trong spec đã đóng hết mức P1
  • Checklist AC ID đã có trong issue description
  • API contract và thay đổi DB đã mô tả
  • Có wireframe nếu có UI
  • Đã có weight, estimate, milestone, assignee, module::, prio::
🔒 Luật cứng: DEV không bắt đầu code khi spec chưa approved.

G4 — THỰC THI (DEV + AI)

BướcNgườiHành động
G4.1DEVLấy issue ready-for-dev, prio cao nhất. Chuyển status::in-dev.
G4.2DEV + AINạp context theo thứ tự: issue → spec → PRD tại tag → glossary → business rules → code hiện tại.
G4.3DEV + AIViết tech note vào 04-dev/tech-notes/FE-XXX-tech-note.md.
G4.4DEV + AIViết test trước, mỗi AC một test, tên test chứa mã AC.
G4.5DEV + AITạo branch feature/FE-001-slug. Code cho test pass.
G4.6DEVTick checklist AC trong issue khi từng mục xong.
G4.7DEV/spend cập nhật mỗi ngày, không dồn cuối sprint.
G4.8DEV + AIChạy /trace — script đối chiếu AC ↔ test, không AC nào thiếu.
G4.9DEVMở MR, Closes #42, kèm bảng đối chiếu AC ↔ file ↔ test. Chuyển status::mr-review.
G4.10DEVMerge → deploy staging → status::qc.

Spec đứng trước PRD trong thứ tự nạp context. Spec chính xác hơn và đã được duyệt; PRD lúc này là tài liệu tham chiếu bối cảnh. Nếu ở G4.2 phát hiện spec vẫn thiếu — comment vào issue, gắn status::spec, trả về G3. Không tự suy diễn rồi code.

G5 — NGHIỆM THU (PM + AI)

BướcNgườiHành động
G5.1PM + AIAI đọc spec (không phải PRD) → sinh test case vào 05-qa/test-cases/FE-XXX-tc.md. Mỗi test case gắn mã AC.
G5.2PMBổ sung case nghiệp vụ mà AI không biết.
G5.3PMTest trên staging theo test case. Ghi pass/fail.
G5.4PMLỗi → issue type::bug, Related to #42, phân Sev1–Sev4, ghi defect-log.md.
G5.5PM + AIChạy /trace sinh 06-reports/trace-matrix.md. Đối chiếu DoD.
G5.6PM + BADemo khách hàng. Biên bản UAT vào 05-qa/uat/UAT-round-XX.md.
G5.7PMUAT pass → status::done, đóng issue.

Sinh test case từ spec chứ không từ PRD là thay đổi quan trọng. PRD viết bằng ngôn ngữ nghiệp vụ nên test case sinh ra dễ mơ hồ; spec đã có sẵn Given/When/Then và dữ liệu mẫu nên test case bám sát được.

Toàn bộ luồng thực thi G4 → G5:

Sơ đồ 4 — Luồng thực thi (G4 → G5)
Sơ đồ 4 — Luồng thực thi (G4 → G5)

Definition of Done:

  • MR đã merge, không còn comment chưa xử lý
  • Tech note khớp code thực tế
  • Mọi AC trong spec đều có test tương ứng — script `/trace` pass
  • Checklist AC trong issue đã tick đủ
  • Không còn defect Sev1/Sev2 mở
  • Deploy staging thành công
  • /spend ghi nhận đầy đủ
  • Biên bản UAT có xác nhận khách hàng (với type::feature)

Phân mức defect:

MứcĐịnh nghĩaChặn nghiệm thu?
Sev1Chặn nghiệp vụ, không có cách khác
Sev2Sai nghiệp vụ nhưng có workaround
Sev3Lỗi nhỏ, không ảnh hưởng nghiệp vụKhông
Sev4Mỹ quan, chính tảKhông

G6 — ĐO LƯỜNG (PM + AI)

BướcNgườiHành động
G6.1PMExport GitLab vào 06-reports/raw/.
G6.2PM + AI/weekly — AI đọc raw data + repo, sinh báo cáo.
G6.3PMKiểm chứng số liệu, bổ sung nhận định định tính.
G6.4PMGửi team + khách hàng. Lưu 06-reports/weekly/YYYY-Www.md.
G6.5PM + AIQuét rủi ro sớm (Phần 6).

G7 — LUỒNG NGOẠI LỆ: CHANGE REQUEST

Khách hàng đổi yêu cầu sau baseline
   → BA ghi 02-requirements/change-requests/CR-XXX.md
   → BA + AI phân tích tác động: module nào, AC nào đổi, issue nào làm lại
   → DEV cập nhật spec cho các AC bị ảnh hưởng, ước lượng lại
   → PM tính chi phí + tác động tiến độ, trình khách hàng
   → Duyệt   → PRD v1.1 + tag mới → spec v1.1 + tag mới → issue type::cr
   → Không duyệt → CR status rejected, LƯU LẠI
Sơ đồ 5 — Luồng Change Request
Sơ đồ 5 — Luồng Change Request

Một CR kéo theo hai tài liệu phải lên version: PRD và spec. Trường prd_baseline trong header spec là thứ giúp phát hiện chỗ nào còn bám vào bản cũ — đưa việc kiểm trường này vào CI thì không ai quên được.

Ba điểm dễ sai:

  • CR bị từ chối vẫn phải lưu. Nhiều team xóa đi cho gọn, rồi sáu tháng sau khách hàng hỏi "sao tính năng này không có" — không còn gì chứng minh là họ đã từ chối.
  • Thay đổi nhỏ vẫn cần CR. Khách hàng thường mở đầu bằng "nhờ tí thôi". Hai mươi cái nhỏ cộng lại là một tháng công không có trong hợp đồng.
  • Ước lượng CR phải gồm phần làm lại. Chi phí thật không phải code phần mới, mà là code lại phần đã xong cộng test lại vùng ảnh hưởng.