## Tech Design Complete

**Date**: 2026-05-12
**Epic**: EPIC-001
**Generated By**: tech-design skill
**Revision**: 2

### Artifacts Produced

- [x] TECH-DESIGN.md
- [x] IMPL-PLAN-API.md (api-kingston)
- [x] IMPL-PLAN-WEB.md (web-kingston)

### Phản hồi feedback (revision 2)

**Câu hỏi:** Có cần thêm `structureId` vào `bom`, `bomComponent`, `bomProduct`, `bomWorkStep` không?

**Quyết định:**

| Entity | Thêm `structureId`? | Lý do |
|--------|---------------------|-------|
| `Bom` | ✅ **Có** (nullable) | BOM là recipe cho một phiên bản kết cấu cụ thể. `structureId` link BOM về đúng Structure mà nó được tạo từ. BOM epic sau cần field này. |
| `BomComponent` | ❌ **Không** | Là danh sách nguyên liệu bên trong BOM. Không liên quan đến việc kết cấu nào được chọn. |
| `BomProduct` | ❌ **Không** | Là thông tin sản phẩm trong BOM. Không cần biết Structure. |
| `BomWorkStep` | ❌ **Không** | Là công đoạn sản xuất trong BOM. Không phụ thuộc Structure. |

`Bom.structureId` đã có trong IMPL-PLAN-API.md Step 1 — không cần thay đổi implementation plan.

### Key Design Decisions

1. **`StructureTreeModel` độc lập** — không modify `ProductTreeModel` hiện có để tránh break BOM/WorkOrder
2. **Expand-only migration** — `Component.structureId` và `Bom.structureId` đều nullable → không breaking change
3. **Data migration idempotent** — check `IS NULL` trước khi UPDATE; có thể retry an toàn
4. **Không raise domain events** trong EPIC-001 — BOM epic sẽ define event contract

### Next Step

- `api-kingston`: chạy `/implement-feature EPIC-001 api`
- `web-kingston`: chạy `/implement-feature EPIC-001 web` (sau khi API deployed)
