spec-lite 1.4.2 → 1.4.5
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/README.md +21 -21
- package/package.json +1 -1
- package/skills/ado-config/SKILL.md +1 -1
- package/skills/ado-create/SKILL.md +7 -7
- package/skills/ado-update/SKILL.md +1 -1
- package/skills/archive/SKILL.md +19 -19
- package/skills/build/SKILL.md +5 -5
- package/skills/plan/SKILL.md +6 -6
- package/skills/review-everything/SKILL.md +9 -9
- package/skills/review-integration/SKILL.md +7 -7
- package/skills/scaffold/SKILL.md +9 -9
- package/skills/spec-brownfield-component/SKILL.md +11 -11
- package/skills/spec-brownfield-feature/SKILL.md +13 -13
- package/skills/spec-brownfield-init/SKILL.md +16 -14
- package/skills/spec-frd/SKILL.md +74 -18
- package/skills/spec-frd-update/SKILL.md +9 -9
- package/skills/spec-new/SKILL.md +13 -12
- package/skills/spec-prd/SKILL.md +41 -11
- package/skills/spec-remove/SKILL.md +27 -27
- package/skills/spec-sad/SKILL.md +47 -10
- package/skills/spec-tech/SKILL.md +16 -16
- package/skills/spec-test/SKILL.md +15 -15
- package/skills/spec-tsd/SKILL.md +10 -10
- package/skills-overview.md +32 -28
- package/templates/main/domain-template.md +11 -5
- package/templates/main/feature/frd-template.md +1 -1
- package/templates/main/prd-template.md +1 -1
- package/templates/main/sad-template.md +8 -0
package/skills-overview.md
CHANGED
|
@@ -8,13 +8,13 @@ Dùng khi bắt đầu dự án mới chưa có code. Mục tiêu: bootstrap `pr
|
|
|
8
8
|
|
|
9
9
|
| Command | Reads | Writes |
|
|
10
10
|
| --- | --- | --- |
|
|
11
|
-
| `/spec-prd` | — *(tùy chọn: nguồn baseline path/@file/paste)* |
|
|
12
|
-
| `/spec-sad` | `prd.md`, `domain.md` |
|
|
13
|
-
| `/spec-frd [F-XXX]` *(tùy chọn)* | `prd.md`, `domain.md`, `sad.md`, `crd(s)` *(+ nguồn baseline)* |
|
|
11
|
+
| `/spec-prd` | — *(tùy chọn: nguồn baseline path/@file/paste)* | `.specs/main/prd.md`, `.specs/main/domain.md` *(skeleton)* |
|
|
12
|
+
| `/spec-sad` | `prd.md`, `domain.md` | `.specs/main/sad.md` *(+ gán `Owner` cho shared entity còn TBD trong `domain.md`)* |
|
|
13
|
+
| `/spec-frd [F-XXX]` *(tùy chọn)* | `prd.md`, `domain.md`, `sad.md`, `crd(s)` *(+ nguồn baseline)* | `.specs/main/feature/{F-XXX}-*/frd.md` *(+ register feature row vào `prd.md` nếu feature mới; + cascade glossary/entity vào `domain.md`)* |
|
|
14
14
|
|
|
15
15
|
### `/spec-prd`
|
|
16
16
|
|
|
17
|
-
Tạo hoặc cập nhật
|
|
17
|
+
Tạo hoặc cập nhật `.specs/main/prd.md` thông qua interview có cấu trúc. Ngoài ra **scaffold luôn `.specs/main/domain.md` skeleton** (Glossary placeholder + Shared Entities rỗng) — domain mọc dần qua cascade ở hai pha: mô tả (`/spec-frd`, `/spec-new` seed glossary + định nghĩa entity) và thiết kế (`/spec-sad` gán `Owner`).
|
|
18
18
|
|
|
19
19
|
**Sections template** (7): Problem Statement · Target Users · Scope · Features · Components · Non-Functional Requirements · Business Constraints
|
|
20
20
|
|
|
@@ -33,11 +33,13 @@ Chọn `A` → interview tuần tự 7 sections template (sections thừa không
|
|
|
33
33
|
|
|
34
34
|
### `/spec-sad`
|
|
35
35
|
|
|
36
|
-
Tạo hoặc cập nhật
|
|
36
|
+
Tạo hoặc cập nhật `.specs/main/sad.md`. Yêu cầu `prd.md` và `domain.md` đã tồn tại (cả hai do `/spec-prd` scaffold).
|
|
37
37
|
|
|
38
38
|
Trước khi interview, đọc `prd.md` (NFRs, constraints) và `domain.md` (glossary, shared entities) để surface assumptions và đề xuất options phù hợp khi user chưa quyết định.
|
|
39
39
|
|
|
40
|
-
**
|
|
40
|
+
**Cascade lên `domain.md` (pha thiết kế/HOW):** carve component là việc thiết kế, nên sau khi Components rõ, `/spec-sad` gán `Owner: C-XXX` + `Used by` cho shared entity mà pha mô tả (`/spec-frd`/`/spec-new`) để `Owner: TBD`. Đây là nửa HOW của domain two-phase cascade.
|
|
41
|
+
|
|
42
|
+
**Sections template** (8): Architectural Style · System Overview · Tech Stack · Cross-Cutting Concerns · Inter-Service Communication · Infrastructure Overview · Architectural Guardrails · ADR Log
|
|
41
43
|
|
|
42
44
|
**Khi file chưa tồn tại** → full interview tuần tự từng section.
|
|
43
45
|
|
|
@@ -51,7 +53,7 @@ Nếu `prd.md` chưa có → dừng, yêu cầu chạy `/spec-prd` trước.
|
|
|
51
53
|
|
|
52
54
|
### `/spec-frd [F-XXX]` *(tùy chọn)*
|
|
53
55
|
|
|
54
|
-
BA author
|
|
56
|
+
BA author `.specs/main/feature/{F-XXX}-*/frd.md` trực tiếp qua interview — **spec-first ở feature level**, chạy *trước* khi DEV bắt đầu integration. Cặp greenfield đối xứng với `/spec-brownfield-feature` (vốn reverse-engineer frd từ code).
|
|
55
57
|
|
|
56
58
|
Nhận F-XXX từ argument (hoặc chọn từ prd Feature Index) + tùy chọn nguồn baseline (path/@file/paste như `/spec-prd`). Yêu cầu `prd.md` tồn tại.
|
|
57
59
|
|
|
@@ -65,8 +67,10 @@ Nhận F-XXX từ argument (hoặc chọn từ prd Feature Index) + tùy chọn
|
|
|
65
67
|
**Phạm vi hẹp — chủ yếu `frd.md`:**
|
|
66
68
|
- Reference component frd phụ thuộc (Components Used → C-XXX có sẵn).
|
|
67
69
|
- Component cần-nhưng-chưa-có → ghi *candidate* + Open Question cho `/spec-sad`/architect chốt boundary.
|
|
68
|
-
- Có thể register **một** feature row vào prd (side-effect
|
|
69
|
-
-
|
|
70
|
+
- Có thể register **một** feature row vào prd (side-effect lên prd).
|
|
71
|
+
- **Cascade vocabulary lên `domain.md`** (pha mô tả/WHAT): glossary term + **định nghĩa shared entity** (attributes), `Owner: TBD` để `/spec-sad` gán ở pha thiết kế (HOW). BA define entity, KHÔNG carve/gán Owner.
|
|
72
|
+
- **KHÔNG** tạo `crd.md`/`cdd.md` (sinh ở integration time qua `/spec-new` cascade), không tạo `fdd.md`/`tsd.md`, không đổi status feature đã có, không đụng sad.
|
|
73
|
+
- Change History operation = `manual` (cả frd lẫn domain). Verification Rules dùng quy ước option-suggester của `/spec-new` (BA owns).
|
|
70
74
|
|
|
71
75
|
Bỏ qua bước này cũng được — `/spec-new` sẽ tự tạo frd làm fallback khi integration đầu tiên chạm tới feature.
|
|
72
76
|
|
|
@@ -253,17 +257,17 @@ Sau khi main artifacts đã sẵn sàng (từ greenfield hoặc brownfield), m
|
|
|
253
257
|
|
|
254
258
|
| Command | Reads | Writes |
|
|
255
259
|
| --- | --- | --- |
|
|
256
|
-
| `/spec-new [requirement]` | `prd.md`, `domain.md`, frd(s), crd(s) |
|
|
257
|
-
| `/spec-tech [number]` | `sad.md`, `domain.md`, cdd(s), fdd(s), `spec.md` |
|
|
258
|
-
| `/spec-test [number]` | `spec.md`, frd(s), tsd(s), `tech.md` *(optional)* |
|
|
260
|
+
| `/spec-new [requirement]` | `prd.md`, `domain.md`, frd(s), crd(s) | `.specs/integrations/{slug}/spec.md` |
|
|
261
|
+
| `/spec-tech [number]` | `sad.md`, `domain.md`, cdd(s), fdd(s), `spec.md` | `.specs/integrations/{slug}/tech.md` |
|
|
262
|
+
| `/spec-test [number]` | `spec.md`, frd(s), tsd(s), `tech.md` *(optional)* | `.specs/integrations/{slug}/test.md`, `feature/{F-XXX}/tsd.md` |
|
|
259
263
|
| `/plan` | `spec.md`, `tech.md`, `domain.md` | `plan.md`, `todo.md` |
|
|
260
264
|
| `/build` | `plan.md`, `todo.md` | *(source code)* |
|
|
261
265
|
| `/review-integration` | `spec.md`, `tech.md`, `plan.md`, `todo.md`, *(source code)* | *(findings report)* |
|
|
262
|
-
| `/archive` |
|
|
266
|
+
| `/archive` | `.specs/integrations/` | `.specs/archive/` |
|
|
263
267
|
|
|
264
268
|
### `/spec-new [requirement]`
|
|
265
269
|
|
|
266
|
-
Tạo
|
|
270
|
+
Tạo `.specs/integrations/{slug}/spec.md` cho một integration mới. Chạy bởi BA.
|
|
267
271
|
|
|
268
272
|
**Nếu không có argument** → đọc `prd.md`, hiển thị danh sách features có `Status = TODO`, user chọn số.
|
|
269
273
|
|
|
@@ -283,9 +287,9 @@ Sau khi confirm → ghi `spec.md`, cập nhật `prd.md`: Status `TODO → In Pr
|
|
|
283
287
|
|
|
284
288
|
### `/spec-tech [number]`
|
|
285
289
|
|
|
286
|
-
Tạo
|
|
290
|
+
Tạo `.specs/integrations/{slug}/tech.md` cho một integration. Chạy bởi DEV sau khi `spec.md` đã được approve.
|
|
287
291
|
|
|
288
|
-
**Luôn hiển thị danh sách tất cả integrations** trong
|
|
292
|
+
**Luôn hiển thị danh sách tất cả integrations** trong `.specs/integrations/`, đánh dấu `✓` những cái đã có `tech.md`. Nếu có argument → argument là số thứ tự (`1`, `001`...), chọn luôn không cần hiển thị.
|
|
289
293
|
|
|
290
294
|
Nếu integration đã có `tech.md` → hỏi confirm trước khi ghi đè.
|
|
291
295
|
|
|
@@ -299,9 +303,9 @@ Context load: `spec.md` + `sad.md` + `domain.md` + `cdd.md` (cho mỗi component
|
|
|
299
303
|
|
|
300
304
|
### `/spec-test [number]`
|
|
301
305
|
|
|
302
|
-
Tạo
|
|
306
|
+
Tạo `.specs/integrations/{slug}/test.md` cho một integration. Chạy bởi **QC** sau khi `spec.md` đã được approve. **Song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Không có thứ tự bắt buộc giữa chúng.
|
|
303
307
|
|
|
304
|
-
**Luôn hiển thị danh sách tất cả integrations** trong
|
|
308
|
+
**Luôn hiển thị danh sách tất cả integrations** trong `.specs/integrations/`, đánh dấu `✓` những cái đã có `test.md`. Nếu có argument → chọn luôn không cần hiển thị.
|
|
305
309
|
|
|
306
310
|
**Gate check:** spec.md phải `approved` + `features:` non-empty. Integration có `features: []` (thuần component) → dừng vì component-level `tsd` không tồn tại trong kit này.
|
|
307
311
|
|
|
@@ -326,7 +330,7 @@ QC review: override priority defaults, fill placeholders (env / data / OOS / str
|
|
|
326
330
|
Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`. Là SDD wrapper quanh `planning-and-task-breakdown`.
|
|
327
331
|
|
|
328
332
|
**Bước 1: Xác định integration**
|
|
329
|
-
Quét
|
|
333
|
+
Quét `.specs/integrations/`, hiển thị danh sách với trạng thái `spec✓/—`, `tech✓/—`, `plan✓/—`. Nếu có argument → chọn luôn. Nếu `plan.md`/`todo.md` đã tồn tại → hỏi trước khi ghi đè.
|
|
330
334
|
|
|
331
335
|
**Bước 2: Load và surface context**
|
|
332
336
|
Đọc `spec.md`, `tech.md`, `domain.md`. Surface tóm tắt (features, components, AC IDs, thay đổi kỹ thuật, shared entities) và assumptions để user confirm. Plan mode từ đây — chỉ đọc, không viết code.
|
|
@@ -379,17 +383,17 @@ Review implementation sau `/build` theo năm trục: correctness, readability, a
|
|
|
379
383
|
|
|
380
384
|
### `/archive`
|
|
381
385
|
|
|
382
|
-
Di chuyển integration đã hoàn thành hoặc không còn active từ
|
|
386
|
+
Di chuyển integration đã hoàn thành hoặc không còn active từ `.specs/integrations/` sang `.specs/archive/` để dọn dẹp thư mục làm việc chính.
|
|
383
387
|
|
|
384
|
-
**Bước 1 — Kiểm tra thư mục:** Tự động tạo
|
|
388
|
+
**Bước 1 — Kiểm tra thư mục:** Tự động tạo `.specs/archive/` nếu chưa tồn tại.
|
|
385
389
|
|
|
386
|
-
**Bước 2 — Liệt kê:** Quét
|
|
390
|
+
**Bước 2 — Liệt kê:** Quét `.specs/integrations/`, hiển thị numbered list kèm status (đọc từ `spec.md` nếu có). Nếu không có integration nào → thông báo và dừng.
|
|
387
391
|
|
|
388
392
|
**Bước 3 — Xác nhận:** Hiển thị preview mapping `integrations/{slug}/ → archive/{slug}/` trước khi di chuyển. Chờ user confirm.
|
|
389
393
|
|
|
390
|
-
**Bước 4 — Di chuyển:** Move toàn bộ thư mục, giữ nguyên cấu trúc bên trong. Nếu slug đã tồn tại trong
|
|
394
|
+
**Bước 4 — Di chuyển:** Move toàn bộ thư mục, giữ nguyên cấu trúc bên trong. Nếu slug đã tồn tại trong `.specs/archive/` → bỏ qua và cảnh báo để tránh ghi đè.
|
|
391
395
|
|
|
392
|
-
**Bước 5 — Kết quả:** Liệt kê integrations đã archive, integrations bị bỏ qua (nếu có), và số integration còn lại trong
|
|
396
|
+
**Bước 5 — Kết quả:** Liệt kê integrations đã archive, integrations bị bỏ qua (nếu có), và số integration còn lại trong `.specs/integrations/`.
|
|
393
397
|
|
|
394
398
|
---
|
|
395
399
|
|
|
@@ -432,7 +436,7 @@ Khác với `/review-integration` (chạy sau `/build` cho một integration c
|
|
|
432
436
|
|
|
433
437
|
| Command | Reads | Writes |
|
|
434
438
|
| --- | --- | --- |
|
|
435
|
-
| `/review-everything` | `prd.md`, `domain.md`, `sad.md`, *(source code)* |
|
|
439
|
+
| `/review-everything` | `prd.md`, `domain.md`, `sad.md`, *(source code)* | `.specs/integrations/{NNN}-{slug}/review-findings.md` *(qua /spec-new)* |
|
|
436
440
|
|
|
437
441
|
### `/review-everything`
|
|
438
442
|
|
|
@@ -450,7 +454,7 @@ Review codebase ở project level theo năm trục của `code-review-and-qualit
|
|
|
450
454
|
|
|
451
455
|
Nếu user chọn fix → gom selected findings thành raw requirement, invoke `/spec-new` với ARGUMENT đó. Integration được tạo và xử lý như integration thường (`/spec-tech` → `/plan` → `/build`).
|
|
452
456
|
|
|
453
|
-
`review-findings.md` (full snapshot, gồm cả deferred) được ghi vào
|
|
457
|
+
`review-findings.md` (full snapshot, gồm cả deferred) được ghi vào `.specs/integrations/{NNN}-{slug}/` để traceability.
|
|
454
458
|
|
|
455
459
|
**Khi dùng:**
|
|
456
460
|
|
|
@@ -571,7 +575,7 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
|
|
|
571
575
|
|
|
572
576
|
**Bước 1 — Current user:** Đọc `git config user.email`, tìm trong `team.*` của `ado.yaml`. Nếu không khớp → hỏi user chọn. Resolve email → ADO identity ID để dùng làm assignee.
|
|
573
577
|
|
|
574
|
-
**Bước 2 — Chọn integration:** List tất cả
|
|
578
|
+
**Bước 2 — Chọn integration:** List tất cả `.specs/integrations/` kèm title và status từ frontmatter `spec.md`.
|
|
575
579
|
|
|
576
580
|
**Bước 3 — Parse spec.md:** Extract Features (`### Feature: <name> (<ID>)`) và User Stories (`#### US-FXXX-YYY — <title>`). Detect ticket đã tồn tại qua dòng `**ADO:**` ngay sau heading — đánh dấu `already_created`, bỏ qua khi tạo.
|
|
577
581
|
|
|
@@ -599,7 +603,7 @@ Cập nhật state đồng loạt cho User Story (và tuỳ chọn Feature) tick
|
|
|
599
603
|
|
|
600
604
|
**Bước 1 — Load config:** Đọc `ado.yaml`. Dừng nếu thiếu file hoặc `environments` rỗng.
|
|
601
605
|
|
|
602
|
-
**Bước 2 — Chọn integration:** List
|
|
606
|
+
**Bước 2 — Chọn integration:** List `.specs/integrations/` kèm title và status.
|
|
603
607
|
|
|
604
608
|
**Bước 3 — Parse & validate:** Extract tất cả Feature và User Story tickets từ dòng `**ADO:**` trong `spec.md`. Nếu bất kỳ ticket nào chưa có → dừng, báo danh sách thiếu, yêu cầu chạy `/ado-create` trước.
|
|
605
609
|
|
|
@@ -6,15 +6,17 @@ owner: "{BA/Domain Expert}"
|
|
|
6
6
|
referenced_by:
|
|
7
7
|
- conventions.md > 3. Main Artifacts > 3.1 Product level > domain.md > Cấu trúc
|
|
8
8
|
- skills/spec-prd/SKILL.md > Process > Bước 5: Save (scaffold domain.md skeleton)
|
|
9
|
+
- skills/spec-frd/SKILL.md > Process > Bước 4b (cascade glossary + entity definition — WHAT)
|
|
10
|
+
- skills/spec-sad/SKILL.md > Process > Phần 1.6 (gán Owner cho shared entity — HOW)
|
|
9
11
|
- skills/spec-new/SKILL.md > Process > Cascade Proposals > domain.md
|
|
10
12
|
- skills/spec-tech/SKILL.md > Process > Cascade Proposals > domain.md
|
|
11
13
|
---
|
|
12
14
|
|
|
13
15
|
# Domain
|
|
14
16
|
|
|
15
|
-
> File này mỏng — chỉ chứa **shared vocabulary** và **shared entities** (
|
|
17
|
+
> File này mỏng — chỉ chứa **shared vocabulary** và **shared entities** (entity ở mức vocabulary nghiệp vụ chung, dự kiến dùng bởi 2+ component; việc dùng-bởi-2+ và `Owner` được xác nhận ở pha thiết kế).
|
|
16
18
|
>
|
|
17
|
-
> Business rules, domain events, internal entities thuộc về component sở hữu — xem
|
|
19
|
+
> Business rules, domain events, internal entities thuộc về component sở hữu — xem `.specs/main/component/{C-XXX}-{component-name}/crd.md`.
|
|
18
20
|
|
|
19
21
|
## Glossary
|
|
20
22
|
|
|
@@ -26,13 +28,17 @@ referenced_by:
|
|
|
26
28
|
|
|
27
29
|
## Shared Entities
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
Entity ở mức vocabulary nghiệp vụ chung. Hai phần thông tin tới từ hai pha (xem two-phase cascade, `conventions.md` §5.5):
|
|
32
|
+
- **Định nghĩa** (tên, attributes, state machine) — *mô tả hệ thống* (WHAT): seed bởi `/spec-prd`/`/spec-frd`/`/spec-new`.
|
|
33
|
+
- **`Owner` / `Used by`** — *thiết kế hệ thống* (HOW): gán bởi `/spec-sad` (hoặc `/spec-new` khi carve component). Khi entity vừa được seed mà component chưa carve → để `Owner: TBD`.
|
|
34
|
+
|
|
35
|
+
Entity rõ ràng nội bộ một component (không phải vocabulary chung) không vào đây — chúng nằm trong `crd.md` của component đó.
|
|
30
36
|
|
|
31
37
|
### {Entity Name}
|
|
32
38
|
|
|
33
|
-
**Owner:** `{C-XXX}-{component-name}` *(component sở hữu canonical definition)*
|
|
39
|
+
**Owner:** `{C-XXX}-{component-name}` *(component sở hữu canonical definition; `TBD` nếu chưa carve — `/spec-sad` điền)*
|
|
34
40
|
|
|
35
|
-
**Used by:** `{C-XXX}`, `{C-YYY}` *(các component reference entity này)*
|
|
41
|
+
**Used by:** `{C-XXX}`, `{C-YYY}` *(các component reference entity này; `TBD` cho tới khi gán Owner)*
|
|
36
42
|
|
|
37
43
|
{Mô tả entity này đại diện cho cái gì trong business context.}
|
|
38
44
|
|
|
@@ -149,7 +149,7 @@ Sub-rule phức tạp (vd: password complexity với nhiều điều kiện) →
|
|
|
149
149
|
|
|
150
150
|
### Components Used
|
|
151
151
|
|
|
152
|
-
Tham chiếu đến
|
|
152
|
+
Tham chiếu đến `.specs/main/component/{C-XXX}-...`.
|
|
153
153
|
|
|
154
154
|
| Component | Vai trò trong feature |
|
|
155
155
|
| --- | --- |
|
|
@@ -56,7 +56,7 @@ Section này **chỉ liệt kê component có boundary _Given_** — tức bound
|
|
|
56
56
|
- `/spec-sad` — architect lock component boundaries dựa trên full feature index + NFRs
|
|
57
57
|
- `/spec-new F-XXX` cascade — khi analyze 1 feature, discover component mới nếu cần và register vào đây qua Change History
|
|
58
58
|
|
|
59
|
-
Chi tiết về vai trò và thiết kế nằm trong
|
|
59
|
+
Chi tiết về vai trò và thiết kế nằm trong `.specs/main/component/{C-XXX}-{component-name}/`.
|
|
60
60
|
|
|
61
61
|
| ID | Component | Mô tả ngắn | Status |
|
|
62
62
|
| --- | --- | --- | --- |
|
|
@@ -75,6 +75,14 @@ Các nguyên tắc sau là bất biến. Agent phải kiểm tra compliance trư
|
|
|
75
75
|
- GUARD-002: {nguyên tắc — ví dụ: Mọi external API call phải có retry + timeout}
|
|
76
76
|
- GUARD-003: {nguyên tắc — ví dụ: Không để business logic trong API layer}
|
|
77
77
|
|
|
78
|
+
## ADR Log
|
|
79
|
+
|
|
80
|
+
Architecture Decision Records — ghi lại các quyết định kiến trúc quan trọng cùng bối cảnh và hệ quả. Nắm *tại sao* chọn (điều mà Guardrails và Tech Stack không giải thích), giúp người sau hiểu trade-off thay vì đoán lại. Mỗi quyết định lớn (chọn style, tech chính, đánh đổi đáng kể) nên có một entry.
|
|
81
|
+
|
|
82
|
+
| ID | Decision | Status | Context & Rationale | Consequences |
|
|
83
|
+
| --- | --- | --- | --- | --- |
|
|
84
|
+
| ADR-001 | {quyết định ngắn gọn} | proposed / accepted / deprecated / superseded | {bối cảnh + lý do chọn, các option đã cân nhắc} | {hệ quả, đánh đổi phải chấp nhận} |
|
|
85
|
+
|
|
78
86
|
## Change History
|
|
79
87
|
|
|
80
88
|
Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
|