Skip to content

PRD: Quản lý vật tư theo Subtask (Công việc con)

Feature slug: subtask-materialVersion: 1.0 Ngày: 2026-03-26 Profile: M (Medium) Tác giả: PO/BA Design doc: docs/superpowers/specs/2026-03-26-subtask-material-management-design.md


Executive Summary (TL;DR)

Chuyển quản lý vật tư từ task cha xuống subtask (công việc con) trong tab "Công Việc" của chi tiết khách hàng. Gồm 3 nhóm tính năng:

  1. MaterialForm trong subtask — Mỗi subtask có bảng vật tư riêng: auto-fill từ service config + tìm kiếm thêm + sửa/xóa. (FR-001 → FR-004, FR-008)
  2. Aggregate ở task cha — Bảng tổng hợp vật tư dự kiến từ tất cả subtask con, dùng flat query + denormalized data. (FR-005, FR-006)
  3. Fix UX — Sửa button label "Thêm vật tư" → "Thêm công việc" + delete confirm mention materials. (FR-007)

Tiền tour: KHÔNG bị ảnh hưởng (ZERO coupling confirmed). Kho: Chưa làm xuất kho (phase 2).


Milestones

MilestoneTarget DateOwnerStatus
M1: Migration + Hasura metadata deploy (test env)T+2dBackend DevPending
M2: MaterialForm component + auto-fillT+5dFrontend DevPending
M3: Tích hợp vào TaskForm + save flowT+7dFrontend DevPending
M4: Aggregate view + backward compatT+9dFrontend DevPending
M5: Fix button + delete confirm + readonly + disabledT+10dFrontend DevPending
M6: QA testingT+11dQAPending
M7: Deploy productionT+12dDevOpsPending

Trạng thái Sign-off

DomainNgười reviewStatusNgày
Business (PO)PO/BA✅ Approved2026-03-26
UX/UIPending (cần UI Designer review wireframes)
Technical (Tech Lead)Senior Tech Lead✅ Approved (với điều chỉnh R1-R5)2026-03-26
QAPending (cần QA review test plan)
OpsN/A (không có scheduler/infra changes)N/A

Action Items — Unblock Readiness

IDItemOwnerDeadlineStatus
AI-01UI Designer review wireframes (MaterialForm layout, badge "Ngưng KD")UI/UX DesignerT+3dOpen
AI-02QA review test plan + confirm seed data approachQA LeadT+3dOpen
AI-03DevOps verify migration strategy trên stagingDevOpsT+2dOpen

Pending Decisions

IDQuyết địnhRecommendationOwnerDeadlineStatus
Tất cả PDs đã resolved thành DEC-B01→B05, DEC-U01→U04, DEC-T01→T05, DEC-Q01→Q02✅ All Resolved

RACI

DeliverablePO/BAFrontend DevBackend DevQAUI/UXDevOps
prd.mdR/ACCIC
ui-spec.mdRCIA
dev-spec.mdCRAIC
qa-test-plan.mdCIIR/A
MigrationIR/AIC
MaterialForm componentIR/ACC
Aggregate viewIR/AC
Deploy stagingICCAR
Deploy productionAIICR

R = Responsible, A = Accountable, C = Consulted, I = Informed


Backlog Phase 2

IDItemPriorityDependency
PH2-01Xuất kho thực tế: button "Xác nhận xuất kho" → requestMaterial actionHighHệ thống kho ổn định
PH2-02SL thực tế: hiển thị từ order_materials sau xuất khoHighPH2-01
PH2-03So sánh SL dự kiến vs SL thực tế (chênh lệch)MediumPH2-02
PH2-04Notification khi vật tư thay đổi trên subtaskLow
PH2-05Audit log cho material changesLow
PH2-06Export báo cáo vật tư (Excel)Low
PH2-07Partition bảng project_task_material nếu > 20M recordsMediumMonitor 6 tháng
PH2-08Optimistic locking cho concurrent editingLowNếu phát sinh conflict

Z) Decision Log

Decision Log LUÔN ĐẶT ĐẦU TIÊN. Mọi section downstream tham chiếu DEC-ID.

Z1 — Business Decisions

IDQuyết địnhLý doNgàyStatus
DEC-B01Vật tư gắn ở cấp subtask, không phải task chaMỗi công việc con (subtask) trong spa sử dụng vật tư riêng biệt. VD: "Laser sắc tố" dùng serum, "Chăm sóc da" dùng mask. Gắn ở task cha không phản ánh thực tế.2026-03-26Locked
DEC-B02Auto-fill vật tư từ service config + cho phép tìm kiếm thêm mớiKTV tiết kiệm thời gian nhờ vật tư mẫu đã cấu hình sẵn, nhưng vẫn linh hoạt thêm vật tư ngoài danh sách.2026-03-26Locked
DEC-B03Task cha hiển thị aggregate vật tư từ tất cả subtask conManager cần nhìn tổng vật tư mà không phải click vào từng subtask.2026-03-26Locked
DEC-B04Chưa làm xuất kho (phase 2)Hệ thống kho chưa hoạt động đúng. Ưu tiên ghi nhận vật tư dự kiến trên subtask trước.2026-03-26Locked
DEC-B05Vật tư nằm trong form subtask, không có button riêng ở bảng ngoàiTránh confusion "thêm vật tư cho subtask nào?". Vật tư là thuộc tính của subtask.2026-03-26Locked

Z2 — UX Decisions

IDQuyết địnhLý doNgàyStatus
DEC-U01Fix button "Thêm vật tư" → luôn hiển thị "Thêm công việc"Button cũ gây nhầm lẫn: label nói "Thêm vật tư" nhưng mở form tạo subtask. Ref: SubtaskTable.tsx:402.2026-03-26Locked
DEC-U02Delete confirm dialog mention số vật tư bị xóaUser cần biết xóa subtask sẽ CASCADE xóa vật tư đi kèm để tránh mất dữ liệu.2026-03-26Locked
DEC-U03MaterialForm readonly khi subtask done/canceledKhông cho sửa vật tư trên công việc đã hoàn thành hoặc đã hủy.2026-03-26Locked
DEC-U04Product bị disable → badge "Ngưng KD"Vật tư đã lưu trước đó mà product sau này bị disable → vẫn hiển thị nhưng đánh dấu rõ ràng.2026-03-26Locked

Z3 — Technical Decisions

IDQuyết địnhLý doNgàyStatus
DEC-T01Tạo bảng project_task_material (project DB) thay vì dùng bảng orderTách "dự kiến" vs "đã xuất kho". Không mix data vào order khi kho chưa đúng.2026-03-26Locked
DEC-T02Denormalize product_name/sku/unit vào project_task_materialGiảm remote join cross-DB khi aggregate ở task cha. 5 subtask × 3 vật tư = 15 remote queries → 0.2026-03-26Locked
DEC-T03Flat query cho aggregate thay vì nested qua subtaskTránh N+1 khi task cha có nhiều subtask con. 1 query trực tiếp vào project_task_material.2026-03-26Locked
DEC-T04Không thêm event trigger lên project_taskBảng đã có 4 triggers + 25 relationships. Materials xử lý ở application layer.2026-03-26Locked
DEC-T05ON DELETE CASCADE trên FK task_idXóa subtask tự xóa materials. Không cần application-level cleanup.2026-03-26Locked

Z4 — QA Decisions

IDQuyết địnhLý doNgàyStatus
DEC-Q01Test backward compat: task cha có order_materials cũ vẫn hiển thịData cũ không được mất sau deploy. Cần verify cả 2 data source.2026-03-26Locked
DEC-Q02Test scale: insert 1000 materials trong 1 batchƯớc tính 15K-90K records/ngày. Verify performance không degrade.2026-03-26Locked

A1) Blueprint

FieldValue
Feature NameQuản lý vật tư theo Subtask
Feature Slugsubtask-material
TypeEnhancement
ProfileM (Medium)
PlatformWeb (diva-admin)
Module chínhProjects → TaskForm, TaskDetail
DB Domainproject
Related ServicesHasura Controller (metadata only)
Branch ScopeVia project → department → branch (existing)

A2) Context — Tổng quan dễ hiểu

Vấn đề hiện tại

Trong tab "Công Việc" của chi tiết khách hàng, mỗi công việc cha (task) có nhiều công việc con (subtask). Mỗi subtask đại diện cho một bước điều trị cụ thể (VD: "Laser sắc tố", "Chăm sóc da cơ bản"). Tuy nhiên:

  1. Button sai chức năng: Nút "Thêm vật tư" thực chất mở form tạo subtask mới — gây nhầm lẫn cho nhân viên.
  2. Vật tư gắn sai cấp: Vật tư hiện gắn ở task cha, không phải subtask. Kỹ thuật viên không biết subtask nào dùng vật tư gì.
  3. Không có form nhập vật tư: Backend có sẵn action requestMaterial nhưng không có UI gọi.

Hệ quả: KTV không ghi nhận được vật tư theo từng bước công việc. Manager không biết tổng vật tư cần dùng. Kho không kiểm soát được vật tư theo công việc.

Giải pháp

Chuyển vật tư xuống cấp subtask — mỗi subtask có danh sách vật tư riêng, auto-fill từ cấu hình dịch vụ, cho phép thêm mới. Task cha hiển thị bảng tổng hợp.

Từ không có cách ghi nhận vật tư theo subtask mỗi subtask có bảng vật tư riêng, auto-fill + search, aggregate ở task cha.

Giao diện mô phỏng

Form tạo/sửa subtask (có thêm section vật tư):

FieldValue
Tên công việcBS - Laser sắc tố nám, đồi mồi
Người thực hiệnK, +1
Ngày hết hạn26/03/2026
Tiền tour500,000đ
#Vật tưĐVTSL
1Serum Laser XSP001ml2[xóa]
2Gel làm mátSP042tube1[xóa]
[Tìm kiếm thêm vật tư...]

Bảng tổng hợp ở task cha:

#Vật tưĐVTSL dự kiến
1Serum Laser XSP001ml4
2Gel làm mátSP042tube1
3Mask dưỡng daSP018miếng2

Cách hoạt động — Tổng quan

Luồng:

Chọn subtask definition → Auto-fill vật tư mẫu → Sửa SL / Thêm mới → Lưu subtask + materials

                                                              Task cha aggregate hiển thị tổng
BướcAi làmĐiều gì xảy raDữ liệu
1KTVMở form tạo/sửa subtask
2Hệ thốngAuto-fill vật tư mẫu từ product_relation theo subtask definitionproduct_relation WHERE subtask_id = X
3KTVChỉnh SL, xóa bớt, hoặc search thêm vật tư mớiMaterialForm state
4KTVBấm LưuInsert project_task + Insert project_task_material[]
5Hệ thốngCập nhật bảng tổng hợp ở task chaFlat query aggregate project_task_material

Quy tắc cốt lõi:

#Quy tắcVí dụ
1Mỗi subtask có 0-N vật tư, unique theo (task_id, product_id)Subtask "Laser" có 3 vật tư, không có 2 dòng cùng product
2Auto-fill chỉ lấy product chưa bị disableProduct "Serum cũ" bị disable → không xuất hiện trong auto-fill
3Subtask done/canceled → readonly materialsSubtask "Hoàn thành" → không cho sửa/xóa/thêm vật tư
4Xóa subtask → CASCADE xóa materialsXóa subtask "Laser" → 3 materials tự xóa theo
5Aggregate cộng dồn theo product_id2 subtask cùng dùng "Serum X" (2ml + 2ml) → tổng 4ml

Ví dụ thực tế

Case 1 — Happy path: KTV tạo subtask với vật tư

Khoản mụcGiá trịGiải thích
Task cha"Laser Q-switch tàn nhang"Công việc chính cho khách Đỗ Thị Thu Trang
Subtask"BS - Laser sắc tố nám"Bước điều trị laser
Subtask definitionĐã cấu hình 2 vật tư mẫuTừ service "Laser Q-switch"
Auto-fillSerum Laser X (2ml), Gel làm mát (1 tube)Tự điền khi chọn subtask definition
KTV thêmMask dưỡng da (1 miếng)Search thêm từ danh sách sản phẩm
Kết quả lưu3 records trong project_task_materialtask_id = subtask ID
Task cha aggregateSerum 2ml, Gel 1 tube, Mask 1 miếngBảng tổng hợp cập nhật

Case 2 — Edge case: Subtask đã hoàn thành, product bị disable

Khoản mụcGiá trịGhi chú
Subtask statusdone_branchĐã hoàn thành
MaterialFormReadonly modeKhông cho sửa SL, xóa, thêm mới
"Serum Laser X"Bị disable sau khi lưuBadge "Ngưng KD" hiển thị cạnh tên
Aggregate task chaVẫn tính "Serum Laser X"Denormalized data vẫn giữ tên cũ

Case 3 — Edge case: Subtask definition không có vật tư mẫu

Khoản mụcGiá trịGhi chú
Subtask definition"Chăm sóc da cơ bản"Chưa cấu hình product_relation
Auto-fillTrống (0 results)Bảng vật tư empty
KTVSearch thêm "Mask dưỡng" (1 miếng)Tự tìm kiếm thêm
Kết quả1 record trong project_task_materialManual input

Ai thấy gì

RoleThấy đượcKhông thấyLý do
Staff (KTV)Vật tư trên subtask mình được assign/tạo + aggregate task chaVật tư subtask người khác (nếu không assign)KTV chỉ cần biết công việc mình
ManagerTất cả vật tư subtask trong project mình quản lý + aggregateManager cần nhìn tổng để review
Admin (IT Leader)Tất cảFull access
Call CenterKhông thấy/sửa materialsMaterialForm ẩnCall Center không liên quan vật tư

Công thức tính (tóm tắt)

Chỉ sốCông thứcGhi chú
SL dự kiến (aggregate)SUM(project_task_material.quantity) GROUP BY product_id WHERE task.parent_id = XCộng dồn từ tất cả subtask con
SL thực tếPhase 2 — từ order_materials.product_supplyings khi xuất khoChưa implement

Chi tiết kỹ thuật: xem FORMULA-001 trong dev-spec.md

Các tình huống đặc biệt

Tình huốngHệ thống xử lý
Product bị disable sau khi đã thêm vào materialsVẫn hiển thị với badge "Ngưng KD". Denormalized data giữ tên/SKU cũ.
Product bị hard-delete (hiếm)product_id orphaned nhưng denormalized fields vẫn hiển thị tên/SKU/unit. Không crash.
Xóa subtask cuối cùng → parent auto-doneCASCADE xóa materials → aggregate trống → bảng vật tư task cha empty.
2 users sửa materials cùng lúcLast-write-wins. Chấp nhận risk — tương đồng behavior hiện tại toàn hệ thống.
Task cha có cả order_materials cũ (trước deploy) và project_task_material mớiHiển thị 2 bảng riêng: "VẬT TƯ DỰ KIẾN" (mới) + "VẬT TƯ (ĐÃ XUẤT KHO)" (cũ).
Subtask tạo từ manual board (automate=false)MaterialForm vẫn hiển thị. Auto-fill không chạy (không có subtask definition). KTV tự search.

Lộ trình triển khai

PhaseNội dungTrạng thái
Phase 1 (hiện tại)Bảng project_task_material, MaterialForm, auto-fill, aggregate, fix button, backward compatIn scope
Phase 2 (sau)Xuất kho thực tế: button "Xác nhận xuất kho" → requestMaterial action → SL thực tếBacklog
Phase 3 (sau)Notification khi vật tư thay đổi, audit log, export báo cáo vật tưBacklog

Tại sao chia phase? Hệ thống kho chưa hoạt động đúng. Phase 1 giải quyết vấn đề cấp bách nhất (ghi nhận vật tư đúng subtask). Phase 2 chờ kho ổn định.

Giá trị mang lại

  • KTV: Ghi nhận vật tư đúng cho từng bước công việc, auto-fill tiết kiệm thời gian, tìm kiếm thêm linh hoạt.
  • Manager: Nhìn tổng vật tư dự kiến ở task cha mà không cần click từng subtask. Review nhanh hơn.
  • Kho/Admin: Chuẩn bị cho phase 2 xuất kho chính xác theo subtask.
  • Không ảnh hưởng: Tiền tour (ZERO coupling), commission, lương, report hiện tại, flow giao việc hàng loạt.

A3) Goals & Metrics

GoalMetricTarget
KTV ghi nhận vật tư đúng subtask% subtask có materials (sau deploy)> 50% subtask automatic board
Giảm nhầm lẫn UXSố ticket/complaint liên quan "Thêm vật tư"→ 0
Aggregate hiển thị đúngSL dự kiến task cha = SUM subtask con100% chính xác

A4) Personas

PersonaVai tròTần suất sử dụngNhu cầu chính
KTV (Kỹ thuật viên)Thực hiện subtask, nhập vật tư5K-30K subtask/ngày (hệ thống)Form nhanh, auto-fill, search dễ
Manager chi nhánhReview công việc + vật tưHàng ngàyAggregate view, không cần drill-down
Admin / IT LeaderCấu hình, full accessKhi cầnFull visibility

A5) Functional Requirements

FR-001: Thêm vật tư vào subtask (Ref: DEC-B01, DEC-B02, DEC-B05)

Mô tả: KTV có thể thêm vật tư vào subtask thông qua form tạo/sửa subtask.

AC:

  • [ ] Khi mở form subtask (isChild=true), hiển thị section "VẬT TƯ" với bảng editable
  • [ ] Bảng có cột: #, Vật tư (tên), Mã (SKU), ĐVT, SL (input number), Xóa (icon)
  • [ ] Có thanh tìm kiếm "Tìm kiếm thêm vật tư..." để search product theo tên/SKU
  • [ ] Khi lưu subtask → insert records vào project_task_material với task_id = subtask ID
  • [ ] Mỗi record lưu denormalized: product_name, product_sku, product_unit
  • [ ] UNIQUE(task_id, product_id) — không cho thêm cùng product 2 lần, nếu trùng thì upsert quantity

FR-002: Auto-fill vật tư từ service config (Ref: DEC-B02)

AC:

  • [ ] Khi chọn subtask definition → query product_relation WHERE subtask_id = selected_id AND related_product.disabled IS NOT TRUE
  • [ ] Map kết quả → fill vào bảng vật tư: product_id, product_name, product_sku, product_unit, quantity
  • [ ] Nếu subtask definition không có product_relation → bảng trống, KTV tự search
  • [ ] Auto-fill chỉ chạy 1 lần khi chọn subtask definition, không chạy lại khi sửa form

FR-003: Sửa vật tư trên subtask (Ref: DEC-B01)

AC:

  • [ ] Khi mở form sửa subtask → load task_materials hiện có từ DB → hiển thị trong MaterialForm
  • [ ] KTV có thể: sửa SL (inline number input), xóa dòng (icon 🗑), thêm mới (search)
  • [ ] Khi lưu → delete all project_task_material WHERE task_id = subtask_id → re-insert tất cả (simpler than upsert)
  • [ ] Hoặc: upsert (on_conflict update quantity/note) + delete removed items

FR-004: Readonly khi subtask done/canceled (Ref: DEC-U03)

AC:

  • [ ] Khi subtask status_id chứa done_ hoặc canceled_ → MaterialForm ở chế độ readonly
  • [ ] Readonly: ẩn icon xóa, disable input SL, ẩn thanh search
  • [ ] Vẫn hiển thị bảng vật tư để xem (không ẩn hoàn toàn)

FR-005: Aggregate vật tư ở task cha (Ref: DEC-B03, DEC-T03)

AC:

  • [ ] Task cha hiển thị section "VẬT TƯ DỰ KIẾN" với bảng tổng hợp từ tất cả subtask con
  • [ ] Dùng flat query: project_task_material WHERE task.parent_id = parent_task_id
  • [ ] Cùng product_id → cộng dồn quantity
  • [ ] Cột: #, Vật tư, Mã, ĐVT, SL dự kiến
  • [ ] Dùng denormalized fields (product_name, product_sku, product_unit) — zero remote join

FR-006: Backward compatibility — data cũ (Ref: DEC-Q01)

AC:

  • [ ] Task cha có order_materials (data cũ, từ trước deploy) → vẫn hiển thị bảng "VẬT TƯ (ĐÃ XUẤT KHO)" với cột SL mẫu / SL thực tế
  • [ ] Task cha có cả data mới (project_task_material) + data cũ (order_materials) → hiển thị 2 sections riêng
  • [ ] Data cũ dùng MaterialTable component hiện tại (không sửa logic cũ)

FR-007: Fix button label + delete confirm (Ref: DEC-U01, DEC-U02)

AC:

  • [ ] Button ở SubtaskTable.tsx:402 → label luôn là "Thêm công việc" (bỏ condition isAutomaticBoard)
  • [ ] Delete confirm dialog: nếu subtask có task_materials.length > 0 → hiển thị "(Sẽ xóa N vật tư đi kèm)"

FR-008: Product disabled handling (Ref: DEC-U04)

AC:

  • [ ] Auto-fill: filter related_product.disabled IS NOT TRUE — không kéo product ngưng KD
  • [ ] Search: filter product.disabled IS NOT TRUE — không hiện product ngưng KD trong kết quả tìm kiếm
  • [ ] Materials đã lưu mà product sau đó bị disable → hiển thị badge "Ngưng KD" cạnh tên sản phẩm
  • [ ] Denormalized data (product_name/sku/unit) vẫn giữ giá trị cũ, không mất

A6) Assumptions

IDAssumptionOwner xác nhận
ASM-01Trung bình 3 vật tư/subtask (ước tính cho scale)PO
ASM-02Product hiếm khi đổi tên/SKU → denormalize chấp nhận đượcPO + Tech Lead
ASM-03Concurrent editing (last-write-wins) chấp nhận được cho phase 1PO
ASM-04Không cần notification khi vật tư thay đổi (phase 1)PO
ASM-05Không cần audit log cho material changes (phase 1)PO

A7) Risks

IDRiskImpactMitigation
RSK-01Bảng project_task_material grow nhanh (5.4M-32.8M records/năm)Query chậmIndexes đã plan + partition roadmap (phase 2+)
RSK-02Denormalized product info bị stale nếu product đổi tênHiển thị tên cũAccept — hiếm khi xảy ra, chỉ ảnh hưởng display
RSK-03Concurrent editing → last-write-winsData loss tiềm ẩnAccept cho phase 1, monitor usage
RSK-04Backward compat: 2 bảng cùng hiển thị gây confusedUX confusedLabel rõ: "VẬT TƯ DỰ KIẾN" vs "VẬT TƯ (ĐÃ XUẤT KHO)"

A8) Success Metrics

MetricBaseline (hiện tại)Target (sau 1 tháng)Cách đo
% subtask có materials0%> 50% (automatic board)COUNT(DISTINCT task_id) / COUNT(subtask)
Ticket "Thêm vật tư" confusion0Jira/feedback
Aggregate accuracyN/A100%SUM check automated test

A9) Glossary — Thuật ngữ

Thuật ngữ (VI)Thuật ngữ (EN)Định nghĩaPhân biệt với
Công việc chaParent TaskCông việc chính (parent_id = null), chứa nhiều subtask≠ Subtask
Công việc conSubtaskBước công việc cụ thể (parent_id = task_cha.id), VD: "Laser sắc tố"≠ Task cha
Vật tưMaterialSản phẩm/hóa chất sử dụng trong subtask (VD: serum, gel, mask)≠ Sản phẩm bán (product)
Vật tư mẫuDefault MaterialVật tư được cấu hình sẵn theo subtask definition (từ product_relation)≠ Vật tư thêm tay
SL dự kiếnPlanned QuantitySố lượng vật tư dự kiến, ghi nhận trên project_task_material≠ SL thực tế (xuất kho)
SL thực tếActual QuantitySố lượng thực tế đã xuất kho — phase 2, từ order_materials≠ SL dự kiến
Subtask definitionSubtask TemplateCấu hình subtask trong service (bảng subtask + service_subtask)≠ Subtask instance (project_task)
Tiền tourTour MoneyTiền trả cho KTV khi thực hiện subtask, theo cấp bậc (seniority)≠ Vật tư (hoàn toàn độc lập)
Automatic boardAuto ProjectProject có automate = true, subtask gắn với service definition≠ Manual board
DenormalizeDenormalizeCopy product_name/sku/unit vào bảng materials để giảm join≠ Normalize (reference bảng gốc)

Non-goals (Explicit)

  • Xuất kho thực tế (phase 2)
  • Notification khi vật tư thay đổi
  • Audit log cho material changes
  • Clone/copy subtask với materials
  • Export báo cáo vật tư
  • Mobile support
  • Optimistic locking cho concurrent editing

Changelog

VersionNgàyThay đổiTác giả
1.02026-03-26Initial PRD — Phase 0-4 complete. 14 DECs, 8 FRs, 2 NFRs.PO/BA + AI
1.0.12026-03-26Thêm Master-spec blocks (Executive Summary, Milestones, Sign-off, PD, RACI, Phase-2 backlog) + Changelog. Fix Quality Bar items #14, #16.AI

Hướng dẫn đọc (RACI-based)

Bạn là...Đọc gìBỏ qua
PO / ManagerExecutive Summary → A2 Context → A5 FRs → Milestones → Backlog Phase 2dev-spec.md (C sections), qa-test-plan.md
Frontend DevA2 Context → A5 FRs → ui-spec.md (B sections) → dev-spec.md (C4, C5, C11)qa-test-plan.md
Backend Devdev-spec.md (C4 Data Model, C5 API, C7 Migration)ui-spec.md (B sections)
QAA5 FRs → qa-test-plan.md → A2 Ví dụ thực tế (dùng làm test scenario)dev-spec.md (C4-C7)
UI/UX Designerui-spec.md (B1-B9, wireframes) → prd.md A2 Giao diện mô phỏngdev-spec.md, qa-test-plan.md
Sếp / StakeholderExecutive Summary only (đủ hiểu feature)Tất cả sections khác