LinhNDM — Nguyễn Đình Mạnh Linh
PLAYBOOK SDD ADD & CODEX  |  2026

SDD Workflow
Từ Spec Đến Code

5 pha · 1 triết lý · Không còn đoán mò

Giới thiệu chương

Động Cơ Của SDD Workflow

Chương 5 đã cho bạn ngôn ngữ — EARS Notation, 8 thành phần, Risk Matrix. Chương này cho bạn động cơ — một quy trình làm việc hoàn chỉnh biến spec thành production code thông qua năm pha được thiết kế kỹ lưỡng.

Tỷ lệ 40/60 lý thuyết–thực hành có chủ đích: bạn sẽ thực sự chạy workflow, không chỉ đọc về nó. Ba công cụ cụ thể được giới thiệu theo thứ tự tăng dần về tính linh hoạt — không có "cách tốt nhất", chỉ có "cách phù hợp nhất" với đội nhóm và dự án của bạn.

Triết lý xuyên suốt chương
"Sai ở đâu, sửa ở Spec đó."
Fix the Spec, not the Code.

Khi AI generate code sai → không sửa code trực tiếp → tìm điểm trong Spec chưa rõ ràng → sửa Spec → re-generate.
Code là artifact tạm thời. Spec mới là nguồn sự thật lâu dài.

Mục lục chương

Nội Dung Chương 6

6.1

Quy Trình 5 Pha của SDD

Context Discovery → Spec → Plan → Tasks → Implementation → Validation

6.2

GitHub Spec Kit

Workflow thực tế với 5 Slash Commands — 5 Touchpoints trong GitHub Issues & PRs

6.3

Cline (Roo Code)

Open Agentic IDE — đọc file, chạy terminal, multi-model, MCP integration

6.4

DIY SDD

Xây dựng workflow riêng với Markdown thuần — tự do tuyệt đối, không toolkit

6.5

Hands-on Lab A → Z

Lab A: CRUD đơn giản (45 phút) · Lab B: Import Business Logic phức tạp (60 phút)

Evaluation & Reflection

Rubric chấm điểm, bài học từ hai Labs, tổng kết chương

6.1

Quy Trình 5 Pha của SDD

Pipeline tuyến tính với các điểm kiểm tra rõ ràng. Mỗi pha có đầu vào, đầu ra, người chịu trách nhiệm, và Definition of Done cụ thể. Không được phép chuyển sang pha tiếp theo khi pha hiện tại chưa hoàn thành.

6.1 — SDD Pipeline

5 Pha — Tổng Quan Pipeline

Pha 0
CONTEXT
Human
(domain research)
Pha 1
SPEC
Human
(EARS notation)
Pha 2
PLAN
AI
(arch + risks)
Pha 3
TASKS
AI
(atomic tasks)
Pha 4
IMPL
AI
(generate + test)
▼ Pha 5: VALIDATION — Human + AI (code vs. spec check)
◄─────── "Fix the Spec, not the Code" ───────►
Khi validation thất bại → quay về Spec, không sửa code trực tiếp
6.1 — Tổng quan bảng các pha

Bảng Tổng Quan 5 Pha

PhaTênActorInputOutputDefinition of Done
0Context DiscoveryHumanUser stories, domain knowledgeContext documentTeam hiểu domain & constraints
1SpecificationHumanContext doc, user storiesSPEC.md (APPROVED)AI review passed, spec locked
2PlanningAISPEC.mdPLAN.mdHuman approved arch + risks
3Task Decomp.AIPLAN.mdTASKS.mdTasks atomic & independent
4ImplementationAITASKS.md + SPEC.mdSource code + testsAll tests green
5ValidationBothCode + SPEC.mdValidation reportCode ↔ Spec 100% match
Rule quan trọng nhất Không được phép chuyển sang pha tiếp theo khi pha hiện tại chưa hoàn thành — không có "gần xong", không có "sẽ update sau".
6.1.1 — Pha 0

Pha 0 — Context Discovery

Đây là pha thường bị bỏ qua nhất vì nó không tạo ra file code nào. Nhưng đây chính là nguyên nhân số một khiến dự án AI-assisted thất bại: team đã viết spec và nhờ AI implement mà không thực sự hiểu domain. AI implement đúng spec nhưng spec lại sai về mặt business.

Thời lượng thực tế
  • Feature nhỏ: 30 phút là đủ
  • Module lớn: cần 2–3 buổi workshop
  • Điểm quan trọng: ra khỏi pha này với Context Document — không phải trong đầu, phải là file viết ra
Dấu hiệu chưa xong
  • Vẫn còn Open Questions chưa được trả lời
  • Team chưa đồng thuận về domain terms
  • Constraints chưa được liệt kê đầy đủ
  • Không ai biết ai là Decision Maker cuối cùng
6.1.1 — Context Document Template

Template CONTEXT.md

1. Problem Statement

Vấn đề thực sự là gì? User đang bị đau ở đâu?
Tránh solution thinking ở bước này. Chỉ mô tả pain.

2. Domain Knowledge

Các thuật ngữ domain-specific mà AI cần biết.
Các quy tắc nghiệp vụ bất thành văn.

3. Stakeholders

Ai được lợi? Ai chịu ảnh hưởng? Ai có quyền quyết định?

4. Constraints (không thể thay đổi)

Tech, Business, Time — ràng buộc cứng.

5. Assumptions & 6. Open Questions

Mỗi assumption là một rủi ro nếu sai.
Open Questions cần clarify với stakeholder trước khi viết spec.

6.1.2 — Pha 1

Pha 1 — Specification

Đây là pha con người làm chủ hoàn toàn. Dựa trên Context Document từ Pha 0, bạn viết SPEC.md theo đúng cấu trúc 8 thành phần và EARS Notation đã học ở Chương 5. Sau khi viết xong draft, mới đưa AI vào để review — không sớm hơn.

Checklist Pha 1 — Definition of Done
  • SPEC.md có đủ 8 thành phần (7 core + Out of Scope)
  • Mỗi requirement dùng EARS Notation (WHEN/WHILE/WHERE/SHALL)
  • AI đã review và tìm logic gaps — mọi gaps đã được resolve
  • Không còn Open Questions từ Pha 0
  • Spec đã được team lead hoặc product owner approve
  • SPEC.md version 1.0.0 đã commit vào git với tag
  • "Out of Scope" section rõ ràng, không ambiguous
Điểm mấu chốt Pha 1 kết thúc khi spec được lock với trạng thái APPROVED. Không có "gần xong", không có "sẽ update sau". Spec phải cứng trước khi AI bắt đầu làm việc.
6.1.3 — Pha 2

Pha 2 — Planning (AI tạo PLAN.md)

Pha 2 là lần đầu tiên AI tham gia chủ động với vai trò kiến trúc sư. AI đọc SPEC.md và tạo ra PLAN.md — một tài liệu mô tả cách tiếp cận kỹ thuật, các component cần tạo, dependency giữa chúng, và risk assessment. Con người review và approve trước khi đi tiếp.

PLAN.md phải có
  • Architectural Approach — pattern, design pattern, lý do
  • Components — tên, trách nhiệm, interface
  • Data Flow — user input → processing → storage → response
  • Dependencies — thứ tự implement, external deps
  • Risks & Mitigations — ít nhất 3 rủi ro kỹ thuật
  • Questions for Human — những điểm spec còn mơ hồ
Tại sao cần Pha 2 riêng biệt?

"Design trước, code sau" luôn cho kết quả tốt hơn. AI có xu hướng bắt đầu code ngay khi được đưa spec — giống như nhà thầu xây móng trước khi có bản vẽ.

PLAN.md buộc AI phải "nghĩ" trước khi "làm".

6.1.3 — PLAN.md ví dụ: Components

PLAN.md — Bảng Components & Data Flow

ComponentTrách nhiệmFile
ReviewRouterHTTP endpoints, validationsrc/reviews/router.py
ReviewServiceBusiness logic từ SPEC §3src/reviews/service.py
ReviewRepositoryDB CRUD + aggregate querysrc/reviews/repository.py
BlacklistServiceFilter inappropriate contentsrc/shared/blacklist.py
AggregateUpdateJobBackground rating recalculationsrc/jobs/aggregate_update.py
Data Flow

POST /reviews → ReviewRouter (validate input)
  → ReviewService.create_review()
  → OrderRepository.verify_purchase()  [check buyer đã mua]
  → ReviewRepository.find_by_order()   [check duplicate]
  → BlacklistService.scan()           [check content]
  → ReviewRepository.create()         [persist]
  → Response 201 Created
(async) → AggregateUpdateJob.enqueue()

6.1.3 — PLAN.md ví dụ: Risks

PLAN.md — Bảng Risks & Mitigations

Rủi roKhả năngImpactMitigation
Race condition: double submitHighHighDB unique constraint
Aggregate lag > 5 minMedMedRedis cache + job queue
Blacklist false positivesMedLowWhitelist + user appeal
"Questions for Human" là vàng.
Đây là nơi AI cho bạn biết những chỗ spec còn mơ hồ. Nếu AI không có câu hỏi nào, hoặc spec của bạn rất tốt, hoặc AI đang assume — hãy hỏi lại: "Bạn đã assume điều gì?" Mỗi assumption ẩn là một bug tiềm ẩn cho nó.
Questions for Human — ví dụ
  • AggregateUpdateJob: dùng Celery hay Kafka? (spec không chỉ định)
  • BlacklistService: hardcoded list hay dynamic từ DB?
  • Spec §3 nói "cập nhật trong 5 phút" — eventual consistency hay realtime với cache invalidation?
6.1.3 — Quote Spotlight
"Mỗi assumption ẩn là một bug tiềm ẩn cho nó."

Nếu AI không đặt câu hỏi sau khi đọc PLAN.md — hãy chủ động hỏi nó: "Bạn đã assume điều gì trong quá trình tạo plan này?"

PLAYBOOK SDD ADD & CODEX — Chương 6
6.1.4 — Pha 3

Pha 3 — Task Decomposition

Từ PLAN.md, AI tạo TASKS.md — danh sách các task cụ thể, có thể implement độc lập, với acceptance criteria rõ ràng cho từng task. Đây là bước chuyển từ "what to build" sang "how to build it step by step".

Task tốt phải thỏa 3 tiêu chí
  • Atomic — không chia nhỏ hơn được
  • Independent — implement được mà không phụ thuộc task chưa xong
  • Verifiable — có test case cụ thể để biết đã xong
Prompt Pha 3 — Tạo TASKS.md Doc PLAN.md và SPEC.md, tạo TASKS.md — danh sách tasks có thể implement độc lập. Format ID: T001, T002... · Estimated time · Dependencies · EARS spec refs · Done criteria. Tối đa 4 giờ/task. Nếu task > 4h, chia nhỏ hơn.
6.1.4 — TASKS.md ví dụ

TASKS.md — Product Review Feature

IDTaskEstDepsSpec RefsDone When
T001Tạo DB migration reviews table1h§5 DataMigration runs, rollback OK
T002Implement BlacklistService2h§3 Unwanted10 test cases pass
T003Implement ReviewRepository3hT001§5 DataCRUD ops + aggregate query OK
T004Implement ReviewService4hT002,T003§3 Func.All business rules enforced
T005Implement ReviewRouter2hT004§3 Func.All endpoints return correct HTTP
T006Implement AggregateUpdateJob3hT003§4 Non-funcRating updates within 5 min
T007Integration tests2hT005,T006§7 Accept.All AC checklist items pass
T008API documentation1hT005OpenAPI spec generated
6.1.5 — Pha 4

Pha 4 — Implementation

Đây là pha AI làm việc nhiều nhất — nhưng không phải theo nghĩa "chat và nhận code". AI implement từng task trong TASKS.md, theo đúng thứ tự dependency, với SPEC.md và PLAN.md luôn trong context. Không có task nào được implement mà không có spec refs rõ ràng.

Prompt mẫu — Implement Task T004: ReviewService
  • Implement ReviewService theo ĐÚNG spec §3
  • Dùng dependency injection — không instantiate deps bên trong
  • Thêm EARS tag comment cho mỗi business rule
  • Xử lý TẤT CẢ Unwanted patterns trong spec §6
  • Type hints bắt buộc cho tất cả method signatures
  • Tạo đồng thời: tests/reviews/test_service.py
  • KHÔNG implement những gì nằm trong Out of Scope (SPEC §8)
6.1.5 — Nguyên tắc cốt lõi
"Fix the Spec, not the Code."
❌ WRONG — Sửa code trực tiếp

AI generate: if rating not in range(1, 5):
Dev sửa tay: if rating not in range(1, 6):
→ Code diverge khỏi spec, không ai biết tại sao

✓ RIGHT — Trace về Spec

Test fails → Check SPEC §3: "rating 1–5 (integer)"
Spec rõ nhưng AI dùng range() sai
Update prompt → Re-generate → Correct

Rule: KHÔNG có dòng code nào không truy được về spec.
6.1.6 — Pha 5

Pha 5 — Validation (Kiểm tra Code vs. Spec)

Pha cuối cùng là formal verification: đọc code và spec song song, xác nhận mọi requirement đều được implement đúng. Đây không phải code review thông thường — đây là compliance check.

Spec SectionRequirement (tóm tắt)Code File/LineTest NameStatus
§3 WHEN submitValidate rating 1–5service.py:L45test_rating_boundary_validPass
§3 WHEN submitValidate comment 10–500service.py:L52test_comment_length_boundariesPass
§3 Unwanted buyerReject non-buyer reviewservice.py:L61test_non_buyer_rejectedPass
§3 Unwanted dupReject duplicate reviewservice.py:L72test_duplicate_review_rejectedPass
§8 Out of ScopeNO moderation queue(verify absent)test_no_moderation_endpointPass
Out of Scope cũng cần Validation Nhiều team chỉ verify "những gì đã làm". SDD cũng verify "những gì không được làm". grep codebase tìm code không có trong spec → nếu AI "helpful" implement thêm feature ngoài scope → remove ngay.
6.1.7 — Bài tập

Bài Tập — Mapping SDD Phases

Bài tập 6.1.A — Phase Identification ⭐⭐

Cho đoạn hội thoại sau — xác định mỗi message thuộc pha nào và tại sao developer này đang làm sai:

  • Dev: "Viết cho tôi authentication module cho app Node.js."
  • AI: [Generate code 200 dòng không có spec]
  • Dev: "Code bị lỗi, sửa đi." [Sửa code trực tiếp]
  • Dev: "Thêm 2FA vào đi." [Feature mới không có spec]

→ Pha nào bị skip? Sai lầm cụ thể là gì? SDD đúng trông như thế nào?

Bài tập 6.1.B — PLAN.md Review ⭐⭐⭐

Viết SPEC.md ngắn (Detailed level) cho tính năng "Password Reset". Sau đó đưa cho Cline với prompt Pha 2 để generate PLAN.md.

Review output của AI: risks nào nó tìm được? Questions nào nó đặt ra? Bạn đồng ý với architectural approach không?

6.2

GitHub Spec Kit

Workflow thực tế với Slash Commands — đưa SDD pipeline trực tiếp vào GitHub Issues và Pull Requests. 5 Slash Commands, 5 Touchpoints, mỗi lần chuyển pha đều có human-in-the-loop.

6.2 — GitHub Spec Kit

GitHub Spec Kit — Triết Lý Thiết Kế

GitHub Spec Kit là tập hợp workflows, templates, và GitHub Actions được thiết kế để đưa SDD pipeline trực tiếp vào GitHub Issues và Pull Requests. Thay vì quản lý SPEC.md, PLAN.md, TASKS.md thủ công, Spec Kit cung cấp các slash commands — những điểm chạm (touchpoints) chuẩn hóa giữa người và AI.

Triết lý thiết kế

Mỗi slash command là một "handoff point" — nơi con người chuyển giao quyền kiểm soát cho AI một cách có chủ đích, với context được chuẩn bị sẵn. Không có gì xảy ra mà không có ý chí của người dùng.

Cấu trúc thư mục
  • .github/ISSUE_TEMPLATE/ — feature spec template
  • .github/workflows/ — speckit-*.yml actions
  • .github/speckit/prompts/ — prompt templates mỗi pha
  • .github/speckit/constitution.md — AGENTS.md của project
  • .github/speckit/config.yml — model, token limits
6.2.2 — 5 Slash Commands

5 Slash Commands — 5 Touchpoints

CommandPhaActor kích hoạtAI làm gì
/speckit.constitutionSetupTech lead, onceTạo AGENTS.md từ project description + tech stack
/speckit.specifyPha 1Developer / PMReview spec draft, tìm gaps, tạo SPEC.md version cuối
/speckit.planPha 2DeveloperĐọc SPEC.md, tạo PLAN.md với arch + risks + questions
/speckit.tasksPha 3Developer (sau approve)Đọc PLAN.md, tạo TASKS.md với atomic tasks và deps
/speckit.implementPha 4Developer (per task)Implement task cụ thể + tests, tạo PR
Slash Commands là Touchpoints, không phải automation Không command nào là "bấm và quên". Sau /speckit.specify → người dùng đọc và APPROVE spec trước khi tiếp tục. Sau /speckit.plan → người dùng review PLAN.md, trả lời Questions for Human. AI chờ. Không có gì tự động sang pha tiếp theo — đây là cách SDD đảm bảo human-in-the-loop.
6.2.2 — Slash Commands chi tiết

/speckit.specify & /speckit.plan

/speckit.specify — Từ ý tưởng đến SPEC.md

Command quan trọng nhất. Gọi khi đã có draft spec (hoặc chỉ có user story). AI sẽ:

  • Expand thành SPEC.md đầy đủ 8 thành phần
  • Thêm EARS notation cho mỗi requirement
  • Tìm edge cases: xóa địa chỉ mặc định → làm sao?
  • Thêm Out of Scope rõ ràng
  • Post spec vào Issue dưới dạng comment + attach file
/speckit.plan — AI kiến trúc hóa

Trigger sau khi SPEC.md đã được approve. AI sẽ:

  • Fetch SPEC.md từ Issue
  • Đọc constitution.md (tech stack, patterns)
  • Tạo PLAN.md: arch, components, data flow, deps, risks
  • Post PLAN.md vào Issue dưới dạng comment
  • Tag reviewer để approve

Sau khi plan được approve → dev có thể chạy /speckit.tasks

6.2.2 — Slash Commands chi tiết

/speckit.tasks & /speckit.implement

/speckit.tasks — Atomic task breakdown

Trigger sau khi PLAN.md approved. AI sẽ:

  • Đọc SPEC.md + PLAN.md
  • Tạo TASKS.md với atomic tasks (max 4h/task)
  • Tạo GitHub sub-issues cho mỗi task tự động
  • Gán dependencies bằng GitHub issue links
Issue #42 (feature): "Shipping Address" ↳ #43 (T001): "Create DB migration" ↳ #44 (T002): "Implement Repository" ↳ #45 (T003): "Implement Service [deps: #44]"
/speckit.implement — Code theo spec

Trigger trong task sub-issue. AI sẽ:

  • Đọc task definition, fetch SPEC.md và PLAN.md
  • Đọc code đã có từ dependency tasks
  • Generate code + tests với EARS tags
  • Tạo Pull Request tự động với traceability report

PR description: Task ID · Spec refs · Test coverage · Out of Scope verified

6.2.3 — Walkthrough đầy đủ

Full Walkthrough — Từ Init Đến Complete

Ngày 1 — Setup & Specify
  • PM tạo GitHub Issue: "Feature: Shipping Address"
  • Dev đọc, hiểu domain → viết Context trong Issue body
  • Dev trigger: /speckit.constitution (chỉ lần đầu)
  • Dev viết draft spec → trigger: /speckit.specify
  • Review output, resolve 3 gaps AI tìm được
  • Approve spec → Issue labeled "spec:approved"
Ngày 2-4 — Plan, Tasks, Implement
  • /speckit.plan #42 → AI tạo PLAN.md
  • Review plan, trả lời 2 Questions for Human
  • Approve plan → /speckit.tasks #42 → 5 sub-issues
  • Mỗi task sub-issue: /speckit.implement → code + PR
  • Review PR: check traceability, approve nếu OK → merge
  • Tất cả 5 tasks merged → Run validation → Close #42
Timeline & Audit Trail 4 ngày cho feature với full spec trail. Mọi quyết định — ai làm gì, khi nào, dựa trên spec nào — đều được lưu trong GitHub Issues. Traceability hoàn hảo.
6.3

Cline (Roo Code)

Open Agentic IDE — đối cực của Spec Kit. Chạy ngay trong VSCode, đọc file, chạy terminal, gọi MCP servers, thực thi kế hoạch multi-step mà không cần copy-paste từng đoạn code.

6.3.1 — Tại sao chọn Cline?

Cline vs. Các Công Cụ Khác

Tiêu chíCline (Roo Code)GitHub Copilot ChatCursor AIKiro IDE
Open sourceMIT LicenseProprietaryProprietaryAWS-controlled
Agentic (multi-step)NativeLimitedComposerNative
Multi-model supportAnthropic/OpenAI/OllamaCopilot onlyMultipleAWS Bedrock
MCP integrationFullNonePartialLimited
File system accessFull read/writeRead onlyFullFull
Terminal executionWith approvalNoYesYes
Cost modelPay-per-token (API)SubscriptionSubscriptionAWS pricing
Vendor lock-inLowestGitHub/MSMediumAWS
6.3.2 — Cline autonomous workflow

Cline Tự Động Đọc File & Chạy Terminal

Điểm khác biệt lớn nhất của Cline so với AI chatbot thông thường là khả năng thực thi — không chỉ suggest. Ví dụ: giao Cline implement Task T004 với full autonomy.

Cline tự động thực hiện từng bước
  • read_file("TASKS.md") → hiểu T004 requirements
  • read_file("SPEC.md") → load business rules
  • read_file("src/reviews/repository.py") → đọc interface
  • write_file("src/reviews/service.py") → implement
  • write_file("tests/reviews/test_service.py") → tests
  • execute_command("pytest tests/reviews/ -v") → run
  • [nếu fail] đọc output, fix service.py, re-run cho đến khi pass
  • Report: "All 15 tests passed. Coverage: 94%."
Developer chỉ cần approve các "dangerous" actions write_file, execute_command khi Cline xin phép — toàn bộ còn lại Cline tự xử lý.
6.3.3 — Multi-model strategy

Multi-Model — Chọn Model Đúng Cho Đúng Task

Task trong SDDModel khuyến nghịLý doApprox cost
Pha 0: Context DiscoveryClaude SonnetCần reasoning, domain understanding$0.003/1k tokens
Pha 1: Spec review + gapsClaude SonnetLogic analysis, contradiction detect$0.003/1k tokens
Pha 2: Planning (PLAN.md)Claude SonnetArchitecture decisions cần depth$0.003/1k tokens
Pha 3: Task decomp.Claude HaikuStructured breakdown, không cần depth$0.00025/1k tokens
Pha 4: Boilerplate codeClaude Haiku / GPT4o-miniSimple patterns, CRUD generation$0.00015/1k tokens
Pha 4: Business logicClaude SonnetComplex logic cần reasoning$0.003/1k tokens
Pha 5: ValidationClaude SonnetCareful comparison cần accuracy$0.003/1k tokens
Offline / confidentialLlama 3 via OllamaData không ra ngoài machineFree (local GPU)
6.3.4 — Cline + MCP

Cline + MCP = Agentic SDD Hoàn Chỉnh

Kết nối Cline với MCP servers tạo ra workflow agentic thực sự: AI không chỉ generate code — nó đọc Jira để biết requirement, đọc GitHub để biết existing code, viết code, chạy tests, và tạo PR. Tất cả mà không cần bạn switch tab.

MCP Servers cho SDD Workflow
  • @modelcontextprotocol/server-github — đọc/tạo Issues, PRs
  • jira-mcp — đọc tickets, update status
  • @modelcontextprotocol/server-filesystem — đọc/ghi files
Kịch bản agentic đầy đủ

Bạn nói với Cline:
"Đọc Jira ticket PROJ-123, implement theo spec, tạo PR và link vào ticket."

Cline sẽ tự động orchestrate toàn bộ: fetch ticket → read spec → implement → test → create PR → update Jira.

Không có MCP → Cline chỉ là AI code editor thông minh. Với MCP → Cline thực hiện multi-step workflow hoàn chỉnh. Đây chính là tầm nhìn của SDD: con người design ý định, AI thực thi toàn bộ.
6.4

DIY SDD

Xây dựng workflow riêng không cần toolkit — chỉ với Markdown files, git, và bất kỳ AI chat nào. Bản chất SDD không phụ thuộc vào công cụ, mà phụ thuộc vào nguyên lý.

6.4.1 — Cấu trúc thư mục .sdd/

Thư Mục .sdd/ — Tiêu Chuẩn SDD

Quy ước thư mục .sdd/ đặt tất cả spec artifacts trong một nơi, tách biệt với source code nhưng nằm cùng repo. Dấu chấm đầu tên tránh nhầm lẫn với source code, đồng thời truyền tín hiệu rõ ràng: đây là metadata của dự án.

Cấu trúc thư mục
.sdd/ ├── README.md # Hướng dẫn SDD trong project ├── constitution.md # = AGENTS.md: rules cho AI ├── specs/ │ ├── _template.md # Template tạo spec mới │ ├── feature-auth/ │ │ ├── SPEC.md # Spec chính (locked khi approved) │ │ ├── CONTEXT.md # Context discovery output │ │ ├── PLAN.md # AI-generated plan │ │ ├── TASKS.md # Task breakdown │ │ └── CHANGELOG.md │ └── feature-cart/ ├── reviews/ # AI spec review outputs └── metrics/ # Token usage, spec quality
Tại sao .sdd/ vào git?
  • Spec là source of truth → phải được version control như code
  • git diff SPEC.md → xem spec thay đổi thế nào qua thời gian
  • git blame SPEC.md → ai thay đổi dòng nào, khi nào
  • git revert → rollback spec khi quyết định thay đổi
  • Pull Request cho spec → review process giống code review
6.4.2 — Contract với AI

Biến Markdown Thành "Bản Giao Kèo" Với AI

Mỗi khi bắt đầu AI session mới, bạn không chat tự nhiên — bạn trình bày contract và yêu cầu AI "ký" (acknowledge) trước khi làm việc. Điều này áp dụng cho mọi AI: ChatGPT, Claude, Gemini, hay bất kỳ model nào.

System Prompt chuẩn — Đầu mỗi AI session
  • === CONTRACT === — khai báo bối cảnh
  • Paste nội dung constitution.md (rules)
  • CURRENT TASK: Chúng ta đang ở Pha N. Nhiệm vụ cụ thể.
  • CONTEXT FILES: Paste SPEC.md, PLAN.md nếu có
  • CONSTRAINTS: KHÔNG implement Out of Scope · KHÔNG assume
  • Mọi code phải có EARS tag tham chiếu về SPEC section
Bước "Xác nhận" cuối prompt — rất quan trọng Yêu cầu AI: "Xác nhận bạn đã đọc contract. Tóm tắt nhiệm vụ của bạn trong 3 bullet points trước khi bắt đầu." Nếu AI tóm tắt sai → bạn biết nó đã hiểu sai context và có thể điều chỉnh ngay.
6.4.3 — DIY Workflow thực tế

DIY Workflow Hoàn Chỉnh — Password Reset

Bước 1–4: Setup & Spec
  • Tạo structure: mkdir -p .sdd/specs/feature-password-reset
  • Viết CONTEXT.md (30 phút, tự làm) — domain knowledge, constraints
  • Viết SPEC.md draft (45 phút) — 8-component template, EARS notation
  • AI Review session → paste contract + yêu cầu tìm logic gaps
  • Update SPEC.md, lock: git commit + git tag spec/password-reset/v1.0.0
Bước 5–9: Plan, Tasks, Implement
  • AI tạo PLAN.md (Claude.ai session mới) → paste contract với Pha 2
  • Copy output vào file, review và approve
  • AI tạo TASKS.md (session mới) → paste SPEC.md + PLAN.md
  • Implement trong VSCode với Cursor/Cline — dùng SPEC.md + PLAN.md trong context (@file)
  • Validation: AI đọc code + spec, tạo traceability matrix → merge nếu pass
6.4.4 — Naming Conventions

Naming Conventions & Git Strategy

ArtifactNamingLocationVí dụ
Feature specfeature-{name}/SPEC.md.sdd/specs/feature-cart/SPEC.md
Bugfix specfix-{issue-id}/SPEC.md.sdd/specs/fix-gh-234/SPEC.md
PlanPLAN.md (trong folder).sdd/specs/{name}/feature-cart/PLAN.md
TasksTASKS.md (trong folder).sdd/specs/{name}/feature-cart/TASKS.md
AI review{name}-review-{date}.md.sdd/reviews/cart-review-2025-01-20.md
Git tagspec/{name}/v{semver}git tagspec/cart/v1.0.0
Git commitspec({name}): {action}commit msgspec(cart): approve v1.0.0
Branchspec/{name}-draftgit branchspec/cart-draft
6.5

Hands-on Lab A → Z

Bài thực hành trung tâm của chương — chạy toàn bộ SDD pipeline cho hai tính năng với độ phức tạp khác nhau. Lab B là "bài test thực sự".

6.5.1 — Lab A

Lab A — CRUD Đơn Giản (45 phút)

Feature: Quản lý Categories cho blog. Simple CRUD, không có business logic phức tạp. Mục đích: làm quen với SDD pipeline trong môi trường "an toàn" trước khi tackle Lab B.

User Story ban đầu (rough)
  • Tạo, đọc, sửa, xóa categories
  • Category có: name (unique), slug (auto-gen), description
  • Không thể xóa category đang có bài viết
  • Danh sách sorted by name
Pipeline Steps (30 phút với Cline)
  • Pha 2 — "Đọc SPEC.md và tạo PLAN.md. Chú ý: slug auto-generation logic cần rõ ràng."
  • Pha 3 — "Đọc PLAN.md, tạo TASKS.md. Max 4h/task. T001 (migration) là task đầu tiên."
  • Pha 4 — "Implement {task_id}. Đọc SPEC.md và PLAN.md. EARS tags bắt buộc. Generate tests cùng lúc."
  • Pha 5 — "Tạo traceability matrix: mỗi EARS requirement → code line → test name → pass/fail."
6.5.1 — Lab A: SPEC.md tham khảo

Lab A — SPEC.md Category Management

§3 Functional Requirements (EARS)
  • WHEN admin POST /categories với valid data, THE system SHALL tạo category và return 201 + object
  • WHEN admin GET /categories, THE system SHALL return danh sách sorted by name ascending
  • WHEN admin PUT /categories/{id}, THE system SHALL cập nhật và return 200 + updated object
  • WHEN admin DELETE /categories/{id}, THE system SHALL xóa và return 204
§6 Error Handling (Unwanted)
  • WHERE POST với name đã tồn tại → 409 Conflict
  • WHERE DELETE category có bài viết → 422 + "Cannot delete: category has {n} posts. Reassign first."
  • WHERE PUT/DELETE với id không tồn tại → 404
§8 Out of Scope
  • Không có nested/hierarchical categories
  • Không có soft delete (hard delete only)
  • Không có search/filter trong sprint này
6.5.2 — Lab B

Lab B — Import CSV Với Business Logic Phức Tạp (60 phút)

Đây là bài test thực sự. Tính năng Import Data có đủ độ phức tạp để bộc lộ tất cả những gì có thể sai nếu Planning và Task Decomposition bị bỏ qua: format validation, error logging, partial success, rollback strategy. Những vấn đề này không hiện ra khi nhìn vào user story — chỉ hiện ra khi bạn spec kỹ.

User Story ban đầu (từ PM) — tất cả những gì PM cung cấp
Admin có thể upload file CSV để import hàng loạt sản phẩm. Requirements: upload CSV, parse và import vào database, báo cáo số lượng thành công/thất bại, xử lý lỗi định dạng.

← Đây là tất cả. Phần tiếp theo: bạn phải tự phát hiện tất cả những gì còn thiếu qua SDD process.
6.5.2 — Lab B: Context Discovery

Lab B — Câu Hỏi Context Discovery

Danh sách câu hỏi bạn phải trả lời trước khi viết spec. Chúng không xuất hiện trong user story — bạn phải tự phát hiện:

Câu hỏiNếu không hỏi → Bug
"CSV format cụ thể thế nào? Header row có không?"AI đoán format → import sai toàn bộ
"Nếu 1 row lỗi trong 1000 rows — rollback hay skip?"Hành vi undefined → inconsistent data
"Duplicate product (same SKU) → update hay error?"Silent data override hoặc false rejection
"File size limit?"Memory exhaustion khi upload 500MB CSV
"Log ở đâu? Admin xem được không? Trong bao lâu?"Log mất sau restart, không debug được
"Import async hay sync? Timeout?"30s timeout khi import 50,000 rows
"Validation per-row hay per-field?"Row 1 lỗi field 2 → message không rõ
6.5.2 — Lab B: SPEC.md

Lab B — SPEC.md Product CSV Import

§3 Functional — CSV Format & Upload Flow
  • Accept CSV: UTF-8, comma delimiter, header row bắt buộc: sku, name, price, stock, category_slug
  • Tối đa 10,000 rows mỗi file · File size tối đa: 10MB
  • WHEN admin POST /imports/csv với valid file, THE system SHALL: lưu file vào temp, tạo import_job (status=pending), return 202 Accepted + job_id, process async
  • Processing Strategy: partial success — mỗi row xử lý độc lập, không transaction toàn bộ file
  • WHERE SKU đã tồn tại → upsert (không lỗi, không duplicate)
§6 Error Handling — Unwanted Patterns
  • WHERE file không phải CSV hoặc > 10MB → 400 ngay (không process)
  • WHERE header row thiếu cột bắt buộc → fail toàn bộ job + error message
  • WHERE một row thiếu trường → skip row, ghi error: "Row {n}: Missing {field}"
  • WHERE price không phải số dương → skip + "Row {n}: Invalid price"
  • WHERE error_count = total_rows → status = "failed" + email alert admin
  • WHERE 3 concurrent jobs đang running → 429 Too Many Requests
6.5.2 — Lab B: Tại sao cần Planning kỹ hơn

Lab A vs Lab B — Độ Phức Tạp Thiết Kế

Vấn đề thiết kếLab A (CRUD)Lab B (Import)
Async processingKhông cầnBắt buộc — background job queue
Transaction strategyPer-request transactionPer-row, không global rollback
Error storageKhông cầnimport_errors table + downloadable
Concurrency controlKhông cầnSemaphore/lock cho 3-job limit
File storageKhông cầnTemp storage + cleanup job
Progress trackingKhông cầnReal-time counters + polling
Testing complexityUnit tests đủIntegration + end-to-end bắt buộc
Bài học từ Lab B "Import CSV" nghe đơn giản nhưng chứa đựng 6 quyết định thiết kế quan trọng. Không có Context Discovery → miss file size limit, miss concurrent control. Không có PLAN.md → AI implement sync thay vì async → timeout ở production. Đây chính xác là lý do SDD tồn tại: complexity luôn cao hơn vẻ ngoài.
6.5.2 — Lab B: TASKS.md

Lab B — TASKS.md Product CSV Import (12 tasks, ~28h)

IDTaskEstDependencies
T001DB migration: import_jobs table1h
T002DB migration: import_errors table1hT001
T003FileValidationService (size, ext)2h
T004CSVParserService (header + rows)3hT003
T005RowValidatorService (per-field)3h
T006ImportJobRepository2hT001,T002
T007ImportWorker (async background) — critical path4hT004,T005,T006
T008ConcurrencyGuard (3-job limit)2hT006
T009ImportRouter (upload + status)2hT007,T008
T010ErrorExportEndpoint (CSV download)2hT006
T011Integration tests4hT009,T010
T012Admin email alert (all-fail case)2hT007
6.5.3 — Evaluation Rubric

Evaluation Rubric — Chấm Điểm Cả Hai Labs

Tiêu chíLab A (CRUD)Lab B (Import)Điểm
SPEC đủ 8 thành phần8/8 sections8/8 sections20đ
EARS notation≥5 SHALL statements≥12 SHALL statements20đ
Out of Scope rõ ràng≥3 items≥5 items10đ
PLAN.md có risks≥2 risks≥5 risks10đ
Tasks atomic (≤4h)All tasks ≤4hAll tasks ≤4h15đ
Code có EARS tags≥80% rules tagged≥80% rules tagged10đ
Tests cover AC100% AC covered100% AC covered15đ
100
Tổng điểm
40%
Lý thuyết
60%
Thực hành
8
SPEC components
6.5.4 — Reflection

Reflection — Bài Học Từ Hai Labs

Câu hỏi phân tích
  • Lab A vs Lab B: Bao nhiêu thời gian bạn dành cho Context Discovery và Spec Writing? Tỷ lệ lý thuyết theo SDD là 30–40% thời gian dự án. Thực tế của bạn là bao nhiêu?
  • Khi AI generate PLAN.md cho Lab B, nó hỏi bao nhiêu Questions for Human? So sánh với Lab A. Điều đó nói lên gì về mức độ phức tạp tương đối?
Câu hỏi ứng dụng thực tế
  • Nếu bạn bỏ qua Context Discovery và đưa user story trực tiếp vào AI để code — điều gì sẽ thiếu trong sản phẩm cuối? Liệt kê cụ thể.
  • Trong môi trường làm việc thực, đồng nghiệp hoặc PM của bạn sẽ phản ứng thế nào khi bạn nói "Tôi cần 1 ngày để viết spec trước khi code"? Làm thế nào bạn justify?
Task Decomposition không phải overhead — nó là quality gate. Khi ai đó implement tất cả trong 1 task (không decompose) → context overflow, AI forget spec details → thiếu partial success logic → lỗi production.
Tổng kết Chương 6

Tổng Kết — Ba Con Đường SDD

Cách tiếp cậnPhù hợp vớiĐiểm mạnhĐiểm yếu
GitHub Spec Kit Team dùng GitHub, muốn cấu trúc Traceability tốt, audit trail hoàn hảo Cần setup, learning curve
Cline (Roo Code) Developer muốn speed + autonomy Agentic, multi-model, MCP integration Cần giám sát, có thể overrun
DIY Markdown Team nhỏ, linh hoạt, bất kỳ AI Không vendor lock, đơn giản, tự do Tự kỷ luật cao hơn cần thiết
Key Takeaways
  • 5 pha: Context → Spec → Plan → Tasks → Impl → Validate
  • Fix the Spec, not the Code — nguyên tắc bất biến
  • Mọi code phải truy được về spec — không exception
  • Out of Scope cũng cần validation — không chỉ "những gì đã làm"
Chương tiếp theo — Chương 7

Test-Driven Specification
Given-When-Then (BDD) notation · AI generate test suite trước khi viết code (TDS) · Contract testing cho API · Mutation testing với AI-generated test cases.

Chương 6 — Hoàn thành

"Code là artifact tạm thời.
Spec mới là nguồn sự thật lâu dài."

5 pha · Fix the Spec · Human-in-the-loop ở mọi điểm quan trọng

5
SDD Phases
3
Tooling Paths
2
Hands-on Labs
Spec First