@relipa/ai-flow-kit 0.1.7 → 0.1.8

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.
@@ -0,0 +1,664 @@
1
+ # [AI Flow Kit] Memory Architecture — v1.0
2
+
3
+ > **Đối tượng:** AI Testing Team · TechLead · PM · mọi role liên quan (đọc được, không cần biết kỹ thuật)
4
+ > **Trạng thái:** Draft v1.1 — đã review & chốt quyết định ngày 2026-07-16 (mem-id theo folder functionId, scorer chấm trên tags, hit count qua telemetry local, pending dùng được trên máy người tạo, recall theo workflow, offline fallback)
5
+ > **Ngày:** 2026-07-09 · Cập nhật: 2026-07-16
6
+
7
+ ---
8
+
9
+ ## 1. Mục Tiêu
10
+
11
+ Triển khai memory cho các dự án dùng AI Flow Kit, sao cho:
12
+
13
+ - Trong quá trình làm task, AI **tích lũy tri thức qua hội thoại** giữa AI và con người.
14
+ - AI **tự tổng hợp** và ngày càng hiểu dự án hơn, **không lặp lại lỗi cũ**.
15
+ - Các task về sau **kế thừa** những điểm hay từ lịch sử task trước — con người không phải mô tả lại từ đầu mỗi lần làm task mới.
16
+ - Memory được **đồng bộ giữa các role**: AI, DEV, BA, QA, PM, TL (và Comtor nếu dự án có).
17
+
18
+ ---
19
+
20
+ ## 2. Đánh Giá Hiện Trạng
21
+
22
+ Kết quả rà soát toàn bộ repo (kit chính, `custom/`, `upstream/`, `everything-claude-code/`, `scripts/`, hooks): kit hiện có 3 tầng "memory" khác nhau, nhưng **không tầng nào là học tập tích lũy đúng nghĩa**.
23
+
24
+ ### 2.1 Những gì đang HOẠT ĐỘNG trong project được deploy (`ak init`)
25
+
26
+ | Cơ chế | Vị trí | Bản chất |
27
+ |---|---|---|
28
+ | Ticket context carryover | `.aiflow/context/current.json` → inject bởi `scripts/hooks/session-start.js` | Nhớ **ticket đang làm**, không phải tri thức |
29
+ | Task/Gate resumption | `.aiflow/tasks/<id>/task-state.json` | Nhớ **đang ở Gate mấy** để resume, không học được gì |
30
+ | Token checkpoints + telemetry | `.aiflow/tasks/<id>/checkpoints.json`, session-stop hook | Analytics, không phải knowledge |
31
+
32
+ ### 2.2 Những gì CÓ CODE nhưng đang "chết"
33
+
34
+ - **`aiflow memory save/get/search`** (`scripts/memory.js`) — kho JSON tại `.aiflow/memory/`, hoàn toàn thủ công. Quan trọng hơn: hàm `loadRelevantMemories` / `auto-load` (`memory.js:135`) là **dead code — không có hook nào gọi**. Kể cả team có save memory, AI cũng không bao giờ tự đọc lại.
35
+ - **AK-Docs** — lưu tài liệu output từng Gate rất tốt (traceability), nhưng là *document storage*: AI không tự tổng hợp thành tri thức và không tự recall khi làm task mới.
36
+
37
+ ### 2.3 Những gì CÓ SẴN trong repo nhưng CHƯA được cài vào project
38
+
39
+ Toàn bộ phần "học tập" thực sự nằm trong thư mục vendor `everything-claude-code/` (ECC) và **không được `ak init` copy vào project nào**:
40
+
41
+ | Tài sản ECC | Chức năng |
42
+ |---|---|
43
+ | `skills/continuous-learning-v2/` | Học "instinct" có confidence score (0.3–0.9), observe qua PreToolUse/PostToolUse hooks |
44
+ | `hooks/memory-persistence/` | Auto-save trước khi compact (PreCompact), auto-load khi SessionStart |
45
+ | `skills/knowledge-ops/` | Kiến trúc knowledge base nhiều tầng |
46
+ | `/learn`, `/learn-eval`, `/evolve` commands | Extract pattern giữa session, quality gate, cluster instinct thành skill |
47
+
48
+ > Khớp với đánh giá trong `upgrade-plan/everything-claude-code-analysis.md`: 2 nhóm "Quản lý memory" và "Learn experience" đã được flag **CRITICAL** nhưng chưa triển khai.
49
+
50
+ ### 2.4 Đối chiếu với mục tiêu
51
+
52
+ | Mục tiêu | Hiện trạng |
53
+ |---|---|
54
+ | AI tích lũy tri thức qua hội thoại người–AI | ❌ Không có cơ chế extract tri thức từ conversation |
55
+ | AI tự tổng hợp, ngày càng hiểu dự án hơn | ❌ Không có consolidation/synthesis |
56
+ | Không lặp lại lỗi cũ | ❌ Không có lessons-learned capture + recall |
57
+ | Task sau kế thừa task trước | ⚠️ Chỉ ở mức tài liệu AK-Docs (AI phải được bảo mới đọc) và resume gate của *cùng một* task |
58
+ | Đồng bộ memory giữa các role | ❌ Chưa có; `.aiflow/memory/` nằm local trong repo source của Dev — BA/QA/PM không thấy |
59
+
60
+ **Kết luận:** Kit hiện nhớ được *"đang làm gì, đến đâu"* nhưng không nhớ được *"đã học được gì"*.
61
+
62
+ ---
63
+
64
+ ## 3. Kiến Trúc Tổng Quan: "Project Brain" trên AK-Docs
65
+
66
+ ### 3.1 Nguyên tắc thiết kế
67
+
68
+ 1. **Git-based, markdown, human-readable** — không cần vector DB/server ở giai đoạn đầu. Hạ tầng PILOT đã là GitLab + AK-Docs (được `ak init`/`ak update` tự `git pull` — xem `scripts/docs-repo.js`), nên **cross-role sync có sẵn miễn phí qua git**. Memory dạng markdown thì con người review được — khớp triết lý *"AI làm draft — người review & approve"*.
69
+ 2. **Memory cũng phải qua Gate** — AI đề xuất, con người approve. Memory sai còn nguy hiểm hơn không có memory (AI sẽ tự tin lặp lại điều sai).
70
+ 3. **Kế thừa ý tưởng, không kế thừa code** — `99.Memory/` là hệ **mới, độc lập hoàn toàn** với kho `aiflow memory` cũ (`.aiflow/memory/`, JSON — sẽ khai tử). Scorer trong `scripts/memory.js` chỉ kế thừa về ý tưởng (viết mới cho markdown + frontmatter); khái niệm instinct/confidence port từ ECC `continuous-learning-v2`, đổi nơi lưu từ `~/.local/share` (per-machine) sang AK-Docs (per-project, cả team dùng chung).
71
+ 4. **Index-first, load chọn lọc** — không bao giờ load toàn bộ memory vào context (chi tiết Luồng LOAD, mục 4.3).
72
+
73
+ ### 3.2 Cấu trúc lưu trữ: `99.Memory/` trong AK-Docs
74
+
75
+ ```
76
+ AK-Docs/
77
+ ├── 00.Project-Overview/ ... 04.Coding/ ← như hiện tại
78
+ └── 99.Memory/ ← MỚI: Project Brain
79
+ ├── MEMORY.md ← Index: 1 dòng/memory (luôn inject vào context)
80
+ ├── 00.Shared/ ← Tri thức chung mọi role
81
+ │ ├── architecture/ (facts về hệ thống — chia folder theo functionId)
82
+ │ │ ├── F-003_Payment/… và _global/…
83
+ │ ├── domain/ (business rules đã confirm — chia theo functionId)
84
+ │ ├── glossary/ (thuật ngữ JP↔VN↔EN — flat, hầu hết global — Comtor chủ trì)
85
+ │ └── decisions/ (ADR: quyết định + lý do, link ticket — flat)
86
+ ├── 01.Lessons/ ← "Không lặp lỗi cũ", chia theo role
87
+ │ ├── dev/ ├── qa/ ├── ba/ └── pm/ (trong mỗi role chia folder theo functionId + _global/)
88
+ ├── 02.Instincts/ ← Pattern AI tự đề xuất, có confidence
89
+ │ └── approved/ (đã duyệt — được recall; chia theo functionId + _global/)
90
+ ├── 03.Retro/ ← Raw: tóm tắt học được sau mỗi task (⚠ vòng đời
91
+ │ │ commit hay local — xem "Vấn đề mở" dưới mục 3.2)
92
+ │ └── TICKET-123.md
93
+ ├── _deprecated/ ← Memory đã gỡ (soft-remove) — giữ để tra cứu lịch sử
94
+ └── _pending/ ← Nháp LOCAL-ONLY (gitignore, không bao giờ push) — hàng đợi
95
+ duyệt thật là các MR label `memory` trên GitLab
96
+ ```
97
+
98
+ > **Quy ước trạng thái & vòng đời:** memory mới sinh ra (bởi AI hoặc người) nằm ở `_pending/` với `status: pending` — thư mục này là **local-only (gitignore), không bao giờ được push**; nó tồn tại để draft tích lũy trong lúc làm task, để người tạo gom/tự đọc lại trước khi gửi, và để chính họ recall được ngay. Khi `ak memory submit`, file được **move khỏi `_pending/` sang thư mục đích ngay trên branch của MR** — hàng đợi duyệt thực sự là danh sách MR label `memory` trên GitLab, không phải một folder trên `main`. PM **merge** → memory chính thức luôn (CI đã flip `status: approved` + ghi vào `MEMORY.md` trên branch, không cần move lần hai). PM **reject** (close MR kèm lý do) → không gì lọt vào `main`, lý do trace được ngay trong MR đã đóng; CLI trả file về `_pending/` local để sửa gửi lại, hoặc xóa hẳn nếu người đề xuất bỏ. **Memory đã approve được recall trên mọi máy; memory `pending` chỉ được recall trên máy của chính người tạo** (kèm nhãn ⚠ chưa duyệt, điểm ưu tiên thấp hơn) — approve là cổng để tri thức lan sang các thành viên khác. Memory bị gỡ chuyển vào `_deprecated/`, rời khỏi index nhưng không xóa (trace được về sau).
99
+
100
+ > ### ⚠️ Vấn đề mở — nguy cơ mất tri thức khi user không submit (chưa chốt, xử lý sau)
101
+ >
102
+ > **Rủi ro:** `_pending/` giờ là local-only (gitignore). Nếu AI tự đúc kết memory cuối Gate/cuối session nhưng user không chủ động chạy `ak memory submit` — vì quên, vì bận, hoặc vì thấy chưa đáng gửi — thì tri thức đó **không bao giờ đến được với team**, và có thể mất hẳn nếu đổi máy/cài lại môi trường. Đây là đánh đổi trực tiếp của quyết định "PM duyệt qua MR, _pending chỉ là nháp local": an toàn cho chất lượng memory chính thức, nhưng không có lưới đỡ cho phần chưa submit.
103
+ >
104
+ > **Hướng đã cân nhắc, chưa chốt:**
105
+ > 1. **`03.Retro/TICKET-xxx.md` luôn auto-commit vào AK-Docs** (giống các doc Gate khác, không qua `_pending`, không cần duyệt) — làm lưới an toàn tối thiểu: dù memory cụ thể không được submit, tri thức thô vẫn nằm trong git, cả team đọc được, và `ak memory consolidate` có thể quét lại các Retro chưa được khai thác thành memory để nhắc lại.
106
+ > 2. **Checkpoint bắt buộc** ở cuối Gate (đặc biệt Gate 5 trước khi tạo PR): AI liệt kê số draft đang nằm trong `_pending/` và buộc user ra quyết định rõ ràng (submit ngay / cố tình bỏ qua / xóa) — biến "dễ quên" thành "bị nhắc chủ động", không tự ý auto-submit để tránh spam MR chất lượng thấp.
107
+ > 3. Kết hợp cả hai: Retro là lưới an toàn thụ động, checkpoint là nhắc chủ động.
108
+ >
109
+ > **Cần quyết định:** vòng đời chính xác của `03.Retro/` (auto-commit hay cũng local-only như phương án ban đầu), và có áp dụng checkpoint bắt buộc ở Gate nào hay không. Ghi chú lại đây để xử lý ở vòng review sau.
110
+
111
+ ---
112
+
113
+ ## 4. Bốn Luồng Vận Hành Chính
114
+
115
+ Toàn bộ việc quản lý memory gói trong **4 luồng**. Mỗi luồng có thể được **kích hoạt bởi nhiều cách khác nhau** (AI tự động, hoặc con người chủ động) nhưng luôn đi qua đúng một cổng xử lý và một cổng duyệt — không có đường tắt.
116
+
117
+ | Luồng | Trả lời câu hỏi | Ai luôn là người duyệt cuối |
118
+ |---|---|---|
119
+ | **1. Khởi tạo** | Bắt đầu "bộ nhớ" cho dự án như thế nào? | (không cần duyệt riêng — dùng chung cổng duyệt của Luồng Lưu trữ) |
120
+ | **2. Lưu trữ** | Điều gì đáng nhớ trở thành memory chính thức như thế nào? | **PM** |
121
+ | **3. Nạp/Sử dụng** | Khi làm task, AI lấy đúng memory nào, bao nhiêu là đủ? | (tự động theo quy tắc, không cần người duyệt mỗi lần) |
122
+ | **4. Gỡ bỏ** | Memory sai/cũ/dư thừa được loại ra khỏi hệ thống thế nào? | **PM** (đôi khi hỏi ý TL nếu là kỹ thuật) |
123
+
124
+ ---
125
+
126
+ ### Luồng 1 — KHỞI TẠO (Init): tạo "bộ nhớ" cho dự án
127
+
128
+ **Hiểu đơn giản:** giống như mở một cuốn sổ tay chung cho cả team — cần có sổ trước khi ai ghi được gì vào đó. `ak init` chỉ mở sổ trống, **không tự đọc gì cả** (AI đọc tài liệu/code sẽ tốn token, nên phải để người dùng tự quyết định có làm hay không, và làm lúc nào). Muốn soạn sẵn vài trang đầu từ tài liệu có sẵn thì phải chủ động chạy thêm lệnh `ak memory sync` — và nội dung soạn ra vẫn luôn đi qua Luồng 2 (Lưu trữ) để được duyệt, không tự công bố.
129
+
130
+ **Các cách kích hoạt (trigger):**
131
+ - **`ak init` — luôn tự động, không tốn token:** chỉ tạo khung sổ trống (nếu chưa có bộ nhớ) hoặc đồng bộ về máy (nếu đã có) — **không đọc tài liệu/code**, không sinh ghi nhớ nào.
132
+ - **`ak memory sync` — chủ động, do người dùng tự quyết định lúc nào chạy (vì bước này tốn token AI để đọc tài liệu/code):**
133
+ - **Lần đầu chạy** cho dự án → AI đọc TOÀN BỘ tài liệu/code hiện có → soạn hàng loạt ghi nhớ nháp, đỡ phải chờ tích lũy từ con số 0.
134
+ - **Các lần chạy sau** → AI chỉ đọc phần tài liệu/code **THAY ĐỔI** kể từ lần sync gần nhất — tránh đọc lại từ đầu (tốn token) và tránh ghi đè lên ghi nhớ cũ đã duyệt.
135
+
136
+ ```
137
+ Dự án bắt đầu dùng AI Flow Kit
138
+
139
+
140
+ Chạy `ak init`
141
+
142
+
143
+ Đã có "bộ nhớ dự án" chưa?
144
+ │ ĐÃ CÓ RỒI → chỉ đồng bộ về máy, không tạo lại (đi thẳng xuống "Sẵn sàng nhận ghi nhớ mới")
145
+ ▼ CHƯA CÓ
146
+ Tự động tạo khung sổ trống (không đọc gì, không tốn token)
147
+
148
+
149
+ Sẵn sàng nhận ghi nhớ mới — tích lũy dần từ 0 cũng được,
150
+ không bắt buộc phải làm gì thêm
151
+
152
+ ▼ (chỉ khi người dùng CHỦ ĐỘNG muốn có sẵn vài ghi nhớ ban đầu)
153
+ Người dùng tự chạy `ak memory sync`
154
+
155
+
156
+ Đã từng chạy `ak memory sync` cho dự án này chưa?
157
+ │ CHƯA TỪNG (lần đầu) → AI đọc TOÀN BỘ tài liệu/code hiện có
158
+ ▼ ĐÃ TỪNG RỒI → AI chỉ đọc phần THAY ĐỔI kể từ lần sync gần nhất
159
+ AI soạn ghi nhớ NHÁP cho phần vừa đọc
160
+ (kiến trúc hệ thống, thuật ngữ, quy tắc nghiệp vụ đã thấy trong tài liệu)
161
+
162
+
163
+ Chuyển sang LUỒNG LƯU TRỮ để PM duyệt hàng loạt
164
+
165
+
166
+ Trở về "Sẵn sàng nhận ghi nhớ mới" — lần `ak memory sync` kế tiếp
167
+ (bất kỳ lúc nào, do người dùng chủ động) sẽ lại đi qua bước
168
+ "Đã từng chạy... chưa?" ở trên, nhưng lúc đó luôn rơi vào nhánh incremental
169
+ ```
170
+
171
+ **Ai làm gì:**
172
+ - Hệ thống (`ak init`): tự tạo khung thư mục trống hoặc đồng bộ — không đọc tài liệu/code, không cần ai duyệt bước này (chưa có nội dung nào để duyệt, cũng không tốn token AI).
173
+ - Con người: **quyết định có chạy `ak memory sync` hay không và chạy lúc nào** — vì đây là bước duy nhất tốn token AI trong cả luồng này. Có thể bỏ qua hoàn toàn và để memory tích lũy dần qua Luồng 2 trong lúc làm task, không bắt buộc phải sync.
174
+ - AI: chỉ đọc tài liệu/code khi `ak memory sync` được người dùng chủ động chạy — lần đầu đọc toàn bộ, các lần sau chỉ đọc phần thay đổi để tiết kiệm token và tránh ghi đè ghi nhớ cũ quan trọng. AI **không tự công bố**, toàn bộ nháp phải đi qua Luồng 2 để người duyệt (thường là một buổi duyệt tập trung vì số lượng nháp nhiều hơn ngày thường, đặc biệt ở lần full scan đầu tiên).
175
+
176
+ **Hoàn thành khi:** bộ nhớ dự án đã tồn tại và được chia sẻ cho cả team (qua GitLab) — có thể chỉ là khung trống (nếu chưa ai chạy `ak memory sync`), hoặc có thêm vài ghi nhớ chính thức đầu tiên nếu đã chạy.
177
+
178
+ ---
179
+
180
+ ### Luồng 2 — LƯU TRỮ (Store): biến điều đáng nhớ thành memory chính thức
181
+
182
+ **Hiểu đơn giản:** ai cũng có thể "đề xuất" một điều đáng nhớ, nhưng chỉ khi PM đồng ý thì nó mới trở thành memory thật mà cả team dùng được. Giống như một bài viết nội bộ: ai cũng viết được, nhưng phải qua biên tập duyệt bài trước khi đăng. Trong lúc chờ duyệt, bản nháp vẫn được **chính người tạo dùng ngay trên máy của họ** (Luồng 3 nạp kèm nhãn "chưa duyệt") — duyệt là để *người khác* cũng kế thừa được.
183
+
184
+ **Các cách kích hoạt (nhiều nguồn, đều hội tụ về một chỗ):**
185
+
186
+ ```
187
+ Rất nhiều cách một ghi nhớ có thể được tạo ra (bất kỳ nguồn nào dưới đây):
188
+ • [AI tự động] Cuối mỗi bước công việc (Gate), AI tự đúc kết bài học vừa gặp
189
+ • [AI tự động] Hết giờ làm nhưng task chưa xong — AI ghi tạm lại, không bỏ sót
190
+ • [AI tự động] Trước khi hội thoại quá dài bị rút gọn — AI lưu lại trước khi "quên"
191
+ • [Con người chủ động] Gõ lệnh "ghi nhớ" ngay khi nghĩ ra điều quan trọng
192
+ • [Từ Luồng KHỞI TẠO] Lô ghi nhớ từ `ak memory sync` — full scan nếu là lần đầu, incremental nếu các lần sau
193
+
194
+
195
+ Tạo bản NHÁP vào `_pending/` (người tạo dùng được ngay trên máy mình; người khác chưa thấy)
196
+
197
+
198
+ Có trùng với ghi nhớ đã có sẵn không?
199
+ │ TRÙNG → đề xuất CẬP NHẬT bản cũ thay vì tạo bản mới (rồi tiếp tục như dưới)
200
+ ▼ MỚI HOÀN TOÀN
201
+ Gửi đề xuất lên GitLab (giống gửi một "đơn xin duyệt")
202
+
203
+
204
+ Hệ thống tự mời đúng người góp ý theo loại nội dung
205
+ (TL cho kỹ thuật, BA cho nghiệp vụ...)
206
+
207
+
208
+ PM xem xét toàn bộ
209
+ │ CẦN SỬA LẠI → quay lại "Tạo bản NHÁP" ở trên
210
+ │ TỪ CHỐI → Dừng — lý do được ghi lại công khai
211
+ ▼ ĐỒNG Ý
212
+ PM DUYỆT → trở thành memory CHÍNH THỨC
213
+
214
+
215
+ Đồng bộ tới máy của mọi thành viên
216
+ ```
217
+
218
+ **Ai làm gì (bước xử lý):**
219
+
220
+ 1. **Capture (bất kỳ role nào, hoặc AI):** phát hiện điều đáng nhớ → tạo bản nháp. AI làm việc này tự động (cuối Gate, cuối session, trước khi context bị rút gọn); con người làm việc này bằng một lệnh ghi nhớ nhanh bất cứ lúc nào trong lúc làm việc.
221
+ 2. **Chống trùng lặp:** trước khi tạo mới, hệ thống/AI kiểm tra xem tri thức này đã có chưa — nếu có thì đề xuất sửa bản cũ, tránh phình kho nhớ với nhiều bản gần giống nhau.
222
+ 3. **Gửi duyệt:** người đề xuất (hoặc AI thay mặt, nhưng vẫn cần một người "đứng tên" gửi) đóng gói đề xuất thành một "đơn xin duyệt" trên GitLab.
223
+ 4. **Góp ý chuyên môn (không phải quyết định):** hệ thống tự mời TL/BA/QA góp ý nếu nội dung thuộc chuyên môn của họ (ví dụ: ghi nhớ về kỹ thuật thì mời TL, về thuật ngữ thì mời BA/Comtor). Đây là **tham vấn**, không phải phê duyệt.
224
+ 5. **PM xem xét & quyết định:** đây là bước duyệt duy nhất. PM có 3 lựa chọn — yêu cầu sửa (quay lại bước 1), từ chối (dừng, có ghi lý do để tra cứu sau), hoặc đồng ý.
225
+ 6. **Công bố chính thức:** khi PM đồng ý, ghi nhớ chuyển trạng thái "chính thức", được đưa vào danh mục dùng chung, và đồng bộ tới máy của mọi thành viên trong lần làm việc kế tiếp.
226
+
227
+ **Ai duyệt:** **PM — và chỉ PM.** Không role nào khác (kể cả AI, kể cả TL) có quyền tự công bố một ghi nhớ thành chính thức. TL/BA/QA chỉ góp ý.
228
+
229
+ > Chi tiết kỹ thuật của luồng này (quy trình trên GitLab — nhánh nào, ai được gắn vào đề xuất theo loại nội dung, cấu hình bắt buộc) nằm ở mục 5.1.
230
+
231
+ ---
232
+
233
+ ### Luồng 3 — NẠP/SỬ DỤNG (Load): AI dùng memory khi làm task
234
+
235
+ **Hiểu đơn giản:** không phải lúc nào AI cũng cần đọc hết cả cuốn sổ tay — chỉ cần đọc đúng phần liên quan tới việc đang làm. Nạp quá ít thì AI thiếu thông tin, nạp quá nhiều thì AI bị "ngộp" và chậm. Đây là luồng **tự động hoàn toàn**, không có bước con người duyệt (vì chỉ là đọc lại thông tin đã được duyệt sẵn ở Luồng 2).
236
+
237
+ ```
238
+ AI bắt đầu làm 1 công việc mới
239
+
240
+
241
+ BƯỚC 1 — Luôn đọc: danh mục tóm tắt toàn bộ ghi nhớ
242
+ (giống mục lục sách, rất ngắn)
243
+
244
+
245
+ Xác định: đang chạy WORKFLOW nào (coding / create-spec / create-testcase...),
246
+ đang làm ticket/functionId nào
247
+
248
+
249
+ BƯỚC 2 — Chọn lọc: lấy khoảng 10 ghi nhớ liên quan nhất
250
+ và đọc đầy đủ nội dung (gồm cả ghi nhớ pending do chính mình tạo
251
+ trên máy này — gắn nhãn "chưa duyệt")
252
+
253
+
254
+ Ghi nhớ này còn đúng với code/tài liệu hiện tại không?
255
+ │ CÓ THỂ ĐÃ CŨ → vẫn dùng nhưng kèm cảnh báo "nên kiểm tra lại trước khi tin"
256
+ ▼ CÒN MỚI, CHẮC CHẮN
257
+ Dùng bình thường
258
+
259
+
260
+ Trong lúc làm, có chạm tới phần chưa được đọc trước không?
261
+ │ CÓ → BƯỚC 3: đọc thêm đúng lúc cần, không đọc trước cho dư thừa
262
+ ▼ KHÔNG CẦN
263
+ Hoàn thành công việc —
264
+ ghi nhận ghi nhớ nào đã hữu ích, ghi nhớ nào chưa ai dùng tới
265
+ ```
266
+
267
+ **Ai làm gì:**
268
+ - **AI:** tự thực hiện toàn bộ 3 bước mỗi khi bắt đầu một công việc — không cần ai yêu cầu.
269
+ - **Con người:** không tham gia trực tiếp vào luồng này, nhưng là người *hưởng lợi* (AI làm việc thông minh hơn mà không cần được nhắc lại) và là người quyết định các "công thức chọn lọc" (bao nhiêu ghi nhớ là đủ, ưu tiên loại nào cho vai trò nào) thông qua cấu hình dự án.
270
+ - **Không có bước duyệt** — vì nội dung đã được duyệt từ Luồng 2, ở đây chỉ là *đọc lại* đúng thứ cần.
271
+
272
+ **Nguyên tắc quan trọng — không nạp toàn bộ, không nạp cố định:**
273
+ - Nạp **theo workflow đang chạy** (không phân biệt role người dùng — ai cũng chạy được mọi workflow): workflow coding cần lessons dev và kiến trúc kỹ thuật; create-spec cần thuật ngữ và quy tắc nghiệp vụ; create-testcase cần các lỗi từng gặp khi test — mỗi workflow có "gu đọc" riêng, tránh nạp thứ không liên quan gây nhiễu.
274
+ - Nạp **theo mức độ phức tạp của việc đang làm**: việc nhỏ/sửa lỗi nhanh thì đọc ít hơn nhưng ưu tiên tuyệt đối các bài học liên quan trực tiếp; việc lớn động tới nhiều phần thì đọc rộng hơn.
275
+ - Có **giới hạn cứng** về dung lượng được nạp — dù kho ghi nhớ có phình to theo thời gian, phần đọc vào mỗi lần vẫn được giữ ở mức nhỏ và ổn định.
276
+
277
+ > Chi tiết kỹ thuật (công thức chấm điểm để chọn ghi nhớ, cách chỉnh số lượng theo từng vai trò, cơ chế chống phình khi kho nhớ lớn dần) nằm ở mục 5.2.
278
+
279
+ ---
280
+
281
+ ### Luồng 4 — GỠ BỎ (Remove): giữ kho memory sạch, không cũ, không sai
282
+
283
+ **Hiểu đơn giản:** một cuốn sổ tay chỉ hữu ích nếu thông tin trong đó còn đúng. Luồng này lo việc "xé bỏ" hoặc "gạch bỏ" những ghi nhớ đã lỗi thời, đã sai, hoặc dư thừa — nhưng làm rất cẩn trọng, gần giống hệt Luồng Lưu trữ (cùng cơ chế đề xuất → duyệt), chỉ khác chiều: đây là đề xuất **rút** thay vì **thêm**.
284
+
285
+ **Các cách kích hoạt (trigger):**
286
+
287
+ ```
288
+ Các lý do một ghi nhớ bị đưa ra xem xét gỡ (bất kỳ nguồn nào dưới đây):
289
+ • [Tự động] Dọn dẹp định kỳ phát hiện: ghi nhớ lâu không ai dùng tới
290
+ • [Tự động] Code/tài liệu nền đã thay đổi, không ai xác nhận lại là còn đúng nữa
291
+ • [Tự động] Ghi nhớ đã "lên chức" thành quy tắc chung áp dụng cho mọi dự án —
292
+ không cần giữ bản riêng lẻ nữa
293
+ • [Con người chủ động] Ai đó phát hiện một ghi nhớ đang sai hoặc không còn phù hợp
294
+
295
+
296
+ Đề xuất GỠ (dùng đúng cơ chế gửi đề xuất như Luồng LƯU TRỮ)
297
+
298
+
299
+ PM xem xét (hỏi ý TL nếu là ghi nhớ kỹ thuật)
300
+ │ KHÔNG ĐỒNG Ý → Giữ nguyên — lý do được ghi lại
301
+ ▼ ĐỒNG Ý GỠ
302
+ Gỡ theo kiểu nào?
303
+ │ BÌNH THƯỜNG (đa số trường hợp)
304
+
305
+ ẨN khỏi danh mục sử dụng
306
+ (vẫn lưu lại để tra cứu lịch sử, AI không dùng tới nữa)
307
+
308
+ │ ĐẶC BIỆT: sai nghiêm trọng hoặc chứa thông tin nhạy cảm
309
+ │ → XÓA HẲN khỏi kho lưu trữ (thay cho bước ẨN ở trên)
310
+
311
+ Đồng bộ: mọi thành viên không còn thấy ghi nhớ này
312
+ ```
313
+
314
+ **Ai làm gì:**
315
+
316
+ 1. **Phát hiện (nhiều nguồn):**
317
+ - AI/hệ thống tự động phát hiện qua dọn dẹp định kỳ: ghi nhớ lâu ngày không ai dùng tới, hoặc code/tài liệu liên quan đã đổi mà không ai xác nhận lại.
318
+ - AI/hệ thống tự động phát hiện khi một ghi nhớ đã được TL "chắt lọc" thành quy tắc chung cho mọi dự án (xem mục 6) — bản gốc trong dự án không cần giữ song song nữa để tránh trùng lặp.
319
+ - Con người chủ động phát hiện: bất kỳ ai trong lúc làm việc nhận ra một ghi nhớ đang sai hoặc lỗi thời có thể đề xuất gỡ ngay.
320
+ 2. **Đề xuất:** đóng gói giống một "đơn xin duyệt" (đúng cơ chế của Luồng 2), nêu rõ lý do gỡ.
321
+ 3. **PM xem xét & quyết định:** giống Luồng 2 — PM là người duyệt cuối; nếu ghi nhớ thuộc phạm vi kỹ thuật, PM tham vấn TL trước khi quyết.
322
+ 4. **Cách gỡ (2 mức, PM chọn):**
323
+ - **Gỡ mềm (mặc định, gần như mọi trường hợp):** ghi nhớ được ẩn khỏi danh mục — AI không còn đọc/dùng nó nữa — nhưng dữ liệu vẫn được giữ lại đâu đó để sau này có thể tra cứu "vì sao trước đây từng nghĩ vậy". An toàn, có thể khôi phục nếu cần.
324
+ - **Gỡ hẳn (hiếm, chỉ khi có lý do đặc biệt):** xóa hoàn toàn khỏi kho lưu trữ — chỉ dùng khi ghi nhớ chứa thông tin sai nghiêm trọng có thể gây hại nếu còn tồn tại (ví dụ dữ liệu nhạy cảm bị lưu nhầm), vì đây là hành động khó đảo ngược.
325
+ 5. **Đồng bộ:** sau khi PM xử lý xong, mọi máy trong team cập nhật lại — từ session làm việc kế tiếp, ghi nhớ đã gỡ sẽ không còn xuất hiện.
326
+
327
+ **Ai duyệt:** **PM** (giống Luồng Lưu trữ) — tham vấn TL khi cần cho nội dung kỹ thuật.
328
+
329
+ ---
330
+
331
+ ## 5. Chi Tiết Kỹ Thuật Bổ Sung (dành cho người triển khai)
332
+
333
+ Phần này đi sâu vào cách thực hiện 4 luồng trên bằng công cụ cụ thể (GitLab, CLI, file, cấu hình) — dành cho AI Testing Team/TechLead khi implement, không cần thiết cho người chỉ muốn hiểu "memory hoạt động ra sao".
334
+
335
+ ### 5.1 Vai trò & Quy trình GitLab chi tiết (hỗ trợ Luồng LƯU TRỮ và GỠ BỎ)
336
+
337
+ #### 5.1.1 Bảng vai trò quản lý memory (AI · DEV · BA · QA · PM · TL)
338
+
339
+ Nguyên tắc phân quyền: **mọi role đều được tổng hợp memory và gửi thành đề xuất; PM là người duy nhất review & approve (cả thêm mới và gỡ bỏ); TL định kỳ chắt lọc memory dùng chung để tổng hợp thành skills/rules cấp kit cho mọi dự án.**
340
+
341
+ | Role | Capture / đề xuất thêm | Đề xuất gỡ | Review & Approve | Chắt lọc dùng chung (promotion) | Recall / sử dụng |
342
+ |---|---|---|---|---|---|
343
+ | **AI** | ⭐ Nguồn chính: tự tổng hợp từ hội thoại, bootstrap | ✅ Tự phát hiện memory stale/không ai dùng | ❌ **Không bao giờ tự approve.** Chỉ hỗ trợ PM: tóm tắt đề xuất, check trùng lặp, check template, cảnh báo mâu thuẫn `.rules/` | Sinh danh sách candidates cho TL | ✅ Recall 3 lớp (Luồng 3) |
344
+ | **DEV** | ✅ Lessons dev, architecture facts | ✅ | Comment góp ý (không quyết) | — | ✅ |
345
+ | **BA** | ✅ Domain facts, glossary, distill từ QnA khách | ✅ | **Consult** cho `domain/`, `glossary/` khi PM tag | — | ✅ |
346
+ | **QA** | ✅ Lessons qa, bẫy test môi trường | ✅ | Comment góp ý | — | ✅ |
347
+ | **PM** | ✅ Decisions, lessons pm | ✅ | ⭐ **Approver duy nhất** — duyệt cả thêm mới và gỡ bỏ; phân xử khi mâu thuẫn | Xác nhận danh sách candidates trước khi chuyển TL | ✅ |
348
+ | **TL** | ✅ Architecture facts, technical decisions | ✅ | **Consult** bắt buộc khi PM duyệt nội dung kỹ thuật/instinct | ⭐ **Chắt lọc memory dùng chung → skills/rules của kit** (Flow B dưới) | ✅ |
349
+
350
+ > ⭐ = vai trò chủ trì · ✅ = được làm/tham gia · Consult = PM tag vào để góp ý chuyên môn, quyền quyết vẫn ở PM.
351
+
352
+ **Checklist PM khi duyệt đề xuất (thêm hoặc gỡ):** (1) đúng sự thật và còn hiệu lực? (2) trace được nguồn gốc? (3) 1 nội dung ngắn gọn, đúng khuôn mẫu? (4) có hành động cụ thể áp dụng được? (5) phạm vi áp dụng hẹp nhất có thể? (6) không mâu thuẫn `.rules/`? (7) đã tham vấn đúng người cho nội dung nhạy cảm chưa?
353
+
354
+ #### 5.1.2 Mô hình nhánh Git (`main` là nhánh chính)
355
+
356
+ ```
357
+ Repo AK-Docs (GitLab) — kho memory của DỰ ÁN
358
+ main ────●─────────●─────────●──────────→ main = memory chính thức (protected)
359
+ \ \ ↑ merge (PM approve)
360
+ \ memory/TICKET-124 ← QA đề xuất từ task test
361
+ memory/TICKET-123 ← DEV/AI đề xuất từ task coding
362
+ memory/sync-init ← `ak memory sync` lần đầu, full scan (Luồng 1)
363
+ memory/sync-2026-07 ← `ak memory sync` các lần sau, incremental (Luồng 1)
364
+ memory/remove-mem-042 ← đề xuất gỡ 1 memory cụ thể
365
+
366
+ Repo ai-flow-kit (GitLab) — kho skills/rules DÙNG CHUNG mọi dự án
367
+ main ────●───────────────●──────────→
368
+ \ ↑ merge (AI Testing Team approve)
369
+ promotion/sprint-12 ← TL chắt lọc mỗi sprint
370
+ ```
371
+
372
+ **Cấu hình GitLab (làm 1 lần khi setup dự án):**
373
+
374
+ | Hạng mục | Cấu hình |
375
+ |---|---|
376
+ | Protected branch | `main` của AK-Docs: không push trực tiếp, chỉ merge qua Merge Request (MR) |
377
+ | Approval rule | MR có label `memory` bắt buộc ≥1 approval từ **PM** |
378
+ | CODEOWNERS | `99.Memory/00.Shared/architecture/ @TL` · `00.Shared/domain/ @BA` · `00.Shared/glossary/ @BA` (hoặc @Comtor) · `02.Instincts/ @TL` → GitLab tự gợi ý consult reviewer theo diff |
379
+ | MR template `memory.md` | Nhúng checklist PM (mục 5.1.1) + trường: ticket nguồn, danh sách mem-id, loại (thêm/gỡ) |
380
+ | CI pipeline (Phase 2) | Job `memory-lint`: validate frontmatter đủ trường, ≤150 từ, 1 fact/file, id không trùng, id khớp đường dẫn file, **quét secret/PII pattern** (chặn TRƯỚC khi merge — gỡ khỏi lịch sử git về sau rất đắt) · Job `memory-finalize` (khi MR đủ approval): flip `status`, điền `reviewed_by`, rebuild `MEMORY.md` |
381
+
382
+ **Flow A — Đề xuất thêm/sửa memory (Luồng LƯU TRỮ, chi tiết trên GitLab):**
383
+
384
+ | Step | Ai | Hành động trên GitLab |
385
+ |---|---|---|
386
+ | A1 | AI / bất kỳ role nào | Tạo memory draft vào `_pending/` local |
387
+ | A2 | Người đề xuất | `ak memory submit` → CLI tạo branch `memory/<ticket-id>` từ `main`, move file về thư mục đích, cập nhật nháp `MEMORY.md`, push, mở MR: label `memory`, assignee `@PM`, title `memory(TICKET-123): +2 lesson/dev, +1 fact/domain` |
388
+ | A3 | GitLab | CODEOWNERS tự thêm consult reviewer theo thư mục bị đụng; CI chạy `memory-lint` |
389
+ | A4 | Consult (TL/BA/QA) | Comment/suggestion trên diff (nếu được tag) — không có quyền merge |
390
+ | A5 | PM | Review theo checklist → yêu cầu sửa (quay lại A2) / close MR kèm lý do (= reject) / **Approve** |
391
+ | A6 | CI (`memory-finalize`) | Flip `status: approved`, điền `reviewed_by: PM`, rebuild `MEMORY.md` — commit lên branch |
392
+ | A7 | PM | **Merge vào `main`** (squash, message `memory: TICKET-123 (+3)`) → xóa branch |
393
+ | A8 | Mọi máy | Session-start / `ak use` pull `main` → mọi role có memory mới từ session kế tiếp. Pull có timeout ngắn; lỗi mạng/VPN → **warning kèm nội dung lỗi + tiếp tục dùng bản local hiện có** (mục 5.2 bước 0) |
394
+
395
+ **Flow A' — Đề xuất gỡ memory (Luồng GỠ BỎ, chi tiết trên GitLab):** giống Flow A nhưng branch tên `memory/remove-<mem-id>`, MR mô tả lý do gỡ + kiểu gỡ (soft/hard); `memory-finalize` với soft-remove sẽ move file sang `_deprecated/` và xóa dòng khỏi `MEMORY.md`; với hard-remove sẽ `git rm` file (PM cần xác nhận rõ trong MR vì khó đảo ngược). **Lưu ý:** `git rm` chỉ xóa khỏi bản hiện tại, KHÔNG xóa khỏi lịch sử git — muốn xóa triệt để (dữ liệu nhạy cảm) phải rewrite history bằng `git filter-repo` trên repo dùng chung, rất tốn kém. Vì vậy tuyến phòng thủ chính là job `memory-lint` quét secret/PII chặn từ trước khi merge.
396
+
397
+ **Flow B — TL chắt lọc memory dùng chung thành skills/rules (định kỳ mỗi sprint):**
398
+
399
+ | Step | Ai | Hành động |
400
+ |---|---|---|
401
+ | B1 | TL | Chạy `ak memory consolidate --candidates` trên AK-Docs `main` → danh sách memory có hit cao / lặp ≥2 ticket / xuất hiện ở ≥2 dự án |
402
+ | B2 | TL (+ PM xác nhận) | Phân loại từng candidate: (a) đặc thù dự án → giữ nguyên ở `99.Memory/` · (b) đúng cho mọi dự án cùng stack → **rule/skill của kit** · (c) tri thức tham khảo chung → **Shared-Docs** |
403
+ | B3 | TL | Tạo branch `promotion/<sprint>` trên repo **ai-flow-kit**: viết rule vào `custom/rules/` hoặc skill vào `custom/skills/`; mở MR, mô tả link về các mem-id nguồn (trace 2 chiều) |
404
+ | B4 | AI Testing Team | Review MR trên repo kit (chuẩn chung ảnh hưởng MỌI dự án nên cổng duyệt cao hơn PM dự án) → merge `main` của kit |
405
+ | B5 | Kit release | Các dự án chạy `ak update` → `.rules/` được wipe & copy lại (init.js:189-191) → rule mới tự lan ra mọi dự án |
406
+ | B6 | TL | Quay lại AK-Docs: mở MR **đề xuất gỡ** (Luồng 4, R3) memory đã promote → PM duyệt → chuyển `_deprecated/`, note `→ custom/rules/xyz.md` |
407
+
408
+ > Vì sao 2 cổng duyệt khác nhau: memory là tri thức **một dự án** → PM dự án quyết; rule/skill là chuẩn **mọi dự án** → phải qua AI Testing Team trên repo kit.
409
+
410
+ ### 5.2 Cơ chế tải & tối ưu memory (hỗ trợ Luồng NẠP/SỬ DỤNG)
411
+
412
+ **Mô hình 3 lớp** (không bao giờ load toàn bộ):
413
+
414
+ | Lớp | Load khi nào | Nội dung | Kích thước |
415
+ |---|---|---|---|
416
+ | **Lớp 1 — Index** | Luôn luôn, mỗi session | `MEMORY.md` (1 dòng/memory: id, type, scope, hook 1 câu) + quy tắc ưu tiên (`.rules` > memory) | ~1–3 KB |
417
+ | **Lớp 2 — Relevant set** | Session start, theo ticket | Top-N memory match workflow + functionId + tags (mặc định N=10) — **nội dung đầy đủ**; cộng thêm memory `_pending/` của chính user trên máy này (nhãn ⚠ chưa duyệt) | ≤ `injectBudget` (mặc định ~2000 tokens) |
418
+ | **Lớp 3 — On-demand** | Giữa task, khi cần | AI tự `Read` file memory cụ thể khi thấy dòng index liên quan đến việc đang làm | Theo nhu cầu |
419
+
420
+ **Step by step tại session start (`session-start.js` mở rộng):**
421
+
422
+ 0. Pull AK-Docs với timeout ngắn. Pull lỗi (mạng/VPN/conflict) → **in warning kèm nội dung lỗi** cho user biết và **tiếp tục dùng bản local hiện có** — không bao giờ chặn session vì thiếu mạng.
423
+ 1. Đọc `.aiflow/context/current.json` → lấy `taskId`, `functionId`, title, description, keywords; xác định **workflow đang chạy** (coding / create-spec / create-testcase / gen-doc) — không phân biệt role người dùng.
424
+ 2. Quét `99.Memory/` (file `status: approved` + file trong `_pending/` do chính user này tạo), parse frontmatter.
425
+ 3. **Chấm điểm** từng memory (scorer viết mới — kế thừa ý tưởng từ `loadRelevantMemories` trong `scripts/memory.js` cũ, không tái dùng code):
426
+
427
+ ```
428
+ score = 3 × match(memory nằm trong folder functionId của ticket)
429
+ + 2 × match(workflows chứa workflow đang chạy)
430
+ + 2 × số phần tử trùng giữa `tags:` của memory và keywords của ticket
431
+ (CHỈ so khớp trên frontmatter `tags:` đã chuẩn hóa ascii-lowercase —
432
+ KHÔNG so trên title/body: tiếng Nhật không tách từ bằng khoảng trắng,
433
+ tiếng Việt vướng dấu — keyword match trên body sẽ gãy)
434
+ + 1 × confidence
435
+ − 1 × (tuổi memory > 90 ngày và hit count == 0)
436
+ − 0.5 × (status == pending — bản local chưa duyệt của chính user)
437
+ ; type == lesson được +1 khi workflow là gate coding/review
438
+ ```
439
+
440
+ 4. Inject **Lớp 1**: toàn bộ `MEMORY.md` + chỉ dẫn ưu tiên `.rules/` khi mâu thuẫn.
441
+ 5. Inject **Lớp 2**: lấy memory theo điểm giảm dần, dừng khi đủ N hoặc chạm `injectBudget` tokens.
442
+ 6. Ghi telemetry: số memory inject, tổng tokens.
443
+ 7. Trong task, **Lớp 3**: CLAUDE.md Gate 1 quy định bắt buộc search `99.Memory/` theo functionId/tên module trước khi phân tích hoặc sửa module chưa có trong context.
444
+
445
+ **Profile theo workflow (mặc định, override được)** — gắn với *workflow đang chạy*, không gắn với role của người dùng (ai cũng có thể chạy mọi workflow):
446
+
447
+ | Workflow đang chạy | Memory được ưu tiên load (Lớp 2) |
448
+ |---|---|
449
+ | coding — Gate 1–5 | `architecture` functionId liên quan + `lessons/dev` + `instincts` + `decisions` technical |
450
+ | create-spec | `domain` + `glossary` + `lessons/ba` + `decisions` business liên quan |
451
+ | create-testcase / execute-test | `lessons/qa` + `domain` + `glossary` |
452
+ | gen-doc / không xác định (mặc định) | `decisions` + `03.Retro` gần nhất + `architecture` functionId liên quan |
453
+
454
+ **Điều chỉnh lượng theo độ phức tạp task:** ticket chạm nhiều module/mô tả dài → tăng N (10→15); hotfix nhỏ → giảm N (10→5) nhưng ưu tiên tuyệt đối lessons của đúng module; bug fix → bơm thêm toàn bộ lessons trong folder functionId liên quan (`01.Lessons/*/<functionId>/`) kể cả vượt N.
455
+
456
+ **Cơ chế chống phình khi kho nhớ lớn dần:**
457
+
458
+ - **Hard budget:** `injectBudget` (config `.aiflow/state.json`) là trần cứng cho Lớp 2 — vượt trần thì cắt theo điểm số, không bao giờ tràn.
459
+ - **Giới hạn kích thước từng memory:** template enforce body ≤150 từ, 1 file = 1 fact.
460
+ - **Consolidate định kỳ:** `ak memory consolidate` (tay hoặc CI weekly) — dedup/merge memory trùng, rebuild `MEMORY.md`.
461
+ - **Confidence + decay:** memory được trích dẫn → hit count **ghi local vào telemetry** (`.aiflow/`) — KHÔNG commit lên `main` mỗi lần recall (main là protected branch, không thể mở MR cho từng lần +1); `ak memory consolidate` định kỳ tổng hợp telemetry từ các máy và cập nhật `hits` trong frontmatter qua **một MR duy nhất**. Cũ >90 ngày và hit=0 → hạ confidence → dưới ngưỡng thì chuyển sang đề xuất gỡ (Luồng 4, trigger R1).
462
+ - **Scope hẹp mặc định:** ưu tiên gán `scope: <functionId>` thay vì `global` khi tạo memory.
463
+ - **Giám sát:** telemetry cho báo cáo tokens memory/session, tỷ lệ memory được dùng; cảnh báo khi Lớp 1+2 > 5% context.
464
+ - **Override per-project:** `.aiflow/state.json` cho phép chỉnh `memory.topN`, `memory.injectBudget`, `memory.profiles.<role>`.
465
+
466
+ ### 5.3 Templates & cấu trúc file Memory
467
+
468
+ #### Danh mục file trong `99.Memory/`
469
+
470
+ | File/Thư mục | Loại nội dung | Ví dụ | Ai tạo |
471
+ |---|---|---|---|
472
+ | `MEMORY.md` | Index — 1 dòng/memory đã approve | `- [mem-F002-order-retention](00.Shared/domain/F-002_Order/order-retention.md) — Đơn hủy giữ record 5 năm (fact, F-002)` | CLI tự sinh khi approve — **không sửa tay** |
473
+ | `00.Shared/architecture/<functionId>/*.md` | Fact kỹ thuật về hệ thống | "Auth dùng JWT, refresh 7 ngày, revoke qua Redis blacklist" | AI đề xuất / Dev lưu |
474
+ | `00.Shared/domain/<functionId>/*.md` | Business rule khách đã confirm | "Đơn hàng hủy vẫn giữ record 5 năm (luật kế toán JP)" | BA / AI từ QnA |
475
+ | `00.Shared/glossary/*.md` | Thuật ngữ JP↔VN↔EN | "受注 = đơn nhận (sales order) — KHÔNG dịch là 発注 (purchase order)" | Comtor |
476
+ | `00.Shared/decisions/*.md` | ADR: quyết định + lý do + link ticket | "Chọn soft-delete toàn bộ bảng — lý do..., TICKET-45" | AI đề xuất tại gate / TL, PM |
477
+ | `01.Lessons/{dev,qa,ba,pm}/<functionId>/*.md` | Bài học từ lỗi đã gặp | "Đừng dùng `@Data` trên Entity — gây bug lazy loading, TICKET-45" | AI Retrospect / thành viên role |
478
+ | `02.Instincts/approved/<functionId>/*.md` | Pattern hành vi cho AI, có confidence | "Khi requirement nhắc 'duplicate email' → check `existsByEmail` trước khi save" | AI đề xuất |
479
+ | `03.Retro/TICKET-xxx.md` | Raw retrospect mỗi task — không cần duyệt, không recall trực tiếp | Tóm tắt học được, signals, memory đã đề xuất | AI |
480
+ | `_pending/` | Nháp local-only (gitignore) chờ submit — hàng đợi duyệt thật là MR label `memory` trên GitLab; reject → CLI trả file về đây hoặc xóa | — | AI / user |
481
+ | `_deprecated/` | Memory đã gỡ (soft-remove) — giữ để tra cứu lịch sử | — | CLI khi PM duyệt gỡ |
482
+
483
+ #### Template file memory (`custom/templates/memory/memory-item.md`)
484
+
485
+ ```markdown
486
+ ---
487
+ id: mem-F003-prevent-429-error # CLI tự sinh từ vị trí file: mem-<functionId>-<slug>
488
+ # slug do AI đặt — ngắn, đọc là hiểu memory lưu gì
489
+ # (vd: basic-payment-flow, refund-flow, prevent-429-error).
490
+ # KHÔNG có timestamp: trùng slug trong cùng folder chính là
491
+ # tín hiệu chống trùng lặp — CLI hỏi "memory tương tự đã có,
492
+ # cập nhật bản cũ thay vì tạo mới?" (Luồng 2, bước 2)
493
+ type: lesson | fact | decision | glossary | instinct
494
+ workflows: [coding, create-testcase] # workflow nào cần recall; [all] nếu mọi workflow
495
+ tags: [payment, refund, http-429] # ascii-lowercase, AI tự sinh khi tạo draft —
496
+ # scorer CHỈ so khớp trên trường này (không so body — JP/VN)
497
+ scope: F-003_Payment | global # trùng với folder chứa file; global → file đặt trong _global/
498
+ confidence: 0.6 # AI tự chấm 0.3–0.7; reviewer chỉnh khi duyệt
499
+ source: TICKET-123 / Gate 4 # trace: học được từ đâu
500
+ status: pending # pending | approved | deprecated
501
+ hits: 0 # consolidate cập nhật từ telemetry local — không sửa tay, không commit mỗi lần recall
502
+ created: 2026-07-09
503
+ reviewed_by: # điền khi approve
504
+ refs: [] # (tùy chọn) file/dir code hoặc docs mà memory phụ thuộc — xem mục 5.4
505
+ verified_commit: # commit đã verify refs lần cuối (CLI tự điền)
506
+ stale: false # hook tự set true khi refs thay đổi sau verified_commit
507
+ ---
508
+ <Nội dung: TỐI ĐA 150 từ, 1 file = 1 fact duy nhất.>
509
+
510
+ **Áp dụng:** <hành động cụ thể AI/người cần làm khi gặp tình huống này.>
511
+ ```
512
+
513
+ **Quy tắc đặt file & id:** các loại gắn với chức năng (`architecture/`, `domain/`, `01.Lessons/*`, `02.Instincts/approved/`) chia folder theo functionId — `.../F-003_Payment/<slug>.md`; memory không thuộc chức năng nào đặt trong `_global/`. `glossary/` và `decisions/` giữ flat (hầu hết là global). id suy ra từ đường dẫn (`mem-<functionId>-<slug>`) nên không cần bộ đếm tập trung — không đụng độ khi nhiều máy tạo draft phân tán; đổi scope = move file (git giữ lịch sử). Recall theo functionId của Lớp 2 nhờ vậy chỉ là liệt kê thư mục, không phải quét toàn kho.
514
+
515
+ **Dòng index trong `MEMORY.md`:** `- [mem-id](đường/dẫn/file.md) — <hook 1 câu, ≤15 từ> (type, scope, workflows)`
516
+
517
+ **Template Retro** (`03.Retro/TICKET-xxx.md`): 4 mục — Học được gì mới / Lỗi đã gặp & cách xử lý / Người đã sửa AI ở đâu / Memory đã đề xuất (id + trạng thái).
518
+
519
+ ### 5.4 Memory về code & cơ chế chống lỗi thời (hỗ trợ Luồng NẠP và Luồng GỠ BỎ)
520
+
521
+ **Câu hỏi gốc:** memory có hỗ trợ việc đọc code không — đã đọc code một lần thì lần sau không cần đọc lại?
522
+
523
+ **Trả lời: CÓ, nhưng tách 2 tầng** vì "hiểu biết về code" có 2 loại với vòng đời khác nhau:
524
+
525
+ | Tầng | Nội dung | Sinh bởi | Cần người duyệt? | Chống lỗi thời |
526
+ |---|---|---|---|---|
527
+ | **Codemap** (derived — máy suy ra được) | Bản đồ cấu trúc: module nào làm gì, entrypoint, data flow, dependency | Máy/AI tự sinh từ code — kit **đã có GitNexus** index (`.aiflow/gitnexus-status.json`) | ❌ Không — tái sinh được, sai thì regenerate | Tái sinh incremental theo git diff sau mỗi merge |
528
+ | **Architecture facts** (curated — kết luận đắt giá) | "Vì sao thiết kế như vậy", bẫy, invariant ngầm | AI đề xuất → lưu `00.Shared/architecture/` qua Luồng LƯU TRỮ | ✅ PM (consult TL) | Anchor vào git qua `refs` + staleness check (dưới) |
529
+
530
+ > **Nguyên tắc cốt lõi: memory KHÔNG lưu code, chỉ lưu KẾT LUẬN về code.** Source of truth luôn là code.
531
+
532
+ **Cơ chế sync khi code/tài liệu thay đổi:**
533
+
534
+ 1. Khi tạo memory phụ thuộc code/docs, khai `refs: [đường dẫn file/dir]` + `verified_commit` (CLI tự điền commit hiện tại).
535
+ 2. Hook (session-start hoặc post-merge) chạy `git diff --name-only <verified_commit>..HEAD` giao với `refs` → có giao thì set `stale: true` (không xóa, không rời index).
536
+ 3. Khi recall (Luồng NẠP), memory stale vẫn được dùng nhưng kèm cảnh báo verify lại.
537
+ 4. AI dùng memory stale trong task → verify nhanh bằng cách đọc lại `refs`: đúng thì cập nhật `verified_commit`/`stale: false`; sai thì đề xuất bản sửa (qua Luồng LƯU TRỮ).
538
+ 5. `ak memory consolidate` định kỳ: memory stale lâu không được verify → hạ confidence → đề xuất gỡ (Luồng GỠ BỎ, trigger R2).
539
+ 6. Tài liệu nghiệp vụ dùng cơ chế y hệt — `refs` trỏ tới file spec/QnA trong AK-Docs.
540
+ 7. Codemap: regenerate incremental sau merge, tự động, không cần duyệt.
541
+
542
+ Đây là bài toán cache invalidation kinh điển, giải bằng cách anchor memory vào git commit — rẻ, chính xác ở mức file, tận dụng hạ tầng git sẵn có.
543
+
544
+ ---
545
+
546
+ ## 6. Quan Hệ Giữa `.rules/` Và `99.Memory/`
547
+
548
+ **Vẫn cần `.rules/`, và không merge** — nối bằng đường "promotion" (Flow B, mục 5.1.2).
549
+
550
+ | | `.rules/` | `99.Memory/` |
551
+ |---|---|---|
552
+ | Bản chất | **Quy định** (prescriptive) — chuẩn phải tuân theo | **Kinh nghiệm** (learned) — điều dự án rút ra được |
553
+ | Nguồn | Top-down: AI Testing Team soạn trong `custom/rules/` của kit, phân phối qua `ak init` | Bottom-up: sinh từ hội thoại/task, PM approve qua Luồng LƯU TRỮ |
554
+ | Phạm vi | Chung theo stack (java/javascript/php) | Đặc thù từng dự án |
555
+ | Cách nạp | **Luôn luôn load**, tuân thủ 100% | **Recall chọn lọc** (Luồng NẠP) |
556
+ | Tính ổn định | Ổn định, kiểm soát tập trung | Sống, tăng dần, có confidence/decay, có thể bị gỡ |
557
+
558
+ **Lý do kỹ thuật quyết định không merge:** `scripts/init.js:189-191` mỗi lần `ak init`/`ak update` chạy `fs.emptyDir(rulesDir)` rồi copy đè từ kit — `.rules/` bị xóa trắng và ghi lại từ trung tâm mỗi lần update. Merge memory vào `.rules/` sẽ khiến tri thức dự án tích lũy bị wipe ở lần update kế tiếp.
559
+
560
+ **Quy tắc ưu tiên khi recall:** nếu memory mâu thuẫn với `.rules/`, `.rules/` thắng — báo mâu thuẫn để người xử lý.
561
+
562
+ ```
563
+ Hội thoại/task → Luồng LƯU TRỮ (PM approve)
564
+
565
+ pattern lặp lại ≥2 ticket, mang tính quy chuẩn?
566
+
567
+ ┌──────────────────┴────────────────────────┐
568
+ ▼ ▼
569
+ Chỉ đúng cho dự án này Đúng cho mọi dự án cùng stack
570
+ → giữ ở 99.Memory/00.Shared/ → TL chắt lọc (Flow B) → MR vào
571
+ custom/rules|skills của kit,
572
+ AI Testing Team duyệt → ak update
573
+ lan ra mọi dự án; bản gốc được
574
+ đưa vào Luồng GỠ BỎ
575
+ ```
576
+
577
+ **`99.Memory` là vườn ươm, `.rules` là nơi luật đã trưởng thành.**
578
+
579
+ ---
580
+
581
+ ## 7. Kế Thừa Từ Memory Của Các AI Tools Hiện Có
582
+
583
+ ### 7.1 Claude Memory — kế thừa FORMAT, không kế thừa NƠI LƯU
584
+
585
+ Claude Code có 2 tầng memory native: **CLAUDE.md** (curated context, load mỗi session) và **Auto Memory** (`~/.claude/projects/<hash>/memory/`: `MEMORY.md` index + mỗi fact 1 file markdown có frontmatter, Claude tự đọc/ghi qua session).
586
+
587
+ | Khía cạnh | Claude Auto Memory | Yêu cầu của ta | Kết luận |
588
+ |---|---|---|---|
589
+ | Format (index + 1 fact/file markdown + frontmatter) | ✅ | ✅ | **Kế thừa nguyên** — `99.Memory/` (mục 3.2) chính là pattern này |
590
+ | Nơi lưu | `~/.claude/` — per-machine, per-user | Team-shared, cross-role, git-sync | ❌ Không kế thừa |
591
+ | Kiểm duyệt | Không có | Bắt buộc (Luồng LƯU TRỮ) | ❌ Không kế thừa |
592
+ | Trace nguồn gốc | Không | Bắt buộc (`source`) | ❌ Không kế thừa |
593
+
594
+ **Cách chung sống:** Claude Auto Memory tiếp tục chạy cho tri thức *cá nhân*; tri thức *dự án* bắt buộc đi qua Luồng LƯU TRỮ vào `99.Memory/`. CLAUDE.md chỉ dẫn rõ điều này để tránh tri thức dự án rơi vào silo per-user.
595
+
596
+ ### 7.2 Các AI tools khác
597
+
598
+ | Tool | Cơ chế memory | Đặc điểm | Dùng được gì cho ta |
599
+ |---|---|---|---|
600
+ | **Cursor** | `.cursor/rules` + Memories (tự sinh từ chat) | Memories per-user, không review; Rules git-sync được | Rules ≈ `.rules/` của kit |
601
+ | **Gemini CLI** | `GEMINI.md` + `/memory add` | Chỉ context file tĩnh, không learned memory + duyệt | Kit đã sinh `GEMINI.md` — trỏ thêm về `99.Memory/` |
602
+ | **Windsurf** | Rules + Memories | Per-user, giống Cursor | — |
603
+ | **Cline** | "Memory Bank" — file markdown trong repo | Git-based — gần thiết kế của ta nhất, nhưng không có pending/review/role/confidence | Xác nhận hướng markdown-in-git là đúng |
604
+ | **GitHub Copilot** | `.github/copilot-instructions.md` | Instruction tĩnh | — |
605
+ | **mem0 / Letta / Zep / MCP memory server** | Vector/graph, semantic search | Mạnh recall ngữ nghĩa, cần infra, khó review/trace | Ứng viên Phase 3 khi memory >200 file — chỉ làm lớp index phụ |
606
+
607
+ **Kết luận:** ngành hội tụ về 2 pattern — instruction file tĩnh (git-sync, không tự học) và auto-learned memory (tự học nhưng per-user, không duyệt). **Chưa tool nào ship sẵn "team-shared memory có review"** — đúng phần ta cần tự xây. Vì `99.Memory/` là markdown thuần trong git nên **tool-agnostic**: cùng một kho phục vụ được mọi assistant mà kit hỗ trợ (Claude, Cursor, Gemini...).
608
+
609
+ ---
610
+
611
+ ## 8. Lộ Trình Triển Khai
612
+
613
+ ### Phase 1 — Quick wins (~1 tuần)
614
+
615
+ 1. Template `99.Memory/` (mục 3.2, 5.3); `ak init` tạo skeleton + config + entry `.gitignore` cho `_pending/` (local-only, không bao giờ push) (Luồng KHỞI TẠO).
616
+ 2. Viết module memory-load **mới** cho `99.Memory/` (markdown + frontmatter) và wire vào `session-start.js` với 3 lớp load (Luồng NẠP, mục 5.2). Kho JSON cũ `.aiflow/memory/` và các lệnh `aiflow memory save/get/search` **khai tử** — chỉ kế thừa ý tưởng scorer từ `scripts/memory.js`, không tái dùng code.
617
+ 3. Thêm bước "Retrospect + đề xuất memory" vào Gate cuối của cả 4 workflow (Luồng LƯU TRỮ); lệnh `ak memory submit` tạo branch + MR; setup GitLab: protected `main`, approval rule PM, CODEOWNERS, MR template (mục 5.1).
618
+
619
+ > **Rollout:** hook `session-start.js` được copy vào từng project khi `ak init`/`ak update` (`scripts/init.js`) — logic memory mới chỉ có hiệu lực sau khi mọi project trong PILOT chạy `ak update`. Đưa bước này vào checklist triển khai PILOT.
620
+
621
+ ### Phase 2 — Tự động hóa capture (~2-3 tuần)
622
+
623
+ 4. Lệnh `ak memory sync` (chủ động, người dùng tự chạy khi muốn) — full scan nếu là lần đầu, incremental nếu các lần sau (Luồng KHỞI TẠO).
624
+ 5. Port `PreCompact`/`SessionEnd` hook từ ECC `hooks/memory-persistence/` (Luồng LƯU TRỮ, trigger tự động).
625
+ 6. Lệnh ghi nhớ nhanh (`/remember`); scorer đầy đủ + profiles theo role (Luồng NẠP).
626
+ 7. Staleness check cho memory có `refs` (mục 5.4): hook so `git diff` với `verified_commit`, flag `stale`, cảnh báo khi recall.
627
+ 8. CI pipeline cho AK-Docs (mục 5.1): job `memory-lint` + job `memory-finalize`.
628
+ 9. `ak memory` lệnh đề xuất gỡ (Luồng GỠ BỎ) + soft/hard remove trên GitLab.
629
+
630
+ ### Phase 3 — Học tập nâng cao
631
+
632
+ 10. Port `continuous-learning-v2` scope hẹp (chỉ observe Gate 3-4 của Dev), instinct vào `_pending/`.
633
+ 11. `ak memory consolidate`: dedup, hit count, confidence/decay; sinh candidate cho cả Luồng GỠ BỎ và Flow B (promotion cho TL); promote pattern ≥2 dự án lên Shared-Docs.
634
+ 12. Khi memory > ~200 file: cân nhắc search ngữ nghĩa (embedding local hoặc MCP memory server) — storage gốc vẫn markdown/git.
635
+
636
+ ### Metric đo trong PILOT
637
+
638
+ - Số lần AI trích dẫn memory trong Gate 1 / tổng số task.
639
+ - Số memory approve mỗi sprint; tỷ lệ approve/reject (chất lượng đề xuất).
640
+ - Số memory bị gỡ và lý do (đo chất lượng dọn dẹp, không phải thất bại).
641
+ - Số lần lesson ngăn được lỗi lặp lại (reference trong Gate review doc).
642
+ - Tokens memory inject/session (giữ < 5% context).
643
+ - Tuổi trung bình hàng đợi `_pending/` và thời gian từ draft → approve (đo nghẽn duyệt của PM — rủi ro vận hành lớn nhất của thiết kế này).
644
+ - Tỷ lệ memory `stale` được verify lại (đo cơ chế chống lỗi thời mục 5.4 có thực sự chạy).
645
+
646
+ ---
647
+
648
+ ## Phụ Lục — File/Đường Dẫn Liên Quan
649
+
650
+ | Thành phần | Đường dẫn |
651
+ |---|---|
652
+ | Memory CLI cũ (legacy — khai tử, không liên quan `99.Memory/`; chỉ kế thừa ý tưởng scorer) | `scripts/memory.js` |
653
+ | Session hooks đang cài vào project | `scripts/hooks/session-start.js`, `scripts/hooks/session-stop.js` |
654
+ | Cơ chế sync AK-Docs / Shared-Docs | `scripts/docs-repo.js`, `scripts/init.js` |
655
+ | Logic wipe `.rules/` khi update | `scripts/init.js:189-191` |
656
+ | Rules nguồn của kit | `custom/rules/` (common + java/javascript/php) |
657
+ | ECC continuous-learning-v2 | `everything-claude-code/skills/continuous-learning-v2/` |
658
+ | ECC memory-persistence hooks | `everything-claude-code/hooks/memory-persistence/` |
659
+ | ECC knowledge-ops | `everything-claude-code/skills/knowledge-ops/SKILL.md` |
660
+ | Phân tích adoption ECC | `upgrade-plan/everything-claude-code-analysis.md` |
661
+
662
+ ---
663
+
664
+ *Tài liệu này tổng hợp kết quả khảo sát hiện trạng memory của AI Flow Kit và thiết kế 4 luồng vận hành chính: Khởi tạo, Lưu trữ, Nạp/Sử dụng, Gỡ bỏ. Mọi thắc mắc liên hệ AI Testing Team.*